package com.level314.teleportanchor; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.UUIDUtil; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.resources.Identifier; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.datafix.DataFixTypes; import net.minecraft.world.level.saveddata.SavedData; import net.minecraft.world.level.saveddata.SavedDataType; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class SavedAnchorData extends SavedData { private final Map anchorData; public static final Codec CODEC = /* Codec.unboundedMap( UUIDUtil.CODEC, AnchorRecord.CODEC) .xmap(SavedAnchorData::new, data -> data.anchorData) .fieldOf("anchors") .codec() */ RecordCodecBuilder.create( instance -> instance.group( Codec.unboundedMap( UUIDUtil.CODEC, AnchorRecord.CODEC ).fieldOf("anchors").forGetter(SavedAnchorData::getAnchorData) ).apply(instance, SavedAnchorData::new) ); public static final SavedDataType TYPE = new SavedDataType<>( Identifier.fromNamespaceAndPath(TeleportAnchor.MOD_ID, "teleport_anchor_data"), SavedAnchorData::new, CODEC, DataFixTypes.LEVEL ); public SavedAnchorData() { this.anchorData = new HashMap<>(); } public SavedAnchorData(Map anchorData) { this.anchorData = new HashMap<>(anchorData); } public AnchorRecord getAnchor(UUID uuid) { return anchorData.get(uuid); } public void putAnchor(UUID uuid, AnchorRecord anchorRecord) { if (anchorData.containsKey(uuid)) { return;} anchorData.put(uuid, anchorRecord); setDirty(); } public void addAnchorBoundedPlayerUuid(UUID anchorUuid, UUID playerUuid) { anchorData.get(anchorUuid).boundPlayers().add(playerUuid); } public void removeAnchor(UUID uuid) { anchorData.remove(uuid); } public Map getAnchorData() { return anchorData; } public static SavedAnchorData get(MinecraftServer server) { ServerLevel level = server.getLevel(ServerLevel.OVERWORLD); if (level == null) return new SavedAnchorData(); return level.getDataStorage().computeIfAbsent(TYPE); } }