From 40284fb2ec895f5bd82be3d3b284f4f3f1d8aae0 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Sun, 21 May 2023 17:12:27 +0200 Subject: [PATCH] feat: implement arcane furnace --- .../net/anvilcraft/thaummach/ClientProxy.java | 12 +- .../net/anvilcraft/thaummach/CommonProxy.java | 14 ++- .../java/net/anvilcraft/thaummach/GuiID.java | 5 +- .../container/ContainerArcaneFurnace.java | 108 ++++++++++++++++++ .../thaummach/gui/GuiArcaneFurnace.java | 47 ++++++++ .../thaummach/tiles/TileArcaneFurnace.java | 71 +++++++----- .../textures/guis/arcane_furnace.png | Bin 0 -> 3630 bytes 7 files changed, 221 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/anvilcraft/thaummach/container/ContainerArcaneFurnace.java create mode 100644 src/main/java/net/anvilcraft/thaummach/gui/GuiArcaneFurnace.java create mode 100644 src/main/resources/assets/thaummach/textures/guis/arcane_furnace.png diff --git a/src/main/java/net/anvilcraft/thaummach/ClientProxy.java b/src/main/java/net/anvilcraft/thaummach/ClientProxy.java index 369f939..fd74853 100644 --- a/src/main/java/net/anvilcraft/thaummach/ClientProxy.java +++ b/src/main/java/net/anvilcraft/thaummach/ClientProxy.java @@ -5,6 +5,7 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.GameRegistry; import net.anvilcraft.thaummach.entities.EntitySingularity; +import net.anvilcraft.thaummach.gui.GuiArcaneFurnace; import net.anvilcraft.thaummach.gui.GuiBore; import net.anvilcraft.thaummach.gui.GuiCrystallizer; import net.anvilcraft.thaummach.gui.GuiVoidChest; @@ -17,6 +18,7 @@ import net.anvilcraft.thaummach.render.tile.TileConduitPumpRenderer; import net.anvilcraft.thaummach.render.tile.TileCrystallizerRenderer; import net.anvilcraft.thaummach.render.tile.TileVoidChestRenderer; import net.anvilcraft.thaummach.render.tile.TileVoidInterfaceRenderer; +import net.anvilcraft.thaummach.tiles.TileArcaneFurnace; import net.anvilcraft.thaummach.tiles.TileBore; import net.anvilcraft.thaummach.tiles.TileConduit; import net.anvilcraft.thaummach.tiles.TileConduitPump; @@ -55,6 +57,7 @@ public class ClientProxy extends CommonProxy { @Override public void registerTileEntities() { + GameRegistry.registerTileEntity(TileArcaneFurnace.class, "arcane_furnace"); GameRegistry.registerTileEntity(TileConduit.class, "conduit"); GameRegistry.registerTileEntity(TileConduitTank.class, "conduit_tank"); GameRegistry.registerTileEntity(TileConduitValve.class, "conduit_valve"); @@ -87,18 +90,21 @@ public class ClientProxy extends CommonProxy { getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); switch (GuiID.get(id)) { + case ARCANE_FURNACE: + return new GuiArcaneFurnace(player.inventory, (TileArcaneFurnace) te); + case BORE: return new GuiBore(player.inventory, (TileBore) te); + case CRYSTALLIZER: + return new GuiCrystallizer(player.inventory, (TileCrystallizer) te); + case VOID_CHEST: return new GuiVoidChest(player.inventory, (TileVoidChest) te); case VOID_INTERFACE: return new GuiVoidInterface(player.inventory, (TileVoidInterface) te); - case CRYSTALLIZER: - return new GuiCrystallizer(player.inventory, (TileCrystallizer) te); - default: throw new IllegalArgumentException("ALEC"); } diff --git a/src/main/java/net/anvilcraft/thaummach/CommonProxy.java b/src/main/java/net/anvilcraft/thaummach/CommonProxy.java index 0976bbb..a6944c1 100644 --- a/src/main/java/net/anvilcraft/thaummach/CommonProxy.java +++ b/src/main/java/net/anvilcraft/thaummach/CommonProxy.java @@ -2,10 +2,12 @@ package net.anvilcraft.thaummach; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; +import net.anvilcraft.thaummach.container.ContainerArcaneFurnace; import net.anvilcraft.thaummach.container.ContainerBore; import net.anvilcraft.thaummach.container.ContainerCrystallizer; import net.anvilcraft.thaummach.container.ContainerVoidChest; import net.anvilcraft.thaummach.container.ContainerVoidInterface; +import net.anvilcraft.thaummach.tiles.TileArcaneFurnace; import net.anvilcraft.thaummach.tiles.TileBore; import net.anvilcraft.thaummach.tiles.TileConduit; import net.anvilcraft.thaummach.tiles.TileConduitPump; @@ -30,6 +32,7 @@ public class CommonProxy implements IGuiHandler { public void init() {} public void registerTileEntities() { + GameRegistry.registerTileEntity(TileArcaneFurnace.class, "arcane_furnace"); GameRegistry.registerTileEntity(TileBore.class, "bore"); GameRegistry.registerTileEntity(TileConduit.class, "conduit"); GameRegistry.registerTileEntity(TileConduitPump.class, "conduit_pump"); @@ -53,9 +56,17 @@ public class CommonProxy implements IGuiHandler { getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); switch (GuiID.get(id)) { + case ARCANE_FURNACE: + return new ContainerArcaneFurnace( + player.inventory, (TileArcaneFurnace) te + ); + case BORE: return new ContainerBore(player.inventory, (TileBore) te); + case CRYSTALLIZER: + return new ContainerCrystallizer(player.inventory, (TileCrystallizer) te); + case VOID_CHEST: return new ContainerVoidChest(player.inventory, (TileVoidChest) te); @@ -64,9 +75,6 @@ public class CommonProxy implements IGuiHandler { player.inventory, (TileVoidInterface) te ); - case CRYSTALLIZER: - return new ContainerCrystallizer(player.inventory, (TileCrystallizer) te); - default: throw new IllegalArgumentException("ALEC"); } diff --git a/src/main/java/net/anvilcraft/thaummach/GuiID.java b/src/main/java/net/anvilcraft/thaummach/GuiID.java index d643031..d1f5806 100644 --- a/src/main/java/net/anvilcraft/thaummach/GuiID.java +++ b/src/main/java/net/anvilcraft/thaummach/GuiID.java @@ -1,10 +1,11 @@ package net.anvilcraft.thaummach; public enum GuiID { + ARCANE_FURNACE, BORE, + CRYSTALLIZER, VOID_CHEST, - VOID_INTERFACE, - CRYSTALLIZER; + VOID_INTERFACE; public static GuiID get(int id) { if (id >= 0 && id < GuiID.values().length) { diff --git a/src/main/java/net/anvilcraft/thaummach/container/ContainerArcaneFurnace.java b/src/main/java/net/anvilcraft/thaummach/container/ContainerArcaneFurnace.java new file mode 100644 index 0000000..b62e987 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/container/ContainerArcaneFurnace.java @@ -0,0 +1,108 @@ +package net.anvilcraft.thaummach.container; + +import net.anvilcraft.thaummach.OutputSlot; +import net.anvilcraft.thaummach.tiles.TileArcaneFurnace; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerArcaneFurnace extends Container { + private TileArcaneFurnace arcaneFurnace; + + public ContainerArcaneFurnace( + InventoryPlayer inventoryplayer, TileArcaneFurnace tileArcaneFurnace + ) { + this.arcaneFurnace = tileArcaneFurnace; + + int j; + int k; + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + this.addSlotToContainer( + new Slot(tileArcaneFurnace, 9 + k + j * 3, 17 + k * 18, 17 + j * 18) + ); + } + } + + this.addSlotToContainer(new Slot(tileArcaneFurnace, 18, 80, 53)); + + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + this.addSlotToContainer(new OutputSlot( + tileArcaneFurnace, k + j * 3, 107 + k * 18, 17 + j * 18 + )); + } + } + + for (j = 0; j < 3; ++j) { + for (k = 0; k < 9; ++k) { + this.addSlotToContainer( + new Slot(inventoryplayer, k + j * 9 + 9, 8 + k * 18, 84 + j * 18) + ); + } + } + + for (j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inventoryplayer, j, 8 + j * 18, 142)); + } + } + + //@Override + //public void updateCraftingResults() { + // super.updateCraftingResults(); + + // for (int i = 0; i < super.inventorySlots.size(); ++i) { + // ICrafting icrafting = (ICrafting) super.inventorySlots.get(i); + // if (this.lastCookTime != this.arcaneFurnace.furnaceCookTime) { + // icrafting.updateCraftingInventoryInfo( + // this, 0, Math.round((float) this.arcaneFurnace.furnaceCookTime) + // ); + // } + // } + + // this.lastCookTime = Math.round((float) this.arcaneFurnace.furnaceCookTime); + //} + + @Override + public void updateProgressBar(int i, int j) { + if (i == 0) { + this.arcaneFurnace.furnaceCookTime = j; + } + } + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) { + return this.arcaneFurnace.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot) super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 19) { + if (!this.mergeItemStack(itemstack1, 19, 46, true)) { + return null; + } + } else if (i >= 19 && i < 46 && !this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + } + + return itemstack; + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/gui/GuiArcaneFurnace.java b/src/main/java/net/anvilcraft/thaummach/gui/GuiArcaneFurnace.java new file mode 100644 index 0000000..655ac52 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/gui/GuiArcaneFurnace.java @@ -0,0 +1,47 @@ +package net.anvilcraft.thaummach.gui; + +import net.anvilcraft.thaummach.container.ContainerArcaneFurnace; +import net.anvilcraft.thaummach.tiles.TileArcaneFurnace; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiArcaneFurnace extends GuiContainer { + private TileArcaneFurnace arcaneFurnaceInventory; + + public GuiArcaneFurnace( + InventoryPlayer inventoryplayer, TileArcaneFurnace tileArcaneFurnace + ) { + super(new ContainerArcaneFurnace(inventoryplayer, tileArcaneFurnace)); + this.arcaneFurnaceInventory = tileArcaneFurnace; + } + + @Override + protected void drawGuiContainerForegroundLayer(int alec1, int alec2) { + super.fontRendererObj.drawString("Thaumic Furnace", 48, 5, 4210752); + super.fontRendererObj.drawString("Inventory", 8, super.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int qq, int ww) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture( + new ResourceLocation("thaummach", "textures/guis/arcane_furnace.png") + ); + int l = (super.width - super.xSize) / 2; + int i1 = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(l, i1, 0, 0, super.xSize, super.ySize); + int j1; + if (this.arcaneFurnaceInventory.isWorking()) { + j1 = this.arcaneFurnaceInventory.getBurnTimeRemainingScaled(16); + this.drawTexturedModalRect(l + 80, i1 + 32 + 16 - j1, 176, 16 - j1, 16, j1); + } else if (this.arcaneFurnaceInventory.furnaceBurnTime > 0) { + j1 = this.arcaneFurnaceInventory.getBurnTimeRemainingScaled(16); + this.drawTexturedModalRect(l + 80, i1 + 32 + 16 - j1, 221, 16 - j1, 16, j1); + } + + j1 = this.arcaneFurnaceInventory.getCookProgressScaled(26); + this.drawTexturedModalRect(l + 75, i1 + 22, 176, 28, j1, 4); + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/tiles/TileArcaneFurnace.java b/src/main/java/net/anvilcraft/thaummach/tiles/TileArcaneFurnace.java index 383e72e..cf35938 100644 --- a/src/main/java/net/anvilcraft/thaummach/tiles/TileArcaneFurnace.java +++ b/src/main/java/net/anvilcraft/thaummach/tiles/TileArcaneFurnace.java @@ -4,12 +4,17 @@ import java.util.stream.IntStream; import dev.tilera.auracore.api.machine.TileVisUser; import dev.tilera.auracore.aura.AuraManager; +import net.anvilcraft.thaummach.GuiID; +import net.anvilcraft.thaummach.ITileGui; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.world.EnumSkyBlock; @@ -17,7 +22,7 @@ import net.minecraftforge.common.util.ForgeDirection; import thaumcraft.api.aspects.Aspect; import thaumcraft.api.aspects.AspectList; -public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { +public class TileArcaneFurnace extends TileVisUser implements ISidedInventory, ITileGui { private ItemStack[] furnaceItemStacks = new ItemStack[19]; public int furnaceBurnTime = 0; public int currentItemBurnTime = 0; @@ -27,10 +32,10 @@ public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { public float vis; public boolean boost; - // TODO: GUIs - //public GuiScreen getGui(EntityPlayer player) { - // return new GuiArcaneFurnace(player.inventory, this); - //} + @Override + public GuiID getGuiID() { + return GuiID.ARCANE_FURNACE; + } @Override public int getSizeInventory() { @@ -198,10 +203,12 @@ public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { if (this.furnaceBurnTime > 0 && (this.furnaceCookTime > 0 || this.belowHeatableTile())) { --this.furnaceBurnTime; + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); } if (this.furnaceBurnTime <= 0 && (this.canSmelt() || this.belowHeatableTile())) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); this.currentItemBurnTime = this.furnaceBurnTime = getItemBurnTime(this.furnaceItemStacks[18]); if (this.furnaceBurnTime > 0) { @@ -227,20 +234,10 @@ public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { this.furnaceMaxCookTime = (int ) ((float) this.furnaceMaxCookTime * (1.0F - (float) this.bellows * 0.1F)); - this.worldObj.markBlockForUpdate( - this.xCoord, this.yCoord, this.zCoord - ); super.worldObj.updateLightByType( EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord ); - // TODO: WTF - //if (this.furnaceItemStacks[18].getItem().func_46056_k()) { - // this.furnaceItemStacks[18] = new ItemStack( - // this.furnaceItemStacks[18].getItem().setFull3D() - // ); - //} else { --this.furnaceItemStacks[18].stackSize; - //} if (this.furnaceItemStacks[18].stackSize == 0) { this.furnaceItemStacks[18] = null; @@ -284,8 +281,7 @@ public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { } if (flag1) { - // TODO: WTF - //this.onInventoryChanged(); + this.markDirty(); } } @@ -364,14 +360,7 @@ public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { } while (tryAgain); if (smelted) { - // TODO: WTF - //if (this.furnaceItemStacks[input].getItem().func_46056_k()) { - // this.furnaceItemStacks[input] = new ItemStack( - // this.furnaceItemStacks[input].getItem().setFull3D() - // ); - //} else { --this.furnaceItemStacks[input].stackSize; - //} if (this.furnaceItemStacks[input].stackSize <= 0) { this.furnaceItemStacks[input] = null; @@ -477,14 +466,40 @@ public class TileArcaneFurnace extends TileVisUser implements ISidedInventory { } @Override - public boolean - canInsertItem(int slot, ItemStack is, int side) { + public boolean canInsertItem(int slot, ItemStack is, int side) { return this.isItemValidForSlot(slot, is); } @Override - public boolean - canExtractItem(int slot, ItemStack is, int side) { + public boolean canExtractItem(int slot, ItemStack is, int side) { return slot >= 9 && slot <= 17; } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setInteger("furnaceBurnTime", this.furnaceBurnTime); + nbt.setInteger("currentItemBurnTime", this.currentItemBurnTime); + nbt.setInteger("furnaceCookTime", this.furnaceCookTime); + nbt.setInteger("furnaceMaxCookTime", this.furnaceMaxCookTime); + nbt.setFloat("vis", this.vis); + nbt.setBoolean("boost", this.boost); + + return new S35PacketUpdateTileEntity( + this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt + ); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.furnaceBurnTime = nbt.getInteger("furnaceBurnTime"); + this.currentItemBurnTime = nbt.getInteger("currentItemBurnTime"); + this.furnaceCookTime = nbt.getInteger("furnaceCookTime"); + this.furnaceMaxCookTime = nbt.getInteger("furnaceMaxCookTime"); + this.vis = nbt.getFloat("vis"); + this.boost = nbt.getBoolean("boost"); + } } diff --git a/src/main/resources/assets/thaummach/textures/guis/arcane_furnace.png b/src/main/resources/assets/thaummach/textures/guis/arcane_furnace.png new file mode 100644 index 0000000000000000000000000000000000000000..e9df258e156e2fa1360c3835503ac83ae199921f GIT binary patch literal 3630 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 literal 0 HcmV?d00001