package com.atsuishio.superbwarfare.component; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.item.FiringParameters; import com.atsuishio.superbwarfare.item.common.ammo.box.AmmoBoxInfo; import com.atsuishio.superbwarfare.tools.AmmoType; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.Registries; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import java.util.List; import java.util.function.UnaryOperator; public class ModDataComponents { public static final DeferredRegister> DATA_COMPONENT_TYPES = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, Mod.MODID); public static final DeferredHolder, DataComponentType> FIRING_PARAMETERS = register( "firing_parameters", builder -> builder.persistent(RecordCodecBuilder.create(instance -> instance.group( BlockPos.CODEC.fieldOf("pos").forGetter(FiringParameters.Parameters::pos), Codec.BOOL.fieldOf("is_depressed").forGetter(FiringParameters.Parameters::isDepressed) ).apply(instance, FiringParameters.Parameters::new) )) ); public static final DeferredHolder, DataComponentType> ENERGY = register( "energy", builder -> builder.persistent(Codec.INT) ); public static final DeferredHolder, DataComponentType>>> TRANSCRIPT_SCORE = register( "transcript_score", builder -> builder.persistent(Codec.pair(Codec.INT, Codec.DOUBLE).listOf()) ); public static final DeferredHolder, DataComponentType> AMMO_BOX_INFO = register( "ammo_box_info", builder -> builder.persistent(AmmoBoxInfo.CODEC) ); private static DeferredHolder, DataComponentType> register(String name, UnaryOperator> builderOperator) { return DATA_COMPONENT_TYPES.register(name, () -> builderOperator.apply(DataComponentType.builder()).build()); } public static void register(IEventBus eventBus) { for (var type : AmmoType.values()) { type.dataComponent = register("ammo_" + type.name.toLowerCase(), builder -> builder.persistent(Codec.INT)); } DATA_COMPONENT_TYPES.register(eventBus); } }