From d8b2f59092dbe0e25f8356af4276f247bdd85515 Mon Sep 17 00:00:00 2001 From: Kalka <9144208+kalkafox@users.noreply.github.com> Date: Tue, 23 Jun 2026 18:11:15 -0400 Subject: [PATCH 01/13] NMS adapter for Minecraft 26.2 --- .../paper1_21_10/container/OpenInventory.java | 4 +- .../paper1_21_10/player/OpenPlayer.java | 2 +- .../container/OpenEnderChest.java | 4 +- .../paper1_21_11/container/OpenInventory.java | 4 +- .../container/menu/OpenEnderChestMenu.java | 4 +- .../container/menu/OpenInventoryMenu.java | 4 +- .../paper1_21_8/container/OpenInventory.java | 4 +- .../paper1_21_8/player/OpenPlayer.java | 2 +- .../paper1_21_8/player/PlayerManager.java | 2 +- internal/paper26_1/build.gradle.kts | 3 + .../internal/paper26_1/InternalAccessor.java | 60 +--- .../container/AnySilentContainer.java | 216 +----------- .../paper26_1/container/OpenEnderChest.java | 190 +--------- .../slot/placeholder/PlaceholderLoader.java | 35 +- .../paper26_1/player/PlayerManager.java | 297 +--------------- internal/paper26_2/build.gradle.kts | 68 ++++ .../internal/paper26_2/InternalAccessor.java | 96 +++++ .../container/AnySilentContainer.java | 232 ++++++++++++ .../container/BaseOpenInventory.java | 32 +- .../paper26_2/container/OpenEnderChest.java | 205 +++++++++++ .../paper26_2}/container/OpenInventory.java | 4 +- .../container/bukkit/OpenDummyInventory.java | 2 +- .../bukkit/OpenDummyPlayerInventory.java | 2 +- .../container/bukkit/OpenPlayerInventory.java | 4 +- .../bukkit/OpenPlayerInventorySelf.java | 4 +- .../container/menu/BaseOpenInventoryMenu.java | 14 +- .../container/menu/OpenChestMenu.java | 6 +- .../container/menu/OpenEnderChestMenu.java | 4 +- .../container/menu/OpenInventoryMenu.java | 4 +- .../container/menu/OpenSyncMenu.java | 4 +- .../paper26_2}/container/slot/Content.java | 2 +- .../container/slot/ContentCrafting.java | 6 +- .../container/slot/ContentCraftingResult.java | 4 +- .../container/slot/ContentCursor.java | 6 +- .../container/slot/ContentDrop.java | 6 +- .../container/slot/ContentEquipment.java | 4 +- .../container/slot/ContentList.java | 2 +- .../container/slot/ContentOffHand.java | 4 +- .../container/slot/ContentViewOnly.java | 2 +- .../container/slot/SlotPlaceholder.java | 2 +- .../container/slot/SlotViewOnly.java | 10 +- .../slot/placeholder/PlaceholderLoader.java | 40 +++ .../placeholder/PlaceholderLoaderBase.java | 15 +- .../slot/placeholder/Placeholders.java | 4 +- .../paper26_2}/player/OpenPlayer.java | 2 +- .../paper26_2/player/PlayerManager.java | 330 ++++++++++++++++++ plugin/build.gradle.kts | 3 + .../lishid/openinv/util/InternalAccessor.java | 5 +- settings.gradle.kts | 1 + 49 files changed, 1117 insertions(+), 843 deletions(-) create mode 100644 internal/paper26_2/build.gradle.kts create mode 100644 internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java create mode 100644 internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/BaseOpenInventory.java (90%) create mode 100644 internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenEnderChest.java rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/OpenInventory.java (94%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/bukkit/OpenDummyInventory.java (98%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/bukkit/OpenDummyPlayerInventory.java (97%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/bukkit/OpenPlayerInventory.java (98%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/bukkit/OpenPlayerInventorySelf.java (80%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/menu/BaseOpenInventoryMenu.java (95%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/menu/OpenChestMenu.java (97%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/menu/OpenEnderChestMenu.java (93%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/menu/OpenInventoryMenu.java (85%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/menu/OpenSyncMenu.java (97%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/Content.java (96%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentCrafting.java (95%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentCraftingResult.java (91%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentCursor.java (94%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentDrop.java (90%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentEquipment.java (95%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentList.java (95%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentOffHand.java (92%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/ContentViewOnly.java (95%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/SlotPlaceholder.java (89%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/SlotViewOnly.java (89%) create mode 100644 internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/placeholder/PlaceholderLoaderBase.java (94%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/container/slot/placeholder/Placeholders.java (91%) rename internal/{paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1 => paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2}/player/OpenPlayer.java (99%) create mode 100644 internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java diff --git a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java index c9bbc816..0b2dbe2d 100644 --- a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java +++ b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java @@ -1,8 +1,8 @@ package com.lishid.openinv.internal.paper1_21_10.container; import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FontDescription; diff --git a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java index 3a4041be..d54c25d4 100644 --- a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java +++ b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java @@ -8,7 +8,7 @@ import java.nio.file.Path; -public class OpenPlayer extends com.lishid.openinv.internal.paper26_1.player.OpenPlayer { +public class OpenPlayer extends com.lishid.openinv.internal.paper26_2.player.OpenPlayer { protected OpenPlayer( CraftServer server, diff --git a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenEnderChest.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenEnderChest.java index 3fe30bb7..d3b18469 100644 --- a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenEnderChest.java +++ b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenEnderChest.java @@ -1,14 +1,14 @@ package com.lishid.openinv.internal.paper1_21_11.container; import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenEnderChestMenu; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; @NullMarked -public class OpenEnderChest extends com.lishid.openinv.internal.paper26_1.container.OpenEnderChest { +public class OpenEnderChest extends com.lishid.openinv.internal.paper26_2.container.OpenEnderChest { public OpenEnderChest(org.bukkit.entity.Player player) { super(player); diff --git a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenInventory.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenInventory.java index 81ba97c8..93541b96 100644 --- a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenInventory.java +++ b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/OpenInventory.java @@ -1,14 +1,14 @@ package com.lishid.openinv.internal.paper1_21_11.container; import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; @NullMarked -public class OpenInventory extends com.lishid.openinv.internal.paper26_1.container.OpenInventory { +public class OpenInventory extends com.lishid.openinv.internal.paper26_2.container.OpenInventory { public OpenInventory(org.bukkit.entity.Player bukkitPlayer) { super(bukkitPlayer); diff --git a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenEnderChestMenu.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenEnderChestMenu.java index 7c0e487e..e1414092 100644 --- a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenEnderChestMenu.java +++ b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenEnderChestMenu.java @@ -1,7 +1,7 @@ package com.lishid.openinv.internal.paper1_21_11.container.menu; -import com.lishid.openinv.internal.paper26_1.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenSyncMenu; +import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenSyncMenu; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ClickType; diff --git a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenInventoryMenu.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenInventoryMenu.java index 750c4a87..d68d613b 100644 --- a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenInventoryMenu.java +++ b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/container/menu/OpenInventoryMenu.java @@ -1,7 +1,7 @@ package com.lishid.openinv.internal.paper1_21_11.container.menu; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_1.container.menu.BaseOpenInventoryMenu; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.menu.BaseOpenInventoryMenu; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ClickType; diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java index fc973a48..60ba507e 100644 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java +++ b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java @@ -1,8 +1,8 @@ package com.lishid.openinv.internal.paper1_21_8.container; import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java index 2795a7dd..ae00880e 100644 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java +++ b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java @@ -10,7 +10,7 @@ import java.nio.file.Path; import java.util.Optional; -public class OpenPlayer extends com.lishid.openinv.internal.paper26_1.player.OpenPlayer { +public class OpenPlayer extends com.lishid.openinv.internal.paper26_2.player.OpenPlayer { protected OpenPlayer( CraftServer server, diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java index 09290e5b..15c5bfd7 100644 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java +++ b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java @@ -1,6 +1,6 @@ package com.lishid.openinv.internal.paper1_21_8.player; -import com.lishid.openinv.internal.paper26_1.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; import com.lishid.openinv.util.JulLoggerAdapter; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; diff --git a/internal/paper26_1/build.gradle.kts b/internal/paper26_1/build.gradle.kts index dfe9337f..1def98e7 100644 --- a/internal/paper26_1/build.gradle.kts +++ b/internal/paper26_1/build.gradle.kts @@ -57,6 +57,9 @@ dependencies { implementation(project(":openinvcommon")) { exclude(group = "org.spigotmc", module = "spigot-api") } + api(project(":openinvadapterpaper26_2")) { + exclude(group = "io.papermc.paper", module = "dev-bundle") + } paperweight.paperDevBundle("26.1.2.build.5-alpha") } diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java index e31407a7..289089e5 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java @@ -1,52 +1,39 @@ package com.lishid.openinv.internal.paper26_1; -import com.lishid.openinv.internal.Accessor; -import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.paper26_1.container.AnySilentContainer; import com.lishid.openinv.internal.paper26_1.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_1.container.OpenInventory; import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.PlaceholderLoader; import com.lishid.openinv.internal.paper26_1.player.PlayerManager; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoaderBase; import com.lishid.openinv.util.lang.LanguageManager; -import net.minecraft.world.Container; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.logging.Level; import java.util.logging.Logger; -public class InternalAccessor implements Accessor { - - protected final @NotNull Logger logger; - private final @NotNull PlayerManager manager; - private final @NotNull AnySilentContainer anySilentContainer; +public class InternalAccessor extends com.lishid.openinv.internal.paper26_2.InternalAccessor { public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { - this.logger = logger; - manager = new PlayerManager(logger); - anySilentContainer = new AnySilentContainer(logger, lang); + super(logger, lang); } @Override - public @NotNull PlayerManager getPlayerManager() { - return manager; + protected @NotNull PlayerManager createPlayerManager(@NotNull Logger logger) { + return new PlayerManager(logger); } @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { - return anySilentContainer; + protected @NotNull AnySilentContainer createAnySilentContainer( + @NotNull Logger logger, + @NotNull LanguageManager lang + ) { + return new AnySilentContainer(logger, lang); } @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { - return new OpenInventory(player); + protected @NotNull PlaceholderLoaderBase createPlaceholderLoader() { + return new PlaceholderLoader(); } @Override @@ -54,27 +41,4 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { return new OpenEnderChest(player); } - @Override - public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { - if (!(bukkitInventory instanceof CraftInventory craftInventory)) { - return null; - } - Container container = craftInventory.getInventory(); - if (clazz.isInstance(container)) { - return clazz.cast(container); - } - return null; - } - - @Override - public void reload(@NotNull ConfigurationSection config) { - ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); - try { - // Reset placeholders to defaults and try to load configuration. - new PlaceholderLoader().load(placeholders); - } catch (Exception e) { - logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); - } - } - } diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/AnySilentContainer.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/AnySilentContainer.java index 26f8d75f..091623c8 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/AnySilentContainer.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/AnySilentContainer.java @@ -1,228 +1,20 @@ -/* - * Copyright (C) 2011-2023 lishid. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.lishid.openinv.internal.paper26_1.container; -import com.lishid.openinv.internal.AnySilentContainerBase; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; -import com.lishid.openinv.internal.paper26_1.player.PlayerManager; -import com.lishid.openinv.util.ReflectionHelper; import com.lishid.openinv.util.lang.LanguageManager; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerPlayerGameMode; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.SimpleMenuProvider; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.inventory.ChestMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.PlayerEnderChestContainer; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.block.BarrelBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.ChestBlock; -import net.minecraft.world.level.block.ShulkerBoxBlock; -import net.minecraft.world.level.block.TrappedChestBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.EnderChestBlockEntity; import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.Statistic; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Field; import java.util.logging.Logger; -public class AnySilentContainer extends AnySilentContainerBase { - - private final @NotNull Logger logger; - private final @NotNull LanguageManager lang; - private @Nullable Field serverPlayerGameModeGameType; +public class AnySilentContainer extends com.lishid.openinv.internal.paper26_2.container.AnySilentContainer { public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { - this.logger = logger; - this.lang = lang; - try { - try { - this.serverPlayerGameModeGameType = ServerPlayerGameMode.class.getDeclaredField("gameModeForPlayer"); - this.serverPlayerGameModeGameType.setAccessible(true); - } catch (NoSuchFieldException e) { - logger.warning("The field ServerPlayerGameMode#gameModeForPlayer is no longer present!"); - logger.warning("Please report this at https://github.com/Jikoo/OpenInv/issues"); - logger.warning("Attempting to fall through using reflection. Please verify that SilentContainer does not fail."); - // N.B. gameModeForPlayer is (for now) declared before previousGameModeForPlayer so silent shouldn't break. - this.serverPlayerGameModeGameType = ReflectionHelper.grabFieldByType(ServerPlayerGameMode.class, GameType.class); - } - } catch (SecurityException e) { - logger.warning("Unable to directly write player game mode! SilentContainer will fail."); - logger.log(java.util.logging.Level.WARNING, "Error obtaining GameType field", e); - } - } - - @Override - public boolean activateContainer( - @NotNull final Player bukkitPlayer, - final boolean silentchest, - @NotNull final org.bukkit.block.Block bukkitBlock - ) { - - // Silent ender chest is API-only - if (silentchest && bukkitBlock.getType() == Material.ENDER_CHEST) { - bukkitPlayer.openInventory(bukkitPlayer.getEnderChest()); - bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); - return true; - } - - ServerPlayer player = PlayerManager.getHandle(bukkitPlayer); - - final net.minecraft.world.level.Level level = ((Entity) player).level(); - final BlockPos blockPos = new BlockPos(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ()); - final BlockEntity blockEntity = level.getBlockEntity(blockPos); - - if (blockEntity == null) { - return false; - } - - if (blockEntity instanceof EnderChestBlockEntity enderChestTile) { - // Anychest ender chest. See net.minecraft.world.level.block.EnderChestBlock - PlayerEnderChestContainer enderChest = player.getEnderChestInventory(); - enderChest.setActiveChest(enderChestTile); - player.openMenu( - new SimpleMenuProvider( - (containerCounter, playerInventory, ignored) -> { - MenuType containers = OpenChestMenu.getChestMenuType(enderChest.getContainerSize()); - int rows = enderChest.getContainerSize() / 9; - return new ChestMenu(containers, containerCounter, playerInventory, enderChest, rows); - }, Component.translatable("container.enderchest") - ) - ); - bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); - return true; - } - - if (!(blockEntity instanceof MenuProvider menuProvider)) { - return false; - } - - BlockState blockState = level.getBlockState(blockPos); - Block block = blockState.getBlock(); - - if (block instanceof ChestBlock chestBlock) { - - // boolean flag: do not check if chest is blocked - menuProvider = chestBlock.getMenuProvider(blockState, level, blockPos, true); - - if (menuProvider == null) { - lang.sendSystemMessage(bukkitPlayer, "messages.error.lootNotGenerated"); - return false; - } - - if (block instanceof TrappedChestBlock) { - bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED); - } else { - bukkitPlayer.incrementStatistic(Statistic.CHEST_OPENED); - } - } - - if (block instanceof ShulkerBoxBlock) { - bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED); - } - - if (block instanceof BarrelBlock) { - bukkitPlayer.incrementStatistic(Statistic.OPEN_BARREL); - } - - // AnyChest only - SilentChest not active, container unsupported, or unnecessary. - if (!silentchest || player.gameMode.getGameModeForPlayer() == GameType.SPECTATOR) { - player.openMenu(menuProvider); - return true; - } - - // SilentChest requires access to setting players' game mode directly. - if (this.serverPlayerGameModeGameType == null) { - return false; - } - - if (blockEntity instanceof RandomizableContainerBlockEntity lootable) { - if (lootable.lootTable != null) { - lang.sendSystemMessage(bukkitPlayer, "messages.error.lootNotGenerated"); - return false; - } - } - - GameType gameType = player.gameMode.getGameModeForPlayer(); - this.forceGameType(player, GameType.SPECTATOR); - player.openMenu(menuProvider); - this.forceGameType(player, gameType); - return true; - } - - @Override - public void deactivateContainer(@NotNull final Player bukkitPlayer) { - if (this.serverPlayerGameModeGameType == null || bukkitPlayer.getGameMode() == GameMode.SPECTATOR) { - return; - } - - ServerPlayer player = PlayerManager.getHandle(bukkitPlayer); - - // Force game mode change without informing plugins or players. - // Regular game mode set calls GameModeChangeEvent and is cancellable. - GameType gameType = player.gameMode.getGameModeForPlayer(); - this.forceGameType(player, GameType.SPECTATOR); - - // ServerPlayer#closeContainer cannot be called without entering an - // infinite loop because this method is called during inventory close. - // From ServerPlayer#closeContainer -> CraftEventFactory#handleInventoryCloseEvent - player.containerMenu.transferTo(player.inventoryMenu, player.getBukkitEntity()); - // From ServerPlayer#closeContainer - player.doCloseContainer(); - // Regular inventory close will handle the rest - packet sending, etc. - - // Revert forced game mode. - this.forceGameType(player, gameType); - } - - private void forceGameType(final ServerPlayer player, final GameType gameMode) { - if (this.serverPlayerGameModeGameType == null) { - // No need to warn repeatedly, error on startup and lack of function should be enough. - return; - } - try { - this.serverPlayerGameModeGameType.setAccessible(true); - this.serverPlayerGameModeGameType.set(player.gameMode, gameMode); - } catch (IllegalArgumentException | IllegalAccessException e) { - logger.log(java.util.logging.Level.WARNING, "Error bypassing GameModeChangeEvent", e); - } - } - - @Override - protected org.bukkit.block.BlockState getState(@NotNull org.bukkit.block.Block block) { - return block.getState(false); + super(logger, lang); } @Override - protected InventoryHolder getHolder(@NotNull Inventory inventory) { - return inventory.getHolder(false); + protected boolean hasLootTable(@NotNull RandomizableContainerBlockEntity lootable) { + return lootable.lootTable != null; } } diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenEnderChest.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenEnderChest.java index 5b1411a4..f0239a9f 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenEnderChest.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenEnderChest.java @@ -1,201 +1,19 @@ package com.lishid.openinv.internal.paper26_1.container; -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenEnderChestMenu; -import com.lishid.openinv.internal.paper26_1.player.PlayerManager; import net.minecraft.core.NonNullList; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.StackedItemContents; -import net.minecraft.world.inventory.StackedContentsCompatible; import net.minecraft.world.item.ItemStack; -import org.bukkit.Location; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; - -public class OpenEnderChest implements Container, StackedContentsCompatible, InternalOwned, - ISpecialEnderChest { - - private CraftInventory inventory; - private @NotNull ServerPlayer owner; - private NonNullList items; - private int maxStack = 64; - private final List transaction = new ArrayList<>(); +public class OpenEnderChest extends com.lishid.openinv.internal.paper26_2.container.OpenEnderChest { public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { - this.owner = PlayerManager.getHandle(player); - this.items = owner.getEnderChestInventory().items; - } - - @Override - public @NotNull ServerPlayer getOwnerHandle() { - return owner; - } - - @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { - if (inventory == null) { - inventory = new CraftInventory(this) { - @Override - public @NotNull InventoryType getType() { - return InventoryType.ENDER_CHEST; - } - }; - } - return inventory; - } - - @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { - owner = PlayerManager.getHandle(player); - NonNullList activeItems = owner.getEnderChestInventory().items; - - // Guard against size changing. Theoretically on Purpur all row variations still have 6 rows internally. - int max = Math.min(items.size(), activeItems.size()); - for (int index = 0; index < max; ++index) { - activeItems.set(index, items.get(index)); - } - - items = activeItems; - } - - @Override - public @NotNull org.bukkit.entity.Player getPlayer() { - return owner.getBukkitEntity(); - } - - @Override - public int getContainerSize() { - return items.size(); + super(player); } @Override - public boolean isEmpty() { - return items.stream().allMatch(ItemStack::isEmpty); - } - - @Override - public @NotNull ItemStack getItem(int index) { - return index >= 0 && index < items.size() ? items.get(index) : ItemStack.EMPTY; - } - - @Override - public @NotNull ItemStack removeItem(int index, int amount) { - ItemStack itemstack = ContainerHelper.removeItem(items, index, amount); - - if (!itemstack.isEmpty()) { - setChanged(); - } - - return itemstack; - } - - @Override - public @NotNull ItemStack removeItemNoUpdate(int index) { - return index >= 0 && index < items.size() ? items.set(index, ItemStack.EMPTY) : ItemStack.EMPTY; - } - - @Override - public void setItem(int index, @NotNull ItemStack itemStack) { - if (index >= 0 && index < items.size()) { - items.set(index, itemStack); - } - } - - @Override - public int getMaxStackSize() { - return maxStack; - } - - @Override - public void setChanged() { - this.owner.getEnderChestInventory().setChanged(); - } - - @Override - public boolean stillValid(@NotNull Player player) { - return true; - } - - @Override - public @NotNull List getContents() { - return items; - } - - @Override - public void onOpen(@NotNull CraftHumanEntity craftHumanEntity) { - transaction.add(craftHumanEntity); - } - - @Override - public void onClose(@NotNull CraftHumanEntity craftHumanEntity) { - transaction.remove(craftHumanEntity); - } - - @Override - public @NotNull List getViewers() { - return transaction; - } - - @Override - public org.bukkit.entity.Player getOwner() { - return getPlayer(); - } - - @Override - public void setMaxStackSize(int size) { - maxStack = size; - } - - @Override - public @Nullable Location getLocation() { - return null; - } - - @Override - public void clearContent() { - items.clear(); - setChanged(); - } - - @Override - public void fillStackedContents(@NotNull StackedItemContents stackedContents) { - for (ItemStack itemstack : items) { - stackedContents.accountStack(itemstack); - } - } - - public Component getTitle(@Nullable OpenChestMenu menu) { - MutableComponent component; - if (menu != null && menu.isViewOnly()) { - component = Component.translatableWithFallback("openinv.container.enderchest.viewonly", "[RO] "); - } else { - component = Component.translatableWithFallback("openinv.container.enderchest.editable", ""); - } - return component - .append(Component.translatableWithFallback("openinv.container.enderchest.prefix", "", owner.getName())) - .append(Component.translatable("container.enderchest")) - .append(Component.translatableWithFallback("openinv.container.enderchest.suffix", " - %s", owner.getName())); - } - - public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { - if (player instanceof ServerPlayer serverPlayer) { - return new OpenEnderChestMenu(this, serverPlayer, i, viewOnly); - } - return null; + protected @NotNull NonNullList getEnderChestItems(@NotNull ServerPlayer owner) { + return owner.getEnderChestInventory().items; } } diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoader.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoader.java index 90efc9a0..8550c544 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoader.java @@ -1,40 +1,19 @@ package com.lishid.openinv.internal.paper26_1.container.slot.placeholder; -import net.minecraft.core.component.DataComponents; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.TagParser; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.CustomModelData; -import net.minecraft.world.item.component.DyedItemColor; -import net.minecraft.world.item.component.TooltipDisplay; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; -import java.util.LinkedHashSet; -import java.util.List; - -public class PlaceholderLoader extends PlaceholderLoaderBase { - - private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); - private static final TooltipDisplay HIDE_TOOLTIP = new TooltipDisplay(true, new LinkedHashSet<>()); - - @Override - protected @NotNull CompoundTag parseTag(@NotNull String itemText) throws Exception { - return TagParser.parseCompoundFully(itemText); - } - - @Override - protected void addModelData(@NotNull ItemStack itemStack) { - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - } +public class PlaceholderLoader extends com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader { @Override - protected void hideTooltip(@NotNull ItemStack itemStack) { - itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); + protected @NotNull Item getDefaultCursorItem() { + return Items.WHITE_BANNER; } @Override - protected DyedItemColor getDye(int rgb) { - return new DyedItemColor(rgb); + protected @NotNull Item getDefaultNotSlotItem() { + return Items.WHITE_STAINED_GLASS_PANE; } } diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java index 1f3a0820..1bfbca0e 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java @@ -1,309 +1,40 @@ package com.lishid.openinv.internal.paper26_1.player; -import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_1.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; -import com.lishid.openinv.util.JulLoggerAdapter; -import com.mojang.authlib.GameProfile; -import com.mojang.logging.LogUtils; -import io.papermc.paper.adventure.PaperAdventure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ClientInformation; -import net.minecraft.server.level.ParticleStatus; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.ProblemReporter; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.ChatVisiblity; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.LevelData; -import net.minecraft.world.level.storage.TagValueInput; -import net.minecraft.world.level.storage.TagValueOutput; -import net.minecraft.world.level.storage.ValueInput; -import net.minecraft.world.level.storage.ValueOutput; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.inventory.InventoryView; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; +import net.minecraft.world.phys.Vec3; -import java.lang.reflect.Field; -import java.util.Optional; -import java.util.UUID; import java.util.logging.Logger; -@NullMarked -public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { - - protected final Logger logger; - protected @Nullable Field bukkitEntity; +public class PlayerManager extends com.lishid.openinv.internal.paper26_2.player.PlayerManager { public PlayerManager(Logger logger) { - this.logger = logger; - try { - bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); - } catch (NoSuchFieldException e) { - logger.warning("Unable to obtain field to inject custom save process - certain player data may be lost when saving!"); - logger.log(java.util.logging.Level.WARNING, e.getMessage(), e); - bukkitEntity = null; - } - } - - public static ServerPlayer getHandle(final Player player) { - if (player instanceof CraftPlayer craftPlayer) { - return craftPlayer.getHandle(); - } - - Server server = player.getServer(); - ServerPlayer nmsPlayer = null; - - if (server instanceof CraftServer craftServer) { - nmsPlayer = craftServer.getHandle().getPlayer(player.getUniqueId()); - } - - if (nmsPlayer == null) { - // Could use reflection to examine fields, but it's honestly not worth the bother. - throw new RuntimeException("Unable to fetch EntityPlayer from Player implementation " + player.getClass().getName()); - } - - return nmsPlayer; + super(logger); } @Override - public @Nullable Player loadPlayer(final OfflinePlayer offline) { - if (!(Bukkit.getServer() instanceof CraftServer craftServer)) { - return null; - } - - MinecraftServer server = craftServer.getServer(); - ServerLevel worldServer = server.getLevel(Level.OVERWORLD); - - if (worldServer == null) { - return null; - } - - // Create a new ServerPlayer. - ServerPlayer entity = createNewPlayer(server, worldServer, offline); - - // Stop listening for advancement progression - if this is not cleaned up, loading causes a memory leak. + protected void clearAdvancements(ServerPlayer entity) { entity.getAdvancements().stopListening(); - - // Try to load the player's data. - if (loadData(server, entity)) { - // If data is loaded successfully, return the Bukkit entity. - return entity.getBukkitEntity(); - } - - return null; } - protected ServerPlayer createNewPlayer( - MinecraftServer server, - ServerLevel worldServer, - final OfflinePlayer offline - ) { - // See net.minecraft.server.players.PlayerList#canPlayerLogin(ServerLoginPacketListenerImpl, GameProfile) - // See net.minecraft.server.network.ServerLoginPacketListenerImpl#handleHello(ServerboundHelloPacket) - GameProfile profile = new GameProfile(offline.getUniqueId(), - offline.getName() != null ? offline.getName() : offline.getUniqueId().toString() - ); - - ClientInformation dummyInfo = new ClientInformation( - "en_us", - 1, // Reduce distance just in case. - ChatVisiblity.HIDDEN, // Don't accept chat. - false, - ServerPlayer.DEFAULT_MODEL_CUSTOMIZATION, - ServerPlayer.DEFAULT_MAIN_HAND, - true, - false, // Don't list in player list (not that this player is in the list anyway). - ParticleStatus.MINIMAL - ); - - ServerPlayer entity = new ServerPlayer(server, worldServer, profile, dummyInfo); - - try { - injectPlayer(server, entity); - } catch (IllegalAccessException e) { - logger.log( - java.util.logging.Level.WARNING, - e, - () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!" - ); - } - - return entity; - } - - protected boolean loadData(MinecraftServer server, ServerPlayer player) { - // See CraftPlayer#loadData - - try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), new JulLoggerAdapter(logger))) { - CompoundTag loadedData = server.getPlayerList().playerIo.load(player.nameAndId()).orElse(null); - - if (loadedData == null) { - // Exceptions with loading are logged. - return false; - } - - ValueInput valueInput = TagValueInput.create(scopedCollector, player.registryAccess(), loadedData); - - // Read basic data into the player. - player.load(valueInput); - - // World is not loaded by ServerPlayer#load(CompoundTag) on Paper. - parseWorld(server, player, valueInput); - } - - return true; + @Override + protected LevelData.RespawnData getRespawnData(ServerLevel level) { + return level.levelData.getRespawnData(); } - protected void parseWorld( - MinecraftServer server, + @Override + protected Vec3 getAdjustedSpawnLocation( ServerPlayer player, - ValueInput loadedData + ServerLevel level, + LevelData.RespawnData respawnData ) { - // See PlayerList#placeNewPlayer - World bukkitWorld; - Optional msbs = loadedData.getLong("WorldUUIDMost"); - Optional lsbs = loadedData.getLong("WorldUUIDLeast"); - if (msbs.isPresent() && lsbs.isPresent()) { - // Modern Bukkit world. - bukkitWorld = Bukkit.getServer().getWorld(new UUID(msbs.get(), lsbs.get())); - } else { - bukkitWorld = loadedData.getString("world").map(Bukkit::getWorld).orElse(null); - } - if (bukkitWorld == null) { - spawnInDefaultWorld(server, player); - return; - } - player.setServerLevel(((CraftWorld) bukkitWorld).getHandle()); - } - - protected void spawnInDefaultWorld(MinecraftServer server, ServerPlayer player) { - ServerLevel level = server.getLevel(Level.OVERWORLD); - if (level != null) { - // Adjust player to default spawn (in keeping with Paper handling) when world not found. - LevelData.RespawnData respawnData = level.levelData.getRespawnData(); - player.snapTo(player.adjustSpawnLocation(level, respawnData.pos()).getBottomCenter(), respawnData.yaw(), 0.0F); - player.spawnIn(level); - } else { - logger.warning("Tried to load player with invalid world when no fallback was available!"); - } - } - - protected void injectPlayer(MinecraftServer server, ServerPlayer player) throws IllegalAccessException { - if (bukkitEntity == null) { - return; - } - - bukkitEntity.setAccessible(true); - - bukkitEntity.set(player, new OpenPlayer(server.server, player, this)); - } - - @Override - public Player inject(Player player) { - try { - ServerPlayer nmsPlayer = getHandle(player); - if (nmsPlayer.getBukkitEntity() instanceof OpenPlayer openPlayer) { - return openPlayer; - } - - org.slf4j.Logger logger = LogUtils.getLogger(); - - try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(nmsPlayer.problemPath(), logger)) { - CompoundTag extraData = new CompoundTag(); - - // Copy extra data out of existing player. - ValueOutput output = TagValueOutput.createWrappingWithContext(scopedCollector, nmsPlayer.registryAccess(), extraData); - nmsPlayer.getBukkitEntity().setExtraData(output); - - MinecraftServer server = nmsPlayer.level().getServer(); - injectPlayer(server, nmsPlayer); - CraftPlayer newPlayer = nmsPlayer.getBukkitEntity(); - - // Set extra data in new player. - ValueInput input = TagValueInput.create(scopedCollector, nmsPlayer.registryAccess(), extraData); - newPlayer.readExtraData(input); - - return newPlayer; - } - } catch (IllegalAccessException e) { - logger.log( - java.util.logging.Level.WARNING, - e, - () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!" - ); - return player; - } + return player.adjustSpawnLocation(level, respawnData.pos()).getBottomCenter(); } @Override - public @Nullable InventoryView openInventory( - Player bukkitPlayer, - ISpecialInventory inventory, - boolean viewOnly - ) { - ServerPlayer player = getHandle(bukkitPlayer); - - if (!OpenPlayer.isConnected(player.connection)) { - return null; - } - - // See net.minecraft.server.level.ServerPlayer#openMenu(MenuProvider) - OpenChestMenu menu; - Component title; - if (inventory instanceof BaseOpenInventory playerInv) { - menu = playerInv.createMenu(player, player.nextContainerCounter(), viewOnly); - title = playerInv.getTitle(player, menu); - } else if (inventory instanceof OpenEnderChest enderChest) { - menu = enderChest.createMenu(player, player.nextContainerCounter(), viewOnly); - title = enderChest.getTitle(menu); - } else { - return null; - } - - // Should never happen, player is a ServerPlayer with an active connection. - if (menu == null) { - return null; - } - - // Set up title. Title can only be set once for a menu, and is set during the open process. - // Further title changes are a hack where the client is sent a "new" inventory with the same ID, - // resulting in a title change but no other state modifications (like cursor position). - menu.setTitle(title); - - var pair = CraftEventFactory.callInventoryOpenEventWithTitle(player, menu); - AbstractContainerMenu opened = pair.getSecond(); - - // Menu is null if event is cancelled. - if (opened == null) { - return null; - } - - var newTitle = pair.getFirst(); - if (newTitle != null) { - title = PaperAdventure.asVanilla(newTitle); - } - - player.containerMenu = opened; - player.connection.send(new ClientboundOpenScreenPacket(opened.containerId, opened.getType(), title)); - player.initMenu(opened); - - return opened.getBukkitView(); + protected void setServerLevel(ServerPlayer player, ServerLevel level) { + player.spawnIn(level); } } diff --git a/internal/paper26_2/build.gradle.kts b/internal/paper26_2/build.gradle.kts new file mode 100644 index 00000000..605d6eda --- /dev/null +++ b/internal/paper26_2/build.gradle.kts @@ -0,0 +1,68 @@ +import org.gradle.api.internal.attributes.DefaultCompatibilityRuleChain + +plugins { + alias(libs.plugins.paperweight) +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") +} + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(25)) +} + +tasks.withType().configureEach { + options.release = 21 +} + +class ToolchainJvmVersion: AttributeCompatibilityRule { + override fun execute(details: CompatibilityCheckDetails) { + if (details.consumerValue == details.producerValue) { + details.compatible() + return + } + if (details.producerValue == null) { + details.incompatible() + return + } + if (25 >= details.producerValue!!) { + details.compatible() + } else { + details.incompatible() + } + } +} + +dependencies { + attributesSchema { + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE) { + // Gradle thinks that depending on a library with a certain language level requires + // any project that depends on it to also require that language level no matter what. + // This is a bit obnoxious when we're specifically adding compatiblity patches to shared common code. + // Realistically Gradle is correct and the chain should be reversed - the oldest, least common + // denominator should be targeted and patches should be slapped on top as necessary. + // However, I don't want to spend a week restructuring the project to cut a release. + // Hack out Gradle's rules and replace them with our own less-restrictive version. + val rules = compatibilityRules as DefaultCompatibilityRuleChain + rules.rules.clear() + + compatibilityRules.add(ToolchainJvmVersion::class.java) + } + } + + implementation(project(":openinvapi")) { + exclude(group = "org.spigotmc", module = "spigot-api") + } + implementation(project(":openinvcommon")) { + exclude(group = "org.spigotmc", module = "spigot-api") + } + + paperweight.paperDevBundle("26.2.build.31-alpha") +} + +tasks.reobfJar { + enabled = false +} + +configurations.reobf.get().outgoing.artifacts.clear() diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java new file mode 100644 index 00000000..e853814f --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java @@ -0,0 +1,96 @@ +package com.lishid.openinv.internal.paper26_2; + +import com.lishid.openinv.internal.Accessor; +import com.lishid.openinv.internal.IAnySilentContainer; +import com.lishid.openinv.internal.ISpecialEnderChest; +import com.lishid.openinv.internal.ISpecialInventory; +import com.lishid.openinv.internal.ISpecialPlayerInventory; +import com.lishid.openinv.internal.paper26_2.container.AnySilentContainer; +import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_2.container.OpenInventory; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoaderBase; +import com.lishid.openinv.internal.paper26_2.player.PlayerManager; +import com.lishid.openinv.util.lang.LanguageManager; +import net.minecraft.world.Container; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class InternalAccessor implements Accessor { + + protected final @NotNull Logger logger; + private final @NotNull PlayerManager manager; + private final @NotNull AnySilentContainer anySilentContainer; + + public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + this.logger = logger; + manager = createPlayerManager(logger); + anySilentContainer = createAnySilentContainer(logger, lang); + } + + protected @NotNull PlayerManager createPlayerManager(@NotNull Logger logger) { + return new PlayerManager(logger); + } + + protected @NotNull AnySilentContainer createAnySilentContainer( + @NotNull Logger logger, + @NotNull LanguageManager lang + ) { + return new AnySilentContainer(logger, lang); + } + + protected @NotNull PlaceholderLoaderBase createPlaceholderLoader() { + return new PlaceholderLoader(); + } + + @Override + public @NotNull PlayerManager getPlayerManager() { + return manager; + } + + @Override + public @NotNull IAnySilentContainer getAnySilentContainer() { + return anySilentContainer; + } + + @Override + public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { + return new OpenInventory(player); + } + + @Override + public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { + return new OpenEnderChest(player); + } + + @Override + public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { + if (!(bukkitInventory instanceof CraftInventory craftInventory)) { + return null; + } + Container container = craftInventory.getInventory(); + if (clazz.isInstance(container)) { + return clazz.cast(container); + } + return null; + } + + @Override + public void reload(@NotNull ConfigurationSection config) { + ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); + try { + // Reset placeholders to defaults and try to load configuration. + createPlaceholderLoader().load(placeholders); + } catch (Exception e) { + logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); + } + } + +} diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java new file mode 100644 index 00000000..417058cc --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2011-2023 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal.paper26_2.container; + +import com.lishid.openinv.internal.AnySilentContainerBase; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.player.PlayerManager; +import com.lishid.openinv.util.ReflectionHelper; +import com.lishid.openinv.util.lang.LanguageManager; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.PlayerEnderChestContainer; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.ShulkerBoxBlock; +import net.minecraft.world.level.block.TrappedChestBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.EnderChestBlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.Statistic; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.logging.Logger; + +public class AnySilentContainer extends AnySilentContainerBase { + + private final @NotNull Logger logger; + private final @NotNull LanguageManager lang; + private @Nullable Field serverPlayerGameModeGameType; + + public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { + this.logger = logger; + this.lang = lang; + try { + try { + this.serverPlayerGameModeGameType = ServerPlayerGameMode.class.getDeclaredField("gameModeForPlayer"); + this.serverPlayerGameModeGameType.setAccessible(true); + } catch (NoSuchFieldException e) { + logger.warning("The field ServerPlayerGameMode#gameModeForPlayer is no longer present!"); + logger.warning("Please report this at https://github.com/Jikoo/OpenInv/issues"); + logger.warning("Attempting to fall through using reflection. Please verify that SilentContainer does not fail."); + // N.B. gameModeForPlayer is (for now) declared before previousGameModeForPlayer so silent shouldn't break. + this.serverPlayerGameModeGameType = ReflectionHelper.grabFieldByType(ServerPlayerGameMode.class, GameType.class); + } + } catch (SecurityException e) { + logger.warning("Unable to directly write player game mode! SilentContainer will fail."); + logger.log(java.util.logging.Level.WARNING, "Error obtaining GameType field", e); + } + } + + @Override + public boolean activateContainer( + @NotNull final Player bukkitPlayer, + final boolean silentchest, + @NotNull final org.bukkit.block.Block bukkitBlock + ) { + + // Silent ender chest is API-only + if (silentchest && bukkitBlock.getType() == Material.ENDER_CHEST) { + bukkitPlayer.openInventory(bukkitPlayer.getEnderChest()); + bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); + return true; + } + + ServerPlayer player = PlayerManager.getHandle(bukkitPlayer); + + final net.minecraft.world.level.Level level = ((Entity) player).level(); + final BlockPos blockPos = new BlockPos(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ()); + final BlockEntity blockEntity = level.getBlockEntity(blockPos); + + if (blockEntity == null) { + return false; + } + + if (blockEntity instanceof EnderChestBlockEntity enderChestTile) { + // Anychest ender chest. See net.minecraft.world.level.block.EnderChestBlock + PlayerEnderChestContainer enderChest = player.getEnderChestInventory(); + enderChest.setActiveChest(enderChestTile); + player.openMenu( + new SimpleMenuProvider( + (containerCounter, playerInventory, ignored) -> { + MenuType containers = OpenChestMenu.getChestMenuType(enderChest.getContainerSize()); + int rows = enderChest.getContainerSize() / 9; + return new ChestMenu(containers, containerCounter, playerInventory, enderChest, rows); + }, Component.translatable("container.enderchest") + ) + ); + bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); + return true; + } + + if (!(blockEntity instanceof MenuProvider menuProvider)) { + return false; + } + + BlockState blockState = level.getBlockState(blockPos); + Block block = blockState.getBlock(); + + if (block instanceof ChestBlock chestBlock) { + + // boolean flag: do not check if chest is blocked + menuProvider = chestBlock.getMenuProvider(blockState, level, blockPos, true); + + if (menuProvider == null) { + lang.sendSystemMessage(bukkitPlayer, "messages.error.lootNotGenerated"); + return false; + } + + if (block instanceof TrappedChestBlock) { + bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED); + } else { + bukkitPlayer.incrementStatistic(Statistic.CHEST_OPENED); + } + } + + if (block instanceof ShulkerBoxBlock) { + bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED); + } + + if (block instanceof BarrelBlock) { + bukkitPlayer.incrementStatistic(Statistic.OPEN_BARREL); + } + + // AnyChest only - SilentChest not active, container unsupported, or unnecessary. + if (!silentchest || player.gameMode.getGameModeForPlayer() == GameType.SPECTATOR) { + player.openMenu(menuProvider); + return true; + } + + // SilentChest requires access to setting players' game mode directly. + if (this.serverPlayerGameModeGameType == null) { + return false; + } + + if (blockEntity instanceof RandomizableContainerBlockEntity lootable) { + if (hasLootTable(lootable)) { + lang.sendSystemMessage(bukkitPlayer, "messages.error.lootNotGenerated"); + return false; + } + } + + GameType gameType = player.gameMode.getGameModeForPlayer(); + this.forceGameType(player, GameType.SPECTATOR); + player.openMenu(menuProvider); + this.forceGameType(player, gameType); + return true; + } + + protected boolean hasLootTable(@NotNull RandomizableContainerBlockEntity lootable) { + return lootable.getLootTable() != null; + } + + @Override + public void deactivateContainer(@NotNull final Player bukkitPlayer) { + if (this.serverPlayerGameModeGameType == null || bukkitPlayer.getGameMode() == GameMode.SPECTATOR) { + return; + } + + ServerPlayer player = PlayerManager.getHandle(bukkitPlayer); + + // Force game mode change without informing plugins or players. + // Regular game mode set calls GameModeChangeEvent and is cancellable. + GameType gameType = player.gameMode.getGameModeForPlayer(); + this.forceGameType(player, GameType.SPECTATOR); + + // ServerPlayer#closeContainer cannot be called without entering an + // infinite loop because this method is called during inventory close. + // From ServerPlayer#closeContainer -> CraftEventFactory#handleInventoryCloseEvent + player.containerMenu.transferTo(player.inventoryMenu, player.getBukkitEntity()); + // From ServerPlayer#closeContainer + player.doCloseContainer(); + // Regular inventory close will handle the rest - packet sending, etc. + + // Revert forced game mode. + this.forceGameType(player, gameType); + } + + private void forceGameType(final ServerPlayer player, final GameType gameMode) { + if (this.serverPlayerGameModeGameType == null) { + // No need to warn repeatedly, error on startup and lack of function should be enough. + return; + } + try { + this.serverPlayerGameModeGameType.setAccessible(true); + this.serverPlayerGameModeGameType.set(player.gameMode, gameMode); + } catch (IllegalArgumentException | IllegalAccessException e) { + logger.log(java.util.logging.Level.WARNING, "Error bypassing GameModeChangeEvent", e); + } + } + + @Override + protected org.bukkit.block.BlockState getState(@NotNull org.bukkit.block.Block block) { + return block.getState(false); + } + + @Override + protected InventoryHolder getHolder(@NotNull Inventory inventory) { + return inventory.getHolder(false); + } + +} diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/BaseOpenInventory.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/BaseOpenInventory.java similarity index 90% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/BaseOpenInventory.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/BaseOpenInventory.java index 52096805..160ca643 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/BaseOpenInventory.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/BaseOpenInventory.java @@ -1,22 +1,22 @@ -package com.lishid.openinv.internal.paper26_1.container; +package com.lishid.openinv.internal.paper26_2.container; import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.paper26_1.container.bukkit.OpenPlayerInventory; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.paper26_1.container.slot.Content; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentCrafting; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentCraftingResult; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentCursor; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentDrop; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentEquipment; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentList; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentOffHand; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentViewOnly; -import com.lishid.openinv.internal.paper26_1.container.slot.SlotViewOnly; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_1.player.PlayerManager; +import com.lishid.openinv.internal.paper26_2.container.bukkit.OpenPlayerInventory; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenInventoryMenu; +import com.lishid.openinv.internal.paper26_2.container.slot.Content; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentCrafting; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentCraftingResult; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentCursor; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentDrop; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentEquipment; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentList; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentOffHand; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentViewOnly; +import com.lishid.openinv.internal.paper26_2.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.player.PlayerManager; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.Component; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenEnderChest.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenEnderChest.java new file mode 100644 index 00000000..e3fe13a5 --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenEnderChest.java @@ -0,0 +1,205 @@ +package com.lishid.openinv.internal.paper26_2.container; + +import com.lishid.openinv.internal.ISpecialEnderChest; +import com.lishid.openinv.internal.InternalOwned; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenEnderChestMenu; +import com.lishid.openinv.internal.paper26_2.player.PlayerManager; +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.StackedItemContents; +import net.minecraft.world.inventory.StackedContentsCompatible; +import net.minecraft.world.item.ItemStack; +import org.bukkit.Location; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.inventory.InventoryType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class OpenEnderChest implements Container, StackedContentsCompatible, InternalOwned, + ISpecialEnderChest { + + private CraftInventory inventory; + private @NotNull ServerPlayer owner; + private NonNullList items; + private int maxStack = 64; + private final List transaction = new ArrayList<>(); + + public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { + this.owner = PlayerManager.getHandle(player); + this.items = getEnderChestItems(owner); + } + + @Override + public @NotNull ServerPlayer getOwnerHandle() { + return owner; + } + + @Override + public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { + if (inventory == null) { + inventory = new CraftInventory(this) { + @Override + public @NotNull InventoryType getType() { + return InventoryType.ENDER_CHEST; + } + }; + } + return inventory; + } + + @Override + public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { + owner = PlayerManager.getHandle(player); + NonNullList activeItems = getEnderChestItems(owner); + + // Guard against size changing. Theoretically on Purpur all row variations still have 6 rows internally. + int max = Math.min(items.size(), activeItems.size()); + for (int index = 0; index < max; ++index) { + activeItems.set(index, items.get(index)); + } + + items = activeItems; + } + + protected @NotNull NonNullList getEnderChestItems(@NotNull ServerPlayer owner) { + return owner.getEnderChestInventory().getItems(); + } + + @Override + public @NotNull org.bukkit.entity.Player getPlayer() { + return owner.getBukkitEntity(); + } + + @Override + public int getContainerSize() { + return items.size(); + } + + @Override + public boolean isEmpty() { + return items.stream().allMatch(ItemStack::isEmpty); + } + + @Override + public @NotNull ItemStack getItem(int index) { + return index >= 0 && index < items.size() ? items.get(index) : ItemStack.EMPTY; + } + + @Override + public @NotNull ItemStack removeItem(int index, int amount) { + ItemStack itemstack = ContainerHelper.removeItem(items, index, amount); + + if (!itemstack.isEmpty()) { + setChanged(); + } + + return itemstack; + } + + @Override + public @NotNull ItemStack removeItemNoUpdate(int index) { + return index >= 0 && index < items.size() ? items.set(index, ItemStack.EMPTY) : ItemStack.EMPTY; + } + + @Override + public void setItem(int index, @NotNull ItemStack itemStack) { + if (index >= 0 && index < items.size()) { + items.set(index, itemStack); + } + } + + @Override + public int getMaxStackSize() { + return maxStack; + } + + @Override + public void setChanged() { + this.owner.getEnderChestInventory().setChanged(); + } + + @Override + public boolean stillValid(@NotNull Player player) { + return true; + } + + @Override + public @NotNull List getContents() { + return items; + } + + @Override + public void onOpen(@NotNull CraftHumanEntity craftHumanEntity) { + transaction.add(craftHumanEntity); + } + + @Override + public void onClose(@NotNull CraftHumanEntity craftHumanEntity) { + transaction.remove(craftHumanEntity); + } + + @Override + public @NotNull List getViewers() { + return transaction; + } + + @Override + public org.bukkit.entity.Player getOwner() { + return getPlayer(); + } + + @Override + public void setMaxStackSize(int size) { + maxStack = size; + } + + @Override + public @Nullable Location getLocation() { + return null; + } + + @Override + public void clearContent() { + items.clear(); + setChanged(); + } + + @Override + public void fillStackedContents(@NotNull StackedItemContents stackedContents) { + for (ItemStack itemstack : items) { + stackedContents.accountStack(itemstack); + } + } + + public Component getTitle(@Nullable OpenChestMenu menu) { + MutableComponent component; + if (menu != null && menu.isViewOnly()) { + component = Component.translatableWithFallback("openinv.container.enderchest.viewonly", "[RO] "); + } else { + component = Component.translatableWithFallback("openinv.container.enderchest.editable", ""); + } + return component + .append(Component.translatableWithFallback("openinv.container.enderchest.prefix", "", owner.getName())) + .append(Component.translatable("container.enderchest")) + .append(Component.translatableWithFallback("openinv.container.enderchest.suffix", " - %s", owner.getName())); + } + + public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { + if (player instanceof ServerPlayer serverPlayer) { + return new OpenEnderChestMenu(this, serverPlayer, i, viewOnly); + } + return null; + } + +} diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenInventory.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenInventory.java similarity index 94% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenInventory.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenInventory.java index 7fdeff04..455ba428 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/OpenInventory.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenInventory.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container; +package com.lishid.openinv.internal.paper26_2.container; -import com.lishid.openinv.internal.paper26_1.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FontDescription; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenDummyInventory.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyInventory.java similarity index 98% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenDummyInventory.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyInventory.java index 0c491a78..256271cd 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenDummyInventory.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyInventory.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.bukkit; +package com.lishid.openinv.internal.paper26_2.container.bukkit; import com.lishid.openinv.internal.ViewOnly; import net.minecraft.world.Container; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenDummyPlayerInventory.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyPlayerInventory.java similarity index 97% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenDummyPlayerInventory.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyPlayerInventory.java index a7be3663..57d85ef4 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyPlayerInventory.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.bukkit; +package com.lishid.openinv.internal.paper26_2.container.bukkit; import net.minecraft.world.Container; import org.bukkit.Material; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenPlayerInventory.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventory.java similarity index 98% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenPlayerInventory.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventory.java index 673346df..6bc3e0ea 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenPlayerInventory.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventory.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_1.container.bukkit; +package com.lishid.openinv.internal.paper26_2.container.bukkit; import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenPlayerInventorySelf.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java similarity index 80% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenPlayerInventorySelf.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java index c5546997..39f0faae 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.bukkit; +package com.lishid.openinv.internal.paper26_2.container.bukkit; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/BaseOpenInventoryMenu.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/BaseOpenInventoryMenu.java similarity index 95% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/BaseOpenInventoryMenu.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/BaseOpenInventoryMenu.java index 78fcf18a..2985da13 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/BaseOpenInventoryMenu.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/BaseOpenInventoryMenu.java @@ -1,12 +1,12 @@ -package com.lishid.openinv.internal.paper26_1.container.menu; +package com.lishid.openinv.internal.paper26_2.container.menu; import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_1.container.bukkit.OpenDummyPlayerInventory; -import com.lishid.openinv.internal.paper26_1.container.bukkit.OpenPlayerInventorySelf; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentDrop; -import com.lishid.openinv.internal.paper26_1.container.slot.ContentEquipment; -import com.lishid.openinv.internal.paper26_1.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.bukkit.OpenDummyPlayerInventory; +import com.lishid.openinv.internal.paper26_2.container.bukkit.OpenPlayerInventorySelf; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentDrop; +import com.lishid.openinv.internal.paper26_2.container.slot.ContentEquipment; +import com.lishid.openinv.internal.paper26_2.container.slot.SlotViewOnly; import com.lishid.openinv.util.Permissions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenChestMenu.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenChestMenu.java similarity index 97% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenChestMenu.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenChestMenu.java index 8b6ea05e..93dc5a58 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenChestMenu.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenChestMenu.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.paper26_1.container.menu; +package com.lishid.openinv.internal.paper26_2.container.menu; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.paper26_1.container.bukkit.OpenDummyInventory; -import com.lishid.openinv.internal.paper26_1.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.paper26_2.container.bukkit.OpenDummyInventory; +import com.lishid.openinv.internal.paper26_2.container.slot.SlotViewOnly; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenEnderChestMenu.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenEnderChestMenu.java similarity index 93% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenEnderChestMenu.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenEnderChestMenu.java index 19cacfef..9bcc3bf1 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenEnderChestMenu.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenEnderChestMenu.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.menu; +package com.lishid.openinv.internal.paper26_2.container.menu; -import com.lishid.openinv.internal.paper26_1.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ContainerInput; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenInventoryMenu.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java similarity index 85% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenInventoryMenu.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java index 41765cfc..7a45a357 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenInventoryMenu.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.menu; +package com.lishid.openinv.internal.paper26_2.container.menu; -import com.lishid.openinv.internal.paper26_1.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ContainerInput; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenSyncMenu.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenSyncMenu.java similarity index 97% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenSyncMenu.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenSyncMenu.java index 8238b345..41f533da 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/menu/OpenSyncMenu.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenSyncMenu.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.paper26_1.container.menu; +package com.lishid.openinv.internal.paper26_2.container.menu; import com.google.common.base.Suppliers; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.paper26_1.container.slot.SlotPlaceholder; +import com.lishid.openinv.internal.paper26_2.container.slot.SlotPlaceholder; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.AbstractContainerMenu; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/Content.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java similarity index 96% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/Content.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java index 225c5a8e..eee19f3e 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/Content.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCrafting.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCrafting.java similarity index 95% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCrafting.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCrafting.java index 8e30623c..85c8b6de 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCrafting.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCrafting.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_1.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCraftingResult.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCraftingResult.java similarity index 91% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCraftingResult.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCraftingResult.java index 0db3071c..9189d518 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCraftingResult.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCraftingResult.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.InventoryMenu; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCursor.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCursor.java similarity index 94% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCursor.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCursor.java index d6b6ab3b..51d4c3c6 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentCursor.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCursor.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_1.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentDrop.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentDrop.java similarity index 90% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentDrop.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentDrop.java index aaa747ea..4ebb2ce8 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentDrop.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentDrop.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_1.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentEquipment.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentEquipment.java similarity index 95% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentEquipment.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentEquipment.java index 0681bcb1..b6840838 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentEquipment.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentEquipment.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.EntityEquipment; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentList.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentList.java similarity index 95% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentList.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentList.java index 289bd456..9c202e45 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentList.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentList.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentOffHand.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentOffHand.java similarity index 92% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentOffHand.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentOffHand.java index 97217e8a..2e15656b 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentOffHand.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentOffHand.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentViewOnly.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentViewOnly.java similarity index 95% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentViewOnly.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentViewOnly.java index efeea121..aa932999 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/ContentViewOnly.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentViewOnly.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/SlotPlaceholder.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotPlaceholder.java similarity index 89% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/SlotPlaceholder.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotPlaceholder.java index 84c2cc76..7844a813 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/SlotPlaceholder.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotPlaceholder.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/SlotViewOnly.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java similarity index 89% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/SlotViewOnly.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java index a9c2ba80..bb7461b7 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/SlotViewOnly.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.slot; +package com.lishid.openinv.internal.paper26_2.container.slot; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; @@ -17,14 +17,14 @@ public class SlotViewOnly extends SlotPlaceholder { public static @NotNull SlotViewOnly wrap(@NotNull Slot wrapped) { SlotViewOnly wrapper; if (wrapped instanceof SlotPlaceholder placeholder) { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { + wrapper = new SlotViewOnly(wrapped.container, wrapped.getContainerSlot(), wrapped.x, wrapped.y) { @Override public ItemStack getOrDefault() { return placeholder.getOrDefault(); } }; } else { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { + wrapper = new SlotViewOnly(wrapped.container, wrapped.getContainerSlot(), wrapped.x, wrapped.y) { @Override public ItemStack getOrDefault() { return wrapped.getItem(); @@ -135,7 +135,7 @@ public boolean allowModification(@NotNull Player player) { @Override public int getContainerSlot() { - return this.slot; + return super.getContainerSlot(); } @Override diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java new file mode 100644 index 00000000..e1a7f250 --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java @@ -0,0 +1,40 @@ +package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; + +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomModelData; +import net.minecraft.world.item.component.DyedItemColor; +import net.minecraft.world.item.component.TooltipDisplay; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashSet; +import java.util.List; + +public class PlaceholderLoader extends PlaceholderLoaderBase { + + private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); + private static final TooltipDisplay HIDE_TOOLTIP = new TooltipDisplay(true, new LinkedHashSet<>()); + + @Override + protected @NotNull CompoundTag parseTag(@NotNull String itemText) throws Exception { + return TagParser.parseCompoundFully(itemText); + } + + @Override + protected void addModelData(@NotNull ItemStack itemStack) { + itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); + } + + @Override + protected void hideTooltip(@NotNull ItemStack itemStack) { + itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); + } + + @Override + protected DyedItemColor getDye(int rgb) { + return new DyedItemColor(rgb); + } + +} diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoaderBase.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java similarity index 94% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoaderBase.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java index 40188258..3ad8b1f0 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/PlaceholderLoaderBase.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.container.slot.placeholder; +package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; import com.mojang.serialization.DataResult; import net.minecraft.core.Registry; @@ -9,6 +9,7 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.network.chat.Component; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.component.DyedItemColor; @@ -96,7 +97,7 @@ public void load(@Nullable ConfigurationSection section) throws Exception { protected @NotNull ItemStack defaultCursor() { // Cursor-like banner with no tooltip - ItemStack itemStack = new ItemStack(Items.WHITE_BANNER); + ItemStack itemStack = new ItemStack(getDefaultCursorItem()); RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); BannerPattern halfDiagBottomRight = bannerPatterns.getOrThrow(BannerPatterns.DIAGONAL_RIGHT).value(); @@ -160,12 +161,20 @@ public void load(@Nullable ConfigurationSection section) throws Exception { protected @NotNull ItemStack defaultNotSlot() { // White pane with no tooltip - ItemStack itemStack = new ItemStack(Items.WHITE_STAINED_GLASS_PANE); + ItemStack itemStack = new ItemStack(getDefaultNotSlotItem()); hideTooltip(itemStack); addModelData(itemStack); return itemStack; } + protected @NotNull Item getDefaultCursorItem() { + return Items.BANNER.pick(DyeColor.WHITE); + } + + protected @NotNull Item getDefaultNotSlotItem() { + return Items.STAINED_GLASS_PANE.pick(DyeColor.WHITE); + } + protected @NotNull ItemStack defaultBlockedOffline() { // Barrier: "Not available - Offline" ItemStack itemStack = new ItemStack(Items.BARRIER); diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/Placeholders.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java similarity index 91% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/Placeholders.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java index 97f70952..efdc1633 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/container/slot/placeholder/Placeholders.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_1.container.slot.placeholder; +package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; -import com.lishid.openinv.internal.paper26_1.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/OpenPlayer.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java similarity index 99% rename from internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/OpenPlayer.java rename to internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java index 4991952e..43cb27a8 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/OpenPlayer.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_1.player; +package com.lishid.openinv.internal.paper26_2.player; import com.lishid.openinv.event.OpenEvents; import com.mojang.logging.LogUtils; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java new file mode 100644 index 00000000..8f9e91b1 --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java @@ -0,0 +1,330 @@ +package com.lishid.openinv.internal.paper26_2.player; + +import com.lishid.openinv.internal.ISpecialInventory; +import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; +import com.lishid.openinv.util.JulLoggerAdapter; +import com.mojang.authlib.GameProfile; +import com.mojang.logging.LogUtils; +import io.papermc.paper.adventure.PaperAdventure; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ClientInformation; +import net.minecraft.server.level.ParticleStatus; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.ProblemReporter; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.ChatVisiblity; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.LevelData; +import net.minecraft.world.level.storage.TagValueInput; +import net.minecraft.world.level.storage.TagValueOutput; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; +import net.minecraft.world.phys.Vec3; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.inventory.InventoryView; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.Optional; +import java.util.UUID; +import java.util.logging.Logger; + +@NullMarked +public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { + + protected final Logger logger; + protected @Nullable Field bukkitEntity; + + public PlayerManager(Logger logger) { + this.logger = logger; + try { + bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); + } catch (NoSuchFieldException e) { + logger.warning("Unable to obtain field to inject custom save process - certain player data may be lost when saving!"); + logger.log(java.util.logging.Level.WARNING, e.getMessage(), e); + bukkitEntity = null; + } + } + + public static ServerPlayer getHandle(final Player player) { + if (player instanceof CraftPlayer craftPlayer) { + return craftPlayer.getHandle(); + } + + Server server = player.getServer(); + ServerPlayer nmsPlayer = null; + + if (server instanceof CraftServer craftServer) { + nmsPlayer = craftServer.getHandle().getPlayer(player.getUniqueId()); + } + + if (nmsPlayer == null) { + // Could use reflection to examine fields, but it's honestly not worth the bother. + throw new RuntimeException("Unable to fetch EntityPlayer from Player implementation " + player.getClass().getName()); + } + + return nmsPlayer; + } + + @Override + public @Nullable Player loadPlayer(final OfflinePlayer offline) { + if (!(Bukkit.getServer() instanceof CraftServer craftServer)) { + return null; + } + + MinecraftServer server = craftServer.getServer(); + ServerLevel worldServer = server.getLevel(Level.OVERWORLD); + + if (worldServer == null) { + return null; + } + + // Create a new ServerPlayer. + ServerPlayer entity = createNewPlayer(server, worldServer, offline); + + // Stop listening for advancement progression - if this is not cleaned up, loading causes a memory leak. + clearAdvancements(entity); + + // Try to load the player's data. + if (loadData(server, entity)) { + // If data is loaded successfully, return the Bukkit entity. + return entity.getBukkitEntity(); + } + + return null; + } + + protected ServerPlayer createNewPlayer( + MinecraftServer server, + ServerLevel worldServer, + final OfflinePlayer offline + ) { + // See net.minecraft.server.players.PlayerList#canPlayerLogin(ServerLoginPacketListenerImpl, GameProfile) + // See net.minecraft.server.network.ServerLoginPacketListenerImpl#handleHello(ServerboundHelloPacket) + GameProfile profile = new GameProfile(offline.getUniqueId(), + offline.getName() != null ? offline.getName() : offline.getUniqueId().toString() + ); + + ClientInformation dummyInfo = new ClientInformation( + "en_us", + 1, // Reduce distance just in case. + ChatVisiblity.HIDDEN, // Don't accept chat. + false, + ServerPlayer.DEFAULT_MODEL_CUSTOMIZATION, + ServerPlayer.DEFAULT_MAIN_HAND, + true, + false, // Don't list in player list (not that this player is in the list anyway). + ParticleStatus.MINIMAL + ); + + ServerPlayer entity = new ServerPlayer(server, worldServer, profile, dummyInfo); + + try { + injectPlayer(server, entity); + } catch (IllegalAccessException e) { + logger.log( + java.util.logging.Level.WARNING, + e, + () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!" + ); + } + + return entity; + } + + protected void clearAdvancements(ServerPlayer entity) { + entity.getAdvancements().clearTriggers(); + } + + protected boolean loadData(MinecraftServer server, ServerPlayer player) { + // See CraftPlayer#loadData + + try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), new JulLoggerAdapter(logger))) { + CompoundTag loadedData = server.getPlayerList().playerIo.load(player.nameAndId()).orElse(null); + + if (loadedData == null) { + // Exceptions with loading are logged. + return false; + } + + ValueInput valueInput = TagValueInput.create(scopedCollector, player.registryAccess(), loadedData); + + // Read basic data into the player. + player.load(valueInput); + + // World is not loaded by ServerPlayer#load(CompoundTag) on Paper. + parseWorld(server, player, valueInput); + } + + return true; + } + + protected void parseWorld( + MinecraftServer server, + ServerPlayer player, + ValueInput loadedData + ) { + // See PlayerList#placeNewPlayer + World bukkitWorld; + Optional msbs = loadedData.getLong("WorldUUIDMost"); + Optional lsbs = loadedData.getLong("WorldUUIDLeast"); + if (msbs.isPresent() && lsbs.isPresent()) { + // Modern Bukkit world. + bukkitWorld = Bukkit.getServer().getWorld(new UUID(msbs.get(), lsbs.get())); + } else { + bukkitWorld = loadedData.getString("world").map(Bukkit::getWorld).orElse(null); + } + if (bukkitWorld == null) { + spawnInDefaultWorld(server, player); + return; + } + player.setServerLevel(((CraftWorld) bukkitWorld).getHandle()); + } + + protected void spawnInDefaultWorld(MinecraftServer server, ServerPlayer player) { + ServerLevel level = server.getLevel(Level.OVERWORLD); + if (level != null) { + // Adjust player to default spawn (in keeping with Paper handling) when world not found. + LevelData.RespawnData respawnData = getRespawnData(level); + player.snapTo(getAdjustedSpawnLocation(player, level, respawnData), respawnData.yaw(), 0.0F); + setServerLevel(player, level); + } else { + logger.warning("Tried to load player with invalid world when no fallback was available!"); + } + } + + protected LevelData.RespawnData getRespawnData(ServerLevel level) { + return level.getRespawnData(); + } + + protected Vec3 getAdjustedSpawnLocation( + ServerPlayer player, + ServerLevel level, + LevelData.RespawnData respawnData + ) { + return Vec3.atBottomCenterOf(player.adjustSpawnLocation(level, respawnData.pos())); + } + + protected void setServerLevel(ServerPlayer player, ServerLevel level) { + player.setServerLevel(level); + } + + protected void injectPlayer(MinecraftServer server, ServerPlayer player) throws IllegalAccessException { + if (bukkitEntity == null) { + return; + } + + bukkitEntity.setAccessible(true); + + bukkitEntity.set(player, new OpenPlayer(server.server, player, this)); + } + + @Override + public Player inject(Player player) { + try { + ServerPlayer nmsPlayer = getHandle(player); + if (nmsPlayer.getBukkitEntity() instanceof OpenPlayer openPlayer) { + return openPlayer; + } + + org.slf4j.Logger logger = LogUtils.getLogger(); + + try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(nmsPlayer.problemPath(), logger)) { + CompoundTag extraData = new CompoundTag(); + + // Copy extra data out of existing player. + ValueOutput output = TagValueOutput.createWrappingWithContext(scopedCollector, nmsPlayer.registryAccess(), extraData); + nmsPlayer.getBukkitEntity().setExtraData(output); + + MinecraftServer server = nmsPlayer.level().getServer(); + injectPlayer(server, nmsPlayer); + CraftPlayer newPlayer = nmsPlayer.getBukkitEntity(); + + // Set extra data in new player. + ValueInput input = TagValueInput.create(scopedCollector, nmsPlayer.registryAccess(), extraData); + newPlayer.readExtraData(input); + + return newPlayer; + } + } catch (IllegalAccessException e) { + logger.log( + java.util.logging.Level.WARNING, + e, + () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!" + ); + return player; + } + } + + @Override + public @Nullable InventoryView openInventory( + Player bukkitPlayer, + ISpecialInventory inventory, + boolean viewOnly + ) { + ServerPlayer player = getHandle(bukkitPlayer); + + if (!OpenPlayer.isConnected(player.connection)) { + return null; + } + + // See net.minecraft.server.level.ServerPlayer#openMenu(MenuProvider) + OpenChestMenu menu; + Component title; + if (inventory instanceof BaseOpenInventory playerInv) { + menu = playerInv.createMenu(player, player.nextContainerCounter(), viewOnly); + title = playerInv.getTitle(player, menu); + } else if (inventory instanceof OpenEnderChest enderChest) { + menu = enderChest.createMenu(player, player.nextContainerCounter(), viewOnly); + title = enderChest.getTitle(menu); + } else { + return null; + } + + // Should never happen, player is a ServerPlayer with an active connection. + if (menu == null) { + return null; + } + + // Set up title. Title can only be set once for a menu, and is set during the open process. + // Further title changes are a hack where the client is sent a "new" inventory with the same ID, + // resulting in a title change but no other state modifications (like cursor position). + menu.setTitle(title); + + var pair = CraftEventFactory.callInventoryOpenEventWithTitle(player, menu); + AbstractContainerMenu opened = pair.getSecond(); + + // Menu is null if event is cancelled. + if (opened == null) { + return null; + } + + var newTitle = pair.getFirst(); + if (newTitle != null) { + title = PaperAdventure.asVanilla(newTitle); + } + + player.containerMenu = opened; + player.connection.send(new ClientboundOpenScreenPacket(opened.containerId, opened.getType(), title)); + player.initMenu(opened); + + return opened.getBukkitView(); + } + +} diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index edd4609f..9099f61d 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -11,6 +11,9 @@ dependencies { compileOnly(libs.spigotapi) implementation(project(":openinvapi")) implementation(project(":openinvcommon")) + implementation(project(":openinvadapterpaper26_2")) { + exclude(group = "io.papermc.paper", module = "dev-bundle") + } implementation(project(":openinvadapterpaper26_1")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } diff --git a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java index 9e142cab..e59a1bae 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -73,7 +73,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { return null; } - Version maxSupported = Version.of(26, 1, 2); + Version maxSupported = Version.of(26, 2); Version minSupported = Version.of(1, 21, 6); // Ensure version is in supported range. @@ -82,6 +82,9 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } // Paper or a Paper fork, can use Mojang-mapped internals. + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 2))) { // 26.2 + return new com.lishid.openinv.internal.paper26_2.InternalAccessor(logger, lang); + } if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1))) { // 26.1.1, 26.1.2 return new com.lishid.openinv.internal.paper26_1.InternalAccessor(logger, lang); } diff --git a/settings.gradle.kts b/settings.gradle.kts index f3bce79c..93d6553c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,6 +18,7 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { project(":openinvcommon").projectDir = file("common") val internals = listOf( + "paper26_2", "paper26_1", "paper1_21_11", "paper1_21_10", From 9d814131f478ba87cf6ee06eba6c2be28792a5e7 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 11:47:15 -0400 Subject: [PATCH 02/13] Drop 1.21.6-1.21.8 It has (roughly, 1.21.8 was late July) been a year since these versions' release. --- internal/paper1_21_8/build.gradle.kts | 28 ----- .../paper1_21_8/InternalAccessor.java | 31 ------ .../paper1_21_8/container/OpenInventory.java | 58 ---------- .../paper1_21_8/player/OpenPlayer.java | 44 -------- .../paper1_21_8/player/PlayerManager.java | 100 ------------------ plugin/build.gradle.kts | 3 - .../lishid/openinv/util/InternalAccessor.java | 16 +-- settings.gradle.kts | 1 - 8 files changed, 8 insertions(+), 273 deletions(-) delete mode 100644 internal/paper1_21_8/build.gradle.kts delete mode 100644 internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/InternalAccessor.java delete mode 100644 internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java delete mode 100644 internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java delete mode 100644 internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java diff --git a/internal/paper1_21_8/build.gradle.kts b/internal/paper1_21_8/build.gradle.kts deleted file mode 100644 index d3468267..00000000 --- a/internal/paper1_21_8/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -plugins { - alias(libs.plugins.paperweight) -} - -java { - toolchain.languageVersion = JavaLanguageVersion.of(21) -} - -tasks.withType().configureEach { - options.release = 21 -} - -dependencies { - implementation(project(":openinvapi")) { - exclude(group = "org.spigotmc", module = "spigot-api") - } - implementation(project(":openinvcommon")) { - exclude(group = "org.spigotmc", module = "spigot-api") - } - implementation(project(":openinvadapterpaper26_1")) { - exclude(group = "io.papermc.paper", module = "dev-bundle") - } - implementation(project(":openinvadapterpaper1_21_11")) { - exclude(group = "io.papermc.paper", module = "dev-bundle") - } - - paperweight.paperDevBundle("1.21.8-R0.1-SNAPSHOT") -} diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/InternalAccessor.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/InternalAccessor.java deleted file mode 100644 index 888ece19..00000000 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/InternalAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_8; - -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.paper1_21_8.container.OpenInventory; -import com.lishid.openinv.internal.paper1_21_8.player.PlayerManager; -import com.lishid.openinv.util.lang.LanguageManager; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.logging.Logger; - -public class InternalAccessor extends com.lishid.openinv.internal.paper1_21_11.InternalAccessor { - - private final @NotNull PlayerManager manager; - - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { - super(logger, lang); - manager = new PlayerManager(logger); - } - - @Override - public @NotNull PlayerManager getPlayerManager() { - return manager; - } - - @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { - return new OpenInventory(player); - } - -} diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java deleted file mode 100644 index 60ba507e..00000000 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/container/OpenInventory.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_8.container; - -import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class OpenInventory extends BaseOpenInventory { - - public OpenInventory(@NotNull Player bukkitPlayer) { - super(bukkitPlayer); - } - - @Override - public @NotNull Component getTitle(@Nullable ServerPlayer viewer, @Nullable OpenChestMenu menu) { - MutableComponent component = Component.empty(); - // Prefix for use with custom bitmap image fonts. - if (owner.equals(viewer)) { - component.append( - Component.translatableWithFallback("openinv.container.inventory.self", "") - .withStyle(style -> style - .withFont(ResourceLocation.parse("openinv:font/inventory")) - .withColor(ChatFormatting.WHITE))); - } else { - component.append( - Component.translatableWithFallback("openinv.container.inventory.other", "") - .withStyle(style -> style - .withFont(ResourceLocation.parse("openinv:font/inventory")) - .withColor(ChatFormatting.WHITE))); - } - if (menu != null && menu.isViewOnly()) { - component.append(Component.translatableWithFallback("openinv.container.inventory.viewonly", "[RO] ")); - } else { - component.append(Component.translatableWithFallback("openinv.container.inventory.editable", "")); - } - // Normal title: "Inventory - OwnerName" - component.append(Component.translatableWithFallback("openinv.container.inventory.prefix", "", owner.getName())) - .append(Component.translatable("container.inventory")) - .append(Component.translatableWithFallback("openinv.container.inventory.suffix", " - %s", owner.getName())); - return component; - } - - @Override - public @Nullable OpenChestMenu createMenu(net.minecraft.world.entity.player.Player player, int i, boolean viewOnly) { - if (player instanceof ServerPlayer serverPlayer) { - return new OpenInventoryMenu(this, serverPlayer, i, viewOnly); - } - return null; - } - -} diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java deleted file mode 100644 index ae00880e..00000000 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_8.player; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.ProblemReporter; -import net.minecraft.world.level.storage.PlayerDataStorage; -import org.bukkit.craftbukkit.CraftServer; -import org.jetbrains.annotations.NotNull; - -import java.nio.file.Path; -import java.util.Optional; - -public class OpenPlayer extends com.lishid.openinv.internal.paper26_2.player.OpenPlayer { - - protected OpenPlayer( - CraftServer server, - ServerPlayer entity, - PlayerManager manager - ) { - super(server, entity, manager); - } - - @Override - protected Optional load( - PlayerDataStorage storage, - ServerPlayer player, - ProblemReporter.ScopedCollector collector - ) { - return storage.load(player.getName().getString(), player.getStringUUID(), collector); - } - - @Override - protected void safeReplaceFile(@NotNull Path dataFile, @NotNull Path tempFile, @NotNull Path backupFile) { - net.minecraft.Util.safeReplaceFile(dataFile, tempFile, backupFile); - } - - @Override - protected void remove(@NotNull CompoundTag tag, @NotNull String key) { - // Note that the method signature here is different, though the usage - // appears identical. This version does not return the removed tag. - tag.remove(key); - } - -} diff --git a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java deleted file mode 100644 index 15c5bfd7..00000000 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/PlayerManager.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_8.player; - -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; -import com.lishid.openinv.util.JulLoggerAdapter; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.ProblemReporter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.storage.ValueInput; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.logging.Logger; - -public class PlayerManager extends com.lishid.openinv.internal.paper26_1.player.PlayerManager { - - public PlayerManager(@NotNull Logger logger) { - super(logger); - } - - @Override - protected boolean loadData(@NotNull MinecraftServer server, @NotNull ServerPlayer player) { - // See CraftPlayer#loadData - - try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), new JulLoggerAdapter(logger))) { - ValueInput loadedData = server.getPlayerList().playerIo.load(player, scopedCollector).orElse(null); - - if (loadedData == null) { - // Exceptions with loading are logged. - return false; - } - - // Read basic data into the player. - player.load(loadedData); - // Game type settings are loaded separately. - player.loadGameTypes(loadedData); - - // World is not loaded by ServerPlayer#load(CompoundTag) on Paper. - parseWorld(server, player, loadedData); - } - - return true; - } - - @Override - protected void spawnInDefaultWorld(@NotNull MinecraftServer server, @NotNull ServerPlayer player) { - ServerLevel level = server.getLevel(Level.OVERWORLD); - if (level != null) { - // Adjust player to default spawn (in keeping with Paper handling) when world not found. - player.snapTo(player.adjustSpawnLocation(level, level.getSharedSpawnPos()).getBottomCenter(), level.getSharedSpawnAngle(), 0.0F); - player.spawnIn(level); - } else { - logger.warning("Tried to load player with invalid world when no fallback was available!"); - } - } - - @Override - protected void injectPlayer(@NotNull MinecraftServer server, @NotNull ServerPlayer player) throws IllegalAccessException { - if (bukkitEntity == null) { - return; - } - - bukkitEntity.setAccessible(true); - - bukkitEntity.set(player, new com.lishid.openinv.internal.paper1_21_8.player.OpenPlayer(server.server, player, this)); - } - - @Override - public @NotNull Player inject(@NotNull Player player) { - try { - ServerPlayer nmsPlayer = getHandle(player); - if (nmsPlayer.getBukkitEntity() instanceof OpenPlayer openPlayer) { - return openPlayer; - } - MinecraftServer server = nmsPlayer.getServer(); - if (server == null) { - if (!(Bukkit.getServer() instanceof CraftServer craftServer)) { - logger.warning(() -> - "Unable to inject ServerPlayer, certain player data may be lost when saving! Server is not a CraftServer: " - + Bukkit.getServer().getClass().getName()); - return player; - } - server = craftServer.getServer(); - } - injectPlayer(server, nmsPlayer); - return nmsPlayer.getBukkitEntity(); - } catch (IllegalAccessException e) { - logger.log( - java.util.logging.Level.WARNING, - e, - () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!" - ); - return player; - } - } - -} diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 9099f61d..82056ffa 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -23,9 +23,6 @@ dependencies { implementation(project(":openinvadapterpaper1_21_10")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } - implementation(project(":openinvadapterpaper1_21_8")) { - exclude(group = "io.papermc.paper", module = "dev-bundle") - } implementation(project(":openinvadapterspigot")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } diff --git a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java index e59a1bae..dd405013 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -74,7 +74,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } Version maxSupported = Version.of(26, 2); - Version minSupported = Version.of(1, 21, 6); + Version minSupported = Version.of(1, 21, 9); // Ensure version is in supported range. if (BukkitVersions.MINECRAFT.greaterThan(maxSupported) || BukkitVersions.MINECRAFT.lessThan(minSupported)) { @@ -88,14 +88,11 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1))) { // 26.1.1, 26.1.2 return new com.lishid.openinv.internal.paper26_1.InternalAccessor(logger, lang); } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 21, 11))) { + if (BukkitVersions.MINECRAFT.equals(Version.of(1, 21, 11))) { // 1.21.11 return new com.lishid.openinv.internal.paper1_21_11.InternalAccessor(logger, lang); } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 21, 10)) - && BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 9))) { // 1.21.9, 1.21.10 - return new com.lishid.openinv.internal.paper1_21_10.InternalAccessor(logger, lang); - } - return new com.lishid.openinv.internal.paper1_21_8.InternalAccessor(logger, lang); + // 1.21.9, 1.21.10 + return new com.lishid.openinv.internal.paper1_21_10.InternalAccessor(logger, lang); } public String getReleasesLink() { @@ -108,9 +105,12 @@ public String getReleasesLink() { } private String getPaperReleaseLink() { - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 6))) { + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 9))) { return "https://github.com/Jikoo/OpenInv/releases"; } + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 6))) { + return "https://github.com/Jikoo/OpenInv/releases/tag/5.3.2"; + } if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 1))) { return "https://github.com/Jikoo/OpenInv/releases/tag/5.3.0"; } diff --git a/settings.gradle.kts b/settings.gradle.kts index 93d6553c..0fbcb8eb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,7 +22,6 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { "paper26_1", "paper1_21_11", "paper1_21_10", - "paper1_21_8", "spigot" ) for (internal in internals) { From 006eb93c260b034d50624b000d0753e42a1f912a Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 13:16:43 -0400 Subject: [PATCH 03/13] Clean up placeholder loaders Removed unnecessary picker usage (we always want the white constants) Removed now-unnecessary abstractions (which I should have done when dropping 1.21.5 and lower, whoops) --- .../slot/placeholder/PlaceholderLoader.java | 178 ++++++++++++++++- .../placeholder/PlaceholderLoaderBase.java | 189 ------------------ 2 files changed, 167 insertions(+), 200 deletions(-) delete mode 100644 internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java index e1a7f250..bad75b99 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java @@ -1,40 +1,196 @@ package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; +import com.mojang.serialization.DataResult; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.TagParser; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.component.CustomModelData; import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.item.component.TooltipDisplay; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.entity.BannerPattern; +import net.minecraft.world.level.block.entity.BannerPatternLayers; +import net.minecraft.world.level.block.entity.BannerPatterns; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.craftbukkit.CraftRegistry; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.LinkedHashSet; import java.util.List; -public class PlaceholderLoader extends PlaceholderLoaderBase { +public abstract class PlaceholderLoader { - private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); - private static final TooltipDisplay HIDE_TOOLTIP = new TooltipDisplay(true, new LinkedHashSet<>()); + public void load(@Nullable ConfigurationSection section) throws Exception { + Placeholders.craftingOutput = parse(section, "crafting-output", defaultCraftingOutput()); + Placeholders.cursor = parse(section, "cursor", defaultCursor()); + Placeholders.drop = parse(section, "drop", defaultDrop()); + Placeholders.emptyHelmet = parse(section, "empty-helmet", getEmptyArmor(Items.LEATHER_HELMET)); + Placeholders.emptyChestplate = parse(section, "empty-chestplate", getEmptyArmor(Items.LEATHER_CHESTPLATE)); + Placeholders.emptyLeggings = parse(section, "empty-leggings", getEmptyArmor(Items.LEATHER_LEGGINGS)); + Placeholders.emptyBoots = parse(section, "empty-boots", getEmptyArmor(Items.LEATHER_BOOTS)); + Placeholders.emptyOffHand = parse(section, "empty-off-hand", defaultShield()); + Placeholders.notSlot = parse(section, "not-a-slot", defaultNotSlot()); + Placeholders.blockedOffline = parse(section, "blocked.offline", defaultBlockedOffline()); + + for (GameType type : GameType.values()) { + // Barrier: "Not available - Creative" etc. + ItemStack typeItem = new ItemStack(Items.BARRIER); + typeItem.set( + DataComponents.ITEM_NAME, + Component.translatable("options.narrator.notavailable").append(" - ").append(type.getShortDisplayName()) + ); + Placeholders.BLOCKED_GAME_TYPE.put(type, typeItem); + } + + Placeholders.BLOCKED_GAME_TYPE.put(GameType.CREATIVE, parse(section, "blocked.creative", Placeholders.BLOCKED_GAME_TYPE.get(GameType.CREATIVE))); + Placeholders.BLOCKED_GAME_TYPE.put(GameType.SPECTATOR, parse(section, "blocked.spectator", Placeholders.BLOCKED_GAME_TYPE.get(GameType.SPECTATOR))); + } + + protected @NotNull ItemStack parse( + @Nullable ConfigurationSection section, + @NotNull String path, + @NotNull ItemStack defaultStack + ) throws Exception { + if (section == null) { + return defaultStack; + } + + String itemText = section.getString(path); - @Override - protected @NotNull CompoundTag parseTag(@NotNull String itemText) throws Exception { - return TagParser.parseCompoundFully(itemText); + if (itemText == null) { + return defaultStack; + } + + CompoundTag compoundTag = TagParser.parseCompoundFully(itemText); + DataResult parsed = ItemStack.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), compoundTag); + ItemStack itemStack; + try { + itemStack = parsed.getOrThrow(); + } catch (Exception e) { + itemStack = null; + } + return itemStack == null ? defaultStack : itemStack; } - @Override + private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); + private static final TooltipDisplay HIDE_TOOLTIP = new TooltipDisplay(true, new LinkedHashSet<>()); + protected void addModelData(@NotNull ItemStack itemStack) { itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); } - @Override protected void hideTooltip(@NotNull ItemStack itemStack) { itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); } - @Override - protected DyedItemColor getDye(int rgb) { - return new DyedItemColor(rgb); + protected @NotNull ItemStack defaultCraftingOutput() { + // Crafting table: "Crafting" + ItemStack itemStack = new ItemStack(Items.CRAFTING_TABLE); + itemStack.set(DataComponents.ITEM_NAME, Component.translatable("container.crafting")); + addModelData(itemStack); + return itemStack; + } + + protected @NotNull ItemStack defaultCursor() { + // Cursor-like banner with no tooltip + ItemStack itemStack = new ItemStack(getDefaultCursorItem()); + RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); + Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); + BannerPattern halfDiagBottomRight = bannerPatterns.getOrThrow(BannerPatterns.DIAGONAL_RIGHT).value(); + BannerPattern downRight = bannerPatterns.getOrThrow(BannerPatterns.STRIPE_DOWNRIGHT).value(); + BannerPattern border = bannerPatterns.getOrThrow(BannerPatterns.BORDER).value(); + itemStack.set(DataComponents.BANNER_PATTERNS, + new BannerPatternLayers(List.of( + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(halfDiagBottomRight), DyeColor.GRAY), + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(downRight), DyeColor.WHITE), + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(border), DyeColor.GRAY) + )) + ); + addModelData(itemStack); + hideTooltip(itemStack); + return itemStack; + } + + protected @NotNull ItemStack defaultDrop() { + // Dropper: "Drop Selected Item" + ItemStack itemStack = new ItemStack(Items.DROPPER); + // Note: translatable component, not keybind component! We want the text identifying the keybind, not the key. + itemStack.set(DataComponents.ITEM_NAME, Component.translatable("key.drop")); + addModelData(itemStack); + return itemStack; + } + + protected @NotNull ItemStack getEmptyArmor(@NotNull ItemLike item) { + // Inventory-background-grey-ish leather armor with no tooltip + ItemStack itemStack = new ItemStack(item); + DyedItemColor color = new DyedItemColor(0xC8C8C8); + itemStack.set(DataComponents.DYED_COLOR, color); + hideTooltip(itemStack); + addModelData(itemStack); + return itemStack; + } + + protected @NotNull ItemStack defaultShield() { + // Shield with "missing texture" pattern, magenta and black squares. + ItemStack itemStack = new ItemStack(Items.SHIELD); + itemStack.set(DataComponents.BASE_COLOR, DyeColor.MAGENTA); + RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); + Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); + BannerPattern halfLeft = bannerPatterns.getOrThrow(BannerPatterns.HALF_VERTICAL).value(); + BannerPattern topLeft = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_TOP_LEFT).value(); + BannerPattern topRight = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_TOP_RIGHT).value(); + BannerPattern bottomLeft = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_BOTTOM_LEFT).value(); + BannerPattern bottomRight = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_BOTTOM_RIGHT).value(); + itemStack.set(DataComponents.BANNER_PATTERNS, + new BannerPatternLayers(List.of( + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(halfLeft), DyeColor.BLACK), + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(topLeft), DyeColor.MAGENTA), + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(bottomLeft), DyeColor.MAGENTA), + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(topRight), DyeColor.BLACK), + new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(bottomRight), DyeColor.BLACK) + )) + ); + hideTooltip(itemStack); + addModelData(itemStack); + return itemStack; + } + + protected @NotNull ItemStack defaultNotSlot() { + // White pane with no tooltip + ItemStack itemStack = new ItemStack(getDefaultNotSlotItem()); + hideTooltip(itemStack); + addModelData(itemStack); + return itemStack; + } + + protected @NotNull Item getDefaultCursorItem() { + return Items.BANNER.white(); + } + + protected @NotNull Item getDefaultNotSlotItem() { + return Items.STAINED_GLASS_PANE.white(); + } + + protected @NotNull ItemStack defaultBlockedOffline() { + // Barrier: "Not available - Offline" + ItemStack itemStack = new ItemStack(Items.BARRIER); + itemStack.set(DataComponents.ITEM_NAME, + Component.translatable("options.narrator.notavailable") + .append(Component.literal(" - ")) + .append(Component.translatable("gui.socialInteractions.status_offline")) + ); + return itemStack; } } diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java deleted file mode 100644 index 3ad8b1f0..00000000 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoaderBase.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; - -import com.mojang.serialization.DataResult; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.Registries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtOps; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.component.DyedItemColor; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.entity.BannerPattern; -import net.minecraft.world.level.block.entity.BannerPatternLayers; -import net.minecraft.world.level.block.entity.BannerPatterns; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.CraftRegistry; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -public abstract class PlaceholderLoaderBase { - - public void load(@Nullable ConfigurationSection section) throws Exception { - Placeholders.craftingOutput = parse(section, "crafting-output", defaultCraftingOutput()); - Placeholders.cursor = parse(section, "cursor", defaultCursor()); - Placeholders.drop = parse(section, "drop", defaultDrop()); - Placeholders.emptyHelmet = parse(section, "empty-helmet", getEmptyArmor(Items.LEATHER_HELMET)); - Placeholders.emptyChestplate = parse(section, "empty-chestplate", getEmptyArmor(Items.LEATHER_CHESTPLATE)); - Placeholders.emptyLeggings = parse(section, "empty-leggings", getEmptyArmor(Items.LEATHER_LEGGINGS)); - Placeholders.emptyBoots = parse(section, "empty-boots", getEmptyArmor(Items.LEATHER_BOOTS)); - Placeholders.emptyOffHand = parse(section, "empty-off-hand", defaultShield()); - Placeholders.notSlot = parse(section, "not-a-slot", defaultNotSlot()); - Placeholders.blockedOffline = parse(section, "blocked.offline", defaultBlockedOffline()); - - for (GameType type : GameType.values()) { - // Barrier: "Not available - Creative" etc. - ItemStack typeItem = new ItemStack(Items.BARRIER); - typeItem.set( - DataComponents.ITEM_NAME, - Component.translatable("options.narrator.notavailable").append(" - ").append(type.getShortDisplayName()) - ); - Placeholders.BLOCKED_GAME_TYPE.put(type, typeItem); - } - - Placeholders.BLOCKED_GAME_TYPE.put(GameType.CREATIVE, parse(section, "blocked.creative", Placeholders.BLOCKED_GAME_TYPE.get(GameType.CREATIVE))); - Placeholders.BLOCKED_GAME_TYPE.put(GameType.SPECTATOR, parse(section, "blocked.spectator", Placeholders.BLOCKED_GAME_TYPE.get(GameType.SPECTATOR))); - } - - protected @NotNull ItemStack parse( - @Nullable ConfigurationSection section, - @NotNull String path, - @NotNull ItemStack defaultStack - ) throws Exception { - if (section == null) { - return defaultStack; - } - - String itemText = section.getString(path); - - if (itemText == null) { - return defaultStack; - } - - CompoundTag compoundTag = parseTag(itemText); - DataResult parsed = ItemStack.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), compoundTag); - ItemStack itemStack; - try { - itemStack = parsed.getOrThrow(); - } catch (Exception e) { - itemStack = null; - } - return itemStack == null ? defaultStack : itemStack; - } - - protected abstract @NotNull CompoundTag parseTag(@NotNull String itemText) throws Exception; - - protected abstract void addModelData(@NotNull ItemStack itemStack); - - protected abstract void hideTooltip(@NotNull ItemStack itemStack); - - protected abstract DyedItemColor getDye(int rgb); - - protected @NotNull ItemStack defaultCraftingOutput() { - // Crafting table: "Crafting" - ItemStack itemStack = new ItemStack(Items.CRAFTING_TABLE); - itemStack.set(DataComponents.ITEM_NAME, Component.translatable("container.crafting")); - addModelData(itemStack); - return itemStack; - } - - protected @NotNull ItemStack defaultCursor() { - // Cursor-like banner with no tooltip - ItemStack itemStack = new ItemStack(getDefaultCursorItem()); - RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); - Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); - BannerPattern halfDiagBottomRight = bannerPatterns.getOrThrow(BannerPatterns.DIAGONAL_RIGHT).value(); - BannerPattern downRight = bannerPatterns.getOrThrow(BannerPatterns.STRIPE_DOWNRIGHT).value(); - BannerPattern border = bannerPatterns.getOrThrow(BannerPatterns.BORDER).value(); - itemStack.set(DataComponents.BANNER_PATTERNS, - new BannerPatternLayers(List.of( - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(halfDiagBottomRight), DyeColor.GRAY), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(downRight), DyeColor.WHITE), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(border), DyeColor.GRAY) - )) - ); - addModelData(itemStack); - hideTooltip(itemStack); - return itemStack; - } - - protected @NotNull ItemStack defaultDrop() { - // Dropper: "Drop Selected Item" - ItemStack itemStack = new ItemStack(Items.DROPPER); - // Note: translatable component, not keybind component! We want the text identifying the keybind, not the key. - itemStack.set(DataComponents.ITEM_NAME, Component.translatable("key.drop")); - addModelData(itemStack); - return itemStack; - } - - protected @NotNull ItemStack getEmptyArmor(@NotNull ItemLike item) { - // Inventory-background-grey-ish leather armor with no tooltip - ItemStack itemStack = new ItemStack(item); - DyedItemColor color = getDye(0xC8C8C8); - itemStack.set(DataComponents.DYED_COLOR, color); - hideTooltip(itemStack); - addModelData(itemStack); - return itemStack; - } - - protected @NotNull ItemStack defaultShield() { - // Shield with "missing texture" pattern, magenta and black squares. - ItemStack itemStack = new ItemStack(Items.SHIELD); - itemStack.set(DataComponents.BASE_COLOR, DyeColor.MAGENTA); - RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); - Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); - BannerPattern halfLeft = bannerPatterns.getOrThrow(BannerPatterns.HALF_VERTICAL).value(); - BannerPattern topLeft = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_TOP_LEFT).value(); - BannerPattern topRight = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_TOP_RIGHT).value(); - BannerPattern bottomLeft = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_BOTTOM_LEFT).value(); - BannerPattern bottomRight = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_BOTTOM_RIGHT).value(); - itemStack.set(DataComponents.BANNER_PATTERNS, - new BannerPatternLayers(List.of( - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(halfLeft), DyeColor.BLACK), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(topLeft), DyeColor.MAGENTA), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(bottomLeft), DyeColor.MAGENTA), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(topRight), DyeColor.BLACK), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(bottomRight), DyeColor.BLACK) - )) - ); - hideTooltip(itemStack); - addModelData(itemStack); - return itemStack; - } - - protected @NotNull ItemStack defaultNotSlot() { - // White pane with no tooltip - ItemStack itemStack = new ItemStack(getDefaultNotSlotItem()); - hideTooltip(itemStack); - addModelData(itemStack); - return itemStack; - } - - protected @NotNull Item getDefaultCursorItem() { - return Items.BANNER.pick(DyeColor.WHITE); - } - - protected @NotNull Item getDefaultNotSlotItem() { - return Items.STAINED_GLASS_PANE.pick(DyeColor.WHITE); - } - - protected @NotNull ItemStack defaultBlockedOffline() { - // Barrier: "Not available - Offline" - ItemStack itemStack = new ItemStack(Items.BARRIER); - itemStack.set(DataComponents.ITEM_NAME, - Component.translatable("options.narrator.notavailable") - .append(Component.literal(" - ")) - .append(Component.translatable("gui.socialInteractions.status_offline")) - ); - return itemStack; - } - -} From e619f77fa2aa45833af5425eb0547432cdee41e2 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 13:18:46 -0400 Subject: [PATCH 04/13] Remove incorrect modifier Whoopsies --- .../paper26_2/container/slot/placeholder/PlaceholderLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java index bad75b99..b864a7c7 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java @@ -29,7 +29,7 @@ import java.util.LinkedHashSet; import java.util.List; -public abstract class PlaceholderLoader { +public class PlaceholderLoader { public void load(@Nullable ConfigurationSection section) throws Exception { Placeholders.craftingOutput = parse(section, "crafting-output", defaultCraftingOutput()); From 4632d9feb7687ee66800c6cad00e2bf92a19dd0d Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 13:47:02 -0400 Subject: [PATCH 05/13] Update view-only slot Removed Slot#getContainerSlot override as it just calls the super method. Not entirely sure why I bothered implementing it in the first place unless an older version did some form of other shenanigans, because it should always have been identical to the super method prior to the visibility reduction. Added new Slot#safeClone. Not strictly necessary, but "faster" and hopefully helps guard against future implementation changes. --- .../paper26_2/container/slot/SlotViewOnly.java | 10 +++++----- .../container/slot/placeholder/Placeholders.java | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java index bb7461b7..817ce5fd 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java @@ -118,6 +118,11 @@ public boolean isActive() { return ItemStack.EMPTY; } + @Override + public @NotNull ItemStack safeClone(@NotNull Player player) { + return ItemStack.EMPTY; + } + @Override public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { return itemStack; @@ -133,11 +138,6 @@ public boolean allowModification(@NotNull Player player) { return false; } - @Override - public int getContainerSlot() { - return super.getContainerSlot(); - } - @Override public boolean isHighlightable() { return false; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java index efdc1633..6f31d5bb 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java @@ -10,6 +10,10 @@ public final class Placeholders { + // N.B. Slot#getNoItemIcon is still clientside, unfortunately. + // Worth checking every few updates just in case - it would be nice to + // get rid of some of the placeholders. + static final @NotNull EnumMap BLOCKED_GAME_TYPE = new EnumMap<>(GameType.class); public static @NotNull ItemStack craftingOutput = ItemStack.EMPTY; public static @NotNull ItemStack cursor = ItemStack.EMPTY; From 339e8743fa8feedf1926dbb3b51e91ebf7262ee3 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 13:59:57 -0400 Subject: [PATCH 06/13] More accurate advancement listener removal method name --- .../openinv/internal/paper26_1/player/PlayerManager.java | 4 +++- .../openinv/internal/paper26_2/player/PlayerManager.java | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java index 1bfbca0e..1fab82f0 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/player/PlayerManager.java @@ -4,9 +4,11 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class PlayerManager extends com.lishid.openinv.internal.paper26_2.player.PlayerManager { public PlayerManager(Logger logger) { @@ -14,7 +16,7 @@ public PlayerManager(Logger logger) { } @Override - protected void clearAdvancements(ServerPlayer entity) { + protected void removeAdvancementListeners(ServerPlayer entity) { entity.getAdvancements().stopListening(); } diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java index 8f9e91b1..935264d6 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java @@ -99,7 +99,7 @@ public static ServerPlayer getHandle(final Player player) { ServerPlayer entity = createNewPlayer(server, worldServer, offline); // Stop listening for advancement progression - if this is not cleaned up, loading causes a memory leak. - clearAdvancements(entity); + removeAdvancementListeners(entity); // Try to load the player's data. if (loadData(server, entity)) { @@ -148,7 +148,7 @@ protected ServerPlayer createNewPlayer( return entity; } - protected void clearAdvancements(ServerPlayer entity) { + protected void removeAdvancementListeners(ServerPlayer entity) { entity.getAdvancements().clearTriggers(); } From 0a824cb1f6316431bfb7ffe8b69a0ed85b49631c Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 14:10:15 -0400 Subject: [PATCH 07/13] Include InternalAccessor changes for placeholders Can you tell that I'm doing the Paper health checks alongside the Spigot upgrade and am bouncing between stashes like crazy? --- .../openinv/internal/paper26_1/InternalAccessor.java | 7 +++---- .../openinv/internal/paper26_2/InternalAccessor.java | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java index 289089e5..4e231cfb 100644 --- a/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java +++ b/internal/paper26_1/src/main/java/com/lishid/openinv/internal/paper26_1/InternalAccessor.java @@ -3,9 +3,8 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.paper26_1.container.AnySilentContainer; import com.lishid.openinv.internal.paper26_1.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_1.container.slot.placeholder.PlaceholderLoader; import com.lishid.openinv.internal.paper26_1.player.PlayerManager; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoaderBase; +import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader; import com.lishid.openinv.util.lang.LanguageManager; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -32,8 +31,8 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } @Override - protected @NotNull PlaceholderLoaderBase createPlaceholderLoader() { - return new PlaceholderLoader(); + protected @NotNull PlaceholderLoader createPlaceholderLoader() { + return new com.lishid.openinv.internal.paper26_1.container.slot.placeholder.PlaceholderLoader(); } @Override diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java index e853814f..9edf046d 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java @@ -9,7 +9,6 @@ import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; import com.lishid.openinv.internal.paper26_2.container.OpenInventory; import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoaderBase; import com.lishid.openinv.internal.paper26_2.player.PlayerManager; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.world.Container; @@ -46,7 +45,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { return new AnySilentContainer(logger, lang); } - protected @NotNull PlaceholderLoaderBase createPlaceholderLoader() { + protected @NotNull PlaceholderLoader createPlaceholderLoader() { return new PlaceholderLoader(); } From a1731b9de37bed6110cf8e2e1356d70adcd614e9 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 14:16:57 -0400 Subject: [PATCH 08/13] Add support for Spigot 26.2 --- .../slot/placeholder/PlaceholderLoader.java | 40 ------------------- internal/spigot26_1/build.gradle.kts | 36 +++++++++++++++++ .../internal/spigot26_1/InternalAccessor.java | 24 +++++++++++ .../spigot26_1/player/PlayerManager.java | 20 ++++++++++ .../{spigot => spigot26_2}/build.gradle.kts | 2 +- .../spigot26_2}/InternalAccessor.java | 12 +++--- .../container/AnySilentContainer.java | 6 +-- .../spigot26_2}/container/OpenEnderChest.java | 8 ++-- .../spigot26_2}/container/OpenInventory.java | 34 ++++++++-------- .../container/bukkit/OpenDummyInventory.java | 7 +++- .../bukkit/OpenDummyPlayerInventory.java | 2 +- .../container/bukkit/OpenPlayerInventory.java | 4 +- .../bukkit/OpenPlayerInventorySelf.java | 4 +- .../container/menu/OpenChestMenu.java | 6 +-- .../container/menu/OpenEnderChestMenu.java | 4 +- .../container/menu/OpenInventoryMenu.java | 14 +++---- .../container/menu/OpenSyncMenu.java | 4 +- .../spigot26_2}/container/slot/Content.java | 2 +- .../container/slot/ContentCrafting.java | 6 +-- .../container/slot/ContentCraftingResult.java | 4 +- .../container/slot/ContentCursor.java | 6 +-- .../container/slot/ContentDrop.java | 6 +-- .../container/slot/ContentEquipment.java | 4 +- .../container/slot/ContentList.java | 2 +- .../container/slot/ContentOffHand.java | 4 +- .../container/slot/ContentViewOnly.java | 2 +- .../container/slot/SlotPlaceholder.java | 2 +- .../container/slot/SlotViewOnly.java | 14 +++---- .../slot/placeholder/PlaceholderLoader.java | 19 +++++++++ .../placeholder/PlaceholderLoaderBase.java | 34 +++++++++++----- .../slot/placeholder/Placeholders.java | 4 +- .../spigot26_2}/player/OpenPlayer.java | 2 +- .../spigot26_2}/player/PlayerManager.java | 15 ++++--- plugin/build.gradle.kts | 7 +++- .../lishid/openinv/util/InternalAccessor.java | 3 ++ settings.gradle.kts | 3 +- 36 files changed, 227 insertions(+), 139 deletions(-) delete mode 100644 internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java create mode 100644 internal/spigot26_1/build.gradle.kts create mode 100644 internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java create mode 100644 internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java rename internal/{spigot => spigot26_2}/build.gradle.kts (96%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/InternalAccessor.java (86%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/AnySilentContainer.java (97%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/OpenEnderChest.java (95%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/OpenInventory.java (92%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/bukkit/OpenDummyInventory.java (94%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/bukkit/OpenDummyPlayerInventory.java (97%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/bukkit/OpenPlayerInventory.java (97%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/bukkit/OpenPlayerInventorySelf.java (80%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/menu/OpenChestMenu.java (97%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/menu/OpenEnderChestMenu.java (91%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/menu/OpenInventoryMenu.java (95%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/menu/OpenSyncMenu.java (98%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/Content.java (96%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentCrafting.java (94%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentCraftingResult.java (91%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentCursor.java (94%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentDrop.java (90%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentEquipment.java (96%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentList.java (95%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentOffHand.java (91%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/ContentViewOnly.java (94%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/SlotPlaceholder.java (89%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/SlotViewOnly.java (93%) create mode 100644 internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/placeholder/PlaceholderLoaderBase.java (86%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/container/slot/placeholder/Placeholders.java (91%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/player/OpenPlayer.java (99%) rename internal/{spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1 => spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2}/player/PlayerManager.java (94%) diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java b/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java deleted file mode 100644 index c1925d78..00000000 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder; - -import net.minecraft.core.component.DataComponents; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.TagParser; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.CustomModelData; -import net.minecraft.world.item.component.DyedItemColor; -import net.minecraft.world.item.component.TooltipDisplay; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedHashSet; -import java.util.List; - -public class PlaceholderLoader extends PlaceholderLoaderBase { - - private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); - private static final TooltipDisplay HIDE_TOOLTIP = new TooltipDisplay(true, new LinkedHashSet<>()); - - @Override - protected @NotNull CompoundTag parseTag(@NotNull String itemText) throws Exception { - return TagParser.parseCompoundFully(itemText); - } - - @Override - protected void addModelData(@NotNull ItemStack itemStack) { - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - } - - @Override - protected void hideTooltip(@NotNull ItemStack itemStack) { - itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); - } - - @Override - protected DyedItemColor getDye(int rgb) { - return new DyedItemColor(rgb); - } - -} diff --git a/internal/spigot26_1/build.gradle.kts b/internal/spigot26_1/build.gradle.kts new file mode 100644 index 00000000..e6d39f0e --- /dev/null +++ b/internal/spigot26_1/build.gradle.kts @@ -0,0 +1,36 @@ +import com.github.jikoo.openinv.SpigotDependencyExtension +import com.github.jikoo.openinv.SpigotSetup + +plugins { + alias(libs.plugins.shadow) +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(25) +} + +tasks.withType().configureEach { + options.release = 21 +} + +apply() + +dependencies { + compileOnly(libs.spigotapi) + extensions.getByType(SpigotDependencyExtension::class.java).version = "26.1.2-R0.1-SNAPSHOT" + compileOnly("com.mojang:logging:1.6.11") + compileOnly("com.mojang:brigadier:1.3.10") + compileOnly("com.mojang:datafixerupper:9.0.19") + compileOnly("com.mojang:authlib:7.0.62") + + compileOnly(project(":openinvapi")) + compileOnly(project(":openinvcommon")) + + compileOnly(project(":openinvadapterspigot26_2")) { + exclude(group = "org.spigotmc", module = "spigot") + } +} diff --git a/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java new file mode 100644 index 00000000..32734d35 --- /dev/null +++ b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java @@ -0,0 +1,24 @@ +package com.github.jikoo.openinv.internal.spigot26_1; + +import com.github.jikoo.openinv.internal.spigot26_1.player.PlayerManager; +import com.lishid.openinv.util.lang.LanguageManager; +import org.jspecify.annotations.NullMarked; + +import java.util.logging.Logger; + +@NullMarked +public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_2.InternalAccessor { + + private final PlayerManager manager; + + public InternalAccessor(Logger logger, LanguageManager lang) { + super(logger, lang); + this.manager = new PlayerManager(logger); + } + + @Override + public PlayerManager getPlayerManager() { + return manager; + } + +} diff --git a/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java new file mode 100644 index 00000000..4e071f80 --- /dev/null +++ b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java @@ -0,0 +1,20 @@ +package com.github.jikoo.openinv.internal.spigot26_1.player; + +import net.minecraft.server.PlayerAdvancements; +import org.jspecify.annotations.NullMarked; + +import java.util.logging.Logger; + +@NullMarked +public class PlayerManager extends com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager { + + public PlayerManager(Logger logger) { + super(logger); + } + + @Override + protected void removeListeners(PlayerAdvancements advancements) { + advancements.stopListening(); + } + +} diff --git a/internal/spigot/build.gradle.kts b/internal/spigot26_2/build.gradle.kts similarity index 96% rename from internal/spigot/build.gradle.kts rename to internal/spigot26_2/build.gradle.kts index aad0f58f..a9e1dc59 100644 --- a/internal/spigot/build.gradle.kts +++ b/internal/spigot26_2/build.gradle.kts @@ -21,7 +21,7 @@ apply() dependencies { compileOnly(libs.spigotapi) - extensions.getByType(SpigotDependencyExtension::class.java).version = "26.1.2-R0.1-SNAPSHOT" + extensions.getByType(SpigotDependencyExtension::class.java).version = "26.2-R0.1-SNAPSHOT" compileOnly("com.mojang:logging:1.6.11") compileOnly("com.mojang:brigadier:1.3.10") compileOnly("com.mojang:datafixerupper:9.0.19") diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java similarity index 86% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java index 3a657c3e..fcc121c7 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java @@ -1,10 +1,10 @@ -package com.github.jikoo.openinv.internal.spigot26_1; +package com.github.jikoo.openinv.internal.spigot26_2; -import com.github.jikoo.openinv.internal.spigot26_1.container.AnySilentContainer; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenInventory; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenEnderChest; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.PlaceholderLoader; -import com.github.jikoo.openinv.internal.spigot26_1.player.PlayerManager; +import com.github.jikoo.openinv.internal.spigot26_2.container.AnySilentContainer; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.PlaceholderLoader; +import com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager; import com.lishid.openinv.internal.Accessor; import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.ISpecialEnderChest; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/AnySilentContainer.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/AnySilentContainer.java similarity index 97% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/AnySilentContainer.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/AnySilentContainer.java index 99865095..a964e120 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/AnySilentContainer.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/AnySilentContainer.java @@ -1,8 +1,8 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container; +package com.github.jikoo.openinv.internal.spigot26_2.container; import com.lishid.openinv.internal.AnySilentContainerBase; -import com.github.jikoo.openinv.internal.spigot26_1.container.menu.OpenChestMenu; -import com.github.jikoo.openinv.internal.spigot26_1.player.PlayerManager; +import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager; import com.lishid.openinv.util.ReflectionHelper; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.core.BlockPos; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/OpenEnderChest.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenEnderChest.java similarity index 95% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/OpenEnderChest.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenEnderChest.java index 3d91dd46..9942b2e6 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/OpenEnderChest.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenEnderChest.java @@ -1,8 +1,8 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container; +package com.github.jikoo.openinv.internal.spigot26_2.container; -import com.github.jikoo.openinv.internal.spigot26_1.container.menu.OpenChestMenu; -import com.github.jikoo.openinv.internal.spigot26_1.container.menu.OpenEnderChestMenu; -import com.github.jikoo.openinv.internal.spigot26_1.player.PlayerManager; +import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenEnderChestMenu; +import com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.InternalOwned; import net.minecraft.core.NonNullList; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/OpenInventory.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenInventory.java similarity index 92% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/OpenInventory.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenInventory.java index 8ffc5982..d2ba50f3 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/OpenInventory.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenInventory.java @@ -1,20 +1,20 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container; - -import com.github.jikoo.openinv.internal.spigot26_1.container.bukkit.OpenPlayerInventory; -import com.github.jikoo.openinv.internal.spigot26_1.container.menu.OpenChestMenu; -import com.github.jikoo.openinv.internal.spigot26_1.container.menu.OpenInventoryMenu; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.Content; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentCrafting; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentCraftingResult; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentCursor; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentDrop; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentEquipment; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentList; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentOffHand; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentViewOnly; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.SlotViewOnly; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_1.player.PlayerManager; +package com.github.jikoo.openinv.internal.spigot26_2.container; + +import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenPlayerInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenInventoryMenu; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.Content; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentCrafting; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentCraftingResult; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentCursor; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentDrop; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentEquipment; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentList; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentOffHand; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentViewOnly; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.SlotViewOnly; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager; import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.InternalOwned; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenDummyInventory.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyInventory.java similarity index 94% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenDummyInventory.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyInventory.java index 4f19a2b3..99178f18 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenDummyInventory.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyInventory.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; import com.lishid.openinv.internal.ViewOnly; import net.minecraft.world.Container; @@ -40,16 +40,19 @@ public void setItem(int index, @Nullable ItemStack item) { } + @SuppressWarnings("NonApiType") @Override public @NotNull HashMap addItem(@NotNull ItemStack... items) throws IllegalArgumentException { return arrayToHashMap(items); } + @SuppressWarnings("NonApiType") @Override public @NotNull HashMap removeItem(@NotNull ItemStack... items) throws IllegalArgumentException { return arrayToHashMap(items); } + @SuppressWarnings("NonApiType") private static @NotNull HashMap arrayToHashMap(@NotNull ItemStack[] items) { HashMap ignored = new HashMap<>(); for (int index = 0; index < items.length; ++index) { @@ -103,6 +106,7 @@ public boolean containsAtLeast(@Nullable ItemStack item, int amount) { return false; } + @SuppressWarnings("NonApiType") @Override public @NotNull HashMap all( @NotNull Material material @@ -110,6 +114,7 @@ public boolean containsAtLeast(@Nullable ItemStack item, int amount) { return new HashMap<>(); } + @SuppressWarnings("NonApiType") @Override public @NotNull HashMap all(@Nullable ItemStack item) { return new HashMap<>(); diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenDummyPlayerInventory.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyPlayerInventory.java similarity index 97% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenDummyPlayerInventory.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyPlayerInventory.java index 94651862..96f54208 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyPlayerInventory.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; import net.minecraft.world.Container; import org.bukkit.Material; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenPlayerInventory.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventory.java similarity index 97% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenPlayerInventory.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventory.java index 30ebb74f..32d68b51 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenPlayerInventory.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventory.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; import com.google.common.base.Preconditions; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Inventory; import org.bukkit.craftbukkit.inventory.CraftInventory; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenPlayerInventorySelf.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java similarity index 80% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenPlayerInventorySelf.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java index 3057020f..dc9d46cf 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenChestMenu.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenChestMenu.java similarity index 97% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenChestMenu.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenChestMenu.java index 92fe5046..00b5322d 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenChestMenu.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenChestMenu.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.menu; +package com.github.jikoo.openinv.internal.spigot26_2.container.menu; -import com.github.jikoo.openinv.internal.spigot26_1.container.bukkit.OpenDummyInventory; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.SlotViewOnly; +import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenDummyInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.SlotViewOnly; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.InternalOwned; import net.minecraft.server.level.ServerPlayer; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenEnderChestMenu.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenEnderChestMenu.java similarity index 91% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenEnderChestMenu.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenEnderChestMenu.java index 6669982d..2e396b24 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenEnderChestMenu.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenEnderChestMenu.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.menu; +package com.github.jikoo.openinv.internal.spigot26_2.container.menu; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenEnderChest; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenInventoryMenu.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenInventoryMenu.java similarity index 95% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenInventoryMenu.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenInventoryMenu.java index 735d4e3d..2989ff5f 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenInventoryMenu.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenInventoryMenu.java @@ -1,13 +1,13 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.menu; +package com.github.jikoo.openinv.internal.spigot26_2.container.menu; import com.google.common.base.Preconditions; import com.lishid.openinv.util.Permissions; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenInventory; -import com.github.jikoo.openinv.internal.spigot26_1.container.bukkit.OpenDummyPlayerInventory; -import com.github.jikoo.openinv.internal.spigot26_1.container.bukkit.OpenPlayerInventorySelf; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentDrop; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.ContentEquipment; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.SlotViewOnly; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenDummyPlayerInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenPlayerInventorySelf; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentDrop; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentEquipment; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.SlotViewOnly; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenSyncMenu.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenSyncMenu.java similarity index 98% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenSyncMenu.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenSyncMenu.java index b4cd5f95..3f6911fc 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/menu/OpenSyncMenu.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenSyncMenu.java @@ -1,9 +1,9 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.menu; +package com.github.jikoo.openinv.internal.spigot26_2.container.menu; import com.google.common.base.Suppliers; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.InternalOwned; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.SlotPlaceholder; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.SlotPlaceholder; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.network.HashedStack; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/Content.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java similarity index 96% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/Content.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java index 6be9ca5d..041a0e10 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/Content.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCrafting.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCrafting.java similarity index 94% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCrafting.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCrafting.java index a2c76f27..d07e1feb 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCrafting.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCrafting.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_1.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCraftingResult.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCraftingResult.java similarity index 91% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCraftingResult.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCraftingResult.java index 886a8d1d..1f96933f 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCraftingResult.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCraftingResult.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.InventoryMenu; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCursor.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCursor.java similarity index 94% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCursor.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCursor.java index 0a35c588..7f612f94 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentCursor.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCursor.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_1.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentDrop.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentDrop.java similarity index 90% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentDrop.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentDrop.java index 06c102bd..c5ce467d 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentDrop.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentDrop.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_1.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentEquipment.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentEquipment.java similarity index 96% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentEquipment.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentEquipment.java index f55c9ce7..d50cb499 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentEquipment.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentEquipment.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.EquipmentSlot; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentList.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentList.java similarity index 95% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentList.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentList.java index 97e1422a..7ba0e1b3 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentList.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentList.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentOffHand.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentOffHand.java similarity index 91% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentOffHand.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentOffHand.java index 9aebadd3..0b9c9121 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentOffHand.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentOffHand.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentViewOnly.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentViewOnly.java similarity index 94% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentViewOnly.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentViewOnly.java index bbce19d5..cb7946b7 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/ContentViewOnly.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentViewOnly.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/SlotPlaceholder.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotPlaceholder.java similarity index 89% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/SlotPlaceholder.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotPlaceholder.java index d1e793c7..fd0e0a65 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/SlotPlaceholder.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotPlaceholder.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/SlotViewOnly.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java similarity index 93% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/SlotViewOnly.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java index 6c24d6ce..bebef508 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/SlotViewOnly.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; -import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; @@ -118,6 +118,11 @@ public boolean isActive() { return ItemStack.EMPTY; } + @Override + public @NotNull ItemStack safeClone(@NotNull Player player) { + return ItemStack.EMPTY; + } + @Override public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { return itemStack; @@ -133,11 +138,6 @@ public boolean allowModification(@NotNull Player player) { return false; } - @Override - public int getContainerSlot() { - return this.slot; - } - @Override public boolean isHighlightable() { return false; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java new file mode 100644 index 00000000..b5268a0d --- /dev/null +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java @@ -0,0 +1,19 @@ +package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; + +public class PlaceholderLoader extends PlaceholderLoaderBase { + + @Override + protected @NotNull Item getWhiteBanner() { + return Items.BANNER.white(); + } + + @Override + protected @NotNull Item getWhiteGlassPane() { + return Items.STAINED_GLASS_PANE.white(); + } + +} diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoaderBase.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoaderBase.java similarity index 86% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoaderBase.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoaderBase.java index b16ec996..de37abb2 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoaderBase.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoaderBase.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; import com.mojang.serialization.DataResult; import net.minecraft.core.Registry; @@ -7,11 +7,15 @@ import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.CustomModelData; import net.minecraft.world.item.component.DyedItemColor; +import net.minecraft.world.item.component.TooltipDisplay; import net.minecraft.world.level.GameType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.entity.BannerPattern; @@ -22,10 +26,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.LinkedHashSet; import java.util.List; public abstract class PlaceholderLoaderBase { + private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); + private static final TooltipDisplay HIDE_TOOLTIP = new TooltipDisplay(true, new LinkedHashSet<>()); + public void load(@Nullable ConfigurationSection section) throws Exception { Placeholders.craftingOutput = parse(section, "crafting-output", defaultCraftingOutput()); Placeholders.cursor = parse(section, "cursor", defaultCursor()); @@ -67,7 +75,7 @@ public void load(@Nullable ConfigurationSection section) throws Exception { return defaultStack; } - CompoundTag compoundTag = parseTag(itemText); + CompoundTag compoundTag = TagParser.parseCompoundFully(itemText); DataResult parsed = ItemStack.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), compoundTag); ItemStack itemStack; try { @@ -78,13 +86,13 @@ public void load(@Nullable ConfigurationSection section) throws Exception { return itemStack == null ? defaultStack : itemStack; } - protected abstract @NotNull CompoundTag parseTag(@NotNull String itemText) throws Exception; - - protected abstract void addModelData(@NotNull ItemStack itemStack); - - protected abstract void hideTooltip(@NotNull ItemStack itemStack); + protected void addModelData(@NotNull ItemStack itemStack) { + itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); + } - protected abstract DyedItemColor getDye(int rgb); + protected void hideTooltip(@NotNull ItemStack itemStack) { + itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); + } protected @NotNull ItemStack defaultCraftingOutput() { // Crafting table: "Crafting" @@ -96,7 +104,7 @@ public void load(@Nullable ConfigurationSection section) throws Exception { protected @NotNull ItemStack defaultCursor() { // Cursor-like banner with no tooltip - ItemStack itemStack = new ItemStack(Items.WHITE_BANNER); + ItemStack itemStack = new ItemStack(getWhiteBanner()); RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); BannerPattern halfDiagBottomRight = bannerPatterns.getOrThrow(BannerPatterns.DIAGONAL_RIGHT).value(); @@ -114,6 +122,8 @@ public void load(@Nullable ConfigurationSection section) throws Exception { return itemStack; } + protected abstract @NotNull Item getWhiteBanner(); + protected @NotNull ItemStack defaultDrop() { // Dropper: "Drop Selected Item" ItemStack itemStack = new ItemStack(Items.DROPPER); @@ -126,7 +136,7 @@ public void load(@Nullable ConfigurationSection section) throws Exception { protected @NotNull ItemStack getEmptyArmor(@NotNull ItemLike item) { // Inventory-background-grey-ish leather armor with no tooltip ItemStack itemStack = new ItemStack(item); - DyedItemColor color = getDye(0xC8C8C8); + DyedItemColor color = new DyedItemColor(0xC8C8C8); itemStack.set(DataComponents.DYED_COLOR, color); hideTooltip(itemStack); addModelData(itemStack); @@ -160,12 +170,14 @@ public void load(@Nullable ConfigurationSection section) throws Exception { protected @NotNull ItemStack defaultNotSlot() { // White pane with no tooltip - ItemStack itemStack = new ItemStack(Items.WHITE_STAINED_GLASS_PANE); + ItemStack itemStack = new ItemStack(getWhiteGlassPane()); hideTooltip(itemStack); addModelData(itemStack); return itemStack; } + protected abstract @NotNull Item getWhiteGlassPane(); + protected @NotNull ItemStack defaultBlockedOffline() { // Barrier: "Not available - Offline" ItemStack itemStack = new ItemStack(Items.BARRIER); diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/Placeholders.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java similarity index 91% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/Placeholders.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java index 30308d92..9364e6f0 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/Placeholders.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder; +package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; -import com.github.jikoo.openinv.internal.spigot26_1.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/OpenPlayer.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java similarity index 99% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/OpenPlayer.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java index cae26f4a..b9be7ec9 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/OpenPlayer.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_1.player; +package com.github.jikoo.openinv.internal.spigot26_2.player; import com.lishid.openinv.event.OpenEvents; import com.mojang.logging.LogUtils; diff --git a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/PlayerManager.java similarity index 94% rename from internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java rename to internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/PlayerManager.java index f036331c..1796b7f7 100644 --- a/internal/spigot/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/player/PlayerManager.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/PlayerManager.java @@ -1,8 +1,8 @@ -package com.github.jikoo.openinv.internal.spigot26_1.player; +package com.github.jikoo.openinv.internal.spigot26_2.player; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenEnderChest; -import com.github.jikoo.openinv.internal.spigot26_1.container.OpenInventory; -import com.github.jikoo.openinv.internal.spigot26_1.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenChestMenu; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.util.JulLoggerAdapter; import com.mojang.authlib.GameProfile; @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerAdvancements; import net.minecraft.server.level.ClientInformation; import net.minecraft.server.level.ParticleStatus; import net.minecraft.server.level.ServerLevel; @@ -90,7 +91,7 @@ public PlayerManager(@NotNull Logger logger) { ServerPlayer entity = createNewPlayer(server, worldServer, offline); // Stop listening for advancement progression - if this is not cleaned up, loading causes a memory leak. - entity.getAdvancements().stopListening(); + removeListeners(entity.getAdvancements()); // Try to load the player's data. if (loadData(entity)) { @@ -139,6 +140,10 @@ public PlayerManager(@NotNull Logger logger) { return entity; } + protected void removeListeners(@NotNull PlayerAdvancements advancements) { + advancements.clearTriggers(); + } + boolean loadData(@NotNull ServerPlayer player) { // See CraftPlayer#loadData diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 82056ffa..107abd36 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -23,8 +23,11 @@ dependencies { implementation(project(":openinvadapterpaper1_21_10")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } - implementation(project(":openinvadapterspigot")) { - exclude(group = "io.papermc.paper", module = "dev-bundle") + implementation(project(":openinvadapterspigot26_2")) { + exclude(group = "org.spigotmc", module = "spigot") + } + implementation(project(":openinvadapterspigot26_1")) { + exclude(group = "org.spigotmc", module = "spigot") } implementation(libs.planarwrappers) implementation(libs.folia.scheduler.wrapper) diff --git a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java index dd405013..5ddea41b 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -65,6 +65,9 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { private @Nullable Accessor getAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { if (!PAPER) { + if (BukkitVersions.MINECRAFT.equals(Version.of(26, 2))) { + return new com.github.jikoo.openinv.internal.spigot26_2.InternalAccessor(logger, lang); + } if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1)) && BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(26, 1, 2))) { // Load Spigot accessor. diff --git a/settings.gradle.kts b/settings.gradle.kts index 0fbcb8eb..7fe037b1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,7 +22,8 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { "paper26_1", "paper1_21_11", "paper1_21_10", - "spigot" + "spigot26_2", + "spigot26_1" ) for (internal in internals) { include(":openinvadapter$internal") From 0d107de11f831d3e84fae7855a2ef7a51de66192 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 14:27:51 -0400 Subject: [PATCH 09/13] Update resource pack version Based on the 26.2 announcement, there aren't any changes that should affect items and blocks OI uses. --- resource-pack/openinv-legibility-pack/pack.mcmeta | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resource-pack/openinv-legibility-pack/pack.mcmeta b/resource-pack/openinv-legibility-pack/pack.mcmeta index f9b92606..3bd732cb 100644 --- a/resource-pack/openinv-legibility-pack/pack.mcmeta +++ b/resource-pack/openinv-legibility-pack/pack.mcmeta @@ -2,16 +2,16 @@ "pack": { "description": "Improve OpenInv's legibility", "min_format": 34, - "max_format": [85, 0], + "max_format": [88, 0], "pack_format": 64, - "supported_formats": [ 34, 85 ] + "supported_formats": [ 34, 88 ] }, "overlays": { "entries": [ { "min_format": 44, - "max_format": [85, 0], - "formats": [ 44, 85 ], + "max_format": [88, 0], + "formats": [ 44, 88 ], "directory": "openinv_44" }, { From 4980fac83518551dddc3958a14f24d5ba742dab5 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Thu, 25 Jun 2026 14:34:02 -0400 Subject: [PATCH 10/13] Fix placeholders on older Spigot helps to actually implement both parts of a change --- .../internal/spigot26_1/InternalAccessor.java | 14 +++++++++++++ .../slot/placeholder/PlaceholderLoader.java | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java diff --git a/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java index 32734d35..fa6e2331 100644 --- a/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java +++ b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/InternalAccessor.java @@ -1,9 +1,12 @@ package com.github.jikoo.openinv.internal.spigot26_1; +import com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder.PlaceholderLoader; import com.github.jikoo.openinv.internal.spigot26_1.player.PlayerManager; import com.lishid.openinv.util.lang.LanguageManager; +import org.bukkit.configuration.ConfigurationSection; import org.jspecify.annotations.NullMarked; +import java.util.logging.Level; import java.util.logging.Logger; @NullMarked @@ -21,4 +24,15 @@ public PlayerManager getPlayerManager() { return manager; } + @Override + public void reload(ConfigurationSection config) { + ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); + try { + // Reset placeholders to defaults and try to load configuration. + new PlaceholderLoader().load(placeholders); + } catch (Exception e) { + logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); + } + } + } diff --git a/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java new file mode 100644 index 00000000..dddefdb5 --- /dev/null +++ b/internal/spigot26_1/src/main/java/com/github/jikoo/openinv/internal/spigot26_1/container/slot/placeholder/PlaceholderLoader.java @@ -0,0 +1,21 @@ +package com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder; + +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.PlaceholderLoaderBase; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public class PlaceholderLoader extends PlaceholderLoaderBase { + + @Override + protected Item getWhiteBanner() { + return Items.WHITE_BANNER; + } + + @Override + protected Item getWhiteGlassPane() { + return Items.WHITE_STAINED_GLASS_PANE; + } + +} From aae1a37f43400cd523d71f1dd68223a12be060e7 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 27 Jun 2026 06:53:52 -0400 Subject: [PATCH 11/13] Update player tag deserialization --- .../internal/paper26_2/player/OpenPlayer.java | 1 + .../spigot26_2/player/OpenPlayer.java | 26 ++++++------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java index 43cb27a8..e2824aea 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java @@ -54,6 +54,7 @@ public class OpenPlayer extends CraftPlayer { // Intentional omissions to prevent mount loss: Attach, Entity, and RootVehicle "warden_spawn_tracker", // No longer needed as of 1.21.11 "entered_nether_pos", + "last_explosion_impact_pos", "respawn", "raid_omen_position", "ender_pearls", diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java index b9be7ec9..6c74c76e 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java @@ -31,7 +31,7 @@ public class OpenPlayer extends CraftPlayer { /** * List of tags to always reset when saving. * - * @see net.minecraft.world.entity.Entity#saveWithoutId(ValueOutput) + * @see net.minecraft.world.entity.Entity#saveWithoutId(ValueOutput, boolean) * @see ServerPlayer#addAdditionalSaveData(ValueOutput) * @see net.minecraft.world.entity.player.Player#addAdditionalSaveData(ValueOutput) * @see net.minecraft.world.entity.LivingEntity#addAdditionalSaveData(ValueOutput) @@ -47,33 +47,23 @@ public class OpenPlayer extends CraftPlayer { "TicksFrozen", "HasVisualFire", "Tags", + "data", "Passengers", // ServerPlayer#addAdditionalSaveData(CompoundTag) // Intentional omissions to prevent mount loss: Attach, Entity, and RootVehicle - "warden_spawn_tracker", - "entered_nether_pos", // Replaces enteredNetherPosition - "enteredNetherPosition", - "respawn", // Replaces SpawnXyz fields as of 1.21.6 - "SpawnX", - "SpawnY", - "SpawnZ", - "SpawnForced", - "SpawnAngle", - "SpawnDimension", + "entered_nether_pos", + "last_explosion_impact_pos", + "respawn", "raid_omen_position", "ender_pearls", - // Player#addAdditionalSaveData(CompoundTag) "ShoulderEntityLeft", "ShoulderEntityRight", + // Player#addAdditionalSaveData(CompoundTag) "LastDeathLocation", - "current_explosion_impact_pos", // LivingEntity#addAdditionalSaveData(CompoundTag) + "current_explosion_impact_pos", "active_effects", - "sleeping_pos", // Replaces SleepingXyz fields as of 1.21.6 - "SleepingX", - "SleepingY", - "SleepingZ", - "Brain", + "sleeping_pos", "last_hurt_by_player", "last_hurt_by_player_memory_time", "last_hurt_by_mob", From 22843527106e54322526517116440b18cadcee11 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 27 Jun 2026 06:57:59 -0400 Subject: [PATCH 12/13] Remove now-unneeded extra method --- .../internal/paper26_2/player/OpenPlayer.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java index e2824aea..160351c6 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; import java.util.Set; public class OpenPlayer extends CraftPlayer { @@ -99,9 +98,8 @@ public void saveData() { try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), logger)) { PlayerDataStorage worldNbtStorage = server.getServer().getPlayerList().playerIo; - CompoundTag oldData = isOnline() - ? null - : load(worldNbtStorage, player, scopedCollector).orElse(null); + CompoundTag oldData; + oldData = isOnline() ? null : worldNbtStorage.load(player.nameAndId()).orElse(null); CompoundTag playerData = getWritableTag(oldData); ValueOutput valueOutput = TagValueOutput.createWrappingWithContext(scopedCollector, player.registryAccess(), playerData); @@ -113,14 +111,6 @@ public void saveData() { } } - protected Optional load( - PlayerDataStorage storage, - ServerPlayer player, - ProblemReporter.ScopedCollector collector - ) { - return storage.load(player.nameAndId()); - } - protected void saveSafe( @NotNull ServerPlayer player, @Nullable CompoundTag oldData, From 0135f783bdc94a407d43712829fc7ed3cc5d7098 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 27 Jun 2026 11:27:25 -0400 Subject: [PATCH 13/13] Drop internal version listing With the move to a rolling window of supported releases rather than last major version + all current major version, maintaining an internal list is a little annoying and impedes the ability to make pre-release announcements. --- .../main/java/com/lishid/openinv/OpenInv.java | 2 +- .../lishid/openinv/util/InternalAccessor.java | 128 ------------------ 2 files changed, 1 insertion(+), 129 deletions(-) diff --git a/plugin/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java index 2175de17..5ab6999f 100644 --- a/plugin/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -188,7 +188,7 @@ private void setCommandExecutor(@NotNull CommandExecutor executor, String @NotNu private void sendVersionError(@NotNull Consumer messageMethod) { if (!accessor.isSupported()) { messageMethod.accept("Your server version (" + accessor.getVersion() + ") is not supported."); - messageMethod.accept("Please download the correct version of OpenInv here: " + accessor.getReleasesLink()); + messageMethod.accept("Please check https://github.com/Jikoo/OpenInv/wiki/Supported-Versions to find a matching OI version."); } if (!isSpigot) { messageMethod.accept("OpenInv requires that you use Spigot or a Spigot fork. Per the 1.14 update thread"); diff --git a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java index 5ddea41b..7a6bcf15 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -98,134 +98,6 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { return new com.lishid.openinv.internal.paper1_21_10.InternalAccessor(logger, lang); } - public String getReleasesLink() { - if (PAPER) { - // Paper 1.21.1+ - return getPaperReleaseLink(); - } - // Spigot 1.21.1+ - return getSpigotReleaseLink(); - } - - private String getPaperReleaseLink() { - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 9))) { - return "https://github.com/Jikoo/OpenInv/releases"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 6))) { - return "https://github.com/Jikoo/OpenInv/releases/tag/5.3.2"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 1))) { - return "https://github.com/Jikoo/OpenInv/releases/tag/5.3.0"; - } - return getLegacyReleaseLink(); - } - - private String getSpigotReleaseLink() { - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1))) { - return "https://github.com/Jikoo/OpenInv/releases"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 11))) { // 1.21.11 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.3.0"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 10))) { // 1.21.10 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.15"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 9))) { // 1.21.9 - return "Unsupported; upgrade to 1.21.10: https://github.com/Jikoo/OpenInv/releases/tag/5.1.15"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 8))) { // 1.21.8, 1.21.7 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.13"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 6))) { // 1.21.6 - return "Unsupported; upgrade to 1.21.7: https://github.com/Jikoo/OpenInv/releases/tag/5.1.13"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 5))) { // 1.21.5 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.11"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 4))) { // 1.21.4 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.9"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 3))) { // 1.21.3 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.6"; - } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 1))) { // 1.21.1, 1.21.2 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.3"; - } - // 1.21.0 and lower - return getLegacyReleaseLink(); - } - - private String getLegacyReleaseLink() { - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 4, 4))) { // Good luck. - return "https://dev.bukkit.org/projects/openinv/files?&sort=datecreated"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 8, 8))) { // 1.8.8 - return "https://github.com/lishid/OpenInv/releases/tag/4.1.5"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 13))) { // 1.4.4+ had versioned packages. - return "https://github.com/lishid/OpenInv/releases/tag/4.0.0 (OpenInv-legacy)"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 13))) { // 1.13 - return "https://github.com/lishid/OpenInv/releases/tag/4.0.0"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 14))) { // 1.13.1, 1.13.2 - return "https://github.com/lishid/OpenInv/releases/tag/4.0.7"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 14))) { // 1.14 to 1.14.1 had no revision bump. - return "https://github.com/lishid/OpenInv/releases/tag/4.0.0"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 14, 1))) { // 1.14.1 to 1.14.2 had no revision bump. - return "https://github.com/lishid/OpenInv/releases/tag/4.0.1"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 15))) { // 1.14.2 - return "https://github.com/lishid/OpenInv/releases/tag/4.1.1"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 15, 1))) { // 1.15, 1.15.1 - return "https://github.com/lishid/OpenInv/releases/tag/4.1.5"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 16))) { // 1.15.2 - return "https://github.com/Jikoo/OpenInv/commit/502f661be39ee85d300851dd571f3da226f12345 (never released)"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 16, 1))) { // 1.16, 1.16.1 - return "https://github.com/lishid/OpenInv/releases/tag/4.1.4"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 16, 3))) { // 1.16.2, 1.16.3 - return "https://github.com/lishid/OpenInv/releases/tag/4.1.5"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 17))) { // 1.16.4, 1.16.5 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.1.8"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 18, 1))) { // 1.17, 1.18, 1.18.1 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.1.10"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 19))) { // 1.18.2 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.3.0"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 19))) { // 1.19 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.2.0"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 19, 1))) { // 1.19.1 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.2.2"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 19, 3))) { // 1.19.2, 1.19.3 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.3.0"; - } - if (BukkitVersions.MINECRAFT.lessThan(Version.of(1, 20))) { // 1.19.4 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.4.3"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 20, 1))) { // 1.20, 1.20.1 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.4.1"; - } - if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 20, 3))) { // 1.20.2, 1.20.3 - return "https://github.com/Jikoo/OpenInv/releases/tag/4.4.3"; - } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 20, 5))) { // 1.20.5 - return "Unsupported; upgrade to 1.20.6: https://github.com/Jikoo/OpenInv/releases/tag/5.1.2"; - } - // 1.20.4, 1.20.6, 1.21 - return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.2"; - } - /** * Reload internal features. */