From 050579c673a1a69d900ccf52fa2385c8848a7244 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Wed, 1 Dec 2021 14:57:25 +0100 Subject: [PATCH] 1.18 Support --- InvUI/pom.xml | 5 + InventoryAccess/IA-R8/pom.xml | 78 ++++++++ .../r8/inventory/AnvilInventoryImpl.java | 189 ++++++++++++++++++ .../inventory/CartographyInventoryImpl.java | 134 +++++++++++++ .../r8/util/InventoryUtilsImpl.java | 73 +++++++ .../r8/util/ItemUtilsImpl.java | 100 +++++++++ .../r8/util/PlayerUtilsImpl.java | 79 ++++++++ .../version/InventoryAccessRevision.java | 1 + README.md | 8 +- pom.xml | 5 +- 10 files changed, 666 insertions(+), 6 deletions(-) create mode 100644 InventoryAccess/IA-R8/pom.xml create mode 100644 InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/AnvilInventoryImpl.java create mode 100644 InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/CartographyInventoryImpl.java create mode 100644 InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/InventoryUtilsImpl.java create mode 100644 InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/ItemUtilsImpl.java create mode 100644 InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/PlayerUtilsImpl.java diff --git a/InvUI/pom.xml b/InvUI/pom.xml index 0534f6a..3c4ba09 100644 --- a/InvUI/pom.xml +++ b/InvUI/pom.xml @@ -77,6 +77,11 @@ IA-R7 0.1-SNAPSHOT + + de.studiocode.invui + IA-R8 + 0.1-SNAPSHOT + diff --git a/InventoryAccess/IA-R8/pom.xml b/InventoryAccess/IA-R8/pom.xml new file mode 100644 index 0000000..472da66 --- /dev/null +++ b/InventoryAccess/IA-R8/pom.xml @@ -0,0 +1,78 @@ + + + + InvUI-Parent + de.studiocode.invui + 0.1-SNAPSHOT + ../../pom.xml + + 4.0.0 + + IA-R8 + + + 16 + 16 + 1.18-R0.1-SNAPSHOT + + + + + org.spigotmc + spigot + ${spigotVersion} + remapped-mojang + provided + + + de.studiocode.invui + IA + ${project.parent.version} + + + + + + + net.md-5 + specialsource-maven-plugin + 1.2.2 + + + package + + remap + + remap-obf + + org.spigotmc:minecraft-server:${spigotVersion}:txt:maps-mojang + true + org.spigotmc:spigot:${spigotVersion}:jar:remapped-mojang + + true + remapped-obf + + + + package + + remap + + remap-spigot + + + ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar + + org.spigotmc:minecraft-server:${spigotVersion}:csrg:maps-spigot + org.spigotmc:spigot:${spigotVersion}:jar:remapped-obf + + + + + + + + + \ No newline at end of file diff --git a/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/AnvilInventoryImpl.java b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/AnvilInventoryImpl.java new file mode 100644 index 0000000..49a5967 --- /dev/null +++ b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/AnvilInventoryImpl.java @@ -0,0 +1,189 @@ +package de.studiocode.inventoryaccess.r8.inventory; + +import de.studiocode.inventoryaccess.abstraction.inventory.AnvilInventory; +import de.studiocode.inventoryaccess.r8.util.InventoryUtilsImpl; +import net.md_5.bungee.api.chat.BaseComponent; +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_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryAnvil; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.event.inventory.PrepareAnvilEvent; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +public class AnvilInventoryImpl extends AnvilMenu implements AnvilInventory { + + private final Component title; + private final Consumer renameHandler; + private final CraftInventoryView view; + private final ServerPlayer player; + + private String text; + private boolean open; + + public AnvilInventoryImpl(org.bukkit.entity.Player player, @NotNull BaseComponent[] title, Consumer renameHandler) { + this(((CraftPlayer) player).getHandle(), InventoryUtilsImpl.createNMSComponent(title), renameHandler); + } + + public AnvilInventoryImpl(ServerPlayer player, Component title, Consumer renameHandler) { + super(player.nextContainerCounter(), player.getInventory(), + ContainerLevelAccess.create(player.level, new BlockPos(Integer.MAX_VALUE, 0, 0))); + + this.title = title; + this.renameHandler = renameHandler; + 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, title)); + + // send initial items + NonNullList 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), slot, incrementStateId(), 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 void setItemName(String s) { + // save rename text + text = s; + + // call the rename handler + if (renameHandler != null) renameHandler.accept(s); + + // 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); + } + + /** + * 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 + } + + +} diff --git a/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/CartographyInventoryImpl.java b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/CartographyInventoryImpl.java new file mode 100644 index 0000000..54a4749 --- /dev/null +++ b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/inventory/CartographyInventoryImpl.java @@ -0,0 +1,134 @@ +package de.studiocode.inventoryaccess.r8.inventory; + +import de.studiocode.inventoryaccess.abstraction.inventory.CartographyInventory; +import de.studiocode.inventoryaccess.r8.util.InventoryUtilsImpl; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; +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_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryCartography; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; + +public class CartographyInventoryImpl extends CartographyTableMenu implements CartographyInventory { + + private static final Field RESULT_CONTAINER_FIELD = ReflectionUtils.getField(CartographyTableMenu.class, true, "u"); + + 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(Player player, @NotNull BaseComponent[] 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(Integer.MAX_VALUE, 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 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(net.minecraft.world.entity.player.Player entityhuman, int i) { + return ItemStack.EMPTY; + } + + @Override + public boolean canTakeItemForPickAll(ItemStack itemstack, Slot slot) { + return true; + } + + @Override + public boolean stillValid(net.minecraft.world.entity.player.Player entityhuman) { + return true; + } + + @Override + protected void clearContainer(net.minecraft.world.entity.player.Player entityhuman, Container container) { + // empty + } + +} diff --git a/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/InventoryUtilsImpl.java b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/InventoryUtilsImpl.java new file mode 100644 index 0000000..99fea0b --- /dev/null +++ b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/InventoryUtilsImpl.java @@ -0,0 +1,73 @@ +package de.studiocode.inventoryaccess.r8.util; + +import de.studiocode.inventoryaccess.abstraction.util.InventoryUtils; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; +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_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.event.CraftEventFactory; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftContainer; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_18_R1.util.CraftChatMessage; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; + +public class InventoryUtilsImpl implements InventoryUtils { + + public static Component createNMSComponent(BaseComponent[] components) { + String json = ComponentSerializer.toString(components); + return CraftChatMessage.fromJSON(json); + } + + 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, @NotNull BaseComponent[] 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 BaseComponent[] title) { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + AbstractContainerMenu menu = serverPlayer.containerMenu; + serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), createNMSComponent(title))); + serverPlayer.initMenu(menu); + } + +} diff --git a/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/ItemUtilsImpl.java b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/ItemUtilsImpl.java new file mode 100644 index 0000000..4b48111 --- /dev/null +++ b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/ItemUtilsImpl.java @@ -0,0 +1,100 @@ +package de.studiocode.inventoryaccess.r8.util; + +import de.studiocode.inventoryaccess.abstraction.util.ItemUtils; +import de.studiocode.inventoryaccess.util.ReflectionRegistry; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.io.*; +import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; + +public class ItemUtilsImpl implements ItemUtils { + + private static final Field CRAFT_ITEM_STACK_HANDLE_FIELD = ReflectionUtils.getField(CraftItemStack.class, true, "handle"); + + @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; + + if (itemStack instanceof CraftItemStack) + nmsStack = (ItemStack) CRAFT_ITEM_STACK_HANDLE_FIELD.get(itemStack); + else 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 (IllegalAccessException | 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, BaseComponent[] name) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_DISPLAY_NAME_FIELD, + itemMeta, + ComponentSerializer.toString(name) + ); + } + + @Override + public void setLore(@NotNull ItemMeta itemMeta, @NotNull List<@NotNull BaseComponent[]> lore) { + ReflectionUtils.setFieldValue( + ReflectionRegistry.CB_CRAFT_META_ITEM_LORE_FIELD, + itemMeta, + lore.stream().map(ComponentSerializer::toString).collect(Collectors.toList()) + ); + } + +} \ No newline at end of file diff --git a/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/PlayerUtilsImpl.java b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/PlayerUtilsImpl.java new file mode 100644 index 0000000..85fdc99 --- /dev/null +++ b/InventoryAccess/IA-R8/src/main/java/de/studiocode/inventoryaccess/r8/util/PlayerUtilsImpl.java @@ -0,0 +1,79 @@ +package de.studiocode.inventoryaccess.r8.util; + +import de.studiocode.inventoryaccess.abstraction.util.PlayerUtils; +import de.studiocode.inventoryaccess.map.MapIcon; +import de.studiocode.inventoryaccess.map.MapPatch; +import de.studiocode.inventoryaccess.util.ReflectionUtils; +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_18_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class PlayerUtilsImpl implements PlayerUtils { + + private static final Method REGISTER_LISTENERS_METHOD = + ReflectionUtils.getMethod(PlayerAdvancements.class, true, "b", 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 icons) { + List 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.getComponents() != null ? InventoryUtilsImpl.createNMSComponent(icon.getComponents()) : 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() + ); + } + +} diff --git a/InventoryAccess/IA/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccessRevision.java b/InventoryAccess/IA/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccessRevision.java index 78b92f3..d346bf8 100644 --- a/InventoryAccess/IA/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccessRevision.java +++ b/InventoryAccess/IA/src/main/java/de/studiocode/inventoryaccess/version/InventoryAccessRevision.java @@ -5,6 +5,7 @@ import de.studiocode.inventoryaccess.util.VersionUtils; public enum InventoryAccessRevision { // this order is required + R8("r8", "1.18.0"), R7("r7", "1.17.1"), R6("r6", "1.17.0"), R5("r5", "1.16.4"), diff --git a/README.md b/README.md index de9eb4a..702aa5d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ ![Logo](https://i.imgur.com/bFqCsuj.png) -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/446b3c9356744523b409a6a6d281e772)](https://www.codacy.com/gh/NichtStudioCode/InvUI/dashboard?utm_source=github.com&utm_medium=referral&utm_content=NichtStudioCode/InvUI&utm_campaign=Badge_Grade) [![Stars](https://img.shields.io/github/stars/NichtStudioCode/InvUI?color=ffa200)](https://github.com/NichtStudioCode/InvUI/stargazers) ![GitHub issues](https://img.shields.io/github/issues/NichtStudioCode/InvUI) ![License](https://img.shields.io/github/license/NichtStudioCode/InvUI) @@ -9,17 +8,18 @@ An Inventory API for Minecraft Spigot servers. -Supports all versions from 1.14 to 1.17. +Supports all versions from 1.14 to 1.18. [Wiki](https://github.com/NichtStudioCode/InvUI/wiki) ## Features -* Different types of inventories (Chest, Anvil, Dropper...) +* Different types of inventories (Chest, Anvil, Cartography Table, Dropper...) * Different GUI types (Normal, Paged, Tab, Scroll) * Nested GUIs (For example use another PagedGUI as a page) * Easily customizable (Create your own GUI types and Items) -* Easy way to add localization using the built-in ItemBuilder +* VirtualInventories to store actual items in GUIs +* Easy way to add localization using the ItemProvider system and the built-in ItemBuilder * Supports custom textures (Forced ResourcePack) * Uncloseable inventories * GUI Builder diff --git a/pom.xml b/pom.xml index e66778f..ea1328d 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ org.jetbrains annotations - RELEASE + 23.0.0 compile @@ -45,6 +45,7 @@ InventoryAccess/IA-R5 InventoryAccess/IA-R6 InventoryAccess/IA-R7 + InventoryAccess/IA-R8 InventoryAccess/IA InvUI @@ -67,7 +68,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.3.0 + 3.3.1 attach-javadocs