Introduce a simpler way to get the original owner of an EntityClientGadget

This commit is contained in:
ImmuState 2022-05-26 02:37:40 -07:00 committed by Melledy
parent fa90e37da3
commit de8b0be36e
2 changed files with 19 additions and 8 deletions

View File

@ -36,6 +36,8 @@ public class EntityClientGadget extends EntityBaseGadget {
private int targetEntityId;
private boolean asyncLoad;
private int originalOwnerEntityId;
public EntityClientGadget(Scene scene, Player player, EvtCreateGadgetNotify notify) {
super(scene);
this.owner = player;
@ -48,6 +50,14 @@ public class EntityClientGadget extends EntityBaseGadget {
this.ownerEntityId = notify.getPropOwnerEntityId();
this.targetEntityId = notify.getTargetEntityId();
this.asyncLoad = notify.getIsAsyncLoad();
GameEntity owner = scene.getEntityById(this.ownerEntityId);
if (owner instanceof EntityClientGadget ownerGadget) {
this.originalOwnerEntityId = ownerGadget.getOriginalOwnerEntityId();
}
else {
this.originalOwnerEntityId = this.ownerEntityId;
}
}
@Override
@ -79,6 +89,10 @@ public class EntityClientGadget extends EntityBaseGadget {
return this.asyncLoad;
}
public int getOriginalOwnerEntityId() {
return this.originalOwnerEntityId;
}
@Override
public void onDeath(int killerId) {

View File

@ -98,13 +98,10 @@ public class EnergyManager {
if (!(entity instanceof EntityClientGadget)) {
res = invokeEntityId;
}
// If the entity is a `EntityClientGadget`, we need to "walk up" the owner hierarchy,
// until the owner is no longer a gadget. This should then be the ID of the casting avatar.
// If the entity is a `EntityClientGadget`, we need to find the ID of the original
// owner of that gadget.
else {
while (entity instanceof EntityClientGadget gadget) {
res = gadget.getOwnerEntityId();
entity = player.getScene().getEntityById(gadget.getOwnerEntityId());
}
res = ((EntityClientGadget)entity).getOriginalOwnerEntityId();
}
return res;
@ -139,9 +136,9 @@ public class EnergyManager {
.findFirst();
// Bug: invokes twice sometimes, Ayato, Keqing
// Amber not getting element properly
// ToDo: deal with press, hold difference. deal with charge(Beidou, Yunjin)
if (avatarEntity.isPresent()) {
Grasscutter.getLogger().info("Found entity: {}", avatarEntity.get());
Avatar avatar = avatarEntity.get().getAvatar();
if (avatar != null) {