diff --git a/internal/common/build.gradle.kts b/internal/common/build.gradle.kts index 1e14a71b..71ca46d2 100644 --- a/internal/common/build.gradle.kts +++ b/internal/common/build.gradle.kts @@ -33,7 +33,7 @@ dependencies { implementation(project(":openinvapi")) implementation(project(":openinvcommon")) - paperweight.paperDevBundle("1.21.10-R0.1-SNAPSHOT") + paperweight.paperDevBundle("1.21.11-R0.1-SNAPSHOT") } val spigot = tasks.register("spigotRelocations") { diff --git a/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java index 48204e49..641b4d54 100644 --- a/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java @@ -5,7 +5,7 @@ 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.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -25,13 +25,13 @@ public OpenInventory(@NotNull Player bukkitPlayer) { component.append( Component.translatableWithFallback("openinv.container.inventory.self", "") .withStyle(style -> style - .withFont(new FontDescription.Resource(ResourceLocation.parse("openinv:font/inventory"))) + .withFont(new FontDescription.Resource(Identifier.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"))) + .withFont(new FontDescription.Resource(Identifier.parse("openinv:font/inventory"))) .withColor(ChatFormatting.WHITE))); } if (menu != null && menu.isViewOnly()) { diff --git a/internal/common/src/main/java/com/lishid/openinv/internal/common/player/BaseOpenPlayer.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/BaseOpenPlayer.java index 57cb1ab2..77e9fb50 100644 --- a/internal/common/src/main/java/com/lishid/openinv/internal/common/player/BaseOpenPlayer.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/BaseOpenPlayer.java @@ -1,10 +1,13 @@ package com.lishid.openinv.internal.common.player; +import com.lishid.openinv.event.OpenEvents; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NumericTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -13,6 +16,9 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Set; public abstract class BaseOpenPlayer extends CraftPlayer { @@ -21,7 +27,7 @@ public abstract class BaseOpenPlayer extends CraftPlayer { * List of tags to always reset when saving. These are items that do not get written * if unset or empty, resulting in older values not being clobbered appropriately. * - * @see net.minecraft.world.entity.Entity#saveWithoutId(ValueOutput) + * @see net.minecraft.world.entity.Entity#saveWithoutId(ValueOutput, boolean, boolean, boolean) * @see net.minecraft.server.level.ServerPlayer#addAdditionalSaveData(ValueOutput) * @see net.minecraft.world.entity.player.Player#addAdditionalSaveData(ValueOutput) * @see net.minecraft.world.entity.LivingEntity#addAdditionalSaveData(ValueOutput) @@ -41,8 +47,8 @@ public abstract class BaseOpenPlayer extends CraftPlayer { "Passengers", // ServerPlayer#addAdditionalSaveData(CompoundTag) // Intentional omissions to prevent mount loss: Attach, Entity, and RootVehicle - "warden_spawn_tracker", - "entered_nether_pos", // Replaces enteredNetherPosition + "warden_spawn_tracker", // No longer needed as of 1.21.11 + "entered_nether_pos", // Replaces enteredNetherPosition as of 1.21.6 "enteredNetherPosition", "respawn", // Replaces SpawnXyz fields as of 1.21.6 "SpawnX", @@ -86,7 +92,40 @@ public void loadData() { } @Override - public abstract void saveData(); + public void saveData() { + if (OpenEvents.saveCancelled(this)) { + return; + } + + trySave(this.getHandle()); + } + + protected abstract void trySave(ServerPlayer player); + + protected void saveSafe( + @NotNull ServerPlayer player, + @Nullable CompoundTag oldData, + @NotNull CompoundTag playerData, + @NotNull PlayerDataStorage worldNbtStorage + ) throws IOException { + // Revert certain special data values when offline. + revertSpecialValues(playerData, oldData); + + Path playerDataDir = worldNbtStorage.getPlayerDir().toPath(); + Path tempFile = Files.createTempFile(playerDataDir, player.getStringUUID() + "-", ".dat"); + NbtIo.writeCompressed(playerData, tempFile); + Path dataFile = playerDataDir.resolve(player.getStringUUID() + ".dat"); + Path backupFile = playerDataDir.resolve(player.getStringUUID() + ".dat_old"); + safeReplaceFile(dataFile, tempFile, backupFile); + } + + protected void safeReplaceFile( + @NotNull Path dataFile, + @NotNull Path tempFile, + @NotNull Path backupFile + ) { + net.minecraft.util.Util.safeReplaceFile(dataFile, tempFile, backupFile); + } @Contract("null -> new") protected @NotNull CompoundTag getWritableTag(@Nullable CompoundTag oldData) { @@ -107,7 +146,11 @@ public void loadData() { return oldData; } - protected void revertSpecialValues(@NotNull CompoundTag newData, @NotNull CompoundTag oldData) { + protected void revertSpecialValues(@NotNull CompoundTag newData, @Nullable CompoundTag oldData) { + if (oldData == null) { + return; + } + // Revert automatic updates to play timestamps. copyValue(oldData, newData, "bukkit", "lastPlayed", NumericTag.class); copyValue(oldData, newData, "Paper", "LastSeen", NumericTag.class); @@ -154,12 +197,14 @@ private void setTag( @Nullable T data ) { if (data == null) { - container.remove(key); + remove(container, key); } else { container.put(key, data); } } + protected abstract void remove(@NotNull CompoundTag tag, @NotNull String key); + public static boolean isConnected(@Nullable ServerGamePacketListenerImpl connection) { return connection != null && !connection.isDisconnected(); } diff --git a/internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java index 79e43186..80f87129 100644 --- a/internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java @@ -1,21 +1,16 @@ package com.lishid.openinv.internal.common.player; -import com.lishid.openinv.event.OpenEvents; import com.mojang.logging.LogUtils; -import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ProblemReporter; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.TagValueOutput; import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.craftbukkit.CraftServer; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; -import java.nio.file.Files; -import java.nio.file.Path; - public class OpenPlayer extends BaseOpenPlayer { protected OpenPlayer( @@ -27,39 +22,29 @@ protected OpenPlayer( } @Override - public void saveData() { - if (OpenEvents.saveCancelled(this)) { - return; - } - - ServerPlayer player = this.getHandle(); + protected void trySave(ServerPlayer player) { Logger logger = LogUtils.getLogger(); // See net.minecraft.world.level.storage.PlayerDataStorage#save(EntityHuman) try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), logger)) { - PlayerDataStorage worldNBTStorage = server.getServer().getPlayerList().playerIo; + PlayerDataStorage worldNbtStorage = server.getServer().getPlayerList().playerIo; CompoundTag oldData = isOnline() ? null - : worldNBTStorage.load(player.nameAndId()).orElse(null); + : worldNbtStorage.load(player.nameAndId()).orElse(null); CompoundTag playerData = getWritableTag(oldData); ValueOutput valueOutput = TagValueOutput.createWrappingWithContext(scopedCollector, player.registryAccess(), playerData); player.saveWithoutId(valueOutput); - if (oldData != null) { - // Revert certain special data values when offline. - revertSpecialValues(playerData, oldData); - } - - Path playerDataDir = worldNBTStorage.getPlayerDir().toPath(); - Path tempFile = Files.createTempFile(playerDataDir, player.getStringUUID() + "-", ".dat"); - NbtIo.writeCompressed(playerData, tempFile); - Path dataFile = playerDataDir.resolve(player.getStringUUID() + ".dat"); - Path backupFile = playerDataDir.resolve(player.getStringUUID() + ".dat_old"); - Util.safeReplaceFile(dataFile, tempFile, backupFile); + saveSafe(player, oldData, playerData, worldNbtStorage); } catch (Exception e) { LogUtils.getLogger().warn("Failed to save player data for {}: {}", player.getScoreboardName(), e); } } + @Override + protected void remove(@NotNull CompoundTag tag, @NotNull String key) { + tag.remove(key); + } + } diff --git a/internal/paper1_21_10/build.gradle.kts b/internal/paper1_21_10/build.gradle.kts new file mode 100644 index 00000000..d727317a --- /dev/null +++ b/internal/paper1_21_10/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + `openinv-base` + alias(libs.plugins.paperweight) +} + +configurations.all { + resolutionStrategy.capabilitiesResolution.withCapability("org.spigotmc:spigot-api") { + val paper = candidates.firstOrNull { + it.id.let { id -> + id is ModuleComponentIdentifier && id.module == "paper-api" + } + } + if (paper != null) { + select(paper) + } + because("module is written for Paper servers") + } +} + +dependencies { + implementation(project(":openinvapi")) + implementation(project(":openinvcommon")) + implementation(project(":openinvadaptercommon")) + + 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 new file mode 100644 index 00000000..b6333bf0 --- /dev/null +++ b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/InternalAccessor.java @@ -0,0 +1,31 @@ +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.common.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 new file mode 100644 index 00000000..3210726c --- /dev/null +++ b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/container/OpenInventory.java @@ -0,0 +1,50 @@ +package com.lishid.openinv.internal.paper1_21_10.container; + +import com.lishid.openinv.internal.common.container.BaseOpenInventory; +import com.lishid.openinv.internal.common.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; + } + +} 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 new file mode 100644 index 00000000..0595e9b0 --- /dev/null +++ b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/OpenPlayer.java @@ -0,0 +1,35 @@ +package com.lishid.openinv.internal.paper1_21_10.player; + +import com.lishid.openinv.internal.common.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.common.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 new file mode 100644 index 00000000..3382bfaf --- /dev/null +++ b/internal/paper1_21_10/src/main/java/com/lishid/openinv/internal/paper1_21_10/player/PlayerManager.java @@ -0,0 +1,26 @@ +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.common.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_5/src/main/java/com/lishid/openinv/internal/paper1_21_5/player/OpenPlayer.java b/internal/paper1_21_5/src/main/java/com/lishid/openinv/internal/paper1_21_5/player/OpenPlayer.java index 54aa7911..46b4aa87 100644 --- a/internal/paper1_21_5/src/main/java/com/lishid/openinv/internal/paper1_21_5/player/OpenPlayer.java +++ b/internal/paper1_21_5/src/main/java/com/lishid/openinv/internal/paper1_21_5/player/OpenPlayer.java @@ -1,16 +1,13 @@ package com.lishid.openinv.internal.paper1_21_5.player; -import com.lishid.openinv.event.OpenEvents; import com.lishid.openinv.internal.common.player.BaseOpenPlayer; import com.mojang.logging.LogUtils; -import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.storage.PlayerDataStorage; import org.bukkit.craftbukkit.CraftServer; +import org.jetbrains.annotations.NotNull; -import java.nio.file.Files; import java.nio.file.Path; public class OpenPlayer extends BaseOpenPlayer { @@ -20,12 +17,7 @@ protected OpenPlayer(CraftServer server, ServerPlayer entity, PlayerManager mana } @Override - public void saveData() { - if (OpenEvents.saveCancelled(this)) { - return; - } - - ServerPlayer player = this.getHandle(); + protected void trySave(ServerPlayer player) { // See net.minecraft.world.level.storage.PlayerDataStorage#save(EntityHuman) try { PlayerDataStorage worldNBTStorage = player.server.getPlayerList().playerIo; @@ -35,20 +27,20 @@ public void saveData() { playerData = player.saveWithoutId(playerData); - if (oldData != null) { - // Revert certain special data values when offline. - revertSpecialValues(playerData, oldData); - } - - Path playerDataDir = worldNBTStorage.getPlayerDir().toPath(); - Path tempFile = Files.createTempFile(playerDataDir, player.getStringUUID() + "-", ".dat"); - NbtIo.writeCompressed(playerData, tempFile); - Path dataFile = playerDataDir.resolve(player.getStringUUID() + ".dat"); - Path backupFile = playerDataDir.resolve(player.getStringUUID() + ".dat_old"); - Util.safeReplaceFile(dataFile, tempFile, backupFile); + saveSafe(player, oldData, playerData, worldNBTStorage); } catch (Exception e) { LogUtils.getLogger().warn("Failed to save player data for {}: {}", player.getScoreboardName(), e); } } + @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_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java index 9462c8e4..0cad37a7 100644 --- a/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java +++ b/internal/paper1_21_8/src/main/java/com/lishid/openinv/internal/paper1_21_8/player/OpenPlayer.java @@ -1,20 +1,17 @@ package com.lishid.openinv.internal.paper1_21_8.player; -import com.lishid.openinv.event.OpenEvents; import com.lishid.openinv.internal.common.player.BaseOpenPlayer; import com.mojang.logging.LogUtils; -import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ProblemReporter; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.TagValueOutput; import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.craftbukkit.CraftServer; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; -import java.nio.file.Files; import java.nio.file.Path; public class OpenPlayer extends BaseOpenPlayer { @@ -28,39 +25,34 @@ protected OpenPlayer( } @Override - public void saveData() { - if (OpenEvents.saveCancelled(this)) { - return; - } - - ServerPlayer player = this.getHandle(); + protected void trySave(ServerPlayer player) { Logger logger = LogUtils.getLogger(); // See net.minecraft.world.level.storage.PlayerDataStorage#save(EntityHuman) try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), logger)) { - PlayerDataStorage worldNBTStorage = server.getServer().getPlayerList().playerIo; + PlayerDataStorage worldNbtStorage = server.getServer().getPlayerList().playerIo; CompoundTag oldData = isOnline() ? null - : worldNBTStorage.load(player.getName().getString(), player.getStringUUID(), scopedCollector).orElse(null); + : worldNbtStorage.load(player.getName().getString(), player.getStringUUID(), scopedCollector).orElse(null); CompoundTag playerData = getWritableTag(oldData); ValueOutput valueOutput = TagValueOutput.createWrappingWithContext(scopedCollector, player.registryAccess(), playerData); player.saveWithoutId(valueOutput); - if (oldData != null) { - // Revert certain special data values when offline. - revertSpecialValues(playerData, oldData); - } - - Path playerDataDir = worldNBTStorage.getPlayerDir().toPath(); - Path tempFile = Files.createTempFile(playerDataDir, player.getStringUUID() + "-", ".dat"); - NbtIo.writeCompressed(playerData, tempFile); - Path dataFile = playerDataDir.resolve(player.getStringUUID() + ".dat"); - Path backupFile = playerDataDir.resolve(player.getStringUUID() + ".dat_old"); - Util.safeReplaceFile(dataFile, tempFile, backupFile); + saveSafe(player, oldData, playerData, worldNbtStorage); } catch (Exception e) { LogUtils.getLogger().warn("Failed to save player data for {}: {}", player.getScoreboardName(), e); } } + @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/spigot/build.gradle.kts b/internal/spigot/build.gradle.kts index 94cf844f..5a74fb87 100644 --- a/internal/spigot/build.gradle.kts +++ b/internal/spigot/build.gradle.kts @@ -10,9 +10,9 @@ plugins { apply() apply() -val spigotVer = "1.21.10-R0.1-SNAPSHOT" +val spigotVer = "1.21.11-R0.1-SNAPSHOT" // Used by common adapter to relocate Craftbukkit classes to a versioned package. -rootProject.extra["craftbukkitPackage"] = "v1_21_R6" +rootProject.extra["craftbukkitPackage"] = "v1_21_R7" configurations.all { resolutionStrategy.capabilitiesResolution.withCapability("org.spigotmc:spigot-api") { diff --git a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/bukkit/OpenPlayerInventory.java b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/bukkit/OpenPlayerInventory.java index 04985b24..77aefe24 100644 --- a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/bukkit/OpenPlayerInventory.java +++ b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/bukkit/OpenPlayerInventory.java @@ -4,8 +4,8 @@ import com.lishid.openinv.internal.reobf.container.BaseOpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Inventory; -import org.bukkit.craftbukkit.v1_21_R6.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R6.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; diff --git a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/slot/ContentEquipment.java b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/slot/ContentEquipment.java index 10f16100..bfec218e 100644 --- a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/slot/ContentEquipment.java +++ b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/container/slot/ContentEquipment.java @@ -6,8 +6,8 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R6.CraftEquipmentSlot; -import org.bukkit.craftbukkit.v1_21_R6.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.PlayerInventory; import org.jetbrains.annotations.NotNull; diff --git a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/OpenPlayer.java b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/OpenPlayer.java index c200ccd9..33c630ac 100644 --- a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/OpenPlayer.java +++ b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/OpenPlayer.java @@ -2,7 +2,6 @@ import com.lishid.openinv.event.OpenEvents; import com.mojang.logging.LogUtils; -import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NumericTag; @@ -10,11 +9,12 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.util.ProblemReporter; +import net.minecraft.util.Util; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.TagValueOutput; import net.minecraft.world.level.storage.ValueOutput; -import org.bukkit.craftbukkit.v1_21_R6.CraftServer; -import org.bukkit.craftbukkit.v1_21_R6.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/PlayerManager.java b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/PlayerManager.java index 2a79c830..d619f847 100644 --- a/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/PlayerManager.java +++ b/internal/spigot/src/main/java/com/lishid/openinv/internal/reobf/player/PlayerManager.java @@ -24,9 +24,9 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.Server; -import org.bukkit.craftbukkit.v1_21_R6.CraftServer; -import org.bukkit.craftbukkit.v1_21_R6.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R6.event.CraftEventFactory; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.event.CraftEventFactory; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; import org.jetbrains.annotations.NotNull; diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 95d899c2..d00a60a6 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { implementation(project(":openinvapi")) implementation(project(":openinvcommon")) implementation(project(":openinvadaptercommon")) + implementation(project(":openinvadapterpaper1_21_10")) implementation(project(":openinvadapterpaper1_21_8")) implementation(project(":openinvadapterpaper1_21_5")) implementation(project(":openinvadapterpaper1_21_4")) diff --git a/plugin/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java index b68254a7..e56d9d22 100644 --- a/plugin/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -257,20 +257,11 @@ public void setSilentContainerStatus(@NotNull final OfflinePlayer offline, final boolean viewOnly = edit != null && !edit.hasPermission(player); - if (ownContainer || (viewOnly && config.getAccessEqualMode() != AccessEqualMode.DENY)) { + if (ownContainer) { return this.accessor.openInventory(player, inventory, viewOnly); } - AccessEqualMode accessMode; - if (Permissions.ACCESS_EQUAL_EDIT.hasPermission(player)) { - accessMode = AccessEqualMode.ALLOW; - } else if (Permissions.ACCESS_EQUAL_VIEW.hasPermission(player)) { - accessMode = AccessEqualMode.VIEW; - } else if (Permissions.ACCESS_EQUAL_DENY.hasPermission(player)) { - accessMode = AccessEqualMode.DENY; - } else { - accessMode = config.getAccessEqualMode(); - } + AccessEqualMode accessMode = AccessEqualMode.getByPerm(player, config); for (int level = 4; level > 0; --level) { String permission = "openinv.access.level." + level; 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 24dbba13..9081ad1f 100644 --- a/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/command/PlayerLookupCommand.java @@ -220,21 +220,6 @@ protected abstract boolean deniedCommand( @NotNull Player onlineTarget, boolean invPerms ) { - if (sender.equals(onlineTarget)) { - return null; - } - - // Crossworld check - if (sender instanceof Player player - && !Permissions.ACCESS_CROSSWORLD.hasPermission(sender) - && !onlineTarget.getWorld().equals(player.getWorld())) { - lang.sendMessage( - sender, - "messages.error.permissionCrossWorld", - new Replacement("%target%", onlineTarget.getDisplayName()) - ); - return null; - } boolean ownContainer = sender.equals(onlineTarget); Permissions edit; @@ -246,21 +231,25 @@ protected abstract boolean deniedCommand( boolean viewOnly = !edit.hasPermission(sender); - if (ownContainer || (viewOnly && config.getAccessEqualMode() != AccessEqualMode.DENY)) { + if (ownContainer) { + // Skip other access checks for self. return new PlayerAccess(onlineTarget, viewOnly); } - AccessEqualMode accessMode; - if (Permissions.ACCESS_EQUAL_EDIT.hasPermission(sender)) { - accessMode = AccessEqualMode.ALLOW; - } else if (Permissions.ACCESS_EQUAL_VIEW.hasPermission(sender)) { - accessMode = AccessEqualMode.VIEW; - } else if (Permissions.ACCESS_EQUAL_DENY.hasPermission(sender)) { - accessMode = AccessEqualMode.DENY; - } else { - accessMode = config.getAccessEqualMode(); + // Crossworld check + if (sender instanceof Player player + && !Permissions.ACCESS_CROSSWORLD.hasPermission(sender) + && !onlineTarget.getWorld().equals(player.getWorld())) { + lang.sendMessage( + sender, + "messages.error.permissionCrossWorld", + new Replacement("%target%", onlineTarget.getDisplayName()) + ); + return null; } + AccessEqualMode accessMode = AccessEqualMode.getByPerm(sender, config); + for (int level = 4; level > 0; --level) { String permission = "openinv.access.level." + level; // If the target doesn't have this access level... 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 8d36652a..a68914d9 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/AccessEqualMode.java +++ b/plugin/src/main/java/com/lishid/openinv/util/AccessEqualMode.java @@ -1,5 +1,7 @@ package com.lishid.openinv.util; +import com.lishid.openinv.util.config.Config; +import org.bukkit.permissions.Permissible; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,4 +22,17 @@ public enum AccessEqualMode { }; } + public static @NotNull AccessEqualMode getByPerm(@NotNull Permissible permissible, @NotNull Config config) { + if (Permissions.ACCESS_EQUAL_EDIT.hasPermission(permissible)) { + return AccessEqualMode.ALLOW; + } + if (Permissions.ACCESS_EQUAL_VIEW.hasPermission(permissible)) { + return AccessEqualMode.VIEW; + } + if (Permissions.ACCESS_EQUAL_DENY.hasPermission(permissible)) { + return AccessEqualMode.DENY; + } + return config.getAccessEqualMode(); + } + } 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 671924e3..f5d77139 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -64,7 +64,7 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } private @Nullable Accessor getAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { - Version maxSupported = Version.of(1, 21, 10); + Version maxSupported = Version.of(1, 21, 11); Version minSupported = Version.of(1, 21, 1); // Ensure version is in supported range. @@ -84,10 +84,13 @@ public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { } // Paper or a Paper fork, can use Mojang-mapped internals. - if (BukkitVersions.MINECRAFT.lessThanOrEqual(maxSupported) - && BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 9))) { // 1.21.9, 1.21.10 + if (BukkitVersions.MINECRAFT.equals(maxSupported)) { // 1.21.11 return new com.lishid.openinv.internal.common.InternalAccessor(logger, lang); } + if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 21, 10)) + && BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 9))) { // 1.21.9, 1.21.10 + return new com.lishid.openinv.internal.paper1_21_10.InternalAccessor(logger, lang); + } if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 21, 8)) && BukkitVersions.MINECRAFT.greaterThanOrEqual(Version.of(1, 21, 6))) { // 1.21.6, 1.21.7, 1.21.8 return new com.lishid.openinv.internal.paper1_21_8.InternalAccessor(logger, lang); @@ -204,7 +207,10 @@ private String getSpigotReleaseLink() { return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.13"; } if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 21, 9))) { - return "Unsupported; upgrade to 1.21.10: https://github.com/Jikoo/OpenInv/releases"; + return "Unsupported; upgrade to 1.21.10: https://github.com/Jikoo/OpenInv/releases/tag/5.1.15"; + } + if (BukkitVersions.MINECRAFT.lessThanOrEqual(Version.of(1, 21, 10))) { + return "https://github.com/Jikoo/OpenInv/releases/tag/5.1.15"; } return "https://github.com/Jikoo/OpenInv/releases"; diff --git a/resource-pack/openinv-legibility-pack/pack.mcmeta b/resource-pack/openinv-legibility-pack/pack.mcmeta index 17314e78..a8a915fc 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": [69, 0], + "max_format": [75, 0], "pack_format": 64, - "supported_formats": [ 34, 69 ] + "supported_formats": [ 34, 75 ] }, "overlays": { "entries": [ { "min_format": 44, - "max_format": [69, 0], - "formats": [ 44, 69 ], + "max_format": [75, 0], + "formats": [ 44, 75 ], "directory": "openinv_44" }, { diff --git a/settings.gradle.kts b/settings.gradle.kts index e418ca9d..efbf5eb0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,6 +19,7 @@ if (!java.lang.Boolean.getBoolean("jitpack")) { val internals = listOf( "common", + "paper1_21_10", "paper1_21_8", "paper1_21_5", "paper1_21_4",