Push player skin fix may need good testing
This commit is contained in:
		| @@ -20,6 +20,7 @@ import me.libraryaddict.disguise.utilities.DisguiseUtilities; | |||||||
| import me.libraryaddict.disguise.utilities.LibsPremium; | import me.libraryaddict.disguise.utilities.LibsPremium; | ||||||
| import me.libraryaddict.disguise.utilities.listeners.DisguiseListener; | import me.libraryaddict.disguise.utilities.listeners.DisguiseListener; | ||||||
| import me.libraryaddict.disguise.utilities.listeners.PaperDisguiseListener; | import me.libraryaddict.disguise.utilities.listeners.PaperDisguiseListener; | ||||||
|  | import me.libraryaddict.disguise.utilities.listeners.PlayerSkinHandler; | ||||||
| import me.libraryaddict.disguise.utilities.metrics.MetricsInitalizer; | import me.libraryaddict.disguise.utilities.metrics.MetricsInitalizer; | ||||||
| import me.libraryaddict.disguise.utilities.packets.PacketsManager; | import me.libraryaddict.disguise.utilities.packets.PacketsManager; | ||||||
| import me.libraryaddict.disguise.utilities.parser.DisguiseParser; | import me.libraryaddict.disguise.utilities.parser.DisguiseParser; | ||||||
| @@ -50,6 +51,8 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|     private boolean reloaded; |     private boolean reloaded; | ||||||
|     @Getter |     @Getter | ||||||
|     private final UpdateChecker updateChecker = new UpdateChecker(); |     private final UpdateChecker updateChecker = new UpdateChecker(); | ||||||
|  |     @Getter | ||||||
|  |     private final PlayerSkinHandler skinHandler = new PlayerSkinHandler(); | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onLoad() { |     public void onLoad() { | ||||||
| @@ -139,10 +142,8 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|                     getLogger().severe("!! May I have your attention please !!"); |                     getLogger().severe("!! May I have your attention please !!"); | ||||||
|                     getLogger().severe("Update your ProtocolLib! You are running " + version + |                     getLogger().severe("Update your ProtocolLib! You are running " + version + | ||||||
|                             " but the minimum version you should be on is " + requiredProtocolLib + "!"); |                             " but the minimum version you should be on is " + requiredProtocolLib + "!"); | ||||||
|                     getLogger() |                     getLogger().severe("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/target" + | ||||||
|                             .severe("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/target" + |                             "/ProtocolLib" + ".jar"); | ||||||
|                                     "/ProtocolLib" + |  | ||||||
|                                     ".jar"); |  | ||||||
|                     getLogger().severe("Or! Use /ld updateprotocollib - To update to the latest development build"); |                     getLogger().severe("Or! Use /ld updateprotocollib - To update to the latest development build"); | ||||||
|                     getLogger() |                     getLogger() | ||||||
|                             .severe("This message is on repeat due to the sheer number of people who don't see this."); |                             .severe("This message is on repeat due to the sheer number of people who don't see this."); | ||||||
| @@ -178,6 +179,8 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|  |  | ||||||
|         listener = new DisguiseListener(this); |         listener = new DisguiseListener(this); | ||||||
|  |  | ||||||
|  |         Bukkit.getPluginManager().registerEvents(getSkinHandler(), LibsDisguises.getInstance()); | ||||||
|  |  | ||||||
|         if (DisguiseUtilities.isRunningPaper()) { |         if (DisguiseUtilities.isRunningPaper()) { | ||||||
|             Bukkit.getPluginManager().registerEvents(new PaperDisguiseListener(), this); |             Bukkit.getPluginManager().registerEvents(new PaperDisguiseListener(), this); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -242,7 +242,8 @@ public class DisguiseUtilities { | |||||||
|  |  | ||||||
|         Team team = Bukkit.getScoreboardManager().getMainScoreboard().getEntryTeam(playerName); |         Team team = Bukkit.getScoreboardManager().getMainScoreboard().getEntryTeam(playerName); | ||||||
|  |  | ||||||
|         if (team != null && (team.getColor() != ChatColor.RESET || !StringUtils.isEmpty(team.getPrefix()) || !StringUtils.isEmpty(team.getSuffix()))) { |         if (team != null && (team.getColor() != ChatColor.RESET || !StringUtils.isEmpty(team.getPrefix()) || | ||||||
|  |                 !StringUtils.isEmpty(team.getSuffix()))) { | ||||||
|             return team.getPrefix() + team.getColor() + playerName + team.getSuffix(); |             return team.getPrefix() + team.getColor() + playerName + team.getSuffix(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -254,7 +255,8 @@ public class DisguiseUtilities { | |||||||
|  |  | ||||||
|         team = Bukkit.getScoreboardManager().getMainScoreboard().getEntryTeam(player.getUniqueId().toString()); |         team = Bukkit.getScoreboardManager().getMainScoreboard().getEntryTeam(player.getUniqueId().toString()); | ||||||
|  |  | ||||||
|         if (team == null || (team.getColor() != ChatColor.RESET || StringUtils.isEmpty(team.getPrefix()) && StringUtils.isEmpty(team.getSuffix()))) { |         if (team == null || (team.getColor() != ChatColor.RESET || | ||||||
|  |                 StringUtils.isEmpty(team.getPrefix()) && StringUtils.isEmpty(team.getSuffix()))) { | ||||||
|             String name = player.getDisplayName(); |             String name = player.getDisplayName(); | ||||||
|  |  | ||||||
|             if (name.equals(playerName)) { |             if (name.equals(playerName)) { | ||||||
| @@ -2568,13 +2570,35 @@ public class DisguiseUtilities { | |||||||
|                 transformed.addPacket(packet); |                 transformed.addPacket(packet); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             LibsPackets newPackets = new LibsPackets(disguise); | ||||||
|  |  | ||||||
|             for (PacketContainer p : transformed.getPackets()) { |             for (PacketContainer p : transformed.getPackets()) { | ||||||
|                 p = p.deepClone(); |  | ||||||
|                 p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); |                 p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|  |  | ||||||
|  |                 newPackets.addPacket(p); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : transformed.getDelayedPacketsMap().entrySet()) { | ||||||
|  |                 for (PacketContainer newPacket : entry.getValue()) { | ||||||
|  |                     if (newPacket.getType() != Server.PLAYER_INFO && newPacket.getType() != Server.ENTITY_DESTROY && | ||||||
|  |                             newPacket.getIntegers().read(0) == player.getEntityId()) { | ||||||
|  |                         newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     newPackets.addDelayedPacket(newPacket, entry.getKey()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (disguise.isPlayerDisguise()) { | ||||||
|  |                 LibsDisguises.getInstance().getSkinHandler() | ||||||
|  |                         .handlePackets(player, (PlayerDisguise) disguise, newPackets); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             for (PacketContainer p : newPackets.getPackets()) { | ||||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); |                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             transformed.sendDelayed(player); |             newPackets.sendDelayed(player); | ||||||
|         } catch (InvocationTargetException e) { |         } catch (InvocationTargetException e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| package me.libraryaddict.disguise.utilities.listeners; | package me.libraryaddict.disguise.utilities.listeners; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.PacketType; | ||||||
|  | import com.comphenix.protocol.PacketType.Play.Server; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| import com.comphenix.protocol.events.PacketContainer; | import com.comphenix.protocol.events.PacketContainer; | ||||||
| import com.comphenix.protocol.wrappers.EnumWrappers; | import com.comphenix.protocol.wrappers.EnumWrappers; | ||||||
| @@ -8,20 +10,26 @@ import com.google.common.cache.CacheBuilder; | |||||||
| import com.google.common.cache.RemovalCause; | import com.google.common.cache.RemovalCause; | ||||||
| import lombok.Getter; | import lombok.Getter; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
|  | import lombok.Setter; | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
|  | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import me.libraryaddict.disguise.events.UndisguiseEvent; | import me.libraryaddict.disguise.events.UndisguiseEvent; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  | import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| import org.bukkit.event.EventHandler; | import org.bukkit.event.EventHandler; | ||||||
| import org.bukkit.event.EventPriority; | import org.bukkit.event.EventPriority; | ||||||
| import org.bukkit.event.Listener; | import org.bukkit.event.Listener; | ||||||
| import org.bukkit.event.player.PlayerMoveEvent; | import org.bukkit.event.player.PlayerMoveEvent; | ||||||
|  | import org.bukkit.scheduler.BukkitRunnable; | ||||||
|  |  | ||||||
| import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -29,13 +37,22 @@ import java.util.concurrent.TimeUnit; | |||||||
|  */ |  */ | ||||||
| public class PlayerSkinHandler implements Listener { | public class PlayerSkinHandler implements Listener { | ||||||
|     @RequiredArgsConstructor |     @RequiredArgsConstructor | ||||||
|     private static class PlayerSkin { |     public static class PlayerSkin { | ||||||
|         private final long firstPacketSent = System.currentTimeMillis(); |         private final long firstPacketSent = System.currentTimeMillis(); | ||||||
|         @Getter |         @Getter | ||||||
|         private final WeakReference<PlayerDisguise> disguise; |         private final WeakReference<PlayerDisguise> disguise; | ||||||
|  |         @Getter | ||||||
|  |         private final HashMap<Integer, ArrayList<PacketContainer>> sleptPackets = new HashMap<>(); | ||||||
|  |         @Getter | ||||||
|  |         @Setter | ||||||
|  |         private boolean doTabList = true; | ||||||
|  |         @Getter | ||||||
|  |         @Setter | ||||||
|  |         private boolean sleepPackets; | ||||||
|  |  | ||||||
|         public boolean canRemove() { |         public boolean canRemove(boolean onMoved) { | ||||||
|             return firstPacketSent + (DisguiseConfig.getTablistRemoveDelay() * 50) < System.currentTimeMillis(); |             return firstPacketSent + (DisguiseConfig.getTablistRemoveDelay() * 50) + | ||||||
|  |                     (onMoved ? 0 : TimeUnit.SECONDS.toMillis(5)) < System.currentTimeMillis(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
| @@ -61,20 +78,14 @@ public class PlayerSkinHandler implements Listener { | |||||||
|                 List<PlayerSkin> skins = (List<PlayerSkin>) event.getValue(); |                 List<PlayerSkin> skins = (List<PlayerSkin>) event.getValue(); | ||||||
|  |  | ||||||
|                 for (PlayerSkin skin : skins) { |                 for (PlayerSkin skin : skins) { | ||||||
|                     PlayerDisguise disguise = skin.disguise.get(); |                     doPacketRemoval((Player) event.getKey(), skin); | ||||||
|  |  | ||||||
|                     if (disguise == null) { |  | ||||||
|                         return; |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     doPacketRemoval((Player) event.getKey(), disguise); |  | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 skins.clear(); |                 skins.clear(); | ||||||
|             }).build(); |             }).build(); | ||||||
|  |  | ||||||
|     public void addPlayerSkin(Player player, PlayerDisguise disguise) { |     public PlayerSkin addPlayerSkin(Player player, PlayerDisguise disguise) { | ||||||
|         tryProcess(player); |         tryProcess(player, false); | ||||||
|  |  | ||||||
|         List<PlayerSkin> skins = getCache().getIfPresent(player); |         List<PlayerSkin> skins = getCache().getIfPresent(player); | ||||||
|  |  | ||||||
| @@ -82,8 +93,49 @@ public class PlayerSkinHandler implements Listener { | |||||||
|             skins = new ArrayList<>(); |             skins = new ArrayList<>(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         skins.add(new PlayerSkin(new WeakReference<>(disguise))); |         PlayerSkin toReturn = new PlayerSkin(new WeakReference<>(disguise)); | ||||||
|  |  | ||||||
|  |         skins.add(toReturn); | ||||||
|         getCache().put(player, skins); |         getCache().put(player, skins); | ||||||
|  |  | ||||||
|  |         return toReturn; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void handlePackets(Player player, PlayerDisguise disguise, LibsPackets packets) { | ||||||
|  |         List<PlayerSkin> skins = getCache().getIfPresent(player); | ||||||
|  |  | ||||||
|  |         if (skins == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         PlayerSkin skin = skins.stream().filter(s -> s.getDisguise().get() == disguise).findAny().orElse(null); | ||||||
|  |  | ||||||
|  |         if (skin == null || !skin.isSleepPackets()) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         packets.getPackets().removeIf(packet -> isRemove(skin, packet)); | ||||||
|  |  | ||||||
|  |         packets.getDelayedPacketsMap().entrySet().removeIf(entry -> { | ||||||
|  |             entry.getValue().removeIf(packet -> isRemove(skin, packet)); | ||||||
|  |  | ||||||
|  |             return entry.getValue().isEmpty(); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private boolean isRemove(PlayerSkin skin, PacketContainer packetContainer) { | ||||||
|  |         PacketType type = packetContainer.getType(); | ||||||
|  |  | ||||||
|  |         if (type != Server.ENTITY_EQUIPMENT && type != Server.ENTITY_METADATA) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Only do equip atm | ||||||
|  |         if (type == Server.ENTITY_EQUIPMENT) { | ||||||
|  |             skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()).add(packetContainer); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @EventHandler(priority = EventPriority.MONITOR, |     @EventHandler(priority = EventPriority.MONITOR, | ||||||
| @@ -108,7 +160,7 @@ public class PlayerSkinHandler implements Listener { | |||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             doPacketRemoval(player, disguise); |             doPacketRemoval(player, skin); | ||||||
|  |  | ||||||
|             if (skins.size() == 1) { |             if (skins.size() == 1) { | ||||||
|                 getCache().invalidate(player); |                 getCache().invalidate(player); | ||||||
| @@ -118,40 +170,69 @@ public class PlayerSkinHandler implements Listener { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void doPacketRemoval(Player player, PlayerDisguise disguise) { |     private void doPacketRemoval(Player player, PlayerSkin skin) { | ||||||
|  |         PlayerDisguise disguise = skin.getDisguise().get(); | ||||||
|  |  | ||||||
|         if (disguise == null) { |         if (disguise == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         PacketContainer packetContainer = |  | ||||||
|                 DisguiseUtilities.getTabPacket(disguise, EnumWrappers.PlayerInfoAction.REMOVE_PLAYER); |  | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
|             ProtocolLibrary.getProtocolManager().sendServerPacket(player, packetContainer); |             for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : skin.getSleptPackets().entrySet()) { | ||||||
|  |                 if (entry.getKey() == 0) { | ||||||
|  |                     for (PacketContainer packet : entry.getValue()) { | ||||||
|  |                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     new BukkitRunnable() { | ||||||
|  |                         @Override | ||||||
|  |                         public void run() { | ||||||
|  |                             try { | ||||||
|  |                                 if (!disguise.isDisguiseInUse()) { | ||||||
|  |                                     return; | ||||||
|  |                                 } | ||||||
|  |  | ||||||
|  |                                 for (PacketContainer packet : entry.getValue()) { | ||||||
|  |                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||||
|  |                                 } | ||||||
|  |                             } catch (InvocationTargetException e) { | ||||||
|  |                                 e.printStackTrace(); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     }.runTaskLater(LibsDisguises.getInstance(), entry.getKey()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (skin.isDoTabList()) { | ||||||
|  |                 PacketContainer packetContainer = | ||||||
|  |                         DisguiseUtilities.getTabPacket(disguise, EnumWrappers.PlayerInfoAction.REMOVE_PLAYER); | ||||||
|  |  | ||||||
|  |                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packetContainer); | ||||||
|  |             } | ||||||
|         } catch (InvocationTargetException e) { |         } catch (InvocationTargetException e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void tryProcess(Player player) { |     private void tryProcess(Player player, boolean onMove) { | ||||||
|         List<PlayerSkin> skins = getCache().getIfPresent(player); |         List<PlayerSkin> skins = getCache().getIfPresent(player); | ||||||
|  |  | ||||||
|         if (skins == null) { |         if (skins == null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ArrayList<PlayerDisguise> removed = new ArrayList<>(); |         ArrayList<PlayerSkin> removed = new ArrayList<>(); | ||||||
|  |  | ||||||
|         skins.removeIf(skin -> { |         skins.removeIf(skin -> { | ||||||
|             if (!skin.canRemove()) { |             if (!skin.canRemove(onMove)) { | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             removed.add(skin.getDisguise().get()); |             removed.add(skin); | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         removed.forEach(disguise -> doPacketRemoval(player, disguise)); |         removed.forEach(skin -> doPacketRemoval(player, skin)); | ||||||
|  |  | ||||||
|         if (!skins.isEmpty()) { |         if (!skins.isEmpty()) { | ||||||
|             return; |             return; | ||||||
| @@ -162,6 +243,6 @@ public class PlayerSkinHandler implements Listener { | |||||||
|  |  | ||||||
|     @EventHandler |     @EventHandler | ||||||
|     public void onMove(PlayerMoveEvent event) { |     public void onMove(PlayerMoveEvent event) { | ||||||
|         tryProcess(event.getPlayer()); |         tryProcess(event.getPlayer(), true); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,6 +5,9 @@ import com.comphenix.protocol.ProtocolLibrary; | |||||||
| import com.comphenix.protocol.events.PacketContainer; | import com.comphenix.protocol.events.PacketContainer; | ||||||
| import com.comphenix.protocol.reflect.StructureModifier; | import com.comphenix.protocol.reflect.StructureModifier; | ||||||
| import com.mojang.datafixers.util.Pair; | import com.mojang.datafixers.util.Pair; | ||||||
|  | import lombok.Getter; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import lombok.Setter; | ||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||||
| @@ -21,23 +24,14 @@ import java.util.*; | |||||||
| /** | /** | ||||||
|  * Created by libraryaddict on 3/01/2019. |  * Created by libraryaddict on 3/01/2019. | ||||||
|  */ |  */ | ||||||
|  | @Getter | ||||||
|  | @RequiredArgsConstructor | ||||||
| public class LibsPackets { | public class LibsPackets { | ||||||
|     private ArrayList<PacketContainer> packets = new ArrayList<>(); |     private final ArrayList<PacketContainer> packets = new ArrayList<>(); | ||||||
|     private HashMap<Integer, ArrayList<PacketContainer>> delayedPackets = new HashMap<>(); |     private final HashMap<Integer, ArrayList<PacketContainer>> delayedPacketsMap = new HashMap<>(); | ||||||
|     private Disguise disguise; |     private final Disguise disguise; | ||||||
|     private boolean doNothing; |     @Setter | ||||||
|  |     private boolean unhandled; | ||||||
|     public LibsPackets(Disguise disguise) { |  | ||||||
|         this.disguise = disguise; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void setUnhandled() { |  | ||||||
|         doNothing = true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public boolean isUnhandled() { |  | ||||||
|         return doNothing; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Disguise getDisguise() { |     public Disguise getDisguise() { | ||||||
|         return disguise; |         return disguise; | ||||||
| @@ -56,24 +50,21 @@ public class LibsPackets { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void addDelayedPacket(PacketContainer packet, int ticksDelayed) { |     public void addDelayedPacket(PacketContainer packet, int ticksDelayed) { | ||||||
|         if (!delayedPackets.containsKey(ticksDelayed)) |         if (!delayedPacketsMap.containsKey(ticksDelayed)) { | ||||||
|             delayedPackets.put(ticksDelayed, new ArrayList<>()); |             delayedPacketsMap.put(ticksDelayed, new ArrayList<>()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         delayedPackets.get(ticksDelayed).add(packet); |         delayedPacketsMap.get(ticksDelayed).add(packet); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ArrayList<PacketContainer> getPackets() { |     public ArrayList<PacketContainer> getPackets() { | ||||||
|         return packets; |         return packets; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Collection<ArrayList<PacketContainer>> getDelayedPackets() { |  | ||||||
|         return delayedPackets.values(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void sendDelayed(final Player observer) { |     public void sendDelayed(final Player observer) { | ||||||
|         for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : delayedPackets.entrySet()) { |         for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : getDelayedPacketsMap().entrySet()) { | ||||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), () -> { |             Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), () -> { | ||||||
|                 if (!disguise.isDisguiseInUse()) { |                 if (!getDisguise().isDisguiseInUse()) { | ||||||
|                     ArrayList<PacketContainer> packets = entry.getValue(); |                     ArrayList<PacketContainer> packets = entry.getValue(); | ||||||
|  |  | ||||||
|                     if (packets.stream().noneMatch(p -> p.getType() == PacketType.Play.Server.PLAYER_INFO)) { |                     if (packets.stream().noneMatch(p -> p.getType() == PacketType.Play.Server.PLAYER_INFO)) { | ||||||
| @@ -87,8 +78,7 @@ public class LibsPackets { | |||||||
|                     for (PacketContainer packet : entry.getValue()) { |                     for (PacketContainer packet : entry.getValue()) { | ||||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); |                         ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||||
|                     } |                     } | ||||||
|                 } |                 } catch (InvocationTargetException e) { | ||||||
|                 catch (InvocationTargetException e) { |  | ||||||
|                     e.printStackTrace(); |                     e.printStackTrace(); | ||||||
|                 } |                 } | ||||||
|             }, entry.getKey()); |             }, entry.getKey()); | ||||||
| @@ -97,11 +87,11 @@ public class LibsPackets { | |||||||
|  |  | ||||||
|     private PacketContainer createPacket(EquipmentSlot slot) { |     private PacketContainer createPacket(EquipmentSlot slot) { | ||||||
|         // Get what the disguise wants to show for its armor |         // Get what the disguise wants to show for its armor | ||||||
|         ItemStack itemToSend = disguise.getWatcher().getItemStack(slot); |         ItemStack itemToSend = getDisguise().getWatcher().getItemStack(slot); | ||||||
|  |  | ||||||
|         // If the disguise armor isn't visible |         // If the disguise armor isn't visible | ||||||
|         if (itemToSend == null) { |         if (itemToSend == null) { | ||||||
|             itemToSend = ReflectionManager.getEquipment(slot, disguise.getEntity()); |             itemToSend = ReflectionManager.getEquipment(slot, getDisguise().getEntity()); | ||||||
|  |  | ||||||
|             // If natural armor isn't sent either |             // If natural armor isn't sent either | ||||||
|             if (itemToSend == null || itemToSend.getType() == Material.AIR) { |             if (itemToSend == null || itemToSend.getType() == Material.AIR) { | ||||||
| @@ -115,7 +105,7 @@ public class LibsPackets { | |||||||
|  |  | ||||||
|         StructureModifier<Object> mods = packet.getModifier(); |         StructureModifier<Object> mods = packet.getModifier(); | ||||||
|  |  | ||||||
|         mods.write(0, disguise.getEntity().getEntityId()); |         mods.write(0, getDisguise().getEntity().getEntityId()); | ||||||
|  |  | ||||||
|         if (NmsVersion.v1_16.isSupported()) { |         if (NmsVersion.v1_16.isSupported()) { | ||||||
|             List<Pair<Object, Object>> list = new ArrayList<>(); |             List<Pair<Object, Object>> list = new ArrayList<>(); | ||||||
|   | |||||||
| @@ -72,7 +72,7 @@ public class PacketsHandler { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             packets.setUnhandled(); |             packets.setUnhandled(true); | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -8,7 +8,6 @@ import com.comphenix.protocol.wrappers.WrappedAttribute; | |||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; | import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
| import com.mojang.datafixers.util.Pair; | import com.mojang.datafixers.util.Pair; | ||||||
| import lombok.Getter; |  | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.*; | import me.libraryaddict.disguise.disguisetypes.*; | ||||||
| @@ -24,7 +23,6 @@ import me.libraryaddict.disguise.utilities.packets.PacketsHandler; | |||||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||||
| import org.bukkit.Art; | import org.bukkit.Art; | ||||||
| import org.bukkit.Bukkit; |  | ||||||
| import org.bukkit.Location; | import org.bukkit.Location; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
| import org.bukkit.block.data.BlockData; | import org.bukkit.block.data.BlockData; | ||||||
| @@ -46,15 +44,9 @@ import java.util.UUID; | |||||||
|  */ |  */ | ||||||
| public class PacketHandlerSpawn implements IPacketHandler { | public class PacketHandlerSpawn implements IPacketHandler { | ||||||
|     private PacketsHandler packetsHandler; |     private PacketsHandler packetsHandler; | ||||||
|     @Getter |  | ||||||
|     private PlayerSkinHandler skinHandler; |  | ||||||
|  |  | ||||||
|     public PacketHandlerSpawn(PacketsHandler packetsHandler) { |     public PacketHandlerSpawn(PacketsHandler packetsHandler) { | ||||||
|         this.packetsHandler = packetsHandler; |         this.packetsHandler = packetsHandler; | ||||||
|  |  | ||||||
|         skinHandler = new PlayerSkinHandler(); |  | ||||||
|  |  | ||||||
|         Bukkit.getPluginManager().registerEvents(skinHandler, LibsDisguises.getInstance()); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -181,6 +173,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|                             playerDisguise.getGameProfile()); |                             playerDisguise.getGameProfile()); | ||||||
|  |  | ||||||
|             int entityId = disguisedEntity.getEntityId(); |             int entityId = disguisedEntity.getEntityId(); | ||||||
|  |             PlayerSkinHandler.PlayerSkin skin; | ||||||
|  |  | ||||||
|             if (!playerDisguise.isDisplayedInTab() || !playerDisguise.isNameVisible()) { |             if (!playerDisguise.isDisplayedInTab() || !playerDisguise.isNameVisible()) { | ||||||
|                 // Send player info along with the disguise |                 // Send player info along with the disguise | ||||||
| @@ -199,10 +192,16 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|                 PacketContainer deleteTab = sendTab.shallowClone(); |                 PacketContainer deleteTab = sendTab.shallowClone(); | ||||||
|                 deleteTab.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); |                 deleteTab.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); | ||||||
|  |  | ||||||
|                 if (LibsPremium.getPaidInformation() == null || |                 skin = LibsDisguises.getInstance().getSkinHandler().addPlayerSkin(observer, playerDisguise); | ||||||
|                         LibsPremium.getPaidInformation().getBuildNumber().matches("#[0-9]+")) { |  | ||||||
|                     getSkinHandler().addPlayerSkin(observer, playerDisguise); |                 if (LibsPremium.getPaidInformation() != null && | ||||||
|  |                         !LibsPremium.getPaidInformation().getBuildNumber().matches("#[0-9]+")) { | ||||||
|  |                     skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()) | ||||||
|  |                             .add(new PacketContainer(PacketType.Play.Server.HELD_ITEM_SLOT)); | ||||||
|                 } |                 } | ||||||
|  |             } else { | ||||||
|  |                 skin = LibsDisguises.getInstance().getSkinHandler().addPlayerSkin(observer, playerDisguise); | ||||||
|  |                 skin.setDoTabList(false); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Spawn the player |             // Spawn the player | ||||||
| @@ -211,9 +210,15 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|             spawnPlayer.getIntegers().write(0, entityId); // Id |             spawnPlayer.getIntegers().write(0, entityId); // Id | ||||||
|             spawnPlayer.getModifier().write(1, spawnProfile.getUUID()); |             spawnPlayer.getModifier().write(1, spawnProfile.getUUID()); | ||||||
|  |  | ||||||
|             Location spawnAt = disguisedEntity.getLocation(); |             boolean spawnFarAway = observer == disguisedEntity || | ||||||
|  |                     observer.getLocation().distanceSquared(disguisedEntity.getLocation()) > | ||||||
|  |                             observer.getLocation().add(observer.getLocation().getDirection()) | ||||||
|  |                                     .distanceSquared(disguisedEntity.getLocation()); | ||||||
|  |  | ||||||
|             boolean selfDisguise = observer == disguisedEntity; |             skin.setSleepPackets(!spawnFarAway); | ||||||
|  |  | ||||||
|  |             Location spawnAt = spawnFarAway ? disguisedEntity.getLocation() : | ||||||
|  |                     observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(50)); | ||||||
|  |  | ||||||
|             // Spawn him in front of the observer |             // Spawn him in front of the observer | ||||||
|             StructureModifier<Double> doubles = spawnPlayer.getDoubles(); |             StructureModifier<Double> doubles = spawnPlayer.getDoubles(); | ||||||
| @@ -227,18 +232,49 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|  |  | ||||||
|             packets.addPacket(spawnPlayer); |             packets.addPacket(spawnPlayer); | ||||||
|  |  | ||||||
|             WrappedDataWatcher newWatcher = DisguiseUtilities |             WrappedDataWatcher dataWatcher = DisguiseUtilities | ||||||
|                     .createSanitizedDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), |                     .createSanitizedDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), | ||||||
|                             disguise.getWatcher()); |                             disguise.getWatcher()); | ||||||
|  |  | ||||||
|  |             WrappedDataWatcher toSend = dataWatcher; | ||||||
|  |  | ||||||
|  |             if (!spawnFarAway) { | ||||||
|  |                 toSend = new WrappedDataWatcher(); | ||||||
|  |                 WrappedDataWatcher.WrappedDataWatcherObject obj = | ||||||
|  |                         ReflectionManager.createDataWatcherObject(MetaIndex.ENTITY_META, (byte) 32); | ||||||
|  |  | ||||||
|  |                 // Set invis | ||||||
|  |                 toSend.setObject(obj, (byte) 32); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (NmsVersion.v1_15.isSupported()) { |             if (NmsVersion.v1_15.isSupported()) { | ||||||
|                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() |                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() | ||||||
|                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, newWatcher, true) |                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, toSend, true) | ||||||
|                         .createPacket(entityId, newWatcher, true); |                         .createPacket(entityId, toSend, true); | ||||||
|  |  | ||||||
|                 packets.addPacket(metaPacket); |                 packets.addPacket(metaPacket); | ||||||
|             } else { |             } else { | ||||||
|                 spawnPlayer.getDataWatcherModifier().write(0, newWatcher); |                 spawnPlayer.getDataWatcherModifier().write(0, toSend); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (!spawnFarAway) { | ||||||
|  |                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() | ||||||
|  |                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, dataWatcher, true) | ||||||
|  |                         .createPacket(entityId, dataWatcher, true); | ||||||
|  |  | ||||||
|  |                 PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); | ||||||
|  |  | ||||||
|  |                 StructureModifier<Object> mods = teleport.getModifier(); | ||||||
|  |  | ||||||
|  |                 mods.write(0, disguisedEntity.getEntityId()); | ||||||
|  |                 mods.write(1, loc.getX()); | ||||||
|  |                 mods.write(2, loc.getY()); | ||||||
|  |                 mods.write(3, loc.getZ()); | ||||||
|  |                 mods.write(4, yaw); | ||||||
|  |                 mods.write(5, pitch); | ||||||
|  |  | ||||||
|  |                 skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()).add(teleport); | ||||||
|  |                 skin.getSleptPackets().computeIfAbsent(2, (a) -> new ArrayList<>()).add(metaPacket); | ||||||
|             } |             } | ||||||
|         } else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) { |         } else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) { | ||||||
|             Vector vec = disguisedEntity.getVelocity(); |             Vector vec = disguisedEntity.getVelocity(); | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import com.comphenix.protocol.events.PacketContainer; | |||||||
| import com.comphenix.protocol.events.PacketEvent; | import com.comphenix.protocol.events.PacketEvent; | ||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.packets.LibsPackets; | import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||||
| import me.libraryaddict.disguise.utilities.packets.PacketsManager; | import me.libraryaddict.disguise.utilities.packets.PacketsManager; | ||||||
| @@ -50,6 +51,11 @@ public class PacketListenerMain extends PacketAdapter { | |||||||
|         try { |         try { | ||||||
|             packets = PacketsManager.getPacketsHandler() |             packets = PacketsManager.getPacketsHandler() | ||||||
|                     .transformPacket(event.getPacket(), disguise, observer, disguise.getEntity()); |                     .transformPacket(event.getPacket(), disguise, observer, disguise.getEntity()); | ||||||
|  |  | ||||||
|  |             if (disguise.isPlayerDisguise()) { | ||||||
|  |                 LibsDisguises.getInstance().getSkinHandler() | ||||||
|  |                         .handlePackets(observer, (PlayerDisguise) disguise, packets); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         catch (Throwable ex) { |         catch (Throwable ex) { | ||||||
|             ex.printStackTrace(); |             ex.printStackTrace(); | ||||||
|   | |||||||
| @@ -13,16 +13,19 @@ import me.libraryaddict.disguise.DisguiseAPI; | |||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.LibsPremium; | import me.libraryaddict.disguise.utilities.LibsPremium; | ||||||
| import me.libraryaddict.disguise.utilities.packets.LibsPackets; | import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||||
| import me.libraryaddict.disguise.utilities.packets.PacketsManager; | import me.libraryaddict.disguise.utilities.packets.PacketsManager; | ||||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||||
|  | import org.bukkit.Bukkit; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
| public class PacketListenerViewSelfDisguise extends PacketAdapter { | public class PacketListenerViewSelfDisguise extends PacketAdapter { | ||||||
|     public PacketListenerViewSelfDisguise(LibsDisguises plugin) { |     public PacketListenerViewSelfDisguise(LibsDisguises plugin) { | ||||||
| @@ -53,14 +56,6 @@ public class PacketListenerViewSelfDisguise extends PacketAdapter { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (!DisguiseAPI.isSelfDisguised(observer)) { |             if (!DisguiseAPI.isSelfDisguised(observer)) { | ||||||
|                 if (event.getPacketType() == PacketType.Play.Server.ENTITY_METADATA) { |  | ||||||
|                     Disguise disguise = DisguiseAPI.getDisguise(observer, observer); |  | ||||||
|  |  | ||||||
|                     if (disguise != null && DisguiseUtilities.getSelfDisguised().contains(observer.getUniqueId())) { |  | ||||||
|                         event.setCancelled(true); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -78,38 +73,45 @@ public class PacketListenerViewSelfDisguise extends PacketAdapter { | |||||||
|                 transformed.addPacket(packet); |                 transformed.addPacket(packet); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             LibsPackets selfTransformed = new LibsPackets(disguise); | ||||||
|  |  | ||||||
|             for (PacketContainer newPacket : transformed.getPackets()) { |             for (PacketContainer newPacket : transformed.getPackets()) { | ||||||
|                 if (newPacket.getType() != Server.PLAYER_INFO && newPacket.getType() != Server.ENTITY_DESTROY && |                 if (newPacket.getType() != Server.PLAYER_INFO && newPacket.getType() != Server.ENTITY_DESTROY && | ||||||
|                         newPacket.getIntegers().read(0) == observer.getEntityId()) { |                         newPacket.getIntegers().read(0) == observer.getEntityId()) { | ||||||
|  |                     newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 selfTransformed.addPacket(newPacket); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : transformed.getDelayedPacketsMap().entrySet()) { | ||||||
|  |                 for (PacketContainer newPacket : entry.getValue()) { | ||||||
|                     if (newPacket == packet) { |                     if (newPacket == packet) { | ||||||
|                         newPacket = newPacket.shallowClone(); |                         newPacket = newPacket.shallowClone(); | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); |                     if (newPacket.getType() != Server.PLAYER_INFO && newPacket.getType() != Server.ENTITY_DESTROY) { | ||||||
|                 } |                         newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|                 try { |                     selfTransformed.addDelayedPacket(newPacket, entry.getKey()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (disguise.isPlayerDisguise()) { | ||||||
|  |                 LibsDisguises.getInstance().getSkinHandler() | ||||||
|  |                         .handlePackets(observer, (PlayerDisguise) disguise, selfTransformed); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             try { | ||||||
|  |                 for (PacketContainer newPacket : selfTransformed.getPackets()) { | ||||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, newPacket, false); |                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, newPacket, false); | ||||||
|                 } catch (InvocationTargetException e) { |  | ||||||
|                     e.printStackTrace(); |  | ||||||
|                 } |                 } | ||||||
|  |             } catch (InvocationTargetException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             for (ArrayList<PacketContainer> packets : transformed.getDelayedPackets()) { |             selfTransformed.sendDelayed(observer); | ||||||
|                 for (PacketContainer newPacket : packets) { |  | ||||||
|                     if (newPacket.getType() == Server.PLAYER_INFO || newPacket.getType() == Server.ENTITY_DESTROY) { |  | ||||||
|                         continue; |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     if (newPacket.equals(packet)) { |  | ||||||
|                         newPacket = newPacket.shallowClone(); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     newPacket.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             transformed.sendDelayed(observer); |  | ||||||
|  |  | ||||||
|             if (event.getPacketType() == Server.ENTITY_METADATA) { |             if (event.getPacketType() == Server.ENTITY_METADATA) { | ||||||
|                 if (!LibsPremium.getPluginInformation().isPremium() || LibsPremium.getPaidInformation() != null || |                 if (!LibsPremium.getPluginInformation().isPremium() || LibsPremium.getPaidInformation() != null || | ||||||
| @@ -118,14 +120,16 @@ public class PacketListenerViewSelfDisguise extends PacketAdapter { | |||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 for (WrappedWatchableObject watch : packet.getWatchableCollectionModifier().read(0)) { |                 for (WrappedWatchableObject watch : packet.getWatchableCollectionModifier().read(0)) { | ||||||
|                     if (watch.getIndex() == 0) { |                     if (watch.getIndex() != 0) { | ||||||
|                         byte b = (byte) watch.getValue(); |                         continue; | ||||||
|  |  | ||||||
|                         // Add invisibility, remove glowing |  | ||||||
|                         byte a = (byte) ((b | 1 << 5) & ~(1 << 6)); |  | ||||||
|  |  | ||||||
|                         watch.setValue(a); |  | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|  |                     byte b = (byte) watch.getValue(); | ||||||
|  |  | ||||||
|  |                     // Add invisibility, remove glowing | ||||||
|  |                     byte a = (byte) ((b | 1 << 5) & ~(1 << 6)); | ||||||
|  |  | ||||||
|  |                     watch.setValue(a); | ||||||
|                 } |                 } | ||||||
|             } else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) { |             } else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) { | ||||||
|                 event.setCancelled(true); |                 event.setCancelled(true); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user