@@ -31,6 +31,8 @@ use crate::protos::oak_shared::{
3131} ;
3232use crate :: vehicle_data:: { VehicleName , VehicleStats } ;
3333
34+ pub const MAX_CHARACTER_LEVEL : usize = 72 ;
35+
3436#[ derive( Derivative ) ]
3537#[ derivative( Debug , Clone , Default , Eq , PartialEq , Ord , PartialOrd ) ]
3638pub struct CharacterData {
@@ -367,25 +369,33 @@ impl CharacterData {
367369 }
368370
369371 pub fn set_player_class ( & mut self , player_class : PlayerClass ) -> Result < ( ) > {
370- let player_class_data = self
371- . character
372- . player_class_data
373- . as_mut ( )
374- . with_context ( || "failed to read Player Class data" ) ?;
372+ if player_class != self . player_class {
373+ let player_class_data = self
374+ . character
375+ . player_class_data
376+ . as_mut ( )
377+ . with_context ( || "failed to read Player Class data" ) ?;
375378
376- player_class_data. player_class_path = player_class. get_serializations ( ) [ 0 ] . to_string ( ) ;
379+ player_class_data. player_class_path = player_class. get_serializations ( ) [ 0 ] . to_string ( ) ;
377380
378- let ability_data = self
379- . character
380- . ability_data
381- . as_mut ( )
382- . context ( "failed to read Player ability data" ) ?;
381+ let ability_data = self
382+ . character
383+ . ability_data
384+ . as_mut ( )
385+ . context ( "failed to read Player ability data" ) ?;
383386
384- if self . player_level > 2 {
385- ability_data. ability_points = self . player_level - 2 ;
386- }
387+ //Reset our skill tree also
388+ ability_data
389+ . tree_item_list
390+ . iter_mut ( )
391+ . for_each ( |ti| ti. points = 0 ) ;
387392
388- self . player_class = player_class;
393+ if self . player_level > 2 {
394+ ability_data. ability_points = self . player_level - 2 ;
395+ }
396+
397+ self . player_class = player_class;
398+ }
389399
390400 Ok ( ( ) )
391401 }
@@ -395,31 +405,43 @@ impl CharacterData {
395405 }
396406
397407 pub fn set_player_level ( & mut self , experience_points : i32 ) -> Result < ( ) > {
398- self . player_level = experience_to_level ( experience_points) . with_context ( || {
399- format ! (
400- "failed to set level for experience points: {}" ,
401- experience_points
402- )
403- } ) ?;
408+ if experience_points != self . character . experience_points {
409+ self . player_level = experience_to_level ( experience_points) . with_context ( || {
410+ format ! (
411+ "failed to set level for experience points: {}" ,
412+ experience_points
413+ )
414+ } ) ?;
404415
405- self . character . experience_points = experience_points;
416+ self . character . experience_points = experience_points;
406417
407- self . set_game_stat ( LEVEL_STAT , self . player_level ) ;
418+ self . set_game_stat ( LEVEL_STAT , self . player_level ) ;
408419
409- let ability_data = self
410- . character
411- . ability_data
412- . as_mut ( )
413- . context ( "failed to read Player ability data" ) ?;
420+ let ability_data = self
421+ . character
422+ . ability_data
423+ . as_mut ( )
424+ . context ( "failed to read Player ability data" ) ?;
414425
415- //Unlock skill tree
416- if self . player_level > 1 && ability_data. tree_grade == 0 {
417- ability_data. tree_grade = 2 ;
418- }
426+ //Reset existing skill tree
427+ ability_data
428+ . tree_item_list
429+ . iter_mut ( )
430+ . for_each ( |ti| ti. points = 0 ) ;
419431
420- for ( challenge_level, challenge_obj) in LEVEL_CHALLENGES {
421- if self . player_level >= challenge_level {
422- self . unlock_challenge_obj ( challenge_obj, 1 , 0 ) ?;
432+ //Unlock skill tree
433+ if self . player_level > 1 && ability_data. tree_grade == 0 {
434+ ability_data. tree_grade = 2 ;
435+ }
436+
437+ if self . player_level > 2 {
438+ ability_data. ability_points = self . player_level - 2 ;
439+ }
440+
441+ for ( challenge_level, challenge_obj) in LEVEL_CHALLENGES {
442+ if self . player_level >= challenge_level {
443+ self . unlock_challenge_obj ( challenge_obj, 1 , 0 ) ?;
444+ }
423445 }
424446 }
425447
0 commit comments