Now able to hide disguised players from tab, show player disguises tab

This commit is contained in:
libraryaddict
2016-11-30 17:08:12 +13:00
parent eb1733262f
commit 80b4085204
12 changed files with 759 additions and 688 deletions

View File

@@ -278,8 +278,6 @@ public class DisguiseUtilities {
// But the rest of the time.. Its going to conflict.
// The below is debug output. Most people wouldn't care for it.
// System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS
// + " on a entity. Removed the old disguise.");
disguiseItel.remove();
d.removeDisguise();
}

View File

@@ -52,6 +52,7 @@ import me.libraryaddict.disguise.utilities.packetlisteners.PacketListenerClientI
import me.libraryaddict.disguise.utilities.packetlisteners.PacketListenerInventory;
import me.libraryaddict.disguise.utilities.packetlisteners.PacketListenerMain;
import me.libraryaddict.disguise.utilities.packetlisteners.PacketListenerSounds;
import me.libraryaddict.disguise.utilities.packetlisteners.PacketListenerTabList;
import me.libraryaddict.disguise.utilities.packetlisteners.PacketListenerViewDisguises;
public class PacketsManager {
@@ -139,6 +140,7 @@ public class PacketsManager {
private static PacketListener soundsListener;
private static boolean soundsListenerEnabled;
private static PacketListener viewDisguisesListener;
private static PacketListener tabListListener;
private static boolean viewDisguisesListenerEnabled;
private static HashMap<Disguise, ArrayList<UUID>> _cancelMeta = new HashMap<Disguise, ArrayList<UUID>>();
@@ -148,8 +150,10 @@ public class PacketsManager {
// Because it kicks you for hacking.
clientInteractEntityListener = new PacketListenerClientInteract(libsDisguises);
tabListListener = new PacketListenerTabList(libsDisguises);
ProtocolLibrary.getProtocolManager().addPacketListener(clientInteractEntityListener);
ProtocolLibrary.getProtocolManager().addPacketListener(tabListListener);
// Now I call this and the main listener is registered!
setupMainPacketsListener();
@@ -310,7 +314,9 @@ public class PacketsManager {
// Send player info along with the disguise
PacketContainer sendTab = new PacketContainer(Server.PLAYER_INFO);
packets.addPacket(sendTab);
if (!((PlayerDisguise) disguise).isDisplayedInTab())
packets.addPacket(sendTab);
// Add player to the list, necessary to spawn them
sendTab.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(0));
@@ -405,9 +411,11 @@ public class PacketsManager {
// Remove player from the list
PacketContainer deleteTab = sendTab.shallowClone();
packets.addDelayedPacket(deleteTab, 40);
deleteTab.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4));
if (!((PlayerDisguise) disguise).isDisplayedInTab()) {
packets.addDelayedPacket(deleteTab, 40);
}
}
else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) {
Vector vec = disguisedEntity.getVelocity();

View File

@@ -225,7 +225,7 @@ public class ReflectionFlagWatchers {
}
for (String methodName : new String[] {
"setViewSelfDisguise", "setHideHeldItemFromSelf", "setHideArmorFromSelf", "setHearSelfDisguise"
"setViewSelfDisguise", "setHideHeldItemFromSelf", "setHideArmorFromSelf", "setHearSelfDisguise", "setHidePlayer"
}) {
try {
methods.add(Disguise.class.getMethod(methodName, boolean.class));

View File

@@ -0,0 +1,65 @@
package me.libraryaddict.disguise.utilities.packetlisteners;
import java.util.Iterator;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
import com.comphenix.protocol.wrappers.PlayerInfoData;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.disguisetypes.Disguise;
public class PacketListenerTabList extends PacketAdapter {
public PacketListenerTabList(LibsDisguises plugin) {
super(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.PLAYER_INFO);
}
@Override
public void onPacketSending(final PacketEvent event) {
if (event.isCancelled())
return;
Player observer = event.getPlayer();
if (event.getPacket().getPlayerInfoAction().read(0) != PlayerInfoAction.ADD_PLAYER)
return;
List<PlayerInfoData> list = event.getPacket().getPlayerInfoDataLists().read(0);
Iterator<PlayerInfoData> itel = list.iterator();
while (itel.hasNext()) {
PlayerInfoData data = itel.next();
Player player = Bukkit.getPlayer(data.getProfile().getUUID());
if (player == null)
continue;
Disguise disguise = DisguiseAPI.getDisguise(observer, player);
if (disguise == null)
continue;
if (!disguise.isHidePlayer())
continue;
itel.remove();
}
if (list.isEmpty()) {
event.setCancelled(true);
}
else {
event.getPacket().getPlayerInfoDataLists().write(0, list);
}
}
}