@ -887,4 +887,142 @@ public class PlayerCombatStats {
				@@ -887,4 +887,142 @@ public class PlayerCombatStats {
					 
			
		
	
		
			
				
					        return  HIT_VALUE_MAP . get ( key ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  void  regenerate ( ) {   
			
		
	
		
			
				
					        healthRegen ( this . owner ) ;   
			
		
	
		
			
				
					        manaRegen ( this . owner ) ;   
			
		
	
		
			
				
					        staminaRegen ( this . owner ) ;   
			
		
	
		
			
				
					        staminaConsume ( this . owner ) ;   
			
		
	
		
			
				
					        this . owner . syncClient ( ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    public  static  void  healthRegen ( PlayerCharacter  pc ) {   
			
		
	
		
			
				
					        if ( ! pc . timestamps . containsKey ( "LASTHEALTHREGEN" ) )   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTHEALTHREGEN" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  stateMultiplier  =  1 . 0f ;   
			
		
	
		
			
				
					        if ( pc . isSit ( ) )   
			
		
	
		
			
				
					            stateMultiplier  =  2 . 0f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        long  deltaTime  =  System . currentTimeMillis ( )  -  pc . timestamps . get ( "LASTHEALTHREGEN" ) ;   
			
		
	
		
			
				
					        float  current  =  pc . health . get ( ) ;   
			
		
	
		
			
				
					        float  onePercent  =  pc . healthMax  *  0 . 01f ;   
			
		
	
		
			
				
					        float  mod  =  current  +  ( ( deltaTime  *  0 . 001f )  *  onePercent  *  stateMultiplier ) ;   
			
		
	
		
			
				
					        if ( pc . bonuses  ! =  null )   
			
		
	
		
			
				
					            mod  * =  1  +  pc . bonuses . getFloatPercentAll ( Enum . ModType . HealthRecoverRate ,  Enum . SourceType . None ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        boolean  worked  =  false ;   
			
		
	
		
			
				
					        if ( mod  >  pc . healthMax )   
			
		
	
		
			
				
					            mod  =   pc . healthMax ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        while  ( ! worked )  {   
			
		
	
		
			
				
					            worked  =  pc . health . compareAndSet ( current ,  mod ) ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        pc . timestamps . put ( "LASTHEALTHREGEN" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  void  manaRegen ( PlayerCharacter  pc ) {   
			
		
	
		
			
				
					        if ( ! pc . timestamps . containsKey ( "LASTMANAREGEN" ) )   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTMANAREGEN" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  stateMultiplier  =  1 . 0f ;   
			
		
	
		
			
				
					        if ( pc . isSit ( ) )   
			
		
	
		
			
				
					            stateMultiplier  =  2 . 0f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        long  deltaTime  =  System . currentTimeMillis ( )  -  pc . timestamps . get ( "LASTMANAREGEN" ) ;   
			
		
	
		
			
				
					        float  current  =  pc . mana . get ( ) ;   
			
		
	
		
			
				
					        float  onePercent  =  pc . manaMax  *  0 . 01f ;   
			
		
	
		
			
				
					        float  mod  =  current  +  ( ( deltaTime  *  0 . 001f )  *  onePercent  *  stateMultiplier ) ;   
			
		
	
		
			
				
					        if ( pc . bonuses  ! =  null )   
			
		
	
		
			
				
					            mod  * =  1  +  pc . bonuses . getFloatPercentAll ( Enum . ModType . ManaRecoverRate ,  Enum . SourceType . None ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        boolean  worked  =  false ;   
			
		
	
		
			
				
					        if ( mod  >  pc . manaMax )   
			
		
	
		
			
				
					            mod  =   pc . manaMax ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        while  ( ! worked )  {   
			
		
	
		
			
				
					            worked  =  pc . mana . compareAndSet ( current ,  mod ) ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        pc . timestamps . put ( "LASTMANAREGEN" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  void  staminaRegen ( PlayerCharacter  pc ) {   
			
		
	
		
			
				
					        //cannot regen is moving, swimming or flying
   
			
		
	
		
			
				
					        if ( pc . isFlying ( )  & &  pc . isSwimming ( )  & &  pc . isMoving ( ) )  {   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTSTAMINAREGEN" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if ( ! pc . timestamps . containsKey ( "LASTSTAMINAREGEN" ) )   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTSTAMINAREGEN" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  stateMultiplier  =  1 . 0f ;   
			
		
	
		
			
				
					        if ( pc . isSit ( ) )   
			
		
	
		
			
				
					            stateMultiplier  =  2 . 0f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        long  deltaTime  =  System . currentTimeMillis ( )  -  pc . timestamps . get ( "LASTSTAMINAREGEN" ) ;   
			
		
	
		
			
				
					        float  current  =  pc . stamina . get ( ) ;   
			
		
	
		
			
				
					        float  mod  =  current  +  ( ( deltaTime  *  0 . 001f )  *  stateMultiplier ) ;   
			
		
	
		
			
				
					        if ( pc . bonuses  ! =  null )   
			
		
	
		
			
				
					            mod  * =  1  +  pc . bonuses . getFloatPercentAll ( Enum . ModType . StaminaRecoverRate ,  Enum . SourceType . None ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        boolean  worked  =  false ;   
			
		
	
		
			
				
					        if ( mod  >  pc . staminaMax )   
			
		
	
		
			
				
					            mod  =   pc . staminaMax ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        while  ( ! worked )  {   
			
		
	
		
			
				
					            worked  =  pc . stamina . compareAndSet ( current ,  mod ) ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        pc . timestamps . put ( "LASTSTAMINACONSUME" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  void  staminaConsume ( PlayerCharacter  pc ) {   
			
		
	
		
			
				
					        //no natural consumption if not moving, swimming or flying
   
			
		
	
		
			
				
					        if ( ! pc . isFlying ( )  & &  ! pc . isSwimming ( )  & &  ! pc . isMoving ( ) )  {   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTSTAMINACONSUME" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        //no stamina consumption for TravelStance
   
			
		
	
		
			
				
					        if ( pc . containsEffect ( 441156479 )  | |  pc . containsEffect ( 441156455 ) )  {   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTSTAMINACONSUME" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        float  stateMultiplier  =  1 . 0f ;   
			
		
	
		
			
				
					        if ( pc . isSwimming ( )  | |  pc . isFlying ( ) )   
			
		
	
		
			
				
					            stateMultiplier  =  1 . 5f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if ( ! pc . timestamps . containsKey ( "LASTSTAMINACONSUME" ) )   
			
		
	
		
			
				
					            pc . timestamps . put ( "LASTSTAMINACONSUME" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        long  deltaTime  =  System . currentTimeMillis ( )  -  pc . timestamps . get ( "LASTSTAMINACONSUME" ) ;   
			
		
	
		
			
				
					        float  current  =  pc . stamina . get ( ) ;   
			
		
	
		
			
				
					        float  mod  =  current  -  ( ( deltaTime  * 0 . 001f )  *  0 . 6f  *  stateMultiplier ) ;   
			
		
	
		
			
				
					        boolean  worked  =  false ;   
			
		
	
		
			
				
					        if ( mod  < =  0 )   
			
		
	
		
			
				
					            mod  =   0 ;   
			
		
	
		
			
				
					        if ( mod  = =  0 ) {   
			
		
	
		
			
				
					            healthConsume ( pc ,  ( int )  ( deltaTime  *  0 . 6f  *  2 . 5f ) ) ;   
			
		
	
		
			
				
					        } else  {   
			
		
	
		
			
				
					            while  ( ! worked )  {   
			
		
	
		
			
				
					                worked  =  pc . stamina . compareAndSet ( current , mod ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        pc . timestamps . put ( "LASTSTAMINACONSUME" , System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  void  healthConsume ( PlayerCharacter  pc ,  int  amount ) {   
			
		
	
		
			
				
					        boolean  worked  =  false ;   
			
		
	
		
			
				
					        float  current  =  pc . health . get ( ) ;   
			
		
	
		
			
				
					        float  mod  =  current  =  amount ;   
			
		
	
		
			
				
					        if ( mod  < =  0 ) {   
			
		
	
		
			
				
					            pc . killCharacter ( "water" ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        while ( ! worked ) {   
			
		
	
		
			
				
					            worked  =  pc . health . compareAndSet ( current , mod ) ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					}