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

@ -35,6 +35,8 @@ public class EntityClientGadget extends EntityBaseGadget {
private int ownerEntityId; private int ownerEntityId;
private int targetEntityId; private int targetEntityId;
private boolean asyncLoad; private boolean asyncLoad;
private int originalOwnerEntityId;
public EntityClientGadget(Scene scene, Player player, EvtCreateGadgetNotify notify) { public EntityClientGadget(Scene scene, Player player, EvtCreateGadgetNotify notify) {
super(scene); super(scene);
@ -48,6 +50,14 @@ public class EntityClientGadget extends EntityBaseGadget {
this.ownerEntityId = notify.getPropOwnerEntityId(); this.ownerEntityId = notify.getPropOwnerEntityId();
this.targetEntityId = notify.getTargetEntityId(); this.targetEntityId = notify.getTargetEntityId();
this.asyncLoad = notify.getIsAsyncLoad(); 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 @Override
@ -79,6 +89,10 @@ public class EntityClientGadget extends EntityBaseGadget {
return this.asyncLoad; return this.asyncLoad;
} }
public int getOriginalOwnerEntityId() {
return this.originalOwnerEntityId;
}
@Override @Override
public void onDeath(int killerId) { public void onDeath(int killerId) {

View File

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