diff --git a/InvUI/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java b/InvUI/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java index fb8e08b..d2d99bd 100644 --- a/InvUI/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java +++ b/InvUI/src/main/java/de/studiocode/invui/window/impl/merged/MergedWindow.java @@ -1,5 +1,6 @@ package de.studiocode.invui.window.impl.merged; +import de.studiocode.inventoryaccess.version.InventoryAccess; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.util.Pair; @@ -102,6 +103,9 @@ public abstract class MergedWindow extends BaseWindow { @Override protected void handleOpened() { + // Prevent players from receiving advancements from UI items + InventoryAccess.getPlayerUtils().stopAdvancementListening(getViewer()); + isCurrentlyOpened = true; clearPlayerInventory(); initPlayerItems(); @@ -111,6 +115,9 @@ public abstract class MergedWindow extends BaseWindow { protected void handleClosed() { isCurrentlyOpened = false; restorePlayerInventory(); + + // Start the advancement listeners again + InventoryAccess.getPlayerUtils().startAdvancementListening(getViewer()); } @Override diff --git a/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/PlayerUtilsImpl.java b/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..56ac378 --- /dev/null +++ b/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/PlayerUtilsImpl.java @@ -0,0 +1,38 @@ +package de.studiocode.inventoryaccess.v1_14_R1.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.v1_14_R1.AdvancementDataPlayer; +import net.minecraft.server.v1_14_R1.EntityPlayer; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "d"); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((EntityPlayer) player).getAdvancementData().a(); // stops listening + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements); + } + +} diff --git a/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/PlayerUtilsImpl.java b/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..d029aea --- /dev/null +++ b/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/PlayerUtilsImpl.java @@ -0,0 +1,38 @@ +package de.studiocode.inventoryaccess.v1_15_R1.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.v1_15_R1.AdvancementDataPlayer; +import net.minecraft.server.v1_15_R1.EntityPlayer; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "d"); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((EntityPlayer) player).getAdvancementData().a(); // stops listening + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements); + } + +} diff --git a/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/PlayerUtilsImpl.java b/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..be5cad8 --- /dev/null +++ b/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/PlayerUtilsImpl.java @@ -0,0 +1,42 @@ +package de.studiocode.inventoryaccess.v1_16_R1.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.v1_16_R1.AdvancementDataPlayer; +import net.minecraft.server.v1_16_R1.AdvancementDataWorld; +import net.minecraft.server.v1_16_R1.EntityPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_16_R1.CraftServer; +import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((EntityPlayer) player).getAdvancementData().a(); // stops listening + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); + AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); + } + +} diff --git a/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/PlayerUtilsImpl.java b/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..39af093 --- /dev/null +++ b/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/PlayerUtilsImpl.java @@ -0,0 +1,42 @@ +package de.studiocode.inventoryaccess.v1_16_R2.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.v1_16_R2.AdvancementDataPlayer; +import net.minecraft.server.v1_16_R2.AdvancementDataWorld; +import net.minecraft.server.v1_16_R2.EntityPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_16_R2.CraftServer; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((EntityPlayer) player).getAdvancementData().a(); // stops listening + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); + AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); + } + +} diff --git a/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/PlayerUtilsImpl.java b/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..f87c36c --- /dev/null +++ b/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/PlayerUtilsImpl.java @@ -0,0 +1,42 @@ +package de.studiocode.inventoryaccess.v1_16_R3.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.v1_16_R3.AdvancementDataPlayer; +import net.minecraft.server.v1_16_R3.AdvancementDataWorld; +import net.minecraft.server.v1_16_R3.EntityPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_16_R3.CraftServer; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((EntityPlayer) player).getAdvancementData().a(); // stops listening + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); + AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); + } + +} diff --git a/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/PlayerUtilsImpl.java b/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..15ce8b6 --- /dev/null +++ b/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/PlayerUtilsImpl.java @@ -0,0 +1,42 @@ +package de.studiocode.inventoryaccess.v1_17_R1.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.ServerAdvancementManager; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_17_R1.CraftServer; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(PlayerAdvancements.class, true, "b", ServerAdvancementManager.class); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((ServerPlayer) player).getAdvancements().stopListening(); + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements(); + ServerAdvancementManager manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancements(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); + } + +} \ No newline at end of file diff --git a/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/PlayerUtilsImpl.java b/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..e785cea --- /dev/null +++ b/InventoryAccess/1_17_R2/src/main/java/de/studiocode/inventoryaccess/v1_17_R2/util/PlayerUtilsImpl.java @@ -0,0 +1,42 @@ +package de.studiocode.inventoryaccess.v1_17_R2.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.ServerAdvancementManager; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_17_R1.CraftServer; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Method; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(PlayerAdvancements.class, true, "b", ServerAdvancementManager.class); + + @Override + public void stopAdvancementListening(Player player) { + stopAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void stopAdvancementListening(Object player) { + ((ServerPlayer) player).getAdvancements().stopListening(); + } + + @Override + public void startAdvancementListening(Player player) { + startAdvancementListening(((CraftPlayer) player).getHandle()); + } + + @Override + public void startAdvancementListening(Object player) { + PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements(); + ServerAdvancementManager manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancements(); + ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); + } + +} diff --git a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/PlayerUtils.java b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/PlayerUtils.java new file mode 100644 index 0000000..d33aa2e --- /dev/null +++ b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/abstraction/util/PlayerUtils.java @@ -0,0 +1,35 @@ +package de.studiocode.inventoryaccess.abstraction.util; + +import org.bukkit.entity.Player; + +public interface PlayerUtils { + + /** + * Stops the advancement listener for a {@link Player} + * + * @param player The {@link Player} + */ + void stopAdvancementListening(Player player); + + /** + * Stops the advancement listener for a player + * + * @param player The player + */ + void stopAdvancementListening(Object player); + + /** + * Starts the advancement listener for a {@link Player} + * + * @param player The {@link Player} + */ + void startAdvancementListening(Player player); + + /** + * Stops the advancement listener for a player + * + * @param player The player + */ + void startAdvancementListening(Object player); + +} diff --git a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/util/ReflectionUtils.java b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/util/ReflectionUtils.java index 24a91c5..2d5a7b2 100644 --- a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/util/ReflectionUtils.java +++ b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/util/ReflectionUtils.java @@ -106,7 +106,9 @@ public class ReflectionUtils { public static Method getMethod(Class clazz, boolean declared, String name, Class... parameterTypes) { try { - return declared ? clazz.getDeclaredMethod(name, parameterTypes) : clazz.getMethod(name, parameterTypes); + Method method = declared ? clazz.getDeclaredMethod(name, parameterTypes) : clazz.getMethod(name, parameterTypes); + if (declared) method.setAccessible(true); + return method; } catch (NoSuchMethodException e) { e.printStackTrace(); } diff --git a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccess.java b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccess.java index b55f211..c7d001c 100644 --- a/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccess.java +++ b/InventoryAccess/abstraction/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccess.java @@ -3,6 +3,7 @@ package de.studiocode.inventoryaccess.version; import de.studiocode.inventoryaccess.abstraction.inventory.AnvilInventory; import de.studiocode.inventoryaccess.abstraction.util.InventoryUtils; import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; import de.studiocode.inventoryaccess.util.ReflectionUtils; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.entity.Player; @@ -14,6 +15,7 @@ public class InventoryAccess { private static final Class INVENTORY_UTILS_CLASS = ReflectionUtils.getImplClass("util.InventoryUtilsImpl"); private static final Class ITEM_UTILS_CLASS = ReflectionUtils.getImplClass("util.ItemUtilsImpl"); + private static final Class PLAYER_UTILS_CLASS = ReflectionUtils.getImplClass("util.PlayerUtilsImpl"); private static final Class ANVIL_INVENTORY_CLASS = ReflectionUtils.getImplClass("inventory.AnvilInventoryImpl"); private static final Constructor ANVIL_INVENTORY_CONSTRUCTOR @@ -21,6 +23,7 @@ public class InventoryAccess { private static final InventoryUtils INVENTORY_UTILS = ReflectionUtils.constructEmpty(INVENTORY_UTILS_CLASS); private static final ItemUtils ITEM_UTILS = ReflectionUtils.constructEmpty(ITEM_UTILS_CLASS); + private static final PlayerUtils PLAYER_UTILS = ReflectionUtils.constructEmpty(PLAYER_UTILS_CLASS); /** * Gets the {@link InventoryUtils} @@ -40,6 +43,15 @@ public class InventoryAccess { return ITEM_UTILS; } + /** + * Gets the {@link PlayerUtils} + * + * @return The {@link PlayerUtils} + */ + public static PlayerUtils getPlayerUtils() { + return PLAYER_UTILS; + } + /** * Creates a new {@link AnvilInventory}. *