diff options
author | Travis Watkins <amaranth@ubuntu.com> | 2012-01-31 13:54:15 -0600 |
---|---|---|
committer | EvilSeph <evilseph@gmail.com> | 2012-02-03 03:34:03 -0500 |
commit | 37c88685324165dad8692dae03014cbfeb119936 (patch) | |
tree | 1308b3ac34167b9116965227d45cf2d114666510 /src/main/java/org/bukkit | |
parent | 028cbb8fe9f7b8062b1074aaeb63a9a62e34bf05 (diff) | |
download | craftbukkit-37c88685324165dad8692dae03014cbfeb119936.tar craftbukkit-37c88685324165dad8692dae03014cbfeb119936.tar.gz craftbukkit-37c88685324165dad8692dae03014cbfeb119936.tar.lz craftbukkit-37c88685324165dad8692dae03014cbfeb119936.tar.xz craftbukkit-37c88685324165dad8692dae03014cbfeb119936.zip |
[Bleeding] Implemented Vanish API.
Remove players that cannot see a player from their EntityTrackerEntry and only
send user list updates to players who can see the player they reference.
Diffstat (limited to 'src/main/java/org/bukkit')
-rw-r--r-- | src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | 65 |
1 files changed, 48 insertions, 17 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 6aa39bca..e9172637 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -11,22 +11,12 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import net.minecraft.server.ChunkCoordinates; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.NBTTagCompound; -import net.minecraft.server.Packet131ItemData; -import net.minecraft.server.Packet200Statistic; -import net.minecraft.server.Packet201PlayerInfo; -import net.minecraft.server.Packet250CustomPayload; -import net.minecraft.server.Packet3Chat; -import net.minecraft.server.Packet51MapChunk; -import net.minecraft.server.Packet53BlockChange; -import net.minecraft.server.Packet54PlayNoteBlock; -import net.minecraft.server.Packet61WorldEvent; -import net.minecraft.server.Packet6SpawnPosition; -import net.minecraft.server.Packet70Bed; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.*; +import org.bukkit.Achievement; +import org.bukkit.Material; +import org.bukkit.Statistic; +import org.bukkit.World; import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.craftbukkit.CraftOfflinePlayer; import org.bukkit.craftbukkit.CraftServer; @@ -46,6 +36,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private long lastPlayed = 0; private boolean hasPlayedBefore = false; private Set<String> channels = new HashSet<String>(); + private Set<Player> hiddenPlayers = new HashSet<Player>(); private int hash = 0; public CraftPlayer(CraftServer server, EntityPlayer entity) { @@ -162,8 +153,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().listName = name; // Change the name on the client side - server.getHandle().sendAll(new Packet201PlayerInfo(oldName, false, 9999)); - server.getHandle().sendAll(new Packet201PlayerInfo(name, true, getHandle().ping)); + Packet201PlayerInfo oldpacket = new Packet201PlayerInfo(oldName, false, 9999); + Packet201PlayerInfo packet = new Packet201PlayerInfo(name, true, getHandle().ping); + for (int i = 0; i < server.getHandle().players.size(); ++i) { + EntityPlayer entityplayer = (EntityPlayer) server.getHandle().players.get(i); + + if (entityplayer.getBukkitEntity().canSee(this)) { + entityplayer.netServerHandler.sendPacket(oldpacket); + entityplayer.netServerHandler.sendPacket(packet); + } + } } @Override @@ -564,6 +563,38 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().spawnWorld = location.getWorld().getName(); } + public void hidePlayer(Player player) { + hiddenPlayers.add(player); + + //remove this player from the hidden player's EntityTrackerEntry + EntityTracker tracker = ((WorldServer) entity.world).tracker; + EntityPlayer other = ((CraftPlayer) player).getHandle(); + EntityTrackerEntry entry = (EntityTrackerEntry) tracker.trackedEntities.a(other.id); + if (entry != null) { + entry.c(getHandle()); + } + + //remove the hidden player from this player user list + getHandle().netServerHandler.sendPacket(new Packet201PlayerInfo(player.getPlayerListName(), false, 9999)); + } + + public void showPlayer(Player player) { + hiddenPlayers.remove(player); + + EntityTracker tracker = ((WorldServer) entity.world).tracker; + EntityPlayer other = ((CraftPlayer) player).getHandle(); + EntityTrackerEntry entry = (EntityTrackerEntry) tracker.trackedEntities.a(other.id); + if (entry != null && !entry.trackedPlayers.contains(getHandle())) { + entry.b(getHandle()); + } + + getHandle().netServerHandler.sendPacket(new Packet201PlayerInfo(player.getPlayerListName(), true, getHandle().ping)); + } + + public boolean canSee(Player player) { + return !hiddenPlayers.contains(player); + } + public Map<String, Object> serialize() { Map<String, Object> result = new LinkedHashMap<String, Object>(); |