From 4e3a11477e4cdc80281a867d861d58ac68b3745a Mon Sep 17 00:00:00 2001 From: ticticboooom Date: Sun, 9 May 2021 13:36:28 +0100 Subject: [PATCH] initial CF beta release --- build.gradle | 10 ++ .../controllers/basic.json | 15 +- gradle.properties | 3 +- .../java/com/ticticboooom/mods/mm/MM.java | 8 +- .../mods/mm/block/ControllerBlock.java | 18 ++- .../mods/mm/block/MachinePortBlock.java | 42 ++++++ .../block/container/PortBlockContainer.java | 43 +++++- .../mm/block/tile/ControllerBlockEntity.java | 25 +++- .../mm/block/tile/MachinePortBlockEntity.java | 49 ++++++- .../screen/PortBlockContainerScreen.java | 19 ++- .../mods/mm/client/util/FluidRenderer.java | 129 ++++++++++++++++++ .../mods/mm/data/MachineProcessRecipe.java | 5 +- .../mm/datagen/gen/MMBlockStateProvider.java | 17 ++- .../mm/datagen/gen/MMItemModelProvider.java | 33 +++++ .../mods/mm/helper/InvHelper.java | 11 ++ .../mods/mm/inventory/ItemStackInventory.java | 62 +++++++++ .../mm/inventory/PortEnergyInventory.java | 12 +- .../mods/mm/inventory/PortFluidInventory.java | 31 +++-- .../mods/mm/network/PacketHandler.java | 22 +++ .../packets/TileClientUpdatePacket.java | 43 ++++++ .../mods/mm/ports/parser/FluidPortParser.java | 1 + .../mods/mm/ports/state/IPortState.java | 1 + .../mods/mm/ports/state/ItemPortState.java | 20 ++- .../mm/ports/storage/EnergyPortStorage.java | 42 ++++++ .../mm/ports/storage/FluidPortStorage.java | 41 ++++++ .../mods/mm/ports/storage/IPortStorage.java | 12 ++ .../mm/ports/storage/ItemPortStorage.java | 78 ++++++++++- .../mods/mm/registration/MMLoader.java | 14 +- .../textures/gui/port_gui.png | Bin 0 -> 3221 bytes .../recipes/process/test1.json | 2 +- 30 files changed, 746 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMItemModelProvider.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java create mode 100644 src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java create mode 100644 src/main/resources/assets/masterfulmachinery/textures/gui/port_gui.png diff --git a/build.gradle b/build.gradle index 5b44341..2e715de 100644 --- a/build.gradle +++ b/build.gradle @@ -119,6 +119,10 @@ minecraft { // Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } + +repositories { + maven { url 'https://modmaven.dev/' } +} dependencies { // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. @@ -127,6 +131,12 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.18' minecraft 'net.minecraftforge:forge:1.16.5-36.1.16' implementation 'com.github.marschall:memoryfilesystem:2.1.0' + + runtimeOnly 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 + // 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/demo_config/masterful_machinery/controllers/basic.json b/demo_config/masterful_machinery/controllers/basic.json index 1a1752d..b7308ef 100644 --- a/demo_config/masterful_machinery/controllers/basic.json +++ b/demo_config/masterful_machinery/controllers/basic.json @@ -4,7 +4,20 @@ { "type": "masterfulmachinery:items", "data": { - "slots": 18 + "rows": 3, + "columns": 3 + } + }, + { + "type": "masterfulmachinery:energy", + "data": { + "capacity": 30000 + } + }, + { + "type": "masterfulmachinery:fluids", + "data": { + "capacity": 10000 } } ] diff --git a/gradle.properties b/gradle.properties index 878bf1f..922c412 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,5 @@ # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false \ No newline at end of file +org.gradle.daemon=false +mekanism_version=1.16.5-10.0.20.447 \ 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 32eaa82..5a11e58 100644 --- a/src/main/java/com/ticticboooom/mods/mm/MM.java +++ b/src/main/java/com/ticticboooom/mods/mm/MM.java @@ -12,6 +12,8 @@ import com.ticticboooom.mods.mm.datagen.MMPackFinder; import com.ticticboooom.mods.mm.datagen.MemoryDataGeneratorFactory; import com.ticticboooom.mods.mm.datagen.PackType; import com.ticticboooom.mods.mm.datagen.gen.MMBlockStateProvider; +import com.ticticboooom.mods.mm.datagen.gen.MMItemModelProvider; +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.RecipeTypes; @@ -51,6 +53,7 @@ public class MM { MMPorts.init(); MMLoader.load(); MemoryDataGeneratorFactory.init(); + PacketHandler.init(); registerDataGen(); IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); MMLoader.BLOCKS_REG.register(bus); @@ -70,6 +73,7 @@ public class MM { ExistingFileHelper existingFileHelper = new ExistingFileHelper(ImmutableList.of(), ImmutableSet.of(), false); generator.addProvider(new MMBlockStateProvider(generator, existingFileHelper)); + generator.addProvider(new MMItemModelProvider(generator, existingFileHelper)); } public static void generate() { @@ -92,8 +96,8 @@ public class MM { for (RegistryObject> container : MMLoader.CONTAINERS) { ScreenManager.register(container.get(), ControllerBlockContainerScreen::new); } - for (RegistryObject> container : MMLoader.PORT_CONTAINERS) { - ScreenManager.register(container.get(), PortBlockContainerScreen::new); + for (RegistryObject> container : MMLoader.PORT_CONTAINERS) { + ScreenManager.register((ContainerType) container.get(), PortBlockContainerScreen::new); } for (RegistryObject block : MMLoader.BLOCKS) { RenderTypeLookup.setRenderLayer(block.get(), layer -> layer == RenderType.solid() || layer == RenderType.translucent()); diff --git a/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java index dd2d753..8fd40a4 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/ControllerBlock.java @@ -4,13 +4,17 @@ import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.DirectionalBlock; import net.minecraft.block.material.Material; import net.minecraft.client.entity.player.AbstractClientPlayerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.StateContainer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; 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; @@ -22,7 +26,7 @@ import net.minecraftforge.fml.network.NetworkHooks; import javax.annotation.Nullable; -public class ControllerBlock extends Block { +public class ControllerBlock extends DirectionalBlock { private RegistryObject> type; @@ -31,6 +35,18 @@ public class ControllerBlock extends Block { .harvestLevel(1) .harvestTool(ToolType.PICKAXE)); this.type = type; + this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + @Override + protected void createBlockStateDefinition(StateContainer.Builder builder) { + super.createBlockStateDefinition(builder.add(DirectionalBlock.FACING)); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } @Override diff --git a/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java b/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java index 245b887..48c927e 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/MachinePortBlock.java @@ -1,13 +1,31 @@ package com.ticticboooom.mods.mm.block; +import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; +import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; +import com.ticticboooom.mods.mm.inventory.ItemStackInventory; +import com.ticticboooom.mods.mm.ports.storage.ItemPortStorage; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.inventory.ItemStackHelper; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nullable; @@ -29,4 +47,28 @@ public class MachinePortBlock extends Block { public TileEntity createTileEntity(BlockState state, IBlockReader world) { return type.get().create(); } + + @Override + public ActionResultType use(BlockState state, World level, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult traceResult) { + if (!level.isClientSide()) { + TileEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof MachinePortBlockEntity) { + NetworkHooks.openGui(((ServerPlayerEntity) player), (MachinePortBlockEntity)blockEntity, pos); + } + } + return ActionResultType.SUCCESS; + } + + + @Override + public void onRemove(BlockState state, World world, BlockPos pos, BlockState state1, boolean p_196243_5_) { + TileEntity tile = world.getBlockEntity(pos); + if (tile instanceof MachinePortBlockEntity){ + Object o = ((MachinePortBlockEntity) tile).getStorage().getLO().orElse(null); + if (o instanceof ItemStackHandler) { + InventoryHelper.dropContents(world, pos, new ItemStackInventory((ItemStackHandler) o)); + } + } + super.onRemove(state, world, pos, state1, p_196243_5_); + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java b/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java index d78aadf..a23c10c 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/container/PortBlockContainer.java @@ -2,25 +2,33 @@ package com.ticticboooom.mods.mm.block.container; import com.ticticboooom.mods.mm.block.tile.ControllerBlockEntity; import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; +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.ContainerType; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; +import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nullable; public class PortBlockContainer extends Container { + private final PlayerInventory inv; + @Getter private MachinePortBlockEntity tile; - protected PortBlockContainer(@Nullable ContainerType p_i50105_1_, int windowId, MachinePortBlockEntity tile) { + public PortBlockContainer(@Nullable ContainerType p_i50105_1_, int windowId, PlayerInventory inv, MachinePortBlockEntity tile) { super(p_i50105_1_, windowId); + this.inv = inv; + tile.getStorage().setupContainer(this, inv, tile); this.tile = tile; } public PortBlockContainer(ContainerType container, int windowId, PlayerInventory player, PacketBuffer buf) { - this(container, windowId, (MachinePortBlockEntity) player.player.level.getBlockEntity(buf.readBlockPos())); + this(container, windowId, player, (MachinePortBlockEntity) player.player.level.getBlockEntity(buf.readBlockPos())); } @Override @@ -28,5 +36,36 @@ public class PortBlockContainer extends Container { return true; } + @Override + public Slot addSlot(Slot p_75146_1_) { + return super.addSlot(p_75146_1_); + } + @Override + public ItemStack quickMoveStack(PlayerEntity p_82846_1_, int index) { + ItemStack itemStack = ItemStack.EMPTY; + Object o = tile.getStorage().getLO().orElse(null); + if (o instanceof ItemStackHandler) { + ItemStackHandler handler = ((ItemStackHandler) o); + Slot slot = this.getSlot(index); + if (slot.hasItem()) { + ItemStack itemStack1 = slot.getItem(); + itemStack = itemStack1.copy(); + if (index < handler.getSlots()) { + if (!this.moveItemStackTo(itemStack1, handler.getSlots(), inv.getContainerSize(), true)) { + return ItemStack.EMPTY; + } + } else if (!this.moveItemStackTo(itemStack1, 0, handler.getSlots(), false)) { + return ItemStack.EMPTY; + } + + if (itemStack1.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + } + } + return itemStack; + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java index 3afbd50..1d51f36 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/tile/ControllerBlockEntity.java @@ -4,14 +4,18 @@ import com.ticticboooom.mods.mm.block.container.ControllerBlockContainer; import com.ticticboooom.mods.mm.data.MachineProcessRecipe; import com.ticticboooom.mods.mm.data.MachineStructureRecipe; import com.ticticboooom.mods.mm.model.ProcessUpdate; +import com.ticticboooom.mods.mm.network.PacketHandler; +import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; import com.ticticboooom.mods.mm.ports.storage.IPortStorage; import com.ticticboooom.mods.mm.registration.RecipeTypes; import lombok.Getter; +import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.ContainerType; import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; @@ -19,6 +23,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.network.PacketDistributor; import javax.annotation.Nullable; import java.util.ArrayList; @@ -76,9 +81,11 @@ public class ControllerBlockEntity extends TileEntity implements ITickableTileEn List processRecipes = level.getRecipeManager().getAllRecipesFor(RecipeTypes.MACHINE_PROCESS); for (MachineProcessRecipe recipe : processRecipes) { if (recipe.matches(inputPorts, structure.getStructureId())) { - ProcessUpdate update = recipe.process(inputPorts, outputPorts, this.update); - this.update = update; + this.update = recipe.process(inputPorts, outputPorts, this.update); + PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(worldPosition, save(new CompoundNBT()))); return; + } else { + this.update.setTicksTaken(0); } } } @@ -94,4 +101,18 @@ public class ControllerBlockEntity extends TileEntity implements ITickableTileEn public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { return new ControllerBlockContainer(container.get(), p_createMenu_1_, this); } + + @Override + public CompoundNBT save(CompoundNBT nbt) { + nbt.putInt("ticks", update.getTicksTaken()); + nbt.putString("msg", update.getMsg()); + return super.save(nbt); + } + + @Override + public void load(BlockState p_230337_1_, CompoundNBT nbt) { + super.load(p_230337_1_, nbt); + update.setTicksTaken(nbt.getInt("ticks")); + update.setMsg(nbt.getString("msg")); + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java b/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java index cb3b06b..392876b 100644 --- a/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java +++ b/src/main/java/com/ticticboooom/mods/mm/block/tile/MachinePortBlockEntity.java @@ -1,27 +1,42 @@ package com.ticticboooom.mods.mm.block.tile; +import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.network.PacketHandler; +import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; import com.ticticboooom.mods.mm.ports.storage.IPortStorage; import lombok.Getter; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fml.network.PacketDistributor; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.function.Supplier; -public class MachinePortBlockEntity extends TileEntity { +public class MachinePortBlockEntity extends TileEntity implements ITickableTileEntity, INamedContainerProvider { + private ContainerType container; @Getter private IPortStorage storage; @Getter private boolean input; - public MachinePortBlockEntity(TileEntityType p_i48289_1_, IPortStorage storage, boolean input) { + public MachinePortBlockEntity(TileEntityType p_i48289_1_, ContainerType container, IPortStorage storage, boolean input) { super(p_i48289_1_); + this.container = container; this.storage = storage; this.input = input; } @@ -34,4 +49,32 @@ public class MachinePortBlockEntity extends TileEntity { } return super.getCapability(cap, side); } + + @Override + public CompoundNBT save(CompoundNBT nbt) { + nbt.put("inv", storage.save(new CompoundNBT())); + return super.save(nbt); + } + + @Override + public void load(BlockState state, CompoundNBT nbt) { + super.load(state, nbt); + storage.load(nbt.getCompound("inv")); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Port"); + } + + @Nullable + @Override + public Container createMenu(int windowsId, PlayerInventory inv, PlayerEntity player) { + return new PortBlockContainer(container, windowsId, inv,this); + } + + @Override + public void tick() { + PacketHandler.INSTANCE.send(PacketDistributor.ALL.noArg(), new TileClientUpdatePacket.Data(worldPosition, save(new CompoundNBT()))); + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java b/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java index 367d6f7..397ebe3 100644 --- a/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java +++ b/src/main/java/com/ticticboooom/mods/mm/client/screen/PortBlockContainerScreen.java @@ -10,17 +10,24 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; public class PortBlockContainerScreen extends ContainerScreen { - public PortBlockContainerScreen(PortBlockContainer p_i51105_1_, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { - super(p_i51105_1_, p_i51105_2_, p_i51105_3_); + private final PortBlockContainer container; + + public PortBlockContainerScreen(PortBlockContainer container, PlayerInventory p_i51105_2_, ITextComponent p_i51105_3_) { + super(container, p_i51105_2_, p_i51105_3_); + this.container = container; } - private static final ResourceLocation GUI = new ResourceLocation(MM.ID, "textures/gui/gui_large.png"); + private static final ResourceLocation GUI = new ResourceLocation(MM.ID, "textures/gui/port_gui.png"); @Override - protected void renderBg(MatrixStack stack, float p_230450_2_, int p_230450_3_, int p_230450_4_) { + protected void renderBg(MatrixStack stack, float p_230450_2_, int mouseX, int mouseY) { this.renderBackground(stack); - this.minecraft.textureManager.bind(GUI); - this.blit(stack, this.leftPos, this.topPos, 0, 0, this.width, this.height); + container.getTile().getStorage().render(stack, mouseX, mouseY, this.leftPos, this.topPos, this); } + @Override + protected void renderLabels(MatrixStack stack, int p_230451_2_, int p_230451_3_) { + drawString(stack, this.minecraft.font, container.getTile().getDisplayName(), 7, 5, 0xfefefe); + drawString(stack, this.minecraft.font, "Inventory", 7, 130, 0xfefefe); + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java b/src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java new file mode 100644 index 0000000..4a7eeed --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/client/util/FluidRenderer.java @@ -0,0 +1,129 @@ +package com.ticticboooom.mods.mm.client.util; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.fluid.Fluid; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.FluidStack; + +public class FluidRenderer { + + public static final FluidRenderer INSTANCE = new FluidRenderer(1000, 16, 16, 16); + private static final int TEX_WIDTH = 16; + private static final int TEX_HEIGHT = 16; + + private int capacity; + private final int width; + private final int height; + private final int minHeight; + + public FluidRenderer(int capacity, int width, int height, int minHeight) { + this.capacity = capacity; + this.width = width; + this.height = height; + this.minHeight = minHeight; + } + + public void render(MatrixStack matrixStack, final int xPosition, final int yPosition, FluidStack stack, final int height) { + RenderSystem.enableBlend(); + RenderSystem.enableAlphaTest(); + + drawFluid(matrixStack, xPosition, yPosition, stack, height); + + RenderSystem.color4f(1, 1, 1, 1); + + RenderSystem.disableAlphaTest(); + RenderSystem.disableBlend(); + } + + private void drawFluid(MatrixStack matrixStack, int xPosition, int yPosition, FluidStack stack, final int height) { + if (stack == null) { + return; + } + Fluid fluid = stack.getFluid(); + if (fluid == null) { + return; + } + + TextureAtlasSprite fluidStillSprite = getStillFluidSprite(stack); + + FluidAttributes attributes = fluid.getAttributes(); + int fluidColor = attributes.getColor(stack); + + int amount = stack.getAmount(); + + drawTiledSprite(matrixStack, xPosition, yPosition, width, height, fluidColor, height, fluidStillSprite); + } + + private void drawTiledSprite(MatrixStack matrixStack, int xPosition, int yPosition, int width, int height, int color, int scaledAmount, TextureAtlasSprite sprite) { + Minecraft minecraft = Minecraft.getInstance(); + minecraft.getTextureManager().bind(PlayerContainer.BLOCK_ATLAS); + Matrix4f matrix = matrixStack.last().pose(); + setGLColorFromInt(color); + + final int xTileCount = width / TEX_WIDTH; + final int xRemainder = height - (xTileCount * TEX_WIDTH); + final int yTileCount = scaledAmount / TEX_HEIGHT; + final int yRemainder = scaledAmount - (yTileCount * TEX_HEIGHT); + + final int yStart = yPosition + height; + + for (int xTile = 0; xTile <= xTileCount; xTile++) { + for (int yTile = 0; yTile <= yTileCount; yTile++) { + int w = (xTile == xTileCount) ? xRemainder : TEX_WIDTH; + int h = (yTile == yTileCount) ? yRemainder : TEX_HEIGHT; + int x = xPosition + (xTile * TEX_WIDTH); + int y = yStart - ((yTile + 1) * TEX_HEIGHT); + if (w > 0 && h > 0) { + int maskTop = TEX_HEIGHT - h; + int maskRight = TEX_WIDTH - w; + + drawTextureWithMasking(matrix, x, y, sprite, maskTop, maskRight, 100); + } + } + } + } + + private void drawTextureWithMasking(Matrix4f matrix, int x, int y, TextureAtlasSprite sprite, int maskTop, int maskRight, int z) { + float uMin = sprite.getU0(); + float uMax = sprite.getU1(); + float vMin = sprite.getV0(); + float vMax = sprite.getV1(); + uMax = uMax - (maskRight / 16F * (uMax - uMin)); + vMax = vMax - (maskTop / 16F * (vMax - vMin)); + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuilder(); + bufferBuilder.begin(7, DefaultVertexFormats.POSITION_TEX); + bufferBuilder.vertex(matrix, x, y + 16, z).uv(uMin, vMax).endVertex(); + bufferBuilder.vertex(matrix, x + 16 - maskRight, y + 16, z).uv(uMax, vMax).endVertex(); + bufferBuilder.vertex(matrix, x + 16 - maskRight, y + maskTop, z).uv(uMax, vMin).endVertex(); + bufferBuilder.vertex(matrix, x, y + maskTop, z).uv(uMin, vMin).endVertex(); + tessellator.end(); + } + + private static void setGLColorFromInt(int color) { + float red = (color >> 16 & 0xFF) / 255.0F; + float green = (color >> 8 & 0xFF) / 255.0F; + float blue = (color & 0xFF) / 255.0F; + float alpha = ((color >> 24) & 0xFF) / 255F; + + RenderSystem.color4f(red, green, blue, alpha); + } + + private TextureAtlasSprite getStillFluidSprite(FluidStack stack) { + Minecraft minecraft = Minecraft.getInstance(); + Fluid fluid = stack.getFluid(); + FluidAttributes attributes = fluid.getAttributes(); + ResourceLocation fluidStill = attributes.getStillTexture(stack); + return minecraft.getTextureAtlas(PlayerContainer.BLOCK_ATLAS).apply(fluidStill); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java b/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java index a810c9f..ac01ea5 100644 --- a/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java +++ b/src/main/java/com/ticticboooom/mods/mm/data/MachineProcessRecipe.java @@ -61,8 +61,7 @@ public class MachineProcessRecipe implements IRecipe { return false; } } - return true - ; + return true; } public ProcessUpdate process(List inputPorts, List outputPorts, ProcessUpdate update) { @@ -86,7 +85,7 @@ public class MachineProcessRecipe implements IRecipe { return update; } update.setTicksTaken(update.getTicksTaken() + 1); - update.setMsg(update.getTicksTaken() / ticks + "%"); + update.setMsg((int)(((float)update.getTicksTaken() /(float)ticks) * 100) + "%"); return update; } 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 98de673..da7eab4 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 @@ -4,13 +4,12 @@ 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 net.minecraft.block.DirectionalBlock; import net.minecraft.client.renderer.RenderType; import net.minecraft.data.DataGenerator; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ModelBuilder; -import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.*; import net.minecraftforge.client.model.generators.loaders.MultiLayerModelBuilder; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.fml.RegistryObject; @@ -31,7 +30,13 @@ public class MMBlockStateProvider extends BlockStateProvider { protected void registerStatesAndModels() { for (RegistryObject controller : MMLoader.BLOCKS) { dynamicBlockNorthOverlay(controller.getId(), BASE_TEXTURE, CONTROLLER_TEXTURE); - simpleBlock(controller.get(), new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))); + VariantBlockStateBuilder variantBuilder = getVariantBuilder(controller.get()); + variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.NORTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(0).addModel(); + variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.SOUTH).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(180).addModel(); + variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.EAST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(90).addModel(); + variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.WEST).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(270).addModel(); + variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.UP).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(0).addModel(); + variantBuilder.partialState().with(DirectionalBlock.FACING, Direction.DOWN).modelForState().modelFile(new ModelFile.UncheckedModelFile(new ResourceLocation(MM.ID, "block/" + controller.getId().getPath()))).rotationY(0).addModel(); } for (RegistryObject port : MMLoader.IPORT_BLOCKS) { @@ -45,7 +50,7 @@ public class MMBlockStateProvider extends BlockStateProvider { } public void dynamicBlockNorthOverlay(ResourceLocation loc, ResourceLocation baseTexture, ResourceLocation overlayTexture) { - models().getBuilder(loc.getPath()).parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) + models().getBuilder(loc.toString()).parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) .texture("particle", overlayTexture) .transforms() .transform(ModelBuilder.Perspective.THIRDPERSON_LEFT) @@ -83,7 +88,7 @@ public class MMBlockStateProvider extends BlockStateProvider { .end(); } public void dynamicBlock(ResourceLocation loc, ResourceLocation baseTexture, ResourceLocation overlayTexture) { - models().getBuilder(loc.getPath()).parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) + models().getBuilder(loc.toString()).parent(new ModelFile.UncheckedModelFile(mcLoc("block/block"))) .texture("particle", overlayTexture) .transforms() .transform(ModelBuilder.Perspective.THIRDPERSON_LEFT) 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 new file mode 100644 index 0000000..414a128 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/datagen/gen/MMItemModelProvider.java @@ -0,0 +1,33 @@ +package com.ticticboooom.mods.mm.datagen.gen; + +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 net.minecraft.data.DataGenerator; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.fml.RegistryObject; + +public class MMItemModelProvider extends ItemModelProvider { + + + public MMItemModelProvider(DataGenerator gen, ExistingFileHelper exFileHelper) { + super(gen, MM.ID, exFileHelper); + } + + @Override + protected void registerModels() { + for (RegistryObject controller : MMLoader.BLOCKS) { + this.getBuilder(controller.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(controller.getId().getNamespace(), "block/" + controller.getId().getPath()))); + } + for (RegistryObject port : MMLoader.OPORT_BLOCKS) { + this.getBuilder(port.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(port.getId().getNamespace(), "block/" + port.getId().getPath()))); + } + for (RegistryObject port : MMLoader.IPORT_BLOCKS) { + this.getBuilder(port.getId().toString()).parent(new ModelFile.UncheckedModelFile(new ResourceLocation(port.getId().getNamespace(), "block/" + port.getId().getPath()))); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java b/src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java new file mode 100644 index 0000000..a227ab2 --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/helper/InvHelper.java @@ -0,0 +1,11 @@ +package com.ticticboooom.mods.mm.helper; + +import com.ticticboooom.mods.mm.inventory.ItemStackInventory; +import net.minecraft.inventory.Inventory; +import net.minecraftforge.items.ItemStackHandler; + +public class InvHelper { + public static ItemStackInventory getItems(ItemStackHandler handler){ + return new ItemStackInventory(handler); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java new file mode 100644 index 0000000..229746f --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/inventory/ItemStackInventory.java @@ -0,0 +1,62 @@ +package com.ticticboooom.mods.mm.inventory; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.ItemStackHandler; + +public class ItemStackInventory implements IInventory { + + private ItemStackHandler handler; + + public ItemStackInventory(ItemStackHandler handler) { + + this.handler = handler; + } + + @Override + public int getContainerSize() { + return handler.getSlots(); + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public ItemStack getItem(int p_70301_1_) { + return handler.getStackInSlot(p_70301_1_); + } + + @Override + public ItemStack removeItem(int p_70298_1_, int p_70298_2_) { + ItemStack stackInSlot = handler.getStackInSlot(p_70298_1_); + handler.setStackInSlot(p_70298_1_, ItemStack.EMPTY); + return stackInSlot; + } + + @Override + public ItemStack removeItemNoUpdate(int p_70304_1_) { + return handler.getStackInSlot(p_70304_1_); + } + + @Override + public void setItem(int p_70299_1_, ItemStack p_70299_2_) { + handler.setStackInSlot(p_70299_1_, p_70299_2_); + } + + @Override + public void setChanged() { + } + + @Override + public boolean stillValid(PlayerEntity p_70300_1_) { + return true; + } + + @Override + public void clearContent() { + + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java index a015074..ec1cb9a 100644 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java +++ b/src/main/java/com/ticticboooom/mods/mm/inventory/PortEnergyInventory.java @@ -16,18 +16,18 @@ public class PortEnergyInventory implements IEnergyStorage { public int receiveEnergy(int maxReceive, boolean simulate) { if (simulate) { if (maxReceive + stored > capacity) { - return (maxReceive + stored) - capacity; + return maxReceive > capacity ? capacity - stored : maxReceive; } else { - return 0; + return maxReceive; } } if (maxReceive + stored > capacity) { - int result = (maxReceive + stored) - capacity; + int result = maxReceive > capacity ? capacity - stored : maxReceive; stored = capacity; return result; } else { stored += maxReceive; - return 0; + return maxReceive; } } @@ -70,4 +70,8 @@ public class PortEnergyInventory implements IEnergyStorage { public boolean canReceive() { return stored < capacity; } + + public void setStored(int amount) { + this.stored = amount; + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java b/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java index a341ccf..ea46707 100644 --- a/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java +++ b/src/main/java/com/ticticboooom/mods/mm/inventory/PortFluidInventory.java @@ -7,7 +7,7 @@ import javax.annotation.Nonnull; public class PortFluidInventory implements IFluidHandler { - private FluidStack stack; + private FluidStack stack = FluidStack.EMPTY; private final int capacity; public PortFluidInventory(int capacity) { this.capacity = capacity; @@ -36,31 +36,38 @@ public class PortFluidInventory implements IFluidHandler { @Override public int fill(FluidStack resource, FluidAction action) { - if (!resource.isFluidEqual(stack)) { + if (!stack.isEmpty() && !resource.isFluidEqual(stack)) { return 0; } if (action == FluidAction.SIMULATE) { if (resource.getAmount() + stack.getAmount() > capacity) { - return Math.abs(resource.getAmount() + stack.getAmount()); + return capacity - resource.getAmount(); } else { - return 0; + return resource.getAmount(); } } if (resource.getAmount() + stack.getAmount() > capacity) { - int result = Math.abs(resource.getAmount() + stack.getAmount()); - stack.setAmount(capacity); - return result; + if (stack.isEmpty()) { + stack = new FluidStack(resource.getFluid(), capacity); + } else { + stack.setAmount(capacity); + } + return capacity - resource.getAmount(); } else { - stack.setAmount(stack.getAmount() + resource.getAmount()); - return 0; + if (stack.isEmpty()) { + stack = new FluidStack(resource.getFluid(), resource.getAmount()); + } else { + stack.setAmount(stack.getAmount() + resource.getAmount()); + } + return resource.getAmount(); } } @Nonnull @Override public FluidStack drain(FluidStack resource, FluidAction action) { - if (!resource.isFluidEqual(stack)) { + if (!stack.isEmpty() && !resource.isFluidEqual(stack)) { return FluidStack.EMPTY; } return innerDrain(resource.getAmount(), action == FluidAction.SIMULATE); @@ -89,4 +96,8 @@ public class PortFluidInventory implements IFluidHandler { return new FluidStack(stack.getFluid(), amount); } } + + public void setStack(FluidStack stack) { + this.stack = stack; + } } diff --git a/src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java b/src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java new file mode 100644 index 0000000..9ab45fa --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/network/PacketHandler.java @@ -0,0 +1,22 @@ +package com.ticticboooom.mods.mm.network; + +import com.ticticboooom.mods.mm.MM; +import com.ticticboooom.mods.mm.network.packets.TileClientUpdatePacket; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.simple.SimpleChannel; + +public class PacketHandler { + private static final String PROTOCOL_VERSION = "1"; + public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( + new ResourceLocation(MM.ID, "main"), + () -> PROTOCOL_VERSION, + PROTOCOL_VERSION::equals, + PROTOCOL_VERSION::equals + ); + + public static void init() { + int index = 0; + INSTANCE.registerMessage(index++, TileClientUpdatePacket.Data.class, TileClientUpdatePacket.Data::encode, TileClientUpdatePacket.Data::decode, TileClientUpdatePacket::handle); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java b/src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java new file mode 100644 index 0000000..76c895e --- /dev/null +++ b/src/main/java/com/ticticboooom/mods/mm/network/packets/TileClientUpdatePacket.java @@ -0,0 +1,43 @@ +package com.ticticboooom.mods.mm.network.packets; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent; + +import java.util.function.Supplier; + +public class TileClientUpdatePacket { + @AllArgsConstructor + @Getter + public static final class Data { + private final BlockPos pos; + private final CompoundNBT nbt; + + public static void encode(Data data, PacketBuffer buffer){ + buffer.writeBlockPos(data.getPos()); + buffer.writeNbt(data.nbt); + } + + public static Data decode(PacketBuffer buffer){ + return new Data(buffer.readBlockPos(), buffer.readNbt()); + } + } + + public static void handle(Data data, Supplier ctx) { + ctx.get().enqueueWork(() -> { + ClientWorld level = Minecraft.getInstance().level; + TileEntity blockEntity = level.getBlockEntity(data.getPos()); + BlockState state = level.getBlockState(data.getPos()); + blockEntity.load(state, data.nbt); + }); + ctx.get().setPacketHandled(true); + } +} diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java b/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java index 216c923..0f24e13 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/parser/FluidPortParser.java @@ -28,6 +28,7 @@ public class FluidPortParser implements IPortParser { public void write(PacketBuffer buf, IPortState state) { buf.writeWithCodec(FluidPortState.CODEC, ((FluidPortState) state)); } + @Override public IPortState createState(JsonObject obj) { DataResult> apply = JsonOps.INSTANCE.withDecoder(FluidPortState.CODEC).apply(obj); diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/IPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/IPortState.java index 1beb9ed..0e1ea20 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/IPortState.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/state/IPortState.java @@ -1,5 +1,6 @@ package com.ticticboooom.mods.mm.ports.state; +import com.mojang.blaze3d.matrix.MatrixStack; import com.ticticboooom.mods.mm.ports.storage.IPortStorage; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java b/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java index c995f54..a7a000d 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/state/ItemPortState.java @@ -1,5 +1,6 @@ package com.ticticboooom.mods.mm.ports.state; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.ticticboooom.mods.mm.MM; @@ -7,6 +8,7 @@ import com.ticticboooom.mods.mm.helper.RLUtils; import com.ticticboooom.mods.mm.ports.storage.IPortStorage; import com.ticticboooom.mods.mm.ports.storage.ItemPortStorage; import lombok.Getter; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tags.ItemTags; import net.minecraft.util.ResourceLocation; @@ -49,13 +51,13 @@ public class ItemPortState implements IPortState { if (!item.equals("")) { if (stackInSlot.getItem().getRegistryName().toString().equals(item)) { int amount = stackInSlot.getCount(); - stackInSlot.setCount(amount > current ? current : 0); + stackInSlot.setCount(amount - (amount - current < 0 ? amount : current)); current -= amount; } } else if (!tag.equals("")) { if (ItemTags.getAllTags().getTag(RLUtils.toRL(tag)).contains(stackInSlot.getItem())) { int amount = stackInSlot.getCount(); - stackInSlot.setCount(amount > current ? current : 0); + stackInSlot.setCount(amount - (amount - current < 0 ? amount : current)); current -= amount; } @@ -106,9 +108,6 @@ public class ItemPortState implements IPortState { ItemPortStorage iinv = (ItemPortStorage) inv; for (int i = 0; i < iinv.getInv().getSlots(); i++) { ItemStack stackInSlot = iinv.getInv().getStackInSlot(i); - if (stackInSlot.isEmpty()) { - continue; - } if (!item.equals("")) { if (stackInSlot.getItem().getRegistryName().toString().equals(item)) { @@ -116,13 +115,10 @@ public class ItemPortState implements IPortState { int increment = Math.min((stackInSlot.getItem().getMaxStackSize() - amount), (count - current)); stackInSlot.setCount(stackInSlot.getCount() + increment); current += increment; - } - } else if (!tag.equals("")) { - if (ItemTags.getAllTags().getTag(RLUtils.toRL(tag)).contains(stackInSlot.getItem())) { - int amount = stackInSlot.getCount(); - int increment = Math.min((stackInSlot.getItem().getMaxStackSize() - amount), (count - current)); - stackInSlot.setCount(stackInSlot.getCount() + increment); - current += increment; + } else if (stackInSlot.isEmpty()) { + Item forgeItem = ForgeRegistries.ITEMS.getValue(RLUtils.toRL(item)); + iinv.getInv().setStackInSlot(i, new ItemStack(forgeItem, Math.min(forgeItem.getMaxStackSize(), count - current))); + current += Math.min(forgeItem.getMaxStackSize(), count - current); } } if (current >= count) { diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java index 2ea06c3..f250819 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/storage/EnergyPortStorage.java @@ -1,9 +1,19 @@ package com.ticticboooom.mods.mm.ports.storage; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.ticticboooom.mods.mm.MM; +import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; import com.ticticboooom.mods.mm.inventory.PortEnergyInventory; import lombok.Getter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.CapabilityEnergy; @@ -31,4 +41,36 @@ public class EnergyPortStorage implements IPortStorage { public boolean validate(Capability cap) { return cap == CapabilityEnergy.ENERGY; } + + @Override + public CompoundNBT save(CompoundNBT nbt) { + nbt.putInt("stored", inv.getEnergyStored()); + return nbt; + } + + @Override + public void load(CompoundNBT nbt) { + inv.setStored(nbt.getInt("stored")); + } + + @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 barOffsetX = 175 - 30; + int barOffsetY = 20; + screen.blit(stack, left + barOffsetX, top + barOffsetY, 175, 18, 18, 108); + float amount = 0; + if (inv.getMaxEnergyStored() > 0) { + amount = (float)inv.getEnergyStored() / inv.getMaxEnergyStored(); + } + screen.blit(stack, left + barOffsetX, top + barOffsetY, 193, 18, 18, (int) (108 * amount)); + AbstractGui.drawString(stack, Minecraft.getInstance().font,Math.round((float)10000 * amount) / 100.f + "%", left + 30, top + 60, 0xfefefe); + AbstractGui.drawString(stack, Minecraft.getInstance().font,inv.getEnergyStored() + "FE", left + 30, top + 80, 0xfefefe); + } + + @Override + public void setupContainer(PortBlockContainer container, PlayerInventory inv, MachinePortBlockEntity tile) { + + } } 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 5a2ed49..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 @@ -1,11 +1,24 @@ package com.ticticboooom.mods.mm.ports.storage; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.ticticboooom.mods.mm.MM; +import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; +import com.ticticboooom.mods.mm.client.util.FluidRenderer; import com.ticticboooom.mods.mm.inventory.PortFluidInventory; import lombok.Getter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; public class FluidPortStorage implements IPortStorage { @@ -32,4 +45,32 @@ public class FluidPortStorage implements IPortStorage { public boolean validate(Capability cap) { return cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; } + + @Override + public CompoundNBT save(CompoundNBT nbt) { + inv.getFluidInTank(0).writeToNBT(nbt); + return nbt; + } + + @Override + public void load(CompoundNBT nbt) { + inv.setStack(FluidStack.loadFluidStackFromNBT(nbt)); + } + + @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/ports/storage/IPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/IPortStorage.java index 55d9cf0..f9c25e8 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/IPortStorage.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/storage/IPortStorage.java @@ -1,9 +1,21 @@ package com.ticticboooom.mods.mm.ports.storage; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; public interface IPortStorage { LazyOptional getLO(); boolean validate(Capability cap); + CompoundNBT save(CompoundNBT nbt); + void load(CompoundNBT nbt); + void render(MatrixStack stack, int mouseX, int mouseY, int left, int top, Screen screen); + void setupContainer(PortBlockContainer container, PlayerInventory inv, MachinePortBlockEntity tile); } diff --git a/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java b/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java index 242b275..f8e927d 100644 --- a/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java +++ b/src/main/java/com/ticticboooom/mods/mm/ports/storage/ItemPortStorage.java @@ -1,8 +1,20 @@ package com.ticticboooom.mods.mm.ports.storage; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.ticticboooom.mods.mm.MM; +import com.ticticboooom.mods.mm.block.container.PortBlockContainer; +import com.ticticboooom.mods.mm.block.tile.MachinePortBlockEntity; +import com.ticticboooom.mods.mm.helper.InvHelper; +import com.ticticboooom.mods.mm.inventory.ItemStackInventory; import lombok.Getter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Slot; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; @@ -10,15 +22,23 @@ import net.minecraftforge.items.ItemStackHandler; public class ItemPortStorage implements IPortStorage { public static final Codec CODEC = RecordCodecBuilder.create(x -> x.group( - Codec.INT.fieldOf("slots").forGetter(z -> z.inv.getSlots()) + Codec.INT.fieldOf("rows").forGetter(z -> z.rows), + Codec.INT.fieldOf("columns").forGetter(z -> z.columns) ).apply(x, ItemPortStorage::new)); @Getter private final ItemStackHandler inv; + @Getter + private final int rows; + @Getter + private final int columns; + private final LazyOptional invLO; - public ItemPortStorage(int slots) { - this.inv = new ItemStackHandler(slots); + public ItemPortStorage(int rows, int columns) { + this.rows = rows; + this.columns = columns; + this.inv = new ItemStackHandler(rows * columns); this.invLO = LazyOptional.of(() -> this.inv); } @@ -32,4 +52,56 @@ public class ItemPortStorage implements IPortStorage { public boolean validate(Capability cap) { return cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY; } + + @Override + public CompoundNBT save(CompoundNBT nbt) { + CompoundNBT compoundNBT = inv.serializeNBT(); + nbt = nbt.merge(compoundNBT); + return nbt; + } + + @Override + public void load(CompoundNBT nbt) { + inv.deserializeNBT(nbt); + } + + @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 offsetY = ((108 - (rows * 18)) / 2) + 7; + int offsetX = ((162 - (columns * 18)) / 2) + 7; + for (int y = 0; y < rows; y++) { + for (int x = 0; x < columns; x++) { + screen.blit(stack, left + (x * 18) + offsetX, top + (y * 18) + offsetY, 175, 256, 18, 18); + } + } + } + + @Override + public void setupContainer(PortBlockContainer container, PlayerInventory inv, MachinePortBlockEntity tile) { + int offsetX = ((162 - (columns * 18)) / 2) + 8; + int offsetY = ((108 - (rows * 18)) / 2) + 8; + ItemStackInventory items = InvHelper.getItems(this.inv); + for (int y = 0; y < rows; y++) { + for (int x = 0; x < columns; x++) { + container.addSlot(new Slot(items, (y * rows) + x, x * 18 + offsetX, y * 18 + offsetY)); + } + } + int playerOffsetX = 8; + int playerOffsetY = 141; + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 9; i++) { + container.addSlot(new Slot(inv, 9 + (j * 9 + i), i* 18 + playerOffsetX, j* 18 + playerOffsetY)); + } + } + + for (int i = 0; i < 9; i++) { + container.addSlot(new Slot(inv, i,8 + (i * 18), 199)); + } + } + + + + } 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 6c57466..7410c79 100644 --- a/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java +++ b/src/main/java/com/ticticboooom/mods/mm/registration/MMLoader.java @@ -49,7 +49,7 @@ public class MMLoader { public static final ArrayList> IPORT_BLOCKS = new ArrayList<>(); public static final ArrayList> OPORT_BLOCKS = new ArrayList<>(); public static final ArrayList>> CONTAINERS = new ArrayList<>(); - public static final ArrayList>> PORT_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); @@ -90,20 +90,24 @@ public class MMLoader { { Registerable>> tile = new Registerable<>(); Registerable> block = new Registerable<>(); + Registerable>> cont = new Registerable<>(); + cont.set(CONTAINER_REG.register(controllerId + "_port_" + resourceLocation.getPath() + "_input", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); block.set(BLOCKS_REG.register(controllerId + "_port_" + resourceLocation.getPath() + "_input", () -> new MachinePortBlock(tile.get()))); - tile.set(TILES_REG.register(controllerId + "_port_" + resourceLocation.getPath() + "_input", () -> TileEntityType.Builder.of(() -> new MachinePortBlockEntity(tile.get().get(), data.get(), true), block.get().get()).build(null))); + tile.set(TILES_REG.register(controllerId + "_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 + "_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()); } { Registerable>> tile = new Registerable<>(); Registerable> block = new Registerable<>(); + Registerable>> cont = new Registerable<>(); + cont.set(CONTAINER_REG.register(controllerId + "_port_" + resourceLocation.getPath() + "_output", () -> IForgeContainerType.create((i, o, u) -> new PortBlockContainer(cont.get().get(), i, o, u)))); block.set(BLOCKS_REG.register(controllerId + "_port_" + resourceLocation.getPath() + "_output", () -> new MachinePortBlock(tile.get()))); - tile.set(TILES_REG.register(controllerId + "_port_" + resourceLocation.getPath() + "_output", () -> TileEntityType.Builder.of(() -> new MachinePortBlockEntity(tile.get().get(), data.get(), false), block.get().get()).build(null))); + tile.set(TILES_REG.register(controllerId + "_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 + "_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/resources/assets/masterfulmachinery/textures/gui/port_gui.png b/src/main/resources/assets/masterfulmachinery/textures/gui/port_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..04880aee6ed8200fcd204835088cc5e6927be299 GIT binary patch literal 3221 zcmeHJZ9J6e8o%f9;2E-J9I4o4QX3Ve*dx1!hZ#yz+Rf&zur`f}hA8jML|$^x%PDmx zWmOb0mGLg7lCok5G2Vs-L*DW_G{fw(pU$VVAI|x5KJ@AS-@o5|UBBzPuj~3>{}ktg zd(~95RR92L4*RG-0)WFH4j@X{;d$nPA9i8*Qz*{{zkt`9XXvGbn*;G-{?)Q=Yci~G`+nEcJkhmtl|j4fTs=(}1VMZ1YDMF^ z?EJ9Uj&XU6@!qiAC+Obenz!GD-Ziw`^mVu4$BSVJQf`3d*67U>rbEmZo%;{9FWCj> z*6UqNqy75TM1Gz@TV2YQ_fPGQhac%;^RIC~N3=V6K78@vd^_%D{0%Ci!K0klI5lMW zA=CZRTX$)FT+G~~)V)`04{o4*z2WJHg%tNIMOz>GxBfIcY*^4MAMwvMFrfDx!_neO zA4z;hyDrdQJ*~+wE{KHE4a$woWaC%b=JQ6cC616`iPkNz@3?iko&gm3U0w4JwO1&) z0Y2!Ud>24jJ7BS4xT+3Fq2|Zr&L>Olk3|~FDYCil(1FHZ&XrEgM0IC>P z)xf>$ioVAQG-tT(72%Z zWM5xZ7+Z}wiSHNl@4PN!2zLZ?ucJ430)Zf$!C-vO?Gp&L=2ul!d2nOf)*Vt9XwLc} zQyM-u(v&;xAit(s9X^v2H9y+ABzm23Z8~(Nhpohua2nY1o-)QbCm&)#ERI+0xw6xJ z+rrP^7b^N`K3o1~4HSq^ZY>=NEQ9@En5kfs?SsR$eEJla#RNf0h?x-yXzSJ#{*3^d z0V`1vMqj=xI}1U)4WyRGOh5}?Dm{pTJqob476GWK3*Y14Mz2SdSxy>VLgDmR>gwhX zheMyKFhe)Bwm2#F*TnRYBW8zkch=6Hy{c;GUgNe8Xnv!Y8kfskUXG9~&4_Ze($mu` z2ZOp+7CXJ{_{-C;LUt5sZI7(yyG}#_Ys#@EGpL}FNOR$*BoaaEhmXX4n@K=Jjj|oi z!J^}qN5UF-gh_qbqQau#a0KHbT^1FBNUbJZTar5psHp{eNtc;mpV^v1LNXTg7Z+dt z;!9ur)r@qd?|7iga=}kbPlqKXCB4dETZ*k~SKVc|oT7Q}?~Tp8>Kx*?(zq#6Eg`;8 z{B!S0k=LrMI9x23iZaHcvO9LlVcOZ*MW+E^isUpn8B*r+#OQz_5;H4YV-~o|H^viF5QtkYFdq@#+z*J5<5Ixmb zbu>EGa)8dNzy-y|_B$y#&z=npZC6X8@GF!q^JQ({%|uA1jx`Xu=hAsERBg_kJ9iO; zg@xsflf`sO%2kKR7*IEJMB4R9fPV8{3}JL52}EYQ*=B3uaL$dJ zC*x6dY>_B5X+R|i!gSx_uLnmWMlzdhT|PGfP3C1-FOEwfBmNWvG_u`nvb8a@Cd0r4 z-Yf)pN0@F$j%*@<{0;Zh2(HIbV8rlKWYOVXzkQqFmzTP4a%L&+I$wlS(L z$mB`EE9*x3l(1}(*r#W4-|08aa9aYtbJoaKy4sq_}30xmwd8IBPOhhnI6o>JP`v7 zC*DTAeHH)Aurk10+}?fYd9u+ll8MBg6bbKES)&y1?_pqIU}_FIt+I7k*V#AXAS3Z` z2b`}#04`~5euxn^HP`26>5vQl?aG#cnVH}jzf(1Z?*nT(^)g(VS6+LtQq}J(d#aSL zEf@PdSk~$fDATOM@WyA)pI)#=hDy5&*7m7b%0mmg#Y!gyj*-Zc?tf8agsDrrPIzF4 zg7)1GQc?>A1@mZe0&0v+`gMnHWtJ`ml>hZDOeYdR$$@uP$UK1n$Sp=2ol}|M!HFx2 zHrYu`4^~umjMtCj#?^vF7ZZKQbx8TzE}~!$t_7X`%8F|Gc_+HWQOOQ@WPnEip@;6;RBgg`=> g0Qdg_0uh-W%XI!x;V|VMCU${?-9c)Rt@rsq0AevDBme*a literal 0 HcmV?d00001 diff --git a/src/main/resources/data/masterfulmachinery/recipes/process/test1.json b/src/main/resources/data/masterfulmachinery/recipes/process/test1.json index 16e16b2..19db29e 100644 --- a/src/main/resources/data/masterfulmachinery/recipes/process/test1.json +++ b/src/main/resources/data/masterfulmachinery/recipes/process/test1.json @@ -1,6 +1,6 @@ { "type": "masterfulmachinery:machine_process", - "ticks": 20, + "ticks": 600, "controllerId": "basic", "structureId": "test", "inputs": [