From 81e74bc8213f9661327e6fa21421bcdad70ed947 Mon Sep 17 00:00:00 2001 From: ticticboooom Date: Mon, 10 May 2021 13:29:04 +0100 Subject: [PATCH] starting jei structure support --- build.gradle | 6 +- gradle.properties | 4 +- .../java/com/ticticboooom/mods/mm/MM.java | 9 +- .../mm/client/jei/category/MMJeiPlugin.java | 36 +++ .../MachineStructureRecipeCategory.java | 217 ++++++++++++++++++ .../mm/client/util/GuiBlockRenderBuilder.java | 89 +++++++ .../mods/mm/data/MachineStructureRecipe.java | 2 + .../mm/datagen/gen/MMItemModelProvider.java | 3 + .../mods/mm/datagen/gen/MMLangProvider.java | 3 + .../mm/ports/storage/FluidPortStorage.java | 10 +- .../mods/mm/registration/MMLoader.java | 28 +-- .../mods/mm/registration/MMSetup.java | 21 ++ .../textures/gui/gui_large_jei.png | Bin 0 -> 17040 bytes .../textures/gui/slot_parts.png | Bin 0 -> 3622 bytes .../masterfulmachinery/recipes/struct.json | 31 +++ 15 files changed, 436 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/category/MMJeiPlugin.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java create mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_jei.png create mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/slot_parts.png create mode 100644 src/main/resources/data/masterfulmachinery/recipes/struct.json diff --git a/build.gradle b/build.gradle index 6097e9b..cd55be1 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.16.5-0.0.7' +version = '1.16.5-0.0.8' group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'MasterfulMachinery' @@ -146,6 +146,10 @@ dependencies { runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:generators")// Mekanism: Generators runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:tools")// Mekanism: Tools + + compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") + // at runtime, use the full JEI jar + runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // You may put jars on which you depend on in ./libs or you may define them like so.. // compile "some.group:artifact:version:classifier" // compile "some.group:artifact:version" diff --git a/gradle.properties b/gradle.properties index 922c412..fa070cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,6 @@ # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -mekanism_version=1.16.5-10.0.20.447 \ No newline at end of file +mekanism_version=1.16.5-10.0.20.447 +mc_version=1.16.5 +jei_version=7.+ \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/MM.java b/src/main/java/com/ticticboooom/mods/mm/MM.java index d6c4732..6ace8df 100644 --- a/src/main/java/com/ticticboooom/mods/mm/MM.java +++ b/src/main/java/com/ticticboooom/mods/mm/MM.java @@ -17,6 +17,7 @@ import com.ticticboooom.mods.mm.datagen.gen.MMLangProvider; import com.ticticboooom.mods.mm.network.PacketHandler; import com.ticticboooom.mods.mm.registration.MMLoader; import com.ticticboooom.mods.mm.registration.MMPorts; +import com.ticticboooom.mods.mm.registration.MMSetup; import com.ticticboooom.mods.mm.registration.RecipeTypes; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScreenManager; @@ -57,10 +58,10 @@ public class MM { PacketHandler.init(); registerDataGen(); IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - MMLoader.BLOCKS_REG.register(bus); - MMLoader.ITEMS_REG.register(bus); - MMLoader.TILES_REG.register(bus); - MMLoader.CONTAINER_REG.register(bus); + MMSetup.BLOCKS_REG.register(bus); + MMSetup.ITEMS_REG.register(bus); + MMSetup.TILES_REG.register(bus); + MMSetup.CONTAINER_REG.register(bus); RecipeTypes.RECIPE_SERIALIZERS.register(bus); bus.addListener(this::clientEvents); if (FMLEnvironment.dist == Dist.CLIENT) { diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MMJeiPlugin.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MMJeiPlugin.java new file mode 100644 index 0000000..6dbe57f --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MMJeiPlugin.java @@ -0,0 +1,36 @@ +package com.ticticboooom.mods.mm.client.jei.category; + +import com.ticticboooom.mods.mm.MM; +import com.ticticboooom.mods.mm.data.MachineStructureRecipe; +import com.ticticboooom.mods.mm.registration.RecipeTypes; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import net.minecraft.client.Minecraft; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.util.ResourceLocation; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JeiPlugin +public class MMJeiPlugin implements IModPlugin { + @Override + public ResourceLocation getPluginUid() { + return new ResourceLocation(MM.ID, "jei_main"); + } + + @Override + public void registerRecipes(IRecipeRegistration registration) { + List structureRecipes = Minecraft.getInstance().level.getRecipeManager().getAllRecipesFor(RecipeTypes + .MACHINE_STRUCTURE); + registration.addRecipes(structureRecipes, new ResourceLocation(MM.ID, "machine_structure")); + } + + @Override + public void registerCategories(IRecipeCategoryRegistration registration) { + registration.addRecipeCategories(new MachineStructureRecipeCategory(registration.getJeiHelpers())); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java new file mode 100644 index 0000000..8539527 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/client/jei/category/MachineStructureRecipeCategory.java @@ -0,0 +1,217 @@ +package com.ticticboooom.mods.mm.client.jei.category; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.ticticboooom.mods.mm.MM; +import com.ticticboooom.mods.mm.block.ControllerBlock; +import com.ticticboooom.mods.mm.client.util.GuiBlockRenderBuilder; +import com.ticticboooom.mods.mm.data.MachineStructureRecipe; +import com.ticticboooom.mods.mm.data.model.structure.MachineStructureRecipeKeyModel; +import com.ticticboooom.mods.mm.registration.MMLoader; +import com.ticticboooom.mods.mm.registration.MMSetup; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IJeiHelpers; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.DirectionalBlock; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Quaternion; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.ForgeRegistries; +import org.lwjgl.glfw.GLFW; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class MachineStructureRecipeCategory implements IRecipeCategory { + + private static final ResourceLocation overlayRl = new ResourceLocation(MM.ID, "textures/gui/gui_large_jei.png"); + private static final ResourceLocation iconRl = new ResourceLocation(MM.ID, "textures/items/blueprint.png"); + private static final ResourceLocation slotRl = new ResourceLocation(MM.ID, "textures/gui/slot_parts.png"); + private IJeiHelpers helpers; + private MachineStructureRecipe recipe; + private float xRotation = 0; + private double xLastMousePosition = 0; + private float yRotation = 0; + private double yLastMousePosition = 0; + private int sliceY = 0; + private boolean slicingActive = false; + + public MachineStructureRecipeCategory(IJeiHelpers helpers) { + this.helpers = helpers; + } + + @Override + public ResourceLocation getUid() { + return new ResourceLocation(MM.ID, "machine_structure"); + } + + @Override + public Class getRecipeClass() { + return MachineStructureRecipe.class; + } + + @Override + public String getTitle() { + return "Machine Structures"; + } + + @Override + public IDrawable getBackground() { + return helpers.getGuiHelper().createDrawable(overlayRl, 0, 0, 162, 150); + } + + @Override + public IDrawable getIcon() { + return helpers.getGuiHelper().createDrawableIngredient(new ItemStack(MMSetup.BLUEPRINT.get(), 1)); + } + + private IDrawable getButton() {return helpers.getGuiHelper().createDrawable(slotRl, 0, 44, 18, 18);} + + @Override + public void setIngredients(MachineStructureRecipe machineStructureRecipe, IIngredients iIngredients) { + Ingredient ingredient = Ingredient.of(new ItemStack(MMSetup.BLUEPRINT.get())); + ArrayList objects = new ArrayList<>(); + objects.add(ingredient); + iIngredients.setInputIngredients(objects); + } + + @Override + public void setRecipe(IRecipeLayout iRecipeLayout, MachineStructureRecipe machineStructureRecipe, IIngredients iIngredients) { + + } + + @Override + public void draw(MachineStructureRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY) { + if (this.recipe != recipe) { + this.recipe = null; + xRotation = 0; + yRotation = 0; + sliceY = 0; + slicingActive = false; + } + Minecraft mc = Minecraft.getInstance(); + if (xLastMousePosition == 0) { + xLastMousePosition = mouseX; + } + if (yLastMousePosition == 0) { + yLastMousePosition = mouseY; + } + + if (GLFW.glfwGetMouseButton(mc.getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_1) != 0) { + double relMoveX = mouseX - xLastMousePosition; + double relMoveY = mouseY - yLastMousePosition; + xRotation += relMoveX; + yRotation += relMoveY; + } + int furthestX = Integer.MAX_VALUE; + int nearestX = Integer.MIN_VALUE; + int furthestZ = Integer.MAX_VALUE; + int nearestZ = Integer.MIN_VALUE; + + int topY = Integer.MIN_VALUE; + int bottomY = Integer.MAX_VALUE; + + for (MachineStructureRecipeKeyModel part : recipe.getModels().get(0)) { + furthestX = Math.min(part.getPos().getX(), furthestX); + nearestX = Math.max(part.getPos().getX(), nearestX); + furthestZ = Math.min(part.getPos().getZ(), furthestZ); + nearestZ = Math.max(part.getPos().getZ(), nearestZ); + topY = Math.max(part.getPos().getY(), topY); + bottomY = Math.min(part.getPos().getY(), bottomY); + } + int scaleFactor = Math.abs(furthestX) + Math.abs(nearestX) + Math.abs(furthestZ) + Math.abs(nearestZ); + scaleFactor = scaleFactor / 4; + nearestX++; + nearestZ++; + float centreX = ((float) nearestX - furthestX) / 2f; + float centreZ = ((float) nearestZ - furthestZ) / 2f; + + List parts = recipe.getModels().get(0); + if (slicingActive) { + parts = parts.stream().filter(x -> x.getPos().getY() == sliceY).collect(Collectors.toList()); + } + + for (MachineStructureRecipeKeyModel part : parts) { + if (part.getBlock().isEmpty() && part.getTag().isEmpty()) { + continue; + } + + BlockPos bp = new BlockPos(part.getPos().getX(), part.getPos().getY(), part.getPos().getZ()); + + if (!part.getBlock().equals("")) { + ResourceLocation resourceLocation = new ResourceLocation(part.getBlock()); + Block block = ForgeRegistries.BLOCKS.getValue(resourceLocation); + BlockState defaultState = block.defaultBlockState(); + new GuiBlockRenderBuilder(defaultState).at(bp) + .withPrePosition(new Vector3f(6.5f, -5, 10)) + .withRotation(new Quaternion(new Vector3f(1, 0, 0), 15 + yRotation, true)) + .withRotation(new Quaternion(new Vector3f(0, -1, 0), 225 - xRotation, true)) + .withScale(new Vector3f(12f, -12, 12)) + .finalize(matrixStack); + } + } + if (sliceY == 0) { + ControllerBlock block = null; + for (RegistryObject reg : MMLoader.BLOCKS) { + if (reg.get().getControllerId().equals(recipe.getControllerId())) { + block = reg.get(); + } + } + BlockState defaultState = block.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.NORTH); + new GuiBlockRenderBuilder(defaultState).at(new BlockPos(0, 0, 0)) + .withPrePosition(new Vector3f(6.5f, -5, 10)) + .withRotation(new Quaternion(new Vector3f(1, 0, 0), 15 + yRotation, true)) + .withRotation(new Quaternion(new Vector3f(0, -1, 0), 225 - xRotation, true)) + .withScale(new Vector3f(12f, -12f, 12f)) + .finalize(matrixStack); + } + + this.recipe = recipe; + xLastMousePosition = mouseX; + yLastMousePosition = mouseY; + + getButton().draw(matrixStack, 144, 125); + } + + @Override + public boolean handleClick(MachineStructureRecipe recipe, double mouseX, double mouseY, int mouseButton) { + if (mouseX > 144 && mouseY > 125 && mouseX < 162 && mouseY < 143) { + startIncrementSlice(); + } + return false; + } + + private void startIncrementSlice() { + + int topY = Integer.MIN_VALUE; + int bottomY = Integer.MAX_VALUE; + + for (MachineStructureRecipeKeyModel part : recipe.getModels().get(0)) { + topY = Math.max(part.getPos().getY(), topY); + bottomY = Math.min(part.getPos().getY(), bottomY); + } + + if (!slicingActive){ + slicingActive = true; + sliceY = bottomY; + } else if (sliceY == topY){ + slicingActive = false; + sliceY = 0; + } else { + sliceY++; + } + + + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java b/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java new file mode 100644 index 0000000..615859d --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java @@ -0,0 +1,89 @@ +package com.ticticboooom.mods.mm.client.util; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import mekanism.client.model.BaseModelCache; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Quaternion; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraftforge.client.model.data.EmptyModelData; + +import java.util.ArrayList; +import java.util.List; + +public class GuiBlockRenderBuilder { + private final BlockState blockState; + private BlockPos position; + private List orderedRotation = new ArrayList<>(); + private Minecraft mc = Minecraft.getInstance(); + private Vector3f scale; + private Vector3f prePosition = new Vector3f(); + + public GuiBlockRenderBuilder(BlockState blockState) { + this.blockState = blockState; + position = new BlockPos(0, 0, 0); + } + + public GuiBlockRenderBuilder at(BlockPos position) { + this.position = position; + return this; + } + + public GuiBlockRenderBuilder withRotation(Quaternion rotation) { + orderedRotation.add(rotation); + return this; + } + + public GuiBlockRenderBuilder withScale(Vector3f scale) { + this.scale = scale; + return this; + } + + public GuiBlockRenderBuilder withPrePosition(Vector3f position) { + this.prePosition = position; + return this; + } + + private void prepareRender() { + RenderSystem.enableBlend(); + RenderSystem.enableRescaleNormal(); + RenderSystem.enableAlphaTest(); + RenderHelper.setupFor3DItems(); + RenderSystem.alphaFunc(516, 0.1F); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + private void cleanupRender() { + RenderSystem.disableAlphaTest(); + RenderSystem.disableRescaleNormal(); + } + + public void finalize(MatrixStack ms) { + prepareRender(); + IRenderTypeBuffer.Impl buf = mc.renderBuffers().bufferSource(); + BlockRendererDispatcher brd = Minecraft.getInstance().getBlockRenderer(); + ms.pushPose(); + transformMatrix(ms); + brd.renderBlock(blockState, ms, buf, 0xF000F0, OverlayTexture.NO_OVERLAY, EmptyModelData.INSTANCE); + buf.endBatch(); + ms.popPose(); + cleanupRender(); + } + + private void transformMatrix(MatrixStack ms) { + ms.scale(scale.x(), scale.y(), scale.z()); + ms.translate(prePosition.x(), prePosition.y(), prePosition.z()); + for (Quaternion quaternion : orderedRotation) { + ms.mulPose(quaternion); + } + ms.translate(position.getX(), position.getY(), position.getZ()); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java b/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java index aac1c25..1bd4f13 100644 --- a/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java +++ b/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java @@ -38,7 +38,9 @@ import java.util.List; public class MachineStructureRecipe implements IRecipe { private final ResourceLocation rl = new ResourceLocation(MM.ID, "machine_structure"); + @Getter private List> models; + @Getter private final String controllerId; private String id; diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMItemModelProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMItemModelProvider.java index 414a128..4dcaa4e 100644 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMItemModelProvider.java +++ b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMItemModelProvider.java @@ -4,6 +4,7 @@ import com.ticticboooom.mods.mm.MM; import com.ticticboooom.mods.mm.block.ControllerBlock; import com.ticticboooom.mods.mm.block.MachinePortBlock; import com.ticticboooom.mods.mm.registration.MMLoader; +import com.ticticboooom.mods.mm.registration.MMSetup; import net.minecraft.data.DataGenerator; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ItemModelProvider; @@ -29,5 +30,7 @@ public class MMItemModelProvider extends ItemModelProvider { for (RegistryObject port : MMLoader.IPORT_BLOCKS) { this.getBuilder(port.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(port.getId().getNamespace(), "block/" + port.getId().getPath()))); } + + this.getBuilder(MMSetup.BLUEPRINT.getId().getPath()).parent(new ModelFile.UncheckedModelFile("item/generated")).texture("layer0", "items/blueprint"); } } \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMLangProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMLangProvider.java index c3a6698..7b73a87 100644 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMLangProvider.java +++ b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMLangProvider.java @@ -4,6 +4,7 @@ import com.ticticboooom.mods.mm.MM; import com.ticticboooom.mods.mm.block.ControllerBlock; import com.ticticboooom.mods.mm.block.MachinePortBlock; import com.ticticboooom.mods.mm.registration.MMLoader; +import com.ticticboooom.mods.mm.registration.MMSetup; import net.minecraft.data.DataGenerator; import net.minecraftforge.common.data.LanguageProvider; import net.minecraftforge.fml.RegistryObject; @@ -29,6 +30,8 @@ public class MMLangProvider extends LanguageProvider { this.add(port.get(), block.get().getControllerName() + " - " + port.get().getLangName() + " Output Port"); } } + + this.add(MMSetup.BLUEPRINT.get(), "Blueprint"); } } } diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java index df8ac8c..590cab4 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/storage/FluidPortStorage.java @@ -59,7 +59,15 @@ public class FluidPortStorage implements IPortStorage { @Override public void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen) { -} + Minecraft.getInstance().textureManager.bind(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); + screen.blit(stack, left, top, 0, 0, 175, 256); + int x = 78; + int y = 40; + screen.blit(stack, left + x, top + y, 175, 0, 18, 18); + FluidRenderer.INSTANCE.render(stack, left + x + 1, top + y + 1, inv.getFluidInTank(0), 16); + + AbstractGui.drawCenteredString(stack, Minecraft.getInstance().font, inv.getFluidInTank(0).getAmount() + " " + inv.getFluidInTank(0).getDisplayName().getString(), left + x + 9 + 1, top + y + 30, 0xfefefe); + } @Override public void setupContainer(PortBlockContainer container, PlayerInventory inv, MachinePortBlockEntity tile) { diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java b/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java index df7b7d7..ceaa368 100644 --- a/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java +++ b/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java @@ -51,10 +51,6 @@ public class MMLoader { public static final ArrayList>> CONTAINERS = new ArrayList<>(); public static final ArrayList>> PORT_CONTAINERS = new ArrayList>>(); - public static final DeferredRegister BLOCKS_REG = DeferredRegister.create(ForgeRegistries.BLOCKS, MM.ID); - public static final DeferredRegister ITEMS_REG = DeferredRegister.create(ForgeRegistries.ITEMS, MM.ID); - public static final DeferredRegister> TILES_REG = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, MM.ID); - public static final DeferredRegister> CONTAINER_REG = DeferredRegister.create(ForgeRegistries.CONTAINERS, MM.ID); public static void load() { Path rootPath = FMLPaths.CONFIGDIR.get().resolve("masterful_machinery"); @@ -72,10 +68,10 @@ public class MMLoader { Registerable>> controllerTile = new Registerable<>(); Registerable> controllerBlock = new Registerable<>(); Registerable>> cont = new Registerable<>(); - cont.set(CONTAINER_REG.register(controllerId + "_controller", () -> IForgeContainerType.create((i, o, u) -> new ControllerBlockContainer(cont.get().get(), i, o, u)))); - controllerBlock.set(BLOCKS_REG.register(controllerId + "_controller", () -> new ControllerBlock(controllerTile.get(), controllerName, controllerId))); - controllerTile.set(TILES_REG.register(controllerId + "_controller", () -> TileEntityType.Builder.of(() -> new ControllerBlockEntity(controllerTile.get(), cont.get(), controllerId), controllerBlock.get().get()).build(null))); - ITEMS_REG.register(controllerId + "_controller", () -> new BlockItem(controllerBlock.get().get(), new Item.Properties().tab(MASTERFUL_ITEM_GROUP))); + cont.set(MMSetup.CONTAINER_REG.register(controllerId + "_controller", () -> IForgeContainerType.create((i, o, u) -> new ControllerBlockContainer(cont.get().get(), i, o, u)))); + controllerBlock.set(MMSetup.BLOCKS_REG.register(controllerId + "_controller", () -> new ControllerBlock(controllerTile.get(), controllerName, controllerId))); + controllerTile.set(MMSetup.TILES_REG.register(controllerId + "_controller", () -> TileEntityType.Builder.of(() -> new ControllerBlockEntity(controllerTile.get(), cont.get(), controllerId), controllerBlock.get().get()).build(null))); + MMSetup.ITEMS_REG.register(controllerId + "_controller", () -> new BlockItem(controllerBlock.get().get(), new Item.Properties().tab(MASTERFUL_ITEM_GROUP))); BLOCKS.add(controllerBlock.get()); CONTAINERS.add(cont.get()); } @@ -95,10 +91,10 @@ public class MMLoader { Registerable>> tile = new Registerable<>(); Registerable> block = new Registerable<>(); Registerable>> cont = new Registerable<>(); - cont.set(CONTAINER_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); - block.set(BLOCKS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> new MachinePortBlock(tile.get(), name, controllerId))); - tile.set(TILES_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> TileEntityType.Builder.of(() -> new MachinePortBlockEntity(tile.get().get(),cont.get().get(), data.get(), true), block.get().get()).build(null))); - ITEMS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> new BlockItem(block.get().get(), new Item.Properties().tab(MASTERFUL_ITEM_GROUP))); + cont.set(MMSetup.CONTAINER_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); + block.set(MMSetup.BLOCKS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> new MachinePortBlock(tile.get(), name, controllerId))); + tile.set(MMSetup.TILES_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> TileEntityType.Builder.of(() -> new MachinePortBlockEntity(tile.get().get(),cont.get().get(), data.get(), true), block.get().get()).build(null))); + MMSetup.ITEMS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_input", () -> new BlockItem(block.get().get(), new Item.Properties().tab(MASTERFUL_ITEM_GROUP))); PORT_CONTAINERS.add(cont.get()); IPORT_BLOCKS.add(block.get()); } @@ -107,10 +103,10 @@ public class MMLoader { Registerable>> tile = new Registerable<>(); Registerable> block = new Registerable<>(); Registerable>> cont = new Registerable<>(); - cont.set(CONTAINER_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); - block.set(BLOCKS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> new MachinePortBlock(tile.get(), name, controllerId))); - tile.set(TILES_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> TileEntityType.Builder.of(() -> new MachinePortBlockEntity(tile.get().get(), cont.get().get(), data.get(), false), block.get().get()).build(null))); - ITEMS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> new BlockItem(block.get().get(), new Item.Properties().tab(MASTERFUL_ITEM_GROUP))); + cont.set(MMSetup.CONTAINER_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); + block.set(MMSetup.BLOCKS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> new MachinePortBlock(tile.get(), name, controllerId))); + tile.set(MMSetup.TILES_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> TileEntityType.Builder.of(() -> new MachinePortBlockEntity(tile.get().get(), cont.get().get(), data.get(), false), block.get().get()).build(null))); + MMSetup.ITEMS_REG.register(controllerId + "_" + id + "_port_" + resourceLocation.getPath() + "_output", () -> new BlockItem(block.get().get(), new Item.Properties().tab(MASTERFUL_ITEM_GROUP))); PORT_CONTAINERS.add(cont.get()); OPORT_BLOCKS.add(block.get()); } diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java b/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java new file mode 100644 index 0000000..9119af6 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java @@ -0,0 +1,21 @@ +package com.ticticboooom.mods.mm.registration; + +import com.ticticboooom.mods.mm.MM; +import net.minecraft.block.Block; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; + +public class MMSetup { + + public static final DeferredRegister BLOCKS_REG = DeferredRegister.create(ForgeRegistries.BLOCKS, MM.ID); + public static final DeferredRegister ITEMS_REG = DeferredRegister.create(ForgeRegistries.ITEMS, MM.ID); + public static final DeferredRegister> TILES_REG = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, MM.ID); + public static final DeferredRegister> CONTAINER_REG = DeferredRegister.create(ForgeRegistries.CONTAINERS, MM.ID); + + public static final RegistryObject BLUEPRINT = ITEMS_REG.register("blueprint", () -> new Item(new Item.Properties().tab(MMLoader.MASTERFUL_ITEM_GROUP))); + +} diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_jei.png b/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_jei.png new file mode 100644 index 0000000000000000000000000000000000000000..4e725e02979996d00bb6bf83527891bfda0afe53 GIT binary patch literal 17040 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/masterfulmachinery/recipes/struct.json b/src/main/resources/data/masterfulmachinery/recipes/struct.json new file mode 100644 index 0000000..76c9719 --- /dev/null +++ b/src/main/resources/data/masterfulmachinery/recipes/struct.json @@ -0,0 +1,31 @@ +{ + "type": "masterfulmachinery:machine_structure", + "controllerId": "basic", + "id": "first_structure", + "blocks": [ + { + "pos": { + "x": -1, + "y": 0, + "z": 0 + }, + "block": "masterfulmachinery:basic_basic_port_items_input" + }, + { + "pos": { + "x": 1, + "y": 0, + "z": 0 + }, + "block": "masterfulmachinery:basic_basic_port_items_output" + }, + { + "pos": { + "x": 0, + "y": 1, + "z": 0 + }, + "block": "masterfulmachinery:basic_basic_port_items_output" + } + ] +} \ No newline at end of file