Files
thaumicenergistics-neo/src/main/java/thaumicenergistics/ThaumicEnergistics.java
T
2026-08-28 00:41:54 +08:00

225 lines
12 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package thaumicenergistics;
//
//AlkSur
import appeng.api.features.GridLinkables;
import appeng.api.features.P2PTunnelAttunement;
import appeng.api.parts.PartModels;
import appeng.api.stacks.AEKeyType;
import appeng.api.stacks.AEKeyTypesInternal;
import appeng.api.upgrades.Upgrades;
import appeng.client.gui.style.StyleManager;
import appeng.core.definitions.AEItems;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
import appeng.api.AECapabilities;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import thaumicenergistics.common.container.*;
import thaumicenergistics.common.features.RecipeRegistration;
import thaumicenergistics.common.integration.appeng.AEssentiaKeyType;
import thaumicenergistics.common.integration.appeng.ThEAppliedEnergistics;
import thaumicenergistics.common.integration.tc.ThEThaumcraft;
import thaumicenergistics.common.items.ItemGolemWirelessBackpack;
import thaumicenergistics.common.parts.ArcaneCraftingTerminalPart;
import thaumicenergistics.common.parts.EssentiaExportBusPart;
import thaumicenergistics.common.parts.EssentiaImportBusPart;
import thaumicenergistics.common.parts.EssentiaLevelEmitterPart;
import thaumicenergistics.common.parts.EssentiaStorageBusPart;
import thaumicenergistics.common.parts.EssentiaTerminalPart;
import thaumicenergistics.common.parts.VisInterfacePart;
import thaumicenergistics.init.*;
@Mod(ThaumicEnergistics.MODID)
public final class ThaumicEnergistics {
public static final String MODID = "thaumicenergistics";
public static final Logger LOG = LoggerFactory.getLogger("ThaumicEnergistics");
public ThaumicEnergistics(IEventBus modBus) {
LOG.info("ThaumicEnergistics loading...");
ModBlocks.REGISTRY.register(modBus);
ModItems.REGISTRY.register(modBus);
ModBlockEntities.REGISTRY.register(modBus);
ModMenuTypes.REGISTRY.register(modBus);
ModCreativeTab.REGISTRY.register(modBus);
modBus.addListener(this::registerScreens);
modBus.addListener(this::commonSetup);
modBus.addListener(this::registerKeyTypes);
modBus.addListener(this::registerUpgrades);
if (net.neoforged.fml.loading.FMLLoader.getDist().isClient()) {
modBus.addListener(thaumicenergistics.client.ClientInit::onClientSetup);
}
ThEAppliedEnergistics.init();
appeng.api.networking.GridServices.register(
thaumicenergistics.api.grid.IEssentiaGrid.class,
thaumicenergistics.common.grid.EssentiaGridService.class
);
thaumicenergistics.common.network.ThENetworking.init(modBus);
thaumicenergistics.common.blocks.ThEWrenchHandler.register();
modBus.addListener(this::registerCapabilities);
PartModels.registerModels(
EssentiaImportBusPart.RL_BASE, EssentiaImportBusPart.RL_OFF,
EssentiaImportBusPart.RL_HAS_CHANNEL, EssentiaImportBusPart.RL_ON
);
PartModels.registerModels(
EssentiaExportBusPart.RL_BASE, EssentiaExportBusPart.RL_OFF,
EssentiaExportBusPart.RL_HAS_CHANNEL, EssentiaExportBusPart.RL_ON
);
PartModels.registerModels(
EssentiaStorageBusPart.RL_BASE, EssentiaStorageBusPart.RL_OFF,
EssentiaStorageBusPart.RL_HAS_CHANNEL, EssentiaStorageBusPart.RL_ON
);
PartModels.registerModels(
EssentiaTerminalPart.RL_BASE, EssentiaTerminalPart.RL_OFF, EssentiaTerminalPart.RL_ON
);
PartModels.registerModels(
ArcaneCraftingTerminalPart.RL_BASE, ArcaneCraftingTerminalPart.RL_OFF,
ArcaneCraftingTerminalPart.RL_HAS_CHANNEL, ArcaneCraftingTerminalPart.RL_ON
);
PartModels.registerModels(
EssentiaLevelEmitterPart.RL_BASE_OFF, EssentiaLevelEmitterPart.RL_BASE_ON,
EssentiaLevelEmitterPart.RL_STATUS_HAS_CHANNEL, EssentiaLevelEmitterPart.RL_STATUS_ON,
EssentiaLevelEmitterPart.RL_STATUS_OFF
);
PartModels.registerModels(VisInterfacePart.MODEL_VIS_INTERFACE);
LOG.info("ThaumicEnergistics setup complete");
}
public static ResourceLocation id(String path) {
return ResourceLocation.fromNamespaceAndPath(MODID, path);
}
private void commonSetup(FMLCommonSetupEvent event) {
appeng.blockentity.AEBaseBlockEntity.registerBlockEntityItem(
ModBlockEntities.ESSENTIA_PROVIDER.get(), ModItems.ESSENTIA_PROVIDER_ITEM.get());
appeng.blockentity.AEBaseBlockEntity.registerBlockEntityItem(
ModBlockEntities.INFUSION_PROVIDER.get(), ModItems.INFUSION_PROVIDER_ITEM.get());
event.enqueueWork(() -> {
RecipeRegistration.registerAll();
ThEThaumcraft.init();
P2PTunnelAttunement.registerAttunementTag(ModItems.VIS_INTERFACE.get());
GridLinkables.register(ModItems.GOLEM_WIFI_BACKPACK.get(), ItemGolemWirelessBackpack.LINKABLE_HANDLER);
GridLinkables.register(ModItems.WIRELESS_ESSENTIA_TERMINAL.get(),
appeng.items.tools.powered.WirelessTerminalItem.LINKABLE_HANDLER);
});
}
private void registerUpgrades(FMLCommonSetupEvent event) {
event.enqueueWork(() -> {
// 注:不传 group——带 group 会在卡 tooltip 中与 AE2 原版 IO 总线合并显示为
// "ME Import/Export Bus"(同 group 跳过),ThE 设备名不显示。与存储总线一致,各自显示设备名。
var importBusItem = ModItems.ESSENTIA_IMPORT_BUS.get();
Upgrades.add(AEItems.FUZZY_CARD, importBusItem, 1);
Upgrades.add(AEItems.REDSTONE_CARD, importBusItem, 1);
Upgrades.add(AEItems.CAPACITY_CARD, importBusItem, 5);
Upgrades.add(AEItems.SPEED_CARD, importBusItem, 4);
Upgrades.add(AEItems.INVERTER_CARD, importBusItem, 1);
var exportBusItem = ModItems.ESSENTIA_EXPORT_BUS.get();
Upgrades.add(AEItems.FUZZY_CARD, exportBusItem, 1);
Upgrades.add(AEItems.REDSTONE_CARD, exportBusItem, 1);
Upgrades.add(AEItems.CAPACITY_CARD, exportBusItem, 5);
Upgrades.add(AEItems.SPEED_CARD, exportBusItem, 4);
Upgrades.add(AEItems.CRAFTING_CARD, exportBusItem, 1);
var storageBusItem = ModItems.ESSENTIA_STORAGE_BUS.get();
Upgrades.add(AEItems.FUZZY_CARD, storageBusItem, 1);
Upgrades.add(AEItems.INVERTER_CARD, storageBusItem, 1);
Upgrades.add(AEItems.CAPACITY_CARD, storageBusItem, 5);
Upgrades.add(AEItems.VOID_CARD, storageBusItem, 1);
// 神秘装配台:加速卡(AEItems.SPEED_CARD = Acceleration Card,tooltip 名单 + 装配台升级槽可装——加快合成)
Upgrades.add(AEItems.SPEED_CARD, ModItems.ARCANE_ASSEMBLER_ITEM.get(), 4);
});
}
private void registerScreens(RegisterMenuScreensEvent event) {
event.register(ModMenuTypes.ESSENTIA_CELL_WORKBENCH.get(), GuiEssentiaCellWorkbench::new);
event.register(ModMenuTypes.EVC.get(), GuiEssentiaVibrationChamber::new);
event.register(ModMenuTypes.ARCANE_ASSEMBLER.get(), GuiArcaneAssembler::new);
event.register(ModMenuTypes.ESSENTIA_TERMINAL.get(),
(EssentiaTerminalMenu menu, Inventory inv, Component title)
-> new GuiEssentiaTerminal(menu, inv, title,
StyleManager.loadStyleDoc("/screens/terminals/terminal.json")));
event.register(ModMenuTypes.WIRELESS_ESSENTIA_TERMINAL.get(),
(EssentiaTerminalMenu menu, Inventory inv, Component title)
-> new GuiEssentiaTerminal(menu, inv, title,
StyleManager.loadStyleDoc("/screens/terminals/wireless_terminal.json")));
event.register(ModMenuTypes.KNOWLEDGE_INSCRIBER.get(), GuiKnowledgeInscriber::new);
event.register(ModMenuTypes.DISTILLATION_ENCODER.get(), GuiDistillationPatternEncoder::new);
event.register(ModMenuTypes.ESSENTIA_IMPORT_BUS.get(),
(ContainerEssentiaImportBus menu, Inventory inv, Component title)
-> new GuiEssentiaImportBus(menu, inv, title,
StyleManager.loadStyleDoc("/screens/import_bus.json")));
event.register(ModMenuTypes.ESSENTIA_EXPORT_BUS.get(),
(ContainerEssentiaExportBus menu, Inventory inv, Component title)
-> new GuiEssentiaExportBus(menu, inv, title,
StyleManager.loadStyleDoc("/screens/export_bus.json")));
event.register(ModMenuTypes.ESSENTIA_STORAGE_BUS.get(),
(ContainerEssentiaStorageBus menu, Inventory inv, Component title)
-> new GuiEssentiaStorageBus(menu, inv, title,
StyleManager.loadStyleDoc("/screens/storage_bus.json")));
event.register(ModMenuTypes.ARCANE_CRAFTING_TERMINAL.get(),
(ContainerArcaneCraftingTerminal menu, Inventory inv, Component title)
-> new GuiArcaneCraftingTerminal(menu, inv, title,
StyleManager.loadStyleDoc("/screens/arcane_crafting_terminal.json")));
event.register(ModMenuTypes.ESSENTIA_LEVEL_EMITTER.get(),
(ContainerEssentiaLevelEmitter menu, Inventory inv, Component title)
-> new GuiEssentiaLevelEmitter(menu, inv, title,
StyleManager.loadStyleDoc("/screens/essentia_level_emitter.json")));
}
private void registerKeyTypes(net.neoforged.neoforge.registries.RegisterEvent event) {
LOG.info("registerKeyTypes fired, registryKey={}", event.getRegistryKey());
if (event.getRegistryKey() == AEKeyType.REGISTRY_KEY) {
AEKeyTypesInternal.register(AEssentiaKeyType.INSTANCE);
LOG.info("AEssentiaKeyType registered successfully!");
}
}
private void registerCapabilities(RegisterCapabilitiesEvent event) {
LOG.info("Registering AE2 grid node capabilities...");
event.registerBlockEntity(
AECapabilities.IN_WORLD_GRID_NODE_HOST,
ModBlockEntities.ESSENTIA_PROVIDER.get(),
(be, context) -> (appeng.api.networking.IInWorldGridNodeHost) be);
event.registerBlockEntity(
AECapabilities.IN_WORLD_GRID_NODE_HOST,
ModBlockEntities.INFUSION_PROVIDER.get(),
(be, context) -> (appeng.api.networking.IInWorldGridNodeHost) be);
event.registerBlockEntity(
AECapabilities.IN_WORLD_GRID_NODE_HOST,
ModBlockEntities.ESSENTIA_VIBRATION_CHAMBER.get(),
(be, context) -> (appeng.api.networking.IInWorldGridNodeHost) be);
// 装配器也实现 IInWorldGridNodeHost,必须注册 capability,否则 AE2 线缆连不上 →
// 装配器孤立成自己的网格,ME 终端看不到它提供的可合成配方。
event.registerBlockEntity(
AECapabilities.IN_WORLD_GRID_NODE_HOST,
ModBlockEntities.ARCANE_ASSEMBLER.get(),
(be, context) -> (appeng.api.networking.IInWorldGridNodeHost) be);
// 注魔监视器:连接 AE 网络(network 状态)需要网格节点 capability
event.registerBlockEntity(
AECapabilities.IN_WORLD_GRID_NODE_HOST,
ModBlockEntities.INFUSION_MONITOR.get(),
(be, context) -> (appeng.api.networking.IInWorldGridNodeHost) be);
}
}