Prevent players from receiving advancements through merged windows

This commit is contained in:
NichtStudioCode 2021-08-21 22:10:46 +02:00
parent 4b945d903b
commit 82ba871ae3
11 changed files with 343 additions and 1 deletions

@ -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

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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);
}

@ -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();
}

@ -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<InventoryUtils> INVENTORY_UTILS_CLASS = ReflectionUtils.getImplClass("util.InventoryUtilsImpl");
private static final Class<ItemUtils> ITEM_UTILS_CLASS = ReflectionUtils.getImplClass("util.ItemUtilsImpl");
private static final Class<PlayerUtils> PLAYER_UTILS_CLASS = ReflectionUtils.getImplClass("util.PlayerUtilsImpl");
private static final Class<AnvilInventory> ANVIL_INVENTORY_CLASS = ReflectionUtils.getImplClass("inventory.AnvilInventoryImpl");
private static final Constructor<AnvilInventory> 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}.
*