From 42e82bb2c025c66cb9c41286ee55ee019eab5c77 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 19 Sep 2026 12:24:47 -0400 Subject: [PATCH 01/10] Initial update to 26.3 Still need to make a couple shared interfaces to improve quality, but this should be functional at least --- internal/paper1_21_10/build.gradle.kts | 28 --------- .../paper1_21_10/InternalAccessor.java | 31 ---------- .../paper1_21_10/container/OpenInventory.java | 59 ------------------- .../paper1_21_10/player/OpenPlayer.java | 35 ----------- .../paper1_21_10/player/PlayerManager.java | 26 -------- .../container/OpenEnderChest.java | 4 +- .../paper1_21_11/container/OpenInventory.java | 4 +- .../container/menu/OpenEnderChestMenu.java | 4 +- .../container/menu/OpenInventoryMenu.java | 4 +- internal/paper26_1/build.gradle.kts | 4 +- .../internal/paper26_1/InternalAccessor.java | 4 +- .../container/AnySilentContainer.java | 2 +- .../paper26_1/container/OpenEnderChest.java | 2 +- .../slot/placeholder/PlaceholderLoader.java | 2 +- .../paper26_1/player/PlayerManager.java | 2 +- .../{paper26_2 => paper26_3}/build.gradle.kts | 2 +- .../internal/paper26_3}/InternalAccessor.java | 12 ++-- .../container/AnySilentContainer.java | 6 +- .../container/BaseOpenInventory.java | 32 +++++----- .../paper26_3}/container/OpenEnderChest.java | 8 +-- .../paper26_3}/container/OpenInventory.java | 4 +- .../container/bukkit/OpenDummyInventory.java | 2 +- .../bukkit/OpenDummyPlayerInventory.java | 2 +- .../container/bukkit/OpenPlayerInventory.java | 40 +++++-------- .../bukkit/OpenPlayerInventorySelf.java | 4 +- .../container/menu/BaseOpenInventoryMenu.java | 41 ++++++++++--- .../container/menu/OpenChestMenu.java | 6 +- .../container/menu/OpenEnderChestMenu.java | 4 +- .../container/menu/OpenInventoryMenu.java | 4 +- .../container/menu/OpenSyncMenu.java | 4 +- .../paper26_3}/container/slot/Content.java | 2 +- .../container/slot/ContentCrafting.java | 8 +-- .../container/slot/ContentCraftingResult.java | 4 +- .../container/slot/ContentCursor.java | 8 +-- .../container/slot/ContentDrop.java | 39 ++++++++++-- .../container/slot/ContentEquipment.java | 4 +- .../container/slot/ContentList.java | 2 +- .../container/slot/ContentOffHand.java | 4 +- .../container/slot/ContentViewOnly.java | 4 +- .../container/slot/SlotPlaceholder.java | 2 +- .../container/slot/SlotViewOnly.java | 4 +- .../slot/placeholder/PlaceholderLoader.java | 2 +- .../slot/placeholder/Placeholders.java | 4 +- .../paper26_3}/player/OpenPlayer.java | 2 +- .../paper26_3}/player/PlayerManager.java | 8 +-- internal/spigot26_1/build.gradle.kts | 2 +- .../internal/spigot26_1/InternalAccessor.java | 2 +- .../slot/placeholder/PlaceholderLoader.java | 2 +- .../spigot26_1/player/PlayerManager.java | 2 +- .../build.gradle.kts | 2 +- .../spigot26_3}/InternalAccessor.java | 12 ++-- .../container/AnySilentContainer.java | 6 +- .../spigot26_3}/container/OpenEnderChest.java | 8 +-- .../spigot26_3}/container/OpenInventory.java | 34 +++++------ .../container/bukkit/OpenDummyInventory.java | 2 +- .../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_3}/container/slot/Content.java | 2 +- .../container/slot/ContentCrafting.java | 8 +-- .../container/slot/ContentCraftingResult.java | 4 +- .../container/slot/ContentCursor.java | 8 +-- .../container/slot/ContentDrop.java | 39 ++++++++++-- .../container/slot/ContentEquipment.java | 4 +- .../container/slot/ContentList.java | 2 +- .../container/slot/ContentOffHand.java | 4 +- .../container/slot/ContentViewOnly.java | 4 +- .../container/slot/SlotPlaceholder.java | 2 +- .../container/slot/SlotViewOnly.java | 4 +- .../slot/placeholder/PlaceholderLoader.java | 2 +- .../placeholder/PlaceholderLoaderBase.java | 2 +- .../slot/placeholder/Placeholders.java | 4 +- .../spigot26_3}/player/OpenPlayer.java | 2 +- .../spigot26_3}/player/PlayerManager.java | 8 +-- plugin/build.gradle.kts | 7 +-- .../lishid/openinv/util/InternalAccessor.java | 35 +++++------ .../openinv-legibility-pack/pack.mcmeta | 8 +-- settings.gradle.kts | 5 +- 82 files changed, 315 insertions(+), 428 deletions(-) delete mode 100644 internal/paper1_21_10/build.gradle.kts delete mode 100644 internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/InternalAccessor.java delete mode 100644 internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java delete mode 100644 internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java delete mode 100644 internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/PlayerManager.java rename internal/{paper26_2 => paper26_3}/build.gradle.kts (97%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/InternalAccessor.java (88%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/AnySilentContainer.java (98%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/BaseOpenInventory.java (90%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/OpenEnderChest.java (95%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/OpenInventory.java (94%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/bukkit/OpenDummyInventory.java (98%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/bukkit/OpenDummyPlayerInventory.java (97%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/bukkit/OpenPlayerInventory.java (77%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/bukkit/OpenPlayerInventorySelf.java (80%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/menu/BaseOpenInventoryMenu.java (85%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/menu/OpenChestMenu.java (97%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/menu/OpenEnderChestMenu.java (93%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/menu/OpenInventoryMenu.java (85%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/menu/OpenSyncMenu.java (97%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/Content.java (96%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentCrafting.java (93%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentCraftingResult.java (91%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentCursor.java (92%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentDrop.java (58%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentEquipment.java (95%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentList.java (95%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentOffHand.java (92%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/ContentViewOnly.java (90%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/SlotPlaceholder.java (89%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/SlotViewOnly.java (96%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/placeholder/PlaceholderLoader.java (99%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/container/slot/placeholder/Placeholders.java (92%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/player/OpenPlayer.java (99%) rename internal/{paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2 => paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3}/player/PlayerManager.java (97%) rename internal/{spigot26_2 => spigot26_3}/build.gradle.kts (96%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/InternalAccessor.java (86%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/AnySilentContainer.java (97%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/OpenEnderChest.java (95%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/OpenInventory.java (92%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/bukkit/OpenDummyInventory.java (98%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/bukkit/OpenDummyPlayerInventory.java (97%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/bukkit/OpenPlayerInventory.java (97%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/bukkit/OpenPlayerInventorySelf.java (80%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/menu/OpenChestMenu.java (97%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/menu/OpenEnderChestMenu.java (91%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/menu/OpenInventoryMenu.java (95%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/menu/OpenSyncMenu.java (98%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/Content.java (96%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentCrafting.java (93%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentCraftingResult.java (91%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentCursor.java (92%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentDrop.java (58%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentEquipment.java (96%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentList.java (95%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentOffHand.java (92%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/ContentViewOnly.java (90%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/SlotPlaceholder.java (89%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/SlotViewOnly.java (96%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/placeholder/PlaceholderLoader.java (86%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/placeholder/PlaceholderLoaderBase.java (99%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/container/slot/placeholder/Placeholders.java (91%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/player/OpenPlayer.java (99%) rename internal/{spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2 => spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3}/player/PlayerManager.java (97%) diff --git a/internal/paper1_21_10/build.gradle.kts b/internal/paper1_21_10/build.gradle.kts deleted file mode 100644 index f47ab4f3..00000000 --- a/internal/paper1_21_10/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.10-R0.1-SNAPSHOT") -} diff --git a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/InternalAccessor.java b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/InternalAccessor.java deleted file mode 100644 index 778d318b..00000000 --- a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/InternalAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_10; - -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.paper1_21_10.container.OpenInventory; -import com.lishid.openinv.internal.paper1_21_10.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_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 deleted file mode 100644 index 0b2dbe2d..00000000 --- a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java +++ /dev/null @@ -1,59 +0,0 @@ -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_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; -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(new FontDescription.Resource(ResourceLocation.parse("openinv:font/inventory"))) - .withColor(ChatFormatting.WHITE))); - } else { - component.append( - Component.translatableWithFallback("openinv.container.inventory.other", "") - .withStyle(style -> style - .withFont(new FontDescription.Resource(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_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 deleted file mode 100644 index d54c25d4..00000000 --- a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_10.player; - -import com.lishid.openinv.internal.paper26_1.player.PlayerManager; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerPlayer; -import org.bukkit.craftbukkit.CraftServer; -import org.jetbrains.annotations.NotNull; - -import java.nio.file.Path; - -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 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) { - tag.remove(key); - } - -} diff --git a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/PlayerManager.java b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/PlayerManager.java deleted file mode 100644 index 507d80fc..00000000 --- a/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/PlayerManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.lishid.openinv.internal.paper1_21_10.player; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -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 void injectPlayer(@NotNull MinecraftServer server, @NotNull ServerPlayer player) throws IllegalAccessException { - if (bukkitEntity == null) { - return; - } - - bukkitEntity.setAccessible(true); - - bukkitEntity.set(player, new OpenPlayer(server.server, player, this)); - } - -} 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 d3b18469..13178297 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_2.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_3.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_2.container.OpenEnderChest { +public class OpenEnderChest extends com.lishid.openinv.internal.paper26_3.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 93541b96..01289f11 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_2.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_3.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_2.container.OpenInventory { +public class OpenInventory extends com.lishid.openinv.internal.paper26_3.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 e1414092..38b4400e 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_2.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_2.container.menu.OpenSyncMenu; +import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_3.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 d68d613b..da824415 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_2.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_2.container.menu.BaseOpenInventoryMenu; +import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_3.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/paper26_1/build.gradle.kts b/internal/paper26_1/build.gradle.kts index 1def98e7..5a0928b9 100644 --- a/internal/paper26_1/build.gradle.kts +++ b/internal/paper26_1/build.gradle.kts @@ -57,11 +57,11 @@ dependencies { implementation(project(":openinvcommon")) { exclude(group = "org.spigotmc", module = "spigot-api") } - api(project(":openinvadapterpaper26_2")) { + api(project(":openinvadapterpaper26_3")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } - paperweight.paperDevBundle("26.1.2.build.5-alpha") + paperweight.paperDevBundle("26.1.2.build.+") } tasks.reobfJar { 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 4e231cfb..dac1109d 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 @@ -4,14 +4,14 @@ 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.player.PlayerManager; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader; 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.paper26_2.InternalAccessor { +public class InternalAccessor extends com.lishid.openinv.internal.paper26_3.InternalAccessor { public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { super(logger, lang); 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 091623c8..824322ee 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 @@ -6,7 +6,7 @@ import java.util.logging.Logger; -public class AnySilentContainer extends com.lishid.openinv.internal.paper26_2.container.AnySilentContainer { +public class AnySilentContainer extends com.lishid.openinv.internal.paper26_3.container.AnySilentContainer { public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { super(logger, lang); 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 f0239a9f..4e78e73d 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 @@ -5,7 +5,7 @@ import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class OpenEnderChest extends com.lishid.openinv.internal.paper26_2.container.OpenEnderChest { +public class OpenEnderChest extends com.lishid.openinv.internal.paper26_3.container.OpenEnderChest { public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { super(player); 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 8550c544..cf43fa71 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 @@ -4,7 +4,7 @@ import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; -public class PlaceholderLoader extends com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader { +public class PlaceholderLoader extends com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader { @Override protected @NotNull Item getDefaultCursorItem() { 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 1fab82f0..80d3d980 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 @@ -9,7 +9,7 @@ import java.util.logging.Logger; @NullMarked -public class PlayerManager extends com.lishid.openinv.internal.paper26_2.player.PlayerManager { +public class PlayerManager extends com.lishid.openinv.internal.paper26_3.player.PlayerManager { public PlayerManager(Logger logger) { super(logger); diff --git a/internal/paper26_2/build.gradle.kts b/internal/paper26_3/build.gradle.kts similarity index 97% rename from internal/paper26_2/build.gradle.kts rename to internal/paper26_3/build.gradle.kts index 605d6eda..152d5b5b 100644 --- a/internal/paper26_2/build.gradle.kts +++ b/internal/paper26_3/build.gradle.kts @@ -58,7 +58,7 @@ dependencies { exclude(group = "org.spigotmc", module = "spigot-api") } - paperweight.paperDevBundle("26.2.build.31-alpha") + paperweight.paperDevBundle("26.3.build.+") } tasks.reobfJar { diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java similarity index 88% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java index 9edf046d..7d06ab0d 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java @@ -1,15 +1,15 @@ -package com.lishid.openinv.internal.paper26_2; +package com.lishid.openinv.internal.paper26_3; 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.player.PlayerManager; +import com.lishid.openinv.internal.paper26_3.container.AnySilentContainer; +import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_3.container.OpenInventory; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader; +import com.lishid.openinv.internal.paper26_3.player.PlayerManager; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.world.Container; import org.bukkit.configuration.ConfigurationSection; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java similarity index 98% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java index 417058cc..a0833a26 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java @@ -14,11 +14,11 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal.paper26_2.container; +package com.lishid.openinv.internal.paper26_3.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.internal.paper26_3.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_3.player.PlayerManager; import com.lishid.openinv.util.ReflectionHelper; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.core.BlockPos; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/BaseOpenInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java similarity index 90% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/BaseOpenInventory.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java index 160ca643..4ca64c22 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/BaseOpenInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java @@ -1,22 +1,22 @@ -package com.lishid.openinv.internal.paper26_2.container; +package com.lishid.openinv.internal.paper26_3.container; import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.InternalOwned; -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 com.lishid.openinv.internal.paper26_3.container.bukkit.OpenPlayerInventory; +import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_3.container.menu.OpenInventoryMenu; +import com.lishid.openinv.internal.paper26_3.container.slot.Content; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentCrafting; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentCraftingResult; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentCursor; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentDrop; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentEquipment; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentList; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentOffHand; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentViewOnly; +import com.lishid.openinv.internal.paper26_3.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.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_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java similarity index 95% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenEnderChest.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java index e3fe13a5..abf50a90 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenEnderChest.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java @@ -1,10 +1,10 @@ -package com.lishid.openinv.internal.paper26_2.container; +package com.lishid.openinv.internal.paper26_3.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 com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_3.container.menu.OpenEnderChestMenu; +import com.lishid.openinv.internal.paper26_3.player.PlayerManager; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java similarity index 94% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenInventory.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java index 455ba428..d0b66209 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/OpenInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container; +package com.lishid.openinv.internal.paper26_3.container; -import com.lishid.openinv.internal.paper26_2.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FontDescription; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java similarity index 98% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyInventory.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java index 256271cd..d71a371a 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.bukkit; +package com.lishid.openinv.internal.paper26_3.container.bukkit; import com.lishid.openinv.internal.ViewOnly; import net.minecraft.world.Container; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyPlayerInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java similarity index 97% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyPlayerInventory.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java index 57d85ef4..9b2449ec 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.bukkit; +package com.lishid.openinv.internal.paper26_3.container.bukkit; import net.minecraft.world.Container; import org.bukkit.Material; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java similarity index 77% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventory.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java index 6bc3e0ea..98779237 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_2.container.bukkit; +package com.lishid.openinv.internal.paper26_3.container.bukkit; import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; @@ -104,74 +104,62 @@ public void setExtraContents(ItemStack @NotNull [] items) { @Override public @NotNull ItemStack getHelmet() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().equipment - .get(EquipmentSlot.HEAD)); + return getInventory().getOwner().getInventory().getHelmet(); } @Override public void setHelmet(@Nullable ItemStack helmet) { - getInventory().getOwnerHandle().getInventory().equipment - .set(EquipmentSlot.HEAD, CraftItemStack.asNMSCopy(helmet)); + getInventory().getOwner().getInventory().setHelmet(helmet); } @Override public @NotNull ItemStack getChestplate() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().equipment - .get(EquipmentSlot.CHEST)); + return getInventory().getOwner().getInventory().getChestplate(); } @Override public void setChestplate(@Nullable ItemStack chestplate) { - getInventory().getOwnerHandle().getInventory().equipment - .set(EquipmentSlot.CHEST, CraftItemStack.asNMSCopy(chestplate)); + getInventory().getOwner().getInventory().setChestplate(chestplate); } @Override public @NotNull ItemStack getLeggings() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().equipment - .get(EquipmentSlot.LEGS)); + return getInventory().getOwner().getInventory().getLeggings(); } @Override public void setLeggings(@Nullable ItemStack leggings) { - getInventory().getOwnerHandle().getInventory().equipment - .set(EquipmentSlot.LEGS, CraftItemStack.asNMSCopy(leggings)); + getInventory().getOwner().getInventory().setLeggings(leggings); } @Override public @NotNull ItemStack getBoots() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().equipment - .get(EquipmentSlot.FEET)); + return getInventory().getOwner().getInventory().getBoots(); } @Override public void setBoots(@Nullable ItemStack boots) { - getInventory().getOwnerHandle().getInventory().equipment - .set(EquipmentSlot.FEET, CraftItemStack.asNMSCopy(boots)); + getInventory().getOwner().getInventory().setBoots(boots); } @Override public @NotNull ItemStack getItemInMainHand() { - Inventory internal = getInventory().getOwnerHandle().getInventory(); - return CraftItemStack.asCraftMirror(internal.getSelectedItem()); + return getInventory().getOwner().getInventory().getItemInMainHand(); } @Override public void setItemInMainHand(@Nullable ItemStack item) { - Inventory internal = getInventory().getOwnerHandle().getInventory(); - internal.setSelectedItem(CraftItemStack.asNMSCopy(item)); + getInventory().getOwner().getInventory().setItemInMainHand(item); } @Override public @NotNull ItemStack getItemInOffHand() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().equipment - .get(EquipmentSlot.OFFHAND)); + return getInventory().getOwner().getInventory().getItemInOffHand(); } @Override public void setItemInOffHand(@Nullable ItemStack item) { - getInventory().getOwnerHandle().getInventory().equipment - .set(EquipmentSlot.OFFHAND, CraftItemStack.asNMSCopy(item)); + getInventory().getOwner().getInventory().setItemInOffHand(item); } @SuppressWarnings("InlineMeSuggester") diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java similarity index 80% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java index 39f0faae..77539d4e 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.bukkit; +package com.lishid.openinv.internal.paper26_3.container.bukkit; -import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/BaseOpenInventoryMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java similarity index 85% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/BaseOpenInventoryMenu.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java index 2985da13..66bbaa4e 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/BaseOpenInventoryMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java @@ -1,12 +1,12 @@ -package com.lishid.openinv.internal.paper26_2.container.menu; +package com.lishid.openinv.internal.paper26_3.container.menu; import com.google.common.base.Preconditions; -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.internal.paper26_3.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenDummyPlayerInventory; +import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenPlayerInventorySelf; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentDrop; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentEquipment; +import com.lishid.openinv.internal.paper26_3.container.slot.SlotViewOnly; import com.lishid.openinv.util.Permissions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; @@ -23,9 +23,34 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.function.Function; + @NullMarked public class BaseOpenInventoryMenu extends OpenSyncMenu { + private static final Function MIRROR; + + static { + Function mirror; + try { + Method craftMirror = CraftItemStack.class.getDeclaredMethod("asCraftMirror", ItemStack.class); + mirror = nms -> { + try { + Object bukkit = craftMirror.invoke(null, nms); + return (org.bukkit.inventory.ItemStack) bukkit; + } catch (InvocationTargetException | IllegalAccessException | ClassCastException e) { + // TODO replace with some kind of composition factory thing + throw new RuntimeException(e); + } + }; + } catch (NoSuchMethodException e) { + mirror = CraftItemStack::asBukkitMirror; + } + MIRROR = mirror; + } + private int offset; public BaseOpenInventoryMenu(BaseOpenInventory inventory, ServerPlayer viewer, int i, boolean viewOnly) { @@ -118,7 +143,7 @@ protected CraftInventoryView, Inventory> create } Slot slot = slots.get(index); - return CraftItemStack.asCraftMirror(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); + return MIRROR.apply(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); } @Override diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenChestMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java similarity index 97% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenChestMenu.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java index 137eb264..d18c6bc7 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenChestMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.paper26_2.container.menu; +package com.lishid.openinv.internal.paper26_3.container.menu; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.paper26_2.container.bukkit.OpenDummyInventory; -import com.lishid.openinv.internal.paper26_2.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenDummyInventory; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenEnderChestMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java similarity index 93% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenEnderChestMenu.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java index 9bcc3bf1..ab68d260 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenEnderChestMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.menu; +package com.lishid.openinv.internal.paper26_3.container.menu; -import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java similarity index 85% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java index 7a45a357..c246ffc8 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.menu; +package com.lishid.openinv.internal.paper26_3.container.menu; -import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenSyncMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java similarity index 97% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenSyncMenu.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java index 41f533da..a927c81b 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenSyncMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.paper26_2.container.menu; +package com.lishid.openinv.internal.paper26_3.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_2.container.slot.SlotPlaceholder; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java similarity index 96% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java index eee19f3e..c4ba77ac 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCrafting.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java similarity index 93% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCrafting.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java index 85c8b6de..dded2653 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCrafting.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; @@ -82,7 +82,7 @@ public void set(ItemStack itemStack) { items.set(index, itemStack); holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); } else { - holder.drop(itemStack, false); + ContentDrop.DROP.accept(this.holder, itemStack); } } diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCraftingResult.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java similarity index 91% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCraftingResult.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java index 9189d518..8c9d0e38 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCraftingResult.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCursor.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java similarity index 92% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCursor.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java index 51d4c3c6..39d1cf55 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentCursor.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java @@ -1,7 +1,7 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; @@ -56,7 +56,7 @@ public void set(ItemStack itemStack) { if (isAvailable()) { holder.containerMenu.setCarried(itemStack); } else { - holder.drop(itemStack, false); + ContentDrop.DROP.accept(this.holder, itemStack); } } diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentDrop.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java similarity index 58% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentDrop.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java index 4ebb2ce8..8889e771 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentDrop.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java @@ -1,19 +1,50 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.function.BiConsumer; + /** * A fake slot used to drop items. Unavailable offline. */ public class ContentDrop implements Content { + static final BiConsumer DROP; + + // TODO Content factory + static { + BiConsumer dropMethod = null; + try { + Class.forName("net.minecraft.util.Prediction"); + dropMethod = (holder, itemStack) -> holder.drop(itemStack, false, Prediction.SERVER_ONLY); + } catch (ClassNotFoundException e) { + try { + Method method = ServerPlayer.class.getMethod("drop", ItemStack.class, boolean.class); + dropMethod = (holder, itemStack) -> { + try { + method.invoke(holder, itemStack, false); + } catch (IllegalAccessException | InvocationTargetException ex) { + // Shouldn't be possible. Eat the item until I write a slot factory. + } + }; + } catch (NoSuchMethodException ex) { + // As above, eat for now. + dropMethod = (holder, itemStack) -> {}; + } + } + DROP = dropMethod; + } + private ServerPlayer holder; public ContentDrop(@NotNull ServerPlayer holder) { @@ -42,7 +73,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - holder.drop(itemStack, true); + DROP.accept(this.holder, itemStack); } @Override diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentEquipment.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java similarity index 95% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentEquipment.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java index b6840838..9bc6ff29 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentEquipment.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentList.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java similarity index 95% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentList.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java index 9c202e45..b364602e 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentList.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentOffHand.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java similarity index 92% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentOffHand.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java index 0f1fe12c..0719a148 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentOffHand.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentViewOnly.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java similarity index 90% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentViewOnly.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java index aa932999..e2063843 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/ContentViewOnly.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -40,7 +40,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - this.holder.drop(itemStack, false); + ContentDrop.DROP.accept(this.holder, itemStack); } @Override diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotPlaceholder.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java similarity index 89% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotPlaceholder.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java index 7844a813..bd001b0e 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotPlaceholder.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java similarity index 96% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java index 817ce5fd..204bec86 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +package com.lishid.openinv.internal.paper26_3.container.slot; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java similarity index 99% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java index b864a7c7..33c429ab 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; +package com.lishid.openinv.internal.paper26_3.container.slot.placeholder; import com.mojang.serialization.DataResult; import net.minecraft.core.Registry; diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java similarity index 92% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java index 6f31d5bb..23c2fbb2 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; +package com.lishid.openinv.internal.paper26_3.container.slot.placeholder; -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; +import com.lishid.openinv.internal.paper26_3.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_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java similarity index 99% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java index 160351c6..b7be7be0 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/OpenPlayer.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.paper26_2.player; +package com.lishid.openinv.internal.paper26_3.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_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java similarity index 97% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java rename to internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java index 935264d6..8d61cc64 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/player/PlayerManager.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.paper26_2.player; +package com.lishid.openinv.internal.paper26_3.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.internal.paper26_3.container.BaseOpenInventory; +import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; +import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import com.lishid.openinv.util.JulLoggerAdapter; import com.mojang.authlib.GameProfile; import com.mojang.logging.LogUtils; diff --git a/internal/spigot26_1/build.gradle.kts b/internal/spigot26_1/build.gradle.kts index e6d39f0e..34ab1452 100644 --- a/internal/spigot26_1/build.gradle.kts +++ b/internal/spigot26_1/build.gradle.kts @@ -30,7 +30,7 @@ dependencies { compileOnly(project(":openinvapi")) compileOnly(project(":openinvcommon")) - compileOnly(project(":openinvadapterspigot26_2")) { + compileOnly(project(":openinvadapterspigot26_3")) { 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 index fa6e2331..9511a48f 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 @@ -10,7 +10,7 @@ import java.util.logging.Logger; @NullMarked -public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_2.InternalAccessor { +public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_3.InternalAccessor { private final PlayerManager manager; 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 index dddefdb5..71fd92de 100644 --- 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 @@ -1,6 +1,6 @@ package com.github.jikoo.openinv.internal.spigot26_1.container.slot.placeholder; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.PlaceholderLoaderBase; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.PlaceholderLoaderBase; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import org.jspecify.annotations.NullMarked; 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 index 4e071f80..d5d78c12 100644 --- 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 @@ -6,7 +6,7 @@ import java.util.logging.Logger; @NullMarked -public class PlayerManager extends com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager { +public class PlayerManager extends com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager { public PlayerManager(Logger logger) { super(logger); diff --git a/internal/spigot26_2/build.gradle.kts b/internal/spigot26_3/build.gradle.kts similarity index 96% rename from internal/spigot26_2/build.gradle.kts rename to internal/spigot26_3/build.gradle.kts index a9e1dc59..dd42042a 100644 --- a/internal/spigot26_2/build.gradle.kts +++ b/internal/spigot26_3/build.gradle.kts @@ -21,7 +21,7 @@ apply() dependencies { compileOnly(libs.spigotapi) - extensions.getByType(SpigotDependencyExtension::class.java).version = "26.2-R0.1-SNAPSHOT" + extensions.getByType(SpigotDependencyExtension::class.java).version = "26.3-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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java similarity index 86% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java index fcc121c7..2572f1dd 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java @@ -1,10 +1,10 @@ -package com.github.jikoo.openinv.internal.spigot26_2; +package com.github.jikoo.openinv.internal.spigot26_3; -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.github.jikoo.openinv.internal.spigot26_3.container.AnySilentContainer; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.PlaceholderLoader; +import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; import com.lishid.openinv.internal.Accessor; import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.ISpecialEnderChest; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/AnySilentContainer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java similarity index 97% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/AnySilentContainer.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java index a964e120..a33bdaa2 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/AnySilentContainer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java @@ -1,8 +1,8 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container; +package com.github.jikoo.openinv.internal.spigot26_3.container; import com.lishid.openinv.internal.AnySilentContainerBase; -import com.github.jikoo.openinv.internal.spigot26_2.container.menu.OpenChestMenu; -import com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager; +import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; import com.lishid.openinv.util.ReflectionHelper; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.core.BlockPos; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenEnderChest.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java similarity index 95% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenEnderChest.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java index 9942b2e6..7642f6bf 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenEnderChest.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java @@ -1,8 +1,8 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container; +package com.github.jikoo.openinv.internal.spigot26_3.container; -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.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenEnderChestMenu; +import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.InternalOwned; import net.minecraft.core.NonNullList; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java similarity index 92% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenInventory.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java index d2ba50f3..89670f6d 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/OpenInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java @@ -1,20 +1,20 @@ -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; +package com.github.jikoo.openinv.internal.spigot26_3.container; + +import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenPlayerInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenInventoryMenu; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.Content; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCrafting; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCraftingResult; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCursor; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentDrop; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentEquipment; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentList; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentOffHand; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentViewOnly; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotViewOnly; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java similarity index 98% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyInventory.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java index 99178f18..4ac34c9c 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; import com.lishid.openinv.internal.ViewOnly; import net.minecraft.world.Container; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyPlayerInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java similarity index 97% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyPlayerInventory.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java index 96f54208..89b70d9f 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; import net.minecraft.world.Container; import org.bukkit.Material; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java similarity index 97% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventory.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java index 32d68b51..daa78462 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; import com.google.common.base.Preconditions; -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Inventory; import org.bukkit.craftbukkit.inventory.CraftInventory; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java similarity index 80% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java index dc9d46cf..51e6ebef 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; +package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenChestMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java similarity index 97% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenChestMenu.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java index 7810cb07..695f57fd 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenChestMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.menu; +package com.github.jikoo.openinv.internal.spigot26_3.container.menu; -import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenDummyInventory; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.SlotViewOnly; +import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenDummyInventory; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenEnderChestMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java similarity index 91% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenEnderChestMenu.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java index 2e396b24..7028c37f 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenEnderChestMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.menu; +package com.github.jikoo.openinv.internal.spigot26_3.container.menu; -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenInventoryMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java similarity index 95% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenInventoryMenu.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java index 2989ff5f..f79b60e8 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenInventoryMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java @@ -1,13 +1,13 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.menu; +package com.github.jikoo.openinv.internal.spigot26_3.container.menu; import com.google.common.base.Preconditions; import com.lishid.openinv.util.Permissions; -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 com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenDummyPlayerInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenPlayerInventorySelf; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentDrop; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentEquipment; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenSyncMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java similarity index 98% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenSyncMenu.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java index 3f6911fc..3cc44fec 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/menu/OpenSyncMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java @@ -1,9 +1,9 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.menu; +package com.github.jikoo.openinv.internal.spigot26_3.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_2.container.slot.SlotPlaceholder; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java similarity index 96% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java index 041a0e10..210f0093 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCrafting.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java similarity index 93% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCrafting.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java index d07e1feb..e47e58ae 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCrafting.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; @@ -82,7 +82,7 @@ public void set(ItemStack itemStack) { items.set(index, itemStack); holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); } else { - holder.drop(itemStack, false); + ContentDrop.DROP.accept(this.holder, itemStack); } } diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCraftingResult.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java similarity index 91% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCraftingResult.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java index 1f96933f..7385e8a4 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCraftingResult.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCursor.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java similarity index 92% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCursor.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java index 7f612f94..f743c641 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentCursor.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java @@ -1,7 +1,7 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; @@ -56,7 +56,7 @@ public void set(ItemStack itemStack) { if (isAvailable()) { holder.containerMenu.setCarried(itemStack); } else { - holder.drop(itemStack, false); + ContentDrop.DROP.accept(this.holder, itemStack); } } diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentDrop.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java similarity index 58% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentDrop.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java index c5ce467d..be54b1f3 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentDrop.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java @@ -1,19 +1,50 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; -import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.function.BiConsumer; + /** * A fake slot used to drop items. Unavailable offline. */ public class ContentDrop implements Content { + static final BiConsumer DROP; + + // TODO Content factory + static { + BiConsumer dropMethod = null; + try { + Class.forName("net.minecraft.util.Prediction"); + dropMethod = (holder, itemStack) -> holder.drop(itemStack, false, Prediction.SERVER_ONLY); + } catch (ClassNotFoundException e) { + try { + Method method = ServerPlayer.class.getMethod("drop", ItemStack.class, boolean.class); + dropMethod = (holder, itemStack) -> { + try { + method.invoke(holder, itemStack, false); + } catch (IllegalAccessException | InvocationTargetException ex) { + // Shouldn't be possible. Eat the item until I write a slot factory. + } + }; + } catch (NoSuchMethodException ex) { + // As above, eat for now. + dropMethod = (holder, itemStack) -> {}; + } + } + DROP = dropMethod; + } + private ServerPlayer holder; public ContentDrop(@NotNull ServerPlayer holder) { @@ -42,7 +73,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - holder.drop(itemStack, true); + DROP.accept(this.holder, itemStack); } @Override diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentEquipment.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java similarity index 96% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentEquipment.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java index d50cb499..c3ef293b 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentEquipment.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.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/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentList.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java similarity index 95% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentList.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java index 7ba0e1b3..adf86220 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentList.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentOffHand.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java similarity index 92% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentOffHand.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java index dd4c0752..bd99fa47 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentOffHand.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentViewOnly.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java similarity index 90% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentViewOnly.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java index cb7946b7..aaa4874a 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/ContentViewOnly.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -40,7 +40,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - this.holder.drop(itemStack, false); + ContentDrop.DROP.accept(this.holder, itemStack); } @Override diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotPlaceholder.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java similarity index 89% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotPlaceholder.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java index fd0e0a65..9343670f 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotPlaceholder.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java similarity index 96% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java index bebef508..e66d81e0 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java similarity index 86% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java index b5268a0d..fbf5a03d 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoaderBase.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java similarity index 99% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoaderBase.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java index de37abb2..a52e66bf 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/PlaceholderLoaderBase.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder; import com.mojang.serialization.DataResult; import net.minecraft.core.Registry; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java similarity index 91% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java index 9364e6f0..b26005e8 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java @@ -1,6 +1,6 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; +package com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder; -import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; +import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java similarity index 99% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java index 6c74c76e..48b53e7d 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/OpenPlayer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java @@ -1,4 +1,4 @@ -package com.github.jikoo.openinv.internal.spigot26_2.player; +package com.github.jikoo.openinv.internal.spigot26_3.player; import com.lishid.openinv.event.OpenEvents; import com.mojang.logging.LogUtils; diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/PlayerManager.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java similarity index 97% rename from internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/PlayerManager.java rename to internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java index 1796b7f7..f39f1481 100644 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/player/PlayerManager.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java @@ -1,8 +1,8 @@ -package com.github.jikoo.openinv.internal.spigot26_2.player; +package com.github.jikoo.openinv.internal.spigot26_3.player; -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.github.jikoo.openinv.internal.spigot26_3.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.util.JulLoggerAdapter; import com.mojang.authlib.GameProfile; diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 5e577f84..c62ce0fe 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { compileOnly(libs.spigotapi) implementation(project(":openinvapi")) implementation(project(":openinvcommon")) - implementation(project(":openinvadapterpaper26_2")) { + implementation(project(":openinvadapterpaper26_3")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } implementation(project(":openinvadapterpaper26_1")) { @@ -25,10 +25,7 @@ dependencies { implementation(project(":openinvadapterpaper1_21_11")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } - implementation(project(":openinvadapterpaper1_21_10")) { - exclude(group = "io.papermc.paper", module = "dev-bundle") - } - implementation(project(":openinvadapterspigot26_2")) { + implementation(project(":openinvadapterspigot26_3")) { exclude(group = "org.spigotmc", module = "spigot") } implementation(project(":openinvadapterspigot26_1")) { 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 7a6bcf15..c3cc16af 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -64,38 +64,33 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } private @Nullable Accessor getAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + // Ensure version is in supported range. + if (BukkitVersions.MINECRAFT.greaterThan(Version.of(26, 3)) + || BukkitVersions.MINECRAFT.lessThan(Version.of(1, 21, 11))) { + return null; + } + + // Spigot adapters. 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, 2))) { // 26.2, 26.3 + return new com.github.jikoo.openinv.internal.spigot26_3.InternalAccessor(logger, lang); } - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1)) - && BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(26, 1, 2))) { - // Load Spigot accessor. + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1))) { // 26.1.1, 26.1.2 return new com.github.jikoo.openinv.internal.spigot26_1.InternalAccessor(logger, lang); } - return null; - } - - Version maxSupported = Version.of(26, 2); - Version minSupported = Version.of(1, 21, 9); - - // Ensure version is in supported range. - if (BukkitVersions.MINECRAFT.greaterThan(maxSupported) || BukkitVersions.MINECRAFT.lessThan(minSupported)) { + // Spigot min version is 26.1.1, differing from Paper for one more release. return null; } // 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, 2))) { // 26.2, 26.3 + return new com.lishid.openinv.internal.paper26_3.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); } - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 21, 11))) { // 1.21.11 - return new com.lishid.openinv.internal.paper1_21_11.InternalAccessor(logger, lang); - } - // 1.21.9, 1.21.10 - return new com.lishid.openinv.internal.paper1_21_10.InternalAccessor(logger, lang); + // 1.21.11 + return new com.lishid.openinv.internal.paper1_21_11.InternalAccessor(logger, lang); } /** diff --git a/resource-pack/openinv-legibility-pack/pack.mcmeta b/resource-pack/openinv-legibility-pack/pack.mcmeta index 3bd732cb..f9767194 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": [88, 0], + "max_format": [97, 1], "pack_format": 64, - "supported_formats": [ 34, 88 ] + "supported_formats": [ 34, 97 ] }, "overlays": { "entries": [ { "min_format": 44, - "max_format": [88, 0], - "formats": [ 44, 88 ], + "max_format": [97, 1], + "formats": [ 44, 97 ], "directory": "openinv_44" }, { diff --git a/settings.gradle.kts b/settings.gradle.kts index 7fe037b1..f58414c3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,11 +18,10 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { project(":openinvcommon").projectDir = file("common") val internals = listOf( - "paper26_2", + "paper26_3", "paper26_1", "paper1_21_11", - "paper1_21_10", - "spigot26_2", + "spigot26_3", "spigot26_1" ) for (internal in internals) { From 3d4aa00e37f22ace1ef5c6cddf519050856160f1 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 19 Sep 2026 18:21:08 -0400 Subject: [PATCH 02/10] Move to NullMarked --- .../java/com/lishid/openinv/IOpenInv.java | 35 +++++----- .../openinv/event/OpenPlayerSaveEvent.java | 9 +-- .../lishid/openinv/event/PlayerSaveEvent.java | 7 +- .../openinv/event/PlayerToggledEvent.java | 15 +++-- .../openinv/internal/IAnySilentContainer.java | 22 ++++--- .../openinv/internal/ISpecialEnderChest.java | 5 +- .../openinv/internal/ISpecialInventory.java | 11 ++-- .../internal/ISpecialPlayerInventory.java | 5 +- .../lishid/openinv/util/InventoryAccess.java | 20 +++--- .../com/lishid/openinv/util/Permissions.java | 5 +- .../openinv/util/setting/PlayerToggle.java | 11 ++-- .../openinv/util/setting/PlayerToggles.java | 31 ++++----- .../com/lishid/openinv/event/OpenEvents.java | 9 +-- .../com/lishid/openinv/internal/Accessor.java | 16 ++--- .../internal/AnySilentContainerBase.java | 13 ++-- .../openinv/internal/InternalOwned.java | 3 + .../openinv/internal/PlayerManager.java | 11 ++-- .../lishid/openinv/util/JulLoggerAdapter.java | 2 + .../lishid/openinv/util/ReflectionHelper.java | 4 +- .../openinv/util/lang/LanguageManager.java | 45 ++++++------- .../lishid/openinv/util/lang/Replacement.java | 5 +- .../paper1_21_11/InternalAccessor.java | 9 +-- .../internal/paper26_1/InternalAccessor.java | 17 ++--- .../container/AnySilentContainer.java | 7 +- .../paper26_1/container/OpenEnderChest.java | 7 +- .../slot/placeholder/PlaceholderLoader.java | 7 +- .../internal/paper26_3/InternalAccessor.java | 35 +++++----- .../container/AnySilentContainer.java | 25 +++---- .../container/BaseOpenInventory.java | 41 ++++++------ .../paper26_3/container/OpenEnderChest.java | 43 ++++++------ .../paper26_3/container/OpenInventory.java | 9 +-- .../container/bukkit/OpenDummyInventory.java | 43 ++++++------ .../bukkit/OpenDummyPlayerInventory.java | 48 +++++++------- .../container/bukkit/OpenPlayerInventory.java | 47 +++++++------- .../bukkit/OpenPlayerInventorySelf.java | 10 +-- .../paper26_3/container/slot/Content.java | 5 +- .../container/slot/ContentCrafting.java | 13 ++-- .../container/slot/ContentCraftingResult.java | 5 +- .../container/slot/ContentCursor.java | 13 ++-- .../paper26_3/container/slot/ContentDrop.java | 9 +-- .../container/slot/ContentEquipment.java | 10 +-- .../paper26_3/container/slot/ContentList.java | 13 +++- .../container/slot/ContentOffHand.java | 6 +- .../container/slot/ContentViewOnly.java | 9 +-- .../container/slot/SlotPlaceholder.java | 2 + .../container/slot/SlotViewOnly.java | 37 ++++++----- .../slot/placeholder/PlaceholderLoader.java | 33 +++++----- .../slot/placeholder/Placeholders.java | 29 +++++---- .../internal/paper26_3/player/OpenPlayer.java | 41 ++++++------ .../internal/spigot26_3/InternalAccessor.java | 23 +++---- .../container/AnySilentContainer.java | 25 +++---- .../spigot26_3/container/OpenEnderChest.java | 43 ++++++------ .../spigot26_3/container/OpenInventory.java | 45 ++++++------- .../container/bukkit/OpenDummyInventory.java | 43 ++++++------ .../bukkit/OpenDummyPlayerInventory.java | 23 +++---- .../container/bukkit/OpenPlayerInventory.java | 37 ++++++----- .../bukkit/OpenPlayerInventorySelf.java | 10 +-- .../container/menu/OpenChestMenu.java | 27 ++++---- .../container/menu/OpenEnderChestMenu.java | 9 +-- .../container/menu/OpenInventoryMenu.java | 17 ++--- .../container/menu/OpenSyncMenu.java | 29 +++++---- .../spigot26_3/container/slot/Content.java | 5 +- .../container/slot/ContentCrafting.java | 13 ++-- .../container/slot/ContentCraftingResult.java | 5 +- .../container/slot/ContentCursor.java | 13 ++-- .../container/slot/ContentDrop.java | 9 +-- .../container/slot/ContentEquipment.java | 7 +- .../container/slot/ContentList.java | 9 +++ .../container/slot/ContentOffHand.java | 6 +- .../container/slot/ContentViewOnly.java | 9 +-- .../container/slot/SlotPlaceholder.java | 2 + .../container/slot/SlotViewOnly.java | 37 ++++++----- .../slot/placeholder/PlaceholderLoader.java | 7 +- .../placeholder/PlaceholderLoaderBase.java | 33 +++++----- .../slot/placeholder/Placeholders.java | 29 +++++---- .../spigot26_3/player/OpenPlayer.java | 25 +++---- .../spigot26_3/player/PlayerManager.java | 29 +++++---- .../main/java/com/lishid/openinv/OpenInv.java | 54 +++++++-------- .../openinv/command/ClearInvCommand.java | 43 ++++++------ .../command/ContainerSettingCommand.java | 25 +++---- .../openinv/command/OpenInvCommand.java | 35 +++++----- .../openinv/command/PlayerLookupCommand.java | 65 ++++++++++--------- .../command/SearchContainerCommand.java | 23 +++---- .../openinv/command/SearchEnchantCommand.java | 27 ++++---- .../openinv/command/SearchInvCommand.java | 21 +++--- .../openinv/listener/ContainerListener.java | 20 +++--- .../openinv/listener/ToggleListener.java | 5 +- .../lishid/openinv/util/AccessEqualMode.java | 7 +- .../lishid/openinv/util/InternalAccessor.java | 17 ++--- .../lishid/openinv/util/InventoryManager.java | 47 +++++++------- .../com/lishid/openinv/util/PlayerLoader.java | 45 ++++++------- .../com/lishid/openinv/util/SearchHelper.java | 9 +-- .../com/lishid/openinv/util/TabCompleter.java | 27 ++++---- .../lishid/openinv/util/config/Config.java | 11 ++-- .../openinv/util/config/ConfigUpdater.java | 5 +- .../openinv/util/lang/LangMigrator.java | 15 ++--- .../util/profile/BatchProfileStore.java | 14 ++-- .../util/profile/OfflinePlayerImporter.java | 7 +- .../profile/OfflinePlayerProfileStore.java | 13 ++-- .../lishid/openinv/util/profile/Profile.java | 7 +- .../openinv/util/profile/ProfileStore.java | 11 ++-- .../profile/sqlite/SqliteProfileStore.java | 24 +++---- 102 files changed, 1065 insertions(+), 938 deletions(-) diff --git a/api/src/main/java/com/lishid/openinv/IOpenInv.java b/api/src/main/java/com/lishid/openinv/IOpenInv.java index 9634f7af..58cbce52 100644 --- a/api/src/main/java/com/lishid/openinv/IOpenInv.java +++ b/api/src/main/java/com/lishid/openinv/IOpenInv.java @@ -24,8 +24,8 @@ import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.UUID; import java.util.logging.Logger; @@ -33,6 +33,7 @@ /** * Interface defining behavior for the OpenInv plugin. */ +@NullMarked public interface IOpenInv { /** @@ -76,7 +77,7 @@ public interface IOpenInv { * @return the active implementation for the server version * @throws IllegalStateException if the server version is unsupported */ - @NotNull IAnySilentContainer getAnySilentContainer(); + IAnySilentContainer getAnySilentContainer(); /** * Get whether a user has AnyContainer mode enabled. @@ -84,7 +85,7 @@ public interface IOpenInv { * @param offline the user to obtain the state of * @return true if AnyContainer mode is enabled */ - boolean getAnyContainerStatus(@NotNull OfflinePlayer offline); + boolean getAnyContainerStatus(OfflinePlayer offline); /** * Set whether a user has AnyContainer mode enabled. @@ -92,7 +93,7 @@ public interface IOpenInv { * @param offline the user to set the state of * @param status the state of the mode */ - void setAnyContainerStatus(@NotNull OfflinePlayer offline, boolean status); + void setAnyContainerStatus(OfflinePlayer offline, boolean status); /** * Get whether a user has SilentContainer mode enabled. @@ -100,7 +101,7 @@ public interface IOpenInv { * @param offline the user to obtain the state of * @return true if SilentContainer mode is enabled */ - boolean getSilentContainerStatus(@NotNull OfflinePlayer offline); + boolean getSilentContainerStatus(OfflinePlayer offline); /** * Set whether a user has SilentContainer mode enabled. @@ -108,7 +109,7 @@ public interface IOpenInv { * @param offline the user to set the state of * @param status the state of the mode */ - void setSilentContainerStatus(@NotNull OfflinePlayer offline, boolean status); + void setSilentContainerStatus(OfflinePlayer offline, boolean status); /** * Get an {@link ISpecialEnderChest} for a user. @@ -119,8 +120,8 @@ public interface IOpenInv { * @throws IllegalStateException if the server version is unsupported * @throws InstantiationException if there was an issue creating the inventory */ - @NotNull ISpecialEnderChest getSpecialEnderChest( - @NotNull Player player, + ISpecialEnderChest getSpecialEnderChest( + Player player, boolean online ) throws InstantiationException; @@ -133,8 +134,8 @@ public interface IOpenInv { * @throws IllegalStateException if the server version is unsupported * @throws InstantiationException if there was an issue creating the inventory */ - @NotNull ISpecialPlayerInventory getSpecialInventory( - @NotNull Player player, + ISpecialPlayerInventory getSpecialInventory( + Player player, boolean online ) throws InstantiationException; @@ -142,7 +143,7 @@ public interface IOpenInv { * @deprecated Use {@link #openInventory(Player, ISpecialInventory, boolean)} */ @Deprecated(forRemoval = true, since = "5.2.0") - @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory); + @Nullable InventoryView openInventory(Player player, ISpecialInventory inventory); /** * Open an {@link ISpecialInventory} for a {@link Player}. @@ -152,7 +153,7 @@ public interface IOpenInv { * @param viewOnly whether the inventory should be view-only * @return the resulting {@link InventoryView} */ - @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory, boolean viewOnly); + @Nullable InventoryView openInventory(Player player, ISpecialInventory inventory, boolean viewOnly); /** * Check if a {@link Player} is currently loaded by OpenInv. @@ -161,7 +162,7 @@ public interface IOpenInv { * @return whether the {@code Player} is loaded * @since 4.2.0 */ - boolean isPlayerLoaded(@NotNull UUID playerUuid); + boolean isPlayerLoaded(UUID playerUuid); /** * Load a {@link Player} from an {@link OfflinePlayer}. If the user has not played before or the default world for @@ -171,7 +172,7 @@ public interface IOpenInv { * @return the loaded {@code Player} * @throws IllegalStateException if the server version is unsupported */ - @Nullable Player loadPlayer(@NotNull final OfflinePlayer offline); + @Nullable Player loadPlayer(final OfflinePlayer offline); /** * Match an existing {@link OfflinePlayer}. If the name is a {@link UUID#toString() UUID string}, this will only @@ -184,14 +185,14 @@ public interface IOpenInv { * @param name the string to match * @return the user with the closest matching name */ - @Nullable OfflinePlayer matchPlayer(@NotNull String name); + @Nullable OfflinePlayer matchPlayer(String name); /** * Forcibly close inventories of and unload any cached data for a user. * * @param offline the {@link OfflinePlayer} to unload */ - void unload(@NotNull OfflinePlayer offline); + void unload(OfflinePlayer offline); Logger getLogger(); diff --git a/api/src/main/java/com/lishid/openinv/event/OpenPlayerSaveEvent.java b/api/src/main/java/com/lishid/openinv/event/OpenPlayerSaveEvent.java index 7f0e16c6..869a9f99 100644 --- a/api/src/main/java/com/lishid/openinv/event/OpenPlayerSaveEvent.java +++ b/api/src/main/java/com/lishid/openinv/event/OpenPlayerSaveEvent.java @@ -5,11 +5,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * Event fired before OpenInv saves a player's data when closing an {@link ISpecialInventory}. */ +@NullMarked public class OpenPlayerSaveEvent extends PlayerSaveEvent { private static final HandlerList HANDLERS = new HandlerList(); @@ -26,10 +27,11 @@ public class OpenPlayerSaveEvent extends PlayerSaveEvent { */ @RestrictedApi( explanation = "Constructor is not considered part of the API and may be subject to change.", + link = "", allowedOnPath = ".*/com/lishid/openinv/event/OpenEvents.java" ) @ApiStatus.Internal - OpenPlayerSaveEvent(@NotNull Player player, @NotNull ISpecialInventory inventory) { + OpenPlayerSaveEvent(Player player, ISpecialInventory inventory) { super(player); this.inventory = inventory; } @@ -39,11 +41,10 @@ public class OpenPlayerSaveEvent extends PlayerSaveEvent { * * @return the special inventory */ - public @NotNull ISpecialInventory getInventory() { + public ISpecialInventory getInventory() { return inventory; } - @NotNull @Override public HandlerList getHandlers() { return HANDLERS; diff --git a/api/src/main/java/com/lishid/openinv/event/PlayerSaveEvent.java b/api/src/main/java/com/lishid/openinv/event/PlayerSaveEvent.java index 3fd98039..f22103b1 100644 --- a/api/src/main/java/com/lishid/openinv/event/PlayerSaveEvent.java +++ b/api/src/main/java/com/lishid/openinv/event/PlayerSaveEvent.java @@ -7,11 +7,12 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * Event fired before a {@link Player} loaded via OpenInv is saved. */ +@NullMarked public class PlayerSaveEvent extends PlayerEvent implements Cancellable { private static final HandlerList HANDLERS = new HandlerList(); @@ -27,10 +28,11 @@ public class PlayerSaveEvent extends PlayerEvent implements Cancellable { */ @RestrictedApi( explanation = "Constructor is not considered part of the API and may be subject to change.", + link = "", allowedOnPath = ".*/com/lishid/openinv/event/(OpenPlayerSaveEvent|OpenEvents).java" ) @ApiStatus.Internal - PlayerSaveEvent(@NotNull Player player) { + PlayerSaveEvent(Player player) { super(player); } @@ -54,7 +56,6 @@ public void setCancelled(boolean cancel) { this.cancelled = cancel; } - @NotNull @Override public HandlerList getHandlers() { return HANDLERS; diff --git a/api/src/main/java/com/lishid/openinv/event/PlayerToggledEvent.java b/api/src/main/java/com/lishid/openinv/event/PlayerToggledEvent.java index ed00a5ee..64e1a6fd 100644 --- a/api/src/main/java/com/lishid/openinv/event/PlayerToggledEvent.java +++ b/api/src/main/java/com/lishid/openinv/event/PlayerToggledEvent.java @@ -5,27 +5,29 @@ import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.UUID; /** * Event fired after OpenInv modifies a toggleable setting for a player. */ +@NullMarked public class PlayerToggledEvent extends Event { private static final HandlerList HANDLERS = new HandlerList(); - private final @NotNull PlayerToggle toggle; - private final @NotNull UUID uuid; + private final PlayerToggle toggle; + private final UUID uuid; private final boolean enabled; @RestrictedApi( explanation = "Constructor is not considered part of the API and may be subject to change.", + link = "", allowedOnPath = ".*/com/lishid/openinv/event/OpenEvents.java" ) @ApiStatus.Internal - PlayerToggledEvent(@NotNull PlayerToggle toggle, @NotNull UUID uuid, boolean enabled) { + PlayerToggledEvent(PlayerToggle toggle, UUID uuid, boolean enabled) { this.toggle = toggle; this.uuid = uuid; this.enabled = enabled; @@ -36,7 +38,7 @@ public class PlayerToggledEvent extends Event { * * @return the toggle */ - public @NotNull PlayerToggle getToggle() { + public PlayerToggle getToggle() { return toggle; } @@ -45,7 +47,7 @@ public class PlayerToggledEvent extends Event { * * @return the player ID */ - public @NotNull UUID getPlayerId() { + public UUID getPlayerId() { return uuid; } @@ -58,7 +60,6 @@ public boolean isEnabled() { return enabled; } - @NotNull @Override public HandlerList getHandlers() { return HANDLERS; diff --git a/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java b/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java index 46bbf9ea..17faf5a6 100644 --- a/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java +++ b/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java @@ -26,8 +26,10 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.util.BoundingBox; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public interface IAnySilentContainer { /** @@ -39,14 +41,14 @@ public interface IAnySilentContainer { * @param block the {@link Block} of the container * @return true if the container can be opened */ - boolean activateContainer(@NotNull Player player, boolean silent, @NotNull Block block); + boolean activateContainer(Player player, boolean silent, Block block); /** * Perform operations required to close the current container silently. * * @param player the {@link Player} closing a container */ - void deactivateContainer(@NotNull Player player); + void deactivateContainer(Player player); /** * Check if the container at the given coordinates is blocked. @@ -54,7 +56,7 @@ public interface IAnySilentContainer { * @param block the {@link Block} of the container * @return true if the container is blocked */ - boolean isAnyContainerNeeded(@NotNull Block block); + boolean isAnyContainerNeeded(Block block); /** * Check if a shulker box block cannot be opened under ordinary circumstances. @@ -62,7 +64,7 @@ public interface IAnySilentContainer { * @param shulkerBox the shulker box block * @return whether the container is blocked */ - default boolean isShulkerBlocked(@NotNull Block shulkerBox) { + default boolean isShulkerBlocked(Block shulkerBox) { Directional directional = (Directional) shulkerBox.getBlockData(); BlockFace facing = directional.getFacing(); // Construct a new 1-block bounding box at the origin. @@ -81,7 +83,7 @@ default boolean isShulkerBlocked(@NotNull Block shulkerBox) { * @param chest the chest block * @return whether the container is blocked */ - default boolean isChestBlocked(@NotNull Block chest) { + default boolean isChestBlocked(Block chest) { org.bukkit.block.Block relative = chest.getRelative(0, 1, 0); return relative.getType().isOccluding() || !chest.getWorld().getNearbyEntities(BoundingBox.of(relative), Cat.class::isInstance).isEmpty(); @@ -93,7 +95,7 @@ default boolean isChestBlocked(@NotNull Block chest) { * @param block the potential container * @return true if the type is a supported container */ - boolean isAnySilentContainer(@NotNull Block block); + boolean isAnySilentContainer(Block block); /** * Check if the given {@link BlockState} is a container which can be unblocked or silenced. @@ -101,7 +103,7 @@ default boolean isChestBlocked(@NotNull Block chest) { * @param blockState the potential container * @return true if the type is a supported container */ - default boolean isAnySilentContainer(@NotNull BlockState blockState) { + default boolean isAnySilentContainer(BlockState blockState) { return (blockState instanceof InventoryHolder holder && isAnySilentContainer(holder)) || blockState instanceof EnderChest; } @@ -112,7 +114,7 @@ default boolean isAnySilentContainer(@NotNull BlockState blockState) { * @param holder the potential container * @return true if the type is a supported container */ - default boolean isAnySilentContainer(@NotNull InventoryHolder holder) { + default boolean isAnySilentContainer(@Nullable InventoryHolder holder) { return holder instanceof org.bukkit.block.EnderChest || holder instanceof org.bukkit.block.Chest || holder instanceof org.bukkit.block.DoubleChest @@ -126,6 +128,6 @@ default boolean isAnySilentContainer(@NotNull InventoryHolder holder) { * @param inventory the potential container inventory * @return true if the type is a supported container */ - boolean isAnySilentContainer(@NotNull Inventory inventory); + boolean isAnySilentContainer(Inventory inventory); } diff --git a/api/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java b/api/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java index 4b35c4c8..33647241 100644 --- a/api/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java +++ b/api/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java @@ -17,15 +17,16 @@ package com.lishid.openinv.internal; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * An {@link ISpecialInventory} representing an ender chest. */ +@NullMarked public interface ISpecialEnderChest extends ISpecialInventory { @Override - default @NotNull InventoryType getBukkitType() { + default InventoryType getBukkitType() { return InventoryType.ENDER_CHEST; } diff --git a/api/src/main/java/com/lishid/openinv/internal/ISpecialInventory.java b/api/src/main/java/com/lishid/openinv/internal/ISpecialInventory.java index 2793526d..d8cf538b 100644 --- a/api/src/main/java/com/lishid/openinv/internal/ISpecialInventory.java +++ b/api/src/main/java/com/lishid/openinv/internal/ISpecialInventory.java @@ -20,11 +20,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * Interface defining behavior for special inventories backed by other inventories' content listings. */ +@NullMarked public interface ISpecialInventory { /** @@ -32,21 +33,21 @@ public interface ISpecialInventory { * * @return the Bukkit inventory */ - @NotNull Inventory getBukkitInventory(); + Inventory getBukkitInventory(); /** * Get the {@link InventoryType} corresponding to this {@code ISpecialInventory}. * * @return the type of Bukkit inventory */ - @NotNull InventoryType getBukkitType(); + InventoryType getBukkitType(); /** * Set the owning {@link Player} instance to a newly-joined user. * * @param player the user coming online */ - void setPlayerOnline(@NotNull Player player); + void setPlayerOnline(Player player); /** * Mark the owner of the inventory offline. @@ -70,6 +71,6 @@ default boolean isInUse() { * * @return the {@link HumanEntity} who owns the inventory */ - @NotNull HumanEntity getPlayer(); + HumanEntity getPlayer(); } diff --git a/api/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java b/api/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java index 91affaf8..47a5f091 100644 --- a/api/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java +++ b/api/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java @@ -17,15 +17,16 @@ package com.lishid.openinv.internal; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * An {@link ISpecialInventory} representing a player inventory. */ +@NullMarked public interface ISpecialPlayerInventory extends ISpecialInventory { @Override - default @NotNull InventoryType getBukkitType() { + default InventoryType getBukkitType() { return InventoryType.PLAYER; } diff --git a/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java b/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java index 6b3aa005..2729e82d 100644 --- a/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java +++ b/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java @@ -22,14 +22,15 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.function.BiFunction; +@NullMarked public final class InventoryAccess { - private static @Nullable BiFunction, ISpecialInventory> provider; + private static @Nullable BiFunction, @Nullable ISpecialInventory> provider; public static boolean isUsable() { return provider != null; @@ -41,7 +42,7 @@ public static boolean isUsable() { * @param inventory the Bukkit inventory * @return true if backed by the correct implementation */ - public static boolean isPlayerInventory(@NotNull Inventory inventory) { + public static boolean isPlayerInventory(Inventory inventory) { return getPlayerInventory(inventory) != null; } @@ -52,7 +53,7 @@ public static boolean isPlayerInventory(@NotNull Inventory inventory) { * @param inventory the Bukkit inventory * @return the backing implementation if available */ - public static @Nullable ISpecialPlayerInventory getPlayerInventory(@NotNull Inventory inventory) { + public static @Nullable ISpecialPlayerInventory getPlayerInventory(Inventory inventory) { return provider == null ? null : (ISpecialPlayerInventory) provider.apply(inventory, ISpecialPlayerInventory.class); } @@ -62,7 +63,7 @@ public static boolean isPlayerInventory(@NotNull Inventory inventory) { * @param inventory the Bukkit inventory * @return true if backed by the correct implementation */ - public static boolean isEnderChest(@NotNull Inventory inventory) { + public static boolean isEnderChest(Inventory inventory) { return getEnderChest(inventory) != null; } @@ -73,7 +74,7 @@ public static boolean isEnderChest(@NotNull Inventory inventory) { * @param inventory the Bukkit inventory * @return the backing implementation if available */ - public static @Nullable ISpecialEnderChest getEnderChest(@NotNull Inventory inventory) { + public static @Nullable ISpecialEnderChest getEnderChest(Inventory inventory) { return provider == null ? null : (ISpecialEnderChest) provider.apply(inventory, ISpecialEnderChest.class); } @@ -84,17 +85,18 @@ public static boolean isEnderChest(@NotNull Inventory inventory) { * @param inventory the Bukkit inventory * @return the backing implementation if available */ - public static @Nullable ISpecialInventory getInventory(@NotNull Inventory inventory) { + public static @Nullable ISpecialInventory getInventory(Inventory inventory) { return provider == null ? null : provider.apply(inventory, ISpecialInventory.class); } @RestrictedApi( explanation = "Not part of the API.", + link = "", allowedOnPath = ".*/com/lishid/openinv/util/InternalAccessor.java" ) @ApiStatus.Internal static void setProvider( - @Nullable BiFunction, ISpecialInventory> provider + @Nullable BiFunction, @Nullable ISpecialInventory> provider ) { InventoryAccess.provider = provider; } diff --git a/api/src/main/java/com/lishid/openinv/util/Permissions.java b/api/src/main/java/com/lishid/openinv/util/Permissions.java index e8940332..f5913b0a 100644 --- a/api/src/main/java/com/lishid/openinv/util/Permissions.java +++ b/api/src/main/java/com/lishid/openinv/util/Permissions.java @@ -17,7 +17,7 @@ package com.lishid.openinv.util; import org.bukkit.permissions.Permissible; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * An enum containing all permissions directly checked by OpenInv. @@ -25,6 +25,7 @@ *

Note that this is not an exhaustive list! This does not contain * all permissions managed by Bukkit, largely parent nodes.

*/ +@NullMarked public enum Permissions { /// Permission to open one's own inventory. @@ -121,7 +122,7 @@ public enum Permissions { * @param permissible the Permissible * @return true if the permission is granted */ - public boolean hasPermission(@NotNull Permissible permissible) { + public boolean hasPermission(Permissible permissible) { return permissible.hasPermission(permission); } diff --git a/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggle.java b/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggle.java index b4976eea..f6dbd74f 100644 --- a/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggle.java +++ b/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggle.java @@ -1,13 +1,14 @@ package com.lishid.openinv.util.setting; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.UUID; /** * A per-player setting that may be enabled or disabled. */ +@NullMarked public interface PlayerToggle { /** @@ -15,7 +16,7 @@ public interface PlayerToggle { * * @return the setting name */ - @NotNull String getName(); + String getName(); /** * Get the state of the toggle for a particular player ID. @@ -23,7 +24,7 @@ public interface PlayerToggle { * @param uuid the player ID * @return true if the setting is enabled */ - boolean is(@NotNull UUID uuid); + boolean is(UUID uuid); /** * Get the state of the toggle for a particular {@link Player}, @@ -32,7 +33,7 @@ public interface PlayerToggle { * @param player the player * @return true if the setting is enabled and the player has the required permissions */ - boolean is(@NotNull Player player); + boolean is(Player player); /** * Set the state of the toggle for a particular player ID. @@ -41,6 +42,6 @@ public interface PlayerToggle { * @param enabled whether the setting is enabled * @return true if the setting changed as a result of being set */ - boolean set(@NotNull UUID uuid, boolean enabled); + boolean set(UUID uuid, boolean enabled); } diff --git a/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggles.java b/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggles.java index e6d2f5fa..39d51316 100644 --- a/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggles.java +++ b/api/src/main/java/com/lishid/openinv/util/setting/PlayerToggles.java @@ -2,9 +2,9 @@ import com.lishid.openinv.util.Permissions; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.Collections; @@ -18,19 +18,20 @@ /** * Utility class containing all of OpenInv's {@link PlayerToggle PlayerToggles}. */ +@NullMarked public final class PlayerToggles { private static final Map TOGGLES = new HashMap<>(); private static final PlayerToggle ANY = add(new MemoryToggle("AnyContainer") { @Override - public boolean is(@NotNull Player player) { + public boolean is(Player player) { return is(player.getUniqueId()) && (Permissions.CONTAINER_ANY.hasPermission(player) || Permissions.CONTAINER_ANY_USE.hasPermission(player)); } }); private static final PlayerToggle SILENT = add(new MemoryToggle("SilentContainer") { @Override - public boolean is(@NotNull Player player) { + public boolean is(Player player) { return is(player.getUniqueId()) && (Permissions.CONTAINER_SILENT.hasPermission(player) || Permissions.CONTAINER_SILENT_USE.hasPermission(player)); } @@ -41,7 +42,7 @@ public boolean is(@NotNull Player player) { * * @return the AnyContainer toggle */ - public static @NotNull PlayerToggle any() { + public static PlayerToggle any() { return ANY; } @@ -50,7 +51,7 @@ public boolean is(@NotNull Player player) { * * @return the SilentContainer toggle */ - public static @NotNull PlayerToggle silent() { + public static PlayerToggle silent() { return SILENT; } @@ -60,7 +61,7 @@ public boolean is(@NotNull Player player) { * @param toggleName the name of the toggle * @return the toggle, or null if no such toggle exists. */ - public static @Nullable PlayerToggle get(@NotNull String toggleName) { + public static @Nullable PlayerToggle get(String toggleName) { PlayerToggle toggle = TOGGLES.get(toggleName); if (toggle == null) { toggle = TOGGLES.get(toggleName.toLowerCase(Locale.ENGLISH)); @@ -73,11 +74,11 @@ public boolean is(@NotNull Player player) { * * @return a view of all toggles available */ - public static @UnmodifiableView @NotNull Collection get() { + public static @UnmodifiableView Collection get() { return Collections.unmodifiableCollection(TOGGLES.values()); } - private static @NotNull PlayerToggle add(@NotNull PlayerToggle toggle) { + private static PlayerToggle add(PlayerToggle toggle) { TOGGLES.put(toggle.getName().toLowerCase(Locale.ENGLISH), toggle); return toggle; } @@ -88,26 +89,26 @@ private PlayerToggles() { private static abstract class MemoryToggle implements PlayerToggle { - private final @NotNull Set enabled; - private final @NotNull String name; + private final Set enabled; + private final String name; - private MemoryToggle(@NotNull String name) { + private MemoryToggle(String name) { enabled = new HashSet<>(); this.name = name; } @Override - public @NotNull String getName() { + public String getName() { return this.name; } @Override - public boolean is(@NotNull UUID uuid) { + public boolean is(UUID uuid) { return enabled.contains(uuid); } @Override - public boolean set(@NotNull UUID uuid, boolean enabled) { + public boolean set(UUID uuid, boolean enabled) { if (enabled) { return this.enabled.add(uuid); } else { diff --git a/common/src/main/java/com/lishid/openinv/event/OpenEvents.java b/common/src/main/java/com/lishid/openinv/event/OpenEvents.java index 626372c2..f96f9815 100644 --- a/common/src/main/java/com/lishid/openinv/event/OpenEvents.java +++ b/common/src/main/java/com/lishid/openinv/event/OpenEvents.java @@ -6,24 +6,25 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.UUID; /** * Construct and call events. */ +@NullMarked public final class OpenEvents { - public static boolean saveCancelled(@NotNull Player player) { + public static boolean saveCancelled(Player player) { return call(new PlayerSaveEvent(player)); } - public static boolean saveCancelled(@NotNull ISpecialInventory inventory) { + public static boolean saveCancelled(ISpecialInventory inventory) { return call(new OpenPlayerSaveEvent((Player) inventory.getPlayer(), inventory)); } - public static void notifyPlayerToggle(@NotNull PlayerToggle toggle, @NotNull UUID uuid, boolean state) { + public static void notifyPlayerToggle(PlayerToggle toggle, UUID uuid, boolean state) { Bukkit.getPluginManager().callEvent(new PlayerToggledEvent(toggle, uuid, state)); } diff --git a/common/src/main/java/com/lishid/openinv/internal/Accessor.java b/common/src/main/java/com/lishid/openinv/internal/Accessor.java index e57a4afb..17e021ae 100644 --- a/common/src/main/java/com/lishid/openinv/internal/Accessor.java +++ b/common/src/main/java/com/lishid/openinv/internal/Accessor.java @@ -3,22 +3,22 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public interface Accessor { - @NotNull PlayerManager getPlayerManager(); - @NotNull IAnySilentContainer getAnySilentContainer(); + IAnySilentContainer getAnySilentContainer(); - @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player); + ISpecialPlayerInventory createPlayerInventory(Player player); - @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player); + ISpecialEnderChest createEnderChest(Player player); - @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz); + @Nullable T get(Inventory bukkitInventory, Class clazz); - void reload(@NotNull ConfigurationSection config); + void reload(ConfigurationSection config); } diff --git a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java b/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java index 75debc48..77221009 100644 --- a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java +++ b/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java @@ -10,12 +10,13 @@ import org.bukkit.block.data.type.Chest; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public abstract class AnySilentContainerBase implements IAnySilentContainer { @Override - public boolean isAnyContainerNeeded(@NotNull Block block) { + public boolean isAnyContainerNeeded(Block block) { BlockState blockState = getState(block); // Barrels do not require AnyContainer. @@ -73,17 +74,17 @@ public boolean isAnyContainerNeeded(@NotNull Block block) { } @Override - public boolean isAnySilentContainer(@NotNull Block block) { + public boolean isAnySilentContainer(Block block) { return isAnySilentContainer(getState(block)); } @Override - public boolean isAnySilentContainer(@NotNull Inventory inventory) { + public boolean isAnySilentContainer(Inventory inventory) { return isAnySilentContainer(getHolder(inventory)); } - protected abstract BlockState getState(@NotNull Block block); + protected abstract BlockState getState(Block block); - protected abstract InventoryHolder getHolder(@NotNull Inventory inventory); + protected abstract InventoryHolder getHolder(Inventory inventory); } diff --git a/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java b/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java index 24f826d0..f1f6c906 100644 --- a/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java +++ b/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java @@ -1,5 +1,8 @@ package com.lishid.openinv.internal; +import org.jspecify.annotations.NullMarked; + +@NullMarked public interface InternalOwned { T getOwnerHandle(); diff --git a/common/src/main/java/com/lishid/openinv/internal/PlayerManager.java b/common/src/main/java/com/lishid/openinv/internal/PlayerManager.java index c60c1557..fe19573d 100644 --- a/common/src/main/java/com/lishid/openinv/internal/PlayerManager.java +++ b/common/src/main/java/com/lishid/openinv/internal/PlayerManager.java @@ -19,9 +19,10 @@ import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public interface PlayerManager { /** @@ -32,14 +33,14 @@ public interface PlayerManager { * @param offline the OfflinePlayer * @return the Player loaded */ - @Nullable Player loadPlayer(@NotNull OfflinePlayer offline); + @Nullable Player loadPlayer(OfflinePlayer offline); /** * Creates a new Player from an existing one that will function slightly better offline. * * @return the Player */ - @NotNull Player inject(@NotNull Player player); + Player inject(Player player); /** * Opens an ISpecialInventory for a Player. @@ -49,6 +50,6 @@ public interface PlayerManager { * * @return the InventoryView opened */ - @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory, boolean viewOnly); + @Nullable InventoryView openInventory(Player player, ISpecialInventory inventory, boolean viewOnly); } diff --git a/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java b/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java index f53a3374..6dbd13f6 100644 --- a/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java +++ b/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java @@ -1,5 +1,6 @@ package com.lishid.openinv.util; +import org.jspecify.annotations.NullMarked; import org.slf4j.Marker; import org.slf4j.helpers.LegacyAbstractLogger; import org.slf4j.helpers.MessageFormatter; @@ -14,6 +15,7 @@ * An adapter for wrapping a {@link java.util.logging.Logger} as a {@link org.slf4j.Logger}. *
Largely based on {@code JDK14LoggerAdapter}, which is not present at runtime. */ +@NullMarked public class JulLoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger { private final Logger wrapped; diff --git a/common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java b/common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java index d22e6fcf..51e193d1 100644 --- a/common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java +++ b/common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java @@ -16,13 +16,15 @@ package com.lishid.openinv.util; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; /** * A utility for making reflection easier. */ +@NullMarked public final class ReflectionHelper { /** diff --git a/common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java b/common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java index 01b22025..a90af5a9 100644 --- a/common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java +++ b/common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java @@ -25,8 +25,8 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.io.BufferedReader; import java.io.File; @@ -47,6 +47,7 @@ * * @author Jikoo */ +@NullMarked public class LanguageManager { private final Plugin plugin; @@ -54,7 +55,7 @@ public class LanguageManager { private final String defaultLocale; private final Map locales; - public LanguageManager(@NotNull Plugin plugin, @NotNull String defaultLocale) { + public LanguageManager(Plugin plugin, String defaultLocale) { this.plugin = plugin; this.defaultLocale = defaultLocale; this.locales = new HashMap<>(); @@ -72,7 +73,7 @@ public void reload() { getOrLoadLocale(defaultLocale); } - private @NotNull YamlConfiguration getOrLoadLocale(@NotNull String locale) { + private YamlConfiguration getOrLoadLocale(String locale) { YamlConfiguration loaded = locales.get(locale); if (loaded != null) { return loaded; @@ -110,7 +111,7 @@ public void reload() { return localeConfig; } - private @NotNull LangLocation bestMatch(@NotNull String locale, @Nullable LangLocation initial) { + private LangLocation bestMatch(String locale, @Nullable LangLocation initial) { File file = new File(folder, locale + ".yml"); InputStream bundled = plugin.getResource("locale/" + locale + ".yml"); @@ -132,7 +133,7 @@ public void reload() { return bestMatch(locale.substring(0, lastSeparator), initial); } - private @NotNull YamlConfiguration loadLocale(@NotNull LangLocation lang) { + private YamlConfiguration loadLocale(LangLocation lang) { YamlConfiguration localeConfigDefaults; if (lang.bundled == null) { localeConfigDefaults = new YamlConfiguration(); @@ -195,7 +196,7 @@ public void reload() { return localeConfig; } - private void addTranslationFallthrough(@NotNull LangLocation location, @NotNull YamlConfiguration localeConfig) { + private void addTranslationFallthrough(LangLocation location, YamlConfiguration localeConfig) { YamlConfiguration defaultLocaleConfig = locales.get(defaultLocale); // Get missing keys. Keys that already have a guess value are not new and don't need to trigger another write. @@ -222,9 +223,9 @@ private void addTranslationFallthrough(@NotNull LangLocation location, @NotNull localeConfig.setDefaults(defaultLocaleConfig); } - private @NotNull List getMissingKeys( - @NotNull Configuration configurationDefault, - @NotNull Predicate nodeSetPredicate + private List getMissingKeys( + Configuration configurationDefault, + Predicate nodeSetPredicate ) { List missingKeys = new ArrayList<>(); for (String key : configurationDefault.getKeys(true)) { @@ -236,7 +237,7 @@ private void addTranslationFallthrough(@NotNull LangLocation location, @NotNull return missingKeys; } - public @Nullable String getValue(@NotNull String key, @Nullable String locale) { + public @Nullable String getValue(String key, @Nullable String locale) { String value = getOrLoadLocale(locale == null ? defaultLocale : locale.toLowerCase(Locale.ENGLISH)).getString(key); if (value == null || value.isBlank()) { return null; @@ -248,9 +249,9 @@ private void addTranslationFallthrough(@NotNull LangLocation location, @NotNull } public @Nullable String getValue( - @NotNull String key, + String key, @Nullable String locale, - Replacement @NotNull ... replacements + Replacement... replacements ) { String value = getValue(key, locale); @@ -265,19 +266,19 @@ private void addTranslationFallthrough(@NotNull LangLocation location, @NotNull return value; } - public @Nullable String getLocalizedMessage(@NotNull CommandSender sender, @NotNull String key) { + public @Nullable String getLocalizedMessage(CommandSender sender, String key) { return getValue(key, getLocale(sender)); } public @Nullable String getLocalizedMessage( - @NotNull CommandSender sender, - @NotNull String key, - Replacement @NotNull ... replacements + CommandSender sender, + String key, + Replacement... replacements ) { return getValue(key, getLocale(sender), replacements); } - private @NotNull String getLocale(@NotNull CommandSender sender) { + private String getLocale(CommandSender sender) { if (sender instanceof Player player) { return player.getLocale(); } else { @@ -285,7 +286,7 @@ private void addTranslationFallthrough(@NotNull LangLocation location, @NotNull } } - public void sendMessage(@NotNull CommandSender sender, @NotNull String key) { + public void sendMessage(CommandSender sender, String key) { String message = getLocalizedMessage(sender, key); if (message != null && !message.isEmpty()) { @@ -293,7 +294,7 @@ public void sendMessage(@NotNull CommandSender sender, @NotNull String key) { } } - public void sendMessage(@NotNull CommandSender sender, @NotNull String key, Replacement @NotNull ... replacements) { + public void sendMessage(CommandSender sender, String key, Replacement... replacements) { String message = getLocalizedMessage(sender, key, replacements); if (message != null && !message.isEmpty()) { @@ -301,7 +302,7 @@ public void sendMessage(@NotNull CommandSender sender, @NotNull String key, Repl } } - public void sendSystemMessage(@NotNull Player player, @NotNull String key) { + public void sendSystemMessage(Player player, String key) { String message = getLocalizedMessage(player, key); if (message == null) { @@ -321,6 +322,6 @@ public void sendSystemMessage(@NotNull Player player, @NotNull String key) { player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacy(message)); } - private record LangLocation(@NotNull String locale, @NotNull File file, @Nullable InputStream bundled) {} + private record LangLocation(String locale, File file, @Nullable InputStream bundled) {} } diff --git a/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java b/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java index 6753044c..4c644633 100644 --- a/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java +++ b/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java @@ -16,7 +16,7 @@ package com.lishid.openinv.util.lang; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A data holder for string replacement in translations. @@ -24,6 +24,7 @@ * @param placeholder the placeholder to be replaced * @param value the value to insert */ -public record Replacement(@NotNull String placeholder, @NotNull String value) { +@NullMarked +public record Replacement(String placeholder, String value) { } diff --git a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java index e58425a2..95039ca2 100644 --- a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java +++ b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java @@ -6,23 +6,24 @@ import com.lishid.openinv.internal.paper1_21_11.container.OpenInventory; import com.lishid.openinv.util.lang.LanguageManager; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class InternalAccessor extends com.lishid.openinv.internal.paper26_1.InternalAccessor { - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + public InternalAccessor(Logger logger, LanguageManager lang) { super(logger, lang); } @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { + public ISpecialEnderChest createEnderChest(Player player) { return new OpenEnderChest(player); } @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { + public ISpecialPlayerInventory createPlayerInventory(Player player) { return new OpenInventory(player); } 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 dac1109d..6377cf35 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 @@ -7,36 +7,37 @@ import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader; import com.lishid.openinv.util.lang.LanguageManager; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class InternalAccessor extends com.lishid.openinv.internal.paper26_3.InternalAccessor { - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + public InternalAccessor(Logger logger, LanguageManager lang) { super(logger, lang); } @Override - protected @NotNull PlayerManager createPlayerManager(@NotNull Logger logger) { + protected PlayerManager createPlayerManager(Logger logger) { return new PlayerManager(logger); } @Override - protected @NotNull AnySilentContainer createAnySilentContainer( - @NotNull Logger logger, - @NotNull LanguageManager lang + protected AnySilentContainer createAnySilentContainer( + Logger logger, + LanguageManager lang ) { return new AnySilentContainer(logger, lang); } @Override - protected @NotNull PlaceholderLoader createPlaceholderLoader() { + protected PlaceholderLoader createPlaceholderLoader() { return new com.lishid.openinv.internal.paper26_1.container.slot.placeholder.PlaceholderLoader(); } @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { + public ISpecialEnderChest createEnderChest(Player player) { return new OpenEnderChest(player); } 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 824322ee..b8981e61 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 @@ -2,18 +2,19 @@ import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class AnySilentContainer extends com.lishid.openinv.internal.paper26_3.container.AnySilentContainer { - public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { + public AnySilentContainer(Logger logger, LanguageManager lang) { super(logger, lang); } @Override - protected boolean hasLootTable(@NotNull RandomizableContainerBlockEntity lootable) { + protected boolean hasLootTable(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 4e78e73d..3b905a3e 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 @@ -3,16 +3,17 @@ import net.minecraft.core.NonNullList; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class OpenEnderChest extends com.lishid.openinv.internal.paper26_3.container.OpenEnderChest { - public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { + public OpenEnderChest(org.bukkit.entity.Player player) { super(player); } @Override - protected @NotNull NonNullList getEnderChestItems(@NotNull ServerPlayer owner) { + protected NonNullList getEnderChestItems(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 cf43fa71..ccf7cf77 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 @@ -2,17 +2,18 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class PlaceholderLoader extends com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader { @Override - protected @NotNull Item getDefaultCursorItem() { + protected Item getDefaultCursorItem() { return Items.WHITE_BANNER; } @Override - protected @NotNull Item getDefaultNotSlotItem() { + protected Item getDefaultNotSlotItem() { return Items.WHITE_STAINED_GLASS_PANE; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java index 7d06ab0d..c277c9f3 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java @@ -16,61 +16,62 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.logging.Level; import java.util.logging.Logger; +@NullMarked public class InternalAccessor implements Accessor { - protected final @NotNull Logger logger; - private final @NotNull PlayerManager manager; - private final @NotNull AnySilentContainer anySilentContainer; + protected final Logger logger; + private final PlayerManager manager; + private final AnySilentContainer anySilentContainer; - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + public InternalAccessor(Logger logger, LanguageManager lang) { this.logger = logger; manager = createPlayerManager(logger); anySilentContainer = createAnySilentContainer(logger, lang); } - protected @NotNull PlayerManager createPlayerManager(@NotNull Logger logger) { + protected PlayerManager createPlayerManager(Logger logger) { return new PlayerManager(logger); } - protected @NotNull AnySilentContainer createAnySilentContainer( - @NotNull Logger logger, - @NotNull LanguageManager lang + protected AnySilentContainer createAnySilentContainer( + Logger logger, + LanguageManager lang ) { return new AnySilentContainer(logger, lang); } - protected @NotNull PlaceholderLoader createPlaceholderLoader() { + protected PlaceholderLoader createPlaceholderLoader() { return new PlaceholderLoader(); } @Override - public @NotNull PlayerManager getPlayerManager() { + public PlayerManager getPlayerManager() { return manager; } @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { + public IAnySilentContainer getAnySilentContainer() { return anySilentContainer; } @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { + public ISpecialPlayerInventory createPlayerInventory(Player player) { return new OpenInventory(player); } @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { + public ISpecialEnderChest createEnderChest(Player player) { return new OpenEnderChest(player); } @Override - public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { + public @Nullable T get(Inventory bukkitInventory, Class clazz) { if (!(bukkitInventory instanceof CraftInventory craftInventory)) { return null; } @@ -82,7 +83,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } @Override - public void reload(@NotNull ConfigurationSection config) { + public void reload(ConfigurationSection config) { ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); try { // Reset placeholders to defaults and try to load configuration. diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java index a0833a26..eece58e1 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java @@ -47,19 +47,20 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.util.logging.Logger; +@NullMarked public class AnySilentContainer extends AnySilentContainerBase { - private final @NotNull Logger logger; - private final @NotNull LanguageManager lang; + private final Logger logger; + private final LanguageManager lang; private @Nullable Field serverPlayerGameModeGameType; - public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { + public AnySilentContainer(Logger logger, LanguageManager lang) { this.logger = logger; this.lang = lang; try { @@ -81,9 +82,9 @@ public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) @Override public boolean activateContainer( - @NotNull final Player bukkitPlayer, + final Player bukkitPlayer, final boolean silentchest, - @NotNull final org.bukkit.block.Block bukkitBlock + final org.bukkit.block.Block bukkitBlock ) { // Silent ender chest is API-only @@ -120,7 +121,7 @@ public boolean activateContainer( return true; } - if (!(blockEntity instanceof MenuProvider menuProvider)) { + if (!(blockEntity instanceof @Nullable MenuProvider menuProvider)) { return false; } @@ -177,12 +178,12 @@ public boolean activateContainer( return true; } - protected boolean hasLootTable(@NotNull RandomizableContainerBlockEntity lootable) { + protected boolean hasLootTable(RandomizableContainerBlockEntity lootable) { return lootable.getLootTable() != null; } @Override - public void deactivateContainer(@NotNull final Player bukkitPlayer) { + public void deactivateContainer(final Player bukkitPlayer) { if (this.serverPlayerGameModeGameType == null || bukkitPlayer.getGameMode() == GameMode.SPECTATOR) { return; } @@ -220,12 +221,12 @@ private void forceGameType(final ServerPlayer player, final GameType gameMode) { } @Override - protected org.bukkit.block.BlockState getState(@NotNull org.bukkit.block.Block block) { + protected org.bukkit.block.BlockState getState(org.bukkit.block.Block block) { return block.getState(false); } @Override - protected InventoryHolder getHolder(@NotNull Inventory inventory) { + protected @Nullable InventoryHolder getHolder(Inventory inventory) { return inventory.getHolder(false); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java index 4ca64c22..7401f1a8 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java @@ -32,24 +32,25 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; +@NullMarked public abstract class BaseOpenInventory implements Container, InternalOwned, ISpecialPlayerInventory { protected final List slots; private final int size; protected ServerPlayer owner; private int maxStackSize = 99; - protected CraftInventory bukkitEntity; + protected @Nullable CraftInventory bukkitEntity; public List transaction = new ArrayList<>(); - public BaseOpenInventory(@NotNull org.bukkit.entity.Player bukkitPlayer) { + public BaseOpenInventory(org.bukkit.entity.Player bukkitPlayer) { owner = PlayerManager.getHandle(bukkitPlayer); // Get total size, rounding up to nearest 9 for client compatibility. @@ -113,8 +114,8 @@ private int addMainInventory() { localIndex, new ContentList(owner, invIndex, type) { @Override - public void setHolder(@NotNull ServerPlayer holder) { - items = holder.getInventory().getNonEquipmentItems(); + protected List getItems(ServerPlayer holder) { + return holder.getInventory().getNonEquipmentItems(); } } ); @@ -187,7 +188,7 @@ public ItemStack getOrDefault() { return startIndex + listSize; } - protected Content getCraftingResult(@NotNull ServerPlayer serverPlayer) { + protected Content getCraftingResult(ServerPlayer serverPlayer) { return new ContentCraftingResult(serverPlayer); } @@ -207,7 +208,7 @@ public ServerPlayer getOwnerHandle() { } @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { + public org.bukkit.inventory.Inventory getBukkitInventory() { if (bukkitEntity == null) { bukkitEntity = new OpenPlayerInventory(this); } @@ -215,7 +216,7 @@ public ServerPlayer getOwnerHandle() { } @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { + public void setPlayerOnline(org.bukkit.entity.Player player) { ServerPlayer newOwner = PlayerManager.getHandle(player); // Only transfer regular inventory - crafting and cursor slots are transient. newOwner.getInventory().replaceWith(owner.getInventory()); @@ -230,7 +231,7 @@ public boolean isInUse() { } @Override - public @NotNull org.bukkit.entity.Player getPlayer() { + public org.bukkit.entity.Player getPlayer() { return getOwner(); } @@ -245,22 +246,22 @@ public boolean isEmpty() { } @Override - public @NotNull ItemStack getItem(int index) { + public ItemStack getItem(int index) { return slots.get(index).get(); } @Override - public @NotNull ItemStack removeItem(int index, int amount) { + public ItemStack removeItem(int index, int amount) { return slots.get(index).removePartial(amount); } @Override - public @NotNull ItemStack removeItemNoUpdate(int index) { + public ItemStack removeItemNoUpdate(int index) { return slots.get(index).remove(); } @Override - public void setItem(int index, @NotNull ItemStack itemStack) { + public void setItem(int index, ItemStack itemStack) { slots.get(index).set(itemStack); } @@ -279,12 +280,12 @@ public void setChanged() { } @Override - public boolean stillValid(@NotNull Player player) { + public boolean stillValid(Player player) { return true; } @Override - public @NotNull List getContents() { + public List getContents() { NonNullList contents = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); for (int i = 0; i < getContainerSize(); ++i) { contents.set(i, getItem(i)); @@ -293,22 +294,22 @@ public boolean stillValid(@NotNull Player player) { } @Override - public void onOpen(@NotNull CraftHumanEntity viewer) { + public void onOpen(CraftHumanEntity viewer) { transaction.add(viewer); } @Override - public void onClose(@NotNull CraftHumanEntity viewer) { + public void onClose(CraftHumanEntity viewer) { transaction.remove(viewer); } @Override - public @NotNull List getViewers() { + public List getViewers() { return transaction; } @Override - public @NotNull org.bukkit.entity.Player getOwner() { + public org.bukkit.entity.Player getOwner() { return owner.getBukkitEntity(); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java index abf50a90..e9657124 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java @@ -20,37 +20,38 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; +@NullMarked public class OpenEnderChest implements Container, StackedContentsCompatible, InternalOwned, ISpecialEnderChest { - private CraftInventory inventory; - private @NotNull ServerPlayer owner; + private @Nullable CraftInventory inventory; + private ServerPlayer owner; private NonNullList items; private int maxStack = 64; private final List transaction = new ArrayList<>(); - public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { + public OpenEnderChest(org.bukkit.entity.Player player) { this.owner = PlayerManager.getHandle(player); this.items = getEnderChestItems(owner); } @Override - public @NotNull ServerPlayer getOwnerHandle() { + public ServerPlayer getOwnerHandle() { return owner; } @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { + public org.bukkit.inventory.Inventory getBukkitInventory() { if (inventory == null) { inventory = new CraftInventory(this) { @Override - public @NotNull InventoryType getType() { + public InventoryType getType() { return InventoryType.ENDER_CHEST; } }; @@ -59,7 +60,7 @@ public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { } @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { + public void setPlayerOnline(org.bukkit.entity.Player player) { owner = PlayerManager.getHandle(player); NonNullList activeItems = getEnderChestItems(owner); @@ -72,12 +73,12 @@ public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { items = activeItems; } - protected @NotNull NonNullList getEnderChestItems(@NotNull ServerPlayer owner) { + protected NonNullList getEnderChestItems(ServerPlayer owner) { return owner.getEnderChestInventory().getItems(); } @Override - public @NotNull org.bukkit.entity.Player getPlayer() { + public org.bukkit.entity.Player getPlayer() { return owner.getBukkitEntity(); } @@ -92,12 +93,12 @@ public boolean isEmpty() { } @Override - public @NotNull ItemStack getItem(int index) { + public ItemStack getItem(int index) { return index >= 0 && index < items.size() ? items.get(index) : ItemStack.EMPTY; } @Override - public @NotNull ItemStack removeItem(int index, int amount) { + public ItemStack removeItem(int index, int amount) { ItemStack itemstack = ContainerHelper.removeItem(items, index, amount); if (!itemstack.isEmpty()) { @@ -108,12 +109,12 @@ public boolean isEmpty() { } @Override - public @NotNull ItemStack removeItemNoUpdate(int index) { + public 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) { + public void setItem(int index, ItemStack itemStack) { if (index >= 0 && index < items.size()) { items.set(index, itemStack); } @@ -130,27 +131,27 @@ public void setChanged() { } @Override - public boolean stillValid(@NotNull Player player) { + public boolean stillValid(Player player) { return true; } @Override - public @NotNull List getContents() { + public List getContents() { return items; } @Override - public void onOpen(@NotNull CraftHumanEntity craftHumanEntity) { + public void onOpen(CraftHumanEntity craftHumanEntity) { transaction.add(craftHumanEntity); } @Override - public void onClose(@NotNull CraftHumanEntity craftHumanEntity) { + public void onClose(CraftHumanEntity craftHumanEntity) { transaction.remove(craftHumanEntity); } @Override - public @NotNull List getViewers() { + public List getViewers() { return transaction; } @@ -176,7 +177,7 @@ public void clearContent() { } @Override - public void fillStackedContents(@NotNull StackedItemContents stackedContents) { + public void fillStackedContents(StackedItemContents stackedContents) { for (ItemStack itemstack : items) { stackedContents.accountStack(itemstack); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java index d0b66209..c012dda0 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java @@ -8,17 +8,18 @@ import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenInventory extends BaseOpenInventory { - public OpenInventory(@NotNull Player bukkitPlayer) { + public OpenInventory(Player bukkitPlayer) { super(bukkitPlayer); } @Override - public @NotNull Component getTitle(@Nullable ServerPlayer viewer, @Nullable OpenChestMenu menu) { + public Component getTitle(@Nullable ServerPlayer viewer, @Nullable OpenChestMenu menu) { MutableComponent component = Component.empty(); // Prefix for use with custom bitmap image fonts. if (owner.equals(viewer)) { diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java index d71a371a..f9335fbd 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java @@ -6,8 +6,8 @@ import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.HashMap; @@ -16,6 +16,7 @@ /** * A locked down "empty" inventory that rejects plugin interaction. */ +@NullMarked public class OpenDummyInventory extends CraftInventory implements ViewOnly { private final InventoryType type; @@ -26,7 +27,7 @@ public OpenDummyInventory(Container inventory, InventoryType type) { } @Override - public @NotNull InventoryType getType() { + public InventoryType getType() { return type; } @@ -42,18 +43,18 @@ public void setItem(int index, @Nullable ItemStack item) { @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap addItem(@NotNull ItemStack... items) throws IllegalArgumentException { + public HashMap addItem(ItemStack... items) throws IllegalArgumentException { return arrayToHashMap(items); } @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap removeItem(@NotNull ItemStack... items) throws IllegalArgumentException { + public HashMap removeItem(ItemStack... items) throws IllegalArgumentException { return arrayToHashMap(items); } @SuppressWarnings("NonApiType") - private static @NotNull HashMap arrayToHashMap(@NotNull ItemStack[] items) { + private static HashMap arrayToHashMap(ItemStack[] items) { HashMap ignored = new HashMap<>(); for (int index = 0; index < items.length; ++index) { ignored.put(index, items[index]); @@ -62,27 +63,27 @@ public void setItem(int index, @Nullable ItemStack item) { } @Override - public ItemStack @NotNull [] getContents() { + public ItemStack[] getContents() { return new ItemStack[getSize()]; } @Override - public void setContents(@NotNull ItemStack[] items) throws IllegalArgumentException { + public void setContents(ItemStack[] items) throws IllegalArgumentException { } @Override - public @NotNull ItemStack @NotNull [] getStorageContents() { + public ItemStack[] getStorageContents() { return new ItemStack[getSize()]; } @Override - public void setStorageContents(@NotNull ItemStack[] items) throws IllegalArgumentException { + public void setStorageContents(ItemStack[] items) throws IllegalArgumentException { } @Override - public boolean contains(@NotNull Material material) throws IllegalArgumentException { + public boolean contains(Material material) throws IllegalArgumentException { return false; } @@ -92,7 +93,7 @@ public boolean contains(@Nullable ItemStack item) { } @Override - public boolean contains(@NotNull Material material, int amount) throws IllegalArgumentException { + public boolean contains(Material material, int amount) throws IllegalArgumentException { return false; } @@ -108,25 +109,25 @@ public boolean containsAtLeast(@Nullable ItemStack item, int amount) { @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap all( - @NotNull Material material + public HashMap all( + Material material ) throws IllegalArgumentException { return new HashMap<>(); } @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap all(@Nullable ItemStack item) { + public HashMap all(@Nullable ItemStack item) { return new HashMap<>(); } @Override - public int first(@NotNull Material material) throws IllegalArgumentException { + public int first(Material material) throws IllegalArgumentException { return -1; } @Override - public int first(@NotNull ItemStack item) { + public int first(ItemStack item) { return -1; } @@ -141,12 +142,12 @@ public boolean isEmpty() { } @Override - public void remove(@NotNull Material material) throws IllegalArgumentException { + public void remove(Material material) throws IllegalArgumentException { } @Override - public void remove(@NotNull ItemStack item) { + public void remove(ItemStack item) { } @@ -161,12 +162,12 @@ public void clear() { } @Override - public @NotNull ListIterator iterator() { + public ListIterator iterator() { return Collections.emptyListIterator(); } @Override - public @NotNull ListIterator iterator(int index) { + public ListIterator iterator(int index) { return Collections.emptyListIterator(); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java index 9b2449ec..5825a9e8 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyPlayerInventory.java @@ -1,15 +1,15 @@ package com.lishid.openinv.internal.paper26_3.container.bukkit; import net.minecraft.world.Container; -import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenDummyPlayerInventory extends OpenDummyInventory implements PlayerInventory { public OpenDummyPlayerInventory(Container inventory) { @@ -22,52 +22,52 @@ public HumanEntity getHolder() { } @Override - public @NotNull ItemStack @NotNull [] getArmorContents() { + public ItemStack[] getArmorContents() { return new ItemStack[4]; } @Override - public @NotNull ItemStack @NotNull [] getExtraContents() { + public ItemStack[] getExtraContents() { return new ItemStack[4]; } @Override - public @Nullable ItemStack getHelmet() { - return null; + public ItemStack getHelmet() { + return ItemStack.empty(); } @Override - public @Nullable ItemStack getChestplate() { - return null; + public ItemStack getChestplate() { + return ItemStack.empty(); } @Override - public @Nullable ItemStack getLeggings() { - return null; + public ItemStack getLeggings() { + return ItemStack.empty(); } @Override - public @Nullable ItemStack getBoots() { - return null; + public ItemStack getBoots() { + return ItemStack.empty(); } @Override - public void setItem(@NotNull EquipmentSlot slot, @Nullable ItemStack item) { + public void setItem(EquipmentSlot slot, @Nullable ItemStack item) { } @Override - public @NotNull ItemStack getItem(@NotNull EquipmentSlot slot) { - return new ItemStack(Material.AIR); + public ItemStack getItem(EquipmentSlot slot) { + return ItemStack.empty(); } @Override - public void setArmorContents(ItemStack @NotNull [] items) { + public void setArmorContents(@Nullable ItemStack[] items) { } @Override - public void setExtraContents(ItemStack @NotNull [] items) { + public void setExtraContents(@Nullable ItemStack[] items) { } @@ -92,8 +92,8 @@ public void setBoots(@Nullable ItemStack boots) { } @Override - public @NotNull ItemStack getItemInMainHand() { - return new ItemStack(Material.AIR); + public ItemStack getItemInMainHand() { + return ItemStack.empty(); } @Override @@ -102,8 +102,8 @@ public void setItemInMainHand(@Nullable ItemStack item) { } @Override - public @NotNull ItemStack getItemInOffHand() { - return new ItemStack(Material.AIR); + public ItemStack getItemInOffHand() { + return ItemStack.empty(); } @Override @@ -114,8 +114,8 @@ public void setItemInOffHand(@Nullable ItemStack item) { @SuppressWarnings("InlineMeSuggester") @Deprecated @Override - public @NotNull ItemStack getItemInHand() { - return new ItemStack(Material.AIR); + public ItemStack getItemInHand() { + return ItemStack.empty(); } @Deprecated diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java index 98779237..9c957e92 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventory.java @@ -11,29 +11,30 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.List; +@NullMarked public class OpenPlayerInventory extends CraftInventory implements PlayerInventory { - public OpenPlayerInventory(@NotNull BaseOpenInventory inventory) { + public OpenPlayerInventory(BaseOpenInventory inventory) { super(inventory); } @Override - public @NotNull BaseOpenInventory getInventory() { + public BaseOpenInventory getInventory() { return (BaseOpenInventory) super.getInventory(); } @Override - public ItemStack @NotNull [] getContents() { + public ItemStack[] getContents() { return asCraftMirror(getInventory().getOwnerHandle().getInventory().getContents()); } @Override - public void setContents(ItemStack[] items) { + public void setContents(@Nullable ItemStack[] items) { Inventory internal = getInventory().getOwnerHandle().getInventory(); int size = internal.getContainerSize(); Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); @@ -48,12 +49,12 @@ public void setContents(ItemStack[] items) { } @Override - public ItemStack @NotNull [] getStorageContents() { + public ItemStack[] getStorageContents() { return asCraftMirror(getInventory().getOwnerHandle().getInventory().getNonEquipmentItems()); } @Override - public void setStorageContents(ItemStack[] items) throws IllegalArgumentException { + public void setStorageContents(@Nullable ItemStack[] items) throws IllegalArgumentException { NonNullList list = getInventory().getOwnerHandle().getInventory().getNonEquipmentItems(); int size = list.size(); Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); @@ -63,22 +64,22 @@ public void setStorageContents(ItemStack[] items) throws IllegalArgumentExceptio } @Override - public @NotNull InventoryType getType() { + public InventoryType getType() { return InventoryType.PLAYER; } @Override - public @NotNull Player getHolder() { + public Player getHolder() { return getInventory().getOwner(); } @Override - public @NotNull ItemStack @NotNull [] getArmorContents() { + public ItemStack[] getArmorContents() { return asCraftMirror(getInventory().getOwnerHandle().getInventory().getArmorContents()); } @Override - public void setArmorContents(ItemStack @NotNull [] items) { + public void setArmorContents(@Nullable ItemStack[] items) { int size = Inventory.EQUIPMENT_SLOTS_SORTED_BY_INDEX.length; Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); for (int index = 0; index < items.length; ++index) { @@ -90,12 +91,12 @@ public void setArmorContents(ItemStack @NotNull [] items) { } @Override - public @NotNull ItemStack @NotNull [] getExtraContents() { + public ItemStack[] getExtraContents() { return asCraftMirror(List.of(getInventory().getOwnerHandle().getInventory().equipment.get(EquipmentSlot.OFFHAND))); } @Override - public void setExtraContents(ItemStack @NotNull [] items) { + public void setExtraContents(@Nullable ItemStack[] items) { Preconditions.checkArgument(items.length <= 1, "items.length must be <= 1"); for (ItemStack item : items) { getInventory().getOwnerHandle().getInventory().equipment.set(EquipmentSlot.OFFHAND, CraftItemStack.asNMSCopy(item)); @@ -103,7 +104,7 @@ public void setExtraContents(ItemStack @NotNull [] items) { } @Override - public @NotNull ItemStack getHelmet() { + public ItemStack getHelmet() { return getInventory().getOwner().getInventory().getHelmet(); } @@ -113,7 +114,7 @@ public void setHelmet(@Nullable ItemStack helmet) { } @Override - public @NotNull ItemStack getChestplate() { + public ItemStack getChestplate() { return getInventory().getOwner().getInventory().getChestplate(); } @@ -123,7 +124,7 @@ public void setChestplate(@Nullable ItemStack chestplate) { } @Override - public @NotNull ItemStack getLeggings() { + public ItemStack getLeggings() { return getInventory().getOwner().getInventory().getLeggings(); } @@ -133,7 +134,7 @@ public void setLeggings(@Nullable ItemStack leggings) { } @Override - public @NotNull ItemStack getBoots() { + public ItemStack getBoots() { return getInventory().getOwner().getInventory().getBoots(); } @@ -143,7 +144,7 @@ public void setBoots(@Nullable ItemStack boots) { } @Override - public @NotNull ItemStack getItemInMainHand() { + public ItemStack getItemInMainHand() { return getInventory().getOwner().getInventory().getItemInMainHand(); } @@ -153,7 +154,7 @@ public void setItemInMainHand(@Nullable ItemStack item) { } @Override - public @NotNull ItemStack getItemInOffHand() { + public ItemStack getItemInOffHand() { return getInventory().getOwner().getInventory().getItemInOffHand(); } @@ -165,7 +166,7 @@ public void setItemInOffHand(@Nullable ItemStack item) { @SuppressWarnings("InlineMeSuggester") @Deprecated @Override - public @NotNull ItemStack getItemInHand() { + public ItemStack getItemInHand() { return getItemInMainHand(); } @@ -189,7 +190,7 @@ public void setHeldItemSlot(int slot) { } @Override - public @NotNull ItemStack getItem(@NotNull org.bukkit.inventory.EquipmentSlot slot) { + public ItemStack getItem(org.bukkit.inventory.EquipmentSlot slot) { return switch (slot) { case HAND -> getItemInMainHand(); case OFF_HAND -> getItemInOffHand(); @@ -202,7 +203,7 @@ public void setHeldItemSlot(int slot) { } @Override - public void setItem(@NotNull org.bukkit.inventory.EquipmentSlot slot, @Nullable ItemStack item) { + public void setItem(org.bukkit.inventory.EquipmentSlot slot, @Nullable ItemStack item) { switch (slot) { case HAND -> setItemInMainHand(item); case OFF_HAND -> setItemInOffHand(item); diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java index 77539d4e..1d7eb3b4 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java @@ -2,24 +2,26 @@ import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenPlayerInventorySelf extends OpenPlayerInventory { private final int offset; - public OpenPlayerInventorySelf(@NotNull BaseOpenInventory inventory, int offset) { + public OpenPlayerInventorySelf(BaseOpenInventory inventory, int offset) { super(inventory); this.offset = offset; } @Override - public ItemStack getItem(int index) { + public @Nullable ItemStack getItem(int index) { return super.getItem(offset + index); } @Override - public void setItem(int index, ItemStack item) { + public void setItem(int index, @Nullable ItemStack item) { super.setItem(offset + index, item); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java index c4ba77ac..2664bcb2 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java @@ -4,11 +4,12 @@ import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * An interface defining behaviors for entries in a {@link Container}. Used to reduce duplicate content reordering. */ +@NullMarked public interface Content { /** @@ -16,7 +17,7 @@ public interface Content { * * @param holder the new holder */ - void setHolder(@NotNull ServerPlayer holder); + void setHolder(ServerPlayer holder); /** * Get the current item. diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java index dded2653..53eb9fe1 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java @@ -9,20 +9,21 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.List; /** * A slot in a survival crafting inventory. Unavailable when not online in a survival mode. */ +@NullMarked public class ContentCrafting implements Content { private final int index; private ServerPlayer holder; private List items; - public ContentCrafting(@NotNull ServerPlayer holder, int index) { + public ContentCrafting(ServerPlayer holder, int index) { setHolder(holder); this.index = index; } @@ -31,7 +32,7 @@ private boolean isAvailable() { return isAvailable(holder); } - public static boolean isAvailable(@NotNull ServerPlayer holder) { + public static boolean isAvailable(ServerPlayer holder) { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. @@ -39,7 +40,7 @@ public static boolean isAvailable(@NotNull ServerPlayer holder) { } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; // Note: CraftingContainer#getItems is immutable! Be careful with updates. this.items = holder.inventoryMenu.getCraftSlots().getContents(); @@ -108,12 +109,12 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPickup(@NotNull Player player) { + public boolean mayPickup(Player player) { return isAvailable(); } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return isAvailable(); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java index 8c9d0e38..c5315e25 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java @@ -7,16 +7,17 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A slot allowing viewing of the crafting result. * *

Unmodifiable because I said so. Use your own crafting grid.

*/ +@NullMarked public class ContentCraftingResult extends ContentViewOnly { - public ContentCraftingResult(@NotNull ServerPlayer holder) { + public ContentCraftingResult(ServerPlayer holder) { super(holder); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java index 39d1cf55..06f1d710 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java @@ -8,21 +8,22 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A slot wrapping the active menu's cursor. Unavailable when not online in a survival mode. */ +@NullMarked public class ContentCursor implements Content { - private @NotNull ServerPlayer holder; + private ServerPlayer holder; - public ContentCursor(@NotNull ServerPlayer holder) { + public ContentCursor(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -94,12 +95,12 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPickup(@NotNull Player player) { + public boolean mayPickup(Player player) { return isAvailable(); } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return isAvailable(); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java index 8889e771..eefba545 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java @@ -8,7 +8,7 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -17,6 +17,7 @@ /** * A fake slot used to drop items. Unavailable offline. */ +@NullMarked public class ContentDrop implements Content { static final BiConsumer DROP; @@ -47,12 +48,12 @@ public class ContentDrop implements Content { private ServerPlayer holder; - public ContentDrop(@NotNull ServerPlayer holder) { + public ContentDrop(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -101,7 +102,7 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return OpenPlayer.isConnected(holder.connection); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java index 9bc6ff29..77817085 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java @@ -8,11 +8,13 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** * A slot for equipment that displays placeholders if empty. */ +@NullMarked public class ContentEquipment implements Content { private EntityEquipment equipment; @@ -32,7 +34,7 @@ public ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.equipment = holder.getInventory().equipment; } @@ -72,7 +74,7 @@ public InventoryType.SlotType getSlotType() { public class SlotEquipment extends SlotPlaceholder { - private ServerPlayer viewer; + private @Nullable ServerPlayer viewer; SlotEquipment(Container container, int index, int x, int y) { super(container, index, x, y); @@ -96,7 +98,7 @@ public void onlyEquipmentFor(ServerPlayer viewer) { } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { if (viewer == null) { return true; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java index b364602e..c38e8eed 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java @@ -6,17 +6,19 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; +import org.jspecify.annotations.NullMarked; import java.util.List; /** * A normal slot backed by an item list. */ +@NullMarked public abstract class ContentList implements Content { private final int index; private final InventoryType.SlotType slotType; - protected List items; + private List items; public ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotType) { this.index = index; @@ -24,6 +26,13 @@ public ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotTy setHolder(holder); } + @Override + public void setHolder(ServerPlayer holder) { + this.items = getItems(holder); + } + + protected abstract List getItems(ServerPlayer holder); + @Override public ItemStack get() { return items.get(index); @@ -32,7 +41,7 @@ public ItemStack get() { @Override public ItemStack remove() { ItemStack removed = items.remove(index); - return removed == null || removed.isEmpty() ? ItemStack.EMPTY : removed; + return removed.isEmpty() ? ItemStack.EMPTY : removed; } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java index 0719a148..e3ad1b50 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java @@ -8,23 +8,25 @@ import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.Slot; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Objects; /** * A slot for equipment that updates held items if necessary. */ +@NullMarked public class ContentOffHand extends ContentEquipment { private ServerPlayer holder; public ContentOffHand(ServerPlayer holder) { super(holder, EquipmentSlot.OFFHAND); + this.holder = holder; // Redundant, but silences nullity warning. } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { super.setHolder(holder); this.holder = holder; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java index e2063843..4ef2add6 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java @@ -5,21 +5,22 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A view-only slot that can't be interacted with. */ +@NullMarked public class ContentViewOnly implements Content { - protected @NotNull ServerPlayer holder; + protected ServerPlayer holder; - public ContentViewOnly(@NotNull ServerPlayer holder) { + public ContentViewOnly(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java index bd001b0e..e890e747 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java @@ -3,12 +3,14 @@ import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; /** * An implementation of a slot as used by a menu that may have fake placeholder items. * *

Used to prevent plugins (particularly sorting plugins) from adding placeholders to inventories.

*/ +@NullMarked public abstract class SlotPlaceholder extends Slot { public SlotPlaceholder(Container container, int index, int x, int y) { diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java index 204bec86..8095684b 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java @@ -5,16 +5,17 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Optional; /** * A view-only {@link Slot}. "Blank" by default, but can wrap another slot to display its content. */ +@NullMarked public class SlotViewOnly extends SlotPlaceholder { - public static @NotNull SlotViewOnly wrap(@NotNull Slot wrapped) { + public static SlotViewOnly wrap(Slot wrapped) { SlotViewOnly wrapper; if (wrapped instanceof SlotPlaceholder placeholder) { wrapper = new SlotViewOnly(wrapped.container, wrapped.getContainerSlot(), wrapped.x, wrapped.y) { @@ -45,20 +46,20 @@ public ItemStack getOrDefault() { } @Override - public void onQuickCraft(@NotNull ItemStack itemStack1, @NotNull ItemStack itemStack2) { + public void onQuickCraft(ItemStack itemStack1, ItemStack itemStack2) { } @Override - public void onTake(@NotNull Player player, @NotNull ItemStack itemStack) { + public void onTake(Player player, ItemStack itemStack) { } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return false; } @Override - public @NotNull ItemStack getItem() { + public ItemStack getItem() { return ItemStack.EMPTY; } @@ -68,15 +69,15 @@ public boolean hasItem() { } @Override - public void setByPlayer(@NotNull ItemStack newStack) { + public void setByPlayer(ItemStack newStack) { } @Override - public void setByPlayer(@NotNull ItemStack newStack, @NotNull ItemStack oldStack) { + public void setByPlayer(ItemStack newStack, ItemStack oldStack) { } @Override - public void set(@NotNull ItemStack itemStack) { + public void set(ItemStack itemStack) { } @Override @@ -89,17 +90,17 @@ public int getMaxStackSize() { } @Override - public int getMaxStackSize(@NotNull ItemStack itemStack) { + public int getMaxStackSize(ItemStack itemStack) { return 0; } @Override - public @NotNull ItemStack remove(int amount) { + public ItemStack remove(int amount) { return ItemStack.EMPTY; } @Override - public boolean mayPickup(@NotNull Player player) { + public boolean mayPickup(Player player) { return false; } @@ -109,32 +110,32 @@ public boolean isActive() { } @Override - public @NotNull Optional tryRemove(int var0, int var1, @NotNull Player player) { + public Optional tryRemove(int var0, int var1, Player player) { return Optional.empty(); } @Override - public @NotNull ItemStack safeTake(int var0, int var1, @NotNull Player player) { + public ItemStack safeTake(int var0, int var1, Player player) { return ItemStack.EMPTY; } @Override - public @NotNull ItemStack safeClone(@NotNull Player player) { + public ItemStack safeClone(Player player) { return ItemStack.EMPTY; } @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { + public ItemStack safeInsert(ItemStack itemStack) { return itemStack; } @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack, int amount) { + public ItemStack safeInsert(ItemStack itemStack, int amount) { return itemStack; } @Override - public boolean allowModification(@NotNull Player player) { + public boolean allowModification(Player player) { return false; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java index 33c429ab..27224170 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/PlaceholderLoader.java @@ -23,12 +23,13 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.LinkedHashSet; import java.util.List; +@NullMarked public class PlaceholderLoader { public void load(@Nullable ConfigurationSection section) throws Exception { @@ -57,10 +58,10 @@ public void load(@Nullable ConfigurationSection section) throws Exception { Placeholders.BLOCKED_GAME_TYPE.put(GameType.SPECTATOR, parse(section, "blocked.spectator", Placeholders.BLOCKED_GAME_TYPE.get(GameType.SPECTATOR))); } - protected @NotNull ItemStack parse( + protected ItemStack parse( @Nullable ConfigurationSection section, - @NotNull String path, - @NotNull ItemStack defaultStack + String path, + ItemStack defaultStack ) throws Exception { if (section == null) { return defaultStack; @@ -86,15 +87,15 @@ public void load(@Nullable ConfigurationSection section) throws Exception { 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) { + protected void addModelData(ItemStack itemStack) { itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); } - protected void hideTooltip(@NotNull ItemStack itemStack) { + protected void hideTooltip(ItemStack itemStack) { itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); } - protected @NotNull ItemStack defaultCraftingOutput() { + protected ItemStack defaultCraftingOutput() { // Crafting table: "Crafting" ItemStack itemStack = new ItemStack(Items.CRAFTING_TABLE); itemStack.set(DataComponents.ITEM_NAME, Component.translatable("container.crafting")); @@ -102,7 +103,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultCursor() { + protected ItemStack defaultCursor() { // Cursor-like banner with no tooltip ItemStack itemStack = new ItemStack(getDefaultCursorItem()); RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); @@ -122,7 +123,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultDrop() { + protected 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. @@ -131,7 +132,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack getEmptyArmor(@NotNull ItemLike item) { + protected ItemStack getEmptyArmor(ItemLike item) { // Inventory-background-grey-ish leather armor with no tooltip ItemStack itemStack = new ItemStack(item); DyedItemColor color = new DyedItemColor(0xC8C8C8); @@ -141,7 +142,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultShield() { + protected ItemStack defaultShield() { // Shield with "missing texture" pattern, magenta and black squares. ItemStack itemStack = new ItemStack(Items.SHIELD); itemStack.set(DataComponents.BASE_COLOR, DyeColor.MAGENTA); @@ -166,7 +167,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultNotSlot() { + protected ItemStack defaultNotSlot() { // White pane with no tooltip ItemStack itemStack = new ItemStack(getDefaultNotSlotItem()); hideTooltip(itemStack); @@ -174,15 +175,15 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull Item getDefaultCursorItem() { + protected Item getDefaultCursorItem() { return Items.BANNER.white(); } - protected @NotNull Item getDefaultNotSlotItem() { + protected Item getDefaultNotSlotItem() { return Items.STAINED_GLASS_PANE.white(); } - protected @NotNull ItemStack defaultBlockedOffline() { + protected ItemStack defaultBlockedOffline() { // Barrier: "Not available - Offline" ItemStack itemStack = new ItemStack(Items.BARRIER); itemStack.set(DataComponents.ITEM_NAME, diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java index 23c2fbb2..c1761e59 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java @@ -4,29 +4,30 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.EnumMap; +@NullMarked 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; - public static @NotNull ItemStack drop = ItemStack.EMPTY; - public static @NotNull ItemStack emptyHelmet = ItemStack.EMPTY; - public static @NotNull ItemStack emptyChestplate = ItemStack.EMPTY; - public static @NotNull ItemStack emptyLeggings = ItemStack.EMPTY; - public static @NotNull ItemStack emptyBoots = ItemStack.EMPTY; - public static @NotNull ItemStack emptyOffHand = ItemStack.EMPTY; - public static @NotNull ItemStack notSlot = ItemStack.EMPTY; - public static @NotNull ItemStack blockedOffline = ItemStack.EMPTY; - - public static ItemStack survivalOnly(@NotNull ServerPlayer serverPlayer) { + static final EnumMap BLOCKED_GAME_TYPE = new EnumMap<>(GameType.class); + public static ItemStack craftingOutput = ItemStack.EMPTY; + public static ItemStack cursor = ItemStack.EMPTY; + public static ItemStack drop = ItemStack.EMPTY; + public static ItemStack emptyHelmet = ItemStack.EMPTY; + public static ItemStack emptyChestplate = ItemStack.EMPTY; + public static ItemStack emptyLeggings = ItemStack.EMPTY; + public static ItemStack emptyBoots = ItemStack.EMPTY; + public static ItemStack emptyOffHand = ItemStack.EMPTY; + public static ItemStack notSlot = ItemStack.EMPTY; + public static ItemStack blockedOffline = ItemStack.EMPTY; + + public static ItemStack survivalOnly(ServerPlayer serverPlayer) { if (!OpenPlayer.isConnected(serverPlayer.connection)) { return blockedOffline; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java index b7be7be0..22681529 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java @@ -15,9 +15,9 @@ import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.io.IOException; @@ -25,6 +25,7 @@ import java.nio.file.Path; import java.util.Set; +@NullMarked public class OpenPlayer extends CraftPlayer { /** @@ -112,10 +113,10 @@ public void saveData() { } protected void saveSafe( - @NotNull ServerPlayer player, + ServerPlayer player, @Nullable CompoundTag oldData, - @NotNull CompoundTag playerData, - @NotNull PlayerDataStorage worldNbtStorage + CompoundTag playerData, + PlayerDataStorage worldNbtStorage ) throws IOException { // Revert certain special data values when offline. revertSpecialValues(playerData, oldData); @@ -129,15 +130,15 @@ protected void saveSafe( } protected void safeReplaceFile( - @NotNull Path dataFile, - @NotNull Path tempFile, - @NotNull Path backupFile + Path dataFile, + Path tempFile, + Path backupFile ) { net.minecraft.util.Util.safeReplaceFile(dataFile, tempFile, backupFile); } @Contract("null -> new") - protected @NotNull CompoundTag getWritableTag(@Nullable CompoundTag oldData) { + protected CompoundTag getWritableTag(@Nullable CompoundTag oldData) { if (oldData == null) { return new CompoundTag(); } @@ -155,7 +156,7 @@ protected void safeReplaceFile( return oldData; } - protected void revertSpecialValues(@NotNull CompoundTag newData, @Nullable CompoundTag oldData) { + protected void revertSpecialValues(CompoundTag newData, @Nullable CompoundTag oldData) { if (oldData == null) { return; } @@ -167,11 +168,11 @@ protected void revertSpecialValues(@NotNull CompoundTag newData, @Nullable Compo } private void copyValue( - @NotNull CompoundTag source, - @NotNull CompoundTag target, - @NotNull String container, - @NotNull String key, - @SuppressWarnings("SameParameterValue") @NotNull Class tagType + CompoundTag source, + CompoundTag target, + String container, + String key, + @SuppressWarnings("SameParameterValue") Class tagType ) { CompoundTag oldContainer = getTag(source, container, CompoundTag.class); CompoundTag newContainer = getTag(target, container, CompoundTag.class); @@ -187,8 +188,8 @@ private void copyValue( private @Nullable T getTag( @Nullable CompoundTag container, - @NotNull String key, - @NotNull Class dataType + String key, + Class dataType ) { if (container == null) { return null; @@ -201,8 +202,8 @@ private void copyValue( } private void setTag( - @NotNull CompoundTag container, - @NotNull String key, + CompoundTag container, + String key, @Nullable T data ) { if (data == null) { @@ -212,7 +213,7 @@ private void setTag( } } - protected void remove(@NotNull CompoundTag tag, @NotNull String key) { + protected void remove(CompoundTag tag, String key) { tag.remove(key); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java index 2572f1dd..16fba377 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java @@ -16,46 +16,47 @@ 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 org.jspecify.annotations.NullMarked; import java.util.logging.Level; import java.util.logging.Logger; +@NullMarked public class InternalAccessor implements Accessor { - protected final @NotNull Logger logger; - private final @NotNull PlayerManager manager; - private final @NotNull AnySilentContainer anySilentContainer; + protected final Logger logger; + private final PlayerManager manager; + private final AnySilentContainer anySilentContainer; - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + public InternalAccessor(Logger logger, LanguageManager lang) { this.logger = logger; manager = new PlayerManager(logger); anySilentContainer = new AnySilentContainer(logger, lang); } @Override - public @NotNull PlayerManager getPlayerManager() { + public PlayerManager getPlayerManager() { return manager; } @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { + public IAnySilentContainer getAnySilentContainer() { return anySilentContainer; } @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { + public ISpecialPlayerInventory createPlayerInventory(Player player) { return new OpenInventory(player); } @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { + public ISpecialEnderChest createEnderChest(Player player) { return new OpenEnderChest(player); } @Override - public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { + public @Nullable T get(Inventory bukkitInventory, Class clazz) { if (!(bukkitInventory instanceof CraftInventory craftInventory)) { return null; } @@ -67,7 +68,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } @Override - public void reload(@NotNull ConfigurationSection config) { + public void reload(ConfigurationSection config) { ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); try { // Reset placeholders to defaults and try to load configuration. diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java index a33bdaa2..03a0def1 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java @@ -1,8 +1,8 @@ package com.github.jikoo.openinv.internal.spigot26_3.container; -import com.lishid.openinv.internal.AnySilentContainerBase; import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; +import com.lishid.openinv.internal.AnySilentContainerBase; import com.lishid.openinv.util.ReflectionHelper; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.core.BlockPos; @@ -30,19 +30,20 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.util.logging.Logger; +@NullMarked public class AnySilentContainer extends AnySilentContainerBase { - private final @NotNull Logger logger; - private final @NotNull LanguageManager lang; + private final Logger logger; + private final LanguageManager lang; private @Nullable Field serverPlayerGameModeGameType; - public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { + public AnySilentContainer(Logger logger, LanguageManager lang) { this.logger = logger; this.lang = lang; try { @@ -64,9 +65,9 @@ public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) @Override public boolean activateContainer( - @NotNull final Player bukkitPlayer, + final Player bukkitPlayer, final boolean silentchest, - @NotNull final org.bukkit.block.Block bukkitBlock + final org.bukkit.block.Block bukkitBlock ) { // Silent ender chest is API-only @@ -104,7 +105,7 @@ public boolean activateContainer( return true; } - if (!(blockEntity instanceof MenuProvider menuProvider)) { + if (!(blockEntity instanceof @Nullable MenuProvider menuProvider)) { return false; } @@ -162,7 +163,7 @@ public boolean activateContainer( } @Override - public void deactivateContainer(@NotNull final Player bukkitPlayer) { + public void deactivateContainer(final Player bukkitPlayer) { if (this.serverPlayerGameModeGameType == null || bukkitPlayer.getGameMode() == GameMode.SPECTATOR) { return; } @@ -200,12 +201,12 @@ private void forceGameType(final ServerPlayer player, final GameType gameMode) { } @Override - protected org.bukkit.block.BlockState getState(@NotNull org.bukkit.block.Block block) { + protected org.bukkit.block.BlockState getState(org.bukkit.block.Block block) { return block.getState(); } @Override - protected @Nullable InventoryHolder getHolder(@NotNull Inventory inventory) { + protected @Nullable InventoryHolder getHolder(Inventory inventory) { return inventory.getHolder(); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java index 7642f6bf..64991b05 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java @@ -20,37 +20,38 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; +@NullMarked public class OpenEnderChest implements Container, StackedContentsCompatible, InternalOwned, ISpecialEnderChest { - private CraftInventory inventory; - private @NotNull ServerPlayer owner; + private @Nullable CraftInventory inventory; + private ServerPlayer owner; private NonNullList items; private int maxStack = 64; private final List transaction = new ArrayList<>(); - public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { + public OpenEnderChest(org.bukkit.entity.Player player) { this.owner = PlayerManager.getHandle(player); this.items = owner.getEnderChestInventory().items; } @Override - public @NotNull ServerPlayer getOwnerHandle() { + public ServerPlayer getOwnerHandle() { return owner; } @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { + public org.bukkit.inventory.Inventory getBukkitInventory() { if (inventory == null) { inventory = new CraftInventory(this) { @Override - public @NotNull InventoryType getType() { + public InventoryType getType() { return InventoryType.ENDER_CHEST; } }; @@ -59,7 +60,7 @@ public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { } @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { + public void setPlayerOnline(org.bukkit.entity.Player player) { owner = PlayerManager.getHandle(player); NonNullList activeItems = owner.getEnderChestInventory().items; @@ -73,7 +74,7 @@ public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { } @Override - public @NotNull org.bukkit.entity.Player getPlayer() { + public org.bukkit.entity.Player getPlayer() { return owner.getBukkitEntity(); } @@ -88,12 +89,12 @@ public boolean isEmpty() { } @Override - public @NotNull ItemStack getItem(int index) { + public ItemStack getItem(int index) { return index >= 0 && index < items.size() ? items.get(index) : ItemStack.EMPTY; } @Override - public @NotNull ItemStack removeItem(int index, int amount) { + public ItemStack removeItem(int index, int amount) { ItemStack itemstack = ContainerHelper.removeItem(items, index, amount); if (!itemstack.isEmpty()) { @@ -104,12 +105,12 @@ public boolean isEmpty() { } @Override - public @NotNull ItemStack removeItemNoUpdate(int index) { + public 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) { + public void setItem(int index, ItemStack itemStack) { if (index >= 0 && index < items.size()) { items.set(index, itemStack); } @@ -126,32 +127,32 @@ public void setChanged() { } @Override - public boolean stillValid(@NotNull Player player) { + public boolean stillValid(Player player) { return true; } @Override - public @NotNull List getContents() { + public List getContents() { return items; } @Override - public void onOpen(@NotNull CraftHumanEntity craftHumanEntity) { + public void onOpen(CraftHumanEntity craftHumanEntity) { transaction.add(craftHumanEntity); } @Override - public void onClose(@NotNull CraftHumanEntity craftHumanEntity) { + public void onClose(CraftHumanEntity craftHumanEntity) { transaction.remove(craftHumanEntity); } @Override - public @NotNull List getViewers() { + public List getViewers() { return transaction; } @Override - public org.bukkit.entity.@NotNull Player getOwner() { + public org.bukkit.entity.Player getOwner() { return getPlayer(); } @@ -172,7 +173,7 @@ public void clearContent() { } @Override - public void fillStackedContents(@NotNull StackedItemContents stackedContents) { + public void fillStackedContents(StackedItemContents stackedContents) { for (ItemStack itemstack : items) { stackedContents.accountStack(itemstack); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java index 89670f6d..cb9e4f25 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java @@ -36,24 +36,25 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; +@NullMarked public class OpenInventory implements Container, InternalOwned, ISpecialPlayerInventory { protected final List slots; private final int size; protected ServerPlayer owner; private int maxStackSize = 99; - protected CraftInventory bukkitEntity; + protected @Nullable CraftInventory bukkitEntity; public List transaction = new ArrayList<>(); - public OpenInventory(@NotNull org.bukkit.entity.Player bukkitPlayer) { + public OpenInventory(org.bukkit.entity.Player bukkitPlayer) { owner = PlayerManager.getHandle(bukkitPlayer); // Get total size, rounding up to nearest 9 for client compatibility. @@ -117,8 +118,8 @@ private int addMainInventory() { localIndex, new ContentList(owner, invIndex, type) { @Override - public void setHolder(@NotNull ServerPlayer holder) { - items = holder.getInventory().getNonEquipmentItems(); + protected List getItems(ServerPlayer holder) { + return holder.getInventory().getNonEquipmentItems(); } } ); @@ -191,7 +192,7 @@ public ItemStack getOrDefault() { return startIndex + listSize; } - protected Content getCraftingResult(@NotNull ServerPlayer serverPlayer) { + protected Content getCraftingResult(ServerPlayer serverPlayer) { return new ContentCraftingResult(serverPlayer); } @@ -203,7 +204,7 @@ public InventoryType.SlotType getSlotType(int index) { return slots.get(index).getSlotType(); } - public @NotNull Component getTitle(@Nullable ServerPlayer viewer, @Nullable OpenChestMenu menu) { + public Component getTitle(@Nullable ServerPlayer viewer, @Nullable OpenChestMenu menu) { MutableComponent component = Component.empty(); // Prefix for use with custom bitmap image fonts. if (owner.equals(viewer)) { @@ -237,7 +238,7 @@ public ServerPlayer getOwnerHandle() { } @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { + public org.bukkit.inventory.Inventory getBukkitInventory() { if (bukkitEntity == null) { bukkitEntity = new OpenPlayerInventory(this); } @@ -245,7 +246,7 @@ public ServerPlayer getOwnerHandle() { } @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { + public void setPlayerOnline(org.bukkit.entity.Player player) { ServerPlayer newOwner = PlayerManager.getHandle(player); // Only transfer regular inventory - crafting and cursor slots are transient. newOwner.getInventory().replaceWith(owner.getInventory()); @@ -260,7 +261,7 @@ public boolean isInUse() { } @Override - public @NotNull org.bukkit.entity.Player getPlayer() { + public org.bukkit.entity.Player getPlayer() { return getOwner(); } @@ -275,22 +276,22 @@ public boolean isEmpty() { } @Override - public @NotNull ItemStack getItem(int index) { + public ItemStack getItem(int index) { return slots.get(index).get(); } @Override - public @NotNull ItemStack removeItem(int index, int amount) { + public ItemStack removeItem(int index, int amount) { return slots.get(index).removePartial(amount); } @Override - public @NotNull ItemStack removeItemNoUpdate(int index) { + public ItemStack removeItemNoUpdate(int index) { return slots.get(index).remove(); } @Override - public void setItem(int index, @NotNull ItemStack itemStack) { + public void setItem(int index, ItemStack itemStack) { slots.get(index).set(itemStack); } @@ -309,12 +310,12 @@ public void setChanged() { } @Override - public boolean stillValid(@NotNull Player player) { + public boolean stillValid(Player player) { return true; } @Override - public @NotNull List getContents() { + public List getContents() { NonNullList contents = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); for (int i = 0; i < getContainerSize(); ++i) { contents.set(i, getItem(i)); @@ -323,27 +324,27 @@ public boolean stillValid(@NotNull Player player) { } @Override - public void onOpen(@NotNull CraftHumanEntity viewer) { + public void onOpen(CraftHumanEntity viewer) { transaction.add(viewer); } @Override - public void onClose(@NotNull CraftHumanEntity viewer) { + public void onClose(CraftHumanEntity viewer) { transaction.remove(viewer); } @Override - public @NotNull List getViewers() { + public List getViewers() { return transaction; } @Override - public @NotNull org.bukkit.entity.Player getOwner() { + public org.bukkit.entity.Player getOwner() { return owner.getBukkitEntity(); } @Override - public @NotNull Location getLocation() { + public Location getLocation() { return owner.getBukkitEntity().getLocation(); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java index 4ac34c9c..374d828c 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java @@ -6,8 +6,8 @@ import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.HashMap; @@ -16,6 +16,7 @@ /** * A locked down "empty" inventory that rejects plugin interaction. */ +@NullMarked public class OpenDummyInventory extends CraftInventory implements ViewOnly { private final InventoryType type; @@ -26,7 +27,7 @@ public OpenDummyInventory(Container inventory, InventoryType type) { } @Override - public @NotNull InventoryType getType() { + public InventoryType getType() { return type; } @@ -42,18 +43,18 @@ public void setItem(int index, @Nullable ItemStack item) { @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap addItem(@NotNull ItemStack... items) throws IllegalArgumentException { + public HashMap addItem(ItemStack... items) throws IllegalArgumentException { return arrayToHashMap(items); } @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap removeItem(@NotNull ItemStack... items) throws IllegalArgumentException { + public HashMap removeItem(ItemStack... items) throws IllegalArgumentException { return arrayToHashMap(items); } @SuppressWarnings("NonApiType") - private static @NotNull HashMap arrayToHashMap(@NotNull ItemStack[] items) { + private static HashMap arrayToHashMap(ItemStack[] items) { HashMap ignored = new HashMap<>(); for (int index = 0; index < items.length; ++index) { ignored.put(index, items[index]); @@ -62,27 +63,27 @@ public void setItem(int index, @Nullable ItemStack item) { } @Override - public ItemStack @NotNull [] getContents() { + public ItemStack[] getContents() { return new ItemStack[getSize()]; } @Override - public void setContents(@NotNull ItemStack[] items) throws IllegalArgumentException { + public void setContents(ItemStack[] items) throws IllegalArgumentException { } @Override - public @NotNull ItemStack @NotNull [] getStorageContents() { + public ItemStack[] getStorageContents() { return new ItemStack[getSize()]; } @Override - public void setStorageContents(@NotNull ItemStack[] items) throws IllegalArgumentException { + public void setStorageContents(ItemStack[] items) throws IllegalArgumentException { } @Override - public boolean contains(@NotNull Material material) throws IllegalArgumentException { + public boolean contains(Material material) throws IllegalArgumentException { return false; } @@ -92,7 +93,7 @@ public boolean contains(@Nullable ItemStack item) { } @Override - public boolean contains(@NotNull Material material, int amount) throws IllegalArgumentException { + public boolean contains(Material material, int amount) throws IllegalArgumentException { return false; } @@ -108,25 +109,25 @@ public boolean containsAtLeast(@Nullable ItemStack item, int amount) { @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap all( - @NotNull Material material + public HashMap all( + Material material ) throws IllegalArgumentException { return new HashMap<>(); } @SuppressWarnings("NonApiType") @Override - public @NotNull HashMap all(@Nullable ItemStack item) { + public HashMap all(@Nullable ItemStack item) { return new HashMap<>(); } @Override - public int first(@NotNull Material material) throws IllegalArgumentException { + public int first(Material material) throws IllegalArgumentException { return -1; } @Override - public int first(@NotNull ItemStack item) { + public int first(ItemStack item) { return -1; } @@ -141,12 +142,12 @@ public boolean isEmpty() { } @Override - public void remove(@NotNull Material material) throws IllegalArgumentException { + public void remove(Material material) throws IllegalArgumentException { } @Override - public void remove(@NotNull ItemStack item) { + public void remove(ItemStack item) { } @@ -161,12 +162,12 @@ public void clear() { } @Override - public @NotNull ListIterator iterator() { + public ListIterator iterator() { return Collections.emptyListIterator(); } @Override - public @NotNull ListIterator iterator(int index) { + public ListIterator iterator(int index) { return Collections.emptyListIterator(); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java index 89b70d9f..270f3e3a 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyPlayerInventory.java @@ -7,9 +7,10 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenDummyPlayerInventory extends OpenDummyInventory implements PlayerInventory { public OpenDummyPlayerInventory(Container inventory) { @@ -22,12 +23,12 @@ public HumanEntity getHolder() { } @Override - public @NotNull ItemStack @NotNull [] getArmorContents() { + public ItemStack[] getArmorContents() { return new ItemStack[4]; } @Override - public @NotNull ItemStack @NotNull [] getExtraContents() { + public ItemStack[] getExtraContents() { return new ItemStack[4]; } @@ -52,22 +53,22 @@ public HumanEntity getHolder() { } @Override - public void setItem(@NotNull EquipmentSlot slot, @Nullable ItemStack item) { + public void setItem(EquipmentSlot slot, @Nullable ItemStack item) { } @Override - public @NotNull ItemStack getItem(@NotNull EquipmentSlot slot) { + public ItemStack getItem(EquipmentSlot slot) { return new ItemStack(Material.AIR); } @Override - public void setArmorContents(ItemStack @NotNull [] items) { + public void setArmorContents(ItemStack[] items) { } @Override - public void setExtraContents(ItemStack @NotNull [] items) { + public void setExtraContents(ItemStack[] items) { } @@ -92,7 +93,7 @@ public void setBoots(@Nullable ItemStack boots) { } @Override - public @NotNull ItemStack getItemInMainHand() { + public ItemStack getItemInMainHand() { return new ItemStack(Material.AIR); } @@ -102,7 +103,7 @@ public void setItemInMainHand(@Nullable ItemStack item) { } @Override - public @NotNull ItemStack getItemInOffHand() { + public ItemStack getItemInOffHand() { return new ItemStack(Material.AIR); } @@ -114,7 +115,7 @@ public void setItemInOffHand(@Nullable ItemStack item) { @SuppressWarnings("InlineMeSuggester") @Deprecated @Override - public @NotNull ItemStack getItemInHand() { + public ItemStack getItemInHand() { return new ItemStack(Material.AIR); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java index daa78462..89f4cbfe 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventory.java @@ -1,7 +1,7 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; -import com.google.common.base.Preconditions; import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; +import com.google.common.base.Preconditions; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Inventory; import org.bukkit.craftbukkit.inventory.CraftInventory; @@ -10,22 +10,23 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenPlayerInventory extends CraftInventory implements PlayerInventory { - public OpenPlayerInventory(@NotNull OpenInventory inventory) { + public OpenPlayerInventory(OpenInventory inventory) { super(inventory); } @Override - public @NotNull OpenInventory getInventory() { + public OpenInventory getInventory() { return (OpenInventory) super.getInventory(); } @Override - public ItemStack @NotNull [] getContents() { + public ItemStack[] getContents() { return asCraftMirror(getInventory().getOwnerHandle().getInventory().getContents()); } @@ -45,7 +46,7 @@ public void setContents(ItemStack[] items) { } @Override - public ItemStack @NotNull [] getStorageContents() { + public ItemStack[] getStorageContents() { return asCraftMirror(getInventory().getOwnerHandle().getInventory().getNonEquipmentItems()); } @@ -60,32 +61,32 @@ public void setStorageContents(ItemStack[] items) throws IllegalArgumentExceptio } @Override - public @NotNull InventoryType getType() { + public InventoryType getType() { return InventoryType.PLAYER; } @Override - public @NotNull Player getHolder() { + public Player getHolder() { return getInventory().getOwner(); } @Override - public @NotNull ItemStack @NotNull [] getArmorContents() { + public ItemStack[] getArmorContents() { return getInventory().getOwnerHandle().getBukkitEntity().getInventory().getArmorContents(); } @Override - public void setArmorContents(ItemStack @NotNull [] items) { + public void setArmorContents(ItemStack[] items) { getInventory().getOwnerHandle().getBukkitEntity().getInventory().setArmorContents(items); } @Override - public @NotNull ItemStack @NotNull [] getExtraContents() { + public ItemStack[] getExtraContents() { return getInventory().getOwnerHandle().getBukkitEntity().getInventory().getExtraContents(); } @Override - public void setExtraContents(ItemStack @NotNull [] items) { + public void setExtraContents(ItemStack[] items) { getInventory().getOwnerHandle().getBukkitEntity().getInventory().setExtraContents(items); } @@ -130,7 +131,7 @@ public void setBoots(@Nullable ItemStack boots) { } @Override - public @NotNull ItemStack getItemInMainHand() { + public ItemStack getItemInMainHand() { Inventory internal = getInventory().getOwnerHandle().getInventory(); return CraftItemStack.asCraftMirror(internal.getSelectedItem()); } @@ -142,7 +143,7 @@ public void setItemInMainHand(@Nullable ItemStack item) { } @Override - public @NotNull ItemStack getItemInOffHand() { + public ItemStack getItemInOffHand() { return getInventory().getOwnerHandle().getBukkitEntity().getInventory().getItemInOffHand(); } @@ -154,7 +155,7 @@ public void setItemInOffHand(@Nullable ItemStack item) { @SuppressWarnings("InlineMeSuggester") @Deprecated @Override - public @NotNull ItemStack getItemInHand() { + public ItemStack getItemInHand() { return getItemInMainHand(); } @@ -178,12 +179,12 @@ public void setHeldItemSlot(int slot) { } @Override - public @Nullable ItemStack getItem(@NotNull org.bukkit.inventory.EquipmentSlot slot) { + public @Nullable ItemStack getItem(org.bukkit.inventory.EquipmentSlot slot) { return getInventory().getOwnerHandle().getBukkitEntity().getInventory().getItem(slot); } @Override - public void setItem(@NotNull org.bukkit.inventory.EquipmentSlot slot, @Nullable ItemStack item) { + public void setItem(org.bukkit.inventory.EquipmentSlot slot, @Nullable ItemStack item) { getInventory().getOwnerHandle().getBukkitEntity().getInventory().setItem(slot, item); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java index 51e6ebef..02ef39d5 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java @@ -2,24 +2,26 @@ import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenPlayerInventorySelf extends OpenPlayerInventory { private final int offset; - public OpenPlayerInventorySelf(@NotNull OpenInventory inventory, int offset) { + public OpenPlayerInventorySelf(OpenInventory inventory, int offset) { super(inventory); this.offset = offset; } @Override - public ItemStack getItem(int index) { + public @Nullable ItemStack getItem(int index) { return super.getItem(offset + index); } @Override - public void setItem(int index, ItemStack item) { + public void setItem(int index, @Nullable ItemStack item) { super.setItem(offset + index, item); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java index 695f57fd..c75b8d93 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java @@ -17,12 +17,13 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** * An extension of {@link AbstractContainerMenu} storing and managing data common to all special inventories. */ +@NullMarked public abstract class OpenChestMenu> extends AbstractContainerMenu { @@ -33,13 +34,13 @@ public abstract class OpenChestMenu, Inventory> bukkitEntity; + private @Nullable CraftInventoryView, Inventory> bukkitEntity; protected OpenChestMenu( - @NotNull MenuType type, + MenuType type, int containerCounter, - @NotNull T container, - @NotNull ServerPlayer viewer, + T container, + ServerPlayer viewer, boolean viewOnly ) { super(type, containerCounter); @@ -90,7 +91,7 @@ protected OpenChestMenu( } } - public static @NotNull MenuType getChestMenuType(int inventorySize) { + public static MenuType getChestMenuType(int inventorySize) { inventorySize = ((int) Math.ceil(inventorySize / 9.0)) * 9; return switch (inventorySize) { case 9 -> MenuType.GENERIC_9x1; @@ -107,7 +108,7 @@ protected OpenChestMenu( protected void preSlotSetup() { } - protected @NotNull Slot getUpperSlot(int index, int x, int y) { + protected Slot getUpperSlot(int index, int x, int y) { Slot slot = new Slot(container, index, x, y); if (viewOnly) { return SlotViewOnly.wrap(slot); @@ -120,7 +121,7 @@ public boolean isViewOnly() { } @Override - public final @NotNull CraftInventoryView, Inventory> getBukkitView() { + public final CraftInventoryView, Inventory> getBukkitView() { if (bukkitEntity == null) { bukkitEntity = createBukkitEntity(); } @@ -128,7 +129,7 @@ public boolean isViewOnly() { return bukkitEntity; } - protected @NotNull CraftInventoryView, Inventory> createBukkitEntity() { + protected CraftInventoryView, Inventory> createBukkitEntity() { Inventory top; if (viewOnly) { top = new OpenDummyInventory(container, container.getBukkitType()); @@ -153,7 +154,7 @@ public int convertSlot(int rawSlot) { } @Override - public @NotNull InventoryType.SlotType getSlotType(int slot) { + public InventoryType.SlotType getSlotType(int slot) { if (viewOnly) { return InventoryType.SlotType.OUTSIDE; } @@ -270,7 +271,7 @@ private static boolean addToExistingStack(ItemStack itemStack, Slot slot) { } @Override - public void clicked(int i, int j, @NotNull ContainerInput clickType, @NotNull Player player) { + public void clicked(int i, int j, ContainerInput clickType, Player player) { if (viewOnly) { if (clickType == ContainerInput.QUICK_CRAFT) { sendAllDataToRemote(); @@ -281,7 +282,7 @@ public void clicked(int i, int j, @NotNull ContainerInput clickType, @NotNull Pl } @Override - public boolean stillValid(@NotNull Player player) { + public boolean stillValid(Player player) { return true; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java index 7028c37f..c0c4dfd6 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java @@ -5,13 +5,14 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class OpenEnderChestMenu extends OpenSyncMenu { public OpenEnderChestMenu( - @NotNull OpenEnderChest enderChest, - @NotNull ServerPlayer viewer, + OpenEnderChest enderChest, + ServerPlayer viewer, int containerId, boolean viewOnly ) { @@ -19,7 +20,7 @@ public OpenEnderChestMenu( } @Override - public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { + public ItemStack quickMoveStack(Player player, int index) { if (viewOnly) { return ItemStack.EMPTY; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java index f79b60e8..df8f73e8 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java @@ -1,13 +1,13 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.menu; -import com.google.common.base.Preconditions; -import com.lishid.openinv.util.Permissions; import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenDummyPlayerInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenPlayerInventorySelf; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentDrop; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentEquipment; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotViewOnly; +import com.google.common.base.Preconditions; +import com.lishid.openinv.util.Permissions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; @@ -20,9 +20,10 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class OpenInventoryMenu extends OpenSyncMenu { private int offset; @@ -48,7 +49,7 @@ protected void preSlotSetup() { } @Override - protected @NotNull Slot getUpperSlot(int index, int x, int y) { + protected Slot getUpperSlot(int index, int x, int y) { index += offset; Slot slot = container.getMenuSlot(index, x, y); @@ -99,7 +100,7 @@ protected void preSlotSetup() { } @Override - protected @NotNull CraftInventoryView, Inventory> createBukkitEntity() { + protected CraftInventoryView, Inventory> createBukkitEntity() { Inventory bukkitInventory; if (viewOnly) { bukkitInventory = new OpenDummyPlayerInventory(container); @@ -176,7 +177,7 @@ public int convertSlot(int rawSlot) { } @Override - public @NotNull InventoryType.SlotType getSlotType(int slot) { + public InventoryType.SlotType getSlotType(int slot) { if (viewOnly || slot < 0) { return InventoryType.SlotType.OUTSIDE; } @@ -198,7 +199,7 @@ public int countSlots() { } @Override - public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { + public ItemStack quickMoveStack(Player player, int index) { if (viewOnly) { return ItemStack.EMPTY; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java index 3cc44fec..017f48fa 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java @@ -1,9 +1,9 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.menu; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotPlaceholder; 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_3.container.slot.SlotPlaceholder; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.network.HashedStack; @@ -18,8 +18,8 @@ import net.minecraft.world.inventory.RemoteSlot; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -28,6 +28,7 @@ /** * An extension of {@link OpenChestMenu} that supports {@link SlotPlaceholder placeholders}. */ +@NullMarked @SuppressWarnings("HidingField") // Revisit when removing 1.21.4 support public abstract class OpenSyncMenu> extends OpenChestMenu { @@ -41,10 +42,10 @@ public abstract class OpenSyncMenu type, + MenuType type, int containerCounter, - @NotNull T container, - @NotNull ServerPlayer viewer, + T container, + ServerPlayer viewer, boolean viewOnly ) { super(type, containerCounter, container, viewer, viewOnly); @@ -52,7 +53,7 @@ protected OpenSyncMenu( // Overrides from here on are purely to modify the sync process to send placeholder items. @Override - protected @NotNull Slot addSlot(@NotNull Slot slot) { + protected Slot addSlot(Slot slot) { slot.index = this.slots.size(); this.slots.add(slot); this.lastSlots.add(ItemStack.EMPTY); @@ -61,7 +62,7 @@ protected OpenSyncMenu( } @Override - protected @NotNull DataSlot addDataSlot(@NotNull DataSlot dataSlot) { + protected DataSlot addDataSlot(DataSlot dataSlot) { this.dataSlots.add(dataSlot); this.remoteDataSlots.add(0); return dataSlot; @@ -75,7 +76,7 @@ protected void addDataSlots(ContainerData containerData) { } @Override - public void addSlotListener(@NotNull ContainerListener containerListener) { + public void addSlotListener(ContainerListener containerListener) { if (!this.containerListeners.contains(containerListener)) { this.containerListeners.add(containerListener); this.broadcastChanges(); @@ -83,7 +84,7 @@ public void addSlotListener(@NotNull ContainerListener containerListener) { } @Override - public void setSynchronizer(@NotNull ContainerSynchronizer containerSynchronizer) { + public void setSynchronizer(ContainerSynchronizer containerSynchronizer) { this.synchronizer = containerSynchronizer; this.remoteCarried = synchronizer.createSlot(); this.remoteSlots.replaceAll(slot -> synchronizer.createSlot()); @@ -121,7 +122,7 @@ public void broadcastCarriedItem() { } @Override - public void removeSlotListener(@NotNull ContainerListener containerListener) { + public void removeSlotListener(ContainerListener containerListener) { this.containerListeners.remove(containerListener); } @@ -171,7 +172,7 @@ private void updateDataSlotListeners(int i, int j) { } } - private void triggerSlotListeners(int index, @NotNull ItemStack itemStack, @NotNull Supplier supplier) { + private void triggerSlotListeners(int index, ItemStack itemStack, Supplier supplier) { ItemStack itemStack1 = this.lastSlots.get(index); if (!ItemStack.matches(itemStack1, itemStack)) { ItemStack itemStack2 = supplier.get(); @@ -183,7 +184,7 @@ private void triggerSlotListeners(int index, @NotNull ItemStack itemStack, @NotN } } - private void synchronizeSlotToRemote(int i, @NotNull ItemStack itemStack, @NotNull Supplier supplier) { + private void synchronizeSlotToRemote(int i, ItemStack itemStack, Supplier supplier) { if (!this.suppressRemoteUpdates) { RemoteSlot slot = this.remoteSlots.get(i); if (!slot.matches(itemStack)) { @@ -220,7 +221,7 @@ private void synchronizeCarriedToRemote() { } @Override - public void setRemoteCarried(@NotNull HashedStack stack) { + public void setRemoteCarried(HashedStack stack) { this.remoteCarried.receive(stack); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java index 210f0093..7fbda6f7 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java @@ -4,11 +4,12 @@ import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * An interface defining behaviors for entries in a {@link Container}. Used to reduce duplicate content reordering. */ +@NullMarked public interface Content { /** @@ -16,7 +17,7 @@ public interface Content { * * @param holder the new holder */ - void setHolder(@NotNull ServerPlayer holder); + void setHolder(ServerPlayer holder); /** * Get the current item. diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java index e47e58ae..7b071b31 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java @@ -9,20 +9,21 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.List; /** * A slot in a survival crafting inventory. Unavailable when not online in a survival mode. */ +@NullMarked public class ContentCrafting implements Content { private final int index; private ServerPlayer holder; private List items; - public ContentCrafting(@NotNull ServerPlayer holder, int index) { + public ContentCrafting(ServerPlayer holder, int index) { setHolder(holder); this.index = index; } @@ -31,7 +32,7 @@ private boolean isAvailable() { return isAvailable(holder); } - public static boolean isAvailable(@NotNull ServerPlayer holder) { + public static boolean isAvailable(ServerPlayer holder) { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. @@ -39,7 +40,7 @@ public static boolean isAvailable(@NotNull ServerPlayer holder) { } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; // Note: CraftingContainer#getItems is immutable! Be careful with updates. this.items = holder.inventoryMenu.getCraftSlots().getContents(); @@ -108,12 +109,12 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPickup(@NotNull Player player) { + public boolean mayPickup(Player player) { return isAvailable(); } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return isAvailable(); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java index 7385e8a4..44271f02 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java @@ -7,16 +7,17 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A slot allowing viewing of the crafting result. * *

Unmodifiable because I said so. Use your own crafting grid.

*/ +@NullMarked public class ContentCraftingResult extends ContentViewOnly { - public ContentCraftingResult(@NotNull ServerPlayer holder) { + public ContentCraftingResult(ServerPlayer holder) { super(holder); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java index f743c641..0bd6d4b0 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java @@ -8,21 +8,22 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A slot wrapping the active menu's cursor. Unavailable when not online in a survival mode. */ +@NullMarked public class ContentCursor implements Content { - private @NotNull ServerPlayer holder; + private ServerPlayer holder; - public ContentCursor(@NotNull ServerPlayer holder) { + public ContentCursor(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -94,12 +95,12 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPickup(@NotNull Player player) { + public boolean mayPickup(Player player) { return isAvailable(); } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return isAvailable(); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java index be54b1f3..0513748a 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java @@ -8,7 +8,7 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -17,6 +17,7 @@ /** * A fake slot used to drop items. Unavailable offline. */ +@NullMarked public class ContentDrop implements Content { static final BiConsumer DROP; @@ -47,12 +48,12 @@ public class ContentDrop implements Content { private ServerPlayer holder; - public ContentDrop(@NotNull ServerPlayer holder) { + public ContentDrop(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -101,7 +102,7 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return OpenPlayer.isConnected(holder.connection); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java index c3ef293b..2220643c 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java @@ -10,8 +10,9 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class ContentEquipment implements Content { private PlayerInventory equipment; @@ -31,7 +32,7 @@ public ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.equipment = holder.getBukkitEntity().getInventory(); } @@ -102,7 +103,7 @@ public void onlyEquipmentFor(ServerPlayer viewer) { } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { if (viewer == null) { return true; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java index adf86220..69677936 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java @@ -6,12 +6,14 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; +import org.jspecify.annotations.NullMarked; import java.util.List; /** * A normal slot backed by an item list. */ +@NullMarked public abstract class ContentList implements Content { private final int index; @@ -24,6 +26,13 @@ public ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotTy setHolder(holder); } + @Override + public void setHolder(ServerPlayer holder) { + this.items = getItems(holder); + } + + protected abstract List getItems(ServerPlayer holder); + @Override public ItemStack get() { return items.get(index); diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java index bd99fa47..a5ff58a7 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java @@ -8,20 +8,22 @@ import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.Slot; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Objects; +@NullMarked public class ContentOffHand extends ContentEquipment { private ServerPlayer holder; public ContentOffHand(ServerPlayer holder) { super(holder, EquipmentSlot.OFFHAND); + this.holder = holder; // Redundant, but silences nullity warning. } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { super.setHolder(holder); this.holder = holder; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java index aaa4874a..4ec2987e 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java @@ -5,21 +5,22 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A view-only slot that can't be interacted with. */ +@NullMarked public class ContentViewOnly implements Content { - protected @NotNull ServerPlayer holder; + protected ServerPlayer holder; - public ContentViewOnly(@NotNull ServerPlayer holder) { + public ContentViewOnly(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java index 9343670f..e7a37bd9 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java @@ -3,12 +3,14 @@ import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; /** * An implementation of a slot as used by a menu that may have fake placeholder items. * *

Used to prevent plugins (particularly sorting plugins) from adding placeholders to inventories.

*/ +@NullMarked public abstract class SlotPlaceholder extends Slot { public SlotPlaceholder(Container container, int index, int x, int y) { diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java index e66d81e0..189a74aa 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java @@ -5,16 +5,17 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Optional; /** * A view-only {@link Slot}. "Blank" by default, but can wrap another slot to display its content. */ +@NullMarked public class SlotViewOnly extends SlotPlaceholder { - public static @NotNull SlotViewOnly wrap(@NotNull Slot wrapped) { + public static SlotViewOnly wrap(Slot wrapped) { SlotViewOnly wrapper; if (wrapped instanceof SlotPlaceholder placeholder) { wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { @@ -45,20 +46,20 @@ public ItemStack getOrDefault() { } @Override - public void onQuickCraft(@NotNull ItemStack itemStack1, @NotNull ItemStack itemStack2) { + public void onQuickCraft(ItemStack itemStack1, ItemStack itemStack2) { } @Override - public void onTake(@NotNull Player player, @NotNull ItemStack itemStack) { + public void onTake(Player player, ItemStack itemStack) { } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { + public boolean mayPlace(ItemStack itemStack) { return false; } @Override - public @NotNull ItemStack getItem() { + public ItemStack getItem() { return ItemStack.EMPTY; } @@ -68,15 +69,15 @@ public boolean hasItem() { } @Override - public void setByPlayer(@NotNull ItemStack newStack) { + public void setByPlayer(ItemStack newStack) { } @Override - public void setByPlayer(@NotNull ItemStack newStack, @NotNull ItemStack oldStack) { + public void setByPlayer(ItemStack newStack, ItemStack oldStack) { } @Override - public void set(@NotNull ItemStack itemStack) { + public void set(ItemStack itemStack) { } @Override @@ -89,17 +90,17 @@ public int getMaxStackSize() { } @Override - public int getMaxStackSize(@NotNull ItemStack itemStack) { + public int getMaxStackSize(ItemStack itemStack) { return 0; } @Override - public @NotNull ItemStack remove(int amount) { + public ItemStack remove(int amount) { return ItemStack.EMPTY; } @Override - public boolean mayPickup(@NotNull Player player) { + public boolean mayPickup(Player player) { return false; } @@ -109,32 +110,32 @@ public boolean isActive() { } @Override - public @NotNull Optional tryRemove(int var0, int var1, @NotNull Player player) { + public Optional tryRemove(int var0, int var1, Player player) { return Optional.empty(); } @Override - public @NotNull ItemStack safeTake(int var0, int var1, @NotNull Player player) { + public ItemStack safeTake(int var0, int var1, Player player) { return ItemStack.EMPTY; } @Override - public @NotNull ItemStack safeClone(@NotNull Player player) { + public ItemStack safeClone(Player player) { return ItemStack.EMPTY; } @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { + public ItemStack safeInsert(ItemStack itemStack) { return itemStack; } @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack, int amount) { + public ItemStack safeInsert(ItemStack itemStack, int amount) { return itemStack; } @Override - public boolean allowModification(@NotNull Player player) { + public boolean allowModification(Player player) { return false; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java index fbf5a03d..ff4b48c7 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoader.java @@ -2,17 +2,18 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class PlaceholderLoader extends PlaceholderLoaderBase { @Override - protected @NotNull Item getWhiteBanner() { + protected Item getWhiteBanner() { return Items.BANNER.white(); } @Override - protected @NotNull Item getWhiteGlassPane() { + protected Item getWhiteGlassPane() { return Items.STAINED_GLASS_PANE.white(); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java index a52e66bf..cf9a08f8 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/PlaceholderLoaderBase.java @@ -23,12 +23,13 @@ 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 org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.LinkedHashSet; import java.util.List; +@NullMarked public abstract class PlaceholderLoaderBase { private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(List.of(), List.of(), List.of("openinv:custom"), List.of()); @@ -60,10 +61,10 @@ public void load(@Nullable ConfigurationSection section) throws Exception { Placeholders.BLOCKED_GAME_TYPE.put(GameType.SPECTATOR, parse(section, "blocked.spectator", Placeholders.BLOCKED_GAME_TYPE.get(GameType.SPECTATOR))); } - protected @NotNull ItemStack parse( + protected ItemStack parse( @Nullable ConfigurationSection section, - @NotNull String path, - @NotNull ItemStack defaultStack + String path, + ItemStack defaultStack ) throws Exception { if (section == null) { return defaultStack; @@ -86,15 +87,15 @@ public void load(@Nullable ConfigurationSection section) throws Exception { return itemStack == null ? defaultStack : itemStack; } - protected void addModelData(@NotNull ItemStack itemStack) { + protected void addModelData(ItemStack itemStack) { itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); } - protected void hideTooltip(@NotNull ItemStack itemStack) { + protected void hideTooltip(ItemStack itemStack) { itemStack.set(DataComponents.TOOLTIP_DISPLAY, HIDE_TOOLTIP); } - protected @NotNull ItemStack defaultCraftingOutput() { + protected ItemStack defaultCraftingOutput() { // Crafting table: "Crafting" ItemStack itemStack = new ItemStack(Items.CRAFTING_TABLE); itemStack.set(DataComponents.ITEM_NAME, Component.translatable("container.crafting")); @@ -102,7 +103,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultCursor() { + protected ItemStack defaultCursor() { // Cursor-like banner with no tooltip ItemStack itemStack = new ItemStack(getWhiteBanner()); RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); @@ -122,9 +123,9 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected abstract @NotNull Item getWhiteBanner(); + protected abstract Item getWhiteBanner(); - protected @NotNull ItemStack defaultDrop() { + protected 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. @@ -133,7 +134,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack getEmptyArmor(@NotNull ItemLike item) { + protected ItemStack getEmptyArmor(ItemLike item) { // Inventory-background-grey-ish leather armor with no tooltip ItemStack itemStack = new ItemStack(item); DyedItemColor color = new DyedItemColor(0xC8C8C8); @@ -143,7 +144,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultShield() { + protected ItemStack defaultShield() { // Shield with "missing texture" pattern, magenta and black squares. ItemStack itemStack = new ItemStack(Items.SHIELD); itemStack.set(DataComponents.BASE_COLOR, DyeColor.MAGENTA); @@ -168,7 +169,7 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected @NotNull ItemStack defaultNotSlot() { + protected ItemStack defaultNotSlot() { // White pane with no tooltip ItemStack itemStack = new ItemStack(getWhiteGlassPane()); hideTooltip(itemStack); @@ -176,9 +177,9 @@ protected void hideTooltip(@NotNull ItemStack itemStack) { return itemStack; } - protected abstract @NotNull Item getWhiteGlassPane(); + protected abstract Item getWhiteGlassPane(); - protected @NotNull ItemStack defaultBlockedOffline() { + protected ItemStack defaultBlockedOffline() { // Barrier: "Not available - Offline" ItemStack itemStack = new ItemStack(Items.BARRIER); itemStack.set(DataComponents.ITEM_NAME, diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java index b26005e8..e494f154 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java @@ -4,25 +4,26 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.EnumMap; +@NullMarked public final class 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; - public static @NotNull ItemStack drop = ItemStack.EMPTY; - public static @NotNull ItemStack emptyHelmet = ItemStack.EMPTY; - public static @NotNull ItemStack emptyChestplate = ItemStack.EMPTY; - public static @NotNull ItemStack emptyLeggings = ItemStack.EMPTY; - public static @NotNull ItemStack emptyBoots = ItemStack.EMPTY; - public static @NotNull ItemStack emptyOffHand = ItemStack.EMPTY; - public static @NotNull ItemStack notSlot = ItemStack.EMPTY; - public static @NotNull ItemStack blockedOffline = ItemStack.EMPTY; - - public static ItemStack survivalOnly(@NotNull ServerPlayer serverPlayer) { + static final EnumMap BLOCKED_GAME_TYPE = new EnumMap<>(GameType.class); + public static ItemStack craftingOutput = ItemStack.EMPTY; + public static ItemStack cursor = ItemStack.EMPTY; + public static ItemStack drop = ItemStack.EMPTY; + public static ItemStack emptyHelmet = ItemStack.EMPTY; + public static ItemStack emptyChestplate = ItemStack.EMPTY; + public static ItemStack emptyLeggings = ItemStack.EMPTY; + public static ItemStack emptyBoots = ItemStack.EMPTY; + public static ItemStack emptyOffHand = ItemStack.EMPTY; + public static ItemStack notSlot = ItemStack.EMPTY; + public static ItemStack blockedOffline = ItemStack.EMPTY; + + public static ItemStack survivalOnly(ServerPlayer serverPlayer) { if (!OpenPlayer.isConnected(serverPlayer.connection)) { return blockedOffline; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java index 48b53e7d..199a40d4 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java @@ -16,9 +16,9 @@ import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; +import org.jspecify.annotations.NullMarked; import org.slf4j.Logger; import java.lang.reflect.Field; @@ -26,6 +26,7 @@ import java.nio.file.Path; import java.util.Set; +@NullMarked public class OpenPlayer extends CraftPlayer { /** @@ -128,7 +129,7 @@ public void saveData() { } @Contract("null -> new") - protected @NotNull CompoundTag getWritableTag(@Nullable CompoundTag oldData) { + protected CompoundTag getWritableTag(@Nullable CompoundTag oldData) { if (oldData == null) { return new CompoundTag(); } @@ -146,7 +147,7 @@ public void saveData() { return oldData; } - protected void revertSpecialValues(@NotNull CompoundTag newData, @NotNull CompoundTag oldData) { + protected void revertSpecialValues(CompoundTag newData, CompoundTag oldData) { // Revert automatic updates to play timestamps. copyValue(oldData, newData, "bukkit", "lastPlayed", NumericTag.class); copyValue(oldData, newData, "Paper", "LastSeen", NumericTag.class); @@ -154,11 +155,11 @@ protected void revertSpecialValues(@NotNull CompoundTag newData, @NotNull Compou } private void copyValue( - @NotNull CompoundTag source, - @NotNull CompoundTag target, - @NotNull String container, - @NotNull String key, - @SuppressWarnings("SameParameterValue") @NotNull Class tagType + CompoundTag source, + CompoundTag target, + String container, + String key, + @SuppressWarnings("SameParameterValue") Class tagType ) { CompoundTag oldContainer = getTag(source, container, CompoundTag.class); CompoundTag newContainer = getTag(target, container, CompoundTag.class); @@ -174,8 +175,8 @@ private void copyValue( private @Nullable T getTag( @Nullable CompoundTag container, - @NotNull String key, - @NotNull Class dataType + String key, + Class dataType ) { if (container == null) { return null; @@ -188,8 +189,8 @@ private void copyValue( } private void setTag( - @NotNull CompoundTag container, - @NotNull String key, + CompoundTag container, + String key, @Nullable T data ) { if (data == null) { diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java index f39f1481..d07df82b 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java @@ -32,18 +32,19 @@ import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.util.logging.Logger; +@NullMarked public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { - private final @NotNull Logger logger; + private final Logger logger; private @Nullable Field bukkitEntity; - public PlayerManager(@NotNull Logger logger) { + public PlayerManager(Logger logger) { this.logger = logger; try { bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); @@ -54,7 +55,7 @@ public PlayerManager(@NotNull Logger logger) { } } - public static @NotNull ServerPlayer getHandle(final Player player) { + public static ServerPlayer getHandle(final Player player) { if (player instanceof CraftPlayer craftPlayer) { return craftPlayer.getHandle(); } @@ -75,7 +76,7 @@ public PlayerManager(@NotNull Logger logger) { } @Override - public @Nullable Player loadPlayer(@NotNull final OfflinePlayer offline) { + public @Nullable Player loadPlayer(final OfflinePlayer offline) { if (!(Bukkit.getServer() instanceof CraftServer craftServer)) { return null; } @@ -102,10 +103,10 @@ public PlayerManager(@NotNull Logger logger) { return null; } - private @NotNull ServerPlayer createNewPlayer( - @NotNull MinecraftServer server, - @NotNull ServerLevel worldServer, - @NotNull final OfflinePlayer offline + private 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) @@ -140,11 +141,11 @@ public PlayerManager(@NotNull Logger logger) { return entity; } - protected void removeListeners(@NotNull PlayerAdvancements advancements) { + protected void removeListeners(PlayerAdvancements advancements) { advancements.clearTriggers(); } - boolean loadData(@NotNull ServerPlayer player) { + boolean loadData(ServerPlayer player) { // See CraftPlayer#loadData try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), new JulLoggerAdapter(logger))) { @@ -175,7 +176,7 @@ private void injectPlayer(ServerPlayer player) throws IllegalAccessException { } @Override - public @NotNull Player inject(@NotNull Player player) { + public Player inject(Player player) { try { ServerPlayer nmsPlayer = getHandle(player); if (nmsPlayer.getBukkitEntity() instanceof OpenPlayer openPlayer) { @@ -210,7 +211,7 @@ private void injectPlayer(ServerPlayer player) throws IllegalAccessException { @Override public @Nullable InventoryView openInventory( - @NotNull Player bukkitPlayer, @NotNull ISpecialInventory inventory, + Player bukkitPlayer, ISpecialInventory inventory, boolean viewOnly ) { ServerPlayer player = getHandle(bukkitPlayer); diff --git a/plugin/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java index 5ab6999f..d28deb80 100644 --- a/plugin/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -49,8 +49,9 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; import org.bukkit.plugin.PluginManager; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.nio.file.Path; import java.util.Locale; @@ -61,13 +62,14 @@ /** * The main class for OpenInv. */ +@NullMarked public class OpenInv extends FoliaWrappedJavaPlugin implements IOpenInv { - private InternalAccessor accessor; - private Config config; - private InventoryManager inventoryManager; - private LanguageManager languageManager; - private PlayerLoader playerLoader; + private @UnknownNullability InternalAccessor accessor; + private @UnknownNullability Config config; + private @UnknownNullability InventoryManager inventoryManager; + private @UnknownNullability LanguageManager languageManager; + private @UnknownNullability PlayerLoader playerLoader; private boolean isSpigot = false; public PlayerLoader getPlayerLoader() { @@ -86,10 +88,10 @@ public void reloadConfig() { @Override public boolean onCommand( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { if (!isSpigot || !this.accessor.isSupported()) { this.sendVersionError(sender::sendMessage); @@ -176,7 +178,7 @@ private void registerCommands() { } } - private void setCommandExecutor(@NotNull CommandExecutor executor, String @NotNull ... commands) { + private void setCommandExecutor(CommandExecutor executor, String... commands) { for (String commandName : commands) { PluginCommand command = this.getCommand(commandName); if (command != null) { @@ -185,7 +187,7 @@ private void setCommandExecutor(@NotNull CommandExecutor executor, String @NotNu } } - private void sendVersionError(@NotNull Consumer messageMethod) { + private void sendVersionError(Consumer messageMethod) { if (!accessor.isSupported()) { messageMethod.accept("Your server version (" + accessor.getVersion() + ") is not supported."); messageMethod.accept("Please check https://github.com/Jikoo/OpenInv/wiki/Supported-Versions to find a matching OI version."); @@ -219,43 +221,43 @@ public boolean noArgsOpensSelf() { } @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { + public IAnySilentContainer getAnySilentContainer() { return this.accessor.getAnySilentContainer(); } @Override - public boolean getAnyContainerStatus(@NotNull final OfflinePlayer offline) { + public boolean getAnyContainerStatus(final OfflinePlayer offline) { return PlayerToggles.any().is(offline.getUniqueId()); } @Override - public void setAnyContainerStatus(@NotNull final OfflinePlayer offline, final boolean status) { + public void setAnyContainerStatus(final OfflinePlayer offline, final boolean status) { PlayerToggles.any().set(offline.getUniqueId(), status); } @Override - public boolean getSilentContainerStatus(@NotNull final OfflinePlayer offline) { + public boolean getSilentContainerStatus(final OfflinePlayer offline) { return PlayerToggles.silent().is(offline.getUniqueId()); } @Override - public void setSilentContainerStatus(@NotNull final OfflinePlayer offline, final boolean status) { + public void setSilentContainerStatus(final OfflinePlayer offline, final boolean status) { PlayerToggles.silent().set(offline.getUniqueId(), status); } @Override - public @NotNull ISpecialEnderChest getSpecialEnderChest(@NotNull final Player player, final boolean online) { + public ISpecialEnderChest getSpecialEnderChest(final Player player, final boolean online) { return inventoryManager.getEnderChest(player); } @Override - public @NotNull ISpecialPlayerInventory getSpecialInventory(@NotNull final Player player, final boolean online) { + public ISpecialPlayerInventory getSpecialInventory(final Player player, final boolean online) { return inventoryManager.getInventory(player); } @Override @Deprecated(forRemoval = true) - public @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) { + public @Nullable InventoryView openInventory(Player player, ISpecialInventory inventory) { Permissions edit = null; HumanEntity target = inventory.getPlayer(); boolean ownContainer = player.equals(target); @@ -301,27 +303,27 @@ public void setSilentContainerStatus(@NotNull final OfflinePlayer offline, final } @Override - public @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory, boolean viewOnly) { + public @Nullable InventoryView openInventory(Player player, ISpecialInventory inventory, boolean viewOnly) { return this.accessor.openInventory(player, inventory, viewOnly); } @Override - public boolean isPlayerLoaded(@NotNull UUID playerUuid) { + public boolean isPlayerLoaded(UUID playerUuid) { return inventoryManager.getLoadedPlayer(playerUuid) != null; } @Override - public @Nullable Player loadPlayer(@NotNull final OfflinePlayer offline) { + public @Nullable Player loadPlayer(final OfflinePlayer offline) { return playerLoader.load(offline); } @Override - public @Nullable OfflinePlayer matchPlayer(@NotNull String name) { + public @Nullable OfflinePlayer matchPlayer(String name) { return playerLoader.match(name); } @Override - public void unload(@NotNull final OfflinePlayer offline) { + public void unload(final OfflinePlayer offline) { inventoryManager.unload(offline.getUniqueId()); } diff --git a/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java b/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java index 1aa2da15..7f5256fb 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java @@ -12,36 +12,37 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.logging.Level; +@NullMarked public class ClearInvCommand extends PlayerLookupCommand { - private final @NotNull InventoryManager manager; + private final InventoryManager manager; public ClearInvCommand( - @NotNull OpenInv plugin, - @NotNull Config config, - @NotNull InventoryManager manager, - @NotNull LanguageManager lang, - @NotNull PlayerLoader playerLoader + OpenInv plugin, + Config config, + InventoryManager manager, + LanguageManager lang, + PlayerLoader playerLoader ) { super(plugin, lang, config, playerLoader); this.manager = manager; } @Override - protected boolean isAccessInventory(@NotNull Command command) { + protected boolean isAccessInventory(Command command) { return command.getName().equals("clearinv"); } @Override protected @Nullable String getTargetIdentifer( - @NotNull CommandSender sender, - @NotNull Command command, + CommandSender sender, + Command command, @Nullable String argument, boolean accessInv ) { @@ -72,12 +73,12 @@ protected boolean isAccessInventory(@NotNull Command command) { } @Override - protected @Nullable OfflinePlayer getTarget(@NotNull String identifier) { + protected @Nullable OfflinePlayer getTarget(String identifier) { return playerLoader.matchExact(identifier); } @Override - protected boolean deniedCommand(@NotNull CommandSender sender, @NotNull Player onlineTarget, boolean accessInv) { + protected boolean deniedCommand(CommandSender sender, Player onlineTarget, boolean accessInv) { if (onlineTarget.equals(sender)) { return !Permissions.CLEAR_SELF.hasPermission(sender); } @@ -86,10 +87,10 @@ protected boolean deniedCommand(@NotNull CommandSender sender, @NotNull Player o @Override protected void handle( - @NotNull CommandSender sender, - @NotNull PlayerAccess playerAccess, + CommandSender sender, + PlayerAccess playerAccess, boolean accessInv, - @NotNull String @NotNull [] args + String[] args ) { Player onlineTarget = playerAccess.player(); // Create the inventory @@ -113,11 +114,11 @@ protected void handle( } @Override - public List onTabComplete( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + public @Nullable List onTabComplete( + CommandSender sender, + Command command, + String label, + String[] args ) { if (!Permissions.CLEAR_OTHER.hasPermission(sender)) { return List.of(); diff --git a/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java b/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java index e7b1c6b8..86698697 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java @@ -27,27 +27,28 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.UUID; +@NullMarked public class ContainerSettingCommand implements TabExecutor { - private final @NotNull LanguageManager lang; + private final LanguageManager lang; - public ContainerSettingCommand(@NotNull LanguageManager lang) { + public ContainerSettingCommand(LanguageManager lang) { this.lang = lang; } @Override public boolean onCommand( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { if (!(sender instanceof Player player)) { lang.sendMessage(sender, "messages.error.consoleUnsupported"); @@ -95,7 +96,7 @@ public boolean onCommand( return true; } - private void set(@NotNull PlayerToggle toggle, @NotNull UUID uuid, boolean state) { + private void set(PlayerToggle toggle, UUID uuid, boolean state) { if (toggle.set(uuid, state)) { OpenEvents.notifyPlayerToggle(toggle, uuid, state); } @@ -103,10 +104,10 @@ private void set(@NotNull PlayerToggle toggle, @NotNull UUID uuid, boolean state @Override public List onTabComplete( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { if (!command.testPermissionSilent(sender) || args.length != 1) { return Collections.emptyList(); diff --git a/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java b/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java index 14abf66b..5bdacf30 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java @@ -28,8 +28,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; @@ -37,32 +37,33 @@ import java.util.WeakHashMap; import java.util.logging.Level; +@NullMarked public class OpenInvCommand extends PlayerLookupCommand { - private final @NotNull InventoryManager manager; + private final InventoryManager manager; private final Map openInvHistory = new WeakHashMap<>(); private final Map openEnderHistory = new WeakHashMap<>(); public OpenInvCommand( - @NotNull OpenInv plugin, - @NotNull Config config, - @NotNull InventoryManager manager, - @NotNull LanguageManager lang, - @NotNull PlayerLoader playerLoader + OpenInv plugin, + Config config, + InventoryManager manager, + LanguageManager lang, + PlayerLoader playerLoader ) { super(plugin, lang, config, playerLoader); this.manager = manager; } @Override - protected boolean isAccessInventory(@NotNull Command command) { + protected boolean isAccessInventory(Command command) { return command.getName().equals("openinv"); } @Override protected @Nullable String getTargetIdentifer( - @NotNull CommandSender sender, - @NotNull Command command, + CommandSender sender, + Command command, @Nullable String argument, boolean accessInv ) { @@ -95,7 +96,7 @@ protected boolean isAccessInventory(@NotNull Command command) { return argument; } - private void showHelp(@NotNull CommandSender sender) { + private void showHelp(CommandSender sender) { // Get registered commands for (String commandName : plugin.getDescription().getCommands().keySet()) { PluginCommand command = plugin.getCommand(commandName); @@ -124,12 +125,12 @@ private void showHelp(@NotNull CommandSender sender) { } @Override - protected @Nullable OfflinePlayer getTarget(@NotNull String identifier) { + protected @Nullable OfflinePlayer getTarget(String identifier) { return playerLoader.match(identifier); } @Override - protected boolean deniedCommand(@NotNull CommandSender sender, @NotNull Player onlineTarget, boolean accessInv) { + protected boolean deniedCommand(CommandSender sender, Player onlineTarget, boolean accessInv) { if (onlineTarget.equals(sender)) { // Permission for opening own inventory. if (!(accessInv ? Permissions.INVENTORY_OPEN_SELF : Permissions.ENDERCHEST_OPEN_SELF).hasPermission(sender)) { @@ -150,10 +151,10 @@ protected boolean deniedCommand(@NotNull CommandSender sender, @NotNull Player o @Override protected void handle( - @NotNull CommandSender sender, - @NotNull PlayerAccess playerAccess, + CommandSender sender, + PlayerAccess playerAccess, boolean accessInv, - @NotNull String @NotNull [] args + String[] args ) { Player player = (Player) sender; Player target = playerAccess.player(); diff --git a/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java b/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java index 8602db89..952964be 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java @@ -14,8 +14,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -23,18 +23,19 @@ /** * A command abstraction for performing actions after looking up and loading a player. */ +@NullMarked public abstract class PlayerLookupCommand implements TabExecutor { - protected final @NotNull OpenInv plugin; - protected final @NotNull LanguageManager lang; - protected final @NotNull Config config; - protected final @NotNull PlayerLoader playerLoader; + protected final OpenInv plugin; + protected final LanguageManager lang; + protected final Config config; + protected final PlayerLoader playerLoader; public PlayerLookupCommand( - @NotNull OpenInv plugin, - @NotNull LanguageManager lang, - @NotNull Config config, - @NotNull PlayerLoader playerLoader + OpenInv plugin, + LanguageManager lang, + Config config, + PlayerLoader playerLoader ) { this.plugin = plugin; this.lang = lang; @@ -44,10 +45,10 @@ public PlayerLookupCommand( @Override public boolean onCommand( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String @NotNull [] args + CommandSender sender, + Command command, + String label, + String[] args ) { // Inventory or ender chest? @@ -101,7 +102,7 @@ public void run() { * @param command the {@code Command} being executed * @return {@code true} if the command is for inventories, {@code false} for ender chests */ - protected abstract boolean isAccessInventory(@NotNull Command command); + protected abstract boolean isAccessInventory(Command command); /** * Determine the target identifier from the first command argument. @@ -115,8 +116,8 @@ public void run() { * @return an updated target identifier or {@code null} if no target is available */ protected abstract @Nullable String getTargetIdentifer( - @NotNull CommandSender sender, - @NotNull Command command, + CommandSender sender, + Command command, @Nullable String argument, boolean accessInv ); @@ -127,7 +128,7 @@ public void run() { * @param identifier the identifier * @return the corresponding player or {@code null} if no match was found */ - protected abstract @Nullable OfflinePlayer getTarget(@NotNull String identifier); + protected abstract @Nullable OfflinePlayer getTarget(String identifier); /** * Attempt to access the target as an online player. Performs feedback in the event of denial. @@ -138,8 +139,8 @@ public void run() { * @return the {@link Player} loaded or {@code null} if target is not accessible */ protected @Nullable PlayerAccess access( - @NotNull CommandSender sender, - @NotNull OfflinePlayer target, + CommandSender sender, + OfflinePlayer target, boolean invPerms ) { // Attempt to load online player dependent on permissions and configuration. @@ -165,7 +166,7 @@ public void run() { * @param target the {@link OfflinePlayer} being targeted by the command * @return the {@link Player} loaded or {@code null} if target is not accessible */ - protected @Nullable Player accessAsPlayer(@NotNull CommandSender sender, @NotNull OfflinePlayer target) { + protected @Nullable Player accessAsPlayer(CommandSender sender, OfflinePlayer target) { Player onlineTarget; if (!target.isOnline()) { @@ -203,8 +204,8 @@ public void run() { * @return {@code true} if the sender does not have the correct execution-specific permission */ protected abstract boolean deniedCommand( - @NotNull CommandSender sender, - @NotNull Player onlineTarget, + CommandSender sender, + Player onlineTarget, boolean accessInv ); @@ -218,8 +219,8 @@ protected abstract boolean deniedCommand( * @return a {@link PlayerAccess} containing the accessed player and view mode, or {@code null} if denied */ protected @Nullable PlayerAccess accessGeneralized( - @NotNull CommandSender sender, - @NotNull Player onlineTarget, + CommandSender sender, + Player onlineTarget, boolean invPerms ) { @@ -293,18 +294,18 @@ protected abstract boolean deniedCommand( * @param args the original command arguments */ protected abstract void handle( - @NotNull CommandSender sender, - @NotNull PlayerAccess target, + CommandSender sender, + PlayerAccess target, boolean accessInv, - @NotNull String @NotNull [] args + String[] args ); @Override public List onTabComplete( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { if (!command.testPermissionSilent(sender) || args.length != 1) { return Collections.emptyList(); diff --git a/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java b/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java index db0bb781..185f0e15 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java @@ -31,7 +31,7 @@ import org.bukkit.Nameable; import org.bukkit.inventory.InventoryHolder; import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Collections; import java.util.List; @@ -40,22 +40,23 @@ /** * Command for searching containers in a radius of chunks. */ +@NullMarked public class SearchContainerCommand implements TabExecutor { - private final @NotNull Plugin plugin; - private final @NotNull LanguageManager lang; + private final Plugin plugin; + private final LanguageManager lang; - public SearchContainerCommand(@NotNull Plugin plugin, @NotNull LanguageManager lang) { + public SearchContainerCommand(Plugin plugin, LanguageManager lang) { this.plugin = plugin; this.lang = lang; } @Override public boolean onCommand( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args) { + CommandSender sender, + Command command, + String label, + String[] args) { if (!(sender instanceof Player senderPlayer)) { lang.sendMessage(sender, "messages.error.consoleUnsupported"); return true; @@ -140,9 +141,9 @@ public boolean onCommand( @Override public List onTabComplete( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, + CommandSender sender, + Command command, + String label, String[] args) { if (args.length < 1 || args.length > 2 || !command.testPermissionSilent(sender)) { return Collections.emptyList(); diff --git a/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java b/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java index 1844c4ea..51633690 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java @@ -16,10 +16,10 @@ package com.lishid.openinv.command; +import com.lishid.openinv.util.SearchHelper; import com.lishid.openinv.util.TabCompleter; import com.lishid.openinv.util.lang.LanguageManager; import com.lishid.openinv.util.lang.Replacement; -import com.lishid.openinv.util.SearchHelper; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.Registry; @@ -30,8 +30,8 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -43,20 +43,21 @@ * * @author Jikoo */ +@NullMarked public class SearchEnchantCommand implements TabExecutor { - private final @NotNull LanguageManager lang; + private final LanguageManager lang; - public SearchEnchantCommand(@NotNull LanguageManager lang) { + public SearchEnchantCommand(LanguageManager lang) { this.lang = lang; } @Override public boolean onCommand( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { if (args.length == 0) { return false; @@ -167,10 +168,10 @@ private boolean containsEnchantment(Inventory inventory, @Nullable Enchantment e @Override public List onTabComplete( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { if (!command.testPermissionSilent(sender) || args.length < 1 || args.length > 2) { return Collections.emptyList(); diff --git a/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java b/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java index 3264d923..3338a315 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java @@ -27,26 +27,27 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +@NullMarked public class SearchInvCommand implements TabExecutor { - private final @NotNull LanguageManager lang; + private final LanguageManager lang; - public SearchInvCommand(@NotNull LanguageManager lang) { + public SearchInvCommand(LanguageManager lang) { this.lang = lang; } @Override public boolean onCommand( - @NotNull CommandSender sender, - @NotNull Command command, - @NotNull String label, - @NotNull String[] args + CommandSender sender, + Command command, + String label, + String[] args ) { Material material = null; @@ -109,7 +110,7 @@ public boolean onCommand( return true; } - private boolean findMatch(@NotNull Inventory inventory, @NotNull Material material, int count) { + private boolean findMatch(Inventory inventory, Material material, int count) { AtomicInteger total = new AtomicInteger(); return SearchHelper.findMatch( inventory, @@ -124,8 +125,8 @@ private boolean findMatch(@NotNull Inventory inventory, @NotNull Material materi @Override public List onTabComplete( - @NotNull CommandSender sender, @NotNull Command command, @NotNull String label, - @NotNull String[] args + CommandSender sender, Command command, String label, + String[] args ) { if (args.length < 1 || args.length > 2 || !command.testPermissionSilent(sender)) { return Collections.emptyList(); diff --git a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java index dcd67f57..324909a0 100644 --- a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java @@ -36,25 +36,25 @@ import org.bukkit.event.inventory.InventoryInteractEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; /** * A listener managing AnyContainer, SilentContainer, and more. */ +@NullMarked public class ContainerListener implements Listener { - private final @NotNull InternalAccessor accessor; - private final @NotNull LanguageManager lang; + private final InternalAccessor accessor; + private final LanguageManager lang; - public ContainerListener(@NotNull InternalAccessor accessor, @NotNull LanguageManager lang) { + public ContainerListener(InternalAccessor accessor, LanguageManager lang) { this.accessor = accessor; this.lang = lang; } @Keep @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - private void onPlayerInteract(@NotNull PlayerInteractEvent event) { + private void onPlayerInteract(PlayerInteractEvent event) { // Ignore events from other plugins. if (!PlayerInteractEvent.class.equals(event.getClass())) { return; @@ -95,7 +95,7 @@ private void onPlayerInteract(@NotNull PlayerInteractEvent event) { @Keep @EventHandler - private void onInventoryClose(@NotNull final InventoryCloseEvent event) { + private void onInventoryClose(final InventoryCloseEvent event) { if (!(event.getPlayer() instanceof Player player)) { return; } @@ -108,17 +108,17 @@ private void onInventoryClose(@NotNull final InventoryCloseEvent event) { @Keep @EventHandler(priority = EventPriority.LOWEST) - private void onInventoryClick(@NotNull final InventoryClickEvent event) { + private void onInventoryClick(final InventoryClickEvent event) { handleInventoryInteract(event); } @Keep @EventHandler(priority = EventPriority.LOWEST) - private void onInventoryDrag(@NotNull final InventoryDragEvent event) { + private void onInventoryDrag(final InventoryDragEvent event) { handleInventoryInteract(event); } - private void handleInventoryInteract(@NotNull final InventoryInteractEvent event) { + private void handleInventoryInteract(final InventoryInteractEvent event) { HumanEntity entity = event.getWhoClicked(); // Un-cancel spectator interactions. diff --git a/plugin/src/main/java/com/lishid/openinv/listener/ToggleListener.java b/plugin/src/main/java/com/lishid/openinv/listener/ToggleListener.java index b39535ae..7aa49363 100644 --- a/plugin/src/main/java/com/lishid/openinv/listener/ToggleListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listener/ToggleListener.java @@ -5,15 +5,16 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.UUID; +@NullMarked public class ToggleListener implements Listener { @Keep @EventHandler - private void onPlayerQuit(@NotNull PlayerQuitEvent event) { + private void onPlayerQuit(PlayerQuitEvent event) { UUID playerId = event.getPlayer().getUniqueId(); PlayerToggles.any().set(playerId, false); PlayerToggles.silent().set(playerId, false); diff --git a/plugin/src/main/java/com/lishid/openinv/util/AccessEqualMode.java b/plugin/src/main/java/com/lishid/openinv/util/AccessEqualMode.java index a68914d9..3e1b6b10 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/AccessEqualMode.java +++ b/plugin/src/main/java/com/lishid/openinv/util/AccessEqualMode.java @@ -2,16 +2,17 @@ import com.lishid.openinv.util.config.Config; import org.bukkit.permissions.Permissible; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; import java.util.Locale; +@NullMarked public enum AccessEqualMode { DENY, ALLOW, VIEW; - public static @NotNull AccessEqualMode of(@Nullable String value) { + public static AccessEqualMode of(@Nullable String value) { if (value == null) { return VIEW; } @@ -22,7 +23,7 @@ public enum AccessEqualMode { }; } - public static @NotNull AccessEqualMode getByPerm(@NotNull Permissible permissible, @NotNull Config config) { + public static AccessEqualMode getByPerm(Permissible permissible, Config config) { if (Permissions.ACCESS_EQUAL_EDIT.hasPermission(permissible)) { return AccessEqualMode.ALLOW; } 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 c3cc16af..0f89aafe 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -28,11 +28,12 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class InternalAccessor { private static final boolean PAPER; @@ -50,7 +51,7 @@ public class InternalAccessor { private @Nullable Accessor internal; - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + public InternalAccessor(Logger logger, LanguageManager lang) { try { internal = getAccessor(logger, lang); @@ -63,7 +64,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } } - private @Nullable Accessor getAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + private @Nullable Accessor getAccessor(Logger logger, LanguageManager lang) { // Ensure version is in supported range. if (BukkitVersions.MINECRAFT.greaterThan(Version.of(26, 3)) || BukkitVersions.MINECRAFT.lessThan(Version.of(1, 21, 11))) { @@ -107,7 +108,7 @@ public void reload(ConfigurationSection config) { * * @return the version */ - public @NotNull String getVersion() { + public String getVersion() { return BukkitVersions.MINECRAFT.toString(); } @@ -126,7 +127,7 @@ public boolean isSupported() { * @return the IAnySilentContainer * @throws IllegalStateException if server version is unsupported */ - public @NotNull IAnySilentContainer getAnySilentContainer() { + public IAnySilentContainer getAnySilentContainer() { if (internal == null) { throw new IllegalStateException(String.format("Unsupported server version %s!", BukkitVersions.MINECRAFT)); } @@ -134,8 +135,8 @@ public boolean isSupported() { } public @Nullable InventoryView openInventory( - @NotNull Player player, - @NotNull ISpecialInventory inventory, + Player player, + ISpecialInventory inventory, boolean viewOnly ) { if (internal == null) { @@ -150,7 +151,7 @@ public boolean isSupported() { * @return the IPlayerDataManager * @throws IllegalStateException if server version is unsupported */ - @NotNull PlayerManager getPlayerDataManager() { + PlayerManager getPlayerDataManager() { if (internal == null) { throw new IllegalStateException(String.format("Unsupported server version %s!", BukkitVersions.MINECRAFT)); } diff --git a/plugin/src/main/java/com/lishid/openinv/util/InventoryManager.java b/plugin/src/main/java/com/lishid/openinv/util/InventoryManager.java index 974cc8b6..14e261d0 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InventoryManager.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InventoryManager.java @@ -18,8 +18,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -35,16 +35,17 @@ /** * A manager for special inventories. Delegates creation and tracks copies in use. */ +@NullMarked public class InventoryManager implements Listener { private final Map inventories = new ConcurrentHashMap<>(); private final Map enderChests = new ConcurrentHashMap<>(); private final Set expectedCloses = ConcurrentHashMap.newKeySet(); - private final @NotNull OpenInv plugin; - private final @NotNull Config config; - private final @NotNull InternalAccessor accessor; + private final OpenInv plugin; + private final Config config; + private final InternalAccessor accessor; - public InventoryManager(@NotNull OpenInv plugin, @NotNull Config config, @NotNull InternalAccessor accessor) { + public InventoryManager(OpenInv plugin, Config config, InternalAccessor accessor) { this.plugin = plugin; this.config = config; this.accessor = accessor; @@ -74,15 +75,15 @@ public void evictAll() { expectedCloses.clear(); } - public @NotNull ISpecialPlayerInventory getInventory(@NotNull Player player) { + public ISpecialPlayerInventory getInventory(Player player) { return inventories.computeIfAbsent(player.getUniqueId(), uuid -> accessor.createInventory(player)); } - public @NotNull ISpecialEnderChest getEnderChest(@NotNull Player player) { + public ISpecialEnderChest getEnderChest(Player player) { return enderChests.computeIfAbsent(player.getUniqueId(), uuid -> accessor.createEnderChest(player)); } - public @Nullable Player getLoadedPlayer(@NotNull UUID uuid) { + public @Nullable Player getLoadedPlayer(UUID uuid) { ISpecialInventory inUse = inventories.get(uuid); if (inUse != null) { return (Player) inUse.getPlayer(); @@ -94,18 +95,18 @@ public void evictAll() { return null; } - public void unload(@NotNull UUID uuid) { + public void unload(UUID uuid) { inventories.computeIfPresent(uuid, this::remove); enderChests.computeIfPresent(uuid, this::remove); } - public void save(@NotNull UUID uuid) { + public void save(UUID uuid) { consumeLoaded(uuid, inventory -> {}); } @Keep @EventHandler(priority = EventPriority.LOWEST) - private void onPlayerJoin(@NotNull PlayerJoinEvent event) { + private void onPlayerJoin(PlayerJoinEvent event) { consumeLoaded( event.getPlayer().getUniqueId(), inventory -> { @@ -117,7 +118,7 @@ private void onPlayerJoin(@NotNull PlayerJoinEvent event) { @Keep @EventHandler(priority = EventPriority.MONITOR) - private void onPlayerQuit(@NotNull PlayerQuitEvent event) { + private void onPlayerQuit(PlayerQuitEvent event) { consumeLoaded( event.getPlayer().getUniqueId(), inventory -> checkViewerAccess(inventory, false) @@ -126,7 +127,7 @@ private void onPlayerQuit(@NotNull PlayerQuitEvent event) { @Keep @EventHandler - private void onWorldChanged(@NotNull PlayerChangedWorldEvent event) { + private void onWorldChanged(PlayerChangedWorldEvent event) { Player player = event.getPlayer(); consumeLoaded(player.getUniqueId(), inventory -> checkViewerAccess(inventory, player.isOnline())); } @@ -134,7 +135,7 @@ private void onWorldChanged(@NotNull PlayerChangedWorldEvent event) { @Keep @EventHandler @SuppressWarnings("ReferenceEquality") // We do really want to check that we have the same ref here. - private void onInventoryClose(@NotNull InventoryCloseEvent event) { + private void onInventoryClose(InventoryCloseEvent event) { ISpecialInventory inventory = InventoryAccess.getInventory(event.getInventory()); // If this is not an ISpecialInventory or the inventory was closed elsewhere internally, don't handle. @@ -179,7 +180,7 @@ private void onInventoryClose(@NotNull InventoryCloseEvent event) { @Keep @EventHandler(priority = EventPriority.HIGHEST) - private void onInventoryOpen(@NotNull InventoryOpenEvent event) { + private void onInventoryOpen(InventoryOpenEvent event) { ISpecialInventory inventory = InventoryAccess.getInventory(event.getInventory()); if (inventory == null) { return; @@ -199,7 +200,7 @@ private void onInventoryOpen(@NotNull InventoryOpenEvent event) { } } - private void checkViewerAccess(@NotNull T inventory, boolean online) { + private void checkViewerAccess(T inventory, boolean online) { Player owner = (Player) inventory.getPlayer(); Permissions connectedState = online ? Permissions.ACCESS_ONLINE : Permissions.ACCESS_OFFLINE; @@ -217,16 +218,16 @@ private void checkViewerAccess(@NotNull T inventor } } - private void consumeLoaded(@NotNull UUID key, @NotNull Consumer<@NotNull ISpecialInventory> consumer) { + private void consumeLoaded(UUID key, Consumer consumer) { boolean saved = consumeLoaded(inventories, key, false, consumer); consumeLoaded(enderChests, key, saved, consumer); } private boolean consumeLoaded( - @NotNull Map map, - @NotNull UUID key, + Map map, + UUID key, boolean saved, - @NotNull Consumer<@NotNull ISpecialInventory> consumer + Consumer consumer ) { T inventory = map.get(key); @@ -247,7 +248,7 @@ private boolean consumeLoaded( return saved; } - private void save(@NotNull ISpecialInventory inventory) { + private void save(ISpecialInventory inventory) { if (config.isSaveDisabled()) { return; } @@ -260,7 +261,7 @@ private void save(@NotNull ISpecialInventory inventory) { } @Contract("_, _ -> null") - private @Nullable T remove(@NotNull UUID key, @NotNull T inventory) { + private @Nullable T remove(UUID key, T inventory) { for (HumanEntity viewer : List.copyOf(inventory.getBukkitInventory().getViewers())) { expectedCloses.add(viewer.getUniqueId()); plugin.getScheduler().runTaskAtEntity(viewer, viewer::closeInventory); diff --git a/plugin/src/main/java/com/lishid/openinv/util/PlayerLoader.java b/plugin/src/main/java/com/lishid/openinv/util/PlayerLoader.java index 199b59c3..79f11f83 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/PlayerLoader.java +++ b/plugin/src/main/java/com/lishid/openinv/util/PlayerLoader.java @@ -15,8 +15,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Iterator; import java.util.Map; @@ -29,22 +29,23 @@ /** * A utility for looking up and loading players. */ +@NullMarked public class PlayerLoader implements Listener { - private final @NotNull OpenInv plugin; - private final @NotNull Config config; - private final @NotNull InventoryManager inventoryManager; - private final @NotNull InternalAccessor internalAccessor; - private final @NotNull Logger logger; - private final @NotNull Cache lookupCache; - private @NotNull ProfileStore profileStore; + private final OpenInv plugin; + private final Config config; + private final InventoryManager inventoryManager; + private final InternalAccessor internalAccessor; + private final Logger logger; + private final Cache lookupCache; + private ProfileStore profileStore; public PlayerLoader( - @NotNull OpenInv plugin, - @NotNull Config config, - @NotNull InventoryManager inventoryManager, - @NotNull InternalAccessor internalAccessor, - @NotNull Logger logger + OpenInv plugin, + Config config, + InventoryManager inventoryManager, + InternalAccessor internalAccessor, + Logger logger ) { this.plugin = plugin; this.config = config; @@ -62,11 +63,11 @@ public PlayerLoader( this.lookupCache = CacheBuilder.newBuilder().maximumSize(20).build(); } - public @NotNull ProfileStore getProfileStore() { + public ProfileStore getProfileStore() { return profileStore; } - public void setProfileStore(@NotNull ProfileStore profileStore) { + public void setProfileStore(ProfileStore profileStore) { plugin.getLogger().log( Level.INFO, () -> "Setting profile store implementation to " + profileStore.getClass().getName() @@ -82,7 +83,7 @@ public void setProfileStore(@NotNull ProfileStore profileStore) { * @return the loaded {@code Player} * @throws IllegalStateException if the server version is unsupported */ - public @Nullable Player load(@NotNull OfflinePlayer offline) { + public @Nullable Player load(OfflinePlayer offline) { Player player = offline.getPlayer(); if (player != null) { return player; @@ -101,7 +102,7 @@ public void setProfileStore(@NotNull ProfileStore profileStore) { return internalAccessor.getPlayerDataManager().loadPlayer(offline); } - CompletableFuture future = new CompletableFuture<>(); + CompletableFuture<@Nullable Player> future = new CompletableFuture<>(); plugin.getScheduler().runTask(() -> future.complete(internalAccessor.getPlayerDataManager().loadPlayer(offline))); try { @@ -114,7 +115,7 @@ public void setProfileStore(@NotNull ProfileStore profileStore) { return player; } - public @Nullable OfflinePlayer matchExact(@NotNull String name) { + public @Nullable OfflinePlayer matchExact(String name) { OfflinePlayer player; try { @@ -165,7 +166,7 @@ public void setProfileStore(@NotNull ProfileStore profileStore) { return null; } - public @Nullable OfflinePlayer match(@NotNull String name) { + public @Nullable OfflinePlayer match(String name) { OfflinePlayer player = this.matchExact(name); if (player != null) { @@ -199,11 +200,11 @@ public void setProfileStore(@NotNull ProfileStore profileStore) { @Keep @EventHandler - private void onPlayerJoin(@NotNull PlayerJoinEvent event) { + private void onPlayerJoin(PlayerJoinEvent event) { plugin.getScheduler().runTaskLaterAsynchronously(() -> updateMatches(event), 7L); } - private void updateMatches(@NotNull PlayerJoinEvent event) { + private void updateMatches(PlayerJoinEvent event) { // Update profile store. profileStore.addProfile(new Profile(event.getPlayer())); diff --git a/plugin/src/main/java/com/lishid/openinv/util/SearchHelper.java b/plugin/src/main/java/com/lishid/openinv/util/SearchHelper.java index e62ad300..02c3bf64 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/SearchHelper.java +++ b/plugin/src/main/java/com/lishid/openinv/util/SearchHelper.java @@ -6,14 +6,15 @@ import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.BundleMeta; import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.function.Predicate; +@NullMarked public final class SearchHelper { - public static boolean findMatch(@NotNull Inventory inventory, @NotNull Predicate<@NotNull ItemStack> predicate) { + public static boolean findMatch(Inventory inventory, Predicate predicate) { for (ItemStack content : inventory.getContents()) { if (findMatch(content, predicate)) { return true; @@ -22,7 +23,7 @@ public static boolean findMatch(@NotNull Inventory inventory, @NotNull Predicate return false; } - private static boolean findMatch(@Nullable ItemStack itemStack, @NotNull Predicate<@NotNull ItemStack> predicate) { + private static boolean findMatch(@Nullable ItemStack itemStack, Predicate predicate) { if (itemStack == null || itemStack.getType().isAir()) { return false; } diff --git a/plugin/src/main/java/com/lishid/openinv/util/TabCompleter.java b/plugin/src/main/java/com/lishid/openinv/util/TabCompleter.java index f55ae192..3833738b 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/TabCompleter.java +++ b/plugin/src/main/java/com/lishid/openinv/util/TabCompleter.java @@ -20,9 +20,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -33,6 +33,7 @@ /** * Utility class for common tab completions. */ +@NullMarked public final class TabCompleter { /** @@ -41,7 +42,7 @@ public final class TabCompleter { * @param argument the argument to complete * @return integer options */ - public static @NotNull @Unmodifiable List completeInteger(@NotNull String argument) { + public static @Unmodifiable List completeInteger(String argument) { // Ensure existing argument is actually a number if (!argument.isEmpty()) { try { @@ -66,9 +67,9 @@ public final class TabCompleter { * @param enumClazz the Enum to complete for * @return the matching Enum values */ - public static @NotNull List completeEnum( - @NotNull String argument, - @NotNull Class> enumClazz + public static List completeEnum( + String argument, + Class> enumClazz ) { argument = argument.toLowerCase(Locale.ENGLISH); List completions = new ArrayList<>(); @@ -90,9 +91,9 @@ public final class TabCompleter { * @param options the Strings which may be completed * @return the matching Strings */ - public static @NotNull List completeString( - @NotNull String argument, - @NotNull String @NotNull [] options + public static List completeString( + String argument, + String[] options ) { argument = argument.toLowerCase(Locale.ENGLISH); List completions = new ArrayList<>(); @@ -115,7 +116,7 @@ public final class TabCompleter { */ public static List completeOnlinePlayer( @Nullable CommandSender sender, - @NotNull String argument + String argument ) { List completions = new ArrayList<>(); Player senderPlayer = sender instanceof Player player ? player : null; @@ -142,9 +143,9 @@ public static List completeOnlinePlayer( * @return the matching Strings */ public static List completeObject( - @NotNull String argument, - @NotNull Function<@NotNull T, @NotNull String> converter, - @NotNull T @NotNull[] options + String argument, + Function converter, + T[] options ) { argument = argument.toLowerCase(Locale.ENGLISH); List completions = new ArrayList<>(); diff --git a/plugin/src/main/java/com/lishid/openinv/util/config/Config.java b/plugin/src/main/java/com/lishid/openinv/util/config/Config.java index ad5f8f92..4076dbd7 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/config/Config.java +++ b/plugin/src/main/java/com/lishid/openinv/util/config/Config.java @@ -3,19 +3,20 @@ import com.lishid.openinv.util.AccessEqualMode; import org.bukkit.configuration.Configuration; import org.bukkit.configuration.MemoryConfiguration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class Config { - private @NotNull Configuration root; + private Configuration root; private @Nullable AccessEqualMode accessEqualMode; public Config() { root = new MemoryConfiguration(); } - public void reload(@NotNull Configuration configuration) { + public void reload(Configuration configuration) { root = configuration; accessEqualMode = null; } @@ -32,7 +33,7 @@ public boolean doesNoArgsOpenSelf() { return root.getBoolean("settings.command.open.no-args-opens-self", false); } - public @NotNull AccessEqualMode getAccessEqualMode() { + public AccessEqualMode getAccessEqualMode() { if (accessEqualMode == null) { accessEqualMode = AccessEqualMode.of(root.getString("settings.equal-access")); } diff --git a/plugin/src/main/java/com/lishid/openinv/util/config/ConfigUpdater.java b/plugin/src/main/java/com/lishid/openinv/util/config/ConfigUpdater.java index 228cfd07..46f96efd 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/config/ConfigUpdater.java +++ b/plugin/src/main/java/com/lishid/openinv/util/config/ConfigUpdater.java @@ -19,12 +19,13 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.io.File; import java.io.IOException; -public record ConfigUpdater(@NotNull Plugin plugin) { +@NullMarked +public record ConfigUpdater(Plugin plugin) { public void checkForUpdates() { final int version = plugin.getConfig().getInt("config-version", 1); diff --git a/plugin/src/main/java/com/lishid/openinv/util/lang/LangMigrator.java b/plugin/src/main/java/com/lishid/openinv/util/lang/LangMigrator.java index 2ae68159..2eadedd8 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/lang/LangMigrator.java +++ b/plugin/src/main/java/com/lishid/openinv/util/lang/LangMigrator.java @@ -1,6 +1,6 @@ package com.lishid.openinv.util.lang; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.io.IOException; import java.io.UncheckedIOException; @@ -11,13 +11,14 @@ import java.util.logging.Level; import java.util.logging.Logger; +@NullMarked public class LangMigrator { - private final @NotNull Path oldFolder; - private final @NotNull Path newFolder; - private final @NotNull Logger logger; + private final Path oldFolder; + private final Path newFolder; + private final Logger logger; - public LangMigrator(@NotNull Path oldFolder, @NotNull Path newFolder, @NotNull Logger logger) { + public LangMigrator(Path oldFolder, Path newFolder, Logger logger) { this.oldFolder = oldFolder; this.newFolder = newFolder; this.logger = logger; @@ -41,10 +42,6 @@ public void migrate() { try (DirectoryStream files = Files.newDirectoryStream(oldFolder)) { files.forEach(path -> { - if (path == null) { - return; - } - String fileName = path.getFileName().toString(); if (fileName.startsWith("config") || !fileName.endsWith(".yml")) { diff --git a/plugin/src/main/java/com/lishid/openinv/util/profile/BatchProfileStore.java b/plugin/src/main/java/com/lishid/openinv/util/profile/BatchProfileStore.java index 18cf05a6..ef2c3eea 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/profile/BatchProfileStore.java +++ b/plugin/src/main/java/com/lishid/openinv/util/profile/BatchProfileStore.java @@ -3,7 +3,8 @@ import com.github.jikoo.planarwrappers.scheduler.TickTimeUnit; import me.nahu.scheduler.wrapper.WrappedJavaPlugin; import me.nahu.scheduler.wrapper.runnable.WrappedRunnable; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.NullMarked; import java.util.Collections; import java.util.HashSet; @@ -11,18 +12,19 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +@NullMarked public abstract class BatchProfileStore implements ProfileStore { private final Set pending = Collections.synchronizedSet(new HashSet<>()); - private final AtomicReference insertTask = new AtomicReference<>(); - protected final @NotNull WrappedJavaPlugin plugin; + private final AtomicReference<@UnknownNullability WrappedRunnable> insertTask = new AtomicReference<>(); + protected final WrappedJavaPlugin plugin; - protected BatchProfileStore(@NotNull WrappedJavaPlugin plugin) { + protected BatchProfileStore(WrappedJavaPlugin plugin) { this.plugin = plugin; } @Override - public void addProfile(@NotNull Profile profile) { + public void addProfile(Profile profile) { pending.add(profile); buildBatch(); } @@ -73,6 +75,6 @@ public void shutdown() { insertTask.set(null); } - protected abstract void pushBatch(@NotNull Set batch); + protected abstract void pushBatch(Set batch); } diff --git a/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerImporter.java b/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerImporter.java index da5551b0..4d94ab9d 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerImporter.java +++ b/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerImporter.java @@ -3,17 +3,18 @@ import me.nahu.scheduler.wrapper.runnable.WrappedRunnable; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.HashSet; import java.util.Set; +@NullMarked public abstract class OfflinePlayerImporter extends WrappedRunnable { - private final @NotNull BatchProfileStore profileStore; + private final BatchProfileStore profileStore; private final int batchSize; - public OfflinePlayerImporter(@NotNull BatchProfileStore profileStore, int batchSize) { + public OfflinePlayerImporter(BatchProfileStore profileStore, int batchSize) { this.profileStore = profileStore; this.batchSize = batchSize; } diff --git a/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerProfileStore.java b/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerProfileStore.java index 0a756040..576cc48e 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerProfileStore.java +++ b/plugin/src/main/java/com/lishid/openinv/util/profile/OfflinePlayerProfileStore.java @@ -3,21 +3,22 @@ import com.lishid.openinv.util.FuzzyJaroWinkler; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class OfflinePlayerProfileStore implements ProfileStore { - private final @NotNull Logger logger; + private final Logger logger; - public OfflinePlayerProfileStore(@NotNull Logger logger) { + public OfflinePlayerProfileStore(Logger logger) { this.logger = logger; } @Override - public void addProfile(@NotNull Profile profile) { + public void addProfile(Profile profile) { // No-op. Server handles profile creation and storage. } @@ -37,7 +38,7 @@ public void tryImport() { } @Override - public @Nullable Profile getProfileExact(@NotNull String name) { + public @Nullable Profile getProfileExact(String name) { ProfileStore.warnMainThread(logger); @SuppressWarnings("deprecation") OfflinePlayer offline = Bukkit.getOfflinePlayer(name); @@ -55,7 +56,7 @@ public void tryImport() { } @Override - public @Nullable Profile getProfileInexact(@NotNull String search) { + public @Nullable Profile getProfileInexact(String search) { ProfileStore.warnMainThread(logger); double bestMatch = 0.0F; diff --git a/plugin/src/main/java/com/lishid/openinv/util/profile/Profile.java b/plugin/src/main/java/com/lishid/openinv/util/profile/Profile.java index f7665611..bdf2f856 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/profile/Profile.java +++ b/plugin/src/main/java/com/lishid/openinv/util/profile/Profile.java @@ -1,13 +1,14 @@ package com.lishid.openinv.util.profile; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.UUID; -public record Profile(@NotNull String name, @NotNull UUID id) { +@NullMarked +public record Profile(String name, UUID id) { - public Profile(@NotNull Player player) { + public Profile(Player player) { this(player.getName(), player.getUniqueId()); } diff --git a/plugin/src/main/java/com/lishid/openinv/util/profile/ProfileStore.java b/plugin/src/main/java/com/lishid/openinv/util/profile/ProfileStore.java index 27331fea..d0af686c 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/profile/ProfileStore.java +++ b/plugin/src/main/java/com/lishid/openinv/util/profile/ProfileStore.java @@ -1,15 +1,16 @@ package com.lishid.openinv.util.profile; import org.bukkit.Bukkit; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; import java.util.logging.Level; import java.util.logging.Logger; +@NullMarked public interface ProfileStore { - void addProfile(@NotNull Profile profile); + void addProfile(Profile profile); void setup() throws Exception; @@ -17,11 +18,11 @@ public interface ProfileStore { void tryImport() throws Exception; - @Nullable Profile getProfileExact(@NotNull String name); + @Nullable Profile getProfileExact(String name); - @Nullable Profile getProfileInexact(@NotNull String search); + @Nullable Profile getProfileInexact(String search); - static void warnMainThread(@NotNull Logger logger) { + static void warnMainThread(Logger logger) { if (!Bukkit.getServer().isPrimaryThread()) { return; } diff --git a/plugin/src/main/java/com/lishid/openinv/util/profile/sqlite/SqliteProfileStore.java b/plugin/src/main/java/com/lishid/openinv/util/profile/sqlite/SqliteProfileStore.java index 52c6b684..b1202784 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/profile/sqlite/SqliteProfileStore.java +++ b/plugin/src/main/java/com/lishid/openinv/util/profile/sqlite/SqliteProfileStore.java @@ -5,8 +5,9 @@ import com.lishid.openinv.util.profile.OfflinePlayerImporter; import com.lishid.openinv.util.profile.Profile; import me.nahu.scheduler.wrapper.WrappedJavaPlugin; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.sqlite.Function; import java.sql.Connection; @@ -20,14 +21,15 @@ import java.util.UUID; import java.util.logging.Level; +@NullMarked public class SqliteProfileStore extends BatchProfileStore { private static final int BATCH_SIZE = 1_000; private static final int MAX_BATCHES = 20; - private Connection connection; + private @UnknownNullability Connection connection; - public SqliteProfileStore(@NotNull WrappedJavaPlugin plugin) { + public SqliteProfileStore(WrappedJavaPlugin plugin) { super(plugin); } @@ -106,7 +108,7 @@ public void onComplete() { } @Override - protected void pushBatch(@NotNull Set batch) { + protected void pushBatch(Set batch) { if (batch.isEmpty()) { return; } @@ -161,7 +163,7 @@ private void pushBatch(Iterator iterator, int iteratorSize, int batchSi } } - private @NotNull PreparedStatement createBulkUpsertProfile(int count) throws SQLException { + private PreparedStatement createBulkUpsertProfile(int count) throws SQLException { return connection.prepareStatement( """ INSERT INTO profiles(name, uuid_least, uuid_most) @@ -177,7 +179,7 @@ ON CONFLICT(name) DO UPDATE SET } @Override - public @Nullable Profile getProfileExact(@NotNull String name) { + public @Nullable Profile getProfileExact(String name) { return getProfile( name, text -> { @@ -191,7 +193,7 @@ ON CONFLICT(name) DO UPDATE SET } @Override - public @Nullable Profile getProfileInexact(@NotNull String search) { + public @Nullable Profile getProfileInexact(String search) { return getProfile( search, text -> { @@ -210,7 +212,7 @@ ORDER BY JaroWinkler(?, name) DESC ); } - private @NotNull String getLikePrefix(@NotNull String search) { + private String getLikePrefix(String search) { StringBuilder prefix = new StringBuilder(); int searchLen = search.length(); if (searchLen > 0) { @@ -231,8 +233,8 @@ ORDER BY JaroWinkler(?, name) DESC } private @Nullable Profile getProfile( - @NotNull String text, - @NotNull ThrowingFunction create + String text, + ThrowingFunction create ) { try (PreparedStatement statement = create.apply(text)) { ResultSet resultSet = statement.executeQuery(); From 38f3655ab386bf001e449351d1c4f6fb11495a76 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 19 Sep 2026 18:24:30 -0400 Subject: [PATCH 03/10] Downgrade API version This is where Spigot deprecated the nonnull key for enchantments, but enchantments do actually have to be registered to the server to function. --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aefb7018..92f7dee6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -spigotapi = "1.21.5-R0.1-SNAPSHOT" +spigotapi = "1.21.3-R0.1-SNAPSHOT" planarwrappers = "3.3.0" jspecify = "1.0.1" annotations = "26.1.0" From b67ca9002a12a878e449ed1e25c0d84bc3409a35 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sat, 19 Sep 2026 18:25:21 -0400 Subject: [PATCH 04/10] Move to StackWalker --- .../lishid/openinv/util/JulLoggerAdapter.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java b/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java index 6dbd13f6..7201936e 100644 --- a/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java +++ b/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java @@ -57,22 +57,17 @@ private void normalizedLog(String fqcn, Level level, String msg, Object[] args, } private void addSource(String fqcn, LogRecord logRecord) { - // TODO stackwalker? - StackTraceElement[] trace = new Throwable().getStackTrace(); - int maxElements = 12; - int lastIgnored = maxElements; - // Start from 2; 0 is above and 1 is caller of internal method. - for (int i = 2; i < maxElements; ++i) { - if (isIgnored(trace[i].getClassName(), fqcn)) { - lastIgnored = i; - } - } - - if (lastIgnored < maxElements - 1) { - StackTraceElement caller = trace[lastIgnored + 1]; - logRecord.setSourceClassName(caller.getClassName()); - logRecord.setSourceMethodName(caller.getMethodName()); - } + StackWalker.getInstance().walk(stream -> stream + // Start at index 2 - this is an internal method, so we want at least the caller's caller. + .skip(2) + // Walk at maximum 10 frames. + .limit(10) + .filter(frame -> isIgnored(frame.getClassName(), fqcn)) + .findFirst() + ).ifPresent(frame -> { + logRecord.setSourceClassName(frame.getClassName()); + logRecord.setSourceMethodName(frame.getMethodName()); + }); } private boolean isIgnored(String className, String fqcn) { From 5e2c2d1405bec68c92a431d43f78d041ca73f3a5 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sun, 20 Sep 2026 12:03:00 -0400 Subject: [PATCH 05/10] Extract common interfaces Bunch of gross generics and more constructor parameters, but what can you do? I guess static abuse would work too, but that feels even worse. --- .../jikoo}/openinv/internal/Accessor.java | 6 +- .../openinv/internal/PlayerManager.java | 3 +- .../container}/AnySilentContainerBase.java | 6 +- .../internal/container}/InternalOwned.java | 2 +- .../openinv/internal/container/ViewOnly.java | 4 + .../internal}/container/slot/Content.java | 24 ++-- .../container/slot/InventoryFactory.java | 35 ++++++ .../jikoo/openinv}/lang/LanguageManager.java | 20 +-- .../jikoo/openinv/lang/Replacement.java | 14 +++ .../jikoo}/openinv/util/JulLoggerAdapter.java | 2 +- .../jikoo}/openinv/util/ReflectionHelper.java | 18 +-- .../com/lishid/openinv/internal/ViewOnly.java | 4 - .../lishid/openinv/util/lang/Replacement.java | 30 ----- .../paper1_21_11/InternalAccessor.java | 4 +- .../container/OpenEnderChest.java | 14 ++- .../paper1_21_11/container/OpenInventory.java | 14 ++- .../container/menu/OpenEnderChestMenu.java | 6 +- .../container/menu/OpenInventoryMenu.java | 15 ++- internal/paper26_1/build.gradle.kts | 2 +- .../internal/paper26_1/InternalAccessor.java | 17 ++- .../container/AnySilentContainer.java | 2 +- .../paper26_1/player/PlayerManager.java | 12 +- internal/paper26_2/build.gradle.kts | 71 +++++++++++ .../internal/paper26_2/InternalAccessor.java | 27 ++++ .../container/slot/OpenInventoryFactory.java | 95 +++++++++++++++ .../internal/paper26_3/InternalAccessor.java | 27 +++- .../container/AnySilentContainer.java | 6 +- .../container/BaseOpenInventory.java | 67 ++++------ .../paper26_3/container/OpenEnderChest.java | 14 ++- .../paper26_3/container/OpenInventory.java | 12 +- .../container/bukkit/OpenDummyInventory.java | 2 +- .../container/menu/BaseOpenInventoryMenu.java | 50 +++----- .../container/menu/OpenChestMenu.java | 9 +- .../container/menu/OpenEnderChestMenu.java | 6 +- .../container/menu/OpenInventoryMenu.java | 15 ++- .../container/menu/OpenSyncMenu.java | 7 +- .../container/slot/ContentCrafting.java | 36 +++--- .../container/slot/ContentCraftingResult.java | 4 +- .../container/slot/ContentCursor.java | 12 +- .../paper26_3/container/slot/ContentDrop.java | 39 +----- .../container/slot/ContentEquipment.java | 44 +------ .../paper26_3/container/slot/ContentList.java | 5 +- .../container/slot/ContentOffHand.java | 7 +- .../container/slot/ContentViewOnly.java | 8 +- .../container/slot/OpenInventoryFactory.java | 115 ++++++++++++++++++ .../container/slot/SlotEquipment.java | 49 ++++++++ .../container/slot/SlotPlaceholder.java | 2 +- .../container/slot/SlotViewOnly.java | 21 ---- .../paper26_3/player/PlayerManager.java | 18 ++- internal/spigot26_1/build.gradle.kts | 3 + .../internal/spigot26_1/InternalAccessor.java | 20 +-- .../spigot26_1/player/PlayerManager.java | 13 +- internal/spigot26_2/build.gradle.kts | 36 ++++++ .../internal/spigot26_2/InternalAccessor.java | 27 ++++ .../container/slot/OpenInventoryFactory.java | 89 ++++++++++++++ internal/spigot26_3/build.gradle.kts | 8 +- .../internal/spigot26_3/InternalAccessor.java | 54 ++++++-- .../container/AnySilentContainer.java | 6 +- .../spigot26_3/container/OpenEnderChest.java | 14 ++- .../spigot26_3/container/OpenInventory.java | 67 ++++------ .../container/bukkit/OpenDummyInventory.java | 2 +- .../container/menu/OpenChestMenu.java | 9 +- .../container/menu/OpenEnderChestMenu.java | 6 +- .../container/menu/OpenInventoryMenu.java | 23 ++-- .../container/menu/OpenSyncMenu.java | 9 +- .../spigot26_3/container/slot/Content.java | 70 ----------- .../container/slot/ContentCrafting.java | 36 +++--- .../container/slot/ContentCraftingResult.java | 4 +- .../container/slot/ContentCursor.java | 12 +- .../container/slot/ContentDrop.java | 39 +----- .../container/slot/ContentEquipment.java | 58 ++------- .../container/slot/ContentList.java | 9 +- .../container/slot/ContentOffHand.java | 10 +- .../container/slot/ContentViewOnly.java | 8 +- .../container/slot/OpenInventoryFactory.java | 115 ++++++++++++++++++ .../container/slot/SlotEquipment.java | 49 ++++++++ .../container/slot/SlotPlaceholder.java | 2 +- .../container/slot/SlotViewOnly.java | 21 ---- .../spigot26_3/player/PlayerManager.java | 18 ++- plugin/build.gradle.kts | 6 + .../main/java/com/lishid/openinv/OpenInv.java | 2 +- .../openinv/command/ClearInvCommand.java | 6 +- .../command/ContainerSettingCommand.java | 4 +- .../openinv/command/OpenInvCommand.java | 2 +- .../openinv/command/PlayerLookupCommand.java | 4 +- .../command/SearchContainerCommand.java | 4 +- .../openinv/command/SearchEnchantCommand.java | 4 +- .../openinv/command/SearchInvCommand.java | 4 +- .../openinv/listener/ContainerListener.java | 4 +- .../lishid/openinv/util/InternalAccessor.java | 6 +- settings.gradle.kts | 2 + 91 files changed, 1238 insertions(+), 669 deletions(-) rename common/src/main/java/com/{lishid => github/jikoo}/openinv/internal/Accessor.java (69%) rename common/src/main/java/com/{lishid => github/jikoo}/openinv/internal/PlayerManager.java (94%) rename common/src/main/java/com/{lishid/openinv/internal => github/jikoo/openinv/internal/container}/AnySilentContainerBase.java (92%) rename common/src/main/java/com/{lishid/openinv/internal => github/jikoo/openinv/internal/container}/InternalOwned.java (69%) create mode 100644 common/src/main/java/com/github/jikoo/openinv/internal/container/ViewOnly.java rename {internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3 => common/src/main/java/com/github/jikoo/openinv/internal}/container/slot/Content.java (63%) create mode 100644 common/src/main/java/com/github/jikoo/openinv/internal/container/slot/InventoryFactory.java rename common/src/main/java/com/{lishid/openinv/util => github/jikoo/openinv}/lang/LanguageManager.java (93%) create mode 100644 common/src/main/java/com/github/jikoo/openinv/lang/Replacement.java rename common/src/main/java/com/{lishid => github/jikoo}/openinv/util/JulLoggerAdapter.java (98%) rename common/src/main/java/com/{lishid => github/jikoo}/openinv/util/ReflectionHelper.java (73%) delete mode 100644 common/src/main/java/com/lishid/openinv/internal/ViewOnly.java delete mode 100644 common/src/main/java/com/lishid/openinv/util/lang/Replacement.java 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/slot/OpenInventoryFactory.java create mode 100644 internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/OpenInventoryFactory.java create mode 100644 internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotEquipment.java create mode 100644 internal/spigot26_2/build.gradle.kts create mode 100644 internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java create mode 100644 internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/OpenInventoryFactory.java delete mode 100644 internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java create mode 100644 internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/OpenInventoryFactory.java create mode 100644 internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotEquipment.java diff --git a/common/src/main/java/com/lishid/openinv/internal/Accessor.java b/common/src/main/java/com/github/jikoo/openinv/internal/Accessor.java similarity index 69% rename from common/src/main/java/com/lishid/openinv/internal/Accessor.java rename to common/src/main/java/com/github/jikoo/openinv/internal/Accessor.java index 17e021ae..c3213edb 100644 --- a/common/src/main/java/com/lishid/openinv/internal/Accessor.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/Accessor.java @@ -1,5 +1,9 @@ -package com.lishid.openinv.internal; +package com.github.jikoo.openinv.internal; +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 org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; diff --git a/common/src/main/java/com/lishid/openinv/internal/PlayerManager.java b/common/src/main/java/com/github/jikoo/openinv/internal/PlayerManager.java similarity index 94% rename from common/src/main/java/com/lishid/openinv/internal/PlayerManager.java rename to common/src/main/java/com/github/jikoo/openinv/internal/PlayerManager.java index fe19573d..cca8761b 100644 --- a/common/src/main/java/com/lishid/openinv/internal/PlayerManager.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/PlayerManager.java @@ -14,8 +14,9 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal; +package com.github.jikoo.openinv.internal; +import com.lishid.openinv.internal.ISpecialInventory; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; diff --git a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java similarity index 92% rename from common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java rename to common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java index 77221009..58daf100 100644 --- a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java @@ -1,5 +1,6 @@ -package com.lishid.openinv.internal; +package com.github.jikoo.openinv.internal.container; +import com.lishid.openinv.internal.IAnySilentContainer; import org.bukkit.block.Barrel; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -11,6 +12,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; @NullMarked public abstract class AnySilentContainerBase implements IAnySilentContainer { @@ -85,6 +87,6 @@ public boolean isAnySilentContainer(Inventory inventory) { protected abstract BlockState getState(Block block); - protected abstract InventoryHolder getHolder(Inventory inventory); + protected abstract @Nullable InventoryHolder getHolder(Inventory inventory); } diff --git a/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/InternalOwned.java similarity index 69% rename from common/src/main/java/com/lishid/openinv/internal/InternalOwned.java rename to common/src/main/java/com/github/jikoo/openinv/internal/container/InternalOwned.java index f1f6c906..3af7149d 100644 --- a/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/InternalOwned.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal; +package com.github.jikoo.openinv.internal.container; import org.jspecify.annotations.NullMarked; diff --git a/common/src/main/java/com/github/jikoo/openinv/internal/container/ViewOnly.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/ViewOnly.java new file mode 100644 index 00000000..2fb3430b --- /dev/null +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/ViewOnly.java @@ -0,0 +1,4 @@ +package com.github.jikoo.openinv.internal.container; + +public interface ViewOnly { +} diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/Content.java similarity index 63% rename from internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java rename to common/src/main/java/com/github/jikoo/openinv/internal/container/slot/Content.java index 2664bcb2..ef529c56 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/Content.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/Content.java @@ -1,54 +1,50 @@ -package com.lishid.openinv.internal.paper26_3.container.slot; +package com.github.jikoo.openinv.internal.container.slot; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.NullMarked; /** - * An interface defining behaviors for entries in a {@link Container}. Used to reduce duplicate content reordering. + * An interface defining behaviors for entries in a {@link net.minecraft.world.Container Container}. Used to reduce duplicate content reordering. */ @NullMarked -public interface Content { +public interface Content { /** * Update internal holder. * * @param holder the new holder */ - void setHolder(ServerPlayer holder); + void setHolder(P holder); /** * Get the current item. * * @return the current item */ - ItemStack get(); + I get(); /** * Remove the current item. * * @return the current item */ - ItemStack remove(); + I remove(); /** * Remove some of the current item. * * @return the current item */ - ItemStack removePartial(int amount); + I removePartial(int amount); /** * Set the current item. If slot is currently not usable, will drop item instead. * * @param itemStack the item to set */ - void set(ItemStack itemStack); + void set(I itemStack); /** - * Get a {@link Slot} for use in a {@link net.minecraft.world.inventory.AbstractContainerMenu ContainerMenu}. Will + * Get a {@link net.minecraft.world.inventory.Slot Slot} for use in a {@link net.minecraft.world.inventory.AbstractContainerMenu ContainerMenu}. Will * impose any specific restrictions to insertion or removal. * * @param container the backing container @@ -57,7 +53,7 @@ public interface Content { * @param y clientside y dimension from top left of inventory, not used * @return a menu slot */ - Slot asSlot(Container container, int slot, int x, int y); + S asSlot(C container, int slot, int x, int y); /** * Get a loose Bukkit translation of what this slot stores. For example, any slot that drops items at the owner rather diff --git a/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/InventoryFactory.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/InventoryFactory.java new file mode 100644 index 00000000..85d5f587 --- /dev/null +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/InventoryFactory.java @@ -0,0 +1,35 @@ +package com.github.jikoo.openinv.internal.container.slot; + +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NullMarked; + +import java.util.List; +import java.util.function.Function; + +@NullMarked +public interface InventoryFactory { + + Content newCrafting(P holder, int index); + + Content newCraftingResult(P holder); + + Content newCursor(P holder); + + Content newDrop(P holder); + + Content newEquipment(P holder, E equipmentSlot); + + Content newList(P holder, int index, InventoryType.SlotType slotType, Function> listSupplier); + + Content newOffHand(P holder); + + Content newViewOnly(P holder); + + Content newViewOnly(P holder, I itemStack); + + S wrapViewOnly(S wrapped); + + ItemStack asBukkitMirror(I itemStack); + +} diff --git a/common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java b/common/src/main/java/com/github/jikoo/openinv/lang/LanguageManager.java similarity index 93% rename from common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java rename to common/src/main/java/com/github/jikoo/openinv/lang/LanguageManager.java index a90af5a9..f1496d2b 100644 --- a/common/src/main/java/com/lishid/openinv/util/lang/LanguageManager.java +++ b/common/src/main/java/com/github/jikoo/openinv/lang/LanguageManager.java @@ -1,20 +1,4 @@ -/* - * Copyright (C) 2011-2022 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.util.lang; +package com.github.jikoo.openinv.lang; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; @@ -44,8 +28,6 @@ /** * A simple language manager supporting both custom and bundled languages. - * - * @author Jikoo */ @NullMarked public class LanguageManager { diff --git a/common/src/main/java/com/github/jikoo/openinv/lang/Replacement.java b/common/src/main/java/com/github/jikoo/openinv/lang/Replacement.java new file mode 100644 index 00000000..49e00d1a --- /dev/null +++ b/common/src/main/java/com/github/jikoo/openinv/lang/Replacement.java @@ -0,0 +1,14 @@ +package com.github.jikoo.openinv.lang; + +import org.jspecify.annotations.NullMarked; + +/** + * A data holder for string replacement in translations. + * + * @param placeholder the placeholder to be replaced + * @param value the value to insert + */ +@NullMarked +public record Replacement(String placeholder, String value) { + +} diff --git a/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java b/common/src/main/java/com/github/jikoo/openinv/util/JulLoggerAdapter.java similarity index 98% rename from common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java rename to common/src/main/java/com/github/jikoo/openinv/util/JulLoggerAdapter.java index 7201936e..fb8d6f10 100644 --- a/common/src/main/java/com/lishid/openinv/util/JulLoggerAdapter.java +++ b/common/src/main/java/com/github/jikoo/openinv/util/JulLoggerAdapter.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.util; +package com.github.jikoo.openinv.util; import org.jspecify.annotations.NullMarked; import org.slf4j.Marker; diff --git a/common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java b/common/src/main/java/com/github/jikoo/openinv/util/ReflectionHelper.java similarity index 73% rename from common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java rename to common/src/main/java/com/github/jikoo/openinv/util/ReflectionHelper.java index 51e193d1..8b72a9cc 100644 --- a/common/src/main/java/com/lishid/openinv/util/ReflectionHelper.java +++ b/common/src/main/java/com/github/jikoo/openinv/util/ReflectionHelper.java @@ -1,20 +1,4 @@ -/* - * Copyright (C) 2011-2021 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.util; +package com.github.jikoo.openinv.util; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; diff --git a/common/src/main/java/com/lishid/openinv/internal/ViewOnly.java b/common/src/main/java/com/lishid/openinv/internal/ViewOnly.java deleted file mode 100644 index b8c5bfa6..00000000 --- a/common/src/main/java/com/lishid/openinv/internal/ViewOnly.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.lishid.openinv.internal; - -public interface ViewOnly { -} diff --git a/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java b/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java deleted file mode 100644 index 4c644633..00000000 --- a/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2011-2022 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.util.lang; - -import org.jspecify.annotations.NullMarked; - -/** - * A data holder for string replacement in translations. - * - * @param placeholder the placeholder to be replaced - * @param value the value to insert - */ -@NullMarked -public record Replacement(String placeholder, String value) { - -} diff --git a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java index 95039ca2..149e531f 100644 --- a/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java +++ b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java @@ -1,10 +1,10 @@ package com.lishid.openinv.internal.paper1_21_11; +import com.github.jikoo.openinv.lang.LanguageManager; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.paper1_21_11.container.OpenEnderChest; import com.lishid.openinv.internal.paper1_21_11.container.OpenInventory; -import com.lishid.openinv.util.lang.LanguageManager; import org.bukkit.entity.Player; import org.jspecify.annotations.NullMarked; @@ -24,7 +24,7 @@ public ISpecialEnderChest createEnderChest(Player player) { @Override public ISpecialPlayerInventory createPlayerInventory(Player player) { - return new OpenInventory(player); + return new OpenInventory(factory, player); } } 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 13178297..d11835cb 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,9 +1,14 @@ package com.lishid.openinv.internal.paper1_21_11.container; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenEnderChestMenu; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; @@ -15,9 +20,14 @@ public OpenEnderChest(org.bukkit.entity.Player player) { } @Override - public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { + public @Nullable OpenChestMenu createMenu( + InventoryFactory factory, + Player player, + int i, + boolean viewOnly + ) { if (player instanceof ServerPlayer serverPlayer) { - return new OpenEnderChestMenu(this, serverPlayer, i, viewOnly); + return new OpenEnderChestMenu(factory, this, serverPlayer, i, viewOnly); } return null; } 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 01289f11..b34dd48b 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,23 +1,31 @@ package com.lishid.openinv.internal.paper1_21_11.container; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper1_21_11.container.menu.OpenInventoryMenu; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; @NullMarked public class OpenInventory extends com.lishid.openinv.internal.paper26_3.container.OpenInventory { - public OpenInventory(org.bukkit.entity.Player bukkitPlayer) { - super(bukkitPlayer); + public OpenInventory( + InventoryFactory factory, + org.bukkit.entity.Player bukkitPlayer + ) { + super(factory, bukkitPlayer); } @Override public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { if (player instanceof ServerPlayer serverPlayer) { - return new OpenInventoryMenu(this, serverPlayer, i, viewOnly); + return new OpenInventoryMenu(factory, this, serverPlayer, i, viewOnly); } return null; } 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 38b4400e..dc45137e 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,8 +1,11 @@ package com.lishid.openinv.internal.paper1_21_11.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; import com.lishid.openinv.internal.paper26_3.container.menu.OpenSyncMenu; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.Slot; @@ -13,12 +16,13 @@ public class OpenEnderChestMenu extends OpenSyncMenu { public OpenEnderChestMenu( + InventoryFactory factory, OpenEnderChest enderChest, ServerPlayer viewer, int containerId, boolean viewOnly ) { - super(getChestMenuType(enderChest.getContainerSize()), containerId, enderChest, viewer, viewOnly); + super(getChestMenuType(enderChest.getContainerSize()), containerId, factory, enderChest, viewer, viewOnly); } @Override 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 da824415..3bc0f134 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,17 +1,28 @@ package com.lishid.openinv.internal.paper1_21_11.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import com.lishid.openinv.internal.paper26_3.container.menu.BaseOpenInventoryMenu; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.NullMarked; @NullMarked public class OpenInventoryMenu extends BaseOpenInventoryMenu { - public OpenInventoryMenu(BaseOpenInventory inventory, ServerPlayer viewer, int i, boolean viewOnly) { - super(inventory, viewer, i, viewOnly); + public OpenInventoryMenu( + InventoryFactory factory, + BaseOpenInventory inventory, + ServerPlayer viewer, + int i, + boolean viewOnly + ) { + super(factory, inventory, viewer, i, viewOnly); } @Override diff --git a/internal/paper26_1/build.gradle.kts b/internal/paper26_1/build.gradle.kts index 5a0928b9..1c2649be 100644 --- a/internal/paper26_1/build.gradle.kts +++ b/internal/paper26_1/build.gradle.kts @@ -57,7 +57,7 @@ dependencies { implementation(project(":openinvcommon")) { exclude(group = "org.spigotmc", module = "spigot-api") } - api(project(":openinvadapterpaper26_3")) { + api(project(":openinvadapterpaper26_2")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } 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 6377cf35..f53259a2 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,26 +1,35 @@ package com.lishid.openinv.internal.paper26_1; import com.lishid.openinv.internal.ISpecialEnderChest; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; 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.player.PlayerManager; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.bukkit.entity.Player; import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; @NullMarked -public class InternalAccessor extends com.lishid.openinv.internal.paper26_3.InternalAccessor { +public class InternalAccessor extends com.lishid.openinv.internal.paper26_2.InternalAccessor { public InternalAccessor(Logger logger, LanguageManager lang) { super(logger, lang); } @Override - protected PlayerManager createPlayerManager(Logger logger) { - return new PlayerManager(logger); + protected PlayerManager createPlayerManager( + Logger logger, + InventoryFactory factory + ) { + return new PlayerManager(logger, factory); } @Override 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 b8981e61..251c84df 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,6 +1,6 @@ package com.lishid.openinv.internal.paper26_1.container; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.lang.LanguageManager; import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; import org.jspecify.annotations.NullMarked; 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 80d3d980..19855af1 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,7 +1,12 @@ package com.lishid.openinv.internal.paper26_1.player; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.NullMarked; @@ -11,8 +16,11 @@ @NullMarked public class PlayerManager extends com.lishid.openinv.internal.paper26_3.player.PlayerManager { - public PlayerManager(Logger logger) { - super(logger); + public PlayerManager( + Logger logger, + InventoryFactory factory + ) { + super(logger, factory); } @Override diff --git a/internal/paper26_2/build.gradle.kts b/internal/paper26_2/build.gradle.kts new file mode 100644 index 00000000..5b87ec2c --- /dev/null +++ b/internal/paper26_2/build.gradle.kts @@ -0,0 +1,71 @@ +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") + } + api(project(":openinvadapterpaper26_3")) { + exclude(group = "io.papermc.paper", module = "dev-bundle") + } + + paperweight.paperDevBundle("26.2.build.+") +} + +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..f2f0e103 --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java @@ -0,0 +1,27 @@ +package com.lishid.openinv.internal.paper26_2; + +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; +import com.lishid.openinv.internal.paper26_2.container.slot.OpenInventoryFactory; +import com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; + +import java.util.logging.Logger; + +@NullMarked +public class InternalAccessor extends com.lishid.openinv.internal.paper26_3.InternalAccessor { + + public InternalAccessor(Logger logger, LanguageManager lang) { + super(logger, lang); + } + + @Override + protected InventoryFactory createInventoryFactory() { + return new OpenInventoryFactory(); + } + +} diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/OpenInventoryFactory.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/OpenInventoryFactory.java new file mode 100644 index 00000000..207122bb --- /dev/null +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/OpenInventoryFactory.java @@ -0,0 +1,95 @@ +package com.lishid.openinv.internal.paper26_2.container.slot; + +import com.github.jikoo.openinv.internal.container.slot.Content; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentCrafting; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentCursor; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentDrop; +import com.lishid.openinv.internal.paper26_3.container.slot.ContentViewOnly; +import com.lishid.openinv.internal.paper26_3.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public class OpenInventoryFactory extends com.lishid.openinv.internal.paper26_3.container.slot.OpenInventoryFactory { + + @Override + public Content newCrafting( + ServerPlayer holder, + int index + ) { + return new ContentCrafting(holder, index) { + @Override + public void set(ItemStack itemStack) { + if (isAvailable(holder)) { + items.set(index, itemStack); + holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); + } else { + this.holder.drop(itemStack, false); + } + } + }; + } + + @Override + public Content newCursor(ServerPlayer holder) { + return new ContentCursor(holder) { + @Override + public void set(ItemStack itemStack) { + if (isAvailable()) { + holder.containerMenu.setCarried(itemStack); + } else { + this.holder.drop(itemStack, false); + } + } + }; + } + + @Override + public Content newDrop(ServerPlayer holder) { + return new ContentDrop(holder) { + @Override + public void set(ItemStack itemStack) { + this.holder.drop(itemStack, false); + } + }; + } + + @Override + public Content newViewOnly(ServerPlayer holder) { + return newViewOnly(holder, Placeholders.notSlot); + } + + @Override + public Content newViewOnly( + ServerPlayer holder, + ItemStack itemStack + ) { + return new ContentViewOnly(holder) { + @Override + public void set(ItemStack itemStack) { + this.holder.drop(itemStack, false); + } + + @Override + public Slot asSlot(Container container, int slot, int x, int y) { + return new SlotViewOnly(container, slot, x, y) { + @Override + public ItemStack getOrDefault() { + return itemStack; + } + }; + } + }; + } + + @Override + public org.bukkit.inventory.ItemStack asBukkitMirror(ItemStack itemStack) { + return CraftItemStack.asCraftMirror(itemStack); + } + +} diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java index c277c9f3..9d7504ff 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java @@ -1,17 +1,23 @@ package com.lishid.openinv.internal.paper26_3; -import com.lishid.openinv.internal.Accessor; +import com.github.jikoo.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.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.AnySilentContainer; import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; import com.lishid.openinv.internal.paper26_3.container.OpenInventory; +import com.lishid.openinv.internal.paper26_3.container.slot.OpenInventoryFactory; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader; import com.lishid.openinv.internal.paper26_3.player.PlayerManager; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.Player; @@ -27,16 +33,25 @@ public class InternalAccessor implements Accessor { protected final Logger logger; private final PlayerManager manager; + protected final InventoryFactory factory; private final AnySilentContainer anySilentContainer; public InternalAccessor(Logger logger, LanguageManager lang) { this.logger = logger; - manager = createPlayerManager(logger); + factory = createInventoryFactory(); + manager = createPlayerManager(logger, factory); anySilentContainer = createAnySilentContainer(logger, lang); } - protected PlayerManager createPlayerManager(Logger logger) { - return new PlayerManager(logger); + protected InventoryFactory createInventoryFactory() { + return new OpenInventoryFactory(); + } + + protected PlayerManager createPlayerManager( + Logger logger, + InventoryFactory factory + ) { + return new PlayerManager(logger, factory); } protected AnySilentContainer createAnySilentContainer( @@ -62,7 +77,7 @@ public IAnySilentContainer getAnySilentContainer() { @Override public ISpecialPlayerInventory createPlayerInventory(Player player) { - return new OpenInventory(player); + return new OpenInventory(factory, player); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java index eece58e1..de35696e 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java @@ -16,11 +16,11 @@ package com.lishid.openinv.internal.paper26_3.container; -import com.lishid.openinv.internal.AnySilentContainerBase; +import com.github.jikoo.openinv.internal.container.AnySilentContainerBase; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import com.lishid.openinv.internal.paper26_3.player.PlayerManager; -import com.lishid.openinv.util.ReflectionHelper; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.util.ReflectionHelper; +import com.github.jikoo.openinv.lang.LanguageManager; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java index 7401f1a8..e7b11c94 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/BaseOpenInventory.java @@ -1,20 +1,12 @@ package com.lishid.openinv.internal.paper26_3.container; import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; +import com.github.jikoo.openinv.internal.container.slot.Content; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenPlayerInventory; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import com.lishid.openinv.internal.paper26_3.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.paper26_3.container.slot.Content; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentCrafting; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentCraftingResult; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentCursor; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentDrop; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentEquipment; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentList; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentOffHand; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentViewOnly; -import com.lishid.openinv.internal.paper26_3.container.slot.SlotViewOnly; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import com.lishid.openinv.internal.paper26_3.player.PlayerManager; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -43,21 +35,26 @@ @NullMarked public abstract class BaseOpenInventory implements Container, InternalOwned, ISpecialPlayerInventory { - protected final List slots; + protected final InventoryFactory factory; + protected final List> slots; private final int size; protected ServerPlayer owner; private int maxStackSize = 99; protected @Nullable CraftInventory bukkitEntity; public List transaction = new ArrayList<>(); - public BaseOpenInventory(org.bukkit.entity.Player bukkitPlayer) { + public BaseOpenInventory( + InventoryFactory factory, + org.bukkit.entity.Player bukkitPlayer + ) { + this.factory = factory; owner = PlayerManager.getHandle(bukkitPlayer); // Get total size, rounding up to nearest 9 for client compatibility. int rawSize = owner.getInventory().getContainerSize() + owner.inventoryMenu.getCraftSlots().getContainerSize() + 1; size = ((int) Math.ceil(rawSize / 9.0)) * 9; - slots = NonNullList.withSize(size, new ContentViewOnly(owner)); + slots = NonNullList.withSize(size, factory.newViewOnly(owner)); setupSlots(); } @@ -75,9 +72,9 @@ protected void setupSlots() { // Off-hand: Below chestplate. addOffHand(46); // Drop slot: Bottom right. - slots.set(53, new ContentDrop(owner)); + slots.set(53, factory.newDrop(owner)); // Cursor slot: Above drop. - slots.set(44, new ContentCursor(owner)); + slots.set(44, factory.newCursor(owner)); // Crafting is displayed in the bottom right corner. // As we're using the pretty view, this is a 3x2. @@ -89,9 +86,9 @@ protected void setupSlots() { nextIndex = addArmor(nextIndex); nextIndex = addOffHand(nextIndex); nextIndex = addCrafting(nextIndex, false); - slots.set(nextIndex, new ContentCursor(owner)); + slots.set(nextIndex, factory.newCursor(owner)); // Drop slot last. - slots.set(slots.size() - 1, new ContentDrop(owner)); + slots.set(slots.size() - 1, factory.newDrop(owner)); } private int addMainInventory() { @@ -112,12 +109,7 @@ private int addMainInventory() { slots.set( localIndex, - new ContentList(owner, invIndex, type) { - @Override - protected List getItems(ServerPlayer holder) { - return holder.getInventory().getNonEquipmentItems(); - } - } + factory.newList(owner, invIndex, type, holder -> holder.getInventory().getNonEquipmentItems()) ); } return listSize; @@ -139,7 +131,7 @@ private int addArmor(int startIndex) { continue; } - slots.set(startIndex + localIndex, new ContentEquipment(owner, sorted[i])); + slots.set(startIndex + localIndex, factory.newEquipment(owner, sorted[i])); ++localIndex; } @@ -152,7 +144,7 @@ private int addOffHand(int startIndex) { return startIndex; } - slots.set(startIndex, new ContentOffHand(owner)); + slots.set(startIndex, factory.newOffHand(owner)); return startIndex + 1; } @@ -166,32 +158,17 @@ private int addCrafting(int startIndex, boolean pretty) { // Otherwise, subtract 2 and add 9 to start in the same position on the next row. int modIndex = startIndex + (localIndex < 2 || !pretty ? localIndex : localIndex + 7); - slots.set(modIndex, new ContentCrafting(owner, localIndex)); + slots.set(modIndex, factory.newCrafting(owner, localIndex)); } if (pretty) { - slots.set(startIndex + 2, new ContentViewOnly(owner) { - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotViewOnly(container, slot, x, y) { - @Override - public ItemStack getOrDefault() { - return Placeholders.craftingOutput; - } - }; - } - } - ); - slots.set(startIndex + 11, getCraftingResult(owner)); + slots.set(startIndex + 2, factory.newViewOnly(owner, Placeholders.craftingOutput)); + slots.set(startIndex + 11, factory.newCraftingResult(owner)); } return startIndex + listSize; } - protected Content getCraftingResult(ServerPlayer serverPlayer) { - return new ContentCraftingResult(serverPlayer); - } - public Slot getMenuSlot(int index, int x, int y) { return slots.get(index).asSlot(this, index, x, y); } @@ -328,7 +305,7 @@ public void clearContent() { public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { if (player instanceof ServerPlayer serverPlayer) { - return new OpenInventoryMenu(this, serverPlayer, i, viewOnly); + return new OpenInventoryMenu(factory, this, serverPlayer, i, viewOnly); } return null; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java index e9657124..5d526d19 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenEnderChest.java @@ -1,7 +1,8 @@ package com.lishid.openinv.internal.paper26_3.container; import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import com.lishid.openinv.internal.paper26_3.container.menu.OpenEnderChestMenu; import com.lishid.openinv.internal.paper26_3.player.PlayerManager; @@ -11,8 +12,10 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.StackedItemContents; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.StackedContentsCompatible; import net.minecraft.world.item.ItemStack; import org.bukkit.Location; @@ -196,9 +199,14 @@ public Component getTitle(@Nullable OpenChestMenu menu) { .append(Component.translatableWithFallback("openinv.container.enderchest.suffix", " - %s", owner.getName())); } - public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { + public @Nullable OpenChestMenu createMenu( + InventoryFactory factory, + Player player, + int i, + boolean viewOnly + ) { if (player instanceof ServerPlayer serverPlayer) { - return new OpenEnderChestMenu(this, serverPlayer, i, viewOnly); + return new OpenEnderChestMenu(factory, this, serverPlayer, i, viewOnly); } return null; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java index c012dda0..5b72a98f 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/OpenInventory.java @@ -1,5 +1,6 @@ package com.lishid.openinv.internal.paper26_3.container; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -7,6 +8,10 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.bukkit.entity.Player; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -14,8 +19,11 @@ @NullMarked public class OpenInventory extends BaseOpenInventory { - public OpenInventory(Player bukkitPlayer) { - super(bukkitPlayer); + public OpenInventory( + InventoryFactory factory, + Player bukkitPlayer + ) { + super(factory, bukkitPlayer); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java index f9335fbd..2c0c5b03 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenDummyInventory.java @@ -1,6 +1,6 @@ package com.lishid.openinv.internal.paper26_3.container.bukkit; -import com.lishid.openinv.internal.ViewOnly; +import com.github.jikoo.openinv.internal.container.ViewOnly; import net.minecraft.world.Container; import org.bukkit.Material; import org.bukkit.craftbukkit.inventory.CraftInventory; diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java index 66bbaa4e..d013f0c6 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/BaseOpenInventoryMenu.java @@ -1,14 +1,16 @@ package com.lishid.openinv.internal.paper26_3.container.menu; import com.google.common.base.Preconditions; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenDummyPlayerInventory; import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenPlayerInventorySelf; import com.lishid.openinv.internal.paper26_3.container.slot.ContentDrop; -import com.lishid.openinv.internal.paper26_3.container.slot.ContentEquipment; +import com.lishid.openinv.internal.paper26_3.container.slot.SlotEquipment; import com.lishid.openinv.internal.paper26_3.container.slot.SlotViewOnly; import com.lishid.openinv.util.Permissions; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ChestMenu; @@ -16,45 +18,25 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.function.Function; - @NullMarked public class BaseOpenInventoryMenu extends OpenSyncMenu { - private static final Function MIRROR; - - static { - Function mirror; - try { - Method craftMirror = CraftItemStack.class.getDeclaredMethod("asCraftMirror", ItemStack.class); - mirror = nms -> { - try { - Object bukkit = craftMirror.invoke(null, nms); - return (org.bukkit.inventory.ItemStack) bukkit; - } catch (InvocationTargetException | IllegalAccessException | ClassCastException e) { - // TODO replace with some kind of composition factory thing - throw new RuntimeException(e); - } - }; - } catch (NoSuchMethodException e) { - mirror = CraftItemStack::asBukkitMirror; - } - MIRROR = mirror; - } - private int offset; - public BaseOpenInventoryMenu(BaseOpenInventory inventory, ServerPlayer viewer, int i, boolean viewOnly) { - super(getMenuType(inventory, viewer), i, inventory, viewer, viewOnly); + public BaseOpenInventoryMenu( + InventoryFactory factory, + BaseOpenInventory inventory, + ServerPlayer viewer, + int i, + boolean viewOnly + ) { + super(getMenuType(inventory, viewer), i, factory, inventory, viewer, viewOnly); } private static MenuType getMenuType(BaseOpenInventory inventory, ServerPlayer viewer) { @@ -89,9 +71,9 @@ protected Slot getUpperSlot(int index, int x, int y) { return new SlotViewOnly(container, index, x, y); } - if (slot instanceof ContentEquipment.SlotEquipment equipment) { + if (slot instanceof SlotEquipment equipment) { if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } Permissions perm = switch (equipment.getEquipmentSlot()) { @@ -118,7 +100,7 @@ protected Slot getUpperSlot(int index, int x, int y) { } if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } return slot; @@ -143,7 +125,7 @@ protected CraftInventoryView, Inventory> create } Slot slot = slots.get(index); - return MIRROR.apply(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); + return factory.asBukkitMirror(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); } @Override @@ -252,7 +234,7 @@ public ItemStack quickMoveStack(Player player, int index) { // Locate the correct slot in the contents following the main inventory. for (int extra = container.getOwnerHandle().getInventory().getNonEquipmentItems().size() - offset; extra < topSize; ++extra) { Slot extraSlot = getSlot(extra); - if (extraSlot instanceof ContentEquipment.SlotEquipment equipSlot + if (extraSlot instanceof SlotEquipment equipSlot && equipSlot.getEquipmentSlot() == equipmentSlot) { // If we've found a matching slot, try to move to it. // If this succeeds, even partially, we will not attempt to move to other slots. diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java index d18c6bc7..42f5b1ef 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenChestMenu.java @@ -1,11 +1,13 @@ package com.lishid.openinv.internal.paper26_3.container.menu; import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.bukkit.OpenDummyInventory; import com.lishid.openinv.internal.paper26_3.container.slot.SlotViewOnly; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ChestMenu; @@ -28,6 +30,7 @@ public abstract class OpenChestMenu factory; protected final T container; protected final ServerPlayer viewer; protected final boolean viewOnly; @@ -38,11 +41,13 @@ public abstract class OpenChestMenu type, int containerCounter, + InventoryFactory factory, T container, ServerPlayer viewer, boolean viewOnly ) { super(type, containerCounter); + this.factory = factory; this.container = container; this.viewer = viewer; this.viewOnly = viewOnly; @@ -109,7 +114,7 @@ protected void preSlotSetup() { protected Slot getUpperSlot(int index, int x, int y) { Slot slot = new Slot(container, index, x, y); if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } return slot; } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java index ab68d260..ac0fe30b 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenEnderChestMenu.java @@ -1,7 +1,10 @@ package com.lishid.openinv.internal.paper26_3.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.inventory.Slot; @@ -12,12 +15,13 @@ public class OpenEnderChestMenu extends OpenSyncMenu { public OpenEnderChestMenu( + InventoryFactory factory, OpenEnderChest enderChest, ServerPlayer viewer, int containerId, boolean viewOnly ) { - super(getChestMenuType(enderChest.getContainerSize()), containerId, enderChest, viewer, viewOnly); + super(getChestMenuType(enderChest.getContainerSize()), containerId, factory, enderChest, viewer, viewOnly); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java index c246ffc8..e098f602 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java @@ -1,16 +1,27 @@ package com.lishid.openinv.internal.paper26_3.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ContainerInput; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.NullMarked; @NullMarked public class OpenInventoryMenu extends BaseOpenInventoryMenu { - public OpenInventoryMenu(BaseOpenInventory inventory, ServerPlayer viewer, int i, boolean viewOnly) { - super(inventory, viewer, i, viewOnly); + public OpenInventoryMenu( + InventoryFactory factory, + BaseOpenInventory inventory, + ServerPlayer viewer, + int i, + boolean viewOnly + ) { + super(factory, inventory, viewer, i, viewOnly); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java index a927c81b..14d28d89 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenSyncMenu.java @@ -2,10 +2,12 @@ import com.google.common.base.Suppliers; import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.slot.SlotPlaceholder; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.ContainerListener; @@ -41,11 +43,12 @@ public abstract class OpenSyncMenu type, int containerCounter, + InventoryFactory factory, T container, ServerPlayer viewer, boolean viewOnly ) { - super(type, containerCounter, container, viewer, viewOnly); + super(type, containerCounter, factory, container, viewer, viewOnly); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java index 53eb9fe1..dc95e8cd 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCrafting.java @@ -1,8 +1,10 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; import net.minecraft.world.entity.player.Player; @@ -17,21 +19,17 @@ * A slot in a survival crafting inventory. Unavailable when not online in a survival mode. */ @NullMarked -public class ContentCrafting implements Content { +public class ContentCrafting implements Content { private final int index; - private ServerPlayer holder; - private List items; + protected ServerPlayer holder; + protected List items; - public ContentCrafting(ServerPlayer holder, int index) { + protected ContentCrafting(ServerPlayer holder, int index) { setHolder(holder); this.index = index; } - private boolean isAvailable() { - return isAvailable(holder); - } - public static boolean isAvailable(ServerPlayer holder) { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. @@ -48,12 +46,12 @@ public void setHolder(ServerPlayer holder) { @Override public ItemStack get() { - return isAvailable() ? items.get(index) : ItemStack.EMPTY; + return isAvailable(holder) ? items.get(index) : ItemStack.EMPTY; } @Override public ItemStack remove() { - if (!this.isAvailable()) { + if (!isAvailable(holder)) { return ItemStack.EMPTY; } ItemStack removed = items.remove(index); @@ -66,7 +64,7 @@ public ItemStack remove() { @Override public ItemStack removePartial(int amount) { - if (!this.isAvailable()) { + if (!isAvailable(holder)) { return ItemStack.EMPTY; } ItemStack removed = ContainerHelper.removeItem(items, index, amount); @@ -79,11 +77,11 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - if (isAvailable()) { + if (isAvailable(holder)) { items.set(index, itemStack); holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); } else { - ContentDrop.DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } } @@ -94,7 +92,7 @@ public Slot asSlot(Container container, int slot, int x, int y) { @Override public InventoryType.SlotType getSlotType() { - return isAvailable() ? InventoryType.SlotType.CRAFTING : InventoryType.SlotType.OUTSIDE; + return isAvailable(holder) ? InventoryType.SlotType.CRAFTING : InventoryType.SlotType.OUTSIDE; } public class SlotCrafting extends SlotPlaceholder { @@ -105,27 +103,27 @@ private SlotCrafting(Container container, int index, int x, int y) { @Override public ItemStack getOrDefault() { - return isAvailable() ? items.get(ContentCrafting.this.index) : Placeholders.survivalOnly(holder); + return isAvailable(holder) ? items.get(ContentCrafting.this.index) : Placeholders.survivalOnly(holder); } @Override public boolean mayPickup(Player player) { - return isAvailable(); + return isAvailable(holder); } @Override public boolean mayPlace(ItemStack itemStack) { - return isAvailable(); + return isAvailable(holder); } @Override public boolean hasItem() { - return isAvailable() && super.hasItem(); + return isAvailable(holder) && super.hasItem(); } @Override public boolean isFake() { - return !isAvailable(); + return !isAvailable(holder); } } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java index c5315e25..6b7bd792 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCraftingResult.java @@ -15,9 +15,9 @@ *

Unmodifiable because I said so. Use your own crafting grid.

*/ @NullMarked -public class ContentCraftingResult extends ContentViewOnly { +class ContentCraftingResult extends ContentViewOnly { - public ContentCraftingResult(ServerPlayer holder) { + ContentCraftingResult(ServerPlayer holder) { super(holder); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java index 06f1d710..8ed8bdb0 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentCursor.java @@ -1,8 +1,10 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; @@ -14,11 +16,11 @@ * A slot wrapping the active menu's cursor. Unavailable when not online in a survival mode. */ @NullMarked -public class ContentCursor implements Content { +public class ContentCursor implements Content { - private ServerPlayer holder; + protected ServerPlayer holder; - public ContentCursor(ServerPlayer holder) { + protected ContentCursor(ServerPlayer holder) { this.holder = holder; } @@ -57,11 +59,11 @@ public void set(ItemStack itemStack) { if (isAvailable()) { holder.containerMenu.setCarried(itemStack); } else { - ContentDrop.DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } } - private boolean isAvailable() { + protected boolean isAvailable() { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java index eefba545..d7f0179f 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentDrop.java @@ -1,5 +1,6 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; @@ -10,45 +11,15 @@ import org.bukkit.event.inventory.InventoryType; import org.jspecify.annotations.NullMarked; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.function.BiConsumer; - /** * A fake slot used to drop items. Unavailable offline. */ @NullMarked -public class ContentDrop implements Content { - - static final BiConsumer DROP; - - // TODO Content factory - static { - BiConsumer dropMethod = null; - try { - Class.forName("net.minecraft.util.Prediction"); - dropMethod = (holder, itemStack) -> holder.drop(itemStack, false, Prediction.SERVER_ONLY); - } catch (ClassNotFoundException e) { - try { - Method method = ServerPlayer.class.getMethod("drop", ItemStack.class, boolean.class); - dropMethod = (holder, itemStack) -> { - try { - method.invoke(holder, itemStack, false); - } catch (IllegalAccessException | InvocationTargetException ex) { - // Shouldn't be possible. Eat the item until I write a slot factory. - } - }; - } catch (NoSuchMethodException ex) { - // As above, eat for now. - dropMethod = (holder, itemStack) -> {}; - } - } - DROP = dropMethod; - } +public class ContentDrop implements Content { - private ServerPlayer holder; + protected ServerPlayer holder; - public ContentDrop(ServerPlayer holder) { + protected ContentDrop(ServerPlayer holder) { this.holder = holder; } @@ -74,7 +45,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java index 77817085..510ea3a4 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentEquipment.java @@ -1,5 +1,6 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -9,19 +10,18 @@ import net.minecraft.world.item.ItemStack; import org.bukkit.event.inventory.InventoryType; import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; /** * A slot for equipment that displays placeholders if empty. */ @NullMarked -public class ContentEquipment implements Content { +class ContentEquipment implements Content { private EntityEquipment equipment; private final ItemStack placeholder; private final EquipmentSlot equipmentSlot; - public ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { + ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { setHolder(holder); placeholder = switch (equipmentSlot) { case HEAD -> Placeholders.emptyHelmet; @@ -64,7 +64,7 @@ public void set(ItemStack itemStack) { @Override public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotEquipment(container, slot, x, y); + return new SlotEquipment(container, slot, x, y, placeholder, equipmentSlot); } @Override @@ -72,40 +72,4 @@ public InventoryType.SlotType getSlotType() { return InventoryType.SlotType.ARMOR; } - public class SlotEquipment extends SlotPlaceholder { - - private @Nullable ServerPlayer viewer; - - SlotEquipment(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - ItemStack itemStack = getItem(); - if (!itemStack.isEmpty()) { - return itemStack; - } - return placeholder; - } - - public EquipmentSlot getEquipmentSlot() { - return equipmentSlot; - } - - public void onlyEquipmentFor(ServerPlayer viewer) { - this.viewer = viewer; - } - - @Override - public boolean mayPlace(ItemStack itemStack) { - if (viewer == null) { - return true; - } - - return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(itemStack) == equipmentSlot; - } - - } - } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java index c38e8eed..8d21ab41 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentList.java @@ -1,5 +1,6 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; @@ -14,13 +15,13 @@ * A normal slot backed by an item list. */ @NullMarked -public abstract class ContentList implements Content { +abstract class ContentList implements Content { private final int index; private final InventoryType.SlotType slotType; private List items; - public ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotType) { + ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotType) { this.index = index; this.slotType = slotType; setHolder(holder); diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java index e3ad1b50..cb2dfded 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentOffHand.java @@ -1,5 +1,6 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.Placeholders; import com.lishid.openinv.internal.paper26_3.player.OpenPlayer; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; @@ -16,11 +17,11 @@ * A slot for equipment that updates held items if necessary. */ @NullMarked -public class ContentOffHand extends ContentEquipment { +class ContentOffHand extends ContentEquipment { private ServerPlayer holder; - public ContentOffHand(ServerPlayer holder) { + ContentOffHand(ServerPlayer holder) { super(holder, EquipmentSlot.OFFHAND); this.holder = holder; // Redundant, but silences nullity warning. } @@ -38,7 +39,7 @@ public InventoryType.SlotType getSlotType() { @Override public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotEquipment(container, slot, x, y) { + return new SlotEquipment(container, slot, x, y, Placeholders.emptyOffHand, EquipmentSlot.OFFHAND) { @Override public void setChanged() { if (OpenPlayer.isConnected(holder.connection) && !Objects.equals(holder.containerMenu, holder.inventoryMenu)) { diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java index 4ef2add6..d1ccdad8 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/ContentViewOnly.java @@ -1,6 +1,8 @@ package com.lishid.openinv.internal.paper26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -11,11 +13,11 @@ * A view-only slot that can't be interacted with. */ @NullMarked -public class ContentViewOnly implements Content { +public class ContentViewOnly implements Content { protected ServerPlayer holder; - public ContentViewOnly(ServerPlayer holder) { + protected ContentViewOnly(ServerPlayer holder) { this.holder = holder; } @@ -41,7 +43,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - ContentDrop.DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } @Override diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/OpenInventoryFactory.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/OpenInventoryFactory.java new file mode 100644 index 00000000..ae58fa25 --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/OpenInventoryFactory.java @@ -0,0 +1,115 @@ +package com.lishid.openinv.internal.paper26_3.container.slot; + +import com.github.jikoo.openinv.internal.container.slot.Content; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.inventory.InventoryType; +import org.jspecify.annotations.NullMarked; + +import java.util.List; +import java.util.function.Function; + +@NullMarked +public class OpenInventoryFactory implements InventoryFactory { + + @Override + public Content newCrafting(ServerPlayer holder, int index) { + return new ContentCrafting(holder, index); + } + + @Override + public Content newCraftingResult(ServerPlayer holder) { + return new ContentCraftingResult(holder); + } + + @Override + public Content newCursor(ServerPlayer holder) { + return new ContentCursor(holder); + } + + @Override + public Content newDrop(ServerPlayer holder) { + return new ContentDrop(holder); + } + + @Override + public Content newEquipment( + ServerPlayer holder, + EquipmentSlot equipmentSlot + ) { + return new ContentEquipment(holder, equipmentSlot); + } + + @Override + public Content newList( + ServerPlayer holder, + int index, + InventoryType.SlotType slotType, + Function> listSupplier + ) { + return new ContentList(holder, index, slotType) { + @Override + protected List getItems(ServerPlayer holder) { + return listSupplier.apply(holder); + } + }; + } + + @Override + public Content newOffHand(ServerPlayer holder) { + return new ContentOffHand(holder); + } + + @Override + public Content newViewOnly(ServerPlayer holder) { + return new ContentViewOnly(holder); + } + + @Override + public Content newViewOnly(ServerPlayer holder, ItemStack itemStack) { + return new ContentViewOnly(holder) { + @Override + public Slot asSlot(Container container, int slot, int x, int y) { + return new SlotViewOnly(container, slot, x, y) { + @Override + public ItemStack getOrDefault() { + return itemStack; + } + }; + } + }; + } + + @Override + public Slot wrapViewOnly(Slot wrapped) { + SlotViewOnly wrapper; + if (wrapped instanceof SlotPlaceholder placeholder) { + 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.getContainerSlot(), wrapped.x, wrapped.y) { + @Override + public ItemStack getOrDefault() { + return wrapped.getItem(); + } + }; + } + wrapper.index = wrapped.index; + return wrapper; + } + + @Override + public org.bukkit.inventory.ItemStack asBukkitMirror(ItemStack itemStack) { + return CraftItemStack.asBukkitMirror(itemStack); + } + +} diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotEquipment.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotEquipment.java new file mode 100644 index 00000000..90dd4be1 --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotEquipment.java @@ -0,0 +1,49 @@ +package com.lishid.openinv.internal.paper26_3.container.slot; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public class SlotEquipment extends SlotPlaceholder { + + private final ItemStack placeholder; + private final EquipmentSlot equipmentSlot; + private @Nullable ServerPlayer viewer; + + SlotEquipment(Container container, int index, int x, int y, ItemStack placeholder, EquipmentSlot equipmentSlot) { + super(container, index, x, y); + this.placeholder = placeholder; + this.equipmentSlot = equipmentSlot; + } + + @Override + public ItemStack getOrDefault() { + ItemStack itemStack = getItem(); + if (!itemStack.isEmpty()) { + return itemStack; + } + return placeholder; + } + + public EquipmentSlot getEquipmentSlot() { + return equipmentSlot; + } + + public void onlyEquipmentFor(ServerPlayer viewer) { + this.viewer = viewer; + } + + @Override + public boolean mayPlace(ItemStack itemStack) { + if (viewer == null) { + return true; + } + + return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(itemStack) == equipmentSlot; + } + +} diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java index e890e747..de470b5b 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotPlaceholder.java @@ -13,7 +13,7 @@ @NullMarked public abstract class SlotPlaceholder extends Slot { - public SlotPlaceholder(Container container, int index, int x, int y) { + SlotPlaceholder(Container container, int index, int x, int y) { super(container, index, x, y); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java index 8095684b..ebb382bf 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java @@ -15,27 +15,6 @@ @NullMarked public class SlotViewOnly extends SlotPlaceholder { - public static SlotViewOnly wrap(Slot wrapped) { - SlotViewOnly wrapper; - if (wrapped instanceof SlotPlaceholder placeholder) { - 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.getContainerSlot(), wrapped.x, wrapped.y) { - @Override - public ItemStack getOrDefault() { - return wrapped.getItem(); - } - }; - } - wrapper.index = wrapped.index; - return wrapper; - } - public SlotViewOnly(Container container, int index, int x, int y) { super(container, index, x, y); } diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java index 8d61cc64..0653669e 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/PlayerManager.java @@ -1,10 +1,11 @@ package com.lishid.openinv.internal.paper26_3.player; import com.lishid.openinv.internal.ISpecialInventory; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; import com.lishid.openinv.internal.paper26_3.container.OpenEnderChest; import com.lishid.openinv.internal.paper26_3.container.menu.OpenChestMenu; -import com.lishid.openinv.util.JulLoggerAdapter; +import com.github.jikoo.openinv.util.JulLoggerAdapter; import com.mojang.authlib.GameProfile; import com.mojang.logging.LogUtils; import io.papermc.paper.adventure.PaperAdventure; @@ -17,9 +18,13 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ProblemReporter; +import net.minecraft.world.Container; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.ChatVisiblity; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.level.storage.TagValueInput; @@ -46,13 +51,18 @@ import java.util.logging.Logger; @NullMarked -public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { +public class PlayerManager implements com.github.jikoo.openinv.internal.PlayerManager { protected final Logger logger; + protected final InventoryFactory factory; protected @Nullable Field bukkitEntity; - public PlayerManager(Logger logger) { + public PlayerManager( + Logger logger, + InventoryFactory factory + ) { this.logger = logger; + this.factory = factory; try { bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); } catch (NoSuchFieldException e) { @@ -291,7 +301,7 @@ public Player inject(Player player) { 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); + menu = enderChest.createMenu(factory, player, player.nextContainerCounter(), viewOnly); title = enderChest.getTitle(menu); } else { return null; diff --git a/internal/spigot26_1/build.gradle.kts b/internal/spigot26_1/build.gradle.kts index 34ab1452..07fb6e72 100644 --- a/internal/spigot26_1/build.gradle.kts +++ b/internal/spigot26_1/build.gradle.kts @@ -30,6 +30,9 @@ dependencies { compileOnly(project(":openinvapi")) compileOnly(project(":openinvcommon")) + compileOnly(project(":openinvadapterspigot26_2")) { + exclude(group = "org.spigotmc", module = "spigot") + } compileOnly(project(":openinvadapterspigot26_3")) { 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 index 9511a48f..1e07d056 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,8 +1,14 @@ package com.github.jikoo.openinv.internal.spigot26_1; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; 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 com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.bukkit.configuration.ConfigurationSection; import org.jspecify.annotations.NullMarked; @@ -10,18 +16,18 @@ import java.util.logging.Logger; @NullMarked -public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_3.InternalAccessor { - - private final PlayerManager manager; +public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_2.InternalAccessor { public InternalAccessor(Logger logger, LanguageManager lang) { super(logger, lang); - this.manager = new PlayerManager(logger); } @Override - public PlayerManager getPlayerManager() { - return manager; + protected PlayerManager createPlayerManager( + Logger logger, + InventoryFactory factory + ) { + return new PlayerManager(logger, factory); } @Override 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 index d5d78c12..fbfec835 100644 --- 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 @@ -1,6 +1,12 @@ package com.github.jikoo.openinv.internal.spigot26_1.player; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; @@ -8,8 +14,11 @@ @NullMarked public class PlayerManager extends com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager { - public PlayerManager(Logger logger) { - super(logger); + public PlayerManager( + Logger logger, + InventoryFactory factory + ) { + super(logger, factory); } @Override diff --git a/internal/spigot26_2/build.gradle.kts b/internal/spigot26_2/build.gradle.kts new file mode 100644 index 00000000..5fc838c5 --- /dev/null +++ b/internal/spigot26_2/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.2-R0.1-SNAPSHOT" + compileOnly("com.mojang:logging:1.7.12") + compileOnly("com.mojang:brigadier:1.3.10") + compileOnly("com.mojang:datafixerupper:10.0.21") + compileOnly("com.mojang:authlib:9.0.75") + + compileOnly(project(":openinvapi")) + compileOnly(project(":openinvcommon")) + + compileOnly(project(":openinvadapterspigot26_3")) { + exclude(group = "org.spigotmc", module = "spigot") + } +} diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java new file mode 100644 index 00000000..8886e3e3 --- /dev/null +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/InternalAccessor.java @@ -0,0 +1,27 @@ +package com.github.jikoo.openinv.internal.spigot26_2; + +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; +import com.github.jikoo.openinv.internal.spigot26_2.container.slot.OpenInventoryFactory; +import com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; + +import java.util.logging.Logger; + +@NullMarked +public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_3.InternalAccessor { + + public InternalAccessor(Logger logger, LanguageManager lang) { + super(logger, lang); + } + + @Override + protected InventoryFactory createInventoryFactory() { + return new OpenInventoryFactory(); + } + +} diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/OpenInventoryFactory.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/OpenInventoryFactory.java new file mode 100644 index 00000000..d222c9d9 --- /dev/null +++ b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/OpenInventoryFactory.java @@ -0,0 +1,89 @@ +package com.github.jikoo.openinv.internal.spigot26_2.container.slot; + +import com.github.jikoo.openinv.internal.container.slot.Content; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCrafting; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCursor; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentDrop; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentViewOnly; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotViewOnly; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public class OpenInventoryFactory extends com.github.jikoo.openinv.internal.spigot26_3.container.slot.OpenInventoryFactory { + + @Override + public Content newCrafting( + ServerPlayer holder, + int index + ) { + return new ContentCrafting(holder, index) { + @Override + public void set(ItemStack itemStack) { + if (isAvailable(holder)) { + items.set(index, itemStack); + holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); + } else { + this.holder.drop(itemStack, false); + } + } + }; + } + + @Override + public Content newCursor(ServerPlayer holder) { + return new ContentCursor(holder) { + @Override + public void set(ItemStack itemStack) { + if (isAvailable()) { + holder.containerMenu.setCarried(itemStack); + } else { + this.holder.drop(itemStack, false); + } + } + }; + } + + @Override + public Content newDrop(ServerPlayer holder) { + return new ContentDrop(holder) { + @Override + public void set(ItemStack itemStack) { + this.holder.drop(itemStack, false); + } + }; + } + + @Override + public Content newViewOnly(ServerPlayer holder) { + return newViewOnly(holder, Placeholders.notSlot); + } + + @Override + public Content newViewOnly( + ServerPlayer holder, + ItemStack itemStack + ) { + return new ContentViewOnly(holder) { + @Override + public void set(ItemStack itemStack) { + this.holder.drop(itemStack, false); + } + + @Override + public Slot asSlot(Container container, int slot, int x, int y) { + return new SlotViewOnly(container, slot, x, y) { + @Override + public ItemStack getOrDefault() { + return itemStack; + } + }; + } + }; + } + +} diff --git a/internal/spigot26_3/build.gradle.kts b/internal/spigot26_3/build.gradle.kts index dd42042a..d7721ce4 100644 --- a/internal/spigot26_3/build.gradle.kts +++ b/internal/spigot26_3/build.gradle.kts @@ -22,10 +22,10 @@ apply() dependencies { compileOnly(libs.spigotapi) extensions.getByType(SpigotDependencyExtension::class.java).version = "26.3-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("com.mojang:logging:1.7.12") + compileOnly("com.mojang:brigadier:1.3.11") + compileOnly("com.mojang:datafixerupper:10.0.21") + compileOnly("com.mojang:authlib:10.0.77") compileOnly(project(":openinvapi")) compileOnly(project(":openinvcommon")) diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java index 16fba377..e5488ab7 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java @@ -1,23 +1,29 @@ package com.github.jikoo.openinv.internal.spigot26_3; -import com.github.jikoo.openinv.internal.spigot26_3.container.AnySilentContainer; -import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; -import com.github.jikoo.openinv.internal.spigot26_3.container.OpenEnderChest; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.PlaceholderLoader; -import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; -import com.lishid.openinv.internal.Accessor; +import com.github.jikoo.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.util.lang.LanguageManager; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; +import com.github.jikoo.openinv.internal.spigot26_3.container.AnySilentContainer; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenEnderChest; +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.OpenInventoryFactory; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.PlaceholderLoader; +import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; +import com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; 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.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.logging.Level; import java.util.logging.Logger; @@ -27,12 +33,36 @@ public class InternalAccessor implements Accessor { protected final Logger logger; private final PlayerManager manager; + private final InventoryFactory factory; private final AnySilentContainer anySilentContainer; public InternalAccessor(Logger logger, LanguageManager lang) { this.logger = logger; - manager = new PlayerManager(logger); - anySilentContainer = new AnySilentContainer(logger, lang); + factory = createInventoryFactory(); + manager = createPlayerManager(logger, factory); + anySilentContainer = createAnySilentContainer(logger, lang); + } + + protected InventoryFactory createInventoryFactory() { + return new OpenInventoryFactory(); + } + + protected PlayerManager createPlayerManager( + Logger logger, + InventoryFactory factory + ) { + return new PlayerManager(logger, factory); + } + + protected AnySilentContainer createAnySilentContainer( + Logger logger, + LanguageManager lang + ) { + return new AnySilentContainer(logger, lang); + } + + protected PlaceholderLoader createPlaceholderLoader() { + return new PlaceholderLoader(); } @Override @@ -47,7 +77,7 @@ public IAnySilentContainer getAnySilentContainer() { @Override public ISpecialPlayerInventory createPlayerInventory(Player player) { - return new OpenInventory(player); + return new OpenInventory(factory, player); } @Override @@ -72,7 +102,7 @@ public void reload(ConfigurationSection config) { ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); try { // Reset placeholders to defaults and try to load configuration. - new PlaceholderLoader().load(placeholders); + createPlaceholderLoader().load(placeholders); } catch (Exception e) { logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java index 03a0def1..04638aa2 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java @@ -2,9 +2,9 @@ import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; -import com.lishid.openinv.internal.AnySilentContainerBase; -import com.lishid.openinv.util.ReflectionHelper; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.internal.container.AnySilentContainerBase; +import com.github.jikoo.openinv.util.ReflectionHelper; +import com.github.jikoo.openinv.lang.LanguageManager; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java index 64991b05..55dfc6af 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenEnderChest.java @@ -1,18 +1,21 @@ package com.github.jikoo.openinv.internal.spigot26_3.container; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenEnderChestMenu; import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; 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.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.StackedItemContents; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.StackedContentsCompatible; import net.minecraft.world.item.ItemStack; import org.bukkit.Location; @@ -192,9 +195,14 @@ public Component getTitle(@Nullable OpenChestMenu menu) { .append(Component.translatableWithFallback("openinv.container.enderchest.suffix", " - %s", owner.getName())); } - public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { + public @Nullable OpenChestMenu createMenu( + InventoryFactory factory, + Player player, + int i, + boolean viewOnly + ) { if (player instanceof ServerPlayer serverPlayer) { - return new OpenEnderChestMenu(this, serverPlayer, i, viewOnly); + return new OpenEnderChestMenu(factory, this, serverPlayer, i, viewOnly); } return null; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java index cb9e4f25..e14e4e05 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/OpenInventory.java @@ -1,22 +1,14 @@ package com.github.jikoo.openinv.internal.spigot26_3.container; +import com.github.jikoo.openinv.internal.container.InternalOwned; +import com.github.jikoo.openinv.internal.container.slot.Content; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenPlayerInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenInventoryMenu; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.Content; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCrafting; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCraftingResult; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentCursor; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentDrop; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentEquipment; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentList; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentOffHand; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentViewOnly; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotViewOnly; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.InternalOwned; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.ChatFormatting; import net.minecraft.core.NonNullList; @@ -47,21 +39,26 @@ @NullMarked public class OpenInventory implements Container, InternalOwned, ISpecialPlayerInventory { - protected final List slots; + protected final InventoryFactory factory; + protected final List> slots; private final int size; protected ServerPlayer owner; private int maxStackSize = 99; protected @Nullable CraftInventory bukkitEntity; public List transaction = new ArrayList<>(); - public OpenInventory(org.bukkit.entity.Player bukkitPlayer) { + public OpenInventory( + InventoryFactory factory, + org.bukkit.entity.Player bukkitPlayer + ) { + this.factory = factory; owner = PlayerManager.getHandle(bukkitPlayer); // Get total size, rounding up to nearest 9 for client compatibility. int rawSize = owner.getInventory().getContainerSize() + owner.inventoryMenu.getCraftSlots().getContainerSize() + 1; size = ((int) Math.ceil(rawSize / 9.0)) * 9; - slots = NonNullList.withSize(size, new ContentViewOnly(owner)); + slots = NonNullList.withSize(size, factory.newViewOnly(owner)); setupSlots(); } @@ -79,9 +76,9 @@ protected void setupSlots() { // Off-hand: Below chestplate. addOffHand(46); // Drop slot: Bottom right. - slots.set(53, new ContentDrop(owner)); + slots.set(53, factory.newDrop(owner)); // Cursor slot: Above drop. - slots.set(44, new ContentCursor(owner)); + slots.set(44, factory.newCursor(owner)); // Crafting is displayed in the bottom right corner. // As we're using the pretty view, this is a 3x2. @@ -93,9 +90,9 @@ protected void setupSlots() { nextIndex = addArmor(nextIndex); nextIndex = addOffHand(nextIndex); nextIndex = addCrafting(nextIndex, false); - slots.set(nextIndex, new ContentCursor(owner)); + slots.set(nextIndex, factory.newCursor(owner)); // Drop slot last. - slots.set(slots.size() - 1, new ContentDrop(owner)); + slots.set(slots.size() - 1, factory.newDrop(owner)); } private int addMainInventory() { @@ -116,12 +113,7 @@ private int addMainInventory() { slots.set( localIndex, - new ContentList(owner, invIndex, type) { - @Override - protected List getItems(ServerPlayer holder) { - return holder.getInventory().getNonEquipmentItems(); - } - } + factory.newList(owner, invIndex, type, holder -> holder.getInventory().getNonEquipmentItems()) ); } return listSize; @@ -143,7 +135,7 @@ private int addArmor(int startIndex) { continue; } - slots.set(startIndex + localIndex, new ContentEquipment(owner, sorted[i])); + slots.set(startIndex + localIndex, factory.newEquipment(owner, sorted[i])); ++localIndex; } @@ -156,7 +148,7 @@ private int addOffHand(int startIndex) { return startIndex; } - slots.set(startIndex, new ContentOffHand(owner)); + slots.set(startIndex, factory.newOffHand(owner)); return startIndex + 1; } @@ -170,32 +162,17 @@ private int addCrafting(int startIndex, boolean pretty) { // Otherwise, subtract 2 and add 9 to start in the same position on the next row. int modIndex = startIndex + (localIndex < 2 || !pretty ? localIndex : localIndex + 7); - slots.set(modIndex, new ContentCrafting(owner, localIndex)); + slots.set(modIndex, factory.newCrafting(owner, localIndex)); } if (pretty) { - slots.set(startIndex + 2, new ContentViewOnly(owner) { - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotViewOnly(container, slot, x, y) { - @Override - public ItemStack getOrDefault() { - return Placeholders.craftingOutput; - } - }; - } - } - ); - slots.set(startIndex + 11, getCraftingResult(owner)); + slots.set(startIndex + 2, factory.newViewOnly(owner, Placeholders.craftingOutput)); + slots.set(startIndex + 11, factory.newCraftingResult(owner)); } return startIndex + listSize; } - protected Content getCraftingResult(ServerPlayer serverPlayer) { - return new ContentCraftingResult(serverPlayer); - } - public Slot getMenuSlot(int index, int x, int y) { return slots.get(index).asSlot(this, index, x, y); } @@ -358,7 +335,7 @@ public void clearContent() { public @Nullable OpenChestMenu createMenu(Player player, int i, boolean viewOnly) { if (player instanceof ServerPlayer serverPlayer) { - return new OpenInventoryMenu(this, serverPlayer, i, viewOnly); + return new OpenInventoryMenu(factory, this, serverPlayer, i, viewOnly); } return null; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java index 374d828c..3cd97f55 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenDummyInventory.java @@ -1,6 +1,6 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; -import com.lishid.openinv.internal.ViewOnly; +import com.github.jikoo.openinv.internal.container.ViewOnly; import net.minecraft.world.Container; import org.bukkit.Material; import org.bukkit.craftbukkit.inventory.CraftInventory; diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java index c75b8d93..9cf8a75a 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenChestMenu.java @@ -1,11 +1,13 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenDummyInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotViewOnly; import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ChestMenu; @@ -29,6 +31,7 @@ public abstract class OpenChestMenu factory; protected final T container; protected final ServerPlayer viewer; protected final boolean viewOnly; @@ -39,11 +42,13 @@ public abstract class OpenChestMenu type, int containerCounter, + InventoryFactory factory, T container, ServerPlayer viewer, boolean viewOnly ) { super(type, containerCounter); + this.factory = factory; this.container = container; this.viewer = viewer; this.viewOnly = viewOnly; @@ -111,7 +116,7 @@ protected void preSlotSetup() { protected Slot getUpperSlot(int index, int x, int y) { Slot slot = new Slot(container, index, x, y); if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } return slot; } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java index c0c4dfd6..767ee78d 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenEnderChestMenu.java @@ -1,7 +1,10 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.OpenEnderChest; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -11,12 +14,13 @@ public class OpenEnderChestMenu extends OpenSyncMenu { public OpenEnderChestMenu( + InventoryFactory factory, OpenEnderChest enderChest, ServerPlayer viewer, int containerId, boolean viewOnly ) { - super(getChestMenuType(enderChest.getContainerSize()), containerId, enderChest, viewer, viewOnly); + super(getChestMenuType(enderChest.getContainerSize()), containerId, factory, enderChest, viewer, viewOnly); } @Override diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java index df8f73e8..2de76986 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenInventoryMenu.java @@ -1,14 +1,16 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenDummyPlayerInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.bukkit.OpenPlayerInventorySelf; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentDrop; -import com.github.jikoo.openinv.internal.spigot26_3.container.slot.ContentEquipment; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotEquipment; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotViewOnly; import com.google.common.base.Preconditions; import com.lishid.openinv.util.Permissions; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ChestMenu; @@ -28,8 +30,12 @@ public class OpenInventoryMenu extends OpenSyncMenu { private int offset; - public OpenInventoryMenu(OpenInventory inventory, ServerPlayer viewer, int i, boolean viewOnly) { - super(getMenuType(inventory, viewer), i, inventory, viewer, viewOnly); + public OpenInventoryMenu( + InventoryFactory factory, + OpenInventory inventory, + ServerPlayer viewer, int i, boolean viewOnly + ) { + super(getMenuType(inventory, viewer), i, factory, inventory, viewer, viewOnly); } private static MenuType getMenuType(OpenInventory inventory, ServerPlayer viewer) { @@ -64,9 +70,9 @@ protected Slot getUpperSlot(int index, int x, int y) { return new SlotViewOnly(container, index, x, y); } - if (slot instanceof ContentEquipment.SlotEquipment equipment) { + if (slot instanceof SlotEquipment equipment) { if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } Permissions perm = switch (equipment.getEquipmentSlot()) { @@ -93,7 +99,7 @@ protected Slot getUpperSlot(int index, int x, int y) { } if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } return slot; @@ -112,7 +118,7 @@ protected CraftInventoryView, Inventory> createBukk return new CraftInventoryView<>(viewer.getBukkitEntity(), bukkitInventory, this) { @Override - public org.bukkit.inventory.ItemStack getItem(int index) { + public org.bukkit.inventory.@Nullable ItemStack getItem(int index) { if (viewOnly || index < 0) { return null; } @@ -227,8 +233,7 @@ public ItemStack quickMoveStack(Player player, int index) { // Locate the correct slot in the contents following the main inventory. for (int extra = container.getOwnerHandle().getInventory().getNonEquipmentItems().size() - offset; extra < topSize; ++extra) { Slot extraSlot = getSlot(extra); - if (extraSlot instanceof ContentEquipment.SlotEquipment equipSlot - && equipSlot.getEquipmentSlot() == equipmentSlot) { + if (extraSlot instanceof SlotEquipment equipSlot && equipSlot.getEquipmentSlot() == equipmentSlot) { // If we've found a matching slot, try to move to it. // If this succeeds, even partially, we will not attempt to move to other slots. // Otherwise, armor is already occupied, so we'll fall through to main inventory. diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java index 017f48fa..dd97f639 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/menu/OpenSyncMenu.java @@ -1,14 +1,16 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.menu; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.SlotPlaceholder; import com.google.common.base.Suppliers; import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.InternalOwned; +import com.github.jikoo.openinv.internal.container.InternalOwned; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.network.HashedStack; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.inventory.ContainerListener; @@ -29,7 +31,7 @@ * An extension of {@link OpenChestMenu} that supports {@link SlotPlaceholder placeholders}. */ @NullMarked -@SuppressWarnings("HidingField") // Revisit when removing 1.21.4 support +@SuppressWarnings("HidingField") public abstract class OpenSyncMenu> extends OpenChestMenu { @@ -44,11 +46,12 @@ public abstract class OpenSyncMenu type, int containerCounter, + InventoryFactory factory, T container, ServerPlayer viewer, boolean viewOnly ) { - super(type, containerCounter, container, viewer, viewOnly); + super(type, containerCounter, factory, container, viewer, viewOnly); } // Overrides from here on are purely to modify the sync process to send placeholder items. diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java deleted file mode 100644 index 7fbda6f7..00000000 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/Content.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.github.jikoo.openinv.internal.spigot26_3.container.slot; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.jspecify.annotations.NullMarked; - -/** - * An interface defining behaviors for entries in a {@link Container}. Used to reduce duplicate content reordering. - */ -@NullMarked -public interface Content { - - /** - * Update internal holder. - * - * @param holder the new holder - */ - void setHolder(ServerPlayer holder); - - /** - * Get the current item. - * - * @return the current item - */ - ItemStack get(); - - /** - * Remove the current item. - * - * @return the current item - */ - ItemStack remove(); - - /** - * Remove some of the current item. - * - * @return the current item - */ - ItemStack removePartial(int amount); - - /** - * Set the current item. If slot is currently not usable, will drop item instead. - * - * @param itemStack the item to set - */ - void set(ItemStack itemStack); - - /** - * Get a {@link Slot} for use in a {@link net.minecraft.world.inventory.AbstractContainerMenu ContainerMenu}. Will - * impose any specific restrictions to insertion or removal. - * - * @param container the backing container - * @param slot the slot of the backing container represented - * @param x clientside x dimension from top left of inventory, not used - * @param y clientside y dimension from top left of inventory, not used - * @return a menu slot - */ - Slot asSlot(Container container, int slot, int x, int y); - - /** - * Get a loose Bukkit translation of what this slot stores. For example, any slot that drops items at the owner rather - * than insert them will report itself as being {@link org.bukkit.event.inventory.InventoryType.SlotType#OUTSIDE}. - * - * @return the closes Bukkit slot type - */ - org.bukkit.event.inventory.InventoryType.SlotType getSlotType(); - -} diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java index 7b071b31..b7d0cd32 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCrafting.java @@ -2,7 +2,9 @@ import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; +import com.github.jikoo.openinv.internal.container.slot.Content; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; import net.minecraft.world.entity.player.Player; @@ -17,21 +19,17 @@ * A slot in a survival crafting inventory. Unavailable when not online in a survival mode. */ @NullMarked -public class ContentCrafting implements Content { +public class ContentCrafting implements Content { private final int index; - private ServerPlayer holder; - private List items; + protected ServerPlayer holder; + protected List items; - public ContentCrafting(ServerPlayer holder, int index) { + protected ContentCrafting(ServerPlayer holder, int index) { setHolder(holder); this.index = index; } - private boolean isAvailable() { - return isAvailable(holder); - } - public static boolean isAvailable(ServerPlayer holder) { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. @@ -48,12 +46,12 @@ public void setHolder(ServerPlayer holder) { @Override public ItemStack get() { - return isAvailable() ? items.get(index) : ItemStack.EMPTY; + return isAvailable(holder) ? items.get(index) : ItemStack.EMPTY; } @Override public ItemStack remove() { - if (!this.isAvailable()) { + if (!isAvailable(holder)) { return ItemStack.EMPTY; } ItemStack removed = items.remove(index); @@ -66,7 +64,7 @@ public ItemStack remove() { @Override public ItemStack removePartial(int amount) { - if (!this.isAvailable()) { + if (!isAvailable(holder)) { return ItemStack.EMPTY; } ItemStack removed = ContainerHelper.removeItem(items, index, amount); @@ -79,11 +77,11 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - if (isAvailable()) { + if (isAvailable(holder)) { items.set(index, itemStack); holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); } else { - ContentDrop.DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } } @@ -94,7 +92,7 @@ public Slot asSlot(Container container, int slot, int x, int y) { @Override public InventoryType.SlotType getSlotType() { - return isAvailable() ? InventoryType.SlotType.CRAFTING : InventoryType.SlotType.OUTSIDE; + return isAvailable(holder) ? InventoryType.SlotType.CRAFTING : InventoryType.SlotType.OUTSIDE; } public class SlotCrafting extends SlotPlaceholder { @@ -105,27 +103,27 @@ private SlotCrafting(Container container, int index, int x, int y) { @Override public ItemStack getOrDefault() { - return isAvailable() ? items.get(ContentCrafting.this.index) : Placeholders.survivalOnly(holder); + return isAvailable(holder) ? items.get(ContentCrafting.this.index) : Placeholders.survivalOnly(holder); } @Override public boolean mayPickup(Player player) { - return isAvailable(); + return isAvailable(holder); } @Override public boolean mayPlace(ItemStack itemStack) { - return isAvailable(); + return isAvailable(holder); } @Override public boolean hasItem() { - return isAvailable() && super.hasItem(); + return isAvailable(holder) && super.hasItem(); } @Override public boolean isFake() { - return !isAvailable(); + return !isAvailable(holder); } } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java index 44271f02..06336206 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCraftingResult.java @@ -15,9 +15,9 @@ *

Unmodifiable because I said so. Use your own crafting grid.

*/ @NullMarked -public class ContentCraftingResult extends ContentViewOnly { +class ContentCraftingResult extends ContentViewOnly { - public ContentCraftingResult(ServerPlayer holder) { + ContentCraftingResult(ServerPlayer holder) { super(holder); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java index 0bd6d4b0..86c58f6a 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentCursor.java @@ -1,8 +1,10 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; @@ -14,11 +16,11 @@ * A slot wrapping the active menu's cursor. Unavailable when not online in a survival mode. */ @NullMarked -public class ContentCursor implements Content { +public class ContentCursor implements Content { - private ServerPlayer holder; + protected ServerPlayer holder; - public ContentCursor(ServerPlayer holder) { + protected ContentCursor(ServerPlayer holder) { this.holder = holder; } @@ -57,11 +59,11 @@ public void set(ItemStack itemStack) { if (isAvailable()) { holder.containerMenu.setCarried(itemStack); } else { - ContentDrop.DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } } - private boolean isAvailable() { + protected boolean isAvailable() { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java index 0513748a..406c1d66 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentDrop.java @@ -1,5 +1,6 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; @@ -10,45 +11,15 @@ import org.bukkit.event.inventory.InventoryType; import org.jspecify.annotations.NullMarked; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.function.BiConsumer; - /** * A fake slot used to drop items. Unavailable offline. */ @NullMarked -public class ContentDrop implements Content { - - static final BiConsumer DROP; - - // TODO Content factory - static { - BiConsumer dropMethod = null; - try { - Class.forName("net.minecraft.util.Prediction"); - dropMethod = (holder, itemStack) -> holder.drop(itemStack, false, Prediction.SERVER_ONLY); - } catch (ClassNotFoundException e) { - try { - Method method = ServerPlayer.class.getMethod("drop", ItemStack.class, boolean.class); - dropMethod = (holder, itemStack) -> { - try { - method.invoke(holder, itemStack, false); - } catch (IllegalAccessException | InvocationTargetException ex) { - // Shouldn't be possible. Eat the item until I write a slot factory. - } - }; - } catch (NoSuchMethodException ex) { - // As above, eat for now. - dropMethod = (holder, itemStack) -> {}; - } - } - DROP = dropMethod; - } +public class ContentDrop implements Content { - private ServerPlayer holder; + protected ServerPlayer holder; - public ContentDrop(ServerPlayer holder) { + protected ContentDrop(ServerPlayer holder) { this.holder = holder; } @@ -74,7 +45,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } @Override diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java index 2220643c..23a40def 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentEquipment.java @@ -1,5 +1,6 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -12,14 +13,17 @@ import org.bukkit.inventory.PlayerInventory; import org.jspecify.annotations.NullMarked; +/** + * A slot for equipment that displays placeholders if empty. + */ @NullMarked -public class ContentEquipment implements Content { +class ContentEquipment implements Content { private PlayerInventory equipment; private final ItemStack placeholder; private final org.bukkit.inventory.EquipmentSlot equipmentSlot; - public ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { + ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { setHolder(holder); placeholder = switch (equipmentSlot) { case HEAD -> Placeholders.emptyHelmet; @@ -50,16 +54,11 @@ public ItemStack remove() { @Override public ItemStack removePartial(int amount) { - if (amount <= 0) { - return ItemStack.EMPTY; - } ItemStack current = get(); - if (current.isEmpty()) { - return ItemStack.EMPTY; + if (!current.isEmpty() && amount > 0) { + return current.split(amount); } - ItemStack split = current.split(amount); - set(current); - return split; + return ItemStack.EMPTY; } @Override @@ -69,7 +68,7 @@ public void set(ItemStack itemStack) { @Override public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotEquipment(container, slot, x, y); + return new SlotEquipment(container, slot, x, y, placeholder, CraftEquipmentSlot.getNMS(equipmentSlot)); } @Override @@ -77,41 +76,4 @@ public InventoryType.SlotType getSlotType() { return InventoryType.SlotType.ARMOR; } - public class SlotEquipment extends SlotPlaceholder { - - private ServerPlayer viewer; - - SlotEquipment(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - ItemStack itemStack = getItem(); - if (!itemStack.isEmpty()) { - return itemStack; - } - return placeholder; - } - - public EquipmentSlot getEquipmentSlot() { - return CraftEquipmentSlot.getNMS(equipmentSlot); - } - - public void onlyEquipmentFor(ServerPlayer viewer) { - this.viewer = viewer; - } - - @Override - public boolean mayPlace(ItemStack itemStack) { - if (viewer == null) { - return true; - } - - return equipmentSlot == org.bukkit.inventory.EquipmentSlot.OFF_HAND - || viewer.getEquipmentSlotForItem(itemStack) == CraftEquipmentSlot.getNMS(equipmentSlot); - } - - } - } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java index 69677936..9cbf47f0 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentList.java @@ -1,5 +1,6 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; @@ -14,13 +15,13 @@ * A normal slot backed by an item list. */ @NullMarked -public abstract class ContentList implements Content { +abstract class ContentList implements Content { private final int index; private final InventoryType.SlotType slotType; - protected List items; + private List items; - public ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotType) { + ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotType) { this.index = index; this.slotType = slotType; setHolder(holder); @@ -41,7 +42,7 @@ public ItemStack get() { @Override public ItemStack remove() { ItemStack removed = items.remove(index); - return removed == null || removed.isEmpty() ? ItemStack.EMPTY : removed; + return removed.isEmpty() ? ItemStack.EMPTY : removed; } @Override diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java index a5ff58a7..fe34ae7e 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentOffHand.java @@ -1,5 +1,6 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.slot; +import com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder.Placeholders; import com.github.jikoo.openinv.internal.spigot26_3.player.OpenPlayer; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; @@ -12,12 +13,15 @@ import java.util.Objects; +/** + * A slot for equipment that updates held items if necessary. + */ @NullMarked -public class ContentOffHand extends ContentEquipment { +class ContentOffHand extends ContentEquipment { private ServerPlayer holder; - public ContentOffHand(ServerPlayer holder) { + ContentOffHand(ServerPlayer holder) { super(holder, EquipmentSlot.OFFHAND); this.holder = holder; // Redundant, but silences nullity warning. } @@ -35,7 +39,7 @@ public InventoryType.SlotType getSlotType() { @Override public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotEquipment(container, slot, x, y) { + return new SlotEquipment(container, slot, x, y, Placeholders.emptyOffHand, EquipmentSlot.OFFHAND) { @Override public void setChanged() { if (OpenPlayer.isConnected(holder.connection) && !Objects.equals(holder.containerMenu, holder.inventoryMenu)) { diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java index 4ec2987e..34814cbf 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/ContentViewOnly.java @@ -1,6 +1,8 @@ package com.github.jikoo.openinv.internal.spigot26_3.container.slot; +import com.github.jikoo.openinv.internal.container.slot.Content; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -11,11 +13,11 @@ * A view-only slot that can't be interacted with. */ @NullMarked -public class ContentViewOnly implements Content { +public class ContentViewOnly implements Content { protected ServerPlayer holder; - public ContentViewOnly(ServerPlayer holder) { + protected ContentViewOnly(ServerPlayer holder) { this.holder = holder; } @@ -41,7 +43,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - ContentDrop.DROP.accept(this.holder, itemStack); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } @Override diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/OpenInventoryFactory.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/OpenInventoryFactory.java new file mode 100644 index 00000000..b4730592 --- /dev/null +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/OpenInventoryFactory.java @@ -0,0 +1,115 @@ +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; + +import com.github.jikoo.openinv.internal.container.slot.Content; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.inventory.InventoryType; +import org.jspecify.annotations.NullMarked; + +import java.util.List; +import java.util.function.Function; + +@NullMarked +public class OpenInventoryFactory implements InventoryFactory { + + @Override + public Content newCrafting(ServerPlayer holder, int index) { + return new ContentCrafting(holder, index); + } + + @Override + public Content newCraftingResult(ServerPlayer holder) { + return new ContentCraftingResult(holder); + } + + @Override + public Content newCursor(ServerPlayer holder) { + return new ContentCursor(holder); + } + + @Override + public Content newDrop(ServerPlayer holder) { + return new ContentDrop(holder); + } + + @Override + public Content newEquipment( + ServerPlayer holder, + EquipmentSlot equipmentSlot + ) { + return new ContentEquipment(holder, equipmentSlot); + } + + @Override + public Content newList( + ServerPlayer holder, + int index, + InventoryType.SlotType slotType, + Function> listSupplier + ) { + return new ContentList(holder, index, slotType) { + @Override + protected List getItems(ServerPlayer holder) { + return listSupplier.apply(holder); + } + }; + } + + @Override + public Content newOffHand(ServerPlayer holder) { + return new ContentOffHand(holder); + } + + @Override + public Content newViewOnly(ServerPlayer holder) { + return new ContentViewOnly(holder); + } + + @Override + public Content newViewOnly(ServerPlayer holder, ItemStack itemStack) { + return new ContentViewOnly(holder) { + @Override + public Slot asSlot(Container container, int slot, int x, int y) { + return new SlotViewOnly(container, slot, x, y) { + @Override + public ItemStack getOrDefault() { + return itemStack; + } + }; + } + }; + } + + @Override + public Slot wrapViewOnly(Slot wrapped) { + SlotViewOnly wrapper; + if (wrapped instanceof SlotPlaceholder placeholder) { + 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.getContainerSlot(), wrapped.x, wrapped.y) { + @Override + public ItemStack getOrDefault() { + return wrapped.getItem(); + } + }; + } + wrapper.index = wrapped.index; + return wrapper; + } + + @Override + public org.bukkit.inventory.ItemStack asBukkitMirror(ItemStack itemStack) { + return CraftItemStack.asCraftMirror(itemStack); + } + +} diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotEquipment.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotEquipment.java new file mode 100644 index 00000000..418c2a4f --- /dev/null +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotEquipment.java @@ -0,0 +1,49 @@ +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public class SlotEquipment extends SlotPlaceholder { + + private final ItemStack placeholder; + private final EquipmentSlot equipmentSlot; + private @Nullable ServerPlayer viewer; + + SlotEquipment(Container container, int index, int x, int y, ItemStack placeholder, EquipmentSlot equipmentSlot) { + super(container, index, x, y); + this.placeholder = placeholder; + this.equipmentSlot = equipmentSlot; + } + + @Override + public ItemStack getOrDefault() { + ItemStack itemStack = getItem(); + if (!itemStack.isEmpty()) { + return itemStack; + } + return placeholder; + } + + public EquipmentSlot getEquipmentSlot() { + return equipmentSlot; + } + + public void onlyEquipmentFor(ServerPlayer viewer) { + this.viewer = viewer; + } + + @Override + public boolean mayPlace(ItemStack itemStack) { + if (viewer == null) { + return true; + } + + return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(itemStack) == equipmentSlot; + } + +} diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java index e7a37bd9..8a35482a 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotPlaceholder.java @@ -13,7 +13,7 @@ @NullMarked public abstract class SlotPlaceholder extends Slot { - public SlotPlaceholder(Container container, int index, int x, int y) { + SlotPlaceholder(Container container, int index, int x, int y) { super(container, index, x, y); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java index 189a74aa..bfdd826d 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java @@ -15,27 +15,6 @@ @NullMarked public class SlotViewOnly extends SlotPlaceholder { - public static SlotViewOnly wrap(Slot wrapped) { - SlotViewOnly wrapper; - if (wrapped instanceof SlotPlaceholder placeholder) { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { - @Override - public ItemStack getOrDefault() { - return placeholder.getOrDefault(); - } - }; - } else { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { - @Override - public ItemStack getOrDefault() { - return wrapped.getItem(); - } - }; - } - wrapper.index = wrapped.index; - return wrapper; - } - public SlotViewOnly(Container container, int index, int x, int y) { super(container, index, x, y); } diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java index d07df82b..66d5a074 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/PlayerManager.java @@ -1,10 +1,11 @@ package com.github.jikoo.openinv.internal.spigot26_3.player; +import com.github.jikoo.openinv.internal.container.slot.InventoryFactory; import com.github.jikoo.openinv.internal.spigot26_3.container.OpenEnderChest; import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.util.JulLoggerAdapter; +import com.github.jikoo.openinv.util.JulLoggerAdapter; import com.mojang.authlib.GameProfile; import com.mojang.logging.LogUtils; import net.minecraft.nbt.CompoundTag; @@ -17,9 +18,13 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ProblemReporter; +import net.minecraft.world.Container; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.ChatVisiblity; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.TagValueInput; import net.minecraft.world.level.storage.TagValueOutput; @@ -39,13 +44,18 @@ import java.util.logging.Logger; @NullMarked -public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { +public class PlayerManager implements com.github.jikoo.openinv.internal.PlayerManager { private final Logger logger; + protected final InventoryFactory factory; private @Nullable Field bukkitEntity; - public PlayerManager(Logger logger) { + public PlayerManager( + Logger logger, + InventoryFactory factory + ) { this.logger = logger; + this.factory = factory; try { bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); } catch (NoSuchFieldException e) { @@ -227,7 +237,7 @@ public Player inject(Player player) { 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); + menu = enderChest.createMenu(factory, player, player.nextContainerCounter(), viewOnly); title = enderChest.getTitle(menu); } else { return null; diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index c62ce0fe..e8356a6d 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -19,6 +19,9 @@ dependencies { implementation(project(":openinvadapterpaper26_3")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } + implementation(project(":openinvadapterpaper26_2")) { + exclude(group = "io.papermc.paper", module = "dev-bundle") + } implementation(project(":openinvadapterpaper26_1")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } @@ -28,6 +31,9 @@ dependencies { implementation(project(":openinvadapterspigot26_3")) { exclude(group = "org.spigotmc", module = "spigot") } + implementation(project(":openinvadapterspigot26_2")) { + exclude(group = "org.spigotmc", module = "spigot") + } implementation(project(":openinvadapterspigot26_1")) { exclude(group = "org.spigotmc", module = "spigot") } diff --git a/plugin/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java index d28deb80..ba4f2fc1 100644 --- a/plugin/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -36,7 +36,7 @@ import com.lishid.openinv.util.config.Config; import com.lishid.openinv.util.config.ConfigUpdater; import com.lishid.openinv.util.lang.LangMigrator; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.lang.LanguageManager; import com.lishid.openinv.util.setting.PlayerToggle; import com.lishid.openinv.util.setting.PlayerToggles; import me.nahu.scheduler.wrapper.FoliaWrappedJavaPlugin; diff --git a/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java b/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java index 7f5256fb..9b3c5600 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/ClearInvCommand.java @@ -6,8 +6,8 @@ import com.lishid.openinv.util.Permissions; import com.lishid.openinv.util.PlayerLoader; import com.lishid.openinv.util.config.Config; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; +import com.github.jikoo.openinv.lang.LanguageManager; +import com.github.jikoo.openinv.lang.Replacement; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -114,7 +114,7 @@ protected void handle( } @Override - public @Nullable List onTabComplete( + public List onTabComplete( CommandSender sender, Command command, String label, diff --git a/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java b/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java index 86698697..e95024b6 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/ContainerSettingCommand.java @@ -18,8 +18,8 @@ import com.lishid.openinv.event.OpenEvents; import com.lishid.openinv.util.TabCompleter; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; +import com.github.jikoo.openinv.lang.LanguageManager; +import com.github.jikoo.openinv.lang.Replacement; import com.lishid.openinv.util.setting.PlayerToggle; import com.lishid.openinv.util.setting.PlayerToggles; import org.bukkit.command.Command; diff --git a/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java b/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java index 5bdacf30..d6c7631d 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/OpenInvCommand.java @@ -22,7 +22,7 @@ import com.lishid.openinv.util.Permissions; import com.lishid.openinv.util.PlayerLoader; import com.lishid.openinv.util.config.Config; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.lang.LanguageManager; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java b/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java index 952964be..13d2d936 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java @@ -6,8 +6,8 @@ import com.lishid.openinv.util.PlayerLoader; import com.lishid.openinv.util.TabCompleter; import com.lishid.openinv.util.config.Config; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; +import com.github.jikoo.openinv.lang.LanguageManager; +import com.github.jikoo.openinv.lang.Replacement; import me.nahu.scheduler.wrapper.runnable.WrappedRunnable; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; diff --git a/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java b/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java index 185f0e15..54e212b8 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/SearchContainerCommand.java @@ -17,8 +17,8 @@ package com.lishid.openinv.command; import com.lishid.openinv.util.TabCompleter; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; +import com.github.jikoo.openinv.lang.LanguageManager; +import com.github.jikoo.openinv.lang.Replacement; import com.lishid.openinv.util.SearchHelper; import org.bukkit.Chunk; import org.bukkit.Material; diff --git a/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java b/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java index 51633690..4b2a4222 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/SearchEnchantCommand.java @@ -18,8 +18,8 @@ import com.lishid.openinv.util.SearchHelper; import com.lishid.openinv.util.TabCompleter; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; +import com.github.jikoo.openinv.lang.LanguageManager; +import com.github.jikoo.openinv.lang.Replacement; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.Registry; diff --git a/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java b/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java index 3338a315..b04087b7 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/SearchInvCommand.java @@ -17,8 +17,8 @@ package com.lishid.openinv.command; import com.lishid.openinv.util.TabCompleter; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; +import com.github.jikoo.openinv.lang.LanguageManager; +import com.github.jikoo.openinv.lang.Replacement; import com.lishid.openinv.util.SearchHelper; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java index 324909a0..f0cdc363 100644 --- a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java @@ -17,10 +17,10 @@ package com.lishid.openinv.listener; import com.google.errorprone.annotations.Keep; -import com.lishid.openinv.internal.ViewOnly; +import com.github.jikoo.openinv.internal.container.ViewOnly; import com.lishid.openinv.util.InternalAccessor; import com.lishid.openinv.util.Permissions; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.lang.LanguageManager; import com.lishid.openinv.util.setting.PlayerToggles; import org.bukkit.GameMode; import org.bukkit.entity.HumanEntity; 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 0f89aafe..a47a84e3 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -18,13 +18,13 @@ import com.github.jikoo.planarwrappers.util.version.BukkitVersions; import com.github.jikoo.planarwrappers.util.version.Version; -import com.lishid.openinv.internal.Accessor; +import com.github.jikoo.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.PlayerManager; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.internal.PlayerManager; +import com.github.jikoo.openinv.lang.LanguageManager; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; diff --git a/settings.gradle.kts b/settings.gradle.kts index f58414c3..176a3be0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,9 +19,11 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { val internals = listOf( "paper26_3", + "paper26_2", "paper26_1", "paper1_21_11", "spigot26_3", + "spigot26_2", "spigot26_1" ) for (internal in internals) { From 74fba7aa73b8dc3379775be409566789eb2a606c Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sun, 20 Sep 2026 14:31:53 -0400 Subject: [PATCH 06/10] Reduce hackiness of dependency compatibility --- internal/paper26_1/build.gradle.kts | 40 +++++------------------------ internal/paper26_2/build.gradle.kts | 40 +++++------------------------ internal/paper26_3/build.gradle.kts | 40 +++++------------------------ 3 files changed, 21 insertions(+), 99 deletions(-) diff --git a/internal/paper26_1/build.gradle.kts b/internal/paper26_1/build.gradle.kts index 1c2649be..35c465ec 100644 --- a/internal/paper26_1/build.gradle.kts +++ b/internal/paper26_1/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.api.internal.attributes.DefaultCompatibilityRuleChain - plugins { alias(libs.plugins.paperweight) } @@ -8,49 +6,25 @@ repositories { maven("https://repo.papermc.io/repository/maven-public/") } +// Paper is compiled with Java 25, so we have to use a Java 25 toolchain. java { toolchain.languageVersion.set(JavaLanguageVersion.of(25)) } +// To minimize duplicate code, the adapter for 1.21.11 is built off of this module, so we need to target Java 21. 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() - } +// As a result, we have to specifically tell Gradle it's okay if our dependencies require Java 25, +// because secretly sometimes they don't! +configurations.matching { it.isCanBeResolved && it.name.endsWith("Classpath") }.all { + attributes { + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 25) } } 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") } diff --git a/internal/paper26_2/build.gradle.kts b/internal/paper26_2/build.gradle.kts index 5b87ec2c..31b144ce 100644 --- a/internal/paper26_2/build.gradle.kts +++ b/internal/paper26_2/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.api.internal.attributes.DefaultCompatibilityRuleChain - plugins { alias(libs.plugins.paperweight) } @@ -8,49 +6,25 @@ repositories { maven("https://repo.papermc.io/repository/maven-public/") } +// Paper is compiled with Java 25, so we have to use a Java 25 toolchain. java { toolchain.languageVersion.set(JavaLanguageVersion.of(25)) } +// To minimize duplicate code, the adapter for 1.21.11 is built off of this module, so we need to target Java 21. 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() - } +// As a result, we have to specifically tell Gradle it's okay if our dependencies require Java 25, +// because secretly sometimes they don't! +configurations.matching { it.isCanBeResolved && it.name.endsWith("Classpath") }.all { + attributes { + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 25) } } 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") } diff --git a/internal/paper26_3/build.gradle.kts b/internal/paper26_3/build.gradle.kts index 152d5b5b..7e832efe 100644 --- a/internal/paper26_3/build.gradle.kts +++ b/internal/paper26_3/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.api.internal.attributes.DefaultCompatibilityRuleChain - plugins { alias(libs.plugins.paperweight) } @@ -8,49 +6,25 @@ repositories { maven("https://repo.papermc.io/repository/maven-public/") } +// Paper is compiled with Java 25, so we have to use a Java 25 toolchain. java { toolchain.languageVersion.set(JavaLanguageVersion.of(25)) } +// To minimize duplicate code, the adapter for 1.21.11 is built off of this module, so we need to target Java 21. 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() - } +// As a result, we have to specifically tell Gradle it's okay if our dependencies require Java 25, +// because secretly sometimes they don't! +configurations.matching { it.isCanBeResolved && it.name.endsWith("Classpath") }.all { + attributes { + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 25) } } 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") } From b870106abf75f70692e2cad3d4c5296a0d0396f1 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sun, 20 Sep 2026 15:12:54 -0400 Subject: [PATCH 07/10] Simplify BlockState handling --- .../container/AnySilentContainerBase.java | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java index 58daf100..1e6366a5 100644 --- a/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java @@ -17,30 +17,35 @@ @NullMarked public abstract class AnySilentContainerBase implements IAnySilentContainer { + public enum StateType { + ENDER_CHEST, + SHULKER_BOX, + CHEST, + BARREL, + OTHER + } + @Override public boolean isAnyContainerNeeded(Block block) { - BlockState blockState = getState(block); - - // Barrels do not require AnyContainer. - if (blockState instanceof Barrel) { - return false; - } - - // Enderchests require a non-occluding block on top to open. - if (blockState instanceof EnderChest) { - return block.getRelative(0, 1, 0).getType().isOccluding(); - } - - // Shulker boxes require half a block clear in the direction they open. - if (blockState instanceof ShulkerBox) { - return isShulkerBlocked(block); - } + return isAnyContainerNeeded(getStateType(block), block); + } - if (!(blockState instanceof org.bukkit.block.Chest)) { - return false; - } + protected boolean isAnyContainerNeeded(StateType material, Block block) { + return switch (material) { + // Enderchests require a non-occluding block on top to open. + case ENDER_CHEST -> block.getRelative(0, 1, 0).getType().isOccluding(); + // Shulker boxes require half a block clear in the direction they open. + case SHULKER_BOX -> isShulkerBlocked(block); + // Chests require that the block above not be occluding or occupied by a cat. + case CHEST -> isChestBlocked(block); + // Barrels need silent but not any. All others unsupported. + default -> false; + }; + } - if (isChestBlocked(block)) { + @Override + public boolean isChestBlocked(Block block) { + if (IAnySilentContainer.super.isChestBlocked(block)) { return true; } @@ -72,7 +77,7 @@ public boolean isAnyContainerNeeded(Block block) { return false; } - return isChestBlocked(relative); + return IAnySilentContainer.super.isChestBlocked(relative); } @Override @@ -85,6 +90,16 @@ public boolean isAnySilentContainer(Inventory inventory) { return isAnySilentContainer(getHolder(inventory)); } + protected StateType getStateType(Block block) { + return switch (getState(block)) { + case Barrel ignored -> StateType.BARREL; + case EnderChest ignored -> StateType.ENDER_CHEST; + case ShulkerBox ignored -> StateType.SHULKER_BOX; + case org.bukkit.block.Chest ignored -> StateType.CHEST; + default -> StateType.OTHER; + }; + } + protected abstract BlockState getState(Block block); protected abstract @Nullable InventoryHolder getHolder(Inventory inventory); From 9f8aaa3ee24f9681f57a2f6a3f79c838055b5d02 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sun, 20 Sep 2026 15:17:25 -0400 Subject: [PATCH 08/10] Add cache for Spigot Paper doesn't really need one since getting a block's state without snapshotting is a lot less expensive. No need to devote memory to every block type a player right clicks. --- .../spigot26_3/container/AnySilentContainer.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java index 04638aa2..a99fb036 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/AnySilentContainer.java @@ -34,11 +34,14 @@ import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Logger; @NullMarked public class AnySilentContainer extends AnySilentContainerBase { + private final Map blockStateTypes = new HashMap<>(); private final Logger logger; private final LanguageManager lang; private @Nullable Field serverPlayerGameModeGameType; @@ -63,6 +66,16 @@ public AnySilentContainer(Logger logger, LanguageManager lang) { } } + @Override + public boolean isAnyContainerNeeded(org.bukkit.block.Block block) { + return isAnyContainerNeeded(blockStateTypes.computeIfAbsent(block.getType(), mat -> getStateType(block)), block); + } + + @Override + public boolean isAnySilentContainer(org.bukkit.block.Block block) { + return StateType.OTHER != blockStateTypes.computeIfAbsent(block.getType(), mat -> getStateType(block)); + } + @Override public boolean activateContainer( final Player bukkitPlayer, From 89c214e84e56c42fbb78aab9c62614816a2d6b53 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Tue, 22 Sep 2026 21:06:05 -0400 Subject: [PATCH 09/10] Update player tag deserialization --- .../lishid/openinv/internal/paper26_3/player/OpenPlayer.java | 2 +- .../jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java index 22681529..ee170c02 100644 --- a/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/player/OpenPlayer.java @@ -40,6 +40,7 @@ public class OpenPlayer extends CraftPlayer { @Unmodifiable protected static final Set RESET_TAGS = Set.of( // Entity#saveWithoutId(CompoundTag) + "invulnerable_time", "CustomName", "CustomNameVisible", "Silent", @@ -52,7 +53,6 @@ public class OpenPlayer extends CraftPlayer { "Passengers", // ServerPlayer#addAdditionalSaveData(CompoundTag) // 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", diff --git a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java index 199a40d4..6a5cc6c7 100644 --- a/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/player/OpenPlayer.java @@ -40,6 +40,7 @@ public class OpenPlayer extends CraftPlayer { @Unmodifiable protected static final Set RESET_TAGS = Set.of( // Entity#saveWithoutId(CompoundTag) + "invulnerable_time", "CustomName", "CustomNameVisible", "Silent", @@ -52,7 +53,6 @@ public class OpenPlayer extends CraftPlayer { "Passengers", // ServerPlayer#addAdditionalSaveData(CompoundTag) // Intentional omissions to prevent mount loss: Attach, Entity, and RootVehicle - "entered_nether_pos", "last_explosion_impact_pos", "respawn", "raid_omen_position", From 525b596fa90e9175d378b15ae6387d7b5365d13c Mon Sep 17 00:00:00 2001 From: Jikoo Date: Tue, 22 Sep 2026 21:39:30 -0400 Subject: [PATCH 10/10] Actually use new intermediary --- .../java/com/lishid/openinv/util/InternalAccessor.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 a47a84e3..42d64d5f 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -73,9 +73,12 @@ public InternalAccessor(Logger logger, LanguageManager lang) { // Spigot adapters. if (!PAPER) { - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 2))) { // 26.2, 26.3 + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 3))) { // 26.3 return new com.github.jikoo.openinv.internal.spigot26_3.InternalAccessor(logger, lang); } + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 2))) { // 26.2 + return new com.github.jikoo.openinv.internal.spigot26_2.InternalAccessor(logger, lang); + } if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 1))) { // 26.1.1, 26.1.2 return new com.github.jikoo.openinv.internal.spigot26_1.InternalAccessor(logger, lang); } @@ -84,9 +87,12 @@ public InternalAccessor(Logger logger, LanguageManager lang) { } // Paper or a Paper fork, can use Mojang-mapped internals. - if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 2))) { // 26.2, 26.3 + if (BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(26, 3))) { // 26.3 return new com.lishid.openinv.internal.paper26_3.InternalAccessor(logger, lang); } + 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); }