aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/world/anhgelus/lifesteal/LifeSteal.java11
-rw-r--r--src/main/java/world/anhgelus/lifesteal/LifeStealer.java20
-rw-r--r--src/main/java/world/anhgelus/lifesteal/StateSaver.java49
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;
+ }
+}