Fix several incompatibilities with 1.14

This commit introduces support for 1.14.0, 1.14.1, 1.14.2 and 1.14.3 with the new inventory-access-r1 and inventory-access-r2 modules. All subsequent revisions have been pushed down by two versions. (ex.: inventory-access-r15 is inventory-access-r17 now)

Other changes include:
- Introduced ItemUtils#setSkullGameProfile inventory-access method
- Removed all usages of fastutil classes, as those are relocated to a different path on older versions and therefore not accessible
- Removed all usages of Material#isAir and ClickType#SWAP_OFFHAND, as those did not exist in 1.14
- invui-core now depends on spigot 1.14 instead of 1.20.2. This should prevent any future issues regarding the usage of methods and properties that have only been introduced later
This commit is contained in:
NichtStudioCode 2023-10-12 10:30:18 +02:00
parent 08411eba78
commit babad46e84
111 changed files with 2439 additions and 1073 deletions

@ -21,7 +21,7 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.14.4-R0.1-SNAPSHOT</version> <version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

@ -17,7 +17,7 @@ import java.lang.reflect.Field;
class CartographyInventoryImpl extends ContainerCartography implements CartographyInventory { class CartographyInventoryImpl extends ContainerCartography implements CartographyInventory {
private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(ContainerCartography.class, true, "resultInventory"); private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(ContainerCartography.class, true, "f");
private final InventoryCraftResult resultInventory = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this); private final InventoryCraftResult resultInventory = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this);
private final IChatBaseComponent title; private final IChatBaseComponent title;

@ -1,5 +1,6 @@
package xyz.xenondevs.inventoryaccess.r1; package xyz.xenondevs.inventoryaccess.r1;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_14_R1.ItemStack; import net.minecraft.server.v1_14_R1.ItemStack;
import net.minecraft.server.v1_14_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_14_R1.NBTCompressedStreamTools;
import net.minecraft.server.v1_14_R1.NBTTagCompound; import net.minecraft.server.v1_14_R1.NBTTagCompound;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Field CRAFT_META_SKULL_GAME_PROFILE_FIELD = ReflectionUtils.getField(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "profile"
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.setFieldValue(CRAFT_META_SKULL_GAME_PROFILE_FIELD, itemMeta, gameProfile);
}
} }

@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.19-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.18-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -10,11 +10,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_18_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r10; package xyz.xenondevs.inventoryaccess.r10;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_18_R1.CraftServer;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.19.1-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.18.2-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -186,4 +186,5 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
// empty // empty
} }
} }

@ -10,11 +10,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_18_R2.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r11; package xyz.xenondevs.inventoryaccess.r11;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_18_R2.CraftServer;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.19.3-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.19-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -186,4 +186,5 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
// empty // empty
} }
} }

@ -10,11 +10,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_19_R2.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r12; package xyz.xenondevs.inventoryaccess.r12;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_19_R2.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.19.4-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.19.1-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -10,11 +10,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_19_R3.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r13; package xyz.xenondevs.inventoryaccess.r13;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_19_R3.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -92,7 +92,7 @@ class PlayerUtilsImpl implements PlayerUtils {
force, force,
InventoryUtilsImpl.createNMSComponent(prompt) InventoryUtilsImpl.createNMSComponent(prompt)
); );
serverPlayer.connection.send(packet); serverPlayer.connection.connection.send(packet);
} }
} }

@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.20-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.19.3-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -30,6 +30,7 @@ import java.util.function.Consumer;
class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory { class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
private final Component title;
private final List<Consumer<String>> renameHandlers; private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view; private final CraftInventoryView view;
private final ServerPlayer player; private final ServerPlayer player;
@ -43,9 +44,9 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) { public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) {
super(player.nextContainerCounter(), player.getInventory(), super(player.nextContainerCounter(), player.getInventory(),
ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0))); ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0)));
setTitle(title); this.title = title;
this.renameHandlers = renameHandlers; this.renameHandlers = renameHandlers;
this.player = player; this.player = player;
@ -64,7 +65,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
player.containerMenu = this; player.containerMenu = this;
// send open packet // send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, getTitle())); player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
@ -141,7 +142,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
* @param s The new rename text * @param s The new rename text
*/ */
@Override @Override
public boolean setItemName(String s) { public void setItemName(String s) {
// save rename text // save rename text
text = s; text = s;
@ -149,10 +150,8 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
if (renameHandlers != null) if (renameHandlers != null)
renameHandlers.forEach(handler -> handler.accept(s)); renameHandlers.forEach(handler -> handler.accept(s));
// the client expects the item to change to its new name and removes it from the inventory, so it needs to be sent again // the client expects the item to change to it's new name and removes it from the inventory, so it needs to be sent again
sendItem(2); sendItem(2);
return false;
} }
/** /**

@ -10,17 +10,17 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.CartographyInventory; import xyz.xenondevs.inventoryaccess.abstraction.inventory.CartographyInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import net.minecraft.world.entity.player.Player;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -39,12 +39,12 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
private boolean open; private boolean open;
public CartographyInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title) { public CartographyInventoryImpl(Player player, @NotNull ComponentWrapper title) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title)); this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title));
} }
public CartographyInventoryImpl(ServerPlayer player, Component title) { public CartographyInventoryImpl(ServerPlayer player, Component title) {
super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0))); super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0)));
this.player = player; this.player = player;
this.title = title; this.title = title;
@ -115,7 +115,7 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
@Override @Override
public ItemStack quickMoveStack(Player player, int i) { public ItemStack quickMoveStack(net.minecraft.world.entity.player.Player entityhuman, int i) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@ -125,12 +125,12 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
@Override @Override
public boolean stillValid(Player player) { public boolean stillValid(net.minecraft.world.entity.player.Player entityhuman) {
return true; return true;
} }
@Override @Override
protected void clearContainer(Player player, Container container) { protected void clearContainer(net.minecraft.world.entity.player.Player entityhuman, Container container) {
// empty // empty
} }

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_20_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_19_R2.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r14; package xyz.xenondevs.inventoryaccess.r14;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_20_R1.CraftServer; import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -92,7 +92,7 @@ class PlayerUtilsImpl implements PlayerUtils {
force, force,
InventoryUtilsImpl.createNMSComponent(prompt) InventoryUtilsImpl.createNMSComponent(prompt)
); );
serverPlayer.connection.send(packet); serverPlayer.connection.connection.send(packet);
} }
} }

@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.20.2-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.19.4-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -30,6 +30,7 @@ import java.util.function.Consumer;
class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory { class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
private final Component title;
private final List<Consumer<String>> renameHandlers; private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view; private final CraftInventoryView view;
private final ServerPlayer player; private final ServerPlayer player;
@ -43,9 +44,9 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) { public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) {
super(player.nextContainerCounter(), player.getInventory(), super(player.nextContainerCounter(), player.getInventory(),
ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0))); ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0)));
setTitle(title); this.title = title;
this.renameHandlers = renameHandlers; this.renameHandlers = renameHandlers;
this.player = player; this.player = player;
@ -64,7 +65,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
player.containerMenu = this; player.containerMenu = this;
// send open packet // send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, getTitle())); player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
@ -141,7 +142,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
* @param s The new rename text * @param s The new rename text
*/ */
@Override @Override
public boolean setItemName(String s) { public void setItemName(String s) {
// save rename text // save rename text
text = s; text = s;
@ -149,10 +150,8 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
if (renameHandlers != null) if (renameHandlers != null)
renameHandlers.forEach(handler -> handler.accept(s)); renameHandlers.forEach(handler -> handler.accept(s));
// the client expects the item to change to its new name and removes it from the inventory, so it needs to be sent again // the client expects the item to change to it's new name and removes it from the inventory, so it needs to be sent again
sendItem(2); sendItem(2);
return false;
} }
/** /**

@ -10,17 +10,17 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.CartographyInventory; import xyz.xenondevs.inventoryaccess.abstraction.inventory.CartographyInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import net.minecraft.world.entity.player.Player;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -39,12 +39,12 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
private boolean open; private boolean open;
public CartographyInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title) { public CartographyInventoryImpl(Player player, @NotNull ComponentWrapper title) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title)); this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title));
} }
public CartographyInventoryImpl(ServerPlayer player, Component title) { public CartographyInventoryImpl(ServerPlayer player, Component title) {
super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0))); super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0)));
this.player = player; this.player = player;
this.title = title; this.title = title;
@ -115,7 +115,7 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
@Override @Override
public ItemStack quickMoveStack(Player player, int i) { public ItemStack quickMoveStack(net.minecraft.world.entity.player.Player entityhuman, int i) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@ -125,12 +125,12 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
@Override @Override
public boolean stillValid(Player player) { public boolean stillValid(net.minecraft.world.entity.player.Player entityhuman) {
return true; return true;
} }
@Override @Override
protected void clearContainer(Player player, Container container) { protected void clearContainer(net.minecraft.world.entity.player.Player entityhuman, Container container) {
// empty // empty
} }

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_20_R2.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_19_R3.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r15; package xyz.xenondevs.inventoryaccess.r15;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -1,15 +1,15 @@
package xyz.xenondevs.inventoryaccess.r15; package xyz.xenondevs.inventoryaccess.r15;
import net.minecraft.network.protocol.common.ClientboundResourcePackPacket;
import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
import net.minecraft.network.protocol.game.ClientboundResourcePackPacket;
import net.minecraft.server.PlayerAdvancements; import net.minecraft.server.PlayerAdvancements;
import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.ServerAdvancementManager;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_20_R2.CraftServer; import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>xyz.xenondevs.invui</groupId>
<artifactId>invui-parent</artifactId>
<version>1.20</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>inventory-access-r16</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.20-R0.1-SNAPSHOT</spigot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>${spigot.version}</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>xyz.xenondevs.invui</groupId>
<artifactId>inventory-access</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>xyz.xenondevs.string-remapper</groupId>
<artifactId>string-remapper-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<id>remap-spigot</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<spigotVersion>${spigot.version}</spigotVersion>
<goal>spigot</goal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-spigot</classesOut>
</configuration>
</execution>
<execution>
<id>remap-mojang</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<spigotVersion>${spigot.version}</spigotVersion>
<goal>mojang</goal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-mojang</classesOut>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
<execution>
<id>spigot</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-spigot</classesDirectory>
</configuration>
</execution>
<execution>
<id>mojang</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-mojang</classesDirectory>
<classifier>remapped-mojang</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-mojang</remappedDependencies>
<remappedArtifactAttached>false</remappedArtifactAttached>
<finalName>${project.artifactId}-${project.version}-remapped-obf</finalName>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-spigot</id>
<configuration>
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,190 @@
package xyz.xenondevs.inventoryaccess.r16;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.AnvilInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import java.util.List;
import java.util.function.Consumer;
class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view;
private final ServerPlayer player;
private String text;
private boolean open;
public AnvilInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title, List<Consumer<String>> renameHandlers) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandlers);
}
public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) {
super(player.nextContainerCounter(), player.getInventory(),
ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0)));
setTitle(title);
this.renameHandlers = renameHandlers;
this.player = player;
CraftInventoryAnvil inventory = new CraftInventoryAnvil(access.getLocation(),
inputSlots, resultSlots, this);
this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
}
public void open() {
open = true;
// call the InventoryOpenEvent
CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container
player.containerMenu = this;
// send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, getTitle()));
// send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY));
// init menu
player.initMenu(this);
}
public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(getActiveWindowId(player), incrementStateId(), slot, getItem(slot)));
}
public void setItem(int slot, ItemStack item) {
if (slot < 2) inputSlots.setItem(slot, item);
else resultSlots.setItem(0, item);
if (open) sendItem(slot);
}
private ItemStack getItem(int slot) {
if (slot < 2) return inputSlots.getItem(slot);
else return resultSlots.getItem(0);
}
private int getActiveWindowId(ServerPlayer player) {
AbstractContainerMenu container = player.containerMenu;
return container == null ? -1 : container.containerId;
}
@Override
public void setItem(int slot, org.bukkit.inventory.ItemStack itemStack) {
setItem(slot, CraftItemStack.asNMSCopy(itemStack));
}
@Override
public @NotNull Inventory getBukkitInventory() {
return view.getTopInventory();
}
@Override
public String getRenameText() {
return text;
}
@Override
public boolean isOpen() {
return open;
}
// --- AnvilMenu ---
@Override
public CraftInventoryView getBukkitView() {
return view;
}
/**
* Called every tick to see if the {@link Player} can still use that container.
* (Used to for checking the distance between the {@link Player} and the container
* and closing the window when the distance gets too big.)
*
* @param player The {@link Player}
* @return If the {@link Player} can still use that container
*/
@Override
public boolean stillValid(Player player) {
return true;
}
/**
* Called when the rename text gets changed.
*
* @param s The new rename text
*/
@Override
public boolean setItemName(String s) {
// save rename text
text = s;
// call rename handlers
if (renameHandlers != null)
renameHandlers.forEach(handler -> handler.accept(s));
// the client expects the item to change to its new name and removes it from the inventory, so it needs to be sent again
sendItem(2);
return false;
}
/**
* Called when the container is closed to give the items back.
*
* @param player The {@link Player} that closed this container
*/
@Override
public void removed(Player player) {
open = false;
}
/**
* Called when the container gets closed to put items back into a players
* inventory or drop them in the world.
*
* @param player The {@link Player} that closed this container
* @param container The container
*/
@Override
protected void clearContainer(Player player, Container container) {
open = false;
}
/**
* Called when both items in the {@link AnvilMenu#inputSlots} were set to create
* the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}.
*/
@Override
public void createResult() {
// empty
}
}

@ -0,0 +1,137 @@
package xyz.xenondevs.inventoryaccess.r16;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.CartographyInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import net.minecraft.world.entity.player.Player;
import java.lang.reflect.Field;
class CartographyInventoryImpl extends CartographyTableMenu implements CartographyInventory {
private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(
CartographyTableMenu.class,
true,
"SRF(net.minecraft.world.inventory.CartographyTableMenu resultContainer)"
);
private final ResultContainer resultContainer = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this);
private final Component title;
private final CraftInventoryView view;
private final ServerPlayer player;
private boolean open;
public CartographyInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title));
}
public CartographyInventoryImpl(ServerPlayer player, Component title) {
super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0)));
this.player = player;
this.title = title;
CraftInventoryCartography inventory = new CraftInventoryCartography(container, resultContainer);
view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
}
public void open() {
open = true;
// call the InventoryOpenEvent
CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container
player.containerMenu = this;
// send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.CARTOGRAPHY_TABLE, title));
// send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY));
// init menu
player.initMenu(this);
}
@Override
public boolean isOpen() {
return open;
}
public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, incrementStateId(), getItem(slot)));
}
public void setItem(int slot, ItemStack item) {
if (slot < 2) container.setItem(slot, item);
else resultContainer.setItem(0, item);
if (open) sendItem(slot);
}
private ItemStack getItem(int slot) {
if (slot < 2) return container.getItem(slot);
else return resultContainer.getItem(0);
}
@Override
public void setItem(int slot, org.bukkit.inventory.ItemStack itemStack) {
setItem(slot, CraftItemStack.asNMSCopy(itemStack));
}
@Override
public Inventory getBukkitInventory() {
return view.getTopInventory();
}
// --- CartographyTableMenu ---
@Override
public CraftInventoryView getBukkitView() {
return view;
}
@Override
public void slotsChanged(Container container) {
}
@Override
public ItemStack quickMoveStack(Player player, int i) {
return ItemStack.EMPTY;
}
@Override
public boolean canTakeItemForPickAll(ItemStack itemstack, Slot slot) {
return true;
}
@Override
public boolean stillValid(Player player) {
return true;
}
@Override
protected void clearContainer(Player player, Container container) {
// empty
}
}

@ -0,0 +1,73 @@
package xyz.xenondevs.inventoryaccess.r16;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_20_R1.util.CraftChatMessage;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.abstraction.util.InventoryUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
class InventoryUtilsImpl implements InventoryUtils {
public static Component createNMSComponent(ComponentWrapper component) {
if (component == null) return null;
return CraftChatMessage.fromJSON(component.serializeToJson());
}
public static int getActiveWindowId(ServerPlayer player) {
AbstractContainerMenu container = player.containerMenu;
return container == null ? -1 : container.containerId;
}
@Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory) {
openCustomInventory(player, inventory, null);
}
@Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
MenuType<?> menuType = CraftContainer.getNotchInventoryType(inventory);
if (serverPlayer.connection != null) {
AbstractContainerMenu menu = new CraftContainer(inventory, serverPlayer, serverPlayer.nextContainerCounter());
menu = CraftEventFactory.callInventoryOpenEvent(serverPlayer, menu);
if (menu != null) {
Container container = ((CraftInventory) inventory).getInventory();
Component titleComponent;
if (title == null) {
if (container instanceof MenuProvider)
titleComponent = ((MenuProvider) container).getDisplayName();
else titleComponent = CraftChatMessage.fromString(menu.getBukkitView().getTitle())[0];
} else titleComponent = createNMSComponent(title);
menu.checkReachable = false;
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menuType, titleComponent));
serverPlayer.containerMenu = menu;
serverPlayer.initMenu(menu);
}
}
}
@Override
public void updateOpenInventoryTitle(@NotNull Player player, @NotNull ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
AbstractContainerMenu menu = serverPlayer.containerMenu;
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), createNMSComponent(title)));
serverPlayer.initMenu(menu);
}
}

@ -0,0 +1,102 @@
package xyz.xenondevs.inventoryaccess.r16;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
serializeItemStack(itemStack, out, compressed);
return out.toByteArray();
}
@Override
public void serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, @NotNull OutputStream outputStream, boolean compressed) {
try {
ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
CompoundTag nbt = nmsStack.save(new CompoundTag());
if (compressed) {
NbtIo.writeCompressed(nbt, outputStream);
} else {
DataOutputStream dataOut = new DataOutputStream(outputStream);
NbtIo.write(nbt, dataOut);
}
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public org.bukkit.inventory.ItemStack deserializeItemStack(byte[] data, boolean compressed) {
ByteArrayInputStream in = new ByteArrayInputStream(data);
return deserializeItemStack(in, compressed);
}
@Override
public org.bukkit.inventory.ItemStack deserializeItemStack(@NotNull InputStream inputStream, boolean compressed) {
try {
CompoundTag nbt;
if (compressed) {
nbt = NbtIo.readCompressed(inputStream);
} else {
DataInputStream dataIn = new DataInputStream(inputStream);
nbt = NbtIo.read(dataIn);
}
ItemStack itemStack = ItemStack.of(nbt);
return CraftItemStack.asCraftMirror(itemStack);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public void setDisplayName(@NotNull ItemMeta itemMeta, @NotNull ComponentWrapper name) {
ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD,
itemMeta,
name.serializeToJson()
);
}
@Override
public void setLore(@NotNull ItemMeta itemMeta, @NotNull List<@NotNull ComponentWrapper> lore) {
ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD,
itemMeta,
lore.stream().map(ComponentWrapper::serializeToJson).collect(Collectors.toList())
);
}
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
}

@ -0,0 +1,98 @@
package xyz.xenondevs.inventoryaccess.r16;
import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
import net.minecraft.network.protocol.game.ClientboundResourcePackPacket;
import net.minecraft.server.PlayerAdvancements;
import net.minecraft.server.ServerAdvancementManager;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.abstraction.util.PlayerUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.map.MapIcon;
import xyz.xenondevs.inventoryaccess.map.MapPatch;
import xyz.xenondevs.inventoryaccess.util.DataUtils;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod(
PlayerAdvancements.class,
true,
"ASRM(net/minecraft/server/PlayerAdvancements.registerListeners(Lnet/minecraft/server/ServerAdvancementManager;)V)",
ServerAdvancementManager.class
);
@Override
public void stopAdvancementListening(@NotNull Player player) {
stopAdvancementListening(((CraftPlayer) player).getHandle());
}
@Override
public void stopAdvancementListening(@NotNull Object player) {
((ServerPlayer) player).getAdvancements().stopListening();
}
@Override
public void startAdvancementListening(@NotNull Player player) {
startAdvancementListening(((CraftPlayer) player).getHandle());
}
@Override
public void startAdvancementListening(@NotNull Object player) {
PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements();
ServerAdvancementManager manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancements();
ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager);
}
@Override
public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<MapIcon> icons) {
List<MapDecoration> decorations = icons != null ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new)) : null;
MapItemSavedData.MapPatch patch = toMapPatch(mapPatch);
ClientboundMapItemDataPacket packet = new ClientboundMapItemDataPacket(mapId, scale, locked, decorations, patch);
((CraftPlayer) player).getHandle().connection.send(packet);
}
private MapDecoration toMapDecoration(MapIcon icon) {
return new MapDecoration(
MapDecoration.Type.byIcon(icon.getType().getId()),
icon.getX(), icon.getY(),
icon.getRot(),
icon.getComponent() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponent()) : null
);
}
private MapItemSavedData.MapPatch toMapPatch(MapPatch patch) {
if (patch == null) return null;
return new MapItemSavedData.MapPatch(
patch.getStartX(), patch.getStartY(),
patch.getWidth(), patch.getHeight(),
patch.getColors()
);
}
@Override
public void sendResourcePack(@NotNull Player player, @NotNull String url, byte[] hash, @Nullable ComponentWrapper prompt, boolean force) {
var serverPlayer = ((CraftPlayer) player).getHandle();
var packet = new ClientboundResourcePackPacket(
url,
DataUtils.toHexadecimalString(hash),
force,
InventoryUtilsImpl.createNMSComponent(prompt)
);
serverPlayer.connection.send(packet);
}
}

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>xyz.xenondevs.invui</groupId>
<artifactId>invui-parent</artifactId>
<version>1.20</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>inventory-access-r17</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.20.2-R0.1-SNAPSHOT</spigot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>${spigot.version}</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>xyz.xenondevs.invui</groupId>
<artifactId>inventory-access</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>xyz.xenondevs.string-remapper</groupId>
<artifactId>string-remapper-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<id>remap-spigot</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<spigotVersion>${spigot.version}</spigotVersion>
<goal>spigot</goal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-spigot</classesOut>
</configuration>
</execution>
<execution>
<id>remap-mojang</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<spigotVersion>${spigot.version}</spigotVersion>
<goal>mojang</goal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-mojang</classesOut>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
<execution>
<id>spigot</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-spigot</classesDirectory>
</configuration>
</execution>
<execution>
<id>mojang</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-mojang</classesDirectory>
<classifier>remapped-mojang</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-mojang</remappedDependencies>
<remappedArtifactAttached>false</remappedArtifactAttached>
<finalName>${project.artifactId}-${project.version}-remapped-obf</finalName>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-spigot</id>
<configuration>
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,190 @@
package xyz.xenondevs.inventoryaccess.r17;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.AnvilInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import java.util.List;
import java.util.function.Consumer;
class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view;
private final ServerPlayer player;
private String text;
private boolean open;
public AnvilInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title, List<Consumer<String>> renameHandlers) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandlers);
}
public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) {
super(player.nextContainerCounter(), player.getInventory(),
ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0)));
setTitle(title);
this.renameHandlers = renameHandlers;
this.player = player;
CraftInventoryAnvil inventory = new CraftInventoryAnvil(access.getLocation(),
inputSlots, resultSlots, this);
this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
}
public void open() {
open = true;
// call the InventoryOpenEvent
CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container
player.containerMenu = this;
// send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, getTitle()));
// send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY));
// init menu
player.initMenu(this);
}
public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(getActiveWindowId(player), incrementStateId(), slot, getItem(slot)));
}
public void setItem(int slot, ItemStack item) {
if (slot < 2) inputSlots.setItem(slot, item);
else resultSlots.setItem(0, item);
if (open) sendItem(slot);
}
private ItemStack getItem(int slot) {
if (slot < 2) return inputSlots.getItem(slot);
else return resultSlots.getItem(0);
}
private int getActiveWindowId(ServerPlayer player) {
AbstractContainerMenu container = player.containerMenu;
return container == null ? -1 : container.containerId;
}
@Override
public void setItem(int slot, org.bukkit.inventory.ItemStack itemStack) {
setItem(slot, CraftItemStack.asNMSCopy(itemStack));
}
@Override
public @NotNull Inventory getBukkitInventory() {
return view.getTopInventory();
}
@Override
public String getRenameText() {
return text;
}
@Override
public boolean isOpen() {
return open;
}
// --- AnvilMenu ---
@Override
public CraftInventoryView getBukkitView() {
return view;
}
/**
* Called every tick to see if the {@link Player} can still use that container.
* (Used to for checking the distance between the {@link Player} and the container
* and closing the window when the distance gets too big.)
*
* @param player The {@link Player}
* @return If the {@link Player} can still use that container
*/
@Override
public boolean stillValid(Player player) {
return true;
}
/**
* Called when the rename text gets changed.
*
* @param s The new rename text
*/
@Override
public boolean setItemName(String s) {
// save rename text
text = s;
// call rename handlers
if (renameHandlers != null)
renameHandlers.forEach(handler -> handler.accept(s));
// the client expects the item to change to its new name and removes it from the inventory, so it needs to be sent again
sendItem(2);
return false;
}
/**
* Called when the container is closed to give the items back.
*
* @param player The {@link Player} that closed this container
*/
@Override
public void removed(Player player) {
open = false;
}
/**
* Called when the container gets closed to put items back into a players
* inventory or drop them in the world.
*
* @param player The {@link Player} that closed this container
* @param container The container
*/
@Override
protected void clearContainer(Player player, Container container) {
open = false;
}
/**
* Called when both items in the {@link AnvilMenu#inputSlots} were set to create
* the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}.
*/
@Override
public void createResult() {
// empty
}
}

@ -0,0 +1,137 @@
package xyz.xenondevs.inventoryaccess.r17;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.CartographyInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import net.minecraft.world.entity.player.Player;
import java.lang.reflect.Field;
class CartographyInventoryImpl extends CartographyTableMenu implements CartographyInventory {
private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(
CartographyTableMenu.class,
true,
"SRF(net.minecraft.world.inventory.CartographyTableMenu resultContainer)"
);
private final ResultContainer resultContainer = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this);
private final Component title;
private final CraftInventoryView view;
private final ServerPlayer player;
private boolean open;
public CartographyInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title));
}
public CartographyInventoryImpl(ServerPlayer player, Component title) {
super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level(), new BlockPos(0, 0, 0)));
this.player = player;
this.title = title;
CraftInventoryCartography inventory = new CraftInventoryCartography(container, resultContainer);
view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
}
public void open() {
open = true;
// call the InventoryOpenEvent
CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container
player.containerMenu = this;
// send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.CARTOGRAPHY_TABLE, title));
// send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY));
// init menu
player.initMenu(this);
}
@Override
public boolean isOpen() {
return open;
}
public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, incrementStateId(), getItem(slot)));
}
public void setItem(int slot, ItemStack item) {
if (slot < 2) container.setItem(slot, item);
else resultContainer.setItem(0, item);
if (open) sendItem(slot);
}
private ItemStack getItem(int slot) {
if (slot < 2) return container.getItem(slot);
else return resultContainer.getItem(0);
}
@Override
public void setItem(int slot, org.bukkit.inventory.ItemStack itemStack) {
setItem(slot, CraftItemStack.asNMSCopy(itemStack));
}
@Override
public Inventory getBukkitInventory() {
return view.getTopInventory();
}
// --- CartographyTableMenu ---
@Override
public CraftInventoryView getBukkitView() {
return view;
}
@Override
public void slotsChanged(Container container) {
}
@Override
public ItemStack quickMoveStack(Player player, int i) {
return ItemStack.EMPTY;
}
@Override
public boolean canTakeItemForPickAll(ItemStack itemstack, Slot slot) {
return true;
}
@Override
public boolean stillValid(Player player) {
return true;
}
@Override
protected void clearContainer(Player player, Container container) {
// empty
}
}

@ -0,0 +1,73 @@
package xyz.xenondevs.inventoryaccess.r17;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_20_R2.util.CraftChatMessage;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.abstraction.util.InventoryUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
class InventoryUtilsImpl implements InventoryUtils {
public static Component createNMSComponent(ComponentWrapper component) {
if (component == null) return null;
return CraftChatMessage.fromJSON(component.serializeToJson());
}
public static int getActiveWindowId(ServerPlayer player) {
AbstractContainerMenu container = player.containerMenu;
return container == null ? -1 : container.containerId;
}
@Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory) {
openCustomInventory(player, inventory, null);
}
@Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
MenuType<?> menuType = CraftContainer.getNotchInventoryType(inventory);
if (serverPlayer.connection != null) {
AbstractContainerMenu menu = new CraftContainer(inventory, serverPlayer, serverPlayer.nextContainerCounter());
menu = CraftEventFactory.callInventoryOpenEvent(serverPlayer, menu);
if (menu != null) {
Container container = ((CraftInventory) inventory).getInventory();
Component titleComponent;
if (title == null) {
if (container instanceof MenuProvider)
titleComponent = ((MenuProvider) container).getDisplayName();
else titleComponent = CraftChatMessage.fromString(menu.getBukkitView().getTitle())[0];
} else titleComponent = createNMSComponent(title);
menu.checkReachable = false;
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menuType, titleComponent));
serverPlayer.containerMenu = menu;
serverPlayer.initMenu(menu);
}
}
}
@Override
public void updateOpenInventoryTitle(@NotNull Player player, @NotNull ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
AbstractContainerMenu menu = serverPlayer.containerMenu;
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), createNMSComponent(title)));
serverPlayer.initMenu(menu);
}
}

@ -0,0 +1,102 @@
package xyz.xenondevs.inventoryaccess.r17;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
serializeItemStack(itemStack, out, compressed);
return out.toByteArray();
}
@Override
public void serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, @NotNull OutputStream outputStream, boolean compressed) {
try {
ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
CompoundTag nbt = nmsStack.save(new CompoundTag());
if (compressed) {
NbtIo.writeCompressed(nbt, outputStream);
} else {
DataOutputStream dataOut = new DataOutputStream(outputStream);
NbtIo.write(nbt, dataOut);
}
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public org.bukkit.inventory.ItemStack deserializeItemStack(byte[] data, boolean compressed) {
ByteArrayInputStream in = new ByteArrayInputStream(data);
return deserializeItemStack(in, compressed);
}
@Override
public org.bukkit.inventory.ItemStack deserializeItemStack(@NotNull InputStream inputStream, boolean compressed) {
try {
CompoundTag nbt;
if (compressed) {
nbt = NbtIo.readCompressed(inputStream);
} else {
DataInputStream dataIn = new DataInputStream(inputStream);
nbt = NbtIo.read(dataIn);
}
ItemStack itemStack = ItemStack.of(nbt);
return CraftItemStack.asCraftMirror(itemStack);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public void setDisplayName(@NotNull ItemMeta itemMeta, @NotNull ComponentWrapper name) {
ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD,
itemMeta,
name.serializeToJson()
);
}
@Override
public void setLore(@NotNull ItemMeta itemMeta, @NotNull List<@NotNull ComponentWrapper> lore) {
ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD,
itemMeta,
lore.stream().map(ComponentWrapper::serializeToJson).collect(Collectors.toList())
);
}
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
}

@ -0,0 +1,98 @@
package xyz.xenondevs.inventoryaccess.r17;
import net.minecraft.network.protocol.common.ClientboundResourcePackPacket;
import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
import net.minecraft.server.PlayerAdvancements;
import net.minecraft.server.ServerAdvancementManager;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.abstraction.util.PlayerUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.map.MapIcon;
import xyz.xenondevs.inventoryaccess.map.MapPatch;
import xyz.xenondevs.inventoryaccess.util.DataUtils;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod(
PlayerAdvancements.class,
true,
"ASRM(net/minecraft/server/PlayerAdvancements.registerListeners(Lnet/minecraft/server/ServerAdvancementManager;)V)",
ServerAdvancementManager.class
);
@Override
public void stopAdvancementListening(@NotNull Player player) {
stopAdvancementListening(((CraftPlayer) player).getHandle());
}
@Override
public void stopAdvancementListening(@NotNull Object player) {
((ServerPlayer) player).getAdvancements().stopListening();
}
@Override
public void startAdvancementListening(@NotNull Player player) {
startAdvancementListening(((CraftPlayer) player).getHandle());
}
@Override
public void startAdvancementListening(@NotNull Object player) {
PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements();
ServerAdvancementManager manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancements();
ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager);
}
@Override
public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<MapIcon> icons) {
List<MapDecoration> decorations = icons != null ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new)) : null;
MapItemSavedData.MapPatch patch = toMapPatch(mapPatch);
ClientboundMapItemDataPacket packet = new ClientboundMapItemDataPacket(mapId, scale, locked, decorations, patch);
((CraftPlayer) player).getHandle().connection.send(packet);
}
private MapDecoration toMapDecoration(MapIcon icon) {
return new MapDecoration(
MapDecoration.Type.byIcon(icon.getType().getId()),
icon.getX(), icon.getY(),
icon.getRot(),
icon.getComponent() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponent()) : null
);
}
private MapItemSavedData.MapPatch toMapPatch(MapPatch patch) {
if (patch == null) return null;
return new MapItemSavedData.MapPatch(
patch.getStartX(), patch.getStartY(),
patch.getWidth(), patch.getHeight(),
patch.getColors()
);
}
@Override
public void sendResourcePack(@NotNull Player player, @NotNull String url, byte[] hash, @Nullable ComponentWrapper prompt, boolean force) {
var serverPlayer = ((CraftPlayer) player).getHandle();
var packet = new ClientboundResourcePackPacket(
url,
DataUtils.toHexadecimalString(hash),
force,
InventoryUtilsImpl.createNMSComponent(prompt)
);
serverPlayer.connection.send(packet);
}
}

@ -21,7 +21,7 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version> <version>1.14-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r2; package xyz.xenondevs.inventoryaccess.r2;
import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r2; package xyz.xenondevs.inventoryaccess.r2;
import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -49,7 +49,7 @@ class CartographyInventoryImpl extends ContainerCartography implements Cartograp
player.activeContainer = this; player.activeContainer = this;
// send open packet // send open packet
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY_TABLE, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.a, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.a, getItem(0), getItem(1), getItem(2));

@ -1,11 +1,12 @@
package xyz.xenondevs.inventoryaccess.r2; package xyz.xenondevs.inventoryaccess.r2;
import net.minecraft.server.v1_15_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -14,6 +15,28 @@ import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
class InventoryUtilsImpl implements InventoryUtils { class InventoryUtilsImpl implements InventoryUtils {
private static Containers<?> getNotchInventoryType(Inventory inventory) {
InventoryType type = inventory.getType();
if (type == InventoryType.CHEST) {
switch (inventory.getSize()) {
case 9:
return Containers.GENERIC_9X1;
case 18:
return Containers.GENERIC_9X2;
case 27:
return Containers.GENERIC_9X3;
case 36:
return Containers.GENERIC_9X4;
case 45:
return Containers.GENERIC_9X5;
case 54:
return Containers.GENERIC_9X6;
default:
throw new IllegalArgumentException("Unsupported custom inventory size " + inventory.getSize());
}
} else return CraftContainer.getNotchInventoryType(type);
}
public static IChatBaseComponent createNMSComponent(ComponentWrapper component) { public static IChatBaseComponent createNMSComponent(ComponentWrapper component) {
return IChatBaseComponent.ChatSerializer.a(component.serializeToJson()); return IChatBaseComponent.ChatSerializer.a(component.serializeToJson());
} }
@ -31,7 +54,7 @@ class InventoryUtilsImpl implements InventoryUtils {
@Override @Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) { public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) {
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
Containers<?> windowType = CraftContainer.getNotchInventoryType(inventory); Containers<?> windowType = getNotchInventoryType(inventory);
if (entityPlayer.playerConnection != null) { if (entityPlayer.playerConnection != null) {
Container container = new CraftContainer(inventory, entityPlayer, entityPlayer.nextContainerCounter()); Container container = new CraftContainer(inventory, entityPlayer, entityPlayer.nextContainerCounter());

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r2; package xyz.xenondevs.inventoryaccess.r2;
import net.minecraft.server.v1_15_R1.ItemStack; import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_15_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_14_R1.ItemStack;
import net.minecraft.server.v1_15_R1.NBTTagCompound; import net.minecraft.server.v1_14_R1.NBTCompressedStreamTools;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; import net.minecraft.server.v1_14_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Field CRAFT_META_SKULL_GAME_PROFILE_FIELD = ReflectionUtils.getField(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "profile"
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.setFieldValue(CRAFT_META_SKULL_GAME_PROFILE_FIELD, itemMeta, gameProfile);
}
} }

@ -1,10 +1,10 @@
package xyz.xenondevs.inventoryaccess.r2; package xyz.xenondevs.inventoryaccess.r2;
import net.minecraft.server.v1_15_R1.AdvancementDataPlayer; import net.minecraft.server.v1_14_R1.AdvancementDataPlayer;
import net.minecraft.server.v1_15_R1.EntityPlayer; import net.minecraft.server.v1_14_R1.EntityPlayer;
import net.minecraft.server.v1_15_R1.MapIcon; import net.minecraft.server.v1_14_R1.MapIcon;
import net.minecraft.server.v1_15_R1.PacketPlayOutMap; import net.minecraft.server.v1_14_R1.PacketPlayOutMap;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

@ -21,7 +21,7 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.16.1-R0.1-SNAPSHOT</version> <version>1.14.4-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

@ -1,28 +1,37 @@
package xyz.xenondevs.inventoryaccess.r3; package xyz.xenondevs.inventoryaccess.r3;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.AnvilInventory; import xyz.xenondevs.inventoryaccess.abstraction.inventory.AnvilInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory { class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
private static final Field CONTAINER_ACCESS_FIELD = ReflectionUtils.getField(ContainerAnvil.class, true, "containerAccess");
private static final Field REPAIR_INVENTORY_FIELD = ReflectionUtils.getField(ContainerAnvil.class, true, "repairInventory");
private static final Field RESULT_INVENTORY_FIELD = ReflectionUtils.getField(ContainerAnvil.class, true, "resultInventory");
private final IChatBaseComponent title; private final IChatBaseComponent title;
private final List<Consumer<String>> renameHandlers; private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view; private final CraftInventoryView view;
private final EntityPlayer player; private final EntityPlayer player;
private final IInventory repairInventory;
private final IInventory resultInventory;
private String text; private String text;
private boolean open; private boolean open;
@ -38,6 +47,10 @@ class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
this.renameHandlers = renameHandlers; this.renameHandlers = renameHandlers;
this.player = player; this.player = player;
repairInventory = ReflectionUtils.getFieldValue(REPAIR_INVENTORY_FIELD, this);
resultInventory = ReflectionUtils.getFieldValue(RESULT_INVENTORY_FIELD, this);
ContainerAccess containerAccess = ReflectionUtils.getFieldValue(CONTAINER_ACCESS_FIELD, this);
CraftInventoryAnvil inventory = new CraftInventoryAnvil(containerAccess.getLocation(), CraftInventoryAnvil inventory = new CraftInventoryAnvil(containerAccess.getLocation(),
repairInventory, resultInventory, this); repairInventory, resultInventory, this);
this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this); this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
@ -56,7 +69,7 @@ class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.ANVIL, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.ANVIL, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.a, getItem(0), getItem(1), getItem(2));
player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
} }
@ -146,7 +159,7 @@ class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
} }
/** /**
* Called when both items in the {@link ContainerAnvil#repairInventory} were set to create * Called when both items in the {@link AnvilInventoryImpl#repairInventory} were set to create
* the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}. * the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}.
*/ */
@Override @Override

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r3; package xyz.xenondevs.inventoryaccess.r3;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -49,10 +49,10 @@ class CartographyInventoryImpl extends ContainerCartography implements Cartograp
player.activeContainer = this; player.activeContainer = this;
// send open packet // send open packet
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY_TABLE, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.a, getItem(0), getItem(1), getItem(2));
player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
} }
@ -100,7 +100,7 @@ class CartographyInventoryImpl extends ContainerCartography implements Cartograp
@Override @Override
public ItemStack shiftClick(EntityHuman entityhuman, int i) { public ItemStack shiftClick(EntityHuman entityhuman, int i) {
return ItemStack.b; return ItemStack.a;
} }
@Override @Override

@ -1,12 +1,12 @@
package xyz.xenondevs.inventoryaccess.r3; package xyz.xenondevs.inventoryaccess.r3;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_14_R1.*;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_16_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -15,6 +15,28 @@ import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
class InventoryUtilsImpl implements InventoryUtils { class InventoryUtilsImpl implements InventoryUtils {
private static Containers<?> getNotchInventoryType(Inventory inventory) {
InventoryType type = inventory.getType();
if (type == InventoryType.CHEST) {
switch (inventory.getSize()) {
case 9:
return Containers.GENERIC_9X1;
case 18:
return Containers.GENERIC_9X2;
case 27:
return Containers.GENERIC_9X3;
case 36:
return Containers.GENERIC_9X4;
case 45:
return Containers.GENERIC_9X5;
case 54:
return Containers.GENERIC_9X6;
default:
throw new IllegalArgumentException("Unsupported custom inventory size " + inventory.getSize());
}
} else return CraftContainer.getNotchInventoryType(type);
}
public static IChatBaseComponent createNMSComponent(ComponentWrapper component) { public static IChatBaseComponent createNMSComponent(ComponentWrapper component) {
return IChatBaseComponent.ChatSerializer.a(component.serializeToJson()); return IChatBaseComponent.ChatSerializer.a(component.serializeToJson());
} }
@ -32,7 +54,7 @@ class InventoryUtilsImpl implements InventoryUtils {
@Override @Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) { public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) {
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
Containers<?> windowType = CraftContainer.getNotchInventoryType(inventory); Containers<?> windowType = getNotchInventoryType(inventory);
if (entityPlayer.playerConnection != null) { if (entityPlayer.playerConnection != null) {
Container container = new CraftContainer(inventory, entityPlayer, entityPlayer.nextContainerCounter()); Container container = new CraftContainer(inventory, entityPlayer, entityPlayer.nextContainerCounter());
@ -43,7 +65,7 @@ class InventoryUtilsImpl implements InventoryUtils {
if (title == null) { if (title == null) {
if (iinventory instanceof ITileInventory) if (iinventory instanceof ITileInventory)
titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName();
else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; else titleComponent = new ChatComponentText(container.getBukkitView().getTitle());
} else titleComponent = createNMSComponent(title); } else titleComponent = createNMSComponent(title);
entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent));

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r3; package xyz.xenondevs.inventoryaccess.r3;
import net.minecraft.server.v1_16_R1.ItemStack; import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_16_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_14_R1.ItemStack;
import net.minecraft.server.v1_16_R1.NBTTagCompound; import net.minecraft.server.v1_14_R1.NBTCompressedStreamTools;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; import net.minecraft.server.v1_14_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r3; package xyz.xenondevs.inventoryaccess.r3;
import net.minecraft.server.v1_16_R1.*; import net.minecraft.server.v1_14_R1.AdvancementDataPlayer;
import org.bukkit.Bukkit; import net.minecraft.server.v1_14_R1.EntityPlayer;
import org.bukkit.craftbukkit.v1_16_R1.CraftServer; import net.minecraft.server.v1_14_R1.MapIcon;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; import net.minecraft.server.v1_14_R1.PacketPlayOutMap;
import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -19,7 +20,7 @@ import java.util.stream.Collectors;
class PlayerUtilsImpl implements PlayerUtils { class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = private static final Method REGISTER_LISTENERS_METHOD =
ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class); ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "d");
@Override @Override
public void stopAdvancementListening(@NotNull Player player) { public void stopAdvancementListening(@NotNull Player player) {
@ -39,8 +40,7 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void startAdvancementListening(@NotNull Object player) { public void startAdvancementListening(@NotNull Object player) {
AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData();
AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData(); ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements);
ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager);
} }
@Override @Override

@ -21,7 +21,7 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.16.2-R0.1-SNAPSHOT</version> <version>1.15.2-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

@ -1,28 +1,37 @@
package xyz.xenondevs.inventoryaccess.r4; package xyz.xenondevs.inventoryaccess.r4;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_15_R1.*;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.inventory.AnvilInventory; import xyz.xenondevs.inventoryaccess.abstraction.inventory.AnvilInventory;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory { class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
private static final Field CONTAINER_ACCESS_FIELD = ReflectionUtils.getField(ContainerAnvil.class, true, "containerAccess");
private static final Field REPAIR_INVENTORY_FIELD = ReflectionUtils.getField(ContainerAnvil.class, true, "repairInventory");
private static final Field RESULT_INVENTORY_FIELD = ReflectionUtils.getField(ContainerAnvil.class, true, "resultInventory");
private final IChatBaseComponent title; private final IChatBaseComponent title;
private final List<Consumer<String>> renameHandlers; private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view; private final CraftInventoryView view;
private final EntityPlayer player; private final EntityPlayer player;
private final IInventory repairInventory;
private final IInventory resultInventory;
private String text; private String text;
private boolean open; private boolean open;
@ -38,6 +47,10 @@ class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
this.renameHandlers = renameHandlers; this.renameHandlers = renameHandlers;
this.player = player; this.player = player;
repairInventory = ReflectionUtils.getFieldValue(REPAIR_INVENTORY_FIELD, this);
resultInventory = ReflectionUtils.getFieldValue(RESULT_INVENTORY_FIELD, this);
ContainerAccess containerAccess = ReflectionUtils.getFieldValue(CONTAINER_ACCESS_FIELD, this);
CraftInventoryAnvil inventory = new CraftInventoryAnvil(containerAccess.getLocation(), CraftInventoryAnvil inventory = new CraftInventoryAnvil(containerAccess.getLocation(),
repairInventory, resultInventory, this); repairInventory, resultInventory, this);
this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this); this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
@ -56,7 +69,7 @@ class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.ANVIL, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.ANVIL, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.a, getItem(0), getItem(1), getItem(2));
player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
} }
@ -146,7 +159,7 @@ class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
} }
/** /**
* Called when both items in the {@link ContainerAnvil#repairInventory} were set to create * Called when both items in the {@link AnvilInventoryImpl#repairInventory} were set to create
* the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}. * the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}.
*/ */
@Override @Override

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r4; package xyz.xenondevs.inventoryaccess.r4;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_15_R1.*;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -52,7 +52,7 @@ class CartographyInventoryImpl extends ContainerCartography implements Cartograp
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY_TABLE, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY_TABLE, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.a, getItem(0), getItem(1), getItem(2));
player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
} }
@ -100,7 +100,7 @@ class CartographyInventoryImpl extends ContainerCartography implements Cartograp
@Override @Override
public ItemStack shiftClick(EntityHuman entityhuman, int i) { public ItemStack shiftClick(EntityHuman entityhuman, int i) {
return ItemStack.b; return ItemStack.a;
} }
@Override @Override

@ -1,11 +1,10 @@
package xyz.xenondevs.inventoryaccess.r4; package xyz.xenondevs.inventoryaccess.r4;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_15_R1.*;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_16_R2.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -43,7 +42,7 @@ class InventoryUtilsImpl implements InventoryUtils {
if (title == null) { if (title == null) {
if (iinventory instanceof ITileInventory) if (iinventory instanceof ITileInventory)
titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName();
else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; else titleComponent = new ChatComponentText(container.getBukkitView().getTitle());
} else titleComponent = createNMSComponent(title); } else titleComponent = createNMSComponent(title);
entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent));

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r4; package xyz.xenondevs.inventoryaccess.r4;
import net.minecraft.server.v1_16_R2.ItemStack; import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_16_R2.NBTCompressedStreamTools; import net.minecraft.server.v1_15_R1.ItemStack;
import net.minecraft.server.v1_16_R2.NBTTagCompound; import net.minecraft.server.v1_15_R1.NBTCompressedStreamTools;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import net.minecraft.server.v1_15_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -57,7 +63,7 @@ class ItemUtilsImpl implements ItemUtils {
nbt = NBTCompressedStreamTools.a(in); nbt = NBTCompressedStreamTools.a(in);
} else { } else {
DataInputStream dataIn = new DataInputStream(in); DataInputStream dataIn = new DataInputStream(in);
nbt = NBTCompressedStreamTools.a((DataInput) dataIn); nbt = NBTCompressedStreamTools.a(dataIn);
} }
ItemStack itemStack = ItemStack.a(nbt); ItemStack itemStack = ItemStack.a(nbt);
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r4; package xyz.xenondevs.inventoryaccess.r4;
import net.minecraft.server.v1_16_R2.*; import net.minecraft.server.v1_15_R1.AdvancementDataPlayer;
import org.bukkit.Bukkit; import net.minecraft.server.v1_15_R1.EntityPlayer;
import org.bukkit.craftbukkit.v1_16_R2.CraftServer; import net.minecraft.server.v1_15_R1.MapIcon;
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; import net.minecraft.server.v1_15_R1.PacketPlayOutMap;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -19,7 +20,7 @@ import java.util.stream.Collectors;
class PlayerUtilsImpl implements PlayerUtils { class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = private static final Method REGISTER_LISTENERS_METHOD =
ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class); ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "d");
@Override @Override
public void stopAdvancementListening(@NotNull Player player) { public void stopAdvancementListening(@NotNull Player player) {
@ -39,8 +40,7 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void startAdvancementListening(@NotNull Object player) { public void startAdvancementListening(@NotNull Object player) {
AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData(); AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData();
AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData(); ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements);
ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager);
} }
@Override @Override

@ -21,7 +21,7 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version> <version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r5; package xyz.xenondevs.inventoryaccess.r5;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R1.*;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r5; package xyz.xenondevs.inventoryaccess.r5;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R1.*;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,11 +1,11 @@
package xyz.xenondevs.inventoryaccess.r5; package xyz.xenondevs.inventoryaccess.r5;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R1.*;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_16_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_16_R3.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_16_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r5; package xyz.xenondevs.inventoryaccess.r5;
import net.minecraft.server.v1_16_R3.ItemStack; import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_16_R3.NBTCompressedStreamTools; import net.minecraft.server.v1_16_R1.ItemStack;
import net.minecraft.server.v1_16_R3.NBTTagCompound; import net.minecraft.server.v1_16_R1.NBTCompressedStreamTools;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; import net.minecraft.server.v1_16_R1.NBTTagCompound;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -57,7 +63,7 @@ class ItemUtilsImpl implements ItemUtils {
nbt = NBTCompressedStreamTools.a(in); nbt = NBTCompressedStreamTools.a(in);
} else { } else {
DataInputStream dataIn = new DataInputStream(in); DataInputStream dataIn = new DataInputStream(in);
nbt = NBTCompressedStreamTools.a((DataInput) dataIn); nbt = NBTCompressedStreamTools.a(dataIn);
} }
ItemStack itemStack = ItemStack.a(nbt); ItemStack itemStack = ItemStack.a(nbt);
@ -75,7 +81,7 @@ class ItemUtilsImpl implements ItemUtils {
ReflectionUtils.setFieldValue( ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD,
itemMeta, itemMeta,
name.serializeToJson() InventoryUtilsImpl.createNMSComponent(name)
); );
} }
@ -84,8 +90,14 @@ class ItemUtilsImpl implements ItemUtils {
ReflectionUtils.setFieldValue( ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD,
itemMeta, itemMeta,
lore.stream().map(ComponentWrapper::serializeToJson).collect(Collectors.toList()) lore.stream().map(InventoryUtilsImpl::createNMSComponent).collect(Collectors.toList())
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -1,9 +1,9 @@
package xyz.xenondevs.inventoryaccess.r5; package xyz.xenondevs.inventoryaccess.r5;
import net.minecraft.server.v1_16_R3.*; import net.minecraft.server.v1_16_R1.*;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R3.CraftServer; import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -45,7 +45,7 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<xyz.xenondevs.inventoryaccess.map.MapIcon> icons) { public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<xyz.xenondevs.inventoryaccess.map.MapIcon> icons) {
List<net.minecraft.server.v1_16_R3.MapIcon> decorations = icons != null List<MapIcon> decorations = icons != null
? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new)) ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new))
: new ArrayList<>(); : new ArrayList<>();

@ -13,17 +13,15 @@
<artifactId>inventory-access-r6</artifactId> <artifactId>inventory-access-r6</artifactId>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>11</maven.compiler.target>
<spigot.version>1.17-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>${spigot.version}</version> <version>1.16.2-R0.1-SNAPSHOT</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -33,115 +31,4 @@
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>xyz.xenondevs</groupId>
<artifactId>string-remapper-maven-plugin</artifactId>
<version>0.6</version>
<executions>
<execution>
<id>remap-spigot</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<remapGoal>spigot</remapGoal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-spigot</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration>
</execution>
<execution>
<id>remap-mojang</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<remapGoal>mojang</remapGoal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-mojang</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
<execution>
<id>spigot</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-spigot</classesDirectory>
</configuration>
</execution>
<execution>
<id>mojang</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-mojang</classesDirectory>
<classifier>remapped-mojang</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-mojang</remappedDependencies>
<remappedArtifactAttached>false</remappedArtifactAttached>
<finalName>${project.artifactId}-${project.version}-remapped-obf</finalName>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-spigot</id>
<configuration>
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>

@ -1,23 +1,12 @@
package xyz.xenondevs.inventoryaccess.r6; package xyz.xenondevs.inventoryaccess.r6;
import net.minecraft.core.BlockPos; import net.minecraft.server.v1_16_R2.*;
import net.minecraft.core.NonNullList; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer;
import net.minecraft.network.chat.Component; import org.bukkit.craftbukkit.v1_16_R2.event.CraftEventFactory;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryAnvil;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryView;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
import net.minecraft.server.level.ServerPlayer; import org.bukkit.entity.Player;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -27,30 +16,30 @@ import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory { class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
private final Component title; private final IChatBaseComponent title;
private final List<Consumer<String>> renameHandlers; private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view; private final CraftInventoryView view;
private final ServerPlayer player; private final EntityPlayer player;
private String text; private String text;
private boolean open; private boolean open;
public AnvilInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title, List<Consumer<String>> renameHandlers) { public AnvilInventoryImpl(Player player, @NotNull ComponentWrapper title, List<Consumer<String>> renameHandlers) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandlers); this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandlers);
} }
public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) { public AnvilInventoryImpl(EntityPlayer player, IChatBaseComponent title, List<Consumer<String>> renameHandlers) {
super(player.nextContainerCounter(), player.getInventory(), super(player.nextContainerCounter(), player.inventory,
ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0))); ContainerAccess.at(player.getWorld(), new BlockPosition(0, 0, 0)));
this.title = title; this.title = title;
this.renameHandlers = renameHandlers; this.renameHandlers = renameHandlers;
this.player = player; this.player = player;
CraftInventoryAnvil inventory = new CraftInventoryAnvil(access.getLocation(), CraftInventoryAnvil inventory = new CraftInventoryAnvil(containerAccess.getLocation(),
inputSlots, resultSlots, this); repairInventory, resultInventory, this);
this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this); this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
} }
@ -61,33 +50,30 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
CraftEventFactory.callInventoryOpenEvent(player, this); CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container // set active container
player.containerMenu = this; player.activeContainer = this;
// send open packet // send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.ANVIL, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), itemsList)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
// init menu
player.initMenu(this);
} }
public void sendItem(int slot) { public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot))); player.playerConnection.sendPacket(new PacketPlayOutSetSlot(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot)));
} }
public void setItem(int slot, ItemStack item) { public void setItem(int slot, ItemStack item) {
if (slot < 2) inputSlots.setItem(slot, item); if (slot < 2) repairInventory.setItem(slot, item);
else resultSlots.setItem(0, item); else resultInventory.setItem(0, item);
if (open) sendItem(slot); if (open) sendItem(slot);
} }
private ItemStack getItem(int slot) { private ItemStack getItem(int slot) {
if (slot < 2) return inputSlots.getItem(slot); if (slot < 2) return repairInventory.getItem(slot);
else return resultSlots.getItem(0); else return resultInventory.getItem(0);
} }
@Override @Override
@ -118,15 +104,15 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
} }
/** /**
* Called every tick to see if the {@link Player} can still use that container. * Called every tick to see if the {@link EntityHuman} can still use that container.
* (Used to for checking the distance between the {@link Player} and the container * (Used to for checking the distance between the {@link EntityHuman} and the container
* and closing the window when the distance gets too big.) * and closing the window when the distance gets too big.)
* *
* @param player The {@link Player} * @param entityhuman The {@link EntityHuman}
* @return If the {@link Player} can still use that container * @return If the {@link EntityHuman} can still use that container
*/ */
@Override @Override
public boolean stillValid(Player player) { public boolean canUse(EntityHuman entityhuman) {
return true; return true;
} }
@ -136,7 +122,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
* @param s The new rename text * @param s The new rename text
*/ */
@Override @Override
public void setItemName(String s) { public void a(String s) {
// save rename text // save rename text
text = s; text = s;
@ -151,33 +137,21 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
/** /**
* Called when the container is closed to give the items back. * Called when the container is closed to give the items back.
* *
* @param player The {@link Player} that closed this container * @param entityhuman The {@link EntityHuman} that closed this container
*/ */
@Override @Override
public void removed(Player player) { public void b(EntityHuman entityhuman) {
open = false;
}
/**
* Called when the container gets closed to put items back into a players
* inventory or drop them in the world.
*
* @param player The {@link Player} that closed this container
* @param container The container
*/
@Override
protected void clearContainer(Player player, Container container) {
open = false; open = false;
// don't give them the items, they don't own them
} }
/** /**
* Called when both items in the {@link AnvilMenu#inputSlots} were set to create * Called when both items in the {@link ContainerAnvil#repairInventory} were set to create
* the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}. * the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}.
*/ */
@Override @Override
public void createResult() { public void e() {
// empty // no
} }

@ -1,20 +1,11 @@
package xyz.xenondevs.inventoryaccess.r6; package xyz.xenondevs.inventoryaccess.r6;
import net.minecraft.core.BlockPos; import net.minecraft.server.v1_16_R2.*;
import net.minecraft.core.NonNullList; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer;
import net.minecraft.network.chat.Component; import org.bukkit.craftbukkit.v1_16_R2.event.CraftEventFactory;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryCartography;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventoryView;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -24,18 +15,14 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
class CartographyInventoryImpl extends CartographyTableMenu implements CartographyInventory { class CartographyInventoryImpl extends ContainerCartography implements CartographyInventory {
private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField( private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(ContainerCartography.class, true, "resultInventory");
CartographyTableMenu.class,
true,
"SRF(net.minecraft.world.inventory.CartographyTableMenu resultContainer)"
);
private final ResultContainer resultContainer = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this); private final InventoryCraftResult resultInventory = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this);
private final Component title; private final IChatBaseComponent title;
private final CraftInventoryView view; private final CraftInventoryView view;
private final ServerPlayer player; private final EntityPlayer player;
private boolean open; private boolean open;
@ -43,12 +30,12 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title)); this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title));
} }
public CartographyInventoryImpl(ServerPlayer player, Component title) { public CartographyInventoryImpl(EntityPlayer player, IChatBaseComponent title) {
super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0))); super(player.nextContainerCounter(), player.inventory, ContainerAccess.at(player.getWorld(), new BlockPosition(0, 0, 0)));
this.player = player; this.player = player;
this.title = title; this.title = title;
CraftInventoryCartography inventory = new CraftInventoryCartography(container, resultContainer); CraftInventoryCartography inventory = new CraftInventoryCartography(this.inventory, resultInventory);
view = new CraftInventoryView(player.getBukkitEntity(), inventory, this); view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
} }
@ -59,17 +46,14 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
CraftEventFactory.callInventoryOpenEvent(player, this); CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container // set active container
player.containerMenu = this; player.activeContainer = this;
// send open packet // send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.CARTOGRAPHY_TABLE, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY_TABLE, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), itemsList)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
// init menu
player.initMenu(this);
} }
@Override @Override
@ -78,19 +62,19 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
public void sendItem(int slot) { public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot))); player.playerConnection.sendPacket(new PacketPlayOutSetSlot(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot)));
} }
public void setItem(int slot, ItemStack item) { public void setItem(int slot, ItemStack item) {
if (slot < 2) container.setItem(slot, item); if (slot < 2) inventory.setItem(slot, item);
else resultContainer.setItem(0, item); else resultInventory.setItem(0, item);
if (open) sendItem(slot); if (open) sendItem(slot);
} }
private ItemStack getItem(int slot) { private ItemStack getItem(int slot) {
if (slot < 2) return container.getItem(slot); if (slot < 2) return inventory.getItem(slot);
else return resultContainer.getItem(0); else return resultInventory.getItem(0);
} }
@Override @Override
@ -111,26 +95,26 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
@Override @Override
public void slotsChanged(Container container) { public void a(IInventory inventory) {
} }
@Override @Override
public ItemStack quickMoveStack(net.minecraft.world.entity.player.Player entityhuman, int i) { public ItemStack shiftClick(EntityHuman entityhuman, int i) {
return ItemStack.EMPTY; return ItemStack.b;
} }
@Override @Override
public boolean canTakeItemForPickAll(ItemStack itemstack, Slot slot) { public boolean a(ItemStack itemstack, Slot slot) {
return true; return true;
} }
@Override @Override
public boolean stillValid(net.minecraft.world.entity.player.Player entityhuman) { public boolean canUse(EntityHuman entityhuman) {
return true; return true;
} }
@Override @Override
protected void clearContainer(net.minecraft.world.entity.player.Player entityhuman, Container container) { public void b(EntityHuman entityHuman) {
// empty // empty
} }

@ -1,17 +1,11 @@
package xyz.xenondevs.inventoryaccess.r6; package xyz.xenondevs.inventoryaccess.r6;
import net.minecraft.network.chat.Component; import net.minecraft.server.v1_16_R2.*;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer;
import net.minecraft.server.level.ServerPlayer; import org.bukkit.craftbukkit.v1_16_R2.event.CraftEventFactory;
import net.minecraft.world.Container; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftContainer;
import net.minecraft.world.MenuProvider; import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftInventory;
import net.minecraft.world.inventory.AbstractContainerMenu; import org.bukkit.craftbukkit.v1_16_R2.util.CraftChatMessage;
import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -21,14 +15,13 @@ import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
class InventoryUtilsImpl implements InventoryUtils { class InventoryUtilsImpl implements InventoryUtils {
public static Component createNMSComponent(ComponentWrapper component) { public static IChatBaseComponent createNMSComponent(ComponentWrapper component) {
if (component == null) return null; return IChatBaseComponent.ChatSerializer.a(component.serializeToJson());
return CraftChatMessage.fromJSON(component.serializeToJson());
} }
public static int getActiveWindowId(ServerPlayer player) { public static int getActiveWindowId(EntityPlayer player) {
AbstractContainerMenu container = player.containerMenu; Container container = player.activeContainer;
return container == null ? -1 : container.containerId; return container == null ? -1 : container.windowId;
} }
@Override @Override
@ -38,36 +31,34 @@ class InventoryUtilsImpl implements InventoryUtils {
@Override @Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) { public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
MenuType<?> menuType = CraftContainer.getNotchInventoryType(inventory); Containers<?> windowType = CraftContainer.getNotchInventoryType(inventory);
if (serverPlayer.connection != null) { if (entityPlayer.playerConnection != null) {
AbstractContainerMenu menu = new CraftContainer(inventory, serverPlayer, serverPlayer.nextContainerCounter()); Container container = new CraftContainer(inventory, entityPlayer, entityPlayer.nextContainerCounter());
menu = CraftEventFactory.callInventoryOpenEvent(serverPlayer, menu); container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container);
if (menu != null) { if (container != null) {
Container container = ((CraftInventory) inventory).getInventory(); IInventory iinventory = ((CraftInventory) inventory).getInventory();
Component titleComponent; IChatBaseComponent titleComponent;
if (title == null) { if (title == null) {
if (container instanceof MenuProvider) if (iinventory instanceof ITileInventory)
titleComponent = ((MenuProvider) container).getDisplayName(); titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName();
else titleComponent = CraftChatMessage.fromString(menu.getBukkitView().getTitle())[0]; else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0];
} else titleComponent = createNMSComponent(title); } else titleComponent = createNMSComponent(title);
menu.checkReachable = false; entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent));
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menuType, titleComponent)); entityPlayer.activeContainer = container;
serverPlayer.containerMenu = menu; entityPlayer.activeContainer.addSlotListener(entityPlayer);
serverPlayer.initMenu(menu);
} }
} }
} }
@Override @Override
public void updateOpenInventoryTitle(@NotNull Player player, @NotNull ComponentWrapper title) { public void updateOpenInventoryTitle(@NotNull Player player, @NotNull ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
AbstractContainerMenu menu = serverPlayer.containerMenu; Container container = entityPlayer.activeContainer;
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), createNMSComponent(title))); entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), createNMSComponent(title)));
serverPlayer.initMenu(menu); entityPlayer.updateInventory(container);
} }
} }

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r6; package xyz.xenondevs.inventoryaccess.r6;
import net.minecraft.nbt.CompoundTag; import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.NbtIo; import net.minecraft.server.v1_16_R2.ItemStack;
import net.minecraft.world.item.ItemStack; import net.minecraft.server.v1_16_R2.NBTCompressedStreamTools;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import net.minecraft.server.v1_16_R2.NBTTagCompound;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -25,19 +31,19 @@ class ItemUtilsImpl implements ItemUtils {
} }
@Override @Override
public void serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, @NotNull OutputStream outputStream, boolean compressed) { public void serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, @NotNull OutputStream out, boolean compressed) {
try { try {
ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
CompoundTag nbt = nmsStack.save(new CompoundTag()); NBTTagCompound nbt = nmsStack.save(new NBTTagCompound());
if (compressed) { if (compressed) {
NbtIo.writeCompressed(nbt, outputStream); NBTCompressedStreamTools.a(nbt, out);
} else { } else {
DataOutputStream dataOut = new DataOutputStream(outputStream); DataOutputStream dataOut = new DataOutputStream(out);
NbtIo.write(nbt, dataOut); NBTCompressedStreamTools.a(nbt, (DataOutput) dataOut);
} }
outputStream.flush(); out.flush();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -50,17 +56,17 @@ class ItemUtilsImpl implements ItemUtils {
} }
@Override @Override
public org.bukkit.inventory.ItemStack deserializeItemStack(@NotNull InputStream inputStream, boolean compressed) { public org.bukkit.inventory.ItemStack deserializeItemStack(@NotNull InputStream in, boolean compressed) {
try { try {
CompoundTag nbt; NBTTagCompound nbt;
if (compressed) { if (compressed) {
nbt = NbtIo.readCompressed(inputStream); nbt = NBTCompressedStreamTools.a(in);
} else { } else {
DataInputStream dataIn = new DataInputStream(inputStream); DataInputStream dataIn = new DataInputStream(in);
nbt = NbtIo.read(dataIn); nbt = NBTCompressedStreamTools.a((DataInput) dataIn);
} }
ItemStack itemStack = ItemStack.of(nbt); ItemStack itemStack = ItemStack.a(nbt);
return CraftItemStack.asCraftMirror(itemStack); return CraftItemStack.asCraftMirror(itemStack);
} catch (IOException e) { } catch (IOException e) {
@ -75,7 +81,7 @@ class ItemUtilsImpl implements ItemUtils {
ReflectionUtils.setFieldValue( ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD,
itemMeta, itemMeta,
name.serializeToJson() InventoryUtilsImpl.createNMSComponent(name)
); );
} }
@ -84,8 +90,13 @@ class ItemUtilsImpl implements ItemUtils {
ReflectionUtils.setFieldValue( ReflectionUtils.setFieldValue(
ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD,
itemMeta, itemMeta,
lore.stream().map(ComponentWrapper::serializeToJson).collect(Collectors.toList()) lore.stream().map(InventoryUtilsImpl::createNMSComponent).collect(Collectors.toList())
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -1,23 +1,14 @@
package xyz.xenondevs.inventoryaccess.r6; package xyz.xenondevs.inventoryaccess.r6;
import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; import net.minecraft.server.v1_16_R2.*;
import net.minecraft.network.protocol.game.ClientboundResourcePackPacket;
import net.minecraft.server.PlayerAdvancements;
import net.minecraft.server.ServerAdvancementManager;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_17_R1.CraftServer; import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.abstraction.util.PlayerUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.PlayerUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.map.MapIcon;
import xyz.xenondevs.inventoryaccess.map.MapPatch; import xyz.xenondevs.inventoryaccess.map.MapPatch;
import xyz.xenondevs.inventoryaccess.util.DataUtils;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -27,12 +18,8 @@ import java.util.stream.Collectors;
class PlayerUtilsImpl implements PlayerUtils { class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod( private static final Method REGISTER_LISTENERS_METHOD =
PlayerAdvancements.class, ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class);
true,
"SRM(net.minecraft.server.PlayerAdvancements registerListeners)",
ServerAdvancementManager.class
);
@Override @Override
public void stopAdvancementListening(@NotNull Player player) { public void stopAdvancementListening(@NotNull Player player) {
@ -41,7 +28,7 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void stopAdvancementListening(@NotNull Object player) { public void stopAdvancementListening(@NotNull Object player) {
((ServerPlayer) player).getAdvancements().stopListening(); ((EntityPlayer) player).getAdvancementData().a(); // stops listening
} }
@Override @Override
@ -51,48 +38,41 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void startAdvancementListening(@NotNull Object player) { public void startAdvancementListening(@NotNull Object player) {
PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements(); AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData();
ServerAdvancementManager manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancements(); AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData();
ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager);
} }
@Override @Override
public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<MapIcon> icons) { public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<xyz.xenondevs.inventoryaccess.map.MapIcon> icons) {
List<MapDecoration> decorations = icons != null ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new)) : null; List<MapIcon> decorations = icons != null
MapItemSavedData.MapPatch patch = toMapPatch(mapPatch); ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new))
ClientboundMapItemDataPacket packet = new ClientboundMapItemDataPacket(mapId, scale, locked, decorations, patch); : new ArrayList<>();
((CraftPlayer) player).getHandle().connection.send(packet);
int width = 0;
int height = 0;
int startX = 0;
int startY = 0;
byte[] colors = new byte[0];
if (mapPatch != null) {
width = mapPatch.getWidth();
height = mapPatch.getHeight();
startX = mapPatch.getStartX();
startY = mapPatch.getStartY();
colors = mapPatch.getColors();
} }
private MapDecoration toMapDecoration(MapIcon icon) { PacketPlayOutMap packet = new PacketPlayOutMap(mapId, scale, !decorations.isEmpty(), locked, decorations, colors, startX, startY, width, height);
return new MapDecoration( ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
MapDecoration.Type.byIcon(icon.getType().getId()), }
private MapIcon toMapDecoration(xyz.xenondevs.inventoryaccess.map.MapIcon icon) {
return new MapIcon(
MapIcon.Type.a(icon.getType().getId()),
icon.getX(), icon.getY(), icon.getX(), icon.getY(),
icon.getRot(), icon.getRot(),
icon.getComponent() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponent()) : null icon.getComponent() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponent()) : null
); );
} }
private MapItemSavedData.MapPatch toMapPatch(MapPatch patch) {
if (patch == null) return null;
return new MapItemSavedData.MapPatch(
patch.getStartX(), patch.getStartY(),
patch.getWidth(), patch.getHeight(),
patch.getColors()
);
}
@Override
public void sendResourcePack(@NotNull Player player, @NotNull String url, byte[] hash, @Nullable ComponentWrapper prompt, boolean force) {
var serverPlayer = ((CraftPlayer) player).getHandle();
var packet = new ClientboundResourcePackPacket(
url,
DataUtils.toHexadecimalString(hash),
force,
InventoryUtilsImpl.createNMSComponent(prompt)
);
serverPlayer.connection.connection.send(packet);
}
} }

@ -13,17 +13,15 @@
<artifactId>inventory-access-r7</artifactId> <artifactId>inventory-access-r7</artifactId>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>11</maven.compiler.target>
<spigot.version>1.17.1-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>${spigot.version}</version> <version>1.16.4-R0.1-SNAPSHOT</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -33,115 +31,4 @@
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>xyz.xenondevs</groupId>
<artifactId>string-remapper-maven-plugin</artifactId>
<version>0.6</version>
<executions>
<execution>
<id>remap-spigot</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<remapGoal>spigot</remapGoal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-spigot</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration>
</execution>
<execution>
<id>remap-mojang</id>
<goals>
<goal>remap</goal>
</goals>
<configuration>
<remapGoal>mojang</remapGoal>
<classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-mojang</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
<execution>
<id>spigot</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-spigot</classesDirectory>
</configuration>
</execution>
<execution>
<id>mojang</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.directory}/classes-mojang</classesDirectory>
<classifier>remapped-mojang</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-mojang</remappedDependencies>
<remappedArtifactAttached>false</remappedArtifactAttached>
<finalName>${project.artifactId}-${project.version}-remapped-obf</finalName>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-spigot</id>
<configuration>
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:${spigot.version}:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:${spigot.version}:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>

@ -1,24 +1,12 @@
package xyz.xenondevs.inventoryaccess.r7; package xyz.xenondevs.inventoryaccess.r7;
import net.minecraft.core.BlockPos; import net.minecraft.server.v1_16_R3.*;
import net.minecraft.core.NonNullList; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
import net.minecraft.network.chat.Component; import org.bukkit.craftbukkit.v1_16_R3.event.CraftEventFactory;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryAnvil;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryView;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
import net.minecraft.server.level.ServerPlayer; import org.bukkit.entity.Player;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -28,30 +16,30 @@ import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory { class AnvilInventoryImpl extends ContainerAnvil implements AnvilInventory {
private final Component title; private final IChatBaseComponent title;
private final List<Consumer<String>> renameHandlers; private final List<Consumer<String>> renameHandlers;
private final CraftInventoryView view; private final CraftInventoryView view;
private final ServerPlayer player; private final EntityPlayer player;
private String text; private String text;
private boolean open; private boolean open;
public AnvilInventoryImpl(org.bukkit.entity.Player player, @NotNull ComponentWrapper title, List<Consumer<String>> renameHandlers) { public AnvilInventoryImpl(Player player, @NotNull ComponentWrapper title, List<Consumer<String>> renameHandlers) {
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandlers); this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandlers);
} }
public AnvilInventoryImpl(ServerPlayer player, Component title, List<Consumer<String>> renameHandlers) { public AnvilInventoryImpl(EntityPlayer player, IChatBaseComponent title, List<Consumer<String>> renameHandlers) {
super(player.nextContainerCounter(), player.getInventory(), super(player.nextContainerCounter(), player.inventory,
ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0))); ContainerAccess.at(player.getWorld(), new BlockPosition(0, 0, 0)));
this.title = title; this.title = title;
this.renameHandlers = renameHandlers; this.renameHandlers = renameHandlers;
this.player = player; this.player = player;
CraftInventoryAnvil inventory = new CraftInventoryAnvil(access.getLocation(), CraftInventoryAnvil inventory = new CraftInventoryAnvil(containerAccess.getLocation(),
inputSlots, resultSlots, this); repairInventory, resultInventory, this);
this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this); this.view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
} }
@ -62,38 +50,30 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
CraftEventFactory.callInventoryOpenEvent(player, this); CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container // set active container
player.containerMenu = this; player.activeContainer = this;
// send open packet // send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.ANVIL, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.ANVIL, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
// init menu
player.initMenu(this);
} }
public void sendItem(int slot) { public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(getActiveWindowId(player), incrementStateId(), slot, getItem(slot))); player.playerConnection.sendPacket(new PacketPlayOutSetSlot(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot)));
} }
public void setItem(int slot, ItemStack item) { public void setItem(int slot, ItemStack item) {
if (slot < 2) inputSlots.setItem(slot, item); if (slot < 2) repairInventory.setItem(slot, item);
else resultSlots.setItem(0, item); else resultInventory.setItem(0, item);
if (open) sendItem(slot); if (open) sendItem(slot);
} }
private ItemStack getItem(int slot) { private ItemStack getItem(int slot) {
if (slot < 2) return inputSlots.getItem(slot); if (slot < 2) return repairInventory.getItem(slot);
else return resultSlots.getItem(0); else return resultInventory.getItem(0);
}
private int getActiveWindowId(ServerPlayer player) {
AbstractContainerMenu container = player.containerMenu;
return container == null ? -1 : container.containerId;
} }
@Override @Override
@ -116,7 +96,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
return open; return open;
} }
// --- AnvilMenu --- // --- ContainerAnvil ---
@Override @Override
public CraftInventoryView getBukkitView() { public CraftInventoryView getBukkitView() {
@ -124,15 +104,15 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
} }
/** /**
* Called every tick to see if the {@link Player} can still use that container. * Called every tick to see if the {@link EntityHuman} can still use that container.
* (Used to for checking the distance between the {@link Player} and the container * (Used to for checking the distance between the {@link EntityHuman} and the container
* and closing the window when the distance gets too big.) * and closing the window when the distance gets too big.)
* *
* @param player The {@link Player} * @param entityhuman The {@link EntityHuman}
* @return If the {@link Player} can still use that container * @return If the {@link EntityHuman} can still use that container
*/ */
@Override @Override
public boolean stillValid(Player player) { public boolean canUse(EntityHuman entityhuman) {
return true; return true;
} }
@ -142,7 +122,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
* @param s The new rename text * @param s The new rename text
*/ */
@Override @Override
public void setItemName(String s) { public void a(String s) {
// save rename text // save rename text
text = s; text = s;
@ -157,33 +137,21 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
/** /**
* Called when the container is closed to give the items back. * Called when the container is closed to give the items back.
* *
* @param player The {@link Player} that closed this container * @param entityhuman The {@link EntityHuman} that closed this container
*/ */
@Override @Override
public void removed(Player player) { public void b(EntityHuman entityhuman) {
open = false;
}
/**
* Called when the container gets closed to put items back into a players
* inventory or drop them in the world.
*
* @param player The {@link Player} that closed this container
* @param container The container
*/
@Override
protected void clearContainer(Player player, Container container) {
open = false; open = false;
// don't give them the items, they don't own them
} }
/** /**
* Called when both items in the {@link AnvilMenu#inputSlots} were set to create * Called when both items in the {@link ContainerAnvil#repairInventory} were set to create
* the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}. * the resulting product, calculate the level cost and call the {@link PrepareAnvilEvent}.
*/ */
@Override @Override
public void createResult() { public void e() {
// empty // no
} }

@ -1,20 +1,11 @@
package xyz.xenondevs.inventoryaccess.r7; package xyz.xenondevs.inventoryaccess.r7;
import net.minecraft.core.BlockPos; import net.minecraft.server.v1_16_R3.*;
import net.minecraft.core.NonNullList; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
import net.minecraft.network.chat.Component; import org.bukkit.craftbukkit.v1_16_R3.event.CraftEventFactory;
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryCartography;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventoryView;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -24,18 +15,14 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
class CartographyInventoryImpl extends CartographyTableMenu implements CartographyInventory { class CartographyInventoryImpl extends ContainerCartography implements CartographyInventory {
private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField( private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(ContainerCartography.class, true, "resultInventory");
CartographyTableMenu.class,
true,
"SRF(net.minecraft.world.inventory.CartographyTableMenu resultContainer)"
);
private final ResultContainer resultContainer = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this); private final InventoryCraftResult resultInventory = ReflectionUtils.getFieldValue(RESULT_CONTAINER_FIELD, this);
private final Component title; private final IChatBaseComponent title;
private final CraftInventoryView view; private final CraftInventoryView view;
private final ServerPlayer player; private final EntityPlayer player;
private boolean open; private boolean open;
@ -43,12 +30,12 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title)); this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title));
} }
public CartographyInventoryImpl(ServerPlayer player, Component title) { public CartographyInventoryImpl(EntityPlayer player, IChatBaseComponent title) {
super(player.nextContainerCounter(), player.getInventory(), ContainerLevelAccess.create(player.level, new BlockPos(0, 0, 0))); super(player.nextContainerCounter(), player.inventory, ContainerAccess.at(player.getWorld(), new BlockPosition(0, 0, 0)));
this.player = player; this.player = player;
this.title = title; this.title = title;
CraftInventoryCartography inventory = new CraftInventoryCartography(container, resultContainer); CraftInventoryCartography inventory = new CraftInventoryCartography(this.inventory, resultInventory);
view = new CraftInventoryView(player.getBukkitEntity(), inventory, this); view = new CraftInventoryView(player.getBukkitEntity(), inventory, this);
} }
@ -59,17 +46,14 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
CraftEventFactory.callInventoryOpenEvent(player, this); CraftEventFactory.callInventoryOpenEvent(player, this);
// set active container // set active container
player.containerMenu = this; player.activeContainer = this;
// send open packet // send open packet
player.connection.send(new ClientboundOpenScreenPacket(containerId, MenuType.CARTOGRAPHY_TABLE, title)); player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, Containers.CARTOGRAPHY_TABLE, title));
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.a(ItemStack.b, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY)); player.playerConnection.sendPacket(new PacketPlayOutWindowItems(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
// init menu
player.initMenu(this);
} }
@Override @Override
@ -78,19 +62,19 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
public void sendItem(int slot) { public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, incrementStateId(), getItem(slot))); player.playerConnection.sendPacket(new PacketPlayOutSetSlot(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot)));
} }
public void setItem(int slot, ItemStack item) { public void setItem(int slot, ItemStack item) {
if (slot < 2) container.setItem(slot, item); if (slot < 2) inventory.setItem(slot, item);
else resultContainer.setItem(0, item); else resultInventory.setItem(0, item);
if (open) sendItem(slot); if (open) sendItem(slot);
} }
private ItemStack getItem(int slot) { private ItemStack getItem(int slot) {
if (slot < 2) return container.getItem(slot); if (slot < 2) return inventory.getItem(slot);
else return resultContainer.getItem(0); else return resultInventory.getItem(0);
} }
@Override @Override
@ -111,26 +95,26 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
@Override @Override
public void slotsChanged(Container container) { public void a(IInventory inventory) {
} }
@Override @Override
public ItemStack quickMoveStack(net.minecraft.world.entity.player.Player entityhuman, int i) { public ItemStack shiftClick(EntityHuman entityhuman, int i) {
return ItemStack.EMPTY; return ItemStack.b;
} }
@Override @Override
public boolean canTakeItemForPickAll(ItemStack itemstack, Slot slot) { public boolean a(ItemStack itemstack, Slot slot) {
return true; return true;
} }
@Override @Override
public boolean stillValid(net.minecraft.world.entity.player.Player entityhuman) { public boolean canUse(EntityHuman entityhuman) {
return true; return true;
} }
@Override @Override
protected void clearContainer(net.minecraft.world.entity.player.Player entityhuman, Container container) { public void b(EntityHuman entityHuman) {
// empty // empty
} }

@ -1,17 +1,11 @@
package xyz.xenondevs.inventoryaccess.r7; package xyz.xenondevs.inventoryaccess.r7;
import net.minecraft.network.chat.Component; import net.minecraft.server.v1_16_R3.*;
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
import net.minecraft.server.level.ServerPlayer; import org.bukkit.craftbukkit.v1_16_R3.event.CraftEventFactory;
import net.minecraft.world.Container; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftContainer;
import net.minecraft.world.MenuProvider; import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftInventory;
import net.minecraft.world.inventory.AbstractContainerMenu; import org.bukkit.craftbukkit.v1_16_R3.util.CraftChatMessage;
import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -21,14 +15,13 @@ import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
class InventoryUtilsImpl implements InventoryUtils { class InventoryUtilsImpl implements InventoryUtils {
public static Component createNMSComponent(ComponentWrapper component) { public static IChatBaseComponent createNMSComponent(ComponentWrapper component) {
if (component == null) return null; return IChatBaseComponent.ChatSerializer.a(component.serializeToJson());
return CraftChatMessage.fromJSON(component.serializeToJson());
} }
public static int getActiveWindowId(ServerPlayer player) { public static int getActiveWindowId(EntityPlayer player) {
AbstractContainerMenu container = player.containerMenu; Container container = player.activeContainer;
return container == null ? -1 : container.containerId; return container == null ? -1 : container.windowId;
} }
@Override @Override
@ -38,36 +31,34 @@ class InventoryUtilsImpl implements InventoryUtils {
@Override @Override
public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) { public void openCustomInventory(@NotNull Player player, @NotNull Inventory inventory, @Nullable ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
MenuType<?> menuType = CraftContainer.getNotchInventoryType(inventory); Containers<?> windowType = CraftContainer.getNotchInventoryType(inventory);
if (serverPlayer.connection != null) { if (entityPlayer.playerConnection != null) {
AbstractContainerMenu menu = new CraftContainer(inventory, serverPlayer, serverPlayer.nextContainerCounter()); Container container = new CraftContainer(inventory, entityPlayer, entityPlayer.nextContainerCounter());
menu = CraftEventFactory.callInventoryOpenEvent(serverPlayer, menu); container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container);
if (menu != null) { if (container != null) {
Container container = ((CraftInventory) inventory).getInventory(); IInventory iinventory = ((CraftInventory) inventory).getInventory();
Component titleComponent; IChatBaseComponent titleComponent;
if (title == null) { if (title == null) {
if (container instanceof MenuProvider) if (iinventory instanceof ITileInventory)
titleComponent = ((MenuProvider) container).getDisplayName(); titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName();
else titleComponent = CraftChatMessage.fromString(menu.getBukkitView().getTitle())[0]; else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0];
} else titleComponent = createNMSComponent(title); } else titleComponent = createNMSComponent(title);
menu.checkReachable = false; entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent));
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menuType, titleComponent)); entityPlayer.activeContainer = container;
serverPlayer.containerMenu = menu; entityPlayer.activeContainer.addSlotListener(entityPlayer);
serverPlayer.initMenu(menu);
} }
} }
} }
@Override @Override
public void updateOpenInventoryTitle(@NotNull Player player, @NotNull ComponentWrapper title) { public void updateOpenInventoryTitle(@NotNull Player player, @NotNull ComponentWrapper title) {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
AbstractContainerMenu menu = serverPlayer.containerMenu; Container container = entityPlayer.activeContainer;
serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), createNMSComponent(title))); entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), createNMSComponent(title)));
serverPlayer.initMenu(menu); entityPlayer.updateInventory(container);
} }
} }

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r7; package xyz.xenondevs.inventoryaccess.r7;
import net.minecraft.nbt.CompoundTag; import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.NbtIo; import net.minecraft.server.v1_16_R3.ItemStack;
import net.minecraft.world.item.ItemStack; import net.minecraft.server.v1_16_R3.NBTCompressedStreamTools;
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import net.minecraft.server.v1_16_R3.NBTTagCompound;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -25,19 +31,19 @@ class ItemUtilsImpl implements ItemUtils {
} }
@Override @Override
public void serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, @NotNull OutputStream outputStream, boolean compressed) { public void serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, @NotNull OutputStream out, boolean compressed) {
try { try {
ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
CompoundTag nbt = nmsStack.save(new CompoundTag()); NBTTagCompound nbt = nmsStack.save(new NBTTagCompound());
if (compressed) { if (compressed) {
NbtIo.writeCompressed(nbt, outputStream); NBTCompressedStreamTools.a(nbt, out);
} else { } else {
DataOutputStream dataOut = new DataOutputStream(outputStream); DataOutputStream dataOut = new DataOutputStream(out);
NbtIo.write(nbt, dataOut); NBTCompressedStreamTools.a(nbt, (DataOutput) dataOut);
} }
outputStream.flush(); out.flush();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -50,17 +56,17 @@ class ItemUtilsImpl implements ItemUtils {
} }
@Override @Override
public org.bukkit.inventory.ItemStack deserializeItemStack(@NotNull InputStream inputStream, boolean compressed) { public org.bukkit.inventory.ItemStack deserializeItemStack(@NotNull InputStream in, boolean compressed) {
try { try {
CompoundTag nbt; NBTTagCompound nbt;
if (compressed) { if (compressed) {
nbt = NbtIo.readCompressed(inputStream); nbt = NBTCompressedStreamTools.a(in);
} else { } else {
DataInputStream dataIn = new DataInputStream(inputStream); DataInputStream dataIn = new DataInputStream(in);
nbt = NbtIo.read(dataIn); nbt = NBTCompressedStreamTools.a((DataInput) dataIn);
} }
ItemStack itemStack = ItemStack.of(nbt); ItemStack itemStack = ItemStack.a(nbt);
return CraftItemStack.asCraftMirror(itemStack); return CraftItemStack.asCraftMirror(itemStack);
} catch (IOException e) { } catch (IOException e) {
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -1,23 +1,14 @@
package xyz.xenondevs.inventoryaccess.r7; package xyz.xenondevs.inventoryaccess.r7;
import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; import net.minecraft.server.v1_16_R3.*;
import net.minecraft.network.protocol.game.ClientboundResourcePackPacket;
import net.minecraft.server.PlayerAdvancements;
import net.minecraft.server.ServerAdvancementManager;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_17_R1.CraftServer; import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.abstraction.util.PlayerUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.PlayerUtils;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import xyz.xenondevs.inventoryaccess.map.MapIcon;
import xyz.xenondevs.inventoryaccess.map.MapPatch; import xyz.xenondevs.inventoryaccess.map.MapPatch;
import xyz.xenondevs.inventoryaccess.util.DataUtils;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -27,12 +18,8 @@ import java.util.stream.Collectors;
class PlayerUtilsImpl implements PlayerUtils { class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod( private static final Method REGISTER_LISTENERS_METHOD =
PlayerAdvancements.class, ReflectionUtils.getMethod(AdvancementDataPlayer.class, true, "b", AdvancementDataWorld.class);
true,
"SRM(net.minecraft.server.PlayerAdvancements registerListeners)",
ServerAdvancementManager.class
);
@Override @Override
public void stopAdvancementListening(@NotNull Player player) { public void stopAdvancementListening(@NotNull Player player) {
@ -41,7 +28,7 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void stopAdvancementListening(@NotNull Object player) { public void stopAdvancementListening(@NotNull Object player) {
((ServerPlayer) player).getAdvancements().stopListening(); ((EntityPlayer) player).getAdvancementData().a(); // stops listening
} }
@Override @Override
@ -51,48 +38,41 @@ class PlayerUtilsImpl implements PlayerUtils {
@Override @Override
public void startAdvancementListening(@NotNull Object player) { public void startAdvancementListening(@NotNull Object player) {
PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements(); AdvancementDataPlayer advancements = ((EntityPlayer) player).getAdvancementData();
ServerAdvancementManager manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancements(); AdvancementDataWorld manager = ((CraftServer) Bukkit.getServer()).getServer().getAdvancementData();
ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager); ReflectionUtils.invokeMethod(REGISTER_LISTENERS_METHOD, advancements, manager);
} }
@Override @Override
public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<MapIcon> icons) { public void sendMapUpdate(@NotNull Player player, int mapId, byte scale, boolean locked, @Nullable MapPatch mapPatch, @Nullable List<xyz.xenondevs.inventoryaccess.map.MapIcon> icons) {
List<MapDecoration> decorations = icons != null ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new)) : null; List<net.minecraft.server.v1_16_R3.MapIcon> decorations = icons != null
MapItemSavedData.MapPatch patch = toMapPatch(mapPatch); ? icons.stream().map(this::toMapDecoration).collect(Collectors.toCollection(ArrayList::new))
ClientboundMapItemDataPacket packet = new ClientboundMapItemDataPacket(mapId, scale, locked, decorations, patch); : new ArrayList<>();
((CraftPlayer) player).getHandle().connection.send(packet);
int width = 0;
int height = 0;
int startX = 0;
int startY = 0;
byte[] colors = new byte[0];
if (mapPatch != null) {
width = mapPatch.getWidth();
height = mapPatch.getHeight();
startX = mapPatch.getStartX();
startY = mapPatch.getStartY();
colors = mapPatch.getColors();
} }
private MapDecoration toMapDecoration(MapIcon icon) { PacketPlayOutMap packet = new PacketPlayOutMap(mapId, scale, !decorations.isEmpty(), locked, decorations, colors, startX, startY, width, height);
return new MapDecoration( ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
MapDecoration.Type.byIcon(icon.getType().getId()), }
private MapIcon toMapDecoration(xyz.xenondevs.inventoryaccess.map.MapIcon icon) {
return new MapIcon(
MapIcon.Type.a(icon.getType().getId()),
icon.getX(), icon.getY(), icon.getX(), icon.getY(),
icon.getRot(), icon.getRot(),
icon.getComponent() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponent()) : null icon.getComponent() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponent()) : null
); );
} }
private MapItemSavedData.MapPatch toMapPatch(MapPatch patch) {
if (patch == null) return null;
return new MapItemSavedData.MapPatch(
patch.getStartX(), patch.getStartY(),
patch.getWidth(), patch.getHeight(),
patch.getColors()
);
}
@Override
public void sendResourcePack(@NotNull Player player, @NotNull String url, byte[] hash, @Nullable ComponentWrapper prompt, boolean force) {
var serverPlayer = ((CraftPlayer) player).getHandle();
var packet = new ClientboundResourcePackPacket(
url,
DataUtils.toHexadecimalString(hash),
force,
InventoryUtilsImpl.createNMSComponent(prompt)
);
serverPlayer.connection.connection.send(packet);
}
} }

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<groupId>xyz.xenondevs.invui</groupId> <groupId>xyz.xenondevs.invui</groupId>
@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.18-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.17-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>
@ -36,9 +36,9 @@
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>xyz.xenondevs.string-remapper</groupId> <groupId>xyz.xenondevs</groupId>
<artifactId>string-remapper-maven-plugin</artifactId> <artifactId>string-remapper-maven-plugin</artifactId>
<version>1.2</version> <version>0.6</version>
<executions> <executions>
<execution> <execution>
@ -47,10 +47,14 @@
<goal>remap</goal> <goal>remap</goal>
</goals> </goals>
<configuration> <configuration>
<spigotVersion>${spigot.version}</spigotVersion> <remapGoal>spigot</remapGoal>
<goal>spigot</goal>
<classesIn>${project.build.directory}/classes</classesIn> <classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-spigot</classesOut> <classesOut>${project.build.directory}/classes-spigot</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration> </configuration>
</execution> </execution>
@ -60,10 +64,14 @@
<goal>remap</goal> <goal>remap</goal>
</goals> </goals>
<configuration> <configuration>
<spigotVersion>${spigot.version}</spigotVersion> <remapGoal>mojang</remapGoal>
<goal>mojang</goal>
<classesIn>${project.build.directory}/classes</classesIn> <classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-mojang</classesOut> <classesOut>${project.build.directory}/classes-mojang</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

@ -9,16 +9,15 @@ import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -69,14 +68,14 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY)); player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
// init menu // init menu
player.initMenu(this); player.initMenu(this);
} }
public void sendItem(int slot) { public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(getActiveWindowId(player), incrementStateId(), slot, getItem(slot))); player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot)));
} }
public void setItem(int slot, ItemStack item) { public void setItem(int slot, ItemStack item) {
@ -91,11 +90,6 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
else return resultSlots.getItem(0); else return resultSlots.getItem(0);
} }
private int getActiveWindowId(ServerPlayer player) {
AbstractContainerMenu container = player.containerMenu;
return container == null ? -1 : container.containerId;
}
@Override @Override
public void setItem(int slot, org.bukkit.inventory.ItemStack itemStack) { public void setItem(int slot, org.bukkit.inventory.ItemStack itemStack) {
setItem(slot, CraftItemStack.asNMSCopy(itemStack)); setItem(slot, CraftItemStack.asNMSCopy(itemStack));
@ -116,7 +110,7 @@ class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory {
return open; return open;
} }
// --- AnvilMenu --- // --- ContainerAnvil ---
@Override @Override
public CraftInventoryView getBukkitView() { public CraftInventoryView getBukkitView() {

@ -10,11 +10,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -66,7 +66,7 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
// send initial items // send initial items
NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2)); NonNullList<ItemStack> itemsList = NonNullList.of(ItemStack.EMPTY, getItem(0), getItem(1), getItem(2));
player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), incrementStateId(), itemsList, ItemStack.EMPTY)); player.connection.send(new ClientboundContainerSetContentPacket(InventoryUtilsImpl.getActiveWindowId(player), itemsList));
// init menu // init menu
player.initMenu(this); player.initMenu(this);
@ -78,7 +78,7 @@ class CartographyInventoryImpl extends CartographyTableMenu implements Cartograp
} }
public void sendItem(int slot) { public void sendItem(int slot) {
player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, incrementStateId(), getItem(slot))); player.connection.send(new ClientboundContainerSetSlotPacket(InventoryUtilsImpl.getActiveWindowId(player), slot, getItem(slot)));
} }
public void setItem(int slot, ItemStack item) { public void setItem(int slot, ItemStack item) {

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_18_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r8; package xyz.xenondevs.inventoryaccess.r8;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_18_R1.CraftServer; import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -30,7 +30,7 @@ class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod( private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod(
PlayerAdvancements.class, PlayerAdvancements.class,
true, true,
"ASRM(net/minecraft/server/PlayerAdvancements.registerListeners(Lnet/minecraft/server/ServerAdvancementManager;)V)", "SRM(net.minecraft.server.PlayerAdvancements registerListeners)",
ServerAdvancementManager.class ServerAdvancementManager.class
); );

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<groupId>xyz.xenondevs.invui</groupId> <groupId>xyz.xenondevs.invui</groupId>
@ -15,7 +15,7 @@
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<spigot.version>1.18.2-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.17.1-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <dependencies>
@ -36,9 +36,9 @@
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>xyz.xenondevs.string-remapper</groupId> <groupId>xyz.xenondevs</groupId>
<artifactId>string-remapper-maven-plugin</artifactId> <artifactId>string-remapper-maven-plugin</artifactId>
<version>1.2</version> <version>0.6</version>
<executions> <executions>
<execution> <execution>
@ -47,10 +47,14 @@
<goal>remap</goal> <goal>remap</goal>
</goals> </goals>
<configuration> <configuration>
<spigotVersion>${spigot.version}</spigotVersion> <remapGoal>spigot</remapGoal>
<goal>spigot</goal>
<classesIn>${project.build.directory}/classes</classesIn> <classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-spigot</classesOut> <classesOut>${project.build.directory}/classes-spigot</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration> </configuration>
</execution> </execution>
@ -60,10 +64,14 @@
<goal>remap</goal> <goal>remap</goal>
</goals> </goals>
<configuration> <configuration>
<spigotVersion>${spigot.version}</spigotVersion> <remapGoal>mojang</remapGoal>
<goal>mojang</goal>
<classesIn>${project.build.directory}/classes</classesIn> <classesIn>${project.build.directory}/classes</classesIn>
<classesOut>${project.build.directory}/classes-mojang</classesOut> <classesOut>${project.build.directory}/classes-mojang</classesOut>
<mapsMojang>org.spigotmc:minecraft-server:txt:maps-mojang:${spigot.version}</mapsMojang>
<mapsSpigot>
<classes>org.spigotmc:minecraft-server:csrg:maps-spigot:${spigot.version}</classes>
<members>org.spigotmc:minecraft-server:csrg:maps-spigot-members:${spigot.version}</members>
</mapsSpigot>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>

@ -14,11 +14,11 @@ import net.minecraft.world.inventory.AnvilMenu;
import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryAnvil; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryAnvil;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -10,11 +10,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.inventory.*; import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryCartography; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryCartography;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -7,11 +7,11 @@ import net.minecraft.world.Container;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftContainer; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftContainer;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_18_R2.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

@ -1,9 +1,10 @@
package xyz.xenondevs.inventoryaccess.r9; package xyz.xenondevs.inventoryaccess.r9;
import com.mojang.authlib.GameProfile;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils; import xyz.xenondevs.inventoryaccess.abstraction.util.ItemUtils;
@ -12,11 +13,16 @@ import xyz.xenondevs.inventoryaccess.util.ReflectionRegistry;
import xyz.xenondevs.inventoryaccess.util.ReflectionUtils; import xyz.xenondevs.inventoryaccess.util.ReflectionUtils;
import java.io.*; import java.io.*;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class ItemUtilsImpl implements ItemUtils { class ItemUtilsImpl implements ItemUtils {
private static final Method CRAFT_META_SKULL_SET_PROFILE_METHOD = ReflectionUtils.getMethod(
ReflectionRegistry.CB_CRAFT_META_SKULL_CLASS, true, "setProfile", GameProfile.class
);
@Override @Override
public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) { public byte[] serializeItemStack(org.bukkit.inventory.@NotNull ItemStack itemStack, boolean compressed) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -88,4 +94,9 @@ class ItemUtilsImpl implements ItemUtils {
); );
} }
@Override
public void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile) {
ReflectionUtils.invokeMethod(CRAFT_META_SKULL_SET_PROFILE_METHOD, itemMeta, gameProfile);
}
} }

@ -8,8 +8,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -30,7 +30,7 @@ class PlayerUtilsImpl implements PlayerUtils {
private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod( private static final Method REGISTER_LISTENERS_METHOD = ReflectionUtils.getMethod(
PlayerAdvancements.class, PlayerAdvancements.class,
true, true,
"ASRM(net/minecraft/server/PlayerAdvancements.registerListeners(Lnet/minecraft/server/ServerAdvancementManager;)V)", "SRM(net.minecraft.server.PlayerAdvancements registerListeners)",
ServerAdvancementManager.class ServerAdvancementManager.class
); );

@ -1,5 +1,6 @@
package xyz.xenondevs.inventoryaccess.abstraction.util; package xyz.xenondevs.inventoryaccess.abstraction.util;
import com.mojang.authlib.GameProfile;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -67,4 +68,12 @@ public interface ItemUtils {
*/ */
void setLore(@NotNull ItemMeta itemMeta, @NotNull List<@NotNull ComponentWrapper> lore); void setLore(@NotNull ItemMeta itemMeta, @NotNull List<@NotNull ComponentWrapper> lore);
/**
* Sets the game profile of a player skull, thereby changing its owner and texture.
*
* @param itemMeta The {@link ItemMeta} of the skull
* @param gameProfile The game profile to apply to the skull
*/
void setSkullGameProfile(@NotNull ItemMeta itemMeta, @NotNull GameProfile gameProfile);
} }

Some files were not shown because too many files have changed in this diff Show More