@@ -6,7 +6,7 @@ use mongodb::Collection;
6
6
use serde:: { Serialize , Deserialize } ;
7
7
use std:: collections:: HashMap ;
8
8
9
- use crate :: { database:: CollectionOwner , socket:: { leaderboard:: ScoreType , player:: { player_xp_listener:: { PlayerXPListener , XP_PER_LEVEL } , player_events:: PlayerXPGainData } , server:: server_context:: { ServerContext } , event_type:: EventType } } ;
9
+ use crate :: { database:: CollectionOwner , socket:: { leaderboard:: ScoreType , player:: { player_xp_listener:: PlayerXPListener , player_events:: PlayerXPGainData } , server:: server_context:: ServerContext , event_type:: EventType } } ;
10
10
11
11
use super :: { punishment:: StaffNote , level:: LevelGamemode , r#match:: Match } ;
12
12
@@ -61,7 +61,8 @@ impl Player {
61
61
62
62
// TODO: Multipliers
63
63
pub async fn add_xp ( & mut self , server_context : & mut ServerContext , raw_xp : u32 , reason : & String , notify : bool , raw_only : bool ) {
64
- let original_level = self . stats . get_level ( ) ;
64
+ let use_exponential = server_context. api_state . config . options . use_exponential_exp ;
65
+ let original_level = self . stats . get_level ( use_exponential) ;
65
66
let target_xp_increment = if raw_only { raw_xp } else { u32:: max ( PlayerXPListener :: gain ( raw_xp, original_level) , raw_xp) } ;
66
67
self . stats . xp += target_xp_increment;
67
68
@@ -146,8 +147,12 @@ pub struct PlayerStats {
146
147
}
147
148
148
149
impl PlayerStats {
149
- pub fn get_level ( & self ) -> u32 {
150
- ( self . xp + XP_PER_LEVEL ) / XP_PER_LEVEL
150
+ pub fn get_level ( & self , use_exponential : bool ) -> u32 {
151
+ if use_exponential {
152
+ ( ( 0.0056f32 * ( self . xp as f32 ) . powf ( 0.715f32 ) ) as u32 ) + 1
153
+ } else {
154
+ ( self . xp + 5000 ) / 5000
155
+ }
151
156
}
152
157
153
158
pub fn get_score ( & self , score_type : & ScoreType ) -> u32 {
0 commit comments