Fix equip packets, again
This commit is contained in:
		
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | |||||||
|     <!-- A good example on why temporary names for project identification shouldn't be used --> |     <!-- A good example on why temporary names for project identification shouldn't be used --> | ||||||
|     <groupId>LibsDisguises</groupId> |     <groupId>LibsDisguises</groupId> | ||||||
|     <artifactId>LibsDisguises</artifactId> |     <artifactId>LibsDisguises</artifactId> | ||||||
|     <version>9.9.3</version> |     <version>9.9.3-SNAPSHOT</version> | ||||||
|  |  | ||||||
|     <build> |     <build> | ||||||
|         <defaultGoal>clean install</defaultGoal> |         <defaultGoal>clean install</defaultGoal> | ||||||
|   | |||||||
| @@ -3,11 +3,18 @@ package me.libraryaddict.disguise.utilities.packets; | |||||||
| import com.comphenix.protocol.PacketType; | import com.comphenix.protocol.PacketType; | ||||||
| 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.reflect.StructureModifier; | ||||||
|  | import lombok.Getter; | ||||||
|  | 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.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.Material; | ||||||
|  | import org.bukkit.entity.LivingEntity; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.inventory.EquipmentSlot; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||||
| import java.util.*; | import java.util.*; | ||||||
| @@ -22,6 +29,9 @@ public class LibsPackets { | |||||||
|     private Disguise disguise; |     private Disguise disguise; | ||||||
|     private boolean doNothing; |     private boolean doNothing; | ||||||
|     private int removeMetaAt = -1; |     private int removeMetaAt = -1; | ||||||
|  |     @Getter | ||||||
|  |     @Setter | ||||||
|  |     private boolean sendArmor; | ||||||
|  |  | ||||||
|     public LibsPackets(Disguise disguise) { |     public LibsPackets(Disguise disguise) { | ||||||
|         this.disguise = disguise; |         this.disguise = disguise; | ||||||
| @@ -83,8 +93,33 @@ public class LibsPackets { | |||||||
|             final boolean isRemoveCancel = isSpawnPacket && entry.getKey() >= removeMetaAt && removeMetaAt >= 0; |             final boolean isRemoveCancel = isSpawnPacket && entry.getKey() >= removeMetaAt && removeMetaAt >= 0; | ||||||
|  |  | ||||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), () -> { |             Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), () -> { | ||||||
|  |                 if (!disguise.isDisguiseInUse()) { | ||||||
|  |                     if (isRemoveCancel) { | ||||||
|  |                         PacketsManager.getPacketsHandler().removeCancel(disguise, observer); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (isRemoveCancel) { |                 if (isRemoveCancel) { | ||||||
|                     PacketsManager.getPacketsHandler().removeCancel(disguise, observer); |                     PacketsManager.getPacketsHandler().removeCancel(disguise, observer); | ||||||
|  |  | ||||||
|  |                     if (isSendArmor()) { | ||||||
|  |                         for (EquipmentSlot slot : EquipmentSlot.values()) { | ||||||
|  |                             PacketContainer packet = createPacket(slot); | ||||||
|  |  | ||||||
|  |                             if (packet == null) { | ||||||
|  |                                 continue; | ||||||
|  |                             } | ||||||
|  |  | ||||||
|  |                             try { | ||||||
|  |                                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||||
|  |                             } | ||||||
|  |                             catch (InvocationTargetException e) { | ||||||
|  |                                 e.printStackTrace(); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 try { |                 try { | ||||||
| @@ -98,4 +133,31 @@ public class LibsPackets { | |||||||
|             }, entry.getKey()); |             }, entry.getKey()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private PacketContainer createPacket(EquipmentSlot slot) { | ||||||
|  |         // Get what the disguise wants to show for its armor | ||||||
|  |         ItemStack itemToSend = disguise.getWatcher().getItemStack(slot); | ||||||
|  |  | ||||||
|  |         // If the disguise armor isn't visible | ||||||
|  |         if (itemToSend == null) { | ||||||
|  |             itemToSend = ReflectionManager.getEquipment(slot, disguise.getEntity()); | ||||||
|  |  | ||||||
|  |             // If natural armor isn't sent either | ||||||
|  |             if (itemToSend == null || itemToSend.getType() == Material.AIR) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |         } else if (itemToSend.getType() == Material.AIR) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); | ||||||
|  |  | ||||||
|  |         StructureModifier<Object> mods = packet.getModifier(); | ||||||
|  |  | ||||||
|  |         mods.write(0, disguise.getEntity().getEntityId()); | ||||||
|  |         mods.write(1, ReflectionManager.createEnumItemSlot(slot)); | ||||||
|  |         mods.write(2, ReflectionManager.getNmsItem(itemToSend)); | ||||||
|  |  | ||||||
|  |         return packet; | ||||||
|  |     } | ||||||
| } | } | ||||||
| @@ -404,16 +404,24 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|         boolean delayedArmor = |         boolean delayedArmor = | ||||||
|                 DisguiseConfig.isPlayerHideArmor() && (disguise.isPlayerDisguise() && disguisedEntity != observer) && |                 DisguiseConfig.isPlayerHideArmor() && (disguise.isPlayerDisguise() && disguisedEntity != observer) && | ||||||
|                         disguisedEntity instanceof LivingEntity; |                         disguisedEntity instanceof LivingEntity; | ||||||
|  |  | ||||||
|  |         if (delayedArmor) { | ||||||
|  |             packets.setSendArmor(true); | ||||||
|  |             packets.setRemoveMetaAt(7); | ||||||
|  |         } | ||||||
|         // This sends the armor packets so that the player isn't naked. |         // This sends the armor packets so that the player isn't naked. | ||||||
|         if (DisguiseConfig.isEquipmentPacketsEnabled() || delayedArmor) { |         if (DisguiseConfig.isEquipmentPacketsEnabled() || delayedArmor) { | ||||||
|             for (EquipmentSlot slot : EquipmentSlot.values()) { |             for (EquipmentSlot slot : EquipmentSlot.values()) { | ||||||
|                 // 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; | ||||||
|  |  | ||||||
|                 // If the disguise armor isn't visible |                 if (delayedArmor) { | ||||||
|                 if (itemToSend == null || itemToSend.getType() == Material.AIR) { |                     itemToSend = new ItemStack(Material.AIR); | ||||||
|                     // If we need to send the natural armor if possible |                 } else { | ||||||
|                     if (delayedArmor) { |                     itemToSend = disguise.getWatcher().getItemStack(slot); | ||||||
|  |  | ||||||
|  |                     // If the disguise armor isn't visible | ||||||
|  |                     if (itemToSend == null || itemToSend.getType() != Material.AIR) { | ||||||
|                         itemToSend = ReflectionManager.getEquipment(slot, disguisedEntity); |                         itemToSend = ReflectionManager.getEquipment(slot, disguisedEntity); | ||||||
|  |  | ||||||
|                         // If natural armor isn't sent either |                         // If natural armor isn't sent either | ||||||
| @@ -421,14 +429,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|                             continue; |                             continue; | ||||||
|                         } |                         } | ||||||
|                     } else { |                     } else { | ||||||
|                         // We don't need to send natural armor and disguise armor isn't visible |                         // Its air which shouldn't be sent | ||||||
|                         continue; |  | ||||||
|                     } |  | ||||||
|                 } else if (!delayedArmor && disguisedEntity instanceof LivingEntity) { |  | ||||||
|                     ItemStack item = ReflectionManager.getEquipment(slot, disguisedEntity); |  | ||||||
|  |  | ||||||
|                     // If the item was going to be sent anyways |  | ||||||
|                     if (item != null && item.getType() != Material.AIR) { |  | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -441,12 +442,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|                 mods.write(1, ReflectionManager.createEnumItemSlot(slot)); |                 mods.write(1, ReflectionManager.createEnumItemSlot(slot)); | ||||||
|                 mods.write(2, ReflectionManager.getNmsItem(itemToSend)); |                 mods.write(2, ReflectionManager.getNmsItem(itemToSend)); | ||||||
|  |  | ||||||
|                 if (delayedArmor) { |                 packets.addDelayedPacket(packet); | ||||||
|                     packets.addDelayedPacket(packet, 7); |  | ||||||
|                     packets.setRemoveMetaAt(7); |  | ||||||
|                 } else { |  | ||||||
|                     packets.addDelayedPacket(packet); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user