mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-22 20:04:56 +01:00
Add drowning. Better movement ticking.
This commit is contained in:
@@ -21,7 +21,7 @@ import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.inventory.Inventory;
|
||||
import emu.grasscutter.game.mail.Mail;
|
||||
import emu.grasscutter.game.mail.MailHandler;
|
||||
import emu.grasscutter.game.managers.MotionManager.MotionManager;
|
||||
import emu.grasscutter.game.managers.MovementManager.MovementManager;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.game.props.EntityType;
|
||||
import emu.grasscutter.game.props.PlayerProperty;
|
||||
@@ -122,7 +122,7 @@ public class Player {
|
||||
@Transient private final InvokeHandler<AbilityInvokeEntry> clientAbilityInitFinishHandler;
|
||||
|
||||
private MapMarksManager mapMarksManager;
|
||||
@Transient private MotionManager motionManager;
|
||||
@Transient private MovementManager movementManager;
|
||||
|
||||
|
||||
@Deprecated
|
||||
@@ -164,7 +164,7 @@ public class Player {
|
||||
this.shopLimit = new ArrayList<>();
|
||||
this.messageHandler = null;
|
||||
this.mapMarksManager = new MapMarksManager();
|
||||
this.motionManager = new MotionManager(this);
|
||||
this.movementManager = new MovementManager(this);
|
||||
}
|
||||
|
||||
// On player creation
|
||||
@@ -191,7 +191,7 @@ public class Player {
|
||||
this.getRotation().set(0, 307, 0);
|
||||
this.messageHandler = null;
|
||||
this.mapMarksManager = new MapMarksManager();
|
||||
this.motionManager = new MotionManager(this);
|
||||
this.movementManager = new MovementManager(this);
|
||||
}
|
||||
|
||||
public int getUid() {
|
||||
@@ -974,7 +974,7 @@ public class Player {
|
||||
return mapMarksManager;
|
||||
}
|
||||
|
||||
public MotionManager getMotionManager() { return motionManager; }
|
||||
public MovementManager getMovementManager() { return movementManager; }
|
||||
|
||||
public synchronized void onTick() {
|
||||
// Check ping
|
||||
@@ -1004,33 +1004,9 @@ public class Player {
|
||||
this.resetSendPlayerLocTime();
|
||||
}
|
||||
}
|
||||
|
||||
scheduleStaminaNotify();
|
||||
}
|
||||
|
||||
private void scheduleStaminaNotify() {
|
||||
// stamina tick
|
||||
EntityMoveInfoOuterClass.EntityMoveInfo moveInfo = getMotionManager().getMoveInfo();
|
||||
if (moveInfo == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (getMotionManager().getMoveInfo().getMotionInfo().getState() == MotionStateOuterClass.MotionState.MOTION_STANDBY) {
|
||||
if (getProperty(PlayerProperty.PROP_CUR_PERSIST_STAMINA) == getProperty(PlayerProperty.PROP_MAX_STAMINA) ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 1000; i+=200) {
|
||||
Timer timer = new Timer();
|
||||
timer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
getMotionManager().tick();
|
||||
}
|
||||
}, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void resetSendPlayerLocTime() {
|
||||
|
||||
@@ -24,6 +24,7 @@ import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
|
||||
import emu.grasscutter.net.proto.MotionStateOuterClass.MotionState;
|
||||
import emu.grasscutter.net.proto.PlayerDieTypeOuterClass.PlayerDieType;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarDieAnimationEndRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify;
|
||||
@@ -419,27 +420,37 @@ public class TeamManager {
|
||||
if (deadAvatar.isAlive() || deadAvatar.getId() != dieGuid) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Replacement avatar
|
||||
EntityAvatar replacement = null;
|
||||
int replaceIndex = -1;
|
||||
|
||||
for (int i = 0; i < this.getActiveTeam().size(); i++) {
|
||||
EntityAvatar entity = this.getActiveTeam().get(i);
|
||||
if (entity.isAlive()) {
|
||||
replaceIndex = i;
|
||||
replacement = entity;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (replacement == null) {
|
||||
// No more living team members...
|
||||
getPlayer().sendPacket(new PacketWorldPlayerDieNotify(deadAvatar.getKilledType(), deadAvatar.getKilledBy()));
|
||||
|
||||
PlayerDieType dieType = deadAvatar.getKilledType();
|
||||
int killedBy = deadAvatar.getKilledBy();
|
||||
|
||||
if (dieType == PlayerDieType.PLAYER_DIE_DRAWN) {
|
||||
// Died in water. Do not replace
|
||||
// The official server has skipped this notify and will just respawn the team immediately after the animation.
|
||||
// TODO: Perhaps find a way to get vanilla experience?
|
||||
getPlayer().sendPacket(new PacketWorldPlayerDieNotify(dieType, killedBy));
|
||||
} else {
|
||||
// Set index and spawn replacement member
|
||||
this.setCurrentCharacterIndex(replaceIndex);
|
||||
getPlayer().getScene().addEntity(replacement);
|
||||
// Replacement avatar
|
||||
EntityAvatar replacement = null;
|
||||
int replaceIndex = -1;
|
||||
|
||||
for (int i = 0; i < this.getActiveTeam().size(); i++) {
|
||||
EntityAvatar entity = this.getActiveTeam().get(i);
|
||||
if (entity.isAlive()) {
|
||||
replaceIndex = i;
|
||||
replacement = entity;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (replacement == null) {
|
||||
// No more living team members...
|
||||
getPlayer().sendPacket(new PacketWorldPlayerDieNotify(dieType, killedBy));
|
||||
} else {
|
||||
// Set index and spawn replacement member
|
||||
this.setCurrentCharacterIndex(replaceIndex);
|
||||
getPlayer().getScene().addEntity(replacement);
|
||||
}
|
||||
}
|
||||
|
||||
// Response packet
|
||||
@@ -492,11 +503,13 @@ public class TeamManager {
|
||||
|
||||
public void respawnTeam() {
|
||||
// Make sure all team members are dead
|
||||
for (EntityAvatar entity : getActiveTeam()) {
|
||||
if (entity.isAlive()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Drowning needs revive when there may be other team members still alive.
|
||||
// for (EntityAvatar entity : getActiveTeam()) {
|
||||
// if (entity.isAlive()) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
player.getMovementManager().resetTimer(); // prevent drowning immediately after respawn
|
||||
|
||||
// Revive all team members
|
||||
for (EntityAvatar entity : getActiveTeam()) {
|
||||
|
||||
Reference in New Issue
Block a user