Attempt to strip custom enchants

This commit is contained in:
libraryaddict 2024-07-01 23:23:01 +12:00
parent 602a445f9c
commit 3ea2d7a042
3 changed files with 35 additions and 2 deletions

View File

@ -2815,6 +2815,26 @@ public class DisguiseUtilities {
return externalComponentSerializer.deserialize(serialized);
}
public static com.github.retrooper.packetevents.protocol.item.ItemStack stripEnchants(
com.github.retrooper.packetevents.protocol.item.ItemStack itemStack) {
itemStack.setEnchantments(new ArrayList<>(), PacketEvents.getAPI().getServerManager().getVersion().toClientVersion());
return itemStack;
}
public static boolean hasCustomEnchants(com.github.retrooper.packetevents.protocol.item.ItemStack itemStack) {
for (com.github.retrooper.packetevents.protocol.item.enchantment.Enchantment enchant : itemStack.getEnchantments(
PacketEvents.getAPI().getServerManager().getVersion().toClientVersion())) {
if (enchant != null && enchant.getType() != null) {
continue;
}
return true;
}
return false;
}
public static BaseComponent[] getColoredChat(String message) {
if (message.isEmpty()) {
return new BaseComponent[0];

View File

@ -48,6 +48,11 @@ public class PacketHandlerEquipment implements IPacketHandler<WrapperPlayServerE
ItemStack itemInDisguise = disguise.getWatcher().getItemStack(DisguiseUtilities.getSlot(slot));
com.github.retrooper.packetevents.protocol.item.ItemStack itemInPacket = equipment.getItem();
// Workaround for this pending fix https://github.com/retrooper/packetevents/issues/869
if (DisguiseUtilities.hasCustomEnchants(itemInPacket)) {
equipment.setItem(itemInPacket = DisguiseUtilities.stripEnchants(itemInPacket));
}
if (itemInDisguise != null) {
// If we haven't decided to send a new packet yet, then construct it
if (packets.getPackets().contains(originalPacket)) {
@ -119,5 +124,4 @@ public class PacketHandlerEquipment implements IPacketHandler<WrapperPlayServerE
// Silly mojang made the right clicking datawatcher value only valid for one use. So I have to reset it.
}
}
}

View File

@ -1,12 +1,13 @@
package me.libraryaddict.disguise.utilities.packets.packethandlers;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.packets.IPacketHandler;
import me.libraryaddict.disguise.utilities.packets.LibsPackets;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
@ -47,6 +48,14 @@ public class PacketHandlerMetadata implements IPacketHandler<WrapperPlayServerEn
return;
}
// Workaround for this pending fix https://github.com/retrooper/packetevents/issues/869
for (WatcherValue object : watchableObjects) {
if (object.getDataValue().getValue() instanceof ItemStack &&
DisguiseUtilities.hasCustomEnchants((ItemStack) object.getDataValue().getValue())) {
object.getDataValue().setValue(DisguiseUtilities.stripEnchants((ItemStack) object.getDataValue().getValue()));
}
}
WrapperPlayServerEntityMetadata metaPacket = ReflectionManager.getMetadataPacket(entity.getEntityId(), watchableObjects);
packets.addPacket(metaPacket);