@ -5622,16 +5622,189 @@ public class PlayerCharacter extends AbstractCharacter {
				@@ -5622,16 +5622,189 @@ public class PlayerCharacter extends AbstractCharacter {
					 
			
		
	
		
			
				
					            this . resetRegenUpdateTime ( ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					            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_IDLE )  *  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 ( this . isCasting ) {   
			
		
	
		
			
				
					                    manaRegen  =  0 ;   
			
		
	
		
			
				
					                    workedMana  =  true ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					                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 )   
			
		
	
		
			
				
					                this . syncClient ( ) ;   
			
		
	
		
			
				
					            // Reset this char's frame time.
   
			
		
	
		
			
				
					            this . lastUpdateTime  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					            this . lastStamUpdateTime  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					        //this.updateMovementState();
   
			
		
	
		
			
				
					        boolean  updateHealth  =  this . regenerateHealth ( ) ;   
			
		
	
		
			
				
					        boolean  updateMana  =  this . regenerateMana ( ) ;   
			
		
	
		
			
				
					        boolean  updateStamina  =  this . regenerateStamina ( ) ;   
			
		
	
		
			
				
					        boolean  consumeStamina  =  this . consumeStamina ( ) ;   
			
		
	
		
			
				
					        ///boolean updateHealth = this.regenerateHealth();
   
			
		
	
		
			
				
					        //boolean updateMana = this.regenerateMana();
   
			
		
	
		
			
				
					        //boolean updateStamina = this.regenerateStamina();
   
			
		
	
		
			
				
					        //boolean consumeStamina = this.consumeStamina();
   
			
		
	
		
			
				
					        if  ( this . timestamps . get ( "SyncClient" )  +  5000L  <  System . currentTimeMillis ( ) )  {   
			
		
	
		
			
				
					            if  ( updateHealth  | |  updateMana  | |  updateStamina  | |  consumeStamina )  {   
			
		
	
		
			
				
					            //if (updateHealth || updateMana || updateStamina || consumeStamina) {
   
			
		
	
		
			
				
					                this . syncClient ( ) ;   
			
		
	
		
			
				
					                this . timestamps . put ( "SyncClient" ,  System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					            //}
   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5642,7 +5815,7 @@ public class PlayerCharacter extends AbstractCharacter {
				@@ -5642,7 +5815,7 @@ public class PlayerCharacter extends AbstractCharacter {
					 
			
		
	
		
			
				
					        float  secondsPassed  =  ( currentTime  -  regenTime )  /  1000f ;   
			
		
	
		
			
				
					        float  onePercent  =  this . healthMax  *  0 . 01f ;   
			
		
	
		
			
				
					        float  rate  =  1 . 0f  /  RecoveryType . getRecoveryType ( this ) . healthRate ;   
			
		
	
		
			
				
					        //rate *= this.getRegenModifier(ModType.HealthRecoverRate);
   
			
		
	
		
			
				
					        rate  * =  this . getRegenModifier ( ModType . HealthRecoverRate ) ;   
			
		
	
		
			
				
					        rate  * =  this . combatStats . healthRegen ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if ( this . isMoving ( )  & &  ! this . walkMode )   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5650,6 +5823,7 @@ public class PlayerCharacter extends AbstractCharacter {
				@@ -5650,6 +5823,7 @@ public class PlayerCharacter extends AbstractCharacter {
					 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        float  healthRegenerated  =  onePercent  *  rate  *  secondsPassed ;   
			
		
	
		
			
				
					        //ChatManager.chatSystemInfo(this,"HEALTH REGENERATED: " + healthRegenerated + " SECONDS PASSED: " + secondsPassed);
   
			
		
	
		
			
				
					        ChatManager . chatSystemInfo ( this , "HEALTH : "  +  Math . round ( this . health . get ( ) )  +  " / "  +  this . healthMax ) ;   
			
		
	
		
			
				
					        boolean  workedHealth  =  false ;   
			
		
	
		
			
				
					        float  old  =  this . health . get ( ) ;   
			
		
	
		
			
				
					        float  mod  =  old  +  healthRegenerated ;