Split the player file data hook per data handler

Signed-off-by: Irmo van den Berge <irmo.vandenberge@ziggo.nl>
This commit is contained in:
Irmo van den Berge committed 2025-06-23 18:13:42 +02:00
1 parent fdec6d9317
commit eedaea6e0a
3 files changed
+167 -103

No files matched your search

@@ -1,22 +1,14 @@
package com.bergerkiller.bukkit.common.internal.logic;
import java.io.File;
import java.util.logging.Level;
import com.bergerkiller.bukkit.common.internal.CommonBootstrap;
import org.bukkit.World;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import com.bergerkiller.bukkit.common.Logging;
import com.bergerkiller.bukkit.common.component.LibraryComponent;
import com.bergerkiller.bukkit.common.component.LibraryComponentSelector;
import com.bergerkiller.bukkit.common.controller.PlayerDataController;
import com.bergerkiller.bukkit.common.conversion.type.HandleConversion;
import com.bergerkiller.bukkit.common.conversion.type.WrapperConversion;
import com.bergerkiller.bukkit.common.nbt.CommonTagCompound;
import com.bergerkiller.bukkit.common.utils.CommonUtil;
import com.bergerkiller.mountiplex.reflection.ClassHook;
import com.bergerkiller.mountiplex.reflection.util.LazyInitializedObject;
/**
@@ -42,99 +34,4 @@ public abstract class PlayerFileDataHandler implements LazyInitializedObject, Li
CommonTagCompound base_load_offline(String playerName, String playerUUID);
void base_save(HumanEntity human);
}
// hooks WorldNBTStorage
@ClassHook.HookPackage("net.minecraft.server")
@ClassHook.HookLoadVariables("com.bergerkiller.bukkit.common.Common.TEMPLATE_RESOLVER")
protected static class PlayerFileDataHook extends ClassHook<PlayerFileDataHook> implements PlayerFileDataHandler.Hook {
private static final boolean LOAD_RETURNS_OPTIONAL = CommonBootstrap.evaluateMCVersion(">=", "1.20.5");
private static final boolean HAS_OFFLINE_LOAD = CommonBootstrap.evaluateMCVersion(">=", "1.20.5");
public PlayerDataController controller = null;
@HookMethodCondition("version >= 1.20.5")
@HookMethod("public java.util.Optional<net.minecraft.nbt.NBTTagCompound> load(String name, String uuid)")
public java.util.Optional<Object> loadOfflineOpt(String name, String uuid) {
if (this.controller != null) {
CommonTagCompound compound = null;
try {
compound = this.controller.onLoadOffline(name, uuid);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onLoadOffline() on " + this.controller, t);
}
return (compound == null) ? java.util.Optional.empty()
: java.util.Optional.of(compound.getRawHandle());
}
return base.loadOfflineOpt(name, uuid);
}
@HookMethodCondition("version >= 1.20.5")
@HookMethod("public abstract java.util.Optional<net.minecraft.nbt.NBTTagCompound> load(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public java.util.Optional<Object> loadOpt(Object entityHuman) {
if (this.controller != null) {
Player player = CommonUtil.tryCast(WrapperConversion.toEntity(entityHuman), Player.class);
if (player != null) {
CommonTagCompound compound = null;
try {
compound = this.controller.onLoad(player);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onLoad() on " + this.controller, t);
}
return (compound == null) ? java.util.Optional.empty()
: java.util.Optional.of(compound.getRawHandle());
}
}
return base_load_raw(entityHuman);
}
@HookMethodCondition("version < 1.20.5")
@HookMethod("public abstract net.minecraft.nbt.NBTTagCompound load(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public Object load(Object entityHuman) {
return this.loadOpt(entityHuman).orElse(null);
}
@HookMethod("public abstract void save(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public void save(Object entityHuman) {
if (this.controller != null) {
Player player = CommonUtil.tryCast(WrapperConversion.toEntity(entityHuman), Player.class);
if (player != null) {
try {
this.controller.onSave(player);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onSave() on " + this.controller, t);
}
return;
}
}
this.base.save(entityHuman);
}
@Override
public CommonTagCompound base_load(HumanEntity human) {
return base_load_raw(HandleConversion.toEntityHandle(human))
.map(CommonTagCompound::create).orElse(null);
}
@Override
public CommonTagCompound base_load_offline(String playerName, String playerUUID) {
if (HAS_OFFLINE_LOAD) {
return base.loadOfflineOpt(playerName, playerUUID)
.map(CommonTagCompound::create).orElse(null);
} else {
throw new UnsupportedOperationException("Not supported on this version of Minecraft");
}
}
private java.util.Optional<Object> base_load_raw(Object entityHuman) {
if (LOAD_RETURNS_OPTIONAL) {
return base.loadOpt(entityHuman);
} else {
return java.util.Optional.ofNullable(base.load(entityHuman));
}
}
@Override
public void base_save(HumanEntity human) {
base.save(HandleConversion.toEntityHandle(human));
}
}
}
@@ -1,8 +1,12 @@
package com.bergerkiller.bukkit.common.internal.logic;
import java.io.File;
import java.util.logging.Level;
import com.bergerkiller.bukkit.common.Logging;
import com.bergerkiller.bukkit.common.conversion.type.WrapperConversion;
import com.bergerkiller.bukkit.common.nbt.CommonTagCompound;
import com.bergerkiller.mountiplex.reflection.ClassHook;
import org.bukkit.Bukkit;
import org.bukkit.World;
@@ -20,6 +24,8 @@ import com.bergerkiller.mountiplex.reflection.resolver.Resolver;
import com.bergerkiller.mountiplex.reflection.util.FastField;
import com.bergerkiller.mountiplex.reflection.util.FastMethod;
import com.bergerkiller.reflection.org.bukkit.craftbukkit.CBCraftServer;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
/**
* Handler for Minecraft 1.16 and later
@@ -135,6 +141,101 @@ class PlayerFileDataHandler_1_16 extends PlayerFileDataHandler {
return hook;
}
// hooks WorldNBTStorage
@ClassHook.HookPackage("net.minecraft.server")
@ClassHook.HookLoadVariables("com.bergerkiller.bukkit.common.Common.TEMPLATE_RESOLVER")
protected static class PlayerFileDataHook extends ClassHook<PlayerFileDataHook> implements PlayerFileDataHandler.Hook {
private static final boolean LOAD_RETURNS_OPTIONAL = CommonBootstrap.evaluateMCVersion(">=", "1.20.5");
private static final boolean HAS_OFFLINE_LOAD = CommonBootstrap.evaluateMCVersion(">=", "1.20.5");
public PlayerDataController controller = null;
@HookMethodCondition("version >= 1.20.5")
@HookMethod("public java.util.Optional<net.minecraft.nbt.NBTTagCompound> load(String name, String uuid)")
public java.util.Optional<Object> loadOfflineOpt(String name, String uuid) {
if (this.controller != null) {
CommonTagCompound compound = null;
try {
compound = this.controller.onLoadOffline(name, uuid);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onLoadOffline() on " + this.controller, t);
}
return (compound == null) ? java.util.Optional.empty()
: java.util.Optional.of(compound.getRawHandle());
}
return base.loadOfflineOpt(name, uuid);
}
@HookMethodCondition("version >= 1.20.5")
@HookMethod("public abstract java.util.Optional<net.minecraft.nbt.NBTTagCompound> load(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public java.util.Optional<Object> loadOpt(Object entityHuman) {
if (this.controller != null) {
Player player = CommonUtil.tryCast(WrapperConversion.toEntity(entityHuman), Player.class);
if (player != null) {
CommonTagCompound compound = null;
try {
compound = this.controller.onLoad(player);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onLoad() on " + this.controller, t);
}
return (compound == null) ? java.util.Optional.empty()
: java.util.Optional.of(compound.getRawHandle());
}
}
return base_load_raw(entityHuman);
}
@HookMethodCondition("version < 1.20.5")
@HookMethod("public abstract net.minecraft.nbt.NBTTagCompound load(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public Object load(Object entityHuman) {
return this.loadOpt(entityHuman).orElse(null);
}
@HookMethod("public abstract void save(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public void save(Object entityHuman) {
if (this.controller != null) {
Player player = CommonUtil.tryCast(WrapperConversion.toEntity(entityHuman), Player.class);
if (player != null) {
try {
this.controller.onSave(player);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onSave() on " + this.controller, t);
}
return;
}
}
this.base.save(entityHuman);
}
@Override
public CommonTagCompound base_load(HumanEntity human) {
return base_load_raw(HandleConversion.toEntityHandle(human))
.map(CommonTagCompound::create).orElse(null);
}
@Override
public CommonTagCompound base_load_offline(String playerName, String playerUUID) {
if (HAS_OFFLINE_LOAD) {
return base.loadOfflineOpt(playerName, playerUUID)
.map(CommonTagCompound::create).orElse(null);
} else {
throw new UnsupportedOperationException("Not supported on this version of Minecraft");
}
}
private java.util.Optional<Object> base_load_raw(Object entityHuman) {
if (LOAD_RETURNS_OPTIONAL) {
return base.loadOpt(entityHuman);
} else {
return java.util.Optional.ofNullable(base.load(entityHuman));
}
}
@Override
public void base_save(HumanEntity human) {
base.save(HandleConversion.toEntityHandle(human));
}
}
public static enum HookAction {
HOOK, UNHOOK, MOCK, GET
}
@@ -1,8 +1,12 @@
package com.bergerkiller.bukkit.common.internal.logic;
import java.io.File;
import java.util.logging.Level;
import com.bergerkiller.bukkit.common.Logging;
import com.bergerkiller.bukkit.common.conversion.type.WrapperConversion;
import com.bergerkiller.bukkit.common.nbt.CommonTagCompound;
import com.bergerkiller.mountiplex.reflection.ClassHook;
import org.bukkit.Bukkit;
import org.bukkit.World;
@@ -18,6 +22,8 @@ import com.bergerkiller.mountiplex.reflection.declarations.SourceDeclaration;
import com.bergerkiller.mountiplex.reflection.util.FastField;
import com.bergerkiller.mountiplex.reflection.util.FastMethod;
import com.bergerkiller.reflection.org.bukkit.craftbukkit.CBCraftServer;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
/**
* Handler for Minecraft 1.8 to Minecraft 1.15.2
@@ -122,4 +128,64 @@ class PlayerFileDataHandler_1_8_to_1_15_2 extends PlayerFileDataHandler {
public static enum HookAction {
HOOK, UNHOOK, MOCK, GET
}
// hooks WorldNBTStorage
@ClassHook.HookPackage("net.minecraft.server")
@ClassHook.HookLoadVariables("com.bergerkiller.bukkit.common.Common.TEMPLATE_RESOLVER")
protected static class PlayerFileDataHook extends ClassHook<PlayerFileDataHook> implements PlayerFileDataHandler.Hook {
public PlayerDataController controller = null;
@HookMethod("public abstract net.minecraft.nbt.NBTTagCompound load(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public Object load(Object entityHuman) {
if (this.controller != null) {
Player player = CommonUtil.tryCast(WrapperConversion.toEntity(entityHuman), Player.class);
if (player != null) {
CommonTagCompound compound = null;
try {
compound = this.controller.onLoad(player);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onLoad() on " + this.controller, t);
}
return (compound == null) ? null : compound.getRawHandle();
}
}
return base_load_raw(entityHuman).orElse(null);
}
@HookMethod("public abstract void save(net.minecraft.world.entity.player.EntityHuman paramEntityHuman)")
public void save(Object entityHuman) {
if (this.controller != null) {
Player player = CommonUtil.tryCast(WrapperConversion.toEntity(entityHuman), Player.class);
if (player != null) {
try {
this.controller.onSave(player);
} catch (Throwable t) {
Logging.LOGGER.log(Level.SEVERE, "Failed to handle onSave() on " + this.controller, t);
}
return;
}
}
this.base.save(entityHuman);
}
@Override
public CommonTagCompound base_load(HumanEntity human) {
return base_load_raw(HandleConversion.toEntityHandle(human))
.map(CommonTagCompound::create).orElse(null);
}
@Override
public CommonTagCompound base_load_offline(String playerName, String playerUUID) {
throw new UnsupportedOperationException("Not supported on this version of Minecraft");
}
private java.util.Optional<Object> base_load_raw(Object entityHuman) {
return java.util.Optional.ofNullable(base.load(entityHuman));
}
@Override
public void base_save(HumanEntity human) {
base.save(HandleConversion.toEntityHandle(human));
}
}
}