player update issue
This commit is contained in:
@@ -5916,202 +5916,11 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
// Reset this char's frame time.
|
// Reset this char's frame time.
|
||||||
this.lastUpdateTime = System.currentTimeMillis();
|
this.lastUpdateTime = System.currentTimeMillis();
|
||||||
this.lastStamUpdateTime = System.currentTimeMillis();
|
this.lastStamUpdateTime = System.currentTimeMillis();
|
||||||
//this.updateMovementState();
|
|
||||||
///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 (this.timestamps.get("SyncClient") + 5000L < System.currentTimeMillis()) {
|
||||||
//if (updateHealth || updateMana || updateStamina || consumeStamina) {
|
|
||||||
this.syncClient();
|
this.syncClient();
|
||||||
this.timestamps.put("SyncClient", System.currentTimeMillis());
|
this.timestamps.put("SyncClient", System.currentTimeMillis());
|
||||||
//}
|
InterestManager.setObjectDirty(this);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean regenerateHealth(){
|
|
||||||
Long regenTime;
|
|
||||||
Long currentTime = System.currentTimeMillis();
|
|
||||||
regenTime = this.timestamps.getOrDefault("LastRegenHealth", currentTime);
|
|
||||||
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.combatStats.healthRegen;
|
|
||||||
|
|
||||||
if(this.isMoving() && !this.walkMode)
|
|
||||||
rate = 0.0f;
|
|
||||||
|
|
||||||
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;
|
|
||||||
while(!workedHealth) {
|
|
||||||
if (mod > this.healthMax)
|
|
||||||
mod = healthMax;
|
|
||||||
else if (mod <= 0) {
|
|
||||||
if (this.isAlive.compareAndSet(true, false))
|
|
||||||
killCharacter("Water");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
workedHealth = this.health.compareAndSet(old, mod);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.timestamps.put("LastRegenHealth",currentTime);
|
|
||||||
return mod > old;
|
|
||||||
}
|
|
||||||
public boolean regenerateMana(){
|
|
||||||
Long regenTime;
|
|
||||||
Long currentTime = System.currentTimeMillis();
|
|
||||||
regenTime = this.timestamps.getOrDefault("LastRegenMana", currentTime);
|
|
||||||
float secondsPassed = (currentTime - regenTime) / 1000f;
|
|
||||||
float onePercent = this.manaMax * 0.01f;
|
|
||||||
float rate = 1.0f / RecoveryType.getRecoveryType(this).manaRate;
|
|
||||||
rate *= this.combatStats.manaRegen;
|
|
||||||
|
|
||||||
if(this.isMoving() && !this.walkMode)
|
|
||||||
rate = 0.0f;
|
|
||||||
|
|
||||||
float manaRegenerated = onePercent * secondsPassed * rate;
|
|
||||||
|
|
||||||
boolean workedMana = false;
|
|
||||||
float old = this.mana.get();
|
|
||||||
float mod = old + manaRegenerated;
|
|
||||||
while(!workedMana) {
|
|
||||||
|
|
||||||
if (mod > this.manaMax)
|
|
||||||
mod = manaMax;
|
|
||||||
else if (mod < 0)
|
|
||||||
mod = 0;
|
|
||||||
workedMana = this.mana.compareAndSet(old, mod);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.timestamps.put("LastRegenMana",currentTime);
|
|
||||||
return mod > old;
|
|
||||||
}
|
|
||||||
public boolean regenerateStamina(){
|
|
||||||
|
|
||||||
Long currentTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
if(this.isMoving() || this.isFlying() || !this.canBreathe) {
|
|
||||||
this.timestamps.put("LastRegenStamina",currentTime);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Long regenTime;
|
|
||||||
|
|
||||||
regenTime = this.timestamps.getOrDefault("LastRegenStamina", currentTime);
|
|
||||||
float secondsPassed = (currentTime - regenTime) / 1000f;
|
|
||||||
|
|
||||||
float secondsToRecover1 = RecoveryType.getRecoveryType(this).staminaRate;
|
|
||||||
secondsToRecover1 *= this.combatStats.staminaRegen;
|
|
||||||
|
|
||||||
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;
|
|
||||||
float old = this.stamina.get();
|
|
||||||
float mod = old + staminaRegenerated;
|
|
||||||
while (!workedStamina) {
|
|
||||||
if (mod > this.staminaMax)
|
|
||||||
mod = staminaMax;
|
|
||||||
else if (mod < 0)
|
|
||||||
mod = 0;
|
|
||||||
workedStamina = this.stamina.compareAndSet(old, mod);
|
|
||||||
}
|
|
||||||
//ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax);
|
|
||||||
this.timestamps.put("LastRegenStamina", currentTime);
|
|
||||||
return mod > old;
|
|
||||||
}
|
|
||||||
public boolean consumeStamina(){
|
|
||||||
Long regenTime;
|
|
||||||
Long currentTime = System.currentTimeMillis();
|
|
||||||
regenTime = this.timestamps.getOrDefault("LastConsumeStamina", currentTime);
|
|
||||||
float secondsPassed = (currentTime - regenTime) / 1000f;
|
|
||||||
|
|
||||||
float consumption;
|
|
||||||
|
|
||||||
if(!this.isMoving() && !this.isFlying() && this.canBreathe) {
|
|
||||||
this.timestamps.put("LastConsumeStamina",currentTime);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(!this.combat){
|
|
||||||
consumption = 0.4f * secondsPassed;
|
|
||||||
}else{
|
|
||||||
consumption = 0.65f * secondsPassed;
|
|
||||||
}
|
|
||||||
if(!this.canBreathe)
|
|
||||||
consumption = 1.5f * secondsPassed;
|
|
||||||
else if(this.isFlying())
|
|
||||||
consumption = 2.0f * secondsPassed;
|
|
||||||
|
|
||||||
boolean workedStamina = false;
|
|
||||||
float old = this.stamina.get();
|
|
||||||
float mod = old - consumption;
|
|
||||||
while (!workedStamina) {
|
|
||||||
if (mod <= 0)
|
|
||||||
mod = 0;
|
|
||||||
workedStamina = this.stamina.compareAndSet(old, mod);
|
|
||||||
}
|
|
||||||
//ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax);
|
|
||||||
this.timestamps.put("LastConsumeStamina",currentTime);
|
|
||||||
if(this.stamina.get() == 0){
|
|
||||||
return this.consumeHealth(secondsPassed);
|
|
||||||
}
|
|
||||||
return mod < old;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean consumeHealth(float secondsPassed){
|
|
||||||
float consumption = 2.0f * secondsPassed;
|
|
||||||
boolean workedHealth = false;
|
|
||||||
float old = this.health.get();
|
|
||||||
float mod = old - consumption;
|
|
||||||
while(!workedHealth) {
|
|
||||||
|
|
||||||
if (mod > this.healthMax)
|
|
||||||
mod = healthMax;
|
|
||||||
else if (mod <= 0) {
|
|
||||||
if (this.isAlive.compareAndSet(true, false))
|
|
||||||
killCharacter("Water");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
workedHealth = this.health.compareAndSet(old, mod);
|
|
||||||
}
|
|
||||||
return mod < old;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum RecoveryType{
|
|
||||||
//Values for health and mana are in terms of the number of seconds it takes to recover 1% of max pool
|
|
||||||
//Values for stamina are in terms of the number of seconds it takes to recover 1 point
|
|
||||||
RESTING(3.0f,1.2f,0.5f), //sitting
|
|
||||||
IDLING(15.0f,6.0f,5.0f), //standing not moving
|
|
||||||
WALKING(20.0f,8.0f,0.0f), // moving in walk mode
|
|
||||||
RUNNING(0.0f,0.0f,0.0f); // moving in run mode
|
|
||||||
public float healthRate;
|
|
||||||
public float manaRate;
|
|
||||||
public float staminaRate;
|
|
||||||
RecoveryType(float health, float mana, float stamina) {
|
|
||||||
this.healthRate = health;
|
|
||||||
this.manaRate = mana;
|
|
||||||
this.staminaRate = stamina;
|
|
||||||
}
|
|
||||||
public static RecoveryType getRecoveryType(PlayerCharacter pc){
|
|
||||||
if (pc.isMoving()) {
|
|
||||||
if(pc.walkMode){
|
|
||||||
return RecoveryType.WALKING;
|
|
||||||
}else{
|
|
||||||
return RecoveryType.RUNNING;
|
|
||||||
}
|
|
||||||
}else if(pc.isSit()){
|
|
||||||
return RecoveryType.RESTING;
|
|
||||||
}else{
|
|
||||||
return RecoveryType.IDLING;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user