我一直在研究这个问题超过12个小时而没有成功,所以如果有人可以帮助解决这个问题或提供不同的解决方案,我将永远感激不尽。我遇到的主要问题是使用类继承结构更改字段,我将尝试解释:
" craftPlayer" variable是CraftPlayer的一个实例,它是CraftEntity的子类。 CraftEntity类包含一个Entity对象,该对象具有变量" uniqueID"。所以我基本上所做的就是改变" craftPlayer"的唯一ID变量。我无法访问任何课程,所以我使用反射。我遇到的问题是尝试更改内部" craftPlayer"内的实体变量。但是我无法找到一种方法来将该类的实例作为"实体"变量实际上是EntityPlayer的实例,而不是实体
我意识到这个问题解释得非常糟糕,所以要求尽可能多的澄清问题。任何帮助将不胜感激。
CraftEntity craftPlayer = (CraftEntity) player;
@SuppressWarnings("unchecked")
Class<CraftEntity> craftEntityClass = getCraftEntityClass((Class<CraftEntity>) craftPlayer.getClass());
for (Field field : craftEntityClass.getDeclaredFields()) {
field.setAccessible(true);
if (field.getName().equals("entity")) {
Object object = field.get(craftPlayer);
EntityPlayer entity = (EntityPlayer) object;
entity.uniqueID = new UUID(0L, 0L);
field.set(entity, entity); //"entity" is really an instance of EntityPlayer which is a subclass of Entity so i am unable to change the field because upclassing does not seem to work
break;
}
}
编辑:
这是CraftEntity类,可以更好地展示我正在做什么
public abstract class CraftEntity implements org.bukkit.entity.Entity {
protected final CraftServer server;
protected net.minecraft.server.v1_5_R3.Entity entity;
private EntityDamageEvent lastDamageEvent;
}
答案 0 :(得分:0)
你想在这做什么?
field.set(entity, entity);
如果你想更改“craftPlayer”对象中的字段,你不应该这样做吗?
field.set(craftPlayer, entity);
答案 1 :(得分:0)
entity.uniqueID = new UUID(0L, 0L);
足以改变变量。
尝试将字段设置为新变量将是多余的。
问题实际上是计时,这个代码在玩家保存的数据被加载之前被调用,所以一旦我所做的更改被覆盖了。