Added a slew of options to disable packets for performance gains
This commit is contained in:
		
							
								
								
									
										30
									
								
								config.yml
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								config.yml
									
									
									
									
									
								
							| @@ -61,6 +61,34 @@ BlownDisguiseMessage: '&cYour disguise was blown!' | ||||
| # These disguises, as normal will not persist after a server restart. | ||||
| # There is also no EntityDeath option as entities do not revive after death. | ||||
| KeepDisguises: | ||||
|   EntityDespawn: false | ||||
|   PlayerDeath: false | ||||
|   PlayerLogout: false | ||||
|   EntityDespawn: false | ||||
|  | ||||
| # This here is a option to turn off misc disguises. | ||||
| # This means you can not have a living entity disguise as a non-living entity. | ||||
| # This disables the Attributes packet, Non-living entities can still disguise as other non-living | ||||
| MiscDisguisesForLiving: true | ||||
|  | ||||
| # This will help performance, especially with CPU | ||||
| # Due to safety reasons, self disguises can never have their packets disabled. | ||||
| PacketsEnabled: | ||||
|   # This disables the animation packet. If a disguised entity sends a animation packet and they are using a non-living disguise. People will crash. | ||||
|   # Disabling this also means that if a player disguised as a non-player leaves a bug. People will crash | ||||
|   Animation: true | ||||
|   # Disabling this means that you can't use the setSleeping option on a player disguise. Also you will crash anyone watching when you try to sleep in a bed | ||||
|   Bed: true | ||||
|   # This disguises the collect packet. If a living entity disguised as a non-living entity picks up a item. People will crash. This fixes it | ||||
|   # This also fixes people crashing if a item disguised as a sleeping player is picked up - Only true if Bed is enabled as well | ||||
|   Collect: true | ||||
|   # This disables a fix for when a disguised entity wearing armor dies, if the disguise can wear armor. It drops unpickupable items to anyone watching. | ||||
|   EntityStatus: true | ||||
|   # Entity enquipment is the packets that are sent to ensure that a disguise has or doesn't have armor, and their held item. | ||||
|   # Disabling this means that any disguises which can wear armor or hold items will show the armor/held item that the disguised is wearing. | ||||
|   Enquipment: true | ||||
|   # Movement packets are the biggest cpu hit. These are majorly used to ensure that the disguises facing direction isn't bugged up | ||||
|   Movement: true | ||||
|   # Disable this if you don't mind crashing everytime you see someone riding something disguised as a non-living entity | ||||
|   Riding: true | ||||
|   # When disguised as a wither skull, it sends a look packet every tick so that the wither skull is facing the right way. | ||||
|   WitherSkull: true | ||||
|   | ||||
							
								
								
									
										3
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -3,6 +3,8 @@ | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<groupId>LibsDisguises</groupId> | ||||
| 	<artifactId>LibsDisguises</artifactId> | ||||
| 	<version>8.2.0-SNAPSHOT</version> | ||||
|  | ||||
| 	<build> | ||||
| 		<sourceDirectory>src</sourceDirectory> | ||||
| 		<defaultGoal>clean package</defaultGoal> | ||||
| @@ -84,7 +86,6 @@ | ||||
| 			<version>3.1.0</version> | ||||
| 		</dependency> | ||||
| 	</dependencies> | ||||
| 	<version>8.2.0-SNAPSHOT</version> | ||||
|  | ||||
| 	<distributionManagement> | ||||
| 		<repository> | ||||
|   | ||||
| @@ -3,34 +3,63 @@ package me.libraryaddict.disguise; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager; | ||||
|  | ||||
| public class DisguiseConfig { | ||||
|     private static boolean animationEnabled; | ||||
|     private static boolean bedEnabled; | ||||
|     private static boolean blowDisguisesOnAttack; | ||||
|     private static boolean collectEnabled; | ||||
|     private static String disguiseBlownMessage; | ||||
|     private static boolean enquipmentEnabled; | ||||
|     private static boolean entityAnimationsAdded; | ||||
|     private static boolean entityStatusEnabled; | ||||
|     private static boolean hearSelfDisguise; | ||||
|     private static boolean hidingArmor; | ||||
|     private static boolean hidingHeldItem; | ||||
|     private static boolean keepDisguiseEntityDespawn; | ||||
|     private static boolean keepDisguisePlayerDeath; | ||||
|     private static boolean keepDisguisePlayerLogout; | ||||
|     private static boolean miscDisguisesForLivingEnabled; | ||||
|     private static boolean modifyBoundingBox; | ||||
|     private static boolean movementEnabled; | ||||
|     private static boolean removeUnseenDisguises; | ||||
|     private static boolean ridingEnabled; | ||||
|     private static boolean sendVelocity; | ||||
|     private static boolean showNameAboveHead; | ||||
|     private static boolean showNameAboveHeadAlwaysVisible; | ||||
|     private static boolean targetDisguises; | ||||
|     private static boolean witherSkullEnabled; | ||||
|  | ||||
|     public static String getDisguiseBlownMessage() { | ||||
|         return disguiseBlownMessage; | ||||
|     } | ||||
|  | ||||
|     public static boolean isAnimationPacketsEnabled() { | ||||
|         return animationEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isBedPacketsEnabled() { | ||||
|         return bedEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isCollectPacketsEnabled() { | ||||
|         return collectEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isDisguiseBlownOnAttack() { | ||||
|         return blowDisguisesOnAttack; | ||||
|     } | ||||
|  | ||||
|     public static boolean isEnquipmentPacketsEnabled() { | ||||
|         return enquipmentEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isEntityAnimationsAdded() { | ||||
|         return entityAnimationsAdded; | ||||
|     } | ||||
|  | ||||
|     public static boolean isEntityStatusPacketsEnabled() { | ||||
|         return entityStatusEnabled; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is the plugin modifying the inventory packets so that players when self disguised, do not see their armor floating around | ||||
|      */ | ||||
| @@ -57,6 +86,10 @@ public class DisguiseConfig { | ||||
|         return keepDisguisePlayerLogout; | ||||
|     } | ||||
|  | ||||
|     public static boolean isMiscDisguisesForLivingEnabled() { | ||||
|         return miscDisguisesForLivingEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isModifyBoundingBox() { | ||||
|         return modifyBoundingBox; | ||||
|     } | ||||
| @@ -65,6 +98,10 @@ public class DisguiseConfig { | ||||
|         return targetDisguises; | ||||
|     } | ||||
|  | ||||
|     public static boolean isMovementPacketsEnabled() { | ||||
|         return movementEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isNameAboveHeadAlwaysVisible() { | ||||
|         return showNameAboveHeadAlwaysVisible; | ||||
|     } | ||||
| @@ -73,6 +110,10 @@ public class DisguiseConfig { | ||||
|         return showNameAboveHead; | ||||
|     } | ||||
|  | ||||
|     public static boolean isRidingPacketsEnabled() { | ||||
|         return ridingEnabled; | ||||
|     } | ||||
|  | ||||
|     public static boolean isSelfDisguisesSoundsReplaced() { | ||||
|         return hearSelfDisguise; | ||||
|     } | ||||
| @@ -102,10 +143,35 @@ public class DisguiseConfig { | ||||
|         return PacketsManager.isViewDisguisesListenerEnabled(); | ||||
|     } | ||||
|  | ||||
|     public static boolean isWitherSkullPacketsEnabled() { | ||||
|         return witherSkullEnabled; | ||||
|     } | ||||
|  | ||||
|     public static void setAddEntityAnimations(boolean isEntityAnimationsAdded) { | ||||
|         entityAnimationsAdded = isEntityAnimationsAdded; | ||||
|     } | ||||
|  | ||||
|     public static void setAnimationPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isAnimationPacketsEnabled()) { | ||||
|             animationEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setBedPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isBedPacketsEnabled()) { | ||||
|             bedEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setCollectPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isCollectPacketsEnabled()) { | ||||
|             collectEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setDisguiseBlownMessage(String newMessage) { | ||||
|         disguiseBlownMessage = newMessage; | ||||
|     } | ||||
| @@ -114,6 +180,20 @@ public class DisguiseConfig { | ||||
|         blowDisguisesOnAttack = blowDisguise; | ||||
|     } | ||||
|  | ||||
|     public static void setEnquipmentPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isEnquipmentPacketsEnabled()) { | ||||
|             enquipmentEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setEntityStatusPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isEntityStatusPacketsEnabled()) { | ||||
|             entityStatusEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Can players hear their own disguises | ||||
|      */ | ||||
| @@ -155,6 +235,13 @@ public class DisguiseConfig { | ||||
|         keepDisguisePlayerLogout = keepDisguise; | ||||
|     } | ||||
|  | ||||
|     public static void setMiscDisguisesForLivingEnabled(boolean enabled) { | ||||
|         if (enabled != isMiscDisguisesForLivingEnabled()) { | ||||
|             miscDisguisesForLivingEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setModifyBoundingBox(boolean modifyBounding) { | ||||
|         modifyBoundingBox = modifyBounding; | ||||
|     } | ||||
| @@ -163,6 +250,13 @@ public class DisguiseConfig { | ||||
|         targetDisguises = ignore; | ||||
|     } | ||||
|  | ||||
|     public static void setMovementPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isMovementPacketsEnabled()) { | ||||
|             movementEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setNameAboveHeadAlwaysVisible(boolean alwaysVisible) { | ||||
|         showNameAboveHeadAlwaysVisible = alwaysVisible; | ||||
|     } | ||||
| @@ -171,6 +265,13 @@ public class DisguiseConfig { | ||||
|         showNameAboveHead = showNames; | ||||
|     } | ||||
|  | ||||
|     public static void setRidingPacketsEnabled(boolean enabled) { | ||||
|         if (enabled != isRidingPacketsEnabled()) { | ||||
|             ridingEnabled = enabled; | ||||
|             PacketsManager.setupMainPacketsListener(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Set if the disguises play sounds when hurt | ||||
|      */ | ||||
| @@ -193,6 +294,10 @@ public class DisguiseConfig { | ||||
|         PacketsManager.setViewDisguisesListener(seeOwnDisguise); | ||||
|     } | ||||
|  | ||||
|     public static void setWitherSkullPacketsEnabled(boolean enabled) { | ||||
|         witherSkullEnabled = enabled; | ||||
|     } | ||||
|  | ||||
|     private DisguiseConfig() { | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -23,6 +23,7 @@ import me.libraryaddict.disguise.utilities.DisguiseValues; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.configuration.ConfigurationSection; | ||||
| import org.bukkit.configuration.file.FileConfiguration; | ||||
| import org.bukkit.configuration.file.YamlConfiguration; | ||||
| import org.bukkit.entity.Ageable; | ||||
| @@ -46,14 +47,16 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             stream = getClassLoader().getResource("config.yml").openStream(); | ||||
|             YamlConfiguration internalConfig = YamlConfiguration.loadConfiguration(stream); | ||||
|             for (String option : internalConfig.getKeys(false)) { | ||||
|                 if (!config.contains(option)) { | ||||
|                     if (internalConfig.isConfigurationSection(option)) { | ||||
|                         for (String secondOption : internalConfig.getConfigurationSection(option).getKeys(false)) { | ||||
|                             config.set(option, getConfig().get(option + "." + secondOption)); | ||||
|                 if (internalConfig.isConfigurationSection(option)) { | ||||
|                     ConfigurationSection section = internalConfig.getConfigurationSection(option); | ||||
|                     for (String secondOption : section.getKeys(false)) { | ||||
|                         if (!config.contains(secondOption)) { | ||||
|                             config.set(option + "." + secondOption, section.get(secondOption)); | ||||
|                             needToSaveConfig = true; | ||||
|                         } | ||||
|                     } else { | ||||
|                         config.set(option, getConfig().get(option)); | ||||
|                     } | ||||
|                 } else if (!config.contains(option)) { | ||||
|                     config.set(option, getConfig().get(option)); | ||||
|                     needToSaveConfig = true; | ||||
|                 } | ||||
|             } | ||||
| @@ -94,6 +97,15 @@ public class LibsDisguises extends JavaPlugin { | ||||
|         DisguiseConfig.setKeepDisguiseOnPlayerDeath(getConfig().getBoolean("KeepDisguises.PlayerDeath")); | ||||
|         DisguiseConfig.setKeepDisguiseOnPlayerLogout(getConfig().getBoolean("KeepDisguises.PlayerLogout")); | ||||
|         DisguiseConfig.setKeepDisguiseOnEntityDespawn(getConfig().getBoolean("KeepDisguises.EntityDespawn")); | ||||
|         DisguiseConfig.setMiscDisguisesForLivingEnabled(getConfig().getBoolean("MiscDisguisesForLiving")); | ||||
|         DisguiseConfig.setMovementPacketsEnabled(getConfig().getBoolean("PacketsEnabled.Movement")); | ||||
|         DisguiseConfig.setWitherSkullPacketsEnabled(getConfig().getBoolean("PacketsEnabled.WitherSkull")); | ||||
|         DisguiseConfig.setEnquipmentPacketsEnabled(getConfig().getBoolean("PacketsEnabled.Enquipment")); | ||||
|         DisguiseConfig.setAnimationPacketsEnabled(getConfig().getBoolean("PacketsEnabled.Animation")); | ||||
|         DisguiseConfig.setBedPacketsEnabled(getConfig().getBoolean("PacketsEnabled.Bed")); | ||||
|         DisguiseConfig.setRidingPacketsEnabled(getConfig().getBoolean("PacketsEnabled.Riding")); | ||||
|         DisguiseConfig.setEntityStatusPacketsEnabled(getConfig().getBoolean("PacketsEnabled.EntityStatus")); | ||||
|         DisguiseConfig.setCollectPacketsEnabled(getConfig().getBoolean("PacketsEnabled.Collect")); | ||||
|         try { | ||||
|             // Here I use reflection to set the plugin for Disguise.. | ||||
|             // Kind of stupid but I don't want open API calls for a commonly used object. | ||||
| @@ -103,7 +115,7 @@ public class LibsDisguises extends JavaPlugin { | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         PacketsManager.addPacketListeners(this); | ||||
|         PacketsManager.addPacketListeners(); | ||||
|         DisguiseListener listener = new DisguiseListener(this); | ||||
|         Bukkit.getPluginManager().registerEvents(listener, this); | ||||
|         getCommand("disguise").setExecutor(new DisguiseCommand()); | ||||
|   | ||||
| @@ -21,6 +21,7 @@ import org.bukkit.Bukkit; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Horse.Variant; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.bukkit.util.Vector; | ||||
| @@ -227,7 +228,7 @@ public abstract class Disguise { | ||||
|                         // If disguise isn't a experience orb, or the entity isn't standing on the ground | ||||
|                         if (getType() != DisguiseType.EXPERIENCE_ORB || !getEntity().isOnGround()) { | ||||
|                             PacketContainer lookPacket = null; | ||||
|                             if (getType() == DisguiseType.WITHER_SKULL) { | ||||
|                             if (getType() == DisguiseType.WITHER_SKULL && DisguiseConfig.isWitherSkullPacketsEnabled()) { | ||||
|                                 lookPacket = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); | ||||
|                                 StructureModifier<Object> mods = lookPacket.getModifier(); | ||||
|                                 mods.write(0, getEntity().getEntityId()); | ||||
| @@ -454,6 +455,10 @@ public abstract class Disguise { | ||||
|                 return; | ||||
|             throw new RuntimeException("This disguise is already in use! Try .clone()"); | ||||
|         } | ||||
|         if (this.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { | ||||
|             throw new RuntimeException( | ||||
|                     "Cannot disguise a living entity with a misc disguise. Renable MiscDisguisesForLiving in the config to do this"); | ||||
|         } | ||||
|         this.entity = entity; | ||||
|         setupWatcher(); | ||||
|         taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, velocityRunnable, 1, 1); | ||||
|   | ||||
| @@ -102,11 +102,6 @@ public class MiscDisguise extends TargetedDisguise { | ||||
|         this(entityType, -1, -1); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public MiscDisguise(EntityType entityType, int id) { | ||||
|         this(entityType, id, -1); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public MiscDisguise(EntityType entityType, boolean replaceSounds) { | ||||
|         this(entityType, replaceSounds, -1, -1); | ||||
| @@ -117,6 +112,11 @@ public class MiscDisguise extends TargetedDisguise { | ||||
|         this(DisguiseType.getType(entityType), replaceSounds, id, data); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public MiscDisguise(EntityType entityType, int id) { | ||||
|         this(entityType, id, -1); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public MiscDisguise(EntityType disguiseType, int id, int data) { | ||||
|         this(DisguiseType.getType(disguiseType), id, data); | ||||
|   | ||||
| @@ -8,6 +8,7 @@ import com.comphenix.protocol.ProtocolLibrary; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| import com.comphenix.protocol.reflect.StructureModifier; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | ||||
| @@ -44,7 +45,7 @@ public class PlayerWatcher extends LivingWatcher { | ||||
|     public void setSleeping(boolean sleep) { | ||||
|         if (sleep != isSleeping()) { | ||||
|             isInBed = sleep; | ||||
|             if (DisguiseUtilities.isDisguiseInUse(getDisguise())) { | ||||
|             if (DisguiseConfig.isBedPacketsEnabled() && DisguiseUtilities.isDisguiseInUse(getDisguise())) { | ||||
|                 PacketContainer packet; | ||||
|                 if (isSleeping()) { | ||||
|                     packet = new PacketContainer(PacketType.Play.Server.BED); | ||||
|   | ||||
| @@ -43,6 +43,10 @@ public class DisguiseUtilities { | ||||
|      * the plugin to do that. | ||||
|      */ | ||||
|     private static HashSet<String> addedByPlugins = new HashSet<String>(); | ||||
|     /** | ||||
|      * A hashmap of the uuid's of entitys, alive and dead. And their disguises in use | ||||
|      **/ | ||||
|     private static HashMap<UUID, HashSet<TargetedDisguise>> disguisesInUse = new HashMap<UUID, HashSet<TargetedDisguise>>(); | ||||
|     /** | ||||
|      * Disguises which are stored ready for a entity to be seen by a player Preferably, disguises in this should only stay in for | ||||
|      * a max of a second. | ||||
| @@ -58,10 +62,6 @@ public class DisguiseUtilities { | ||||
|      * seeing as no one sees each others entity ID | ||||
|      **/ | ||||
|     private static HashMap<UUID, Integer> selfDisguisesIds = new HashMap<UUID, Integer>(); | ||||
|     /** | ||||
|      * A hashmap of the uuid's of entitys, alive and dead. And their disguises in use | ||||
|      **/ | ||||
|     private static HashMap<UUID, HashSet<TargetedDisguise>> disguisesInUse = new HashMap<UUID, HashSet<TargetedDisguise>>(); | ||||
|  | ||||
|     public static void addDisguise(UUID entityId, TargetedDisguise disguise) { | ||||
|         if (!getDisguises().containsKey(entityId)) { | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import java.util.List; | ||||
| import java.util.Random; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| @@ -32,12 +33,10 @@ import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.entity.Zombie; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.bukkit.util.Vector; | ||||
|  | ||||
| import com.comphenix.protocol.PacketType; | ||||
| import com.comphenix.protocol.ProtocolLibrary; | ||||
| import com.comphenix.protocol.ProtocolManager; | ||||
| import com.comphenix.protocol.events.ListenerPriority; | ||||
| import com.comphenix.protocol.events.PacketAdapter; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| @@ -57,50 +56,18 @@ public class PacketsManager { | ||||
|     private static PacketListener inventoryListenerServer; | ||||
|     private static boolean inventoryModifierEnabled; | ||||
|     private static LibsDisguises libsDisguises; | ||||
|     private static PacketListener mainListener; | ||||
|     private static PacketListener soundsListener; | ||||
|     private static PacketListener useEntityListener; | ||||
|     private static boolean soundsListenerEnabled; | ||||
|     private static PacketListener viewDisguisesListener; | ||||
|     private static boolean viewDisguisesListenerEnabled; | ||||
|  | ||||
|     public static void addPacketListeners(JavaPlugin libsDisguises) { | ||||
|         ProtocolManager manager = ProtocolLibrary.getProtocolManager(); | ||||
|         manager.addPacketListener(new PacketAdapter(libsDisguises, ListenerPriority.HIGH, | ||||
|                 PacketType.Play.Server.NAMED_ENTITY_SPAWN, PacketType.Play.Server.ENTITY_METADATA, | ||||
|                 PacketType.Play.Server.ANIMATION, PacketType.Play.Server.ENTITY_MOVE_LOOK, PacketType.Play.Server.ENTITY_LOOK, | ||||
|                 PacketType.Play.Server.ENTITY_HEAD_ROTATION, PacketType.Play.Server.ENTITY_TELEPORT, | ||||
|                 PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB, PacketType.Play.Server.SPAWN_ENTITY, | ||||
|                 PacketType.Play.Server.SPAWN_ENTITY_LIVING, PacketType.Play.Server.SPAWN_ENTITY_PAINTING, | ||||
|                 PacketType.Play.Server.COLLECT, PacketType.Play.Server.UPDATE_ATTRIBUTES, | ||||
|                 PacketType.Play.Server.ENTITY_EQUIPMENT, PacketType.Play.Server.BED, PacketType.Play.Server.ENTITY_STATUS, | ||||
|                 PacketType.Play.Server.ATTACH_ENTITY) { | ||||
|             @Override | ||||
|             public void onPacketSending(PacketEvent event) { | ||||
|                 final Player observer = event.getPlayer(); | ||||
|                 // First get the entity, the one sending this packet | ||||
|                 StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); | ||||
|                 org.bukkit.entity.Entity entity = entityModifer.read((PacketType.Play.Server.COLLECT == event.getPacketType() | ||||
|                         || PacketType.Play.Server.ATTACH_ENTITY == event.getPacketType() ? 1 : 0)); | ||||
|                 // If the entity is the same as the sender. Don't disguise! | ||||
|                 // Prevents problems and there is no advantage to be gained. | ||||
|                 if (entity == observer) | ||||
|                     return; | ||||
|                 PacketContainer[] packets = transformPacket(event.getPacket(), event.getPlayer(), entity); | ||||
|                 if (packets != null) { | ||||
|                     event.setCancelled(true); | ||||
|                     try { | ||||
|                         for (PacketContainer packet : packets) { | ||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                         } | ||||
|                     } catch (InvocationTargetException ex) { | ||||
|                         ex.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         // Now add a client listener to cancel them interacting with uninteractable disguised entitys. | ||||
|     public static void addPacketListeners() { | ||||
|         // Add a client listener to cancel them interacting with uninteractable disguised entitys. | ||||
|         // You ain't supposed to be allowed to 'interact' with a item that cannot be clicked. | ||||
|         // Because it kicks you for hacking. | ||||
|         manager.addPacketListener(new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, PacketType.Play.Client.USE_ENTITY) { | ||||
|         useEntityListener = new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, PacketType.Play.Client.USE_ENTITY) { | ||||
|             @Override | ||||
|             public void onPacketReceiving(PacketEvent event) { | ||||
|                 try { | ||||
| @@ -115,7 +82,10 @@ public class PacketsManager { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         }; | ||||
|         ProtocolLibrary.getProtocolManager().addPacketListener(useEntityListener); | ||||
|         // Now I call this and the main listener is registered! | ||||
|         setupMainPacketsListener(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -156,9 +126,12 @@ public class PacketsManager { | ||||
|             spawnPackets[i + 2] = packets.get(i); | ||||
|         } | ||||
|         Location loc = disguisedEntity.getLocation().clone().add(0, getYModifier(disguise), 0); | ||||
|         byte yaw = getYaw(disguise.getType(), disguisedEntity.getType(), (byte) (int) (loc.getYaw() * 256.0F / 360.0F)); | ||||
|         byte pitch = getPitch(disguise.getType(), DisguiseType.getType(disguisedEntity.getType()), | ||||
|                 (byte) (int) (loc.getPitch() * 256.0F / 360.0F)); | ||||
|         byte yaw = (byte) (int) (loc.getYaw() * 256.0F / 360.0F); | ||||
|         byte pitch = (byte) (int) (loc.getPitch() * 256.0F / 360.0F); | ||||
|         if (DisguiseConfig.isMovementPacketsEnabled()) { | ||||
|             yaw = getYaw(disguise.getType(), disguisedEntity.getType(), yaw); | ||||
|             pitch = getPitch(disguise.getType(), DisguiseType.getType(disguisedEntity.getType()), pitch); | ||||
|         } | ||||
|  | ||||
|         if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { | ||||
|  | ||||
| @@ -230,7 +203,7 @@ public class PacketsManager { | ||||
|             spawnPackets[0].getDataWatcherModifier().write(0, | ||||
|                     createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||
|  | ||||
|             if (((PlayerWatcher) disguise.getWatcher()).isSleeping()) { | ||||
|             if (((PlayerWatcher) disguise.getWatcher()).isSleeping() && DisguiseConfig.isBedPacketsEnabled()) { | ||||
|                 spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED); | ||||
|                 StructureModifier<Integer> mods = spawnPackets[1].getIntegers(); | ||||
|                 mods.write(0, disguisedEntity.getEntityId()); | ||||
| @@ -463,7 +436,7 @@ public class PacketsManager { | ||||
|         case WITHER_SKULL: | ||||
|             return 0.7; | ||||
|         case PLAYER: | ||||
|             if (((PlayerWatcher) disguise.getWatcher()).isSleeping()) { | ||||
|             if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { | ||||
|                 return 0.35; | ||||
|             } | ||||
|             break; | ||||
| @@ -1078,6 +1051,85 @@ public class PacketsManager { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setupMainPacketsListener() { | ||||
|         if (useEntityListener != null) { | ||||
|             if (mainListener != null) { | ||||
|                 ProtocolLibrary.getProtocolManager().removePacketListener(mainListener); | ||||
|             } | ||||
|             List<PacketType> packetsToListen = new ArrayList<PacketType>(); | ||||
|             // Add spawn packets | ||||
|             { | ||||
|                 packetsToListen.add(PacketType.Play.Server.NAMED_ENTITY_SPAWN); | ||||
|                 packetsToListen.add(PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB); | ||||
|                 packetsToListen.add(PacketType.Play.Server.SPAWN_ENTITY); | ||||
|                 packetsToListen.add(PacketType.Play.Server.SPAWN_ENTITY_LIVING); | ||||
|                 packetsToListen.add(PacketType.Play.Server.SPAWN_ENTITY_PAINTING); | ||||
|             } | ||||
|             // Add packets that always need to be enabled to ensure safety | ||||
|             { | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_METADATA); | ||||
|             } | ||||
|             if (DisguiseConfig.isRidingPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.ATTACH_ENTITY); | ||||
|             } | ||||
|             if (DisguiseConfig.isCollectPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.COLLECT); | ||||
|             } | ||||
|             if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.UPDATE_ATTRIBUTES); | ||||
|             } | ||||
|             // The bed packet. | ||||
|             if (DisguiseConfig.isBedPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.BED); | ||||
|             } | ||||
|             // Add movement packets | ||||
|             if (DisguiseConfig.isMovementPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_LOOK); | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_MOVE_LOOK); | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_HEAD_ROTATION); | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_TELEPORT); | ||||
|             } | ||||
|             // Add enquipment packet | ||||
|             if (DisguiseConfig.isEnquipmentPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_EQUIPMENT); | ||||
|             } | ||||
|             // Add the packet that ensures if they are sleeping or not | ||||
|             if (DisguiseConfig.isAnimationPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.ANIMATION); | ||||
|             } | ||||
|             // Add the packet that makes sure that entities with armor do not send unpickupable armor on death | ||||
|             if (DisguiseConfig.isEntityStatusPacketsEnabled()) { | ||||
|                 packetsToListen.add(PacketType.Play.Server.ENTITY_STATUS); | ||||
|             } | ||||
|             mainListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, packetsToListen) { | ||||
|                 @Override | ||||
|                 public void onPacketSending(PacketEvent event) { | ||||
|                     final Player observer = event.getPlayer(); | ||||
|                     // First get the entity, the one sending this packet | ||||
|                     StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); | ||||
|                     org.bukkit.entity.Entity entity = entityModifer.read((PacketType.Play.Server.COLLECT == event.getPacketType() | ||||
|                             || PacketType.Play.Server.ATTACH_ENTITY == event.getPacketType() ? 1 : 0)); | ||||
|                     // If the entity is the same as the sender. Don't disguise! | ||||
|                     // Prevents problems and there is no advantage to be gained. | ||||
|                     if (entity == observer) | ||||
|                         return; | ||||
|                     PacketContainer[] packets = transformPacket(event.getPacket(), event.getPlayer(), entity); | ||||
|                     if (packets != null) { | ||||
|                         event.setCancelled(true); | ||||
|                         try { | ||||
|                             for (PacketContainer packet : packets) { | ||||
|                                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                             } | ||||
|                         } catch (InvocationTargetException ex) { | ||||
|                             ex.printStackTrace(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             }; | ||||
|             ProtocolLibrary.getProtocolManager().addPacketListener(mainListener); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setViewDisguisesListener(boolean enabled) { | ||||
|         if (viewDisguisesListenerEnabled != enabled) { | ||||
|             viewDisguisesListenerEnabled = enabled; | ||||
| @@ -1151,7 +1203,8 @@ public class PacketsManager { | ||||
|                 else if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) { | ||||
|                     if (disguise.getType().isMisc() | ||||
|                             || (packets[0].getIntegers().read(1) == (LibVersion.is1_7() ? 2 : 3) && (!disguise.getType() | ||||
|                                     .isPlayer() || ((PlayerWatcher) disguise.getWatcher()).isSleeping()))) { | ||||
|                                     .isPlayer() || (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise | ||||
|                                     .getWatcher()).isSleeping())))) { | ||||
|                         packets = new PacketContainer[0]; | ||||
|                     } | ||||
|                 } | ||||
| @@ -1159,7 +1212,8 @@ public class PacketsManager { | ||||
|                 else if (sentPacket.getType() == PacketType.Play.Server.COLLECT) { | ||||
|                     if (disguise.getType().isMisc()) { | ||||
|                         packets = new PacketContainer[0]; | ||||
|                     } else if (disguise.getType().isPlayer() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { | ||||
|                     } else if (DisguiseConfig.isBedPacketsEnabled() && disguise.getType().isPlayer() | ||||
|                             && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { | ||||
|                         PacketContainer newPacket = new PacketContainer(PacketType.Play.Server.ANIMATION); | ||||
|                         StructureModifier<Integer> mods = newPacket.getIntegers(); | ||||
|                         mods.write(0, disguise.getEntity().getEntityId()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user