filename:
neoforge/src/main/java/rearth/oritech/neoforge/OritechModNeoForge.java
branch:
1.21
back to repo
package rearth.oritech.neoforge;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.PrimitiveCodec;
import dev.architectury.fluid.FluidStack;
import net.minecraft.component.ComponentType;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.util.math.BlockPos;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import net.neoforged.neoforge.registries.RegisterEvent;
import rearth.oritech.Oritech;
import rearth.oritech.api.attachment.neoforge.AttachmentApiImpl;
import rearth.oritech.api.energy.EnergyApi;
import rearth.oritech.api.fluid.FluidApi;
import rearth.oritech.api.item.ItemApi;
import rearth.oritech.item.tools.util.ArmorEventHandler;
@Mod(Oritech.MOD_ID)
public final class OritechModNeoForge {
private final NeoforgeEnergyApiImpl energyApiInstance;
private final NeoforgeFluidApiImpl fluidApiInstance;
private final NeoforgeItemApiImpl itemApiInstance;
public OritechModNeoForge(IEventBus eventBus) {
eventBus.register(new EventHandler());
EventHandler.COMPONENT_REGISTRAR.register(eventBus);
AttachmentApiImpl.ATTACHMENT_TYPES.register(eventBus);
fluidApiInstance = new NeoforgeFluidApiImpl();
FluidApi.BLOCK = fluidApiInstance;
FluidApi.ITEM = fluidApiInstance;
itemApiInstance = new NeoforgeItemApiImpl();
ItemApi.BLOCK = itemApiInstance;
energyApiInstance = new NeoforgeEnergyApiImpl();
EnergyApi.BLOCK = energyApiInstance;
EnergyApi.ITEM = energyApiInstance;
Oritech.initialize();
}
// No idea why this needs to be another class, but oh well.
@EventBusSubscriber(modid = Oritech.MOD_ID)
static class CustomEvents {
@SubscribeEvent
public static void onEquipmentChanged(LivingEquipmentChangeEvent event) {
ArmorEventHandler.processEvent(event.getEntity(), event.getSlot(), event.getFrom(), event.getTo());
}
}
class EventHandler {
// see ComponentContent.java for why this is incredibly stupid but required
public static final DeferredRegister.DataComponents COMPONENT_REGISTRAR = DeferredRegister.createDataComponents(RegistryKeys.DATA_COMPONENT_TYPE, Oritech.MOD_ID);
public static final DeferredHolder<ComponentType<?>, ComponentType<Boolean>> IS_AOE_ACTIVE = COMPONENT_REGISTRAR.registerComponentType(
"is_aoe_active",
builder -> builder.codec(PrimitiveCodec.BOOL).packetCodec(PacketCodecs.BOOL)
);
public static final DeferredHolder<ComponentType<?>, ComponentType<BlockPos>> TARGET_POSITION = COMPONENT_REGISTRAR.registerComponentType(
"target_position",
builder -> builder.codec(BlockPos.CODEC).packetCodec(BlockPos.PACKET_CODEC)
);
public static final DeferredHolder<ComponentType<?>, ComponentType<FluidStack>> STORED_FLUID = COMPONENT_REGISTRAR.registerComponentType(
"stored_fluid",
builder -> builder.codec(FluidStack.CODEC).packetCodec(FluidStack.STREAM_CODEC)
);
public static final DeferredHolder<ComponentType<?>, ComponentType<Long>> NEO_ENERGY_COMPONENT = COMPONENT_REGISTRAR.registerComponentType(
"energy",
builder -> builder.codec(Codec.LONG).packetCodec(PacketCodecs.VAR_LONG)
);
@SubscribeEvent
public void registerCapabilities(RegisterCapabilitiesEvent event) {
itemApiInstance.registerEvent(event);
fluidApiInstance.registerEvent(event);
energyApiInstance.registerEvent(event);
}
@SubscribeEvent
public void register(RegisterEvent event) {
var id = event.getRegistryKey().getValue();
if (Oritech.EVENT_MAP.containsKey(id)) {
Oritech.LOGGER.debug(event.getRegistryKey().toString());
Oritech.EVENT_MAP.get(id).forEach(Runnable::run);
}
}
}
}