new regen system
This commit is contained in:
@@ -5138,7 +5138,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
} else {
|
} else {
|
||||||
this.combatStats.update();
|
this.combatStats.update();
|
||||||
}
|
}
|
||||||
this.doRegen();
|
//this.doRegen();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.getStamina() < 10) {
|
if (this.getStamina() < 10) {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package engine.objects;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
|
import engine.math.Vector2f;
|
||||||
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.powers.EffectsBase;
|
import engine.powers.EffectsBase;
|
||||||
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -252,6 +254,18 @@ public class PlayerCombatStats {
|
|||||||
HIT_VALUE_MAP.put(2.50f, 100f);
|
HIT_VALUE_MAP.put(2.50f, 100f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Values for health and mana are in terms of the number of seconds it takes to recover 1%
|
||||||
|
//Values for stamina are in terms of the number of seconds it takes to recover 1 point
|
||||||
|
//HEALTH//MANA//STAMINA
|
||||||
|
private static Vector3fImmutable resting = new Vector3fImmutable(3.0f,1.2f,0.5f);
|
||||||
|
private static Vector3fImmutable idling = new Vector3fImmutable(15.0f,6.0f,5.0f);
|
||||||
|
private static Vector3fImmutable walking = new Vector3fImmutable(20.0f,8.0f,0.0f);
|
||||||
|
private static Vector3fImmutable running = new Vector3fImmutable(0.0f,0.0f,0.0f);
|
||||||
|
|
||||||
|
//#Values for how fast mana is consumed. The first is how fast when player is not in combat
|
||||||
|
//#mode, the second is when he IS in combat mode. This is in Stamina reduction per second.
|
||||||
|
private static Vector2f consumption = new Vector2f(0.4f,0.65f);
|
||||||
|
|
||||||
public PlayerCombatStats(PlayerCharacter pc) {
|
public PlayerCombatStats(PlayerCharacter pc) {
|
||||||
this.owner = pc;
|
this.owner = pc;
|
||||||
this.update();
|
this.update();
|
||||||
@@ -324,6 +338,11 @@ public class PlayerCombatStats {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
//Logger.error("FAILED TO CALCULATE Defense FOR: " + this.owner.getObjectUUID());
|
//Logger.error("FAILED TO CALCULATE Defense FOR: " + this.owner.getObjectUUID());
|
||||||
}
|
}
|
||||||
|
try{
|
||||||
|
this.doRegen();
|
||||||
|
}catch(Exception ignored){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -868,4 +887,80 @@ public class PlayerCombatStats {
|
|||||||
return HIT_VALUE_MAP.get(key);
|
return HIT_VALUE_MAP.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void doRegen(){
|
||||||
|
|
||||||
|
long current = System.currentTimeMillis();
|
||||||
|
Vector3fImmutable regenRate;
|
||||||
|
PlayerCharacter pc = this.owner;
|
||||||
|
if(!pc.timestamps.containsKey("LastRegen")){
|
||||||
|
pc.timestamps.put("LastRegen", current);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pc.isSit()){
|
||||||
|
regenRate = resting;
|
||||||
|
} else if(!pc.isMoving()){
|
||||||
|
regenRate = idling;
|
||||||
|
}else{
|
||||||
|
if(pc.isWalk()){
|
||||||
|
regenRate = walking;
|
||||||
|
}else{
|
||||||
|
regenRate = running;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double secondsPassed = current - pc.timestamps.get("LastRegen") * 0.001f;
|
||||||
|
|
||||||
|
double healthRegenerated = 0.01f / regenRate.x;
|
||||||
|
double manaRegenerated = 0.01f / regenRate.y;
|
||||||
|
if(pc.bonuses != null){
|
||||||
|
healthRegenerated *= 1 + pc.bonuses.getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None);
|
||||||
|
manaRegenerated *= 1 + pc.bonuses.getFloatPercentAll(Enum.ModType.ManaRecoverRate, Enum.SourceType.None);
|
||||||
|
}
|
||||||
|
healthRegenerated *= pc.healthMax * secondsPassed;
|
||||||
|
manaRegenerated *= pc.manaMax * secondsPassed;
|
||||||
|
|
||||||
|
double newHealth = pc.health.get() + healthRegenerated;
|
||||||
|
double newMana = pc.mana.get() + manaRegenerated;
|
||||||
|
|
||||||
|
if(newHealth > pc.healthMax)
|
||||||
|
newHealth = pc.healthMax;
|
||||||
|
|
||||||
|
if(newMana > pc.manaMax)
|
||||||
|
newMana = pc.manaMax;
|
||||||
|
|
||||||
|
pc.health.compareAndSet(pc.health.get(), (float) newHealth);
|
||||||
|
pc.mana.compareAndSet(pc.mana.get(), (float) newMana);
|
||||||
|
|
||||||
|
if(regenRate.z > 0) {
|
||||||
|
//recover stamina
|
||||||
|
double staminaRegenerated = 1 / regenRate.z;
|
||||||
|
if (pc.bonuses != null) {
|
||||||
|
staminaRegenerated *= 1 + pc.bonuses.getFloatPercentAll(Enum.ModType.StaminaRecoverRate, Enum.SourceType.None);
|
||||||
|
}
|
||||||
|
double newStamina = pc.stamina.get() + staminaRegenerated;
|
||||||
|
|
||||||
|
if(newStamina > pc.staminaMax)
|
||||||
|
newStamina = pc.staminaMax;
|
||||||
|
|
||||||
|
pc.stamina.compareAndSet(pc.stamina.get(), (float) newStamina);
|
||||||
|
}else{
|
||||||
|
//consume stamina
|
||||||
|
if(pc.isMoving()){
|
||||||
|
double newStamina;
|
||||||
|
if(pc.walkMode){
|
||||||
|
//walking
|
||||||
|
newStamina = consumption.x * secondsPassed;
|
||||||
|
}else{
|
||||||
|
//running
|
||||||
|
newStamina = consumption.y * secondsPassed;
|
||||||
|
}
|
||||||
|
if(newStamina < 0)
|
||||||
|
newStamina = 0;
|
||||||
|
|
||||||
|
pc.stamina.compareAndSet(pc.stamina.get(), pc.stamina.get() - (float) newStamina);
|
||||||
|
if(newStamina == 0 && pc.isSwimming())
|
||||||
|
pc.health.compareAndSet(pc.health.get(), pc.health.get() - (float) newStamina);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user