@ -5146,6 +5146,9 @@ public class PlayerCharacter extends AbstractCharacter {
				@@ -5146,6 +5146,9 @@ public class PlayerCharacter extends AbstractCharacter {
					 
			
		
	
		
			
				
					    @Override   
			
		
	
		
			
				
					    public  void  updateRegen ( )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if ( true )   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  healthRegen  =  0f ;   
			
		
	
		
			
				
					        float  manaRegen  =  0f ;   
			
		
	
		
			
				
					        float  stamRegen  =  0f ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -5686,4 +5689,250 @@ public class PlayerCharacter extends AbstractCharacter {
				@@ -5686,4 +5689,250 @@ public class PlayerCharacter extends AbstractCharacter {
					 
			
		
	
		
			
				
					        this . dirtyLoad  =  dirtyLoad ;   
			
		
	
		
			
				
					        dirtyLock . writeLock ( ) . unlock ( ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  void  RunRegen ( ) {   
			
		
	
		
			
				
					        //this.updateRegen();
   
			
		
	
		
			
				
					        Long  lastRegen ;   
			
		
	
		
			
				
					        if ( this . timestamps . containsKey ( "LastRegen" ) )   
			
		
	
		
			
				
					            lastRegen  =  this . timestamps . get ( "LastRegen" ) ;   
			
		
	
		
			
				
					        else   
			
		
	
		
			
				
					            lastRegen  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  secondsDifference  =  ( System . currentTimeMillis ( )  -  lastRegen )  /  1000 . 0f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  healthRegen  =  0f ;   
			
		
	
		
			
				
					        float  manaRegen  =  0f ;   
			
		
	
		
			
				
					        float  stamRegen  =  0f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        boolean  updateClient  =  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Early exit if char is dead or disconnected
   
			
		
	
		
			
				
					        if  ( ( this . isAlive ( )  = =  false )   
			
		
	
		
			
				
					                | |  ( this . isActive ( )  = =  false )  | |  this . getLoc ( ) . x  = =  0  & &  this . getLoc ( ) . z  = =  0 )   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Calculate Regen amount from last simulation tick
   
			
		
	
		
			
				
					        switch  ( this . movementState )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            case  IDLE :   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                healthRegen  =  ( ( this . healthMax  *  MBServerStatics . HEALTH_REGEN_IDLE )  +  MBServerStatics . HEALTH_REGEN_IDLE_STATIC )  *  ( getRegenModifier ( ModType . HealthRecoverRate ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( this . isCasting ( )  | |  this . isItemCasting ( ) )   
			
		
	
		
			
				
					                    healthRegen  * =  . 75f ;   
			
		
	
		
			
				
					                // Characters regen mana when in only walk mode and idle
   
			
		
	
		
			
				
					                if  ( this . walkMode )   
			
		
	
		
			
				
					                    manaRegen  =  ( ( this . manaMax  *  MBServerStatics . MANA_REGEN_IDLE )  *  getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                else  if  ( ! this . isCasting ( )  & &  ! this . isItemCasting ( ) )   
			
		
	
		
			
				
					                    manaRegen  =  ( ( this . manaMax  *  MBServerStatics . MANA_REGEN_RUN )  *  getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                else   
			
		
	
		
			
				
					                    manaRegen  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( ! PlayerCharacter . CanBreathe ( this ) )   
			
		
	
		
			
				
					                    stamRegen  =  MBServerStatics . STAMINA_REGEN_SWIM ;   
			
		
	
		
			
				
					                else  if  ( ( ! this . isCasting ( )  & &  ! this . isItemCasting ( ) )  | |  this . lastMovementState . equals ( MovementState . FLYING ) )   
			
		
	
		
			
				
					                    stamRegen  =  MBServerStatics . STAMINA_REGEN_IDLE  *  getRegenModifier ( ModType . StaminaRecoverRate ) ;   
			
		
	
		
			
				
					                else   
			
		
	
		
			
				
					                    stamRegen  =  0 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  SITTING :   
			
		
	
		
			
				
					                healthRegen  =  ( ( this . healthMax  *  MBServerStatics . HEALTH_REGEN_SIT )  +  MBServerStatics . HEALTH_REGEN_SIT_STATIC )  *  getRegenModifier ( ModType . HealthRecoverRate ) ;   
			
		
	
		
			
				
					                manaRegen  =  ( this . manaMax  *  MBServerStatics . MANA_REGEN_SIT )  *  ( getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                stamRegen  =  MBServerStatics . STAMINA_REGEN_SIT  *  getRegenModifier ( ModType . StaminaRecoverRate ) ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  RUNNING :   
			
		
	
		
			
				
					                if  ( this . walkMode  = =  true )  {   
			
		
	
		
			
				
					                    healthRegen  =  ( ( this . healthMax  *  MBServerStatics . HEALTH_REGEN_WALK )  +  MBServerStatics . HEALTH_REGEN_IDLE_STATIC )  *  getRegenModifier ( ModType . HealthRecoverRate ) ;   
			
		
	
		
			
				
					                    manaRegen  =  this . manaMax  *  MBServerStatics . MANA_REGEN_WALK  *  getRegenModifier ( ModType . ManaRecoverRate ) ;   
			
		
	
		
			
				
					                    stamRegen  =  MBServerStatics . STAMINA_REGEN_WALK ;   
			
		
	
		
			
				
					                }  else  {   
			
		
	
		
			
				
					                    healthRegen  =  0 ;   
			
		
	
		
			
				
					                    manaRegen  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if  ( this . combat  = =  true )   
			
		
	
		
			
				
					                        stamRegen  =  MBServerStatics . STAMINA_REGEN_RUN_COMBAT ;   
			
		
	
		
			
				
					                    else   
			
		
	
		
			
				
					                        stamRegen  =  MBServerStatics . STAMINA_REGEN_RUN_NONCOMBAT ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  FLYING :   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                float  seventyFive  =  this . staminaMax  *  . 75f ;   
			
		
	
		
			
				
					                float  fifty  =  this . staminaMax  *  . 5f ;   
			
		
	
		
			
				
					                float  twentyFive  =  this . staminaMax  *  . 25f ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( this . getDesiredAltitude ( )  = =  0  & &  this . getAltitude ( )  < =  10 )  {   
			
		
	
		
			
				
					                    if  ( this . isCombat ( ) )   
			
		
	
		
			
				
					                        stamRegen  =  0 ;   
			
		
	
		
			
				
					                    else   
			
		
	
		
			
				
					                        stamRegen  =  MBServerStatics . STAMINA_REGEN_IDLE  *  getRegenModifier ( ModType . StaminaRecoverRate ) ;   
			
		
	
		
			
				
					                }  else  if  ( ! this . useFlyMoveRegen ( ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    healthRegen  =  ( ( this . healthMax  *  MBServerStatics . HEALTH_REGEN_IDLE )  +  MBServerStatics . HEALTH_REGEN_IDLE_STATIC )  *  ( getRegenModifier ( ModType . HealthRecoverRate ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if  ( this . isCasting ( )  | |  this . isItemCasting ( ) )   
			
		
	
		
			
				
					                        healthRegen  * =  . 75f ;   
			
		
	
		
			
				
					                    // Characters regen mana when in only walk mode and idle
   
			
		
	
		
			
				
					                    if  ( this . walkMode )   
			
		
	
		
			
				
					                        manaRegen  =  ( this . manaMax  *  MBServerStatics . MANA_REGEN_IDLE  +  ( this . getSpiMod ( )  *  . 015f ) )  *  ( getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                    else  if  ( ! this . isCasting ( )  & &  ! this . isItemCasting ( ) )   
			
		
	
		
			
				
					                        manaRegen  =  ( this . manaMax  *  MBServerStatics . MANA_REGEN_IDLE  +  ( this . getSpiMod ( )  *  . 015f ) )  *  ( getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                    else   
			
		
	
		
			
				
					                        manaRegen  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if  ( ! this . isItemCasting ( )  & &  ! this . isCasting ( )  | |  this . getTakeOffTime ( )  ! =  0 )   
			
		
	
		
			
				
					                        stamRegen  =  MBServerStatics . STAMINA_REGEN_FLY_IDLE ;   
			
		
	
		
			
				
					                    else   
			
		
	
		
			
				
					                        stamRegen  =  - 1f ;   
			
		
	
		
			
				
					                }  else  if  ( this . walkMode  = =  true )  {   
			
		
	
		
			
				
					                    healthRegen  =  ( ( this . healthMax  *  MBServerStatics . HEALTH_REGEN_WALK )  +  MBServerStatics . HEALTH_REGEN_IDLE_STATIC )  *  getRegenModifier ( ModType . HealthRecoverRate ) ;   
			
		
	
		
			
				
					                    manaRegen  =  ( ( this . manaMax  *  MBServerStatics . MANA_REGEN_WALK )  +  ( this . getSpiMod ( )  *  . 015f ) )  *  ( getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                    stamRegen  =  MBServerStatics . STAMINA_REGEN_FLY_WALK ;   
			
		
	
		
			
				
					                }  else  {   
			
		
	
		
			
				
					                    healthRegen  =  0 ;   
			
		
	
		
			
				
					                    manaRegen  =  0 ;   
			
		
	
		
			
				
					                    if  ( this . isCombat ( ) )   
			
		
	
		
			
				
					                        stamRegen  =  MBServerStatics . STAMINA_REGEN_FLY_RUN_COMBAT ;   
			
		
	
		
			
				
					                    else   
			
		
	
		
			
				
					                        stamRegen  =  MBServerStatics . STAMINA_REGEN_FLY_RUN ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                float  oldStamina  =  this . stamina . get ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( FastMath . between ( oldStamina ,  0 ,  twentyFive )  & &  ! this . wasTripped25 )  {   
			
		
	
		
			
				
					                    updateClient  =  true ;   
			
		
	
		
			
				
					                    this . wasTripped25  =  true ;   
			
		
	
		
			
				
					                    this . wasTripped50  =  false ;   
			
		
	
		
			
				
					                    this . wasTripped75  =  false ;   
			
		
	
		
			
				
					                }  else  if  ( FastMath . between ( oldStamina ,  twentyFive ,  fifty )  & &  ! this . wasTripped50 )  {   
			
		
	
		
			
				
					                    updateClient  =  true ;   
			
		
	
		
			
				
					                    this . wasTripped25  =  false ;   
			
		
	
		
			
				
					                    this . wasTripped50  =  true ;   
			
		
	
		
			
				
					                    this . wasTripped75  =  false ;   
			
		
	
		
			
				
					                }  else  if  ( FastMath . between ( oldStamina ,  fifty ,  seventyFive )  & &  ! this . wasTripped75 )  {   
			
		
	
		
			
				
					                    updateClient  =  true ;   
			
		
	
		
			
				
					                    this . wasTripped25  =  false ;   
			
		
	
		
			
				
					                    this . wasTripped50  =  false ;   
			
		
	
		
			
				
					                    this . wasTripped75  =  true ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  SWIMMING :   
			
		
	
		
			
				
					                if  ( this . walkMode  = =  true )  {   
			
		
	
		
			
				
					                    healthRegen  =  ( ( this . healthMax  *  MBServerStatics . HEALTH_REGEN_WALK )  +  MBServerStatics . HEALTH_REGEN_IDLE_STATIC )  *  getRegenModifier ( ModType . HealthRecoverRate ) ;   
			
		
	
		
			
				
					                    manaRegen  =  ( ( this . manaMax  *  MBServerStatics . MANA_REGEN_WALK )  +  ( this . getSpiMod ( )  *  . 015f ) )  *  ( getRegenModifier ( ModType . ManaRecoverRate ) ) ;   
			
		
	
		
			
				
					                    stamRegen  =  MBServerStatics . STAMINA_REGEN_SWIM ;   
			
		
	
		
			
				
					                }  else  {   
			
		
	
		
			
				
					                    healthRegen  =  0 ;   
			
		
	
		
			
				
					                    manaRegen  =  0 ;   
			
		
	
		
			
				
					                    stamRegen  =  MBServerStatics . STAMINA_REGEN_SWIM ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                    if  ( this . combat  = =  true )   
			
		
	
		
			
				
					                        stamRegen  + =  MBServerStatics . STAMINA_REGEN_RUN_COMBAT ;   
			
		
	
		
			
				
					                    else   
			
		
	
		
			
				
					                        stamRegen  + =  MBServerStatics . STAMINA_REGEN_RUN_NONCOMBAT ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Are we drowning?
   
			
		
	
		
			
				
					        if  ( ( this . getStamina ( )  < =  0 )   
			
		
	
		
			
				
					                & &  ( PlayerCharacter . CanBreathe ( this )  = =  false ) )   
			
		
	
		
			
				
					            healthRegen  =  ( this . healthMax  *  - . 03f ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Multiple regen values by current deltaTime
   
			
		
	
		
			
				
					        //     Logger.info("", healthRegen + "");
   
			
		
	
		
			
				
					        healthRegen  * =  getDeltaTime ( ) ;   
			
		
	
		
			
				
					        manaRegen  * =  getDeltaTime ( ) ;   
			
		
	
		
			
				
					        stamRegen  * =  getStamDeltaTime ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        boolean  workedHealth  =  false ;   
			
		
	
		
			
				
					        boolean  workedMana  =  false ;   
			
		
	
		
			
				
					        boolean  workedStamina  =  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  old ,  mod ;   
			
		
	
		
			
				
					        while  ( ! workedHealth  | |  ! workedMana  | |  ! workedStamina )  {   
			
		
	
		
			
				
					            if  ( ! this . isAlive ( )  | |  ! this . isActive ( ) )   
			
		
	
		
			
				
					                return ;   
			
		
	
		
			
				
					            if  ( ! workedHealth )  {   
			
		
	
		
			
				
					                old  =  this . health . get ( ) ;   
			
		
	
		
			
				
					                mod  =  old  +  healthRegen ;   
			
		
	
		
			
				
					                if  ( mod  >  this . healthMax )   
			
		
	
		
			
				
					                    mod  =  healthMax ;   
			
		
	
		
			
				
					                else  if  ( mod  < =  0 )  {   
			
		
	
		
			
				
					                    if  ( this . isAlive . compareAndSet ( true ,  false ) )   
			
		
	
		
			
				
					                        killCharacter ( "Water" ) ;   
			
		
	
		
			
				
					                    return ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                workedHealth  =  this . health . compareAndSet ( old ,  mod ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					            if  ( ! workedStamina )  {   
			
		
	
		
			
				
					                old  =  this . stamina . get ( ) ;   
			
		
	
		
			
				
					                mod  =  old  +  stamRegen ;   
			
		
	
		
			
				
					                if  ( mod  >  this . staminaMax )   
			
		
	
		
			
				
					                    mod  =  staminaMax ;   
			
		
	
		
			
				
					                else  if  ( mod  <  0 )   
			
		
	
		
			
				
					                    mod  =  0 ;   
			
		
	
		
			
				
					                workedStamina  =  this . stamina . compareAndSet ( old ,  mod ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					            if  ( ! workedMana )  {   
			
		
	
		
			
				
					                old  =  this . mana . get ( ) ;   
			
		
	
		
			
				
					                mod  =  old  +  manaRegen ;   
			
		
	
		
			
				
					                if  ( mod  >  this . manaMax )   
			
		
	
		
			
				
					                    mod  =  manaMax ;   
			
		
	
		
			
				
					                else  if  ( mod  <  0 )   
			
		
	
		
			
				
					                    mod  =  0 ;   
			
		
	
		
			
				
					                workedMana  =  this . mana . compareAndSet ( old ,  mod ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( updateClient  | |  secondsDifference  >  2 . 5f )   
			
		
	
		
			
				
					            this . syncClient ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Reset this char's frame time.
   
			
		
	
		
			
				
					        this . lastUpdateTime  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					        this . lastStamUpdateTime  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  float  getRegenRate ( PlayerCharacter  player ,  ModType  type ) {   
			
		
	
		
			
				
					        float  regenRate  =  1  +  player . getRegenModifier ( type ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        player . updateMovementState ( ) ;   
			
		
	
		
			
				
					        switch  ( player . movementState )  {   
			
		
	
		
			
				
					            case  IDLE :   
			
		
	
		
			
				
					                if ( player . walkMode ) {   
			
		
	
		
			
				
					                    switch ( type ) {   
			
		
	
		
			
				
					                        case  HealthRecoverRate :   
			
		
	
		
			
				
					                            regenRate  =  MBServerStatics . HEALTH_REGEN_WALK  *  regenRate ;   
			
		
	
		
			
				
					                            break ;   
			
		
	
		
			
				
					                        case  ManaRecoverRate :   
			
		
	
		
			
				
					                            regenRate  =  MBServerStatics . MANA_REGEN_WALK  *  regenRate ;   
			
		
	
		
			
				
					                            break ;   
			
		
	
		
			
				
					                        case  StaminaRecoverRate :   
			
		
	
		
			
				
					                            regenRate  =  MBServerStatics . STAMINA_REGEN_WALK  *  regenRate ;   
			
		
	
		
			
				
					                            break ;   
			
		
	
		
			
				
					                    }   
			
		
	
		
			
				
					                } else {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  RUNNING :   
			
		
	
		
			
				
					                if ( player . walkMode ) {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                } else {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  SWIMMING :   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  SITTING :   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  FLYING :   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        return  regenRate ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					}