diff options
Diffstat (limited to 'src')
3 files changed, 78 insertions, 2 deletions
diff --git a/src/main/java/world/anhgelus/lifesteal/LifeSteal.java b/src/main/java/world/anhgelus/lifesteal/LifeSteal.java index d899f43..dfbc9d6 100644 --- a/src/main/java/world/anhgelus/lifesteal/LifeSteal.java +++ b/src/main/java/world/anhgelus/lifesteal/LifeSteal.java @@ -1,6 +1,7 @@ package world.anhgelus.lifesteal; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,5 +12,15 @@ public class LifeSteal implements ModInitializer { @Override public void onInitialize() { LOGGER.info("Initializing LifeSteal"); + + ServerLifecycleEvents.SERVER_STARTED.register(server -> { + final var state = StateSaver.getServerState(server); + LifeStealer.Manager.loadPlayers(state); + }); + + ServerLifecycleEvents.SERVER_STOPPING.register(server -> { + final var state = StateSaver.getServerState(server); + LifeStealer.Manager.savePlayers(state); + }); } } diff --git a/src/main/java/world/anhgelus/lifesteal/LifeStealer.java b/src/main/java/world/anhgelus/lifesteal/LifeStealer.java index 86410de..9282ea8 100644 --- a/src/main/java/world/anhgelus/lifesteal/LifeStealer.java +++ b/src/main/java/world/anhgelus/lifesteal/LifeStealer.java @@ -21,9 +21,8 @@ import java.util.UUID; public class LifeStealer { public static final Identifier HEALTH_MODIFIER = Identifier.of(LifeSteal.MOD_ID, "health_modifier"); public static final String PLAYER_KEY = "player"; - - private ServerPlayerEntity player; private final UUID uuid; + private ServerPlayerEntity player; private float healthModifier; public LifeStealer(ServerPlayerEntity player, Data data) { @@ -32,6 +31,11 @@ public class LifeStealer { this.healthModifier = data.healthModifier(); } + public LifeStealer(UUID uuid, Data data) { + this.uuid = uuid; + this.healthModifier = data.healthModifier(); + } + private void updateHealth() { healthModifier = MathHelper.clamp(healthModifier, -20, 20); final var attr = player.getAttributeInstance(EntityAttributes.MAX_HEALTH); @@ -81,6 +85,10 @@ public class LifeStealer { ).apply(i, Data::new)); public static Data DEFAULT = new Data(0.0F); + + public static Data from(LifeStealer player) { + return new Data(player.healthModifier); + } } public static class Manager { @@ -94,5 +102,13 @@ public class LifeStealer { public static LifeStealer getLifeStealer(UUID uuid) { return players.get(uuid); } + + public static void loadPlayers(StateSaver state) { + state.players.forEach((uuid, data) -> players.put(uuid, new LifeStealer(uuid, data))); + } + + public static void savePlayers(StateSaver state) { + players.forEach((u, player) -> state.players.put(u, LifeStealer.Data.from(player))); + } } } diff --git a/src/main/java/world/anhgelus/lifesteal/StateSaver.java b/src/main/java/world/anhgelus/lifesteal/StateSaver.java new file mode 100644 index 0000000..891d00a --- /dev/null +++ b/src/main/java/world/anhgelus/lifesteal/StateSaver.java @@ -0,0 +1,49 @@ +package world.anhgelus.lifesteal; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.PersistentState; +import net.minecraft.world.PersistentStateType; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class StateSaver extends PersistentState { + public static final String PLAYERS_KEY = "players"; + public static final Codec<StateSaver> CODEC = RecordCodecBuilder.create(i -> i.group( + Codec.unboundedMap(Codec.STRING, LifeStealer.Data.CODEC).fieldOf(PLAYERS_KEY).forGetter(StateSaver::getPlayers) + ).apply(i, StateSaver::new)); + private static final PersistentStateType<StateSaver> type = new PersistentStateType<>( + LifeSteal.MOD_ID, StateSaver::new, CODEC, null + ); + + public Map<UUID, LifeStealer.Data> players = new HashMap<>(); + + public StateSaver(Map<String, LifeStealer.Data> players) { + players.forEach((s, playerData) -> this.players.put(UUID.fromString(s), playerData)); + } + + public StateSaver() { + } + + public static StateSaver getServerState(MinecraftServer server) { + final var world = server.getOverworld(); + final var persistentStateManager = world.getPersistentStateManager(); + + final var state = persistentStateManager.getOrCreate(type); + + state.markDirty(); + + return state; + } + + public Map<String, LifeStealer.Data> getPlayers() { + final var np = new HashMap<String, LifeStealer.Data>(); + players.forEach((uuid, d) -> { + np.put(uuid.toString(), d); + }); + return np; + } +} |
