Some enchantments should remain in self disguise armor/held items. Fixes #673

This commit is contained in:
libraryaddict 2023-04-24 23:42:27 +12:00
parent ae0db7292b
commit 6ea0c665d9
5 changed files with 47 additions and 12 deletions

View File

@ -73,6 +73,7 @@ import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.boss.KeyedBossBar;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
@ -262,6 +263,7 @@ public class DisguiseUtilities {
@Setter
private static boolean protocollibUpdateDownloaded;
private static NamespacedKey savedDisguisesKey;
private static final List<Enchantment> whitelistedEnchantments = new ArrayList<>();
static {
final Matcher matcher = Pattern.compile("(?:1\\.)?(\\d+)").matcher(System.getProperty("java.version"));
@ -286,6 +288,37 @@ public class DisguiseUtilities {
profileCache = new File(LibsDisguises.getInstance().getDataFolder(), "SavedSkins");
savedDisguises = new File(LibsDisguises.getInstance().getDataFolder(), "SavedDisguises");
}
whitelistedEnchantments.add(Enchantment.DEPTH_STRIDER);
whitelistedEnchantments.add(Enchantment.OXYGEN);
if (NmsVersion.v1_13.isSupported()) {
whitelistedEnchantments.add(Enchantment.RIPTIDE);
if (NmsVersion.v1_19_R1.isSupported()) {
whitelistedEnchantments.add(Enchantment.SOUL_SPEED);
whitelistedEnchantments.add(Enchantment.SWIFT_SNEAK);
}
}
}
public static boolean shouldBeHiddenSelfDisguise(ItemStack itemStack) {
if (itemStack == null || itemStack.getType() == Material.AIR) {
return false;
}
Map<Enchantment, Integer> enchants = itemStack.getEnchantments();
for (Enchantment enchantment : enchants.keySet()) {
if (!whitelistedEnchantments.contains(enchantment)) {
continue;
}
return false;
}
return true;
}
public static String serialize(Component component) {

View File

@ -263,8 +263,8 @@ public class DisguiseListener implements Listener {
// If the packet is coming, then I need to replace the item they are switching to
// As for the old item, I need to restore it.
org.bukkit.inventory.ItemStack currentlyHeld = player.getItemInHand();
// If his old weapon isn't air
if (currentlyHeld != null && currentlyHeld.getType() != Material.AIR) {
// If their old weapon isn't air
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(currentlyHeld)) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT);
StructureModifier<Object> mods = packet.getModifier();
@ -283,8 +283,8 @@ public class DisguiseListener implements Listener {
org.bukkit.inventory.ItemStack newHeld = player.getInventory().getItem(event.getNewSlot());
// If his new weapon isn't air either!
if (newHeld != null && newHeld.getType() != Material.AIR) {
// If their new weapon isn't air either!
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(newHeld)) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT);
StructureModifier<Object> mods = packet.getModifier();

View File

@ -14,6 +14,7 @@ import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.WatcherValue;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
@ -25,6 +26,7 @@ import java.util.List;
* Created by libraryaddict on 3/01/2019.
*/
public class PacketHandlerEquipment implements IPacketHandler {
@Override
public PacketType[] getHandledPackets() {
return new PacketType[]{PacketType.Play.Server.ENTITY_EQUIPMENT};

View File

@ -80,7 +80,7 @@ public class PacketListenerInventory extends PacketAdapter {
org.bukkit.inventory.ItemStack item = player.getInventory().getArmorContents()[armorSlot];
if (item != null && item.getType() != Material.AIR && item.getType() != Material.ELYTRA) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(item) && item.getType() != Material.ELYTRA) {
PacketContainer packet = new PacketContainer(Server.SET_SLOT);
StructureModifier<Object> mods = packet.getModifier();
@ -104,7 +104,7 @@ public class PacketListenerInventory extends PacketAdapter {
if (slot + 36 == currentSlot || slot == 45) {
org.bukkit.inventory.ItemStack item = player.getInventory().getItemInMainHand();
if (item != null && item.getType() != Material.AIR) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(item)) {
PacketContainer packet = new PacketContainer(Server.SET_SLOT);
StructureModifier<Object> mods = packet.getModifier();
@ -138,6 +138,7 @@ public class PacketListenerInventory extends PacketAdapter {
// Its a shift click
clickedItem = event.getPacket().getItemModifier().read(0);
// We don't look at if it should be hidden or not, we just want to prevent mis-synced inventory
if (clickedItem != null && clickedItem.getType() != Material.AIR) {
// Rather than predict the clients actions
// Lets just update the entire inventory..
@ -159,7 +160,7 @@ public class PacketListenerInventory extends PacketAdapter {
clickedItem = player.getItemOnCursor();
}
if (clickedItem != null && clickedItem.getType() != Material.AIR && clickedItem.getType() != Material.ELYTRA) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(clickedItem) && clickedItem.getType() != Material.ELYTRA) {
// If the slot is a armor slot
if (slot >= 5 && slot <= 8) {
if (disguise.isHidingArmorFromSelf()) {
@ -242,7 +243,7 @@ public class PacketListenerInventory extends PacketAdapter {
org.bukkit.inventory.ItemStack item = player.getInventory().getArmorContents()[armorSlot];
if (item != null && item.getType() != Material.AIR && item.getType() != Material.ELYTRA) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(item) && item.getType() != Material.ELYTRA) {
event.setPacket(event.getPacket().shallowClone());
event.getPacket().getItemModifier().write(0, new ItemStack(Material.AIR));
@ -257,7 +258,7 @@ public class PacketListenerInventory extends PacketAdapter {
if (slot == currentSlot + 36 || slot == 45) {
org.bukkit.inventory.ItemStack item = player.getInventory().getItemInMainHand();
if (item != null && item.getType() != Material.AIR) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(item)) {
event.setPacket(event.getPacket().shallowClone());
event.getPacket().getItemModifier().write(0, new ItemStack(Material.AIR));
@ -279,7 +280,7 @@ public class PacketListenerInventory extends PacketAdapter {
ItemStack item = player.getInventory().getArmorContents()[armorSlot];
if (item != null && item.getType() != Material.AIR && item.getType() != Material.ELYTRA) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(item) && item.getType() != Material.ELYTRA) {
items.set(slot, new ItemStack(Material.AIR));
}
}
@ -292,7 +293,7 @@ public class PacketListenerInventory extends PacketAdapter {
if (slot == currentSlot + 36 || slot == 45) {
ItemStack item = player.getInventory().getItemInMainHand();
if (item != null && item.getType() != Material.AIR) {
if (DisguiseUtilities.shouldBeHiddenSelfDisguise(item)) {
items.set(slot, new ItemStack(Material.AIR));
}
}

View File

@ -800,7 +800,6 @@ public class DisguiseParser {
}
if (!method1.getParam().isAssignableFrom(param.getClass())) {
System.out.println("Can't cast " + method1.getParam() + " to " + param.getClass() + " for " + method);
continue;
}