package io.github.skippyall.minions.minion; import com.mojang.serialization.Codec; import net.minecraft.server.MinecraftServer; import net.minecraft.world.PersistentState; import net.minecraft.world.PersistentStateType; import net.minecraft.world.World; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; public class MinionPersistentState extends PersistentState { public static final Codec CODEC = MinionData.CODEC.listOf().xmap(MinionPersistentState::new, MinionPersistentState::getMinionDataList); public static PersistentStateType TYPE = new PersistentStateType<>("minion", MinionPersistentState::new, MinionPersistentState.CODEC, null); private final Map minionData = new HashMap<>(); public MinionPersistentState() { } public MinionPersistentState(List dataList) { for (MinionData data : dataList) { minionData.put(data.uuid(), data); } } public MinionData getMinionData(UUID uuid) { return minionData.get(uuid); } public Map getMinionData() { return minionData; } public List getMinionDataList() { return List.copyOf(minionData.values()); } public void updateMinionData(MinionData data) { minionData.put(data.uuid(), data); markDirty(); } public boolean isMinion(UUID uuid) { return minionData.containsKey(uuid); } public boolean isMinionNameTaken(String name) { return getMinionWithName(name).isPresent(); } public Optional getMinionWithName(String name) { return minionData.values().stream() .filter(data -> data.name().equals(name)) .findFirst(); } public static MinionPersistentState get(MinecraftServer server) { return server.getWorld(World.OVERWORLD).getPersistentStateManager().getOrCreate(TYPE); } }