PrettyPipes/src/main/java/de/ellpeck/prettypipes/Registry.java

260 lines
17 KiB
Java
Raw Normal View History

2020-04-13 21:48:35 +02:00
package de.ellpeck.prettypipes;
2020-04-20 03:37:23 +02:00
import de.ellpeck.prettypipes.entities.PipeFrameEntity;
import de.ellpeck.prettypipes.entities.PipeFrameRenderer;
import de.ellpeck.prettypipes.items.*;
2021-03-03 01:56:19 +01:00
import de.ellpeck.prettypipes.misc.ItemEquality;
import de.ellpeck.prettypipes.misc.ModuleClearingRecipe;
2024-03-07 17:45:35 +01:00
import de.ellpeck.prettypipes.packets.*;
2020-10-27 15:36:52 +01:00
import de.ellpeck.prettypipes.pipe.IPipeConnectable;
import de.ellpeck.prettypipes.pipe.PipeBlock;
2021-12-02 14:44:26 +01:00
import de.ellpeck.prettypipes.pipe.PipeBlockEntity;
2021-12-02 16:55:04 +01:00
import de.ellpeck.prettypipes.pipe.PipeRenderer;
2020-10-27 15:36:52 +01:00
import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer;
import de.ellpeck.prettypipes.pipe.containers.MainPipeContainer;
import de.ellpeck.prettypipes.pipe.containers.MainPipeGui;
import de.ellpeck.prettypipes.pipe.modules.*;
2020-10-14 22:04:52 +02:00
import de.ellpeck.prettypipes.pipe.modules.craft.CraftingModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.craft.CraftingModuleGui;
import de.ellpeck.prettypipes.pipe.modules.craft.CraftingModuleItem;
2020-04-16 23:40:35 +02:00
import de.ellpeck.prettypipes.pipe.modules.extraction.ExtractionModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.extraction.ExtractionModuleGui;
import de.ellpeck.prettypipes.pipe.modules.extraction.ExtractionModuleItem;
2020-10-14 04:28:58 +02:00
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleGui;
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleItem;
2020-04-16 23:40:35 +02:00
import de.ellpeck.prettypipes.pipe.modules.insertion.FilterModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.insertion.FilterModuleGui;
import de.ellpeck.prettypipes.pipe.modules.insertion.FilterModuleItem;
2021-03-03 01:56:19 +01:00
import de.ellpeck.prettypipes.pipe.modules.modifier.FilterModifierModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.modifier.FilterModifierModuleGui;
import de.ellpeck.prettypipes.pipe.modules.modifier.FilterModifierModuleItem;
2020-04-17 20:03:54 +02:00
import de.ellpeck.prettypipes.pipe.modules.retrieval.RetrievalModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.retrieval.RetrievalModuleGui;
import de.ellpeck.prettypipes.pipe.modules.retrieval.RetrievalModuleItem;
2020-04-18 22:30:14 +02:00
import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleGui;
import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleItem;
2020-10-13 18:11:40 +02:00
import de.ellpeck.prettypipes.pressurizer.PressurizerBlock;
2021-12-02 16:55:04 +01:00
import de.ellpeck.prettypipes.pressurizer.PressurizerBlockEntity;
2020-10-13 18:11:40 +02:00
import de.ellpeck.prettypipes.pressurizer.PressurizerContainer;
import de.ellpeck.prettypipes.pressurizer.PressurizerGui;
2020-05-08 22:58:16 +02:00
import de.ellpeck.prettypipes.terminal.CraftingTerminalBlock;
2021-12-02 14:44:26 +01:00
import de.ellpeck.prettypipes.terminal.CraftingTerminalBlockEntity;
2020-05-07 18:30:40 +02:00
import de.ellpeck.prettypipes.terminal.ItemTerminalBlock;
2021-12-02 14:44:26 +01:00
import de.ellpeck.prettypipes.terminal.ItemTerminalBlockEntity;
2020-05-08 22:58:16 +02:00
import de.ellpeck.prettypipes.terminal.containers.CraftingTerminalContainer;
import de.ellpeck.prettypipes.terminal.containers.CraftingTerminalGui;
2020-05-07 18:30:40 +02:00
import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer;
import de.ellpeck.prettypipes.terminal.containers.ItemTerminalGui;
2021-12-02 14:44:26 +01:00
import net.minecraft.client.gui.screens.MenuScreens;
2021-12-02 16:55:04 +01:00
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.client.renderer.entity.EntityRenderers;
2024-02-03 22:01:43 +01:00
import net.minecraft.core.Direction;
2023-07-07 20:34:30 +02:00
import net.minecraft.core.registries.BuiltInRegistries;
2024-02-03 22:01:43 +01:00
import net.minecraft.core.registries.Registries;
2023-07-07 20:34:30 +02:00
import net.minecraft.network.chat.Component;
2022-06-27 13:57:06 +02:00
import net.minecraft.resources.ResourceLocation;
2021-12-02 14:44:26 +01:00
import net.minecraft.world.entity.EntityType;
2021-12-02 16:55:04 +01:00
import net.minecraft.world.entity.MobCategory;
2021-12-02 14:44:26 +01:00
import net.minecraft.world.inventory.MenuType;
2021-12-02 16:55:04 +01:00
import net.minecraft.world.item.BlockItem;
2023-07-07 20:34:30 +02:00
import net.minecraft.world.item.CreativeModeTab;
2021-12-02 14:44:26 +01:00
import net.minecraft.world.item.Item;
2023-07-07 20:34:30 +02:00
import net.minecraft.world.item.ItemStack;
2021-12-02 14:44:26 +01:00
import net.minecraft.world.level.block.Block;
2024-03-07 16:06:46 +01:00
import net.minecraft.world.level.block.SoundType;
2021-12-02 14:44:26 +01:00
import net.minecraft.world.level.block.entity.BlockEntityType;
2024-03-07 16:06:46 +01:00
import net.minecraft.world.level.block.state.BlockBehaviour.Properties;
2024-03-07 17:45:35 +01:00
import net.neoforged.api.distmarker.Dist;
2024-02-03 15:17:58 +01:00
import net.neoforged.bus.api.SubscribeEvent;
2024-03-07 17:45:35 +01:00
import net.neoforged.fml.common.Mod.EventBusSubscriber;
import net.neoforged.fml.common.Mod.EventBusSubscriber.Bus;
2024-02-03 15:17:58 +01:00
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
2024-03-07 16:00:49 +01:00
import net.neoforged.neoforge.capabilities.BlockCapability;
2024-03-07 17:45:35 +01:00
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
2024-03-07 16:00:49 +01:00
import net.neoforged.neoforge.common.extensions.IMenuTypeExtension;
2024-03-07 17:45:35 +01:00
import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent;
2024-02-03 15:17:58 +01:00
import net.neoforged.neoforge.registries.RegisterEvent;
2020-04-13 21:48:35 +02:00
2023-07-07 20:34:30 +02:00
import java.util.Comparator;
2020-04-16 00:39:53 +02:00
import java.util.Locale;
2020-04-16 15:45:11 +02:00
import java.util.function.BiFunction;
2020-04-14 04:21:28 +02:00
2024-03-07 17:45:35 +01:00
@EventBusSubscriber(bus = Bus.MOD)
2020-04-13 21:48:35 +02:00
public final class Registry {
2024-02-03 22:01:43 +01:00
public static BlockCapability<IPipeConnectable, Direction> pipeConnectableCapability = BlockCapability.createSided(new ResourceLocation(PrettyPipes.ID, "pipe_connectable"), IPipeConnectable.class);
2020-04-14 04:21:28 +02:00
2020-04-14 01:38:48 +02:00
public static Item wrenchItem;
2020-04-20 13:12:26 +02:00
public static Item pipeFrameItem;
2020-04-14 01:38:48 +02:00
public static Block pipeBlock;
2021-12-02 16:55:04 +01:00
public static BlockEntityType<PipeBlockEntity> pipeBlockEntity;
2021-12-02 14:44:26 +01:00
public static MenuType<MainPipeContainer> pipeContainer;
2020-05-07 18:30:40 +02:00
public static Block itemTerminalBlock;
2021-12-02 16:55:04 +01:00
public static BlockEntityType<ItemTerminalBlockEntity> itemTerminalBlockEntity;
2021-12-02 14:44:26 +01:00
public static MenuType<ItemTerminalContainer> itemTerminalContainer;
2020-04-16 04:42:42 +02:00
2020-05-08 22:58:16 +02:00
public static Block craftingTerminalBlock;
2021-12-02 16:55:04 +01:00
public static BlockEntityType<CraftingTerminalBlockEntity> craftingTerminalBlockEntity;
2021-12-02 14:44:26 +01:00
public static MenuType<CraftingTerminalContainer> craftingTerminalContainer;
2020-05-08 22:58:16 +02:00
2020-04-20 03:37:23 +02:00
public static EntityType<PipeFrameEntity> pipeFrameEntity;
2020-10-13 18:11:40 +02:00
public static Block pressurizerBlock;
2021-12-02 16:55:04 +01:00
public static BlockEntityType<PressurizerBlockEntity> pressurizerBlockEntity;
2021-12-02 14:44:26 +01:00
public static MenuType<PressurizerContainer> pressurizerContainer;
2020-10-13 18:11:40 +02:00
2021-12-02 14:44:26 +01:00
public static MenuType<ExtractionModuleContainer> extractionModuleContainer;
public static MenuType<FilterModuleContainer> filterModuleContainer;
public static MenuType<RetrievalModuleContainer> retrievalModuleContainer;
public static MenuType<StackSizeModuleContainer> stackSizeModuleContainer;
public static MenuType<FilterIncreaseModuleContainer> filterIncreaseModuleContainer;
public static MenuType<CraftingModuleContainer> craftingModuleContainer;
public static MenuType<FilterModifierModuleContainer> filterModifierModuleContainer;
2020-04-13 21:48:35 +02:00
@SubscribeEvent
2022-06-27 13:57:06 +02:00
public static void register(RegisterEvent event) {
2024-02-03 22:01:43 +01:00
event.register(Registries.BLOCK, h -> {
2024-03-07 16:06:46 +01:00
h.register(new ResourceLocation(PrettyPipes.ID, "pipe"), Registry.pipeBlock = new PipeBlock(Properties.of().strength(2).sound(SoundType.STONE).noOcclusion()));
h.register(new ResourceLocation(PrettyPipes.ID, "item_terminal"), Registry.itemTerminalBlock = new ItemTerminalBlock(Properties.of().strength(3).sound(SoundType.STONE)));
h.register(new ResourceLocation(PrettyPipes.ID, "crafting_terminal"), Registry.craftingTerminalBlock = new CraftingTerminalBlock(Properties.of().strength(3).sound(SoundType.STONE)));
h.register(new ResourceLocation(PrettyPipes.ID, "pressurizer"), Registry.pressurizerBlock = new PressurizerBlock(Properties.of().strength(3).sound(SoundType.STONE)));
2022-06-27 13:57:06 +02:00
});
2024-02-03 22:01:43 +01:00
event.register(Registries.ITEM, h -> {
2022-06-27 13:57:06 +02:00
h.register(new ResourceLocation(PrettyPipes.ID, "wrench"), Registry.wrenchItem = new WrenchItem());
2023-07-07 19:54:52 +02:00
h.register(new ResourceLocation(PrettyPipes.ID, "blank_module"), new Item(new Item.Properties()));
2022-06-27 13:57:06 +02:00
h.register(new ResourceLocation(PrettyPipes.ID, "pipe_frame"), Registry.pipeFrameItem = new PipeFrameItem());
h.register(new ResourceLocation(PrettyPipes.ID, "stack_size_module"), new StackSizeModuleItem());
h.register(new ResourceLocation(PrettyPipes.ID, "redstone_module"), new RedstoneModuleItem());
h.register(new ResourceLocation(PrettyPipes.ID, "filter_increase_modifier"), new FilterIncreaseModuleItem());
Registry.registerTieredModule(h, "extraction_module", ExtractionModuleItem::new);
Registry.registerTieredModule(h, "filter_module", FilterModuleItem::new);
Registry.registerTieredModule(h, "speed_module", SpeedModuleItem::new);
Registry.registerTieredModule(h, "low_priority_module", LowPriorityModuleItem::new);
Registry.registerTieredModule(h, "high_priority_module", HighPriorityModuleItem::new);
Registry.registerTieredModule(h, "retrieval_module", RetrievalModuleItem::new);
Registry.registerTieredModule(h, "crafting_module", CraftingModuleItem::new);
for (var type : ItemEquality.Type.values()) {
var name = type.name().toLowerCase(Locale.ROOT) + "_filter_modifier";
h.register(new ResourceLocation(PrettyPipes.ID, name), new FilterModifierModuleItem(name, type));
}
for (var type : SortingModuleItem.Type.values()) {
var name = type.name().toLowerCase(Locale.ROOT) + "_sorting_modifier";
h.register(new ResourceLocation(PrettyPipes.ID, name), new SortingModuleItem(name, type));
}
2024-02-03 22:01:43 +01:00
BuiltInRegistries.BLOCK.entrySet().stream()
2022-06-27 13:57:06 +02:00
.filter(b -> b.getKey().location().getNamespace().equals(PrettyPipes.ID))
2023-07-07 19:54:52 +02:00
.forEach(b -> h.register(b.getKey().location(), new BlockItem(b.getValue(), new Item.Properties())));
2022-06-27 13:57:06 +02:00
});
2024-02-03 22:01:43 +01:00
event.register(Registries.BLOCK_ENTITY_TYPE, h -> {
2022-06-27 13:57:06 +02:00
h.register(new ResourceLocation(PrettyPipes.ID, "pipe"), Registry.pipeBlockEntity = BlockEntityType.Builder.of(PipeBlockEntity::new, Registry.pipeBlock).build(null));
h.register(new ResourceLocation(PrettyPipes.ID, "item_terminal"), Registry.itemTerminalBlockEntity = BlockEntityType.Builder.of(ItemTerminalBlockEntity::new, Registry.itemTerminalBlock).build(null));
h.register(new ResourceLocation(PrettyPipes.ID, "crafting_terminal"), Registry.craftingTerminalBlockEntity = BlockEntityType.Builder.of(CraftingTerminalBlockEntity::new, Registry.craftingTerminalBlock).build(null));
h.register(new ResourceLocation(PrettyPipes.ID, "pressurizer"), Registry.pressurizerBlockEntity = BlockEntityType.Builder.of(PressurizerBlockEntity::new, Registry.pressurizerBlock).build(null));
});
2024-02-03 22:01:43 +01:00
event.register(Registries.ENTITY_TYPE, h ->
2022-06-27 13:57:06 +02:00
h.register(new ResourceLocation(PrettyPipes.ID, "pipe_frame"), Registry.pipeFrameEntity = EntityType.Builder.<PipeFrameEntity>of(PipeFrameEntity::new, MobCategory.MISC).build("pipe_frame")));
2024-02-03 22:01:43 +01:00
event.register(Registries.MENU, h -> {
2024-02-03 15:17:58 +01:00
h.register(new ResourceLocation(PrettyPipes.ID, "pipe"), Registry.pipeContainer = IMenuTypeExtension.create((windowId, inv, data) -> new MainPipeContainer(Registry.pipeContainer, windowId, inv.player, data.readBlockPos())));
h.register(new ResourceLocation(PrettyPipes.ID, "item_terminal"), Registry.itemTerminalContainer = IMenuTypeExtension.create((windowId, inv, data) -> new ItemTerminalContainer(Registry.itemTerminalContainer, windowId, inv.player, data.readBlockPos())));
h.register(new ResourceLocation(PrettyPipes.ID, "crafting_terminal"), Registry.craftingTerminalContainer = IMenuTypeExtension.create((windowId, inv, data) -> new CraftingTerminalContainer(Registry.craftingTerminalContainer, windowId, inv.player, data.readBlockPos())));
h.register(new ResourceLocation(PrettyPipes.ID, "pressurizer"), Registry.pressurizerContainer = IMenuTypeExtension.create((windowId, inv, data) -> new PressurizerContainer(Registry.pressurizerContainer, windowId, inv.player, data.readBlockPos())));
2022-06-27 13:57:06 +02:00
Registry.extractionModuleContainer = Registry.registerPipeContainer(h, "extraction_module");
Registry.filterModuleContainer = Registry.registerPipeContainer(h, "filter_module");
Registry.retrievalModuleContainer = Registry.registerPipeContainer(h, "retrieval_module");
Registry.stackSizeModuleContainer = Registry.registerPipeContainer(h, "stack_size_module");
Registry.filterIncreaseModuleContainer = Registry.registerPipeContainer(h, "filter_increase_module");
Registry.craftingModuleContainer = Registry.registerPipeContainer(h, "crafting_module");
Registry.filterModifierModuleContainer = Registry.registerPipeContainer(h, "filter_modifier_module");
});
2023-07-07 20:34:30 +02:00
event.register(BuiltInRegistries.CREATIVE_MODE_TAB.key(), h -> {
h.register(new ResourceLocation(PrettyPipes.ID, "tab"), CreativeModeTab.builder()
.title(Component.translatable("item_group." + PrettyPipes.ID + ".tab"))
.icon(() -> new ItemStack(Registry.wrenchItem))
2024-02-03 22:01:43 +01:00
.displayItems((params, output) -> BuiltInRegistries.ITEM.entrySet().stream()
2023-07-07 20:34:30 +02:00
.filter(b -> b.getKey().location().getNamespace().equals(PrettyPipes.ID))
.sorted(Comparator.comparing(b -> b.getValue().getClass().getSimpleName()))
.forEach(b -> output.accept(b.getValue()))).build()
);
});
2024-02-03 22:01:43 +01:00
event.register(Registries.RECIPE_SERIALIZER, h -> {
h.register(new ResourceLocation(PrettyPipes.ID, "module_clearing"), ModuleClearingRecipe.SERIALIZER);
});
2020-04-13 21:48:35 +02:00
}
2024-03-07 17:45:35 +01:00
@SubscribeEvent
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
event.registerBlockEntity(Registry.pipeConnectableCapability, Registry.pipeBlockEntity, (e, d) -> e);
event.registerBlockEntity(Registry.pipeConnectableCapability, Registry.pressurizerBlockEntity, (e, d) -> e);
event.registerBlockEntity(Registry.pipeConnectableCapability, Registry.itemTerminalBlockEntity, (e, d) -> e);
event.registerBlockEntity(Registry.pipeConnectableCapability, Registry.craftingTerminalBlockEntity, (e, d) -> e);
event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, Registry.pressurizerBlockEntity, (e, d) -> e.storage);
}
@SubscribeEvent
public static void registerPayloads(final RegisterPayloadHandlerEvent event) {
var registrar = event.registrar(PrettyPipes.ID);
registrar.play(PacketItemEnterPipe.ID, PacketItemEnterPipe::new, PacketItemEnterPipe::onMessage);
registrar.play(PacketButton.ID, PacketButton::new, PacketButton::onMessage);
registrar.play(PacketCraftingModuleTransfer.ID, PacketCraftingModuleTransfer::new, PacketCraftingModuleTransfer::onMessage);
registrar.play(PacketGhostSlot.ID, PacketGhostSlot::new, PacketGhostSlot::onMessage);
registrar.play(PacketNetworkItems.ID, PacketNetworkItems::new, PacketNetworkItems::onMessage);
registrar.play(PacketRequest.ID, PacketRequest::new, PacketRequest::onMessage);
}
2022-06-27 13:57:06 +02:00
private static <T extends AbstractPipeContainer<?>> MenuType<T> registerPipeContainer(RegisterEvent.RegisterHelper<MenuType<?>> helper, String name) {
2024-02-03 15:17:58 +01:00
var type = (MenuType<T>) IMenuTypeExtension.create((windowId, inv, data) -> {
2023-07-07 19:54:52 +02:00
var tile = Utility.getBlockEntity(PipeBlockEntity.class, inv.player.level(), data.readBlockPos());
2021-12-02 16:55:04 +01:00
var moduleIndex = data.readInt();
var moduleStack = tile.modules.getStackInSlot(moduleIndex);
2020-04-17 20:03:54 +02:00
return ((IModule) moduleStack.getItem()).getContainer(moduleStack, tile, windowId, inv, inv.player, moduleIndex);
2022-06-27 13:57:06 +02:00
});
helper.register(new ResourceLocation(PrettyPipes.ID, name), type);
return type;
2020-04-17 20:03:54 +02:00
}
2022-06-27 13:57:06 +02:00
private static void registerTieredModule(RegisterEvent.RegisterHelper<Item> helper, String name, BiFunction<String, ModuleTier, ModuleItem> item) {
2021-12-02 16:55:04 +01:00
for (var tier : ModuleTier.values())
2022-06-27 13:57:06 +02:00
helper.register(new ResourceLocation(PrettyPipes.ID, tier.name().toLowerCase(Locale.ROOT) + "_" + name), item.apply(name, tier));
2020-04-18 22:30:14 +02:00
}
2024-03-07 17:45:35 +01:00
@EventBusSubscriber(bus = Bus.MOD, value = Dist.CLIENT)
2020-04-16 04:42:42 +02:00
public static final class Client {
2021-12-02 14:44:26 +01:00
2024-03-07 17:45:35 +01:00
@SubscribeEvent
2020-04-16 04:42:42 +02:00
public static void setup(FMLClientSetupEvent event) {
2022-06-27 13:57:06 +02:00
BlockEntityRenderers.register(Registry.pipeBlockEntity, PipeRenderer::new);
EntityRenderers.register(Registry.pipeFrameEntity, PipeFrameRenderer::new);
MenuScreens.register(Registry.pipeContainer, MainPipeGui::new);
MenuScreens.register(Registry.itemTerminalContainer, ItemTerminalGui::new);
MenuScreens.register(Registry.pressurizerContainer, PressurizerGui::new);
MenuScreens.register(Registry.craftingTerminalContainer, CraftingTerminalGui::new);
MenuScreens.register(Registry.extractionModuleContainer, ExtractionModuleGui::new);
MenuScreens.register(Registry.filterModuleContainer, FilterModuleGui::new);
MenuScreens.register(Registry.retrievalModuleContainer, RetrievalModuleGui::new);
MenuScreens.register(Registry.stackSizeModuleContainer, StackSizeModuleGui::new);
MenuScreens.register(Registry.filterIncreaseModuleContainer, FilterIncreaseModuleGui::new);
MenuScreens.register(Registry.craftingModuleContainer, CraftingModuleGui::new);
MenuScreens.register(Registry.filterModifierModuleContainer, FilterModifierModuleGui::new);
2020-04-16 04:42:42 +02:00
}
2020-04-13 21:48:35 +02:00
}
2020-04-13 21:48:35 +02:00
}