Fix equip packets, again
This commit is contained in:
parent
1b2085c03f
commit
45996842d9
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,10 +93,35 @@ 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) {
|
if (isRemoveCancel) {
|
||||||
PacketsManager.getPacketsHandler().removeCancel(disguise, observer);
|
PacketsManager.getPacketsHandler().removeCancel(disguise, observer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isRemoveCancel) {
|
||||||
|
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 {
|
||||||
for (PacketContainer packet : entry.getValue()) {
|
for (PacketContainer packet : entry.getValue()) {
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
||||||
@ -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 (delayedArmor) {
|
||||||
|
itemToSend = new ItemStack(Material.AIR);
|
||||||
|
} else {
|
||||||
|
itemToSend = disguise.getWatcher().getItemStack(slot);
|
||||||
|
|
||||||
// If the disguise armor isn't visible
|
// If the disguise armor isn't visible
|
||||||
if (itemToSend == null || itemToSend.getType() == Material.AIR) {
|
if (itemToSend == null || itemToSend.getType() != Material.AIR) {
|
||||||
// If we need to send the natural armor if possible
|
|
||||||
if (delayedArmor) {
|
|
||||||
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,13 +442,8 @@ 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, 7);
|
|
||||||
packets.setRemoveMetaAt(7);
|
|
||||||
} else {
|
|
||||||
packets.addDelayedPacket(packet);
|
packets.addDelayedPacket(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user