From 886c2e2f432a2b20cb9962865ce970229a84a183 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Sun, 24 Jul 2022 13:20:42 -0400 Subject: [PATCH] Add `EntityDeathEvent` and implementations --- .../grasscutter/game/entity/EntityAvatar.java | 5 ++++ .../game/entity/EntityBaseGadget.java | 6 ++-- .../game/entity/EntityClientGadget.java | 30 +++++++++---------- .../grasscutter/game/entity/EntityGadget.java | 2 ++ .../game/entity/EntityMonster.java | 2 ++ .../grasscutter/game/entity/GameEntity.java | 5 +++- .../server/event/entity/EntityDeathEvent.java | 20 +++++++++++++ 7 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 src/main/java/emu/grasscutter/server/event/entity/EntityDeathEvent.java diff --git a/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java b/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java index 9353553b0..cb640c424 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java @@ -30,6 +30,7 @@ import emu.grasscutter.net.proto.SceneAvatarInfoOuterClass.SceneAvatarInfo; import emu.grasscutter.net.proto.SceneEntityAiInfoOuterClass.SceneEntityAiInfo; import emu.grasscutter.net.proto.SceneEntityInfoOuterClass.SceneEntityInfo; import emu.grasscutter.net.proto.VectorOuterClass.Vector; +import emu.grasscutter.server.event.player.PlayerMoveEvent; import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; import emu.grasscutter.server.packet.send.PacketEntityFightPropChangeReasonNotify; import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; @@ -108,12 +109,16 @@ public class EntityAvatar extends GameEntity { @Override public void onDeath(int killerId) { + super.onDeath(killerId); // Invoke super class's onDeath() method. + this.killedType = PlayerDieType.PLAYER_DIE_TYPE_KILL_BY_MONSTER; this.killedBy = killerId; clearEnergy(ChangeEnergyReason.CHANGE_ENERGY_REASON_NONE); } public void onDeath(PlayerDieType dieType, int killerId) { + super.onDeath(killerId); // Invoke super class's onDeath() method. + this.killedType = dieType; this.killedBy = killerId; clearEnergy(ChangeEnergyReason.CHANGE_ENERGY_REASON_NONE); diff --git a/src/main/java/emu/grasscutter/game/entity/EntityBaseGadget.java b/src/main/java/emu/grasscutter/game/entity/EntityBaseGadget.java index a5b2cb6c5..b063db33a 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityBaseGadget.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityBaseGadget.java @@ -8,11 +8,11 @@ public abstract class EntityBaseGadget extends GameEntity { public EntityBaseGadget(Scene scene) { super(scene); } - + public abstract int getGadgetId(); - + @Override public void onDeath(int killerId) { - + super.onDeath(killerId); // Invoke super class's onDeath() method. } } diff --git a/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java b/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java index 5e0c5eb00..769f571e7 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java @@ -3,7 +3,6 @@ package emu.grasscutter.game.entity; import emu.grasscutter.game.player.Player; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.game.world.Scene; -import emu.grasscutter.game.world.World; import emu.grasscutter.net.proto.AbilitySyncStateInfoOuterClass.AbilitySyncStateInfo; import emu.grasscutter.net.proto.AnimatorParameterValueInfoPairOuterClass.AnimatorParameterValueInfoPair; import emu.grasscutter.net.proto.ClientGadgetInfoOuterClass; @@ -11,7 +10,6 @@ import emu.grasscutter.net.proto.EntityAuthorityInfoOuterClass.EntityAuthorityIn import emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData; import emu.grasscutter.net.proto.EntityRendererChangedInfoOuterClass.EntityRendererChangedInfo; import emu.grasscutter.net.proto.EvtCreateGadgetNotifyOuterClass.EvtCreateGadgetNotify; -import emu.grasscutter.net.proto.GadgetClientParamOuterClass.GadgetClientParam; import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo; import emu.grasscutter.net.proto.PropPairOuterClass.PropPair; import emu.grasscutter.net.proto.ProtEntityTypeOuterClass.ProtEntityType; @@ -25,10 +23,10 @@ import it.unimi.dsi.fastutil.ints.Int2FloatOpenHashMap; public class EntityClientGadget extends EntityBaseGadget { private final Player owner; - + private final Position pos; private final Position rot; - + private int configId; private int campId; private int campType; @@ -37,7 +35,7 @@ public class EntityClientGadget extends EntityBaseGadget { private boolean asyncLoad; private int originalOwnerEntityId; - + public EntityClientGadget(Scene scene, Player player, EvtCreateGadgetNotify notify) { super(scene); this.owner = player; @@ -59,20 +57,20 @@ public class EntityClientGadget extends EntityBaseGadget { this.originalOwnerEntityId = this.ownerEntityId; } } - + @Override public int getGadgetId() { return configId; } - + public Player getOwner() { return owner; } - + public int getCampId() { return campId; } - + public int getCampType() { return campType; } @@ -80,7 +78,7 @@ public class EntityClientGadget extends EntityBaseGadget { public int getOwnerEntityId() { return ownerEntityId; } - + public int getTargetEntityId() { return targetEntityId; } @@ -95,7 +93,7 @@ public class EntityClientGadget extends EntityBaseGadget { @Override public void onDeath(int killerId) { - + super.onDeath(killerId); // Invoke super class's onDeath() method. } @Override @@ -124,7 +122,7 @@ public class EntityClientGadget extends EntityBaseGadget { .setAiInfo(SceneEntityAiInfo.newBuilder().setIsAiOpen(true).setBornPos(Vector.newBuilder())) .setBornPos(Vector.newBuilder()) .build(); - + SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder() .setEntityId(getId()) .setEntityType(ProtEntityType.PROT_ENTITY_TYPE_GADGET) @@ -133,13 +131,13 @@ public class EntityClientGadget extends EntityBaseGadget { .setEntityClientData(EntityClientData.newBuilder()) .setEntityAuthorityInfo(authority) .setLifeState(1); - + PropPair pair = PropPair.newBuilder() .setType(PlayerProperty.PROP_LEVEL.getId()) .setPropValue(ProtoHelper.newPropValue(PlayerProperty.PROP_LEVEL, 1)) .build(); entityInfo.addPropList(pair); - + ClientGadgetInfoOuterClass.ClientGadgetInfo clientGadget = ClientGadgetInfoOuterClass.ClientGadgetInfo.newBuilder() .setCampId(this.getCampId()) .setCampType(this.getCampType()) @@ -147,7 +145,7 @@ public class EntityClientGadget extends EntityBaseGadget { .setTargetEntityId(this.getTargetEntityId()) .setAsyncLoad(this.isAsyncLoad()) .build(); - + SceneGadgetInfo.Builder gadgetInfo = SceneGadgetInfo.newBuilder() .setGadgetId(this.getGadgetId()) .setOwnerEntityId(this.getOwnerEntityId()) @@ -157,7 +155,7 @@ public class EntityClientGadget extends EntityBaseGadget { .setAuthorityPeerId(this.getOwner().getPeerId()); entityInfo.setGadget(gadgetInfo); - + return entityInfo.build(); } } diff --git a/src/main/java/emu/grasscutter/game/entity/EntityGadget.java b/src/main/java/emu/grasscutter/game/entity/EntityGadget.java index 1f88f451a..a344b7fc1 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityGadget.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityGadget.java @@ -175,6 +175,8 @@ public class EntityGadget extends EntityBaseGadget { @Override public void onDeath(int killerId) { + super.onDeath(killerId); // Invoke super class's onDeath() method. + if (this.getSpawnEntry() != null) { this.getScene().getDeadSpawnedEntities().add(getSpawnEntry()); } diff --git a/src/main/java/emu/grasscutter/game/entity/EntityMonster.java b/src/main/java/emu/grasscutter/game/entity/EntityMonster.java index 4c1426c02..d60c96df7 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityMonster.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityMonster.java @@ -158,6 +158,8 @@ public class EntityMonster extends GameEntity { @Override public void onDeath(int killerId) { + super.onDeath(killerId); // Invoke super class's onDeath() method. + if (this.getSpawnEntry() != null) { this.getScene().getDeadSpawnedEntities().add(getSpawnEntry()); } diff --git a/src/main/java/emu/grasscutter/game/entity/GameEntity.java b/src/main/java/emu/grasscutter/game/entity/GameEntity.java index f2b2e4107..c0c15aaa2 100644 --- a/src/main/java/emu/grasscutter/game/entity/GameEntity.java +++ b/src/main/java/emu/grasscutter/game/entity/GameEntity.java @@ -15,6 +15,7 @@ import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo; import emu.grasscutter.net.proto.MotionStateOuterClass.MotionState; import emu.grasscutter.net.proto.SceneEntityInfoOuterClass.SceneEntityInfo; import emu.grasscutter.net.proto.VectorOuterClass.Vector; +import emu.grasscutter.server.event.entity.EntityDeathEvent; import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; import emu.grasscutter.utils.Position; import it.unimi.dsi.fastutil.ints.Int2FloatMap; @@ -262,7 +263,9 @@ public abstract class GameEntity { * @param killerId Entity id of the entity that killed this entity */ public void onDeath(int killerId) { - + // Invoke entity death event. + EntityDeathEvent event = new EntityDeathEvent(this, killerId); + event.call(); } public abstract SceneEntityInfo toProto(); diff --git a/src/main/java/emu/grasscutter/server/event/entity/EntityDeathEvent.java b/src/main/java/emu/grasscutter/server/event/entity/EntityDeathEvent.java new file mode 100644 index 000000000..fb9871318 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/event/entity/EntityDeathEvent.java @@ -0,0 +1,20 @@ +package emu.grasscutter.server.event.entity; + +import emu.grasscutter.game.entity.GameEntity; +import emu.grasscutter.server.event.types.EntityEvent; +import emu.grasscutter.utils.Location; +import lombok.Getter; + +import javax.annotation.Nullable; + +public final class EntityDeathEvent extends EntityEvent { + @Getter private final Location deathLocation; + @Getter @Nullable private final GameEntity killer; + + public EntityDeathEvent(GameEntity entity, int killerId) { + super(entity); + + this.deathLocation = new Location(entity.getScene(), entity.getPosition()); + this.killer = entity.getScene().getEntityById(killerId); + } +} \ No newline at end of file