From ee685fbe9806fa539e7a01ec5bff3d2bac24155b Mon Sep 17 00:00:00 2001 From: ticticboooom Date: Thu, 20 May 2021 22:50:48 +0100 Subject: [PATCH] added structure config generator block with functionality --- build.gradle | 11 +- .../java/com/ticticboooom/mods/mm/MM.java | 8 ++ .../mods/mm/block/ProjectorBlock.java | 109 +++++++++++---- .../mods/mm/block/StructureGenBlock.java | 114 +++++++++++++++- .../container/StructureGenBlockContainer.java | 49 ++++++- .../container/slot/StructureDeviceSlot.java | 17 +++ .../block/tile/StructureGenBlockEntity.java | 10 +- .../mods/mm/client/MMRenderTypes.java | 31 +++++ .../MachineStructureRecipeCategory.java | 23 +++- .../StructureGenBlockContainerScreen.java | 37 +++++- .../ter/StructureGenTileEntityRenderer.java | 96 ++++++++++++++ .../mm/client/util/GuiBlockRenderBuilder.java | 4 +- .../mods/mm/data/MachineStructureRecipe.java | 2 +- .../mm/datagen/gen/MMBlockStateProvider.java | 16 ++- .../mm/datagen/gen/MMItemModelProvider.java | 2 +- .../mods/mm/helper/NBTHelper.java | 7 + .../mods/mm/helper/StructureHelper.java | 124 ++++++++++++++++++ ...smission.java => MMStarlightReceiver.java} | 11 +- .../astral/MMTransmissionReceiver.java | 69 ++++++++++ .../mm/item/StructureGenSelectionDevice.java | 5 + .../mods/mm/registration/MMSetup.java | 2 +- ...enerator.json => structure_generator.json} | 0 .../textures/gui/gui_large_gen.afdesign | Bin 0 -> 60200 bytes .../textures/gui/gui_large_gen.png | Bin 0 -> 14992 bytes 24 files changed, 691 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java rename src/main/java/com/ticticboooom/mods/mm/inventory/astral/{MMStarlightTransmission.java => MMStarlightReceiver.java} (57%) create mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMTransmissionReceiver.java rename src/main/resources/assets/masterfulmachinery/models/block/{config_generator.json => structure_generator.json} (100%) create mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.afdesign create mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.png diff --git a/build.gradle b/build.gradle index 2e1d084..d749cc7 100644 --- a/build.gradle +++ b/build.gradle @@ -20,10 +20,9 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.16.5-0.1.32-T' + System.currentTimeMillis() +version = '1.16.5-0.1.33-T' + System.currentTimeMillis() group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'MasterfulMachinery' - java.toolchain.languageVersion = JavaLanguageVersion.of(8) // Mojang ships Java 8 to end users, so your mod should target Java 8. configurations { @@ -156,10 +155,10 @@ dependencies { shade 'com.github.marschall:memoryfilesystem:2.1.0' - compileOnly fg.deobf("mekanism:Mekanism:${mekanism_version}")// core -// runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:additions")// Mekanism: Additions -// runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:generators")// Mekanism: Generators -// runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:tools")// Mekanism: Tools + implementation fg.deobf("mekanism:Mekanism:${mekanism_version}")// core + runtimeOnly fg.deobf("mekanism:Mekanism:${mekanism_version}:additions")// Mekanism: Additions + 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 diff --git a/src/main/java/com/ticticboooom/mods/mm/MM.java b/src/main/java/com/ticticboooom/mods/mm/MM.java index f09e223..4def8df 100644 --- a/src/main/java/com/ticticboooom/mods/mm/MM.java +++ b/src/main/java/com/ticticboooom/mods/mm/MM.java @@ -6,9 +6,11 @@ import com.ticticboooom.mods.mm.block.ControllerBlock; import com.ticticboooom.mods.mm.block.MachinePortBlock; import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; import com.ticticboooom.mods.mm.client.screen.ControllerBlockContainerScreen; import com.ticticboooom.mods.mm.client.screen.PortBlockContainerScreen; import com.ticticboooom.mods.mm.client.screen.StructureGenBlockContainerScreen; +import com.ticticboooom.mods.mm.client.ter.StructureGenTileEntityRenderer; import com.ticticboooom.mods.mm.datagen.MMPackFinder; import com.ticticboooom.mods.mm.datagen.MemoryDataGeneratorFactory; import com.ticticboooom.mods.mm.datagen.PackType; @@ -24,6 +26,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScreenManager; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.data.DataGenerator; import net.minecraft.inventory.container.ContainerType; import net.minecraftforge.api.distmarker.Dist; @@ -31,6 +34,7 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.thread.EffectiveSide; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -103,6 +107,7 @@ public class MM { for (RegistryObject> container : MMLoader.CONTAINERS) { ScreenManager.registerFactory(container.get(), ControllerBlockContainerScreen::new); } + for (RegistryObject> container : MMLoader.PORT_CONTAINERS) { ScreenManager.registerFactory((ContainerType) container.get(), PortBlockContainerScreen::new); } @@ -118,7 +123,10 @@ public class MM { for (RegistryObject block : MMLoader.OPORT_BLOCKS) { RenderTypeLookup.setRenderLayer(block.get(), layer -> layer == RenderType.getSolid() || layer == RenderType.getTranslucent()); } + + RenderTypeLookup.setRenderLayer(MMSetup.PROJECTOR_BLOCK.get(), RenderType.getTranslucent()); ScreenManager.registerFactory(MMSetup.STRUCTURE_CONTAINER.get(), StructureGenBlockContainerScreen::new); + ClientRegistry.bindTileEntityRenderer(MMSetup.STRUCTURE_TILE.get(), StructureGenTileEntityRenderer::new); } } diff --git a/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java index 59ef239..f061af8 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/ProjectorBlock.java @@ -29,42 +29,101 @@ public class ProjectorBlock extends Block { private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; private static final VoxelShape SHAPE_N = Stream.of( - Block.makeCuboidShape(0, 0, 0, 16, 8, 16), - Block.makeCuboidShape(0, 8, 0, 4, 10, 16), - Block.makeCuboidShape(4, 8, 8, 16, 12, 16), - Block.makeCuboidShape(12, 8, 0, 16, 10, 8), - Block.makeCuboidShape(5, 8, 1, 11, 12, 7), - Block.makeCuboidShape(5, 12, 9, 11, 16, 15) + Block.makeCuboidShape(4, 2, 4, 12, 3, 12), + Block.makeCuboidShape(4, 0, 4, 12, 1, 12), + Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), + Block.makeCuboidShape(5, 1, 5, 11, 2, 11), + Block.makeCuboidShape(5, 6, 5, 11, 12, 11), + Block.makeCuboidShape(0.75, 2.5, 6.75, 2.25, 4.75, 9.25), + Block.makeCuboidShape(13.75, 2.5, 6.75, 15.25, 4.75, 9.25), + Block.makeCuboidShape(6, 3.5, 14, 7, 12.75, 15), + Block.makeCuboidShape(5.75, 11.25, 13.75, 7.25, 13.5, 15.25), + Block.makeCuboidShape(5.75, 2.5, 13.75, 7.25, 4.75, 15.25), + Block.makeCuboidShape(8.75, 11.25, 13.75, 10.25, 13.5, 15.25), + Block.makeCuboidShape(8.75, 2.5, 13.75, 10.25, 4.75, 15.25), + Block.makeCuboidShape(9, 3.5, 14, 10, 12.75, 15), + Block.makeCuboidShape(1.25, 6.25, 7.5, 2.25, 7.25, 8.5), + Block.makeCuboidShape(13.75, 6.25, 7.5, 14.75, 7.25, 8.5), + Block.makeCuboidShape(14, 3.5, 7, 15, 7.75, 9), + Block.makeCuboidShape(1, 3.5, 7, 2, 7.75, 9), + Block.makeCuboidShape(11, 2, 6, 15, 4, 10), + Block.makeCuboidShape(1, 2, 6, 5, 4, 10), + Block.makeCuboidShape(6, 2, 11, 10, 4, 15), + Block.makeCuboidShape(6, 12, 9, 10, 15, 15) ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); private static final VoxelShape SHAPE_E = Stream.of( - Block.makeCuboidShape(0, 0, 0, 16, 8, 16), - Block.makeCuboidShape(0, 8, 0, 16, 10, 4), - Block.makeCuboidShape(0, 8, 4, 8, 12, 16), - Block.makeCuboidShape(8, 8, 12, 16, 10, 16), - Block.makeCuboidShape(9, 8, 5, 15, 12, 11), - Block.makeCuboidShape(1, 12, 5, 7, 16, 11) + Block.makeCuboidShape(4, 2, 4, 12, 3, 12), + Block.makeCuboidShape(4, 0, 4, 12, 1, 12), + Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), + Block.makeCuboidShape(5, 1, 5, 11, 2, 11), + Block.makeCuboidShape(5, 6, 5, 11, 12, 11), + Block.makeCuboidShape(6.75, 2.5, 0.75, 9.25, 4.75, 2.25), + Block.makeCuboidShape(6.75, 2.5, 13.75, 9.25, 4.75, 15.25), + Block.makeCuboidShape(1, 3.5, 6, 2, 12.75, 7), + Block.makeCuboidShape(0.75, 11.25, 5.75, 2.25, 13.5, 7.25), + Block.makeCuboidShape(0.75, 2.5, 5.75, 2.25, 4.75, 7.25), + Block.makeCuboidShape(0.75, 11.25, 8.75, 2.25, 13.5, 10.25), + Block.makeCuboidShape(0.75, 2.5, 8.75, 2.25, 4.75, 10.25), + Block.makeCuboidShape(1, 3.5, 9, 2, 12.75, 10), + Block.makeCuboidShape(7.5, 6.25, 1.25, 8.5, 7.25, 2.25), + Block.makeCuboidShape(7.5, 6.25, 13.75, 8.5, 7.25, 14.75), + Block.makeCuboidShape(7, 3.5, 14, 9, 7.75, 15), + Block.makeCuboidShape(7, 3.5, 1, 9, 7.75, 2), + Block.makeCuboidShape(6, 2, 11, 10, 4, 15), + Block.makeCuboidShape(6, 2, 1, 10, 4, 5), + Block.makeCuboidShape(1, 2, 6, 5, 4, 10), + Block.makeCuboidShape(1, 12, 6, 7, 15, 10) ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); private static final VoxelShape SHAPE_S = Stream.of( - Block.makeCuboidShape(0, 0, 0, 16, 8, 16), - Block.makeCuboidShape(12, 8, 0, 16, 10, 16), - Block.makeCuboidShape(0, 8, 0, 12, 12, 8), - Block.makeCuboidShape(0, 8, 8, 4, 10, 16), - Block.makeCuboidShape(5, 8, 9, 11, 12, 15), - Block.makeCuboidShape(5, 12, 1, 11, 16, 7) + Block.makeCuboidShape(4, 2, 4, 12, 3, 12), + Block.makeCuboidShape(4, 0, 4, 12, 1, 12), + Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), + Block.makeCuboidShape(5, 1, 5, 11, 2, 11), + Block.makeCuboidShape(5, 6, 5, 11, 12, 11), + Block.makeCuboidShape(13.75, 2.5, 6.75, 15.25, 4.75, 9.25), + Block.makeCuboidShape(0.75, 2.5, 6.75, 2.25, 4.75, 9.25), + Block.makeCuboidShape(9, 3.5, 1, 10, 12.75, 2), + Block.makeCuboidShape(8.75, 11.25, 0.75, 10.25, 13.5, 2.25), + Block.makeCuboidShape(8.75, 2.5, 0.75, 10.25, 4.75, 2.25), + Block.makeCuboidShape(5.75, 11.25, 0.75, 7.25, 13.5, 2.25), + Block.makeCuboidShape(5.75, 2.5, 0.75, 7.25, 4.75, 2.25), + Block.makeCuboidShape(6, 3.5, 1, 7, 12.75, 2), + Block.makeCuboidShape(13.75, 6.25, 7.5, 14.75, 7.25, 8.5), + Block.makeCuboidShape(1.25, 6.25, 7.5, 2.25, 7.25, 8.5), + Block.makeCuboidShape(1, 3.5, 7, 2, 7.75, 9), + Block.makeCuboidShape(14, 3.5, 7, 15, 7.75, 9), + Block.makeCuboidShape(1, 2, 6, 5, 4, 10), + Block.makeCuboidShape(11, 2, 6, 15, 4, 10), + Block.makeCuboidShape(6, 2, 1, 10, 4, 5), + Block.makeCuboidShape(6, 12, 1, 10, 15, 7) ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); private static final VoxelShape SHAPE_W = Stream.of( - Block.makeCuboidShape(0, 0, 0, 16, 8, 16), - Block.makeCuboidShape(0, 8, 12, 16, 10, 16), - Block.makeCuboidShape(8, 8, 0, 16, 12, 12), - Block.makeCuboidShape(0, 8, 0, 8, 10, 4), - Block.makeCuboidShape(1, 8, 5, 7, 12, 11), - Block.makeCuboidShape(9, 12, 5, 15, 16, 11) + Block.makeCuboidShape(4, 2, 4, 12, 3, 12), + Block.makeCuboidShape(4, 0, 4, 12, 1, 12), + Block.makeCuboidShape(6, 2.5, 6, 10, 3.5, 10), + Block.makeCuboidShape(5, 1, 5, 11, 2, 11), + Block.makeCuboidShape(5, 6, 5, 11, 12, 11), + Block.makeCuboidShape(6.75, 2.5, 13.75, 9.25, 4.75, 15.25), + Block.makeCuboidShape(6.75, 2.5, 0.75, 9.25, 4.75, 2.25), + Block.makeCuboidShape(14, 3.5, 9, 15, 12.75, 10), + Block.makeCuboidShape(13.75, 11.25, 8.75, 15.25, 13.5, 10.25), + Block.makeCuboidShape(13.75, 2.5, 8.75, 15.25, 4.75, 10.25), + Block.makeCuboidShape(13.75, 11.25, 5.75, 15.25, 13.5, 7.25), + Block.makeCuboidShape(13.75, 2.5, 5.75, 15.25, 4.75, 7.25), + Block.makeCuboidShape(14, 3.5, 6, 15, 12.75, 7), + Block.makeCuboidShape(7.5, 6.25, 13.75, 8.5, 7.25, 14.75), + Block.makeCuboidShape(7.5, 6.25, 1.25, 8.5, 7.25, 2.25), + Block.makeCuboidShape(7, 3.5, 1, 9, 7.75, 2), + Block.makeCuboidShape(7, 3.5, 14, 9, 7.75, 15), + Block.makeCuboidShape(6, 2, 1, 10, 4, 5), + Block.makeCuboidShape(6, 2, 11, 10, 4, 15), + Block.makeCuboidShape(11, 2, 6, 15, 4, 10), + Block.makeCuboidShape(9, 12, 6, 15, 15, 10) ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); - @Override protected void fillStateContainer(StateContainer.Builder builder) { super.fillStateContainer(builder.add(FACING)); diff --git a/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java index dd6d8d8..c79ae2c 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/StructureGenBlock.java @@ -5,25 +5,110 @@ import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; import com.ticticboooom.mods.mm.registration.MMSetup; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.IBooleanFunction; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; import javax.annotation.Nullable; +import java.util.stream.Stream; public class StructureGenBlock extends Block { public StructureGenBlock() { super(Properties.create(Material.IRON)); + this.setDefaultState(this.getDefaultState().with(FACING, Direction.NORTH)); } + private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + private static final VoxelShape SHAPE_N = Stream.of( + Block.makeCuboidShape(1, 2, 1, 15, 5, 6), + Block.makeCuboidShape(0, 0, 0, 16, 2, 16), + Block.makeCuboidShape(0.5, 2, 6.5, 15.5, 5, 15.5), + Block.makeCuboidShape(0, 5, 6, 16, 6, 16), + Block.makeCuboidShape(4, 6, 7, 15, 14, 13), + Block.makeCuboidShape(1, 5.5, 7, 3, 6.5, 9), + Block.makeCuboidShape(1.25, 11, 7.25, 2.75, 11.25, 8.75), + Block.makeCuboidShape(1, 6, 11, 3, 12.25, 14), + Block.makeCuboidShape(1, 11.25, 6.75, 3, 12.25, 11.25), + Block.makeCuboidShape(0, 2, 0, 1, 3, 6), + Block.makeCuboidShape(15, 2, 0, 16, 3, 6), + Block.makeCuboidShape(0, 2, 6, 1, 5, 7), + Block.makeCuboidShape(15, 2, 6, 16, 5, 7), + Block.makeCuboidShape(15, 2, 15, 16, 5, 16), + Block.makeCuboidShape(0, 2, 15, 1, 5, 16) + ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); + + private static final VoxelShape SHAPE_E = Stream.of( + Block.makeCuboidShape(10, 2, 1, 15, 5, 15), + Block.makeCuboidShape(0, 0, 0, 16, 2, 16), + Block.makeCuboidShape(0.5, 2, 0.5, 9.5, 5, 15.5), + Block.makeCuboidShape(0, 5, 0, 10, 6, 16), + Block.makeCuboidShape(3, 6, 4, 9, 14, 15), + Block.makeCuboidShape(7, 5.5, 1, 9, 6.5, 3), + Block.makeCuboidShape(7.25, 11, 1.25, 8.75, 11.25, 2.75), + Block.makeCuboidShape(2, 6, 1, 5, 12.25, 3), + Block.makeCuboidShape(4.75, 11.25, 1, 9.25, 12.25, 3), + Block.makeCuboidShape(10, 2, 0, 16, 3, 1), + Block.makeCuboidShape(10, 2, 15, 16, 3, 16), + Block.makeCuboidShape(9, 2, 0, 10, 5, 1), + Block.makeCuboidShape(9, 2, 15, 10, 5, 16), + Block.makeCuboidShape(0, 2, 15, 1, 5, 16), + Block.makeCuboidShape(0, 2, 0, 1, 5, 1) + ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); + + private static final VoxelShape SHAPE_S = Stream.of( + Block.makeCuboidShape(1, 2, 10, 15, 5, 15), + Block.makeCuboidShape(0, 0, 0, 16, 2, 16), + Block.makeCuboidShape(0.5, 2, 0.5, 15.5, 5, 9.5), + Block.makeCuboidShape(0, 5, 0, 16, 6, 10), + Block.makeCuboidShape(1, 6, 3, 12, 14, 9), + Block.makeCuboidShape(13, 5.5, 7, 15, 6.5, 9), + Block.makeCuboidShape(13.25, 11, 7.25, 14.75, 11.25, 8.75), + Block.makeCuboidShape(13, 6, 2, 15, 12.25, 5), + Block.makeCuboidShape(13, 11.25, 4.75, 15, 12.25, 9.25), + Block.makeCuboidShape(15, 2, 10, 16, 3, 16), + Block.makeCuboidShape(0, 2, 10, 1, 3, 16), + Block.makeCuboidShape(15, 2, 9, 16, 5, 10), + Block.makeCuboidShape(0, 2, 9, 1, 5, 10), + Block.makeCuboidShape(0, 2, 0, 1, 5, 1), + Block.makeCuboidShape(15, 2, 0, 16, 5, 1) + ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); + + private static final VoxelShape SHAPE_W = Stream.of( + Block.makeCuboidShape(1, 2, 1, 6, 5, 15), + Block.makeCuboidShape(0, 0, 0, 16, 2, 16), + Block.makeCuboidShape(6.5, 2, 0.5, 15.5, 5, 15.5), + Block.makeCuboidShape(6, 5, 0, 16, 6, 16), + Block.makeCuboidShape(7, 6, 1, 13, 14, 12), + Block.makeCuboidShape(7, 5.5, 13, 9, 6.5, 15), + Block.makeCuboidShape(7.25, 11, 13.25, 8.75, 11.25, 14.75), + Block.makeCuboidShape(11, 6, 13, 14, 12.25, 15), + Block.makeCuboidShape(6.75, 11.25, 13, 11.25, 12.25, 15), + Block.makeCuboidShape(0, 2, 15, 6, 3, 16), + Block.makeCuboidShape(0, 2, 0, 6, 3, 1), + Block.makeCuboidShape(6, 2, 15, 7, 5, 16), + Block.makeCuboidShape(6, 2, 0, 7, 5, 1), + Block.makeCuboidShape(15, 2, 0, 16, 5, 1), + Block.makeCuboidShape(15, 2, 15, 16, 5, 16) + ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get(); + @Override public boolean hasTileEntity(BlockState state) { return true; @@ -39,10 +124,37 @@ public class StructureGenBlock extends Block { public ActionResultType onBlockActivated(BlockState state, World level, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult traceResult) { if (!level.isRemote()) { TileEntity blockEntity = level.getTileEntity(pos); - if (blockEntity instanceof ControllerBlockEntity) { + if (blockEntity instanceof StructureGenBlockEntity) { NetworkHooks.openGui(((ServerPlayerEntity) player), (StructureGenBlockEntity)blockEntity, pos); } } return ActionResultType.SUCCESS; } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder.add(FACING)); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + return this.getDefaultState().with(FACING, ctx.getPlacementHorizontalFacing().getOpposite()); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { + switch (state.get(FACING)) { + case NORTH: + return SHAPE_N; + case EAST: + return SHAPE_E; + case SOUTH: + return SHAPE_S; + case WEST: + return SHAPE_W; + default: + throw new IllegalStateException("Invalid State"); + } + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java b/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java index cd4f09e..a7e8ee3 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/container/StructureGenBlockContainer.java @@ -1,19 +1,40 @@ package com.ticticboooom.mods.mm.block.container; +import com.ticticboooom.mods.mm.block.container.slot.StructureDeviceSlot; import com.ticticboooom.mods.mm.block.tile.ProjectorBlockEntity; import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; import com.ticticboooom.mods.mm.registration.MMSetup; +import lombok.Getter; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; +import net.minecraftforge.items.ItemStackHandler; public class StructureGenBlockContainer extends Container { + @Getter private StructureGenBlockEntity tile; - public StructureGenBlockContainer(int windowId, StructureGenBlockEntity tile) { + public StructureGenBlockContainer(int windowId, PlayerInventory inv, StructureGenBlockEntity tile) { super(MMSetup.STRUCTURE_CONTAINER.get(), windowId); this.tile = tile; + + this.addSlot(new StructureDeviceSlot(tile.getInv(), 0, 151, -14)); + + this.tile = tile; + int playerOffsetX = 8; + int playerOffsetY = 121; + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 9; i++) { + this.addSlot(new Slot(inv, 9 + (j * 9 + i), i * 18 + playerOffsetX, j * 18 + playerOffsetY)); + } + } + + for (int i = 0; i < 9; i++) { + this.addSlot(new Slot(inv, i, 8 + (i * 18), 179)); + } } @Override @@ -22,6 +43,30 @@ public class StructureGenBlockContainer extends Container { } public StructureGenBlockContainer(int w, PlayerInventory inv, PacketBuffer buf) { - this(w, (StructureGenBlockEntity) inv.player.world.getTileEntity(buf.readBlockPos())); + this(w, inv, (StructureGenBlockEntity) inv.player.world.getTileEntity(buf.readBlockPos())); + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity p_82846_1_, int index) { + ItemStack itemStack = ItemStack.EMPTY; + Slot slot = this.getSlot(index); + if (slot.getHasStack()) { + ItemStack itemStack1 = slot.getStack(); + itemStack = itemStack1.copy(); + if (index < 1) { + if (!this.mergeItemStack(itemStack1, 1, this.inventorySlots.size(), true)) { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemStack1, 0, 1, false)) { + return ItemStack.EMPTY; + } + + if (itemStack1.isEmpty()) { + slot.putStack(ItemStack.EMPTY); + } else { + slot.onSlotChanged(); + } + } + return itemStack; } } diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java b/src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java new file mode 100644 index 0000000..3ee4662 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/block/container/slot/StructureDeviceSlot.java @@ -0,0 +1,17 @@ +package com.ticticboooom.mods.mm.block.container.slot; + +import com.ticticboooom.mods.mm.registration.MMSetup; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; + +public class StructureDeviceSlot extends Slot { + public StructureDeviceSlot(IInventory inventoryIn, int index, int xPosition, int yPosition) { + super(inventoryIn, index, xPosition, yPosition); + } + + @Override + public boolean isItemValid(ItemStack stack) { + return stack.getItem() == MMSetup.STRUCTURE_DEVICE.get(); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java index d39ca8a..ad7a152 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/tile/StructureGenBlockEntity.java @@ -1,8 +1,10 @@ package com.ticticboooom.mods.mm.block.tile; import com.ticticboooom.mods.mm.block.container.StructureGenBlockContainer; +import com.ticticboooom.mods.mm.inventory.ItemStackInventory; import com.ticticboooom.mods.mm.model.ProcessUpdate; import com.ticticboooom.mods.mm.registration.MMSetup; +import lombok.Getter; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -16,6 +18,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nullable; @@ -24,6 +27,11 @@ public class StructureGenBlockEntity extends UpdatableTile implements ITickableT super(MMSetup.STRUCTURE_TILE.get()); } + + @Getter + private ItemStackHandler handler = new ItemStackHandler(1); + @Getter + private ItemStackInventory inv = new ItemStackInventory(handler); private ItemStack device = ItemStack.EMPTY; @Override @@ -55,6 +63,6 @@ public class StructureGenBlockEntity extends UpdatableTile implements ITickableT @Nullable @Override public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { - return new StructureGenBlockContainer(p_createMenu_1_, this); + return new StructureGenBlockContainer(p_createMenu_1_, p_createMenu_2_, this); } } diff --git a/src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java b/src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java new file mode 100644 index 0000000..41ca39e --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/client/MMRenderTypes.java @@ -0,0 +1,31 @@ +package com.ticticboooom.mods.mm.client; + +import net.minecraft.client.renderer.RenderState; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.vertex.VertexFormat; +import org.lwjgl.opengl.GL11; + +import java.util.OptionalDouble; + +public class MMRenderTypes extends RenderType { + private static final RenderState.LineState THICK_LINES = new RenderState.LineState(OptionalDouble.of(3.0D)); + + + public static final RenderType OUTLINE = makeType("MMOutline", + DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256, + RenderType.State.getBuilder() + .line(THICK_LINES) + .layer(RenderState.NO_LAYERING) + .transparency(RenderState.TRANSLUCENT_TRANSPARENCY) + .texture(NO_TEXTURE) + .depthTest(DEPTH_LEQUAL) + .cull(CULL_DISABLED) + .lightmap(LIGHTMAP_DISABLED) + .writeMask(COLOR_WRITE) + .build(false)); + + public MMRenderTypes(String nameIn, VertexFormat formatIn, int drawModeIn, int bufferSizeIn, boolean useDelegateIn, boolean needsSortingIn, Runnable setupTaskIn, Runnable clearTaskIn) { + super(nameIn, formatIn, drawModeIn, bufferSizeIn, useDelegateIn, needsSortingIn, setupTaskIn, clearTaskIn); + } +} 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 index 9413c39..301edc5 100644 --- 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 @@ -13,10 +13,12 @@ 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.java.games.input.Mouse; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.DirectionalBlock; import net.minecraft.client.Minecraft; +import net.minecraft.client.MouseHelper; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.crafting.Ingredient; @@ -50,10 +52,13 @@ public class MachineStructureRecipeCategory implements IRecipeCategory tagIndexes = new HashMap<>(); private Map tagIndexCounter = new HashMap<>(); + private float scaleFactor = 12F; public MachineStructureRecipeCategory(IJeiHelpers helpers, ControllerBlock controller) { this.helpers = helpers; this.controller = controller; @@ -139,8 +144,13 @@ public class MachineStructureRecipeCategory implements IRecipeCategory= tag.getAllElements().size()){ + if (index >= tag.getAllElements().size()) { index = 0; } tagIndexes.put(i, index); @@ -195,7 +205,7 @@ public class MachineStructureRecipeCategory implements IRecipeCategory { - public StructureGenBlockContainerScreen(StructureGenBlockContainer p_i51105_1_, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { - super(p_i51105_1_, p_i51105_2_, p_i51105_3_); - } + private final StructureGenBlockContainer cont; + public StructureGenBlockContainerScreen(StructureGenBlockContainer cont, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { + super(cont, p_i51105_2_, p_i51105_3_); + this.cont = cont; + } @Override public void render(MatrixStack ms, int p_230430_2_, int p_230430_3_, float p_230430_4_) { super.render(ms, p_230430_2_, p_230430_3_, p_230430_4_); + } - + @Override + protected void drawGuiContainerForegroundLayer(MatrixStack ms, int x, int y) { + this.minecraft.fontRenderer.func_238418_a_(new StringTextComponent("Structure Generator"), 10, -10, 176, 0xfefefe); + drawString(ms, this.minecraft.fontRenderer, "Inventory", 7, 107, 0xfefefe); + drawCenteredString(ms, this.minecraft.fontRenderer, "COPY TO CLIPBOARD", 80, 50, 0xfefefe); } @Override protected void drawGuiContainerBackgroundLayer(MatrixStack ms, float partialTicks, int x, int y) { + this.renderBackground(ms); Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/port_gui.png")); - blit(ms, guiLeft, guiTop, 0, 0, 175, 256); + blit(ms, guiLeft, guiTop - 20, 0, 0, 175, 256); + + Minecraft.getInstance().textureManager.bindTexture(new ResourceLocation(MM.ID, "textures/gui/slot_parts.png")); + blit(ms, guiLeft + 150, guiTop - 15, 0, 26, 18, 18); + } + + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + int x = (int)mouseX - guiLeft; + int y = (int)mouseY - guiTop; + + if (x > 0 && x < 176 && y > 40 && y < 60){ + StructureHelper.copyToClickBoard(cont.getTile().getInv().getStackInSlot(0).getTag(), cont.getTile().getWorld()); + } + return super.mouseClicked(mouseX, mouseY, button); } } diff --git a/src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java new file mode 100644 index 0000000..deb3d25 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/client/ter/StructureGenTileEntityRenderer.java @@ -0,0 +1,96 @@ +package com.ticticboooom.mods.mm.client.ter; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.ticticboooom.mods.mm.block.tile.StructureGenBlockEntity; +import com.ticticboooom.mods.mm.client.MMRenderTypes; +import com.ticticboooom.mods.mm.helper.NBTHelper; +import com.ticticboooom.mods.mm.registration.MMSetup; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Quaternion; + +public class StructureGenTileEntityRenderer extends TileEntityRenderer { + public StructureGenTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { + super(rendererDispatcherIn); + } + + @Override + public void render(StructureGenBlockEntity tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) { + ItemStack stackInSlot = tileEntityIn.getHandler().getStackInSlot(0); + if (stackInSlot.isEmpty()) { + return; + } + + if (stackInSlot.getItem() != MMSetup.STRUCTURE_DEVICE.get()) { + return; + } + + if (stackInSlot.getTag() == null){ + return; + } + + if (stackInSlot.getTag().contains("pos1") && stackInSlot.getTag().contains("pos2")) { + CompoundNBT pos1c = stackInSlot.getTag().getCompound("pos1"); + CompoundNBT pos2c = stackInSlot.getTag().getCompound("pos2"); + + BlockPos pos1 = NBTHelper.fromCompound(pos1c); + BlockPos pos2 = NBTHelper.fromCompound(pos2c); + BlockPos tilePos = tileEntityIn.getPos(); + + pos1 = pos1.subtract(tilePos); + pos2 = pos2.subtract(tilePos); + + IVertexBuilder builder = bufferIn.getBuffer(MMRenderTypes.OUTLINE); + matrixStackIn.push(); + Matrix4f mat = matrixStackIn.getLast().getMatrix(); + + int x = Math.min(pos1.getX(), pos2.getX()); + int y = Math.min(pos1.getY(), pos2.getY()); + int z = Math.min(pos1.getZ(), pos2.getZ()); + int dx = Math.max(pos1.getX(), pos2.getX()) + 1; + int dy = Math.max(pos1.getY(), pos2.getY()) + 1; + int dz = Math.max(pos1.getZ(), pos2.getZ()) + 1; + + int R = 255, G = 255, B = 255, A = 70; + builder.pos(mat, x , y, z).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, y, z).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, y, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, x, y, dz).color(R, G, B, A).endVertex(); + + builder.pos(mat, x , dy, z).color(R, G, B, A).endVertex(); + builder.pos(mat, x, dy, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, dy, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, dy, z).color(R, G, B, A).endVertex(); + + builder.pos(mat, x , y, z).color(R, G, B, A).endVertex(); + builder.pos(mat, x, dy, z).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, dy, z).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, y, z).color(R, G, B, A).endVertex(); + + builder.pos(mat, x , y, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, y, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, dy, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, x, dy, dz).color(R, G, B, A).endVertex(); + + builder.pos(mat, dx , y, z).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, y, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, dy, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, dx, dy, z).color(R, G, B, A).endVertex(); + + builder.pos(mat, x , y, z).color(R, G, B, A).endVertex(); + builder.pos(mat, x, y, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, x, dy, dz).color(R, G, B, A).endVertex(); + builder.pos(mat, x, dy, z).color(R, G, B, A).endVertex(); + + matrixStackIn.pop(); + } + } +} 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 index 895273c..d633a7f 100644 --- a/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java +++ b/src/main/java/com/ticticboooom/mods/mm/client/util/GuiBlockRenderBuilder.java @@ -15,6 +15,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Vector3f; import net.minecraft.world.IBlockReader; @@ -97,11 +98,12 @@ public class GuiBlockRenderBuilder { } private void transformMatrix(MatrixStack ms) { - ms.scale(scale.getX(), scale.getY(), scale.getZ()); + ms.scale(12, -12, 12); ms.translate(prePosition.getX(), prePosition.getY(), prePosition.getZ()); for (Quaternion quaternion : orderedRotation) { ms.rotate(quaternion); } + ms.scale(scale.getX(), -scale.getY(), scale.getZ()); 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 9bfc92b..cb53c2f 100644 --- a/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java +++ b/src/main/java/com/ticticboooom/mods/mm/data/MachineStructureRecipe.java @@ -340,7 +340,7 @@ public class MachineStructureRecipe implements IRecipe { for (MachineStructureRecipeKeyModel model : models) { if (!model.getBlock().equals("")) { if (RLUtils.isRL(model.getBlock())) { - if (!ForgeRegistries.ITEMS.containsKey(RLUtils.toRL(model.getBlock()))) { + if (!ForgeRegistries.BLOCKS.containsKey(RLUtils.toRL(model.getBlock()))) { throw new InvalidStructureDefinitionException("Block: " + model.getBlock() + " is not an existing block in the game"); } } else { diff --git a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMBlockStateProvider.java b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMBlockStateProvider.java index 6824b63..de79bde 100644 --- a/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMBlockStateProvider.java +++ b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMBlockStateProvider.java @@ -6,7 +6,9 @@ import com.ticticboooom.mods.mm.block.MachinePortBlock; import com.ticticboooom.mods.mm.helper.RLUtils; import com.ticticboooom.mods.mm.registration.MMLoader; import com.ticticboooom.mods.mm.registration.MMSetup; +import net.minecraft.block.Block; import net.minecraft.block.DirectionalBlock; +import net.minecraft.block.HorizontalBlock; import net.minecraft.client.renderer.RenderType; import net.minecraft.data.DataGenerator; import net.minecraft.util.Direction; @@ -50,8 +52,9 @@ public class MMBlockStateProvider extends BlockStateProvider { simpleBlock(port.get(), new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + port.getId().getPath()))); } - simpleBlock(MMSetup.PROJECTOR_BLOCK.get(), new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/projector"))); - simpleBlock(MMSetup.STRUCTURE_BLOCK.get(), new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/config_generator"))); + directionalState(MMSetup.PROJECTOR_BLOCK.get()); + + directionalState(MMSetup.STRUCTURE_BLOCK.get()); } public void dynamicBlockNorthOverlay(ResourceLocation loc, ResourceLocation baseTexture, ResourceLocation overlayTexture) { @@ -127,4 +130,13 @@ public class MMBlockStateProvider extends BlockStateProvider { ) .end(); } + + private void directionalState(Block block){ + VariantBlockStateBuilder variantBuilder = getVariantBuilder(block); + variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.NORTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(0).addModel(); + variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.SOUTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(180).addModel(); + variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.EAST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(90).addModel(); + variantBuilder.partialState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.WEST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + block.getRegistryName().getPath()))).rotationY(270).addModel(); + + } } 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 08e00a7..302cd90 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 @@ -34,7 +34,7 @@ public class MMItemModelProvider extends ItemModelProvider { this.getBuilder(MMSetup.BLUEPRINT.getId().getPath()).parent(new ModelFile.UncheckedModelFile("item/generated")).texture("layer0", "item/blueprint"); this.getBuilder(MMSetup.STRUCTURE_DEVICE.getId().getPath()).parent(new ModelFile.UncheckedModelFile("item/generated")).texture("layer0", "item/scanning_tool"); - this.getBuilder(MMSetup.STRUCTURE_ITEM.getId().getPath()).parent(new ModelFile.UncheckedModelFile(RLUtils.toRL(MM.ID + ":block/config_generator"))); + this.getBuilder(MMSetup.STRUCTURE_ITEM.getId().getPath()).parent(new ModelFile.UncheckedModelFile(RLUtils.toRL(MM.ID + ":block/structure_generator"))); this.getBuilder(MMSetup.PROJECTOR_ITEM.getId().getPath()).parent(new ModelFile.UncheckedModelFile(RLUtils.toRL(MM.ID + ":block/" + MMSetup.PROJECTOR_BLOCK.getId().getPath()))); } } \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java index e9f33ab..f218290 100644 --- a/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java +++ b/src/main/java/com/ticticboooom/mods/mm/helper/NBTHelper.java @@ -12,4 +12,11 @@ public class NBTHelper { result.putInt("z", pos.getZ()); return result; } + + public static BlockPos fromCompound(CompoundNBT nbt) { + int x = nbt.getInt("x"); + int y = nbt.getInt("y"); + int z = nbt.getInt("z"); + return new BlockPos(x, y, z); + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java new file mode 100644 index 0000000..24d3ed7 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/helper/StructureHelper.java @@ -0,0 +1,124 @@ +package com.ticticboooom.mods.mm.helper; + +import com.google.gson.*; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.JsonOps; +import com.ticticboooom.mods.mm.block.ControllerBlock; +import com.ticticboooom.mods.mm.registration.MMLoader; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3i; +import net.minecraft.world.World; +import net.minecraftforge.fml.RegistryObject; + +import java.util.*; + +public class StructureHelper { + static String allChars; + + static { + int[] codePoints = new int[0x110000]; + for (int i = 0; i < codePoints.length; i++) { + + codePoints[i] = i; + } + + allChars = new String(codePoints, 0, codePoints.length); + } + + private static Gson GSON = null; + + public static void copyToClickBoard(CompoundNBT tag, World world) { + if (tag == null) { + return; + } + + if (!tag.contains("pos1") || !tag.contains("pos2")) { + return; + } + + BlockPos pos1 = NBTHelper.fromCompound(tag.getCompound("pos1")); + BlockPos pos2 = NBTHelper.fromCompound(tag.getCompound("pos2")); + + int x = Math.min(pos1.getX(), pos2.getX()); + int y = Math.min(pos1.getY(), pos2.getY()); + int z = Math.min(pos1.getZ(), pos2.getZ()); + int dx = Math.max(pos1.getX(), pos2.getX()); + int dy = Math.max(pos1.getY(), pos2.getY()); + int dz = Math.max(pos1.getZ(), pos2.getZ()); + + BlockPos minPos = new BlockPos(x, y, z); + BlockPos maxPos = new BlockPos(dx, dy, dz); + + List> layout = new ArrayList<>(); + Map legend = new HashMap<>(); + Map legendLookup = new HashMap<>(); + + char index = 33; + + for (int yi = minPos.getY(); yi <= maxPos.getY(); yi++) { + ArrayList strings = new ArrayList<>(); + for (int zi = minPos.getZ(); zi <= maxPos.getZ(); zi++) { + StringBuilder row = new StringBuilder(); + for (int xi = minPos.getX(); xi <= maxPos.getX(); xi++) { + BlockState state = world.getBlockState(new BlockPos(xi, yi, zi)); + ResourceLocation registryName = state.getBlock().getRegistryName(); + + if (state.isAir()) { + row.append(" "); + continue; + } + + if (state.getBlock() instanceof ControllerBlock) { + row.append('C'); + continue; + } + + if (!legendLookup.containsKey(registryName)) { + legend.put(index, registryName); + legendLookup.put(registryName, index); + index++; + } + row.append(legendLookup.get(registryName)); + } + strings.add(row.toString()); + } + layout.add(strings); + } + + JsonObject jsonObject = toJson(legend, layout); + String s = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() + .create().toJson(jsonObject); + Minecraft.getInstance().keyboardListener.setClipboardString(s); + } + + private static JsonObject toJson(Map legend, List> layout) { + JsonObject result = new JsonObject(); + result.addProperty("type", "masterfulmachinery:machine_structure"); + result.addProperty("id", "chance_this"); + result.addProperty("controllerId", "chance_this"); + result.addProperty("name", "Change This"); + + DataResult apply = JsonOps.INSTANCE.withEncoder(Codec.list(Codec.list(Codec.STRING))).apply(layout); + JsonArray layoutJson = apply.result().get().getAsJsonArray(); + + result.add("layout", layoutJson); + JsonObject legendJson = new JsonObject(); + for (Map.Entry entry : legend.entrySet()) { + JsonObject inner = new JsonObject(); + inner.addProperty("block", entry.getValue().toString()); + legendJson.add(entry.getKey().toString(), inner); + } + + result.add("legend", legendJson); + + return result; + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMStarlightTransmission.java b/src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMStarlightReceiver.java similarity index 57% rename from src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMStarlightTransmission.java rename to src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMStarlightReceiver.java index ac3dcd9..fb14e35 100644 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMStarlightTransmission.java +++ b/src/main/java/com/ticticboooom/mods/mm/inventory/astral/MMStarlightReceiver.java @@ -1,18 +1,21 @@ package com.ticticboooom.mods.mm.inventory.astral; +import hellfirepvp.astralsorcery.common.starlight.IStarlightReceiver; import hellfirepvp.astralsorcery.common.starlight.IStarlightTransmission; +import hellfirepvp.astralsorcery.common.starlight.transmission.ITransmissionReceiver; import hellfirepvp.astralsorcery.common.starlight.transmission.base.SimplePrismTransmissionNode; +import hellfirepvp.astralsorcery.common.starlight.transmission.base.SimpleTransmissionReceiver; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import javax.annotation.Nonnull; -public class MMStarlightTransmission implements IStarlightTransmission { +public class MMStarlightReceiver implements IStarlightReceiver { private final World world; private final BlockPos pos; - public MMStarlightTransmission(World world, BlockPos pos) { + public MMStarlightReceiver(World world, BlockPos pos) { this.world = world; this.pos = pos; } @@ -31,7 +34,7 @@ public class MMStarlightTransmission implements IStarlightTransmission sourcesToThis = new HashSet<>(); + + public MMTransmissionReceiver(BlockPos pos) { + + this.pos = pos; + } + + @Override + public void onStarlightReceive(World world, IWeakConstellation iWeakConstellation, double v) { + + } + + @Override + public BlockPos getLocationPos() { + return pos; + } + + @Override + public void notifySourceLink(World world, BlockPos blockPos) { + sourcesToThis.add(blockPos); + } + + @Override + public void notifySourceUnlink(World world, BlockPos blockPos) { + sourcesToThis.remove(blockPos); + } + + @Override + public boolean notifyBlockChange(World world, BlockPos blockPos) { + return false; + } + + @Override + public List getSources() { + return new LinkedList<>(sourcesToThis); + } + + @Override + public TransmissionProvider getProvider() { + return null; + } + + @Override + public void readFromNBT(CompoundNBT compoundNBT) { + + } + + @Override + public void writeToNBT(CompoundNBT compoundNBT) { + + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java b/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java index 8bee775..5e93402 100644 --- a/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java +++ b/src/main/java/com/ticticboooom/mods/mm/item/StructureGenSelectionDevice.java @@ -11,6 +11,7 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; public class StructureGenSelectionDevice extends Item { @@ -29,14 +30,18 @@ public class StructureGenSelectionDevice extends Item { } if (!tag.contains("pos1") && !tag.contains("pos2")) { tag.put("pos1", NBTHelper.toCompound(clickedPos)); + ctx.getPlayer().sendStatusMessage(new StringTextComponent("Set Pos 1"), true); } else if (tag.contains("pos1") && !tag.contains("pos2")) { tag.put("pos2", NBTHelper.toCompound(clickedPos)); + ctx.getPlayer().sendStatusMessage(new StringTextComponent("Set Pos 2"), true); } else { if (tag.contains("pos2")) { tag.remove("pos2"); } tag.put("pos1", NBTHelper.toCompound(clickedPos)); + ctx.getPlayer().sendStatusMessage(new StringTextComponent("Set Pos 1"), true); } + iih.setTag(tag); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java b/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java index 6b145f8..0bece93 100644 --- a/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java +++ b/src/main/java/com/ticticboooom/mods/mm/registration/MMSetup.java @@ -33,8 +33,8 @@ public class MMSetup { public static final RegistryObject PROJECTOR_ITEM = ITEMS_REG.register("projector", () -> new BlockItem(PROJECTOR_BLOCK.get(), new Item.Properties().group(MMLoader.MASTERFUL_ITEM_GROUP))); - public static final RegistryObject> STRUCTURE_TILE = TILES_REG.register("structure_generator", () -> TileEntityType.Builder.create(StructureGenBlockEntity::new).build(null)); public static final RegistryObject STRUCTURE_BLOCK = BLOCKS_REG.register("structure_generator", StructureGenBlock::new); + public static final RegistryObject> STRUCTURE_TILE = TILES_REG.register("structure_generator", () -> TileEntityType.Builder.create(StructureGenBlockEntity::new, STRUCTURE_BLOCK.get()).build(null)); public static final RegistryObject> STRUCTURE_CONTAINER = CONTAINER_REG.register("structure_generator", () -> IForgeContainerType.create(StructureGenBlockContainer::new)); public static final RegistryObject STRUCTURE_ITEM = ITEMS_REG.register("structure_generator", () -> new BlockItem(STRUCTURE_BLOCK.get(), new Item.Properties().group(MMLoader.MASTERFUL_ITEM_GROUP))); public static final RegistryObject STRUCTURE_DEVICE = ITEMS_REG.register("structure_gen_device", StructureGenSelectionDevice::new); diff --git a/src/main/resources/assets/masterfulmachinery/models/block/config_generator.json b/src/main/resources/assets/masterfulmachinery/models/block/structure_generator.json similarity index 100% rename from src/main/resources/assets/masterfulmachinery/models/block/config_generator.json rename to src/main/resources/assets/masterfulmachinery/models/block/structure_generator.json diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.afdesign b/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.afdesign new file mode 100644 index 0000000000000000000000000000000000000000..d1acdfac97af6b5c1318177ea40fb43ef0dac2ad GIT binary patch literal 60200 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 VBIoPRxQLy5_x$1awGqjA{{}wRbV>jK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.png b/src/main/resources/assets/masterfulmachinery/textures/gui/gui_large_gen.png new file mode 100644 index 0000000000000000000000000000000000000000..b31bb3ff76556939bbf6b6f97d09e13f640aaa79 GIT binary patch literal 14992 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 literal 0 HcmV?d00001