SPIGOT-3663: Add plugin parameter to hidePlayer+showPlayer.
Dieser Commit ist enthalten in:
Ursprung
22564a9177
Commit
558c5a348c
@ -8,16 +8,19 @@ import io.netty.buffer.Unpooled;
|
|||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@ -63,10 +66,13 @@ import org.bukkit.inventory.InventoryView.Property;
|
|||||||
import org.bukkit.map.MapCursor;
|
import org.bukkit.map.MapCursor;
|
||||||
import org.bukkit.map.MapView;
|
import org.bukkit.map.MapView;
|
||||||
import org.bukkit.metadata.MetadataValue;
|
import org.bukkit.metadata.MetadataValue;
|
||||||
|
import org.bukkit.plugin.IllegalPluginAccessException;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.bukkit.plugin.messaging.StandardMessenger;
|
import org.bukkit.plugin.messaging.StandardMessenger;
|
||||||
import org.bukkit.scoreboard.Scoreboard;
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
@DelegateDeserialization(CraftOfflinePlayer.class)
|
@DelegateDeserialization(CraftOfflinePlayer.class)
|
||||||
public class CraftPlayer extends CraftHumanEntity implements Player {
|
public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||||
private long firstPlayed = 0;
|
private long firstPlayed = 0;
|
||||||
@ -74,7 +80,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|||||||
private boolean hasPlayedBefore = false;
|
private boolean hasPlayedBefore = false;
|
||||||
private final ConversationTracker conversationTracker = new ConversationTracker();
|
private final ConversationTracker conversationTracker = new ConversationTracker();
|
||||||
private final Set<String> channels = new HashSet<String>();
|
private final Set<String> channels = new HashSet<String>();
|
||||||
private final Set<UUID> hiddenPlayers = new HashSet<UUID>();
|
private final Map<UUID, Set<WeakReference<Plugin>>> hiddenPlayers = new HashMap<>();
|
||||||
|
private static final WeakHashMap<Plugin, WeakReference<Plugin>> pluginWeakReferences = new WeakHashMap<>();
|
||||||
private int hash = 0;
|
private int hash = 0;
|
||||||
private double health = 20;
|
private double health = 20;
|
||||||
private boolean scaledHealth = false;
|
private boolean scaledHealth = false;
|
||||||
@ -905,18 +912,45 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static WeakReference<Plugin> getPluginWeakReference(@Nullable Plugin plugin) {
|
||||||
|
return (plugin == null) ? null : pluginWeakReferences.computeIfAbsent(plugin, WeakReference::new);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public void hidePlayer(Player player) {
|
public void hidePlayer(Player player) {
|
||||||
|
hidePlayer0(null, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void hidePlayer(Plugin plugin, Player player) {
|
||||||
|
Validate.notNull(plugin, "Plugin cannot be null");
|
||||||
|
Validate.isTrue(plugin.isEnabled(), "Plugin attempted to hide player while disabled");
|
||||||
|
|
||||||
|
hidePlayer0(plugin, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hidePlayer0(@Nullable Plugin plugin, Player player) {
|
||||||
Validate.notNull(player, "hidden player cannot be null");
|
Validate.notNull(player, "hidden player cannot be null");
|
||||||
if (getHandle().playerConnection == null) return;
|
if (getHandle().playerConnection == null) return;
|
||||||
if (equals(player)) return;
|
if (equals(player)) return;
|
||||||
if (hiddenPlayers.contains(player.getUniqueId())) return;
|
|
||||||
hiddenPlayers.add(player.getUniqueId());
|
Set<WeakReference<Plugin>> hidingPlugins = hiddenPlayers.get(player.getUniqueId());
|
||||||
|
if (hidingPlugins != null) {
|
||||||
|
// Some plugins are already hiding the player. Just mark that this
|
||||||
|
// plugin wants the player hidden too and end.
|
||||||
|
hidingPlugins.add(getPluginWeakReference(plugin));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
hidingPlugins = new HashSet<>();
|
||||||
|
hidingPlugins.add(getPluginWeakReference(plugin));
|
||||||
|
hiddenPlayers.put(player.getUniqueId(), hidingPlugins);
|
||||||
|
|
||||||
// Remove this player from the hidden player's EntityTrackerEntry
|
// Remove this player from the hidden player's EntityTrackerEntry
|
||||||
EntityTracker tracker = ((WorldServer) entity.world).tracker;
|
EntityTracker tracker = ((WorldServer) entity.world).tracker;
|
||||||
EntityPlayer other = ((CraftPlayer) player).getHandle();
|
EntityPlayer other = ((CraftPlayer) player).getHandle();
|
||||||
EntityTrackerEntry entry = (EntityTrackerEntry) tracker.trackedEntities.get(other.getId());
|
EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId());
|
||||||
if (entry != null) {
|
if (entry != null) {
|
||||||
entry.clear(getHandle());
|
entry.clear(getHandle());
|
||||||
}
|
}
|
||||||
@ -928,11 +962,32 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public void showPlayer(Player player) {
|
public void showPlayer(Player player) {
|
||||||
|
showPlayer0(null, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showPlayer(Plugin plugin, Player player) {
|
||||||
|
Validate.notNull(plugin, "Plugin cannot be null");
|
||||||
|
// Don't require that plugin be enabled. A plugin must be allowed to call
|
||||||
|
// showPlayer during its onDisable() method.
|
||||||
|
showPlayer0(plugin, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showPlayer0(@Nullable Plugin plugin, Player player) {
|
||||||
Validate.notNull(player, "shown player cannot be null");
|
Validate.notNull(player, "shown player cannot be null");
|
||||||
if (getHandle().playerConnection == null) return;
|
if (getHandle().playerConnection == null) return;
|
||||||
if (equals(player)) return;
|
if (equals(player)) return;
|
||||||
if (!hiddenPlayers.contains(player.getUniqueId())) return;
|
|
||||||
|
Set<WeakReference<Plugin>> hidingPlugins = hiddenPlayers.get(player.getUniqueId());
|
||||||
|
if (hidingPlugins == null) {
|
||||||
|
return; // Player isn't hidden
|
||||||
|
}
|
||||||
|
hidingPlugins.remove(getPluginWeakReference(plugin));
|
||||||
|
if (!hidingPlugins.isEmpty()) {
|
||||||
|
return; // Some other plugins still want the player hidden
|
||||||
|
}
|
||||||
hiddenPlayers.remove(player.getUniqueId());
|
hiddenPlayers.remove(player.getUniqueId());
|
||||||
|
|
||||||
EntityTracker tracker = ((WorldServer) entity.world).tracker;
|
EntityTracker tracker = ((WorldServer) entity.world).tracker;
|
||||||
@ -940,7 +995,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|||||||
|
|
||||||
getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, other));
|
getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, other));
|
||||||
|
|
||||||
EntityTrackerEntry entry = (EntityTrackerEntry) tracker.trackedEntities.get(other.getId());
|
EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId());
|
||||||
if (entry != null && !entry.trackedPlayers.contains(getHandle())) {
|
if (entry != null && !entry.trackedPlayers.contains(getHandle())) {
|
||||||
entry.updatePlayer(getHandle());
|
entry.updatePlayer(getHandle());
|
||||||
}
|
}
|
||||||
@ -952,7 +1007,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canSee(Player player) {
|
public boolean canSee(Player player) {
|
||||||
return !hiddenPlayers.contains(player.getUniqueId());
|
return !hiddenPlayers.containsKey(player.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren