From 0e6acdff362bc0f4f097628165ffd6b7360b8216 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 16 Mar 2023 16:30:43 -0400 Subject: [PATCH] Update to 1.19.4 (#130) * Improve data load/save slightly * Fix longstanding issue with opening players in deleted worlds on Paper --- .../openinv/internal/v1_18_R2/OpenPlayer.java | 7 ++-- .../internal/v1_18_R2/PlayerDataManager.java | 28 +++++++++---- .../openinv/internal/v1_19_R2/OpenPlayer.java | 4 +- .../internal/v1_19_R2/PlayerDataManager.java | 31 ++++++++++---- internal/{v1_19_R1 => v1_19_R3}/pom.xml | 8 ++-- .../v1_19_R3}/AnySilentContainer.java | 6 +-- .../internal/v1_19_R3}/OpenPlayer.java | 12 +++--- .../internal/v1_19_R3}/PlayerDataManager.java | 40 ++++++++++++------- .../internal/v1_19_R3}/SpecialEnderChest.java | 8 ++-- .../v1_19_R3}/SpecialPlayerInventory.java | 11 ++--- .../com/lishid/openinv/InternalAccessor.java | 3 +- pom.xml | 4 +- 12 files changed, 100 insertions(+), 62 deletions(-) rename internal/{v1_19_R1 => v1_19_R3}/pom.xml (92%) rename internal/{v1_19_R1/src/main/java/com/lishid/openinv/internal/v1_19_R1 => v1_19_R3/src/main/java/com/lishid/openinv/internal/v1_19_R3}/AnySilentContainer.java (97%) rename internal/{v1_19_R1/src/main/java/com/lishid/openinv/internal/v1_19_R1 => v1_19_R3/src/main/java/com/lishid/openinv/internal/v1_19_R3}/OpenPlayer.java (89%) rename internal/{v1_19_R1/src/main/java/com/lishid/openinv/internal/v1_19_R1 => v1_19_R3/src/main/java/com/lishid/openinv/internal/v1_19_R3}/PlayerDataManager.java (88%) rename internal/{v1_19_R1/src/main/java/com/lishid/openinv/internal/v1_19_R1 => v1_19_R3/src/main/java/com/lishid/openinv/internal/v1_19_R3}/SpecialEnderChest.java (97%) rename internal/{v1_19_R1/src/main/java/com/lishid/openinv/internal/v1_19_R1 => v1_19_R3/src/main/java/com/lishid/openinv/internal/v1_19_R3}/SpecialPlayerInventory.java (98%) diff --git a/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/OpenPlayer.java b/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/OpenPlayer.java index 4fdcfc0..10929eb 100644 --- a/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/OpenPlayer.java +++ b/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/OpenPlayer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2022 lishid. All rights reserved. + * Copyright (C) 2011-2023 lishid. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ public class OpenPlayer extends CraftPlayer { // See CraftPlayer#loadData CompoundTag loaded = this.server.getHandle().playerIo.load(this.getHandle()); if (loaded != null) { - readExtraData(loaded); + getHandle().readAdditionalSaveData(loaded); } } @@ -49,7 +49,6 @@ public class OpenPlayer extends CraftPlayer { PlayerDataStorage worldNBTStorage = player.server.getPlayerList().playerIo; CompoundTag playerData = player.saveWithoutId(new CompoundTag()); - setExtraData(playerData); if (!isOnline()) { // Special case: save old vehicle data @@ -67,7 +66,7 @@ public class OpenPlayer extends CraftPlayer { File file2 = new File(worldNBTStorage.getPlayerDir(), player.getStringUUID() + ".dat_old"); Util.safeReplaceFile(file1, file, file2); } catch (Exception e) { - LogManager.getLogger().warn("Failed to save player data for {}: {}", player.getName().getString(), e.getMessage()); + LogManager.getLogger().warn("Failed to save player data for {}: {}", player.getScoreboardName(), e); } } diff --git a/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/PlayerDataManager.java b/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/PlayerDataManager.java index 127e39c..ae02e79 100644 --- a/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/PlayerDataManager.java +++ b/internal/v1_18_R2/src/main/java/com/lishid/openinv/internal/v1_18_R2/PlayerDataManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2022 lishid. All rights reserved. + * Copyright (C) 2011-2023 lishid. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ import com.lishid.openinv.internal.OpenInventoryView; import com.mojang.authlib.GameProfile; import java.lang.reflect.Field; import java.util.logging.Logger; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import net.minecraft.server.MinecraftServer; @@ -108,14 +109,25 @@ public class PlayerDataManager implements IPlayerDataManager { e.printStackTrace(); } - // Get the bukkit entity - Player target = entity.getBukkitEntity(); - if (target != null) { - // Load data - target.loadData(); + // Load data. This also reads basic data into the player. + // See CraftPlayer#loadData + CompoundTag loadedData = server.getPlayerList().playerIo.load(entity); + + if (loadedData == null) { + // Exceptions with loading are logged by Mojang. + return null; } - // Return the entity - return target; + + // Also read "extra" data. + entity.readAdditionalSaveData(loadedData); + + if (entity.level == null) { + // Paper: Move player to spawn + entity.spawnIn(null); + } + + // Return the Bukkit entity. + return entity.getBukkitEntity(); } void injectPlayer(ServerPlayer player) throws IllegalAccessException { diff --git a/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/OpenPlayer.java b/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/OpenPlayer.java index 4dab334..721c7fc 100644 --- a/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/OpenPlayer.java +++ b/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/OpenPlayer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2022 lishid. All rights reserved. + * Copyright (C) 2011-2023 lishid. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ public class OpenPlayer extends CraftPlayer { // See CraftPlayer#loadData CompoundTag loaded = this.server.getHandle().playerIo.load(this.getHandle()); if (loaded != null) { - readExtraData(loaded); + getHandle().readAdditionalSaveData(loaded); } } diff --git a/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/PlayerDataManager.java b/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/PlayerDataManager.java index 4cc6939..423411a 100644 --- a/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/PlayerDataManager.java +++ b/internal/v1_19_R2/src/main/java/com/lishid/openinv/internal/v1_19_R2/PlayerDataManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2022 lishid. All rights reserved. + * Copyright (C) 2011-2023 lishid. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ import com.lishid.openinv.internal.OpenInventoryView; import com.mojang.authlib.GameProfile; import java.lang.reflect.Field; import java.util.logging.Logger; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; import net.minecraft.server.MinecraftServer; @@ -100,20 +101,34 @@ public class PlayerDataManager implements IPlayerDataManager { ServerPlayer entity = new ServerPlayer(server, worldServer, profile); + // Stop listening for advancement progression - if this is not cleaned up, loading causes a memory leak. + entity.getAdvancements().stopListening(); + try { injectPlayer(entity); } catch (IllegalAccessException e) { e.printStackTrace(); } - // Get the bukkit entity - Player target = entity.getBukkitEntity(); - if (target != null) { - // Load data - target.loadData(); + // Load data. This also reads basic data into the player. + // See CraftPlayer#loadData + CompoundTag loadedData = server.getPlayerList().playerIo.load(entity); + + if (loadedData == null) { + // Exceptions with loading are logged by Mojang. + return null; } - // Return the entity - return target; + + // Also read "extra" data. + entity.readAdditionalSaveData(loadedData); + + if (entity.level == null) { + // Paper: Move player to spawn + entity.spawnIn(null); + } + + // Return the Bukkit entity. + return entity.getBukkitEntity(); } void injectPlayer(ServerPlayer player) throws IllegalAccessException { diff --git a/internal/v1_19_R1/pom.xml b/internal/v1_19_R3/pom.xml similarity index 92% rename from internal/v1_19_R1/pom.xml rename to internal/v1_19_R3/pom.xml index df50f14..66769d9 100644 --- a/internal/v1_19_R1/pom.xml +++ b/internal/v1_19_R3/pom.xml @@ -1,6 +1,6 @@