Small code cleanup
This commit is contained in:
		| @@ -1268,122 +1268,131 @@ public class DisguiseUtilities { | ||||
|         String originalTeam = preDisguiseTeam.remove(player.getUniqueId()); | ||||
|         String teamDisguise = disguiseTeam.remove(player.getUniqueId()); | ||||
|  | ||||
|         if (teamDisguise != null && DisguiseConfig.getPushingOption() != DisguisePushing.IGNORE_SCOREBOARD) { | ||||
|             // Code replace them back onto their original scoreboard team | ||||
|             Scoreboard scoreboard = player.getScoreboard(); | ||||
|             Team team = originalTeam == null ? null : scoreboard.getTeam(originalTeam); | ||||
|             Team ldTeam = null; | ||||
|         if (teamDisguise == null || DisguiseConfig.getPushingOption() == DisguisePushing.IGNORE_SCOREBOARD) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|             for (Team t : scoreboard.getTeams()) { | ||||
|                 if (!t.hasEntry(player.getName())) | ||||
|                     continue; | ||||
|         // Code replace them back onto their original scoreboard team | ||||
|         Scoreboard scoreboard = player.getScoreboard(); | ||||
|         Team team = originalTeam == null ? null : scoreboard.getTeam(originalTeam); | ||||
|         Team ldTeam = null; | ||||
|  | ||||
|                 ldTeam = t; | ||||
|                 break; | ||||
|             } | ||||
|         for (Team t : scoreboard.getTeams()) { | ||||
|             if (!t.hasEntry(player.getName())) | ||||
|                 continue; | ||||
|  | ||||
|             if (DisguiseConfig.isWarnScoreboardConflict()) { | ||||
|                 if (ldTeam == null || !ldTeam.getName().equals(teamDisguise)) { | ||||
|                     getLogger().warning("Scoreboard conflict, the self disguise player was not on the expected team!"); | ||||
|                 } else { | ||||
|                     OptionStatus collisions = ldTeam.getOption(Option.COLLISION_RULE); | ||||
|             ldTeam = t; | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|                     if (collisions != OptionStatus.NEVER && collisions != OptionStatus.FOR_OTHER_TEAMS) { | ||||
|                         getLogger().warning( | ||||
|                                 "Scoreboard conflict, the collisions for a self disguise player team has been " + | ||||
|                                         "unexpectedly modifed!"); | ||||
|                     } | ||||
|         if (DisguiseConfig.isWarnScoreboardConflict()) { | ||||
|             if (ldTeam == null || !ldTeam.getName().equals(teamDisguise)) { | ||||
|                 getLogger().warning("Scoreboard conflict, the self disguise player was not on the expected team!"); | ||||
|             } else { | ||||
|                 OptionStatus collisions = ldTeam.getOption(Option.COLLISION_RULE); | ||||
|  | ||||
|                 if (collisions != OptionStatus.NEVER && collisions != OptionStatus.FOR_OTHER_TEAMS) { | ||||
|                     getLogger().warning( | ||||
|                             "Scoreboard conflict, the collisions for a self disguise player team has been " + | ||||
|                                     "unexpectedly modifed!"); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|             if (ldTeam != null) { | ||||
|                 if (!ldTeam.getName().equals("LD_Pushing") && !ldTeam.getName().endsWith("_LDP")) { | ||||
|                     // Its not a team assigned by Lib's Disguises | ||||
|                     ldTeam = null; | ||||
|                 } | ||||
|         if (ldTeam != null) { | ||||
|             if (!ldTeam.getName().equals("LD_Pushing") && !ldTeam.getName().endsWith("_LDP")) { | ||||
|                 // Its not a team assigned by Lib's Disguises | ||||
|                 ldTeam = null; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|             if (team != null) { | ||||
|                 team.addEntry(player.getName()); | ||||
|             } else if (ldTeam != null) { | ||||
|                 ldTeam.removeEntry(player.getName()); | ||||
|             } | ||||
|         if (team != null) { | ||||
|             team.addEntry(player.getName()); | ||||
|         } else if (ldTeam != null) { | ||||
|             ldTeam.removeEntry(player.getName()); | ||||
|         } | ||||
|  | ||||
|             if (ldTeam != null && ldTeam.getEntries().isEmpty()) { | ||||
|                 ldTeam.unregister(); | ||||
|             } | ||||
|         if (ldTeam != null && ldTeam.getEntries().isEmpty()) { | ||||
|             ldTeam.unregister(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setupSelfDisguiseScoreboard(Player player) { | ||||
|         // They're already in a disguise team | ||||
|         if (disguiseTeam.containsKey(player.getUniqueId())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         DisguisePushing pOption = DisguiseConfig.getPushingOption(); | ||||
|  | ||||
|         if (pOption != DisguisePushing.IGNORE_SCOREBOARD) { | ||||
|             // Code to stop player pushing | ||||
|             Scoreboard scoreboard = player.getScoreboard(); | ||||
|             Team prevTeam = null; | ||||
|             Team ldTeam = null; | ||||
|             String ldTeamName = "LD_Pushing"; | ||||
|         if (pOption == DisguisePushing.IGNORE_SCOREBOARD) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|             for (Team t : scoreboard.getTeams()) { | ||||
|                 if (!t.hasEntry(player.getName())) | ||||
|                     continue; | ||||
|         // Code to stop player pushing | ||||
|         Scoreboard scoreboard = player.getScoreboard(); | ||||
|         Team prevTeam = null; | ||||
|         Team ldTeam = null; | ||||
|         String ldTeamName = "LD_Pushing"; | ||||
|  | ||||
|                 prevTeam = t; | ||||
|                 break; | ||||
|             } | ||||
|         for (Team t : scoreboard.getTeams()) { | ||||
|             if (!t.hasEntry(player.getName())) | ||||
|                 continue; | ||||
|  | ||||
|             // If the player is in a team already and the team isn't one controlled by Lib's Disguises | ||||
|             if (prevTeam != null && !(prevTeam.getName().equals("LD_Pushing") || prevTeam.getName().endsWith("_LDP"))) { | ||||
|                 // If we're creating a scoreboard | ||||
|                 if (pOption == DisguisePushing.CREATE_SCOREBOARD) { | ||||
|                     // Remember his old team so we can give him it back later | ||||
|                     preDisguiseTeam.put(player.getUniqueId(), prevTeam.getName()); | ||||
|                 } else { | ||||
|                     // We're modifying the scoreboard | ||||
|                     ldTeam = prevTeam; | ||||
|                 } | ||||
|             } else { | ||||
|                 prevTeam = null; | ||||
|             } | ||||
|             prevTeam = t; | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|             // If we are creating a new scoreboard because the current one must not be modified | ||||
|         // If the player is in a team already and the team isn't one controlled by Lib's Disguises | ||||
|         if (prevTeam != null && !(prevTeam.getName().equals("LD_Pushing") || prevTeam.getName().endsWith("_LDP"))) { | ||||
|             // If we're creating a scoreboard | ||||
|             if (pOption == DisguisePushing.CREATE_SCOREBOARD) { | ||||
|                 // If they have a team, we'll reuse that name. Otherwise go for another name | ||||
|                 ldTeamName = (prevTeam == null ? "No Team" : prevTeam.getName()); | ||||
|  | ||||
|                 // Give the teamname a custom name | ||||
|                 ldTeamName = ldTeamName.substring(0, Math.min(12, ldTeamName.length())) + "_LDP"; | ||||
|                 // Remember his old team so we can give him it back later | ||||
|                 preDisguiseTeam.put(player.getUniqueId(), prevTeam.getName()); | ||||
|             } else { | ||||
|                 // We're modifying the scoreboard | ||||
|                 ldTeam = prevTeam; | ||||
|             } | ||||
|         } else { | ||||
|             prevTeam = null; | ||||
|         } | ||||
|  | ||||
|             if (ldTeam == null && (ldTeam = scoreboard.getTeam(ldTeamName)) == null) { | ||||
|                 ldTeam = scoreboard.registerNewTeam(ldTeamName); | ||||
|         // If we are creating a new scoreboard because the current one must not be modified | ||||
|         if (pOption == DisguisePushing.CREATE_SCOREBOARD) { | ||||
|             // If they have a team, we'll reuse that name. Otherwise go for another name | ||||
|             ldTeamName = (prevTeam == null ? "No Team" : prevTeam.getName()); | ||||
|  | ||||
|             // Give the teamname a custom name | ||||
|             ldTeamName = ldTeamName.substring(0, Math.min(12, ldTeamName.length())) + "_LDP"; | ||||
|         } | ||||
|  | ||||
|         if (ldTeam == null && (ldTeam = scoreboard.getTeam(ldTeamName)) == null) { | ||||
|             ldTeam = scoreboard.registerNewTeam(ldTeamName); | ||||
|         } | ||||
|  | ||||
|         disguiseTeam.put(player.getUniqueId(), ldTeam.getName()); | ||||
|  | ||||
|         if (!ldTeam.hasEntry(player.getName())) | ||||
|             ldTeam.addEntry(player.getName()); | ||||
|  | ||||
|         if (pOption == DisguisePushing.CREATE_SCOREBOARD && prevTeam != null) { | ||||
|             ldTeam.setAllowFriendlyFire(prevTeam.allowFriendlyFire()); | ||||
|             ldTeam.setCanSeeFriendlyInvisibles(prevTeam.canSeeFriendlyInvisibles()); | ||||
|             ldTeam.setDisplayName(prevTeam.getDisplayName()); | ||||
|             ldTeam.setPrefix(prevTeam.getPrefix()); | ||||
|             ldTeam.setSuffix(prevTeam.getSuffix()); | ||||
|  | ||||
|             for (Option option : Team.Option.values()) { | ||||
|                 ldTeam.setOption(option, prevTeam.getOption(option)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|             disguiseTeam.put(player.getUniqueId(), ldTeam.getName()); | ||||
|         if (ldTeam.getOption(Option.COLLISION_RULE) != OptionStatus.NEVER && DisguiseConfig.isModifyCollisions()) { | ||||
|             ldTeam.setOption(Option.COLLISION_RULE, OptionStatus.NEVER); | ||||
|         } | ||||
|  | ||||
|             if (!ldTeam.hasEntry(player.getName())) | ||||
|                 ldTeam.addEntry(player.getName()); | ||||
|  | ||||
|             if (pOption == DisguisePushing.CREATE_SCOREBOARD && prevTeam != null) { | ||||
|                 ldTeam.setAllowFriendlyFire(prevTeam.allowFriendlyFire()); | ||||
|                 ldTeam.setCanSeeFriendlyInvisibles(prevTeam.canSeeFriendlyInvisibles()); | ||||
|                 ldTeam.setDisplayName(prevTeam.getDisplayName()); | ||||
|                 ldTeam.setPrefix(prevTeam.getPrefix()); | ||||
|                 ldTeam.setSuffix(prevTeam.getSuffix()); | ||||
|  | ||||
|                 for (Option option : Team.Option.values()) { | ||||
|                     ldTeam.setOption(option, prevTeam.getOption(option)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (ldTeam.getOption(Option.COLLISION_RULE) != OptionStatus.NEVER && DisguiseConfig.isModifyCollisions()) { | ||||
|                 ldTeam.setOption(Option.COLLISION_RULE, OptionStatus.NEVER); | ||||
|             } | ||||
|  | ||||
|             if (ldTeam.canSeeFriendlyInvisibles() && DisguiseConfig.isDisableFriendlyInvisibles()) { | ||||
|                 ldTeam.setCanSeeFriendlyInvisibles(false); | ||||
|             } | ||||
|         if (ldTeam.canSeeFriendlyInvisibles() && DisguiseConfig.isDisableFriendlyInvisibles()) { | ||||
|             ldTeam.setCanSeeFriendlyInvisibles(false); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -1645,7 +1654,7 @@ public class DisguiseUtilities { | ||||
|             if (transformed.isUnhandled()) | ||||
|                 transformed.addPacket(packet); | ||||
|  | ||||
|             transformed.setPacketType(packet.getType()); | ||||
|             transformed.setSpawnPacketCheck(packet.getType()); | ||||
|  | ||||
|             for (PacketContainer p : transformed.getPackets()) { | ||||
|                 p = p.deepClone(); | ||||
| @@ -1668,7 +1677,7 @@ public class DisguiseUtilities { | ||||
|     public static void setupFakeDisguise(final Disguise disguise) { | ||||
|         Entity e = disguise.getEntity(); | ||||
|  | ||||
|         // If the disguises entity is null, or the disguised entity isn't a player return | ||||
|         // If the disguises entity is null, or the disguised entity isn't a player; return | ||||
|         if (!(e instanceof Player) || !getDisguises().containsKey(e.getUniqueId()) || | ||||
|                 !getDisguises().get(e.getUniqueId()).contains(disguise)) { | ||||
|             return; | ||||
|   | ||||
| @@ -60,7 +60,7 @@ public class PacketsManager { | ||||
|             return disguise; | ||||
|         } | ||||
|  | ||||
|         public void setPacketType(PacketType type) { | ||||
|         public void setSpawnPacketCheck(PacketType type) { | ||||
|             isSpawnPacket = type.name().contains("SPAWN") && type.name().contains("ENTITY"); | ||||
|         } | ||||
|  | ||||
| @@ -78,7 +78,7 @@ public class PacketsManager { | ||||
|  | ||||
|         public void addDelayedPacket(PacketContainer packet, int ticksDelayed) { | ||||
|             if (!delayedPackets.containsKey(ticksDelayed)) | ||||
|                 delayedPackets.put(ticksDelayed, new ArrayList<PacketContainer>()); | ||||
|                 delayedPackets.put(ticksDelayed, new ArrayList<>()); | ||||
|  | ||||
|             delayedPackets.get(ticksDelayed).add(packet); | ||||
|         } | ||||
| @@ -681,7 +681,7 @@ public class PacketsManager { | ||||
|         soundsListener = new PacketListenerSounds(libsDisguises); | ||||
|  | ||||
|         // Self disguise (/vsd) listener | ||||
|         viewDisguisesListener = new PacketListenerViewDisguises(libsDisguises); | ||||
|         viewDisguisesListener = new PacketListenerViewSelfDisguise(libsDisguises); | ||||
|  | ||||
|         inventoryListener = new PacketListenerInventory(libsDisguises); | ||||
|     } | ||||
| @@ -951,13 +951,19 @@ public class PacketsManager { | ||||
|                     sentPacket.getType() == Server.REL_ENTITY_MOVE) { | ||||
|                 if (disguise.getType() == DisguiseType.RABBIT && (sentPacket.getType() == Server.REL_ENTITY_MOVE || | ||||
|                         sentPacket.getType() == Server.REL_ENTITY_MOVE_LOOK)) { | ||||
|                     // Rabbit robbing... | ||||
|                     if (entity.getMetadata("LibsRabbitHop").isEmpty() || | ||||
|                             System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() < 100 || | ||||
|                             System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() > 500) { | ||||
|                         if (entity.getMetadata("LibsRabbitHop").isEmpty() || | ||||
|                                 System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong() > | ||||
|                                         500) { | ||||
|                     // When did the rabbit disguise last hop | ||||
|                     long lastHop = 999999; | ||||
|  | ||||
|                     // If hop meta exists, set the last hop time | ||||
|                     if (!entity.getMetadata("LibsRabbitHop").isEmpty()) { | ||||
|                         // Last hop was 3 minutes ago, so subtract current time with the last hop time and get 3 | ||||
|                         // minutes ago in milliseconds | ||||
|                         lastHop = System.currentTimeMillis() - entity.getMetadata("LibsRabbitHop").get(0).asLong(); | ||||
|                     } | ||||
|  | ||||
|                     // If last hop was less than 0.1 or more than 0.5 seconds ago | ||||
|                     if (lastHop < 100 || lastHop > 500) { | ||||
|                         if (lastHop > 500) { | ||||
|                             entity.removeMetadata("LibsRabbitHop", libsDisguises); | ||||
|                             entity.setMetadata("LibsRabbitHop", | ||||
|                                     new FixedMetadataValue(libsDisguises, System.currentTimeMillis())); | ||||
|   | ||||
| @@ -66,7 +66,7 @@ public class PacketListenerMain extends PacketAdapter { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         packets.setPacketType(event.getPacketType()); | ||||
|         packets.setSpawnPacketCheck(event.getPacketType()); | ||||
|  | ||||
|         event.setCancelled(true); | ||||
|  | ||||
|   | ||||
| @@ -1,172 +1,177 @@ | ||||
| package me.libraryaddict.disguise.utilities.packetlisteners; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.bukkit.entity.Player; | ||||
| 
 | ||||
| import com.comphenix.protocol.PacketType; | ||||
| import com.comphenix.protocol.PacketType.Play.Server; | ||||
| import com.comphenix.protocol.ProtocolLibrary; | ||||
| import com.comphenix.protocol.events.ListenerPriority; | ||||
| import com.comphenix.protocol.events.PacketAdapter; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| import com.comphenix.protocol.events.PacketEvent; | ||||
| import com.comphenix.protocol.reflect.StructureModifier; | ||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
| 
 | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||
| 
 | ||||
| public class PacketListenerViewDisguises extends PacketAdapter { | ||||
|     public PacketListenerViewDisguises(LibsDisguises plugin) { | ||||
|         super(plugin, ListenerPriority.HIGH, Server.NAMED_ENTITY_SPAWN, Server.ATTACH_ENTITY, Server.REL_ENTITY_MOVE, | ||||
|                 Server.REL_ENTITY_MOVE_LOOK, Server.ENTITY_LOOK, Server.ENTITY_TELEPORT, Server.ENTITY_HEAD_ROTATION, | ||||
|                 Server.ENTITY_METADATA, Server.ENTITY_EQUIPMENT, Server.ANIMATION, Server.BED, Server.ENTITY_EFFECT, | ||||
|                 Server.ENTITY_VELOCITY, Server.UPDATE_ATTRIBUTES, Server.ENTITY_STATUS); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void onPacketSending(final PacketEvent event) { | ||||
|         if (event.isCancelled()) | ||||
|             return; | ||||
| 
 | ||||
|         try { | ||||
|             final Player observer = event.getPlayer(); | ||||
| 
 | ||||
|             if (observer.getName().contains("UNKNOWN[")) // If the player is temporary | ||||
|                 return; | ||||
| 
 | ||||
|             if (event.getPacket().getIntegers().read(0) != observer.getEntityId()) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (!DisguiseAPI.isSelfDisguised(observer)) { | ||||
|                 if (event.getPacketType() == PacketType.Play.Server.ENTITY_METADATA) { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(observer, observer); | ||||
| 
 | ||||
|                     if (disguise != null && disguise.isSelfDisguiseVisible()) { | ||||
|                         event.setCancelled(true); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             final Disguise disguise = DisguiseAPI.getDisguise(observer, observer); | ||||
| 
 | ||||
|             if (disguise == null) | ||||
|                 return; | ||||
| 
 | ||||
|             // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. | ||||
|             LibsPackets transformed = PacketsManager.transformPacket(event.getPacket(), disguise, observer, observer); | ||||
| 
 | ||||
|             if (transformed.isUnhandled()) { | ||||
|                 transformed.getPackets().add(event.getPacket()); | ||||
|             } | ||||
| 
 | ||||
|             transformed.setPacketType(event.getPacketType()); | ||||
| 
 | ||||
|             for (PacketContainer packet : transformed.getPackets()) { | ||||
|                 if (packet.getType() != Server.PLAYER_INFO) { | ||||
|                     if (packet.equals(event.getPacket())) { | ||||
|                         packet = packet.shallowClone(); | ||||
|                     } | ||||
| 
 | ||||
|                     packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|                 } | ||||
| 
 | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             for (ArrayList<PacketContainer> packets : transformed.getDelayedPackets()) { | ||||
|                 for (PacketContainer packet : packets) { | ||||
|                     if (packet.getType() != Server.PLAYER_INFO) { | ||||
|                         if (packet.equals(event.getPacket())) { | ||||
|                             packet = packet.shallowClone(); | ||||
|                         } | ||||
| 
 | ||||
|                         packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             transformed.sendDelayed(observer); | ||||
| 
 | ||||
|             if (event.getPacketType() == Server.ENTITY_METADATA) { | ||||
|                 event.setPacket(event.getPacket().deepClone()); | ||||
| 
 | ||||
|                 for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0)) { | ||||
|                     if (watch.getIndex() == 0) { | ||||
|                         byte b = (byte) watch.getValue(); | ||||
| 
 | ||||
|                         byte a = (byte) (b | 1 << 5); | ||||
| 
 | ||||
|                         if ((b & 1 << 3) != 0) | ||||
|                             a = (byte) (a | 1 << 3); | ||||
| 
 | ||||
|                         watch.setValue(a); | ||||
|                     } | ||||
|                 } | ||||
|             } else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) { | ||||
|                 event.setCancelled(true); | ||||
| 
 | ||||
|                 PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA); | ||||
| 
 | ||||
|                 StructureModifier<Object> mods = packet.getModifier(); | ||||
| 
 | ||||
|                 mods.write(0, observer.getEntityId()); | ||||
| 
 | ||||
|                 List<WrappedWatchableObject> watchableList = new ArrayList<>(); | ||||
|                 Byte b = 1 << 5; | ||||
| 
 | ||||
|                 if (observer.isSprinting()) | ||||
|                     b = (byte) (b | 1 << 3); | ||||
| 
 | ||||
|                 WrappedWatchableObject watch = ReflectionManager.createWatchable(0, b); | ||||
| 
 | ||||
|                 if (watch != null) | ||||
|                     watchableList.add(watch); | ||||
| 
 | ||||
|                 packet.getWatchableCollectionModifier().write(0, watchableList); | ||||
| 
 | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } else if (event.getPacketType() == Server.ANIMATION) { | ||||
|                 if (event.getPacket().getIntegers().read(1) != 2) { | ||||
|                     event.setCancelled(true); | ||||
|                 } | ||||
|             } else if (event.getPacketType() == Server.ATTACH_ENTITY || event | ||||
|                     .getPacketType() == Server.REL_ENTITY_MOVE || event | ||||
|                     .getPacketType() == Server.REL_ENTITY_MOVE_LOOK || event | ||||
|                     .getPacketType() == Server.ENTITY_LOOK || event.getPacketType() == Server.ENTITY_TELEPORT || event | ||||
|                     .getPacketType() == Server.ENTITY_HEAD_ROTATION || event | ||||
|                     .getPacketType() == Server.ENTITY_EQUIPMENT) { | ||||
|                 event.setCancelled(true); | ||||
|             } else if (event.getPacketType() == Server.ENTITY_STATUS) { | ||||
|                 if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer() && event.getPacket() | ||||
|                         .getBytes().read(0) == 2) { | ||||
|                     event.setCancelled(true); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             event.setCancelled(true); | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| package me.libraryaddict.disguise.utilities.packetlisteners; | ||||
| 
 | ||||
| import com.comphenix.protocol.PacketType; | ||||
| import com.comphenix.protocol.PacketType.Play.Server; | ||||
| import com.comphenix.protocol.ProtocolLibrary; | ||||
| import com.comphenix.protocol.events.ListenerPriority; | ||||
| import com.comphenix.protocol.events.PacketAdapter; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| import com.comphenix.protocol.events.PacketEvent; | ||||
| import com.comphenix.protocol.reflect.StructureModifier; | ||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||
| import org.bukkit.entity.Player; | ||||
| 
 | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class PacketListenerViewSelfDisguise extends PacketAdapter { | ||||
|     public PacketListenerViewSelfDisguise(LibsDisguises plugin) { | ||||
|         super(plugin, ListenerPriority.HIGH, Server.NAMED_ENTITY_SPAWN, Server.ATTACH_ENTITY, Server.REL_ENTITY_MOVE, | ||||
|                 Server.REL_ENTITY_MOVE_LOOK, Server.ENTITY_LOOK, Server.ENTITY_TELEPORT, Server.ENTITY_HEAD_ROTATION, | ||||
|                 Server.ENTITY_METADATA, Server.ENTITY_EQUIPMENT, Server.ANIMATION, Server.BED, Server.ENTITY_EFFECT, | ||||
|                 Server.ENTITY_VELOCITY, Server.UPDATE_ATTRIBUTES, Server.ENTITY_STATUS); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void onPacketSending(final PacketEvent event) { | ||||
|         if (event.isCancelled()) | ||||
|             return; | ||||
| 
 | ||||
|         try { | ||||
|             final Player observer = event.getPlayer(); | ||||
| 
 | ||||
|             if (observer.getName().contains("UNKNOWN[")) {// If the player is temporary | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             PacketContainer packet = event.getPacket(); | ||||
| 
 | ||||
|             // If packet isn't meant for the disguised player's self disguise | ||||
|             if (packet.getIntegers().read(0) != observer.getEntityId()) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (!DisguiseAPI.isSelfDisguised(observer)) { | ||||
|                 if (event.getPacketType() == PacketType.Play.Server.ENTITY_METADATA) { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(observer, observer); | ||||
| 
 | ||||
|                     if (disguise != null && disguise.isSelfDisguiseVisible()) { | ||||
|                         event.setCancelled(true); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             final Disguise disguise = DisguiseAPI.getDisguise(observer, observer); | ||||
| 
 | ||||
|             if (disguise == null) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. | ||||
|             LibsPackets transformed = PacketsManager.transformPacket(packet, disguise, observer, observer); | ||||
| 
 | ||||
|             if (transformed.isUnhandled()) { | ||||
|                 transformed.getPackets().add(packet); | ||||
|             } | ||||
| 
 | ||||
|             transformed.setSpawnPacketCheck(event.getPacketType()); | ||||
| 
 | ||||
|             for (PacketContainer newPacket : transformed.getPackets()) { | ||||
|                 if (newPacket.getType() != Server.PLAYER_INFO) { | ||||
|                     if (newPacket.equals(packet)) { | ||||
|                         newPacket = newPacket.shallowClone(); | ||||
|                     } | ||||
| 
 | ||||
|                     newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|                 } | ||||
| 
 | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, newPacket, false); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             for (ArrayList<PacketContainer> packets : transformed.getDelayedPackets()) { | ||||
|                 for (PacketContainer newPacket : packets) { | ||||
|                     if (newPacket.getType() == Server.PLAYER_INFO) { | ||||
|                         continue; | ||||
|                     } | ||||
| 
 | ||||
|                     if (newPacket.equals(packet)) { | ||||
|                         newPacket = newPacket.shallowClone(); | ||||
|                     } | ||||
| 
 | ||||
|                     newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             transformed.sendDelayed(observer); | ||||
| 
 | ||||
|             if (event.getPacketType() == Server.ENTITY_METADATA) { | ||||
|                 event.setPacket(packet.deepClone()); | ||||
| 
 | ||||
|                 for (WrappedWatchableObject watch : packet.getWatchableCollectionModifier().read(0)) { | ||||
|                     if (watch.getIndex() == 0) { | ||||
|                         byte b = (byte) watch.getValue(); | ||||
| 
 | ||||
|                         byte a = (byte) (b | 1 << 5); | ||||
| 
 | ||||
|                         if ((b & 1 << 3) != 0) | ||||
|                             a = (byte) (a | 1 << 3); | ||||
| 
 | ||||
|                         watch.setValue(a); | ||||
|                     } | ||||
|                 } | ||||
|             } else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) { | ||||
|                 event.setCancelled(true); | ||||
| 
 | ||||
|                 PacketContainer metaPacket = new PacketContainer(Server.ENTITY_METADATA); | ||||
| 
 | ||||
|                 StructureModifier<Object> mods = metaPacket.getModifier(); | ||||
| 
 | ||||
|                 mods.write(0, observer.getEntityId()); | ||||
| 
 | ||||
|                 List<WrappedWatchableObject> watchableList = new ArrayList<>(); | ||||
|                 byte b = 1 << 5; | ||||
| 
 | ||||
|                 if (observer.isSprinting()) | ||||
|                     b = (byte) (b | 1 << 3); | ||||
| 
 | ||||
|                 WrappedWatchableObject watch = ReflectionManager.createWatchable(0, b); | ||||
| 
 | ||||
|                 if (watch != null) | ||||
|                     watchableList.add(watch); | ||||
| 
 | ||||
|                 metaPacket.getWatchableCollectionModifier().write(0, watchableList); | ||||
| 
 | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, metaPacket); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } else if (event.getPacketType() == Server.ANIMATION) { | ||||
|                 if (packet.getIntegers().read(1) != 2) { | ||||
|                     event.setCancelled(true); | ||||
|                 } | ||||
|             } else if (event.getPacketType() == Server.ATTACH_ENTITY || | ||||
|                     event.getPacketType() == Server.REL_ENTITY_MOVE || | ||||
|                     event.getPacketType() == Server.REL_ENTITY_MOVE_LOOK || | ||||
|                     event.getPacketType() == Server.ENTITY_LOOK || event.getPacketType() == Server.ENTITY_TELEPORT || | ||||
|                     event.getPacketType() == Server.ENTITY_HEAD_ROTATION || | ||||
|                     event.getPacketType() == Server.ENTITY_EQUIPMENT) { | ||||
|                 event.setCancelled(true); | ||||
|             } else if (event.getPacketType() == Server.ENTITY_STATUS) { | ||||
|                 if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer() && | ||||
|                         packet.getBytes().read(0) == 2) { | ||||
|                     event.setCancelled(true); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             event.setCancelled(true); | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user