Fix null reference on stamina timer when paused player disconnects.

This commit is contained in:
gentlespoon 2022-05-07 21:07:06 -07:00 committed by Melledy
parent 04a58d43d5
commit 8ddd7b125d
2 changed files with 15 additions and 19 deletions

View File

@ -29,19 +29,16 @@ public class StaminaManager {
private Position previousCoordinates = new Position(0, 0, 0); private Position previousCoordinates = new Position(0, 0, 0);
private MotionState currentState = MotionState.MOTION_STANDBY; private MotionState currentState = MotionState.MOTION_STANDBY;
private MotionState previousState = MotionState.MOTION_STANDBY; private MotionState previousState = MotionState.MOTION_STANDBY;
private Timer sustainedStaminaHandlerTimer; private final Timer sustainedStaminaHandlerTimer = new Timer();
private final SustainedStaminaHandler handleSustainedStamina = new SustainedStaminaHandler();
private boolean timerRunning = false;
private GameSession cachedSession = null; private GameSession cachedSession = null;
private GameEntity cachedEntity = null; private GameEntity cachedEntity = null;
private int staminaRecoverDelay = 0; private int staminaRecoverDelay = 0;
private boolean isInSkillMove = false; private boolean isInSkillMove = false;
public boolean getIsInSkillMove() { public boolean getIsInSkillMove() {
return isInSkillMove; return isInSkillMove;
} }
public void setIsInSkillMove(boolean b) { public void setIsInSkillMove(boolean b) {
isInSkillMove = b; isInSkillMove = b;
} }
@ -139,24 +136,23 @@ public class StaminaManager {
entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP));
entity.getWorld().broadcastPacket(new PacketLifeStateChangeNotify(0, entity, LifeState.LIFE_DEAD)); entity.getWorld().broadcastPacket(new PacketLifeStateChangeNotify(0, entity, LifeState.LIFE_DEAD));
player.getScene().removeEntity(entity); player.getScene().removeEntity(entity);
((EntityAvatar) entity).onDeath(dieType, 0); ((EntityAvatar)entity).onDeath(dieType, 0);
} }
public void startSustainedStaminaHandler() { public void startSustainedStaminaHandler() {
if (!player.isPaused()) { if (!player.isPaused() && !timerRunning) {
if (sustainedStaminaHandlerTimer == null) { timerRunning = true;
sustainedStaminaHandlerTimer = new Timer(); sustainedStaminaHandlerTimer.scheduleAtFixedRate(handleSustainedStamina, 0, 200);
sustainedStaminaHandlerTimer.scheduleAtFixedRate(new SustainedStaminaHandler(), 0, 200); // Grasscutter.getLogger().debug("[MovementManager] SustainedStaminaHandlerTimer started");
Grasscutter.getLogger().debug("[MovementManager] SustainedStaminaHandlerTimer started");
}
} }
} }
public void stopSustainedStaminaHandler() { public void stopSustainedStaminaHandler() {
Grasscutter.getLogger().debug("[MovementManager] SustainedStaminaHandlerTimer stopped"); if (timerRunning) {
sustainedStaminaHandlerTimer.cancel(); timerRunning = false;
sustainedStaminaHandlerTimer = null; sustainedStaminaHandlerTimer.cancel();
// Grasscutter.getLogger().debug("[MovementManager] SustainedStaminaHandlerTimer stopped");
}
} }
// Handlers // Handlers

View File

@ -872,11 +872,11 @@ public class Player {
} }
public void onPause() { public void onPause() {
staminaManager.stopSustainedStaminaHandler(); getStaminaManager().stopSustainedStaminaHandler();
} }
public void onUnpause() { public void onUnpause() {
staminaManager.startSustainedStaminaHandler(); getStaminaManager().startSustainedStaminaHandler();
} }
public void sendPacket(BasePacket packet) { public void sendPacket(BasePacket packet) {