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/github/jikoo/openinv/internal/Accessor.java b/common/src/main/java/com/github/jikoo/openinv/internal/Accessor.java new file mode 100644 index 00000000..c3213edb --- /dev/null +++ b/common/src/main/java/com/github/jikoo/openinv/internal/Accessor.java @@ -0,0 +1,28 @@ +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; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public interface Accessor { + + PlayerManager getPlayerManager(); + + IAnySilentContainer getAnySilentContainer(); + + ISpecialPlayerInventory createPlayerInventory(Player player); + + ISpecialEnderChest createEnderChest(Player player); + + @Nullable T get(Inventory bukkitInventory, Class clazz); + + void reload(ConfigurationSection config); + +} 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 77% 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 c60c1557..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,14 +14,16 @@ * 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; -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 +34,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 +51,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/github/jikoo/openinv/internal/container/AnySilentContainerBase.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java new file mode 100644 index 00000000..1e6366a5 --- /dev/null +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/AnySilentContainerBase.java @@ -0,0 +1,107 @@ +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; +import org.bukkit.block.BlockState; +import org.bukkit.block.EnderChest; +import org.bukkit.block.ShulkerBox; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Chest; +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 { + + public enum StateType { + ENDER_CHEST, + SHULKER_BOX, + CHEST, + BARREL, + OTHER + } + + @Override + public boolean isAnyContainerNeeded(Block block) { + return isAnyContainerNeeded(getStateType(block), block); + } + + 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; + }; + } + + @Override + public boolean isChestBlocked(Block block) { + if (IAnySilentContainer.super.isChestBlocked(block)) { + return true; + } + + BlockData blockData = block.getBlockData(); + if (!(blockData instanceof Chest chest) || chest.getType() == Chest.Type.SINGLE) { + return false; + } + + BlockFace relativeFace = switch (chest.getFacing()) { + case NORTH -> chest.getType() == Chest.Type.RIGHT ? BlockFace.WEST : BlockFace.EAST; + case EAST -> chest.getType() == Chest.Type.RIGHT ? BlockFace.NORTH : BlockFace.SOUTH; + case SOUTH -> chest.getType() == Chest.Type.RIGHT ? BlockFace.EAST : BlockFace.WEST; + case WEST -> chest.getType() == Chest.Type.RIGHT ? BlockFace.SOUTH : BlockFace.NORTH; + default -> BlockFace.SELF; + }; + Block relative = block.getRelative(relativeFace); + + if (relative.getType() != block.getType()) { + return false; + } + + BlockData relativeData = relative.getBlockData(); + if (!(relativeData instanceof Chest relativeChest)) { + return false; + } + + if (relativeChest.getFacing() != chest.getFacing() + || relativeChest.getType() != (chest.getType() == Chest.Type.RIGHT ? Chest.Type.LEFT : Chest.Type.RIGHT)) { + return false; + } + + return IAnySilentContainer.super.isChestBlocked(relative); + } + + @Override + public boolean isAnySilentContainer(Block block) { + return isAnySilentContainer(getState(block)); + } + + @Override + 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); + +} diff --git a/common/src/main/java/com/github/jikoo/openinv/internal/container/InternalOwned.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/InternalOwned.java new file mode 100644 index 00000000..3af7149d --- /dev/null +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/InternalOwned.java @@ -0,0 +1,10 @@ +package com.github.jikoo.openinv.internal.container; + +import org.jspecify.annotations.NullMarked; + +@NullMarked +public interface InternalOwned { + + T getOwnerHandle(); + +} 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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java b/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/Content.java similarity index 61% rename from internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java rename to common/src/main/java/com/github/jikoo/openinv/internal/container/slot/Content.java index eee19f3e..ef529c56 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/Content.java +++ b/common/src/main/java/com/github/jikoo/openinv/internal/container/slot/Content.java @@ -1,53 +1,50 @@ -package com.lishid.openinv.internal.paper26_2.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.jetbrains.annotations.NotNull; +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. */ -public interface Content { +@NullMarked +public interface Content { /** * Update internal holder. * * @param holder the new holder */ - void setHolder(@NotNull 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 @@ -56,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 79% 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 01b22025..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; @@ -25,8 +9,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; @@ -44,9 +28,8 @@ /** * A simple language manager supporting both custom and bundled languages. - * - * @author Jikoo */ +@NullMarked public class LanguageManager { private final Plugin plugin; @@ -54,7 +37,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 +55,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 +93,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 +115,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 +178,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 +205,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 +219,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 +231,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 +248,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 +268,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 +276,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 +284,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 +304,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/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 83% 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 f53a3374..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,5 +1,6 @@ -package com.lishid.openinv.util; +package com.github.jikoo.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; @@ -55,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) { 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 70% 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 d22e6fcf..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,28 +1,14 @@ -/* - * 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.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/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 deleted file mode 100644 index e57a4afb..00000000 --- a/common/src/main/java/com/lishid/openinv/internal/Accessor.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.lishid.openinv.internal; - -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; - -public interface Accessor { - - @NotNull - PlayerManager getPlayerManager(); - - @NotNull IAnySilentContainer getAnySilentContainer(); - - @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player); - - @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player); - - @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz); - - void reload(@NotNull 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 deleted file mode 100644 index 75debc48..00000000 --- a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.lishid.openinv.internal; - -import org.bukkit.block.Barrel; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.block.EnderChest; -import org.bukkit.block.ShulkerBox; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.type.Chest; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.jetbrains.annotations.NotNull; - -public abstract class AnySilentContainerBase implements IAnySilentContainer { - - @Override - public boolean isAnyContainerNeeded(@NotNull 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); - } - - if (!(blockState instanceof org.bukkit.block.Chest)) { - return false; - } - - if (isChestBlocked(block)) { - return true; - } - - BlockData blockData = block.getBlockData(); - if (!(blockData instanceof Chest chest) || chest.getType() == Chest.Type.SINGLE) { - return false; - } - - BlockFace relativeFace = switch (chest.getFacing()) { - case NORTH -> chest.getType() == Chest.Type.RIGHT ? BlockFace.WEST : BlockFace.EAST; - case EAST -> chest.getType() == Chest.Type.RIGHT ? BlockFace.NORTH : BlockFace.SOUTH; - case SOUTH -> chest.getType() == Chest.Type.RIGHT ? BlockFace.EAST : BlockFace.WEST; - case WEST -> chest.getType() == Chest.Type.RIGHT ? BlockFace.SOUTH : BlockFace.NORTH; - default -> BlockFace.SELF; - }; - Block relative = block.getRelative(relativeFace); - - if (relative.getType() != block.getType()) { - return false; - } - - BlockData relativeData = relative.getBlockData(); - if (!(relativeData instanceof Chest relativeChest)) { - return false; - } - - if (relativeChest.getFacing() != chest.getFacing() - || relativeChest.getType() != (chest.getType() == Chest.Type.RIGHT ? Chest.Type.LEFT : Chest.Type.RIGHT)) { - return false; - } - - return isChestBlocked(relative); - } - - @Override - public boolean isAnySilentContainer(@NotNull Block block) { - return isAnySilentContainer(getState(block)); - } - - @Override - public boolean isAnySilentContainer(@NotNull Inventory inventory) { - return isAnySilentContainer(getHolder(inventory)); - } - - protected abstract BlockState getState(@NotNull Block block); - - protected abstract InventoryHolder getHolder(@NotNull 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 deleted file mode 100644 index 24f826d0..00000000 --- a/common/src/main/java/com/lishid/openinv/internal/InternalOwned.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.lishid.openinv.internal; - -public interface InternalOwned { - - T getOwnerHandle(); - -} 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 6753044c..00000000 --- a/common/src/main/java/com/lishid/openinv/util/lang/Replacement.java +++ /dev/null @@ -1,29 +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.jetbrains.annotations.NotNull; - -/** - * A data holder for string replacement in translations. - * - * @param placeholder the placeholder to be replaced - * @param value the value to insert - */ -public record Replacement(@NotNull String placeholder, @NotNull String value) { - -} 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" 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/InternalAccessor.java b/internal/paper1_21_11/src/main/java/com/lishid/openinv/internal/paper1_21_11/InternalAccessor.java index e58425a2..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,29 +1,30 @@ 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.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) { - return new OpenInventory(player); + public ISpecialPlayerInventory createPlayerInventory(Player 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 d3b18469..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,23 +1,33 @@ 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_2.container.menu.OpenChestMenu; +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 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); } @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 93541b96..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_2.container.menu.OpenChestMenu; +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_2.container.OpenInventory { +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 e1414092..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.lishid.openinv.internal.paper26_2.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_2.container.menu.OpenSyncMenu; +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 d68d613b..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.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; -import com.lishid.openinv.internal.paper26_2.container.menu.BaseOpenInventoryMenu; +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 1def98e7..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") } @@ -61,7 +35,7 @@ dependencies { 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..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,42 +1,52 @@ 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_2.container.slot.placeholder.PlaceholderLoader; -import com.lishid.openinv.util.lang.LanguageManager; +import com.lishid.openinv.internal.paper26_3.container.slot.placeholder.PlaceholderLoader; +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.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; +@NullMarked public class InternalAccessor extends com.lishid.openinv.internal.paper26_2.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) { - return new PlayerManager(logger); + protected PlayerManager createPlayerManager( + Logger logger, + InventoryFactory factory + ) { + return new PlayerManager(logger, factory); } @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 091623c8..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,19 +1,20 @@ 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.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; import java.util.logging.Logger; -public class AnySilentContainer extends com.lishid.openinv.internal.paper26_2.container.AnySilentContainer { +@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 f0239a9f..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; -public class OpenEnderChest extends com.lishid.openinv.internal.paper26_2.container.OpenEnderChest { +@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 8550c544..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; -public class PlaceholderLoader extends com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader { +@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_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..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; @@ -9,10 +14,13 @@ 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); + 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 index 605d6eda..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,57 +6,36 @@ 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") } 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.31-alpha") + paperweight.paperDevBundle("26.2.build.+") } tasks.reobfJar { diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java index 9edf046d..f2f0e103 100644 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java +++ b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/InternalAccessor.java @@ -1,95 +1,27 @@ package com.lishid.openinv.internal.paper26_2; -import com.lishid.openinv.internal.Accessor; -import com.lishid.openinv.internal.IAnySilentContainer; -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.paper26_2.container.AnySilentContainer; -import com.lishid.openinv.internal.paper26_2.container.OpenEnderChest; -import com.lishid.openinv.internal.paper26_2.container.OpenInventory; -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.PlaceholderLoader; -import com.lishid.openinv.internal.paper26_2.player.PlayerManager; -import com.lishid.openinv.util.lang.LanguageManager; +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 org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import 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.Level; import java.util.logging.Logger; -public class InternalAccessor implements Accessor { +@NullMarked +public class InternalAccessor extends com.lishid.openinv.internal.paper26_3.InternalAccessor { - protected final @NotNull Logger logger; - private final @NotNull PlayerManager manager; - private final @NotNull AnySilentContainer anySilentContainer; - - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { - this.logger = logger; - manager = createPlayerManager(logger); - anySilentContainer = createAnySilentContainer(logger, lang); - } - - protected @NotNull PlayerManager createPlayerManager(@NotNull Logger logger) { - return new PlayerManager(logger); - } - - protected @NotNull AnySilentContainer createAnySilentContainer( - @NotNull Logger logger, - @NotNull LanguageManager lang - ) { - return new AnySilentContainer(logger, lang); - } - - protected @NotNull PlaceholderLoader createPlaceholderLoader() { - return new PlaceholderLoader(); - } - - @Override - public @NotNull PlayerManager getPlayerManager() { - return manager; - } - - @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { - return anySilentContainer; - } - - @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { - return new OpenInventory(player); - } - - @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { - return new OpenEnderChest(player); - } - - @Override - public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { - if (!(bukkitInventory instanceof CraftInventory craftInventory)) { - return null; - } - Container container = craftInventory.getInventory(); - if (clazz.isInstance(container)) { - return clazz.cast(container); - } - return null; + public InternalAccessor(Logger logger, LanguageManager lang) { + super(logger, lang); } @Override - public void reload(@NotNull ConfigurationSection config) { - ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); - try { - // Reset placeholders to defaults and try to load configuration. - createPlaceholderLoader().load(placeholders); - } catch (Exception e) { - logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); - } + protected InventoryFactory createInventoryFactory() { + return new OpenInventoryFactory(); } } diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java deleted file mode 100644 index 39f0faae..00000000 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/bukkit/OpenPlayerInventorySelf.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.lishid.openinv.internal.paper26_2.container.bukkit; - -import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -public class OpenPlayerInventorySelf extends OpenPlayerInventory { - - private final int offset; - - public OpenPlayerInventorySelf(@NotNull BaseOpenInventory inventory, int offset) { - super(inventory); - this.offset = offset; - } - - @Override - public ItemStack getItem(int index) { - return super.getItem(offset + index); - } - - @Override - public void setItem(int index, ItemStack item) { - super.setItem(offset + index, item); - } - -} diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java deleted file mode 100644 index 7a45a357..00000000 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/menu/OpenInventoryMenu.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.lishid.openinv.internal.paper26_2.container.menu; - -import com.lishid.openinv.internal.paper26_2.container.BaseOpenInventory; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerInput; -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); - } - - @Override - public void clicked(int slotIndex, int buttonNum, ContainerInput containerInput, Player player) { - if (viewOnly) { - if (containerInput == ContainerInput.QUICK_CRAFT) { - sendAllDataToRemote(); - } - } - super.clicked(slotIndex, buttonNum, containerInput, player); - } - -} 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_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java deleted file mode 100644 index 817ce5fd..00000000 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/SlotViewOnly.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; - -import com.lishid.openinv.internal.paper26_2.container.slot.placeholder.Placeholders; -import net.minecraft.world.Container; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -/** - * A view-only {@link Slot}. "Blank" by default, but can wrap another slot to display its content. - */ -public class SlotViewOnly extends SlotPlaceholder { - - public static @NotNull SlotViewOnly wrap(@NotNull Slot wrapped) { - SlotViewOnly wrapper; - if (wrapped instanceof SlotPlaceholder placeholder) { - wrapper = new SlotViewOnly(wrapped.container, wrapped.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); - } - - @Override - public ItemStack getOrDefault() { - return Placeholders.notSlot; - } - - @Override - public void onQuickCraft(@NotNull ItemStack itemStack1, @NotNull ItemStack itemStack2) { - } - - @Override - public void onTake(@NotNull Player player, @NotNull ItemStack itemStack) { - } - - @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { - return false; - } - - @Override - public @NotNull ItemStack getItem() { - return ItemStack.EMPTY; - } - - @Override - public boolean hasItem() { - return false; - } - - @Override - public void setByPlayer(@NotNull ItemStack newStack) { - } - - @Override - public void setByPlayer(@NotNull ItemStack newStack, @NotNull ItemStack oldStack) { - } - - @Override - public void set(@NotNull ItemStack itemStack) { - } - - @Override - public void setChanged() { - } - - @Override - public int getMaxStackSize() { - return 0; - } - - @Override - public int getMaxStackSize(@NotNull ItemStack itemStack) { - return 0; - } - - @Override - public @NotNull ItemStack remove(int amount) { - return ItemStack.EMPTY; - } - - @Override - public boolean mayPickup(@NotNull Player player) { - return false; - } - - @Override - public boolean isActive() { - return false; - } - - @Override - public @NotNull Optional tryRemove(int var0, int var1, @NotNull Player player) { - return Optional.empty(); - } - - @Override - public @NotNull ItemStack safeTake(int var0, int var1, @NotNull Player player) { - return ItemStack.EMPTY; - } - - @Override - public @NotNull ItemStack safeClone(@NotNull Player player) { - return ItemStack.EMPTY; - } - - @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { - return itemStack; - } - - @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack, int amount) { - return itemStack; - } - - @Override - public boolean allowModification(@NotNull Player player) { - return false; - } - - @Override - public boolean isHighlightable() { - return false; - } - - @Override - public boolean isFake() { - return true; - } - -} diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java b/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java deleted file mode 100644 index 6f31d5bb..00000000 --- a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/slot/placeholder/Placeholders.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.lishid.openinv.internal.paper26_2.container.slot.placeholder; - -import com.lishid.openinv.internal.paper26_2.player.OpenPlayer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; - -import java.util.EnumMap; - -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) { - if (!OpenPlayer.isConnected(serverPlayer.connection)) { - return blockedOffline; - } - - return BLOCKED_GAME_TYPE.getOrDefault(serverPlayer.gameMode.getGameModeForPlayer(), ItemStack.EMPTY); - } - - private Placeholders() { - throw new IllegalStateException("Cannot create instance of utility class."); - } - -} diff --git a/internal/paper26_3/build.gradle.kts b/internal/paper26_3/build.gradle.kts new file mode 100644 index 00000000..7e832efe --- /dev/null +++ b/internal/paper26_3/build.gradle.kts @@ -0,0 +1,42 @@ +plugins { + alias(libs.plugins.paperweight) +} + +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 +} + +// 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 { + implementation(project(":openinvapi")) { + exclude(group = "org.spigotmc", module = "spigot-api") + } + implementation(project(":openinvcommon")) { + exclude(group = "org.spigotmc", module = "spigot-api") + } + + paperweight.paperDevBundle("26.3.build.+") +} + +tasks.reobfJar { + enabled = false +} + +configurations.reobf.get().outgoing.artifacts.clear() 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 new file mode 100644 index 00000000..9d7504ff --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/InternalAccessor.java @@ -0,0 +1,111 @@ +package com.lishid.openinv.internal.paper26_3; + +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.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.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 Logger logger; + private final PlayerManager manager; + protected final InventoryFactory factory; + private final AnySilentContainer anySilentContainer; + + public InternalAccessor(Logger logger, LanguageManager lang) { + this.logger = logger; + 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 + public PlayerManager getPlayerManager() { + return manager; + } + + @Override + public IAnySilentContainer getAnySilentContainer() { + return anySilentContainer; + } + + @Override + public ISpecialPlayerInventory createPlayerInventory(Player player) { + return new OpenInventory(factory, player); + } + + @Override + public ISpecialEnderChest createEnderChest(Player player) { + return new OpenEnderChest(player); + } + + @Override + public @Nullable T get(Inventory bukkitInventory, Class clazz) { + if (!(bukkitInventory instanceof CraftInventory craftInventory)) { + return null; + } + Container container = craftInventory.getInventory(); + if (clazz.isInstance(container)) { + return clazz.cast(container); + } + return null; + } + + @Override + public void reload(ConfigurationSection config) { + ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); + try { + // Reset placeholders to defaults and try to load configuration. + createPlaceholderLoader().load(placeholders); + } catch (Exception e) { + logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); + } + } + +} diff --git a/internal/paper26_2/src/main/java/com/lishid/openinv/internal/paper26_2/container/AnySilentContainer.java b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/AnySilentContainer.java similarity index 88% 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..de35696e 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,13 +14,13 @@ * 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.util.ReflectionHelper; -import com.lishid.openinv.util.lang.LanguageManager; +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.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; @@ -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_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 68% 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..e7b11c94 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,14 @@ -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.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.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; @@ -32,31 +24,37 @@ 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; + protected final InventoryFactory factory; + 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( + 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(); } @@ -74,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. @@ -88,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() { @@ -111,12 +109,7 @@ private int addMainInventory() { slots.set( localIndex, - new ContentList(owner, invIndex, type) { - @Override - public void setHolder(@NotNull ServerPlayer holder) { - items = holder.getInventory().getNonEquipmentItems(); - } - } + factory.newList(owner, invIndex, type, holder -> holder.getInventory().getNonEquipmentItems()) ); } return listSize; @@ -138,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; } @@ -151,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; } @@ -165,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(@NotNull ServerPlayer serverPlayer) { - return new ContentCraftingResult(serverPlayer); - } - public Slot getMenuSlot(int index, int x, int y) { return slots.get(index).asSlot(this, index, x, y); } @@ -207,7 +185,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 +193,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 +208,7 @@ public boolean isInUse() { } @Override - public @NotNull org.bukkit.entity.Player getPlayer() { + public org.bukkit.entity.Player getPlayer() { return getOwner(); } @@ -245,22 +223,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 +257,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 +271,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(); } @@ -327,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_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 69% 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..5d526d19 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,18 +1,21 @@ -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.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; 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; @@ -20,37 +23,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 +63,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 +76,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 +96,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 +112,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 +134,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 +180,7 @@ public void clearContent() { } @Override - public void fillStackedContents(@NotNull StackedItemContents stackedContents) { + public void fillStackedContents(StackedItemContents stackedContents) { for (ItemStack itemstack : items) { stackedContents.accountStack(itemstack); } @@ -195,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_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 71% 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..5b72a98f 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,24 +1,33 @@ -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.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; import net.minecraft.network.chat.FontDescription; 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.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) { - super(bukkitPlayer); + public OpenInventory( + InventoryFactory factory, + Player bukkitPlayer + ) { + super(factory, 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_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 59% 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..2c0c5b03 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,13 +1,13 @@ -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 com.github.jikoo.openinv.internal.container.ViewOnly; import net.minecraft.world.Container; import org.bukkit.Material; 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_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 58% 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..5825a9e8 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,15 +1,15 @@ -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; 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_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 61% 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..9c957e92 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; @@ -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,81 +104,69 @@ public void setExtraContents(ItemStack @NotNull [] items) { } @Override - public @NotNull ItemStack getHelmet() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().equipment - .get(EquipmentSlot.HEAD)); + public ItemStack getHelmet() { + 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)); + public ItemStack getChestplate() { + 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)); + public ItemStack getLeggings() { + 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)); + public ItemStack getBoots() { + 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()); + public ItemStack getItemInMainHand() { + 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)); + public ItemStack getItemInOffHand() { + 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") @Deprecated @Override - public @NotNull ItemStack getItemInHand() { + public ItemStack getItemInHand() { return getItemInMainHand(); } @@ -201,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(); @@ -214,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 new file mode 100644 index 00000000..1d7eb3b4 --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/bukkit/OpenPlayerInventorySelf.java @@ -0,0 +1,28 @@ +package com.lishid.openinv.internal.paper26_3.container.bukkit; + +import com.lishid.openinv.internal.paper26_3.container.BaseOpenInventory; +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public class OpenPlayerInventorySelf extends OpenPlayerInventory { + + private final int offset; + + public OpenPlayerInventorySelf(BaseOpenInventory inventory, int offset) { + super(inventory); + this.offset = offset; + } + + @Override + public @Nullable ItemStack getItem(int index) { + return super.getItem(offset + index); + } + + @Override + public void setItem(int index, @Nullable ItemStack item) { + super.setItem(offset + index, item); + } + +} 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 87% 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..d013f0c6 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,14 +1,16 @@ -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.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.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,7 +18,6 @@ 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; @@ -28,8 +29,14 @@ public class BaseOpenInventoryMenu extends OpenSyncMenu { 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) { @@ -64,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()) { @@ -93,7 +100,7 @@ protected Slot getUpperSlot(int index, int x, int y) { } if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } return slot; @@ -118,7 +125,7 @@ protected CraftInventoryView, Inventory> create } Slot slot = slots.get(index); - return CraftItemStack.asCraftMirror(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); + return factory.asBukkitMirror(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); } @Override @@ -227,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_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 93% 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..42f5b1ef 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,11 +1,13 @@ -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.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_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 79% 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..ac0fe30b 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,7 +1,10 @@ -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.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 new file mode 100644 index 00000000..e098f602 --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/menu/OpenInventoryMenu.java @@ -0,0 +1,37 @@ +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( + InventoryFactory factory, + BaseOpenInventory inventory, + ServerPlayer viewer, + int i, + boolean viewOnly + ) { + super(factory, inventory, viewer, i, viewOnly); + } + + @Override + public void clicked(int slotIndex, int buttonNum, ContainerInput containerInput, Player player) { + if (viewOnly) { + if (containerInput == ContainerInput.QUICK_CRAFT) { + sendAllDataToRemote(); + } + } + super.clicked(slotIndex, buttonNum, containerInput, player); + } + +} 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 92% 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..14d28d89 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,11 +1,13 @@ -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.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_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 65% 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..dc95e8cd 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,37 +1,36 @@ -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.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; 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. */ -public class ContentCrafting implements Content { +@NullMarked +public class ContentCrafting implements Content { private final int index; - private ServerPlayer holder; - private List items; + protected ServerPlayer holder; + protected List items; - public ContentCrafting(@NotNull 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(@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 +38,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(); @@ -47,12 +46,12 @@ public void setHolder(@NotNull 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); @@ -65,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); @@ -78,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 { - holder.drop(itemStack, false); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } } @@ -93,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 { @@ -104,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(@NotNull Player player) { - return isAvailable(); + public boolean mayPickup(Player player) { + return isAvailable(holder); } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { - return isAvailable(); + public boolean mayPlace(ItemStack itemStack) { + 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_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 79% 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..6b7bd792 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,22 +1,23 @@ -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; 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.

*/ -public class ContentCraftingResult extends ContentViewOnly { +@NullMarked +class ContentCraftingResult extends ContentViewOnly { - public ContentCraftingResult(@NotNull ServerPlayer holder) { + ContentCraftingResult(ServerPlayer holder) { super(holder); } 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 77% 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..8ed8bdb0 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,28 +1,31 @@ -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.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; 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. */ -public class ContentCursor implements Content { +@NullMarked +public class ContentCursor implements Content { - private @NotNull ServerPlayer holder; + protected ServerPlayer holder; - public ContentCursor(@NotNull ServerPlayer holder) { + protected ContentCursor(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -56,11 +59,11 @@ public void set(ItemStack itemStack) { if (isAvailable()) { holder.containerMenu.setCarried(itemStack); } else { - holder.drop(itemStack, false); + 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. @@ -94,12 +97,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_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 69% 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..d7f0179f 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,27 +1,30 @@ -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.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.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 fake slot used to drop items. Unavailable offline. */ -public class ContentDrop implements Content { +@NullMarked +public class ContentDrop implements Content { - private ServerPlayer holder; + protected ServerPlayer holder; - public ContentDrop(@NotNull ServerPlayer holder) { + protected ContentDrop(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -42,7 +45,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - holder.drop(itemStack, true); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } @Override @@ -70,7 +73,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_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 57% 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..510ea3a4 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,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.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; import net.minecraft.world.entity.EntityEquipment; @@ -8,18 +9,19 @@ 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 for equipment that displays placeholders if empty. */ -public class ContentEquipment implements Content { +@NullMarked +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; @@ -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; } @@ -62,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 @@ -70,40 +72,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 equipmentSlot; - } - - public void onlyEquipmentFor(ServerPlayer viewer) { - this.viewer = viewer; - } - - @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { - if (viewer == null) { - return true; - } - - return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(itemStack) == equipmentSlot; - } - - } - } 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 64% 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..8d21ab41 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,29 +1,39 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +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; 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. */ -public abstract class ContentList implements Content { +@NullMarked +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); } + @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 +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/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 69% 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..cb2dfded 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,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.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.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -8,23 +9,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. */ -public class ContentOffHand extends ContentEquipment { +@NullMarked +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. } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { super.setHolder(holder); this.holder = holder; } @@ -36,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_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 63% 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..d1ccdad8 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,25 +1,28 @@ -package com.lishid.openinv.internal.paper26_2.container.slot; +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; 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. */ -public class ContentViewOnly implements Content { +@NullMarked +public class ContentViewOnly implements Content { - protected @NotNull ServerPlayer holder; + protected ServerPlayer holder; - public ContentViewOnly(@NotNull ServerPlayer holder) { + protected ContentViewOnly(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -40,7 +43,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - this.holder.drop(itemStack, false); + 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_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 71% 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..de470b5b 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,17 +1,19 @@ -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; 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) { + 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 new file mode 100644 index 00000000..ebb382bf --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/SlotViewOnly.java @@ -0,0 +1,131 @@ +package com.lishid.openinv.internal.paper26_3.container.slot; + +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; +import net.minecraft.world.item.ItemStack; +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 SlotViewOnly(Container container, int index, int x, int y) { + super(container, index, x, y); + } + + @Override + public ItemStack getOrDefault() { + return Placeholders.notSlot; + } + + @Override + public void onQuickCraft(ItemStack itemStack1, ItemStack itemStack2) { + } + + @Override + public void onTake(Player player, ItemStack itemStack) { + } + + @Override + public boolean mayPlace(ItemStack itemStack) { + return false; + } + + @Override + public ItemStack getItem() { + return ItemStack.EMPTY; + } + + @Override + public boolean hasItem() { + return false; + } + + @Override + public void setByPlayer(ItemStack newStack) { + } + + @Override + public void setByPlayer(ItemStack newStack, ItemStack oldStack) { + } + + @Override + public void set(ItemStack itemStack) { + } + + @Override + public void setChanged() { + } + + @Override + public int getMaxStackSize() { + return 0; + } + + @Override + public int getMaxStackSize(ItemStack itemStack) { + return 0; + } + + @Override + public ItemStack remove(int amount) { + return ItemStack.EMPTY; + } + + @Override + public boolean mayPickup(Player player) { + return false; + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public Optional tryRemove(int var0, int var1, Player player) { + return Optional.empty(); + } + + @Override + public ItemStack safeTake(int var0, int var1, Player player) { + return ItemStack.EMPTY; + } + + @Override + public ItemStack safeClone(Player player) { + return ItemStack.EMPTY; + } + + @Override + public ItemStack safeInsert(ItemStack itemStack) { + return itemStack; + } + + @Override + public ItemStack safeInsert(ItemStack itemStack, int amount) { + return itemStack; + } + + @Override + public boolean allowModification(Player player) { + return false; + } + + @Override + public boolean isHighlightable() { + return false; + } + + @Override + public boolean isFake() { + return true; + } + +} 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 90% 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..27224170 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; @@ -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 new file mode 100644 index 00000000..c1761e59 --- /dev/null +++ b/internal/paper26_3/src/main/java/com/lishid/openinv/internal/paper26_3/container/slot/placeholder/Placeholders.java @@ -0,0 +1,42 @@ +package com.lishid.openinv.internal.paper26_3.container.slot.placeholder; + +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; +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 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; + } + + return BLOCKED_GAME_TYPE.getOrDefault(serverPlayer.gameMode.getGameModeForPlayer(), ItemStack.EMPTY); + } + + private Placeholders() { + throw new IllegalStateException("Cannot create instance of utility class."); + } + +} 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 86% 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..ee170c02 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; @@ -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 { /** @@ -39,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", @@ -51,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", @@ -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/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 91% 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..0653669e 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,10 +1,11 @@ -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.util.JulLoggerAdapter; +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.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 e6d39f0e..07fb6e72 100644 --- a/internal/spigot26_1/build.gradle.kts +++ b/internal/spigot26_1/build.gradle.kts @@ -33,4 +33,7 @@ dependencies { 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 fa6e2331..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; @@ -12,16 +18,16 @@ @NullMarked public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_2.InternalAccessor { - private final PlayerManager manager; - public InternalAccessor(Logger logger, LanguageManager lang) { super(logger, lang); - this.manager = new PlayerManager(logger); } @Override - public PlayerManager getPlayerManager() { - return manager; + 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/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..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,15 +1,24 @@ 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; @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); + 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 index a9e1dc59..5fc838c5 100644 --- a/internal/spigot26_2/build.gradle.kts +++ b/internal/spigot26_2/build.gradle.kts @@ -22,11 +22,15 @@ apply() dependencies { compileOnly(libs.spigotapi) extensions.getByType(SpigotDependencyExtension::class.java).version = "26.2-R0.1-SNAPSHOT" - compileOnly("com.mojang:logging:1.6.11") + compileOnly("com.mojang:logging:1.7.12") compileOnly("com.mojang:brigadier:1.3.10") - compileOnly("com.mojang:datafixerupper:9.0.19") - compileOnly("com.mojang:authlib:7.0.62") + 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 index fcc121c7..8886e3e3 100644 --- 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 @@ -1,80 +1,27 @@ package com.github.jikoo.openinv.internal.spigot26_2; -import com.github.jikoo.openinv.internal.spigot26_2.container.AnySilentContainer; -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenEnderChest; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.PlaceholderLoader; -import com.github.jikoo.openinv.internal.spigot26_2.player.PlayerManager; -import com.lishid.openinv.internal.Accessor; -import com.lishid.openinv.internal.IAnySilentContainer; -import com.lishid.openinv.internal.ISpecialEnderChest; -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_2.container.slot.OpenInventoryFactory; +import com.github.jikoo.openinv.lang.LanguageManager; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import 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.Level; import java.util.logging.Logger; -public class InternalAccessor implements Accessor { +@NullMarked +public class InternalAccessor extends com.github.jikoo.openinv.internal.spigot26_3.InternalAccessor { - protected final @NotNull Logger logger; - private final @NotNull PlayerManager manager; - private final @NotNull AnySilentContainer anySilentContainer; - - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { - this.logger = logger; - manager = new PlayerManager(logger); - anySilentContainer = new AnySilentContainer(logger, lang); - } - - @Override - public @NotNull PlayerManager getPlayerManager() { - return manager; - } - - @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { - return anySilentContainer; - } - - @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { - return new OpenInventory(player); - } - - @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { - return new OpenEnderChest(player); - } - - @Override - public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { - if (!(bukkitInventory instanceof CraftInventory craftInventory)) { - return null; - } - Container container = craftInventory.getInventory(); - if (clazz.isInstance(container)) { - return clazz.cast(container); - } - return null; + public InternalAccessor(Logger logger, LanguageManager lang) { + super(logger, lang); } @Override - public void reload(@NotNull ConfigurationSection config) { - ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); - try { - // Reset placeholders to defaults and try to load configuration. - new PlaceholderLoader().load(placeholders); - } catch (Exception e) { - logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); - } + protected InventoryFactory createInventoryFactory() { + return new OpenInventoryFactory(); } } diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java deleted file mode 100644 index dc9d46cf..00000000 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/bukkit/OpenPlayerInventorySelf.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.bukkit; - -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -public class OpenPlayerInventorySelf extends OpenPlayerInventory { - - private final int offset; - - public OpenPlayerInventorySelf(@NotNull OpenInventory inventory, int offset) { - super(inventory); - this.offset = offset; - } - - @Override - public ItemStack getItem(int index) { - return super.getItem(offset + index); - } - - @Override - public void setItem(int index, ItemStack item) { - super.setItem(offset + index, item); - } - -} diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java deleted file mode 100644 index 041a0e10..00000000 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/Content.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.github.jikoo.openinv.internal.spigot26_2.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.jetbrains.annotations.NotNull; - -/** - * An interface defining behaviors for entries in a {@link Container}. Used to reduce duplicate content reordering. - */ -public interface Content { - - /** - * Update internal holder. - * - * @param holder the new holder - */ - void setHolder(@NotNull 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_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_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java deleted file mode 100644 index bebef508..00000000 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/SlotViewOnly.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot; - -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder.Placeholders; -import net.minecraft.world.Container; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -/** - * A view-only {@link Slot}. "Blank" by default, but can wrap another slot to display its content. - */ -public class SlotViewOnly extends SlotPlaceholder { - - public static @NotNull SlotViewOnly wrap(@NotNull Slot wrapped) { - SlotViewOnly wrapper; - if (wrapped instanceof SlotPlaceholder placeholder) { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { - @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); - } - - @Override - public ItemStack getOrDefault() { - return Placeholders.notSlot; - } - - @Override - public void onQuickCraft(@NotNull ItemStack itemStack1, @NotNull ItemStack itemStack2) { - } - - @Override - public void onTake(@NotNull Player player, @NotNull ItemStack itemStack) { - } - - @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { - return false; - } - - @Override - public @NotNull ItemStack getItem() { - return ItemStack.EMPTY; - } - - @Override - public boolean hasItem() { - return false; - } - - @Override - public void setByPlayer(@NotNull ItemStack newStack) { - } - - @Override - public void setByPlayer(@NotNull ItemStack newStack, @NotNull ItemStack oldStack) { - } - - @Override - public void set(@NotNull ItemStack itemStack) { - } - - @Override - public void setChanged() { - } - - @Override - public int getMaxStackSize() { - return 0; - } - - @Override - public int getMaxStackSize(@NotNull ItemStack itemStack) { - return 0; - } - - @Override - public @NotNull ItemStack remove(int amount) { - return ItemStack.EMPTY; - } - - @Override - public boolean mayPickup(@NotNull Player player) { - return false; - } - - @Override - public boolean isActive() { - return false; - } - - @Override - public @NotNull Optional tryRemove(int var0, int var1, @NotNull Player player) { - return Optional.empty(); - } - - @Override - public @NotNull ItemStack safeTake(int var0, int var1, @NotNull Player player) { - return ItemStack.EMPTY; - } - - @Override - public @NotNull ItemStack safeClone(@NotNull Player player) { - return ItemStack.EMPTY; - } - - @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { - return itemStack; - } - - @Override - public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack, int amount) { - return itemStack; - } - - @Override - public boolean allowModification(@NotNull Player player) { - return false; - } - - @Override - public boolean isHighlightable() { - return false; - } - - @Override - public boolean isFake() { - return true; - } - -} diff --git a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java b/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java deleted file mode 100644 index 9364e6f0..00000000 --- a/internal/spigot26_2/src/main/java/com/github/jikoo/openinv/internal/spigot26_2/container/slot/placeholder/Placeholders.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.jikoo.openinv.internal.spigot26_2.container.slot.placeholder; - -import com.github.jikoo.openinv.internal.spigot26_2.player.OpenPlayer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; - -import java.util.EnumMap; - -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) { - if (!OpenPlayer.isConnected(serverPlayer.connection)) { - return blockedOffline; - } - - return BLOCKED_GAME_TYPE.getOrDefault(serverPlayer.gameMode.getGameModeForPlayer(), ItemStack.EMPTY); - } - - private Placeholders() { - throw new IllegalStateException("Cannot create instance of utility class."); - } - -} diff --git a/internal/spigot26_3/build.gradle.kts b/internal/spigot26_3/build.gradle.kts new file mode 100644 index 00000000..d7721ce4 --- /dev/null +++ b/internal/spigot26_3/build.gradle.kts @@ -0,0 +1,32 @@ +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.3-R0.1-SNAPSHOT" + 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 new file mode 100644 index 00000000..e5488ab7 --- /dev/null +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/InternalAccessor.java @@ -0,0 +1,111 @@ +package com.github.jikoo.openinv.internal.spigot26_3; + +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.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.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 Logger logger; + private final PlayerManager manager; + private final InventoryFactory factory; + private final AnySilentContainer anySilentContainer; + + public InternalAccessor(Logger logger, LanguageManager lang) { + this.logger = logger; + 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 + public PlayerManager getPlayerManager() { + return manager; + } + + @Override + public IAnySilentContainer getAnySilentContainer() { + return anySilentContainer; + } + + @Override + public ISpecialPlayerInventory createPlayerInventory(Player player) { + return new OpenInventory(factory, player); + } + + @Override + public ISpecialEnderChest createEnderChest(Player player) { + return new OpenEnderChest(player); + } + + @Override + public @Nullable T get(Inventory bukkitInventory, Class clazz) { + if (!(bukkitInventory instanceof CraftInventory craftInventory)) { + return null; + } + Container container = craftInventory.getInventory(); + if (clazz.isInstance(container)) { + return clazz.cast(container); + } + return null; + } + + @Override + public void reload(ConfigurationSection config) { + ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); + try { + // Reset placeholders to defaults and try to load configuration. + createPlaceholderLoader().load(placeholders); + } catch (Exception e) { + logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); + } + } + +} diff --git a/internal/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 83% 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..a99fb036 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,10 +1,10 @@ -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.lishid.openinv.util.ReflectionHelper; -import com.lishid.openinv.util.lang.LanguageManager; +import com.github.jikoo.openinv.internal.spigot26_3.container.menu.OpenChestMenu; +import com.github.jikoo.openinv.internal.spigot26_3.player.PlayerManager; +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; @@ -30,19 +30,23 @@ 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.HashMap; +import java.util.Map; import java.util.logging.Logger; +@NullMarked public class AnySilentContainer extends AnySilentContainerBase { - private final @NotNull Logger logger; - private final @NotNull LanguageManager lang; + private final Map blockStateTypes = new HashMap<>(); + 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 { @@ -62,11 +66,21 @@ public AnySilentContainer(@NotNull Logger logger, @NotNull 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( - @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 +118,7 @@ public boolean activateContainer( return true; } - if (!(blockEntity instanceof MenuProvider menuProvider)) { + if (!(blockEntity instanceof @Nullable MenuProvider menuProvider)) { return false; } @@ -162,7 +176,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 +214,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_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 69% 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..55dfc6af 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,18 +1,21 @@ -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.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; @@ -20,37 +23,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 +63,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 +77,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 +92,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 +108,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 +130,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 +176,7 @@ public void clearContent() { } @Override - public void fillStackedContents(@NotNull StackedItemContents stackedContents) { + public void fillStackedContents(StackedItemContents stackedContents) { for (ItemStack itemstack : items) { stackedContents.accountStack(itemstack); } @@ -191,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_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 70% 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..e14e4e05 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,22 +1,14 @@ -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.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.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; @@ -36,31 +28,37 @@ 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; + protected final InventoryFactory factory; + 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( + 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(); } @@ -78,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. @@ -92,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() { @@ -115,12 +113,7 @@ private int addMainInventory() { slots.set( localIndex, - new ContentList(owner, invIndex, type) { - @Override - public void setHolder(@NotNull ServerPlayer holder) { - items = holder.getInventory().getNonEquipmentItems(); - } - } + factory.newList(owner, invIndex, type, holder -> holder.getInventory().getNonEquipmentItems()) ); } return listSize; @@ -142,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; } @@ -155,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; } @@ -169,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(@NotNull ServerPlayer serverPlayer) { - return new ContentCraftingResult(serverPlayer); - } - public Slot getMenuSlot(int index, int x, int y) { return slots.get(index).asSlot(this, index, x, y); } @@ -203,7 +181,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 +215,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 +223,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 +238,7 @@ public boolean isInUse() { } @Override - public @NotNull org.bukkit.entity.Player getPlayer() { + public org.bukkit.entity.Player getPlayer() { return getOwner(); } @@ -275,22 +253,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 +287,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 +301,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(); } @@ -357,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_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 59% 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..3cd97f55 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,13 +1,13 @@ -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 com.github.jikoo.openinv.internal.container.ViewOnly; import net.minecraft.world.Container; import org.bukkit.Material; 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_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 74% 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..270f3e3a 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; @@ -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_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 82% 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..89f4cbfe 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.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; import com.google.common.base.Preconditions; -import com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Inventory; import org.bukkit.craftbukkit.inventory.CraftInventory; @@ -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 new file mode 100644 index 00000000..02ef39d5 --- /dev/null +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/bukkit/OpenPlayerInventorySelf.java @@ -0,0 +1,28 @@ +package com.github.jikoo.openinv.internal.spigot26_3.container.bukkit; + +import com.github.jikoo.openinv.internal.spigot26_3.container.OpenInventory; +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public class OpenPlayerInventorySelf extends OpenPlayerInventory { + + private final int offset; + + public OpenPlayerInventorySelf(OpenInventory inventory, int offset) { + super(inventory); + this.offset = offset; + } + + @Override + public @Nullable ItemStack getItem(int index) { + return super.getItem(offset + index); + } + + @Override + public void setItem(int index, @Nullable ItemStack item) { + super.setItem(offset + index, item); + } + +} 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 85% 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..9cf8a75a 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,11 +1,13 @@ -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.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; @@ -17,32 +19,36 @@ 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 { protected static final int BOTTOM_INVENTORY_SIZE = 36; + protected final InventoryFactory factory; protected final T container; protected final ServerPlayer viewer; protected final boolean viewOnly; protected final boolean ownContainer; protected final int topSize; - private CraftInventoryView, Inventory> bukkitEntity; + private @Nullable CraftInventoryView, Inventory> bukkitEntity; protected OpenChestMenu( - @NotNull MenuType type, + MenuType type, int containerCounter, - @NotNull T container, - @NotNull ServerPlayer viewer, + InventoryFactory factory, + T container, + ServerPlayer viewer, boolean viewOnly ) { super(type, containerCounter); + this.factory = factory; this.container = container; this.viewer = viewer; this.viewOnly = viewOnly; @@ -90,7 +96,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,10 +113,10 @@ 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); + return factory.wrapViewOnly(slot); } return slot; } @@ -120,7 +126,7 @@ public boolean isViewOnly() { } @Override - public final @NotNull CraftInventoryView, Inventory> getBukkitView() { + public final CraftInventoryView, Inventory> getBukkitView() { if (bukkitEntity == null) { bukkitEntity = createBukkitEntity(); } @@ -128,7 +134,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 +159,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 +276,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 +287,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_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 65% 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..767ee78d 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,25 +1,30 @@ -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.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; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class OpenEnderChestMenu extends OpenSyncMenu { public OpenEnderChestMenu( - @NotNull OpenEnderChest enderChest, - @NotNull ServerPlayer viewer, + 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 - 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_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 83% 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..2de76986 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,14 +1,16 @@ -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.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.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 com.github.jikoo.openinv.internal.spigot26_2.container.OpenInventory; -import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenDummyPlayerInventory; -import com.github.jikoo.openinv.internal.spigot26_2.container.bukkit.OpenPlayerInventorySelf; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentDrop; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.ContentEquipment; -import com.github.jikoo.openinv.internal.spigot26_2.container.slot.SlotViewOnly; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ChestMenu; @@ -20,15 +22,20 @@ 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; - 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) { @@ -48,7 +55,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); @@ -63,9 +70,9 @@ protected void preSlotSetup() { 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()) { @@ -92,14 +99,14 @@ protected void preSlotSetup() { } if (viewOnly) { - return SlotViewOnly.wrap(slot); + return factory.wrapViewOnly(slot); } return slot; } @Override - protected @NotNull CraftInventoryView, Inventory> createBukkitEntity() { + protected CraftInventoryView, Inventory> createBukkitEntity() { Inventory bukkitInventory; if (viewOnly) { bukkitInventory = new OpenDummyPlayerInventory(container); @@ -111,7 +118,7 @@ protected void preSlotSetup() { 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; } @@ -176,7 +183,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 +205,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; } @@ -226,8 +233,7 @@ public int countSlots() { // 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_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 84% 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..dd97f639 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,14 +1,16 @@ -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.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.spigot26_2.container.slot.SlotPlaceholder; +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; @@ -18,8 +20,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,7 +30,8 @@ /** * An extension of {@link OpenChestMenu} that supports {@link SlotPlaceholder placeholders}. */ -@SuppressWarnings("HidingField") // Revisit when removing 1.21.4 support +@NullMarked +@SuppressWarnings("HidingField") public abstract class OpenSyncMenu> extends OpenChestMenu { @@ -41,18 +44,19 @@ public abstract class OpenSyncMenu type, + MenuType type, int containerCounter, - @NotNull T container, - @NotNull ServerPlayer viewer, + 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. @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 +65,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 +79,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 +87,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 +125,7 @@ public void broadcastCarriedItem() { } @Override - public void removeSlotListener(@NotNull ContainerListener containerListener) { + public void removeSlotListener(ContainerListener containerListener) { this.containerListeners.remove(containerListener); } @@ -171,7 +175,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 +187,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 +224,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_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 65% 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..b7d0cd32 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,37 +1,36 @@ -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 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; 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. */ -public class ContentCrafting implements Content { +@NullMarked +public class ContentCrafting implements Content { private final int index; - private ServerPlayer holder; - private List items; + protected ServerPlayer holder; + protected List items; - public ContentCrafting(@NotNull 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(@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 +38,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(); @@ -47,12 +46,12 @@ public void setHolder(@NotNull 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); @@ -65,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); @@ -78,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 { - holder.drop(itemStack, false); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } } @@ -93,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 { @@ -104,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(@NotNull Player player) { - return isAvailable(); + public boolean mayPickup(Player player) { + return isAvailable(holder); } @Override - public boolean mayPlace(@NotNull ItemStack itemStack) { - return isAvailable(); + public boolean mayPlace(ItemStack itemStack) { + 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_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 79% 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..06336206 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,22 +1,23 @@ -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; 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.

*/ -public class ContentCraftingResult extends ContentViewOnly { +@NullMarked +class ContentCraftingResult extends ContentViewOnly { - public ContentCraftingResult(@NotNull ServerPlayer holder) { + ContentCraftingResult(ServerPlayer holder) { super(holder); } 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 77% 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..86c58f6a 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,28 +1,31 @@ -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.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; 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. */ -public class ContentCursor implements Content { +@NullMarked +public class ContentCursor implements Content { - private @NotNull ServerPlayer holder; + protected ServerPlayer holder; - public ContentCursor(@NotNull ServerPlayer holder) { + protected ContentCursor(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -56,11 +59,11 @@ public void set(ItemStack itemStack) { if (isAvailable()) { holder.containerMenu.setCarried(itemStack); } else { - holder.drop(itemStack, false); + 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. @@ -94,12 +97,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_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 70% 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..406c1d66 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,27 +1,30 @@ -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.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.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 fake slot used to drop items. Unavailable offline. */ -public class ContentDrop implements Content { +@NullMarked +public class ContentDrop implements Content { - private ServerPlayer holder; + protected ServerPlayer holder; - public ContentDrop(@NotNull ServerPlayer holder) { + protected ContentDrop(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -42,7 +45,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - holder.drop(itemStack, true); + this.holder.drop(itemStack, false, Prediction.SERVER_ONLY); } @Override @@ -70,7 +73,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_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 54% 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..23a40def 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,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.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; import net.minecraft.world.entity.EquipmentSlot; @@ -10,15 +11,19 @@ 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; -public class ContentEquipment implements Content { +/** + * A slot for equipment that displays placeholders if empty. + */ +@NullMarked +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; @@ -31,7 +36,7 @@ public ContentEquipment(ServerPlayer holder, EquipmentSlot equipmentSlot) { } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.equipment = holder.getBukkitEntity().getInventory(); } @@ -49,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 @@ -68,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 @@ -76,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(@NotNull 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_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 64% 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..9cbf47f0 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,29 +1,39 @@ -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.container.slot.Content; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; 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. */ -public abstract class ContentList implements Content { +@NullMarked +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); } + @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 +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_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 65% 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..fe34ae7e 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,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.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.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -8,20 +9,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; -public class ContentOffHand extends ContentEquipment { +/** + * A slot for equipment that updates held items if necessary. + */ +@NullMarked +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. } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { super.setHolder(holder); this.holder = holder; } @@ -33,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_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 64% 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..34814cbf 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,25 +1,28 @@ -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.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; 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. */ -public class ContentViewOnly implements Content { +@NullMarked +public class ContentViewOnly implements Content { - protected @NotNull ServerPlayer holder; + protected ServerPlayer holder; - public ContentViewOnly(@NotNull ServerPlayer holder) { + protected ContentViewOnly(ServerPlayer holder) { this.holder = holder; } @Override - public void setHolder(@NotNull ServerPlayer holder) { + public void setHolder(ServerPlayer holder) { this.holder = holder; } @@ -40,7 +43,7 @@ public ItemStack removePartial(int amount) { @Override public void set(ItemStack itemStack) { - this.holder.drop(itemStack, false); + 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_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 71% 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..8a35482a 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,17 +1,19 @@ -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; 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) { + 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 new file mode 100644 index 00000000..bfdd826d --- /dev/null +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/SlotViewOnly.java @@ -0,0 +1,131 @@ +package com.github.jikoo.openinv.internal.spigot26_3.container.slot; + +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; +import net.minecraft.world.item.ItemStack; +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 SlotViewOnly(Container container, int index, int x, int y) { + super(container, index, x, y); + } + + @Override + public ItemStack getOrDefault() { + return Placeholders.notSlot; + } + + @Override + public void onQuickCraft(ItemStack itemStack1, ItemStack itemStack2) { + } + + @Override + public void onTake(Player player, ItemStack itemStack) { + } + + @Override + public boolean mayPlace(ItemStack itemStack) { + return false; + } + + @Override + public ItemStack getItem() { + return ItemStack.EMPTY; + } + + @Override + public boolean hasItem() { + return false; + } + + @Override + public void setByPlayer(ItemStack newStack) { + } + + @Override + public void setByPlayer(ItemStack newStack, ItemStack oldStack) { + } + + @Override + public void set(ItemStack itemStack) { + } + + @Override + public void setChanged() { + } + + @Override + public int getMaxStackSize() { + return 0; + } + + @Override + public int getMaxStackSize(ItemStack itemStack) { + return 0; + } + + @Override + public ItemStack remove(int amount) { + return ItemStack.EMPTY; + } + + @Override + public boolean mayPickup(Player player) { + return false; + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public Optional tryRemove(int var0, int var1, Player player) { + return Optional.empty(); + } + + @Override + public ItemStack safeTake(int var0, int var1, Player player) { + return ItemStack.EMPTY; + } + + @Override + public ItemStack safeClone(Player player) { + return ItemStack.EMPTY; + } + + @Override + public ItemStack safeInsert(ItemStack itemStack) { + return itemStack; + } + + @Override + public ItemStack safeInsert(ItemStack itemStack, int amount) { + return itemStack; + } + + @Override + public boolean allowModification(Player player) { + return false; + } + + @Override + public boolean isHighlightable() { + return false; + } + + @Override + public boolean isFake() { + return true; + } + +} 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 57% 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..ff4b48c7 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,18 +1,19 @@ -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; -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_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 90% 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..cf9a08f8 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; @@ -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 new file mode 100644 index 00000000..e494f154 --- /dev/null +++ b/internal/spigot26_3/src/main/java/com/github/jikoo/openinv/internal/spigot26_3/container/slot/placeholder/Placeholders.java @@ -0,0 +1,38 @@ +package com.github.jikoo.openinv.internal.spigot26_3.container.slot.placeholder; + +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; +import org.jspecify.annotations.NullMarked; + +import java.util.EnumMap; + +@NullMarked +public final class Placeholders { + + 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; + } + + return BLOCKED_GAME_TYPE.getOrDefault(serverPlayer.gameMode.getGameModeForPlayer(), ItemStack.EMPTY); + } + + private Placeholders() { + throw new IllegalStateException("Cannot create instance of utility class."); + } + +} 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 91% 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..6a5cc6c7 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; @@ -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 { /** @@ -39,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", @@ -51,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", @@ -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_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 83% 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..66d5a074 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,10 +1,11 @@ -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.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; @@ -32,19 +37,25 @@ 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; -public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { +@NullMarked +public class PlayerManager implements com.github.jikoo.openinv.internal.PlayerManager { - private final @NotNull Logger logger; + private final Logger logger; + protected final InventoryFactory factory; private @Nullable Field bukkitEntity; - public PlayerManager(@NotNull Logger logger) { + public PlayerManager( + Logger logger, + InventoryFactory factory + ) { this.logger = logger; + this.factory = factory; try { bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); } catch (NoSuchFieldException e) { @@ -54,7 +65,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 +86,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 +113,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 +151,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 +186,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 +221,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); @@ -226,7 +237,7 @@ private void injectPlayer(ServerPlayer player) throws IllegalAccessException { 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 5e577f84..e8356a6d 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -16,6 +16,9 @@ dependencies { compileOnly(libs.spigotapi) implementation(project(":openinvapi")) implementation(project(":openinvcommon")) + implementation(project(":openinvadapterpaper26_3")) { + exclude(group = "io.papermc.paper", module = "dev-bundle") + } implementation(project(":openinvadapterpaper26_2")) { exclude(group = "io.papermc.paper", module = "dev-bundle") } @@ -25,8 +28,8 @@ 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_3")) { + exclude(group = "org.spigotmc", module = "spigot") } implementation(project(":openinvadapterspigot26_2")) { 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 5ab6999f..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; @@ -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..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,42 +6,43 @@ 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; 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 @@ -114,10 +115,10 @@ protected void handle( @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 (!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..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; @@ -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..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,14 +22,14 @@ 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; 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..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,16 +6,16 @@ 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; 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..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; @@ -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..4b2a4222 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.TabCompleter; -import com.lishid.openinv.util.lang.LanguageManager; -import com.lishid.openinv.util.lang.Replacement; import com.lishid.openinv.util.SearchHelper; +import com.lishid.openinv.util.TabCompleter; +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; @@ -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..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; @@ -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..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; @@ -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 7a6bcf15..42d64d5f 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -18,21 +18,22 @@ 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; -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,39 +64,40 @@ 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))) { + return null; + } + + // Spigot adapters. if (!PAPER) { - if (BukkitVersions.MINECRAFT.equals(Version.of(26, 2))) { + 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)) - && 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, 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); } - 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); } /** @@ -112,7 +114,7 @@ public void reload(ConfigurationSection config) { * * @return the version */ - public @NotNull String getVersion() { + public String getVersion() { return BukkitVersions.MINECRAFT.toString(); } @@ -131,7 +133,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)); } @@ -139,8 +141,8 @@ public boolean isSupported() { } public @Nullable InventoryView openInventory( - @NotNull Player player, - @NotNull ISpecialInventory inventory, + Player player, + ISpecialInventory inventory, boolean viewOnly ) { if (internal == null) { @@ -155,7 +157,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(); 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..176a3be0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,10 +18,11 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { project(":openinvcommon").projectDir = file("common") val internals = listOf( + "paper26_3", "paper26_2", "paper26_1", "paper1_21_11", - "paper1_21_10", + "spigot26_3", "spigot26_2", "spigot26_1" )