summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/bukkit
diff options
context:
space:
mode:
authorTravis Watkins <amaranth@ubuntu.com>2012-01-31 13:54:15 -0600
committerEvilSeph <evilseph@gmail.com>2012-02-03 03:34:03 -0500
commit37c88685324165dad8692dae03014cbfeb119936 (patch)
tree1308b3ac34167b9116965227d45cf2d114666510 /src/main/java/org/bukkit
parent028cbb8fe9f7b8062b1074aaeb63a9a62e34bf05 (diff)
downloadcraftbukkit-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.java65
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>();