Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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<ShadowJar>("spigotRelocations") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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 {
Expand All @@ -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)
Expand All @@ -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",
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down Expand Up @@ -154,12 +197,14 @@ private <T extends Tag> 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();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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);
}

}
26 changes: 26 additions & 0 deletions internal/paper1_21_10/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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")
}
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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));
}

}
Loading