为了将玩家伪装成另一个实体,我制作了一个伪装类,您可以在此处看到:
public class Disguise
{
private static HashSet<Disguise> disguises = new HashSet<>();
private net.minecraft.server.v1_8_R2.EntityLiving nmsEntity;
private Player disguise;
public Disguise(Player disguise, EntityLiving entity, boolean affectLogin)
{
if(affectLogin)
disguises.add(this);
this.disguise = disguise;
this.nmsEntity = entity;
}
public Disguise(Player disguise, EntityLiving entity)
{
this(disguise, entity, true);
}
public void send(Player visible)
{
if(visible == disguise)
return;
EntityPlayer player = NMSUtils.getNMSPlayer(visible);
nmsEntity.setPosition(player.locX, player.locY, player.locZ);
nmsEntity.d(disguise.getEntityId());
nmsEntity.setCustomName(disguise.getDisplayName());
nmsEntity.setCustomNameVisible(true);
PacketPlayOutSpawnEntityLiving spawn = new PacketPlayOutSpawnEntityLiving(nmsEntity);
PacketPlayOutEntityDestroy destroy = new PacketPlayOutEntityDestroy(disguise.getEntityId());
player.playerConnection.sendPacket(destroy);
player.playerConnection.sendPacket(spawn);
}
public void send(List<Player> visible)
{
for(Player player : visible)
send(player);
}
public void send(Player... visible)
{
send(Arrays.asList(visible));
}
public void send()
{
send(new ArrayList<>(Bukkit.getOnlinePlayers()));
}
public Player getDisguised()
{
return disguise;
}
public static HashSet<Disguise> getDisguises()
{
return disguises;
}
}
我还有一个静态HashSet,它存储所有制作的实例。之所以这样做,是因为我希望登录的玩家也能看到该伪装,并且我希望在玩家注销时从玩家中删除该伪装。静态HashSet是实现它的方式吗(就像我正在做的那样)?如果没有,应该怎么做?
最佳答案
static
正在要求它。从本质上讲,它容易被“滥用”,但这只是挑战的一部分。
一切都说完了,如果您的mod做到了您需要做的事情而没有错误,那么不要在这种粒度级别(特定变量)上过分强调最佳实践。它的范围不可能扩大到不良的设计会对您造成问题的程度。毕竟,它不是生命支持系统。
如果您想练习良好的娱乐形式,我的第一个直觉是将管理逻辑从Disguise移至(例如)DisguiseManager类,并通过管理器类处理所有Disguise创建/销毁。不太复杂的是私有构造函数和Disguise上的静态create / destroy方法。像您发布的那样,构造函数中的全局副作用通常是不好的形式。