为了将玩家伪装成另一个实体,我创建了一个伪装类,代码如下所示:
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是否是正确的方法(就像我现在这样做)?如果不是,应该怎么做呢?
return disguises;
,否则其他类可以开始改变HashSet<T>
,永远不要返回原始集合本身... - Willem Van Onsem