|  |  | @ -5871,10 +5871,12 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this.resetRegenUpdateTime(); |  |  |  |                     this.resetRegenUpdateTime(); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     return; |  |  |  |                     return; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 regenerateHealth(); |  |  |  |                 this.updateMovementState(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 regenerateMana(); |  |  |  |                 this.regenerateHealth(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 regenerateStamina(); |  |  |  |                 this.regenerateMana(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 consumeStamina(); |  |  |  |                 this.regenerateStamina(); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 this.consumeStamina(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 this.syncClient(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             } catch (Exception e) { |  |  |  |             } catch (Exception e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 Logger.error(e); |  |  |  |                 Logger.error(e); | 
			
		
	
		
		
			
				
					
					|  |  |  |             } finally { |  |  |  |             } finally { | 
			
		
	
	
		
		
			
				
					|  |  | @ -5944,17 +5946,26 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastRegenMana",currentTime); |  |  |  |         this.timestamps.put("LastRegenMana",currentTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void regenerateStamina(){ |  |  |  |     public void regenerateStamina(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(this.isMoving()) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         Long currentTime = System.currentTimeMillis(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(this.isMoving() || this.isFlying() || !this.canBreathe) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             this.timestamps.put("LastRegenStamina",currentTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long regenTime; |  |  |  |         Long regenTime; | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long currentTime = System.currentTimeMillis(); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         regenTime = this.timestamps.getOrDefault("LastRegenStamina", currentTime); |  |  |  |         regenTime = this.timestamps.getOrDefault("LastRegenStamina", currentTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; |  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         float rate = RecoveryType.getRecoveryType(this).staminaRate; |  |  |  |         float secondsToRecover1 = RecoveryType.getRecoveryType(this).staminaRate; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         rate *= this.getRegenModifier(ModType.StaminaRecoverRate); // Adjust rate with modifiers
 |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         float staminaRegenerated = secondsPassed / rate; // Stamina regenerates 1 point per `rate` seconds
 |  |  |  |         float ratio = secondsPassed / secondsToRecover1; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         //rate *= this.getRegenModifier(ModType.StaminaRecoverRate); // Adjust rate with modifiers
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         //float staminaRegenerated = secondsPassed / rate; // Stamina regenerates 1 point per `rate` seconds
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         float staminaRegenerated = secondsPassed * ratio; // Stamina regenerates 1 point per `rate` seconds
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedStamina = false; |  |  |  |         boolean workedStamina = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |         float old, mod; |  |  |  |         float old, mod; | 
			
		
	
	
		
		
			
				
					|  |  | @ -5967,7 +5978,7 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = 0; |  |  |  |                 mod = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedStamina = this.stamina.compareAndSet(old, mod); |  |  |  |             workedStamina = this.stamina.compareAndSet(old, mod); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         //ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax);
 |  |  |  |         ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastRegenStamina", currentTime); |  |  |  |         this.timestamps.put("LastRegenStamina", currentTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void consumeStamina(){ |  |  |  |     public void consumeStamina(){ | 
			
		
	
	
		
		
			
				
					|  |  | @ -5977,7 +5988,8 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; |  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         float consumption; |  |  |  |         float consumption; | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(!this.isMoving() && !this.isFlying()) { |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(!this.isMoving() && !this.isFlying() && this.canBreathe) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.timestamps.put("LastConsumeStamina",currentTime); |  |  |  |             this.timestamps.put("LastConsumeStamina",currentTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
	
		
		
			
				
					|  |  | @ -5986,8 +5998,10 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         }else{ |  |  |  |         }else{ | 
			
		
	
		
		
			
				
					
					|  |  |  |             consumption = 0.65f * secondsPassed; |  |  |  |             consumption = 0.65f * secondsPassed; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(!this.canBreathe || this.isFlying()) |  |  |  |         if(this.canBreathe) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             consumption *= 2; |  |  |  |             consumption = 1.5f * secondsPassed; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         else if(this.isFlying()) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             consumption = 2.0f * secondsPassed; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedStamina = false; |  |  |  |         boolean workedStamina = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |         float old,mod; |  |  |  |         float old,mod; | 
			
		
	
	
		
		
			
				
					|  |  | @ -5998,7 +6012,7 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = 0; |  |  |  |                 mod = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedStamina = this.stamina.compareAndSet(old, mod); |  |  |  |             workedStamina = this.stamina.compareAndSet(old, mod); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         //ChatManager.chatSystemInfo(this, "CONSUMED STAM: " + consumption);
 |  |  |  |         ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastConsumeStamina",currentTime); |  |  |  |         this.timestamps.put("LastConsumeStamina",currentTime); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |