package eu.comosus.ananas.onetridentthrowonly.component; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; import net.minecraft.core.UUIDUtil; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ExtraCodecs; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.CustomData; import java.util.Optional; import java.util.UUID; public record OriginalTridentOwner(String name, UUID playerUUID) { public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( ExtraCodecs.PLAYER_NAME.fieldOf("name").forGetter(OriginalTridentOwner::name), UUIDUtil.CODEC.fieldOf("id").forGetter(OriginalTridentOwner::playerUUID) ) .apply(instance, OriginalTridentOwner::new) ); private static final MapCodec INNER_OBJECT_CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( ExtraCodecs.PLAYER_NAME.fieldOf("name").forGetter(OriginalTridentOwner::name), UUIDUtil.CODEC.fieldOf("id").forGetter(OriginalTridentOwner::playerUUID) ) .apply(instance, OriginalTridentOwner::new) ); public static final MapCodec OBJECT_CODEC = INNER_OBJECT_CODEC.fieldOf("original_trident_owner"); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, OriginalTridentOwner::name, UUIDUtil.STREAM_CODEC, OriginalTridentOwner::playerUUID, OriginalTridentOwner::new ); public OriginalTridentOwner(CompoundTag compoundTag) { this(compoundTag.getString("name").orElseThrow(), compoundTag.read("id", UUIDUtil.CODEC).orElseThrow()); } public OriginalTridentOwner getOriginalOwner(ItemStack stack) { DataComponentMap itemComponents = stack.getComponents(); CustomData customData = itemComponents.get(DataComponents.CUSTOM_DATA); if (customData == null || customData.isEmpty()) { return null; } Optional name = customData.copyTag().read(OBJECT_CODEC); return name.orElse(null); } public DataComponentMap getComponentMap() { CompoundTag compoundTag = new CompoundTag(); compoundTag.putString("name", this.name); compoundTag.store("id", UUIDUtil.CODEC, this.playerUUID); return DataComponentMap.builder() .set(DataComponents.CUSTOM_DATA, CustomData.of(compoundTag)) .build(); } public CompoundTag getCompoundTag() { CompoundTag compoundTag = new CompoundTag(); compoundTag.putString("name", this.name); compoundTag.store("id", UUIDUtil.CODEC, this.playerUUID); return compoundTag; } }