From ba02c7fa9e33d6a652b5275f49335e8e0433b025 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 15 Apr 2023 17:46:50 +0200 Subject: [PATCH] watz fixes, most remaining functionality, NBT and IO --- .../java/com/hbm/blocks/machine/Watz.java | 14 ++- .../java/com/hbm/inventory/gui/GUIWatz.java | 35 +++++++- .../com/hbm/items/machine/ItemWatzPellet.java | 3 + .../tileentity/machine/TileEntityWatz.java | 81 ++++++++++++++---- .../hbm/textures/gui/reactors/gui_watz.png | Bin 4569 -> 4570 bytes 5 files changed, 112 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/Watz.java b/src/main/java/com/hbm/blocks/machine/Watz.java index 8b0069f49..46de57e92 100644 --- a/src/main/java/com/hbm/blocks/machine/Watz.java +++ b/src/main/java/com/hbm/blocks/machine/Watz.java @@ -1,6 +1,7 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; +import com.hbm.handler.MultiblockHandlerXR; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityWatz; @@ -31,7 +32,7 @@ public class Watz extends BlockDummyable { @Override public int[] getDimensions() { - return new int[] {2, 0, 3, 3, 3, 3}; + return new int[] {2, 0, 3, 3, 1, 1}; } @Override @@ -41,13 +42,22 @@ public class Watz extends BlockDummyable { @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - return super.checkRequirement(world, x, y, z, dir, o); //TODO + return super.checkRequirement(world, x, y, z, dir, o) && + MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 2, 2, 2, -2}, x, y, z, dir) && + MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 2, 2, -2, 2}, x, y, z, dir) && + MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 1, 1, 3, -3}, x, y, z, dir) && + MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 1, 1, -3, 3}, x, y, z, dir); } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 2, 2, 2, -2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 2, 2, -2, 2}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 1, 1, 3, -3}, this, dir); + MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, new int[]{2, 0, 1, 1, -3, 3}, this, dir); + x += dir.offsetX * o; z += dir.offsetZ * o; diff --git a/src/main/java/com/hbm/inventory/gui/GUIWatz.java b/src/main/java/com/hbm/inventory/gui/GUIWatz.java index db0cbc54b..5153b1032 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIWatz.java +++ b/src/main/java/com/hbm/inventory/gui/GUIWatz.java @@ -4,11 +4,18 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerWatz; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.render.util.GaugeUtil; +import com.hbm.render.util.GaugeUtil.Gauge; import com.hbm.tileentity.machine.TileEntityWatz; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class GUIWatz extends GuiInfoContainer { @@ -40,16 +47,31 @@ public class GUIWatz extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int i, int j) { this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 93, 4210752); - String flux = "" + ((int)(watz.fluxDisplay * 10)) / 10.0D; - this.fontRendererObj.drawString(flux, 159 - this.fontRendererObj.getStringWidth(flux), 105, 0x00ff00); + double scale = 1.25; + String flux = String.format("%,.1f", watz.fluxDisplay); + GL11.glScaled(1 / scale, 1 / scale, 1); + this.fontRendererObj.drawString(flux, (int) (161 * scale - this.fontRendererObj.getStringWidth(flux)), (int)(107 * scale), 0x00ff00); + GL11.glScaled(scale, scale, 1); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 70 < y && guiTop + 70 + 18 >= y) { + NBTTagCompound control = new NBTTagCompound(); + control.setBoolean("lock", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(control, watz.xCoord, watz.yCoord, watz.zCoord)); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1F)); + } } @Override protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - //float col = (float) (Math.sin(System.currentTimeMillis() / 500D) * 0.5 + 0.5); - //GL11.glColor4f(1.0F, col, col, 1.0F); + float col = MathHelper.clamp_float(1 - (float) Math.log(watz.heat / 100_000D + 1) * 0.4F, 0F, 1F); + GL11.glColor4f(1.0F, col, col, 1.0F); drawTexturedModalRect(guiLeft, guiTop, 0, 0, 131, 122); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); @@ -59,6 +81,11 @@ public class GUIWatz extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 105, guiTop + 96, 185, 26, 30, 26); drawTexturedModalRect(guiLeft + 9, guiTop + 96, 184, 0, 26, 26); + if(watz.isOn) drawTexturedModalRect(guiLeft + 147, guiTop + 8, 176, 0, 8, 8); + if(watz.isLocked) drawTexturedModalRect(guiLeft + 142, guiTop + 70, 210, 0, 18, 18); + + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 13, guiTop + 100, this.zLevel, 1 - col); + watz.tanks[0].renderTank(guiLeft + 143, guiTop + 69, this.zLevel, 4, 43); watz.tanks[1].renderTank(guiLeft + 149, guiTop + 69, this.zLevel, 4, 43); watz.tanks[2].renderTank(guiLeft + 155, guiTop + 69, this.zLevel, 4, 43); diff --git a/src/main/java/com/hbm/items/machine/ItemWatzPellet.java b/src/main/java/com/hbm/items/machine/ItemWatzPellet.java index 8a8df788e..0b782df9d 100644 --- a/src/main/java/com/hbm/items/machine/ItemWatzPellet.java +++ b/src/main/java/com/hbm/items/machine/ItemWatzPellet.java @@ -1,6 +1,7 @@ package com.hbm.items.machine; import java.util.List; +import java.util.Locale; import com.hbm.items.ItemEnumMulti; import com.hbm.items.ModItems; @@ -123,6 +124,8 @@ public class ItemWatzPellet extends ItemEnumMulti { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { EnumWatzType num = EnumUtil.grabEnumSafely(EnumWatzType.class, stack.getItemDamage()); + list.add(EnumChatFormatting.GREEN + "Depletion: " + String.format(Locale.US, "%.1f", getDurabilityForDisplay(stack) * 100D) + "%"); + String color = EnumChatFormatting.GOLD + ""; String reset = EnumChatFormatting.RESET + ""; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index b66e14d9e..461d1e711 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -29,6 +29,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -41,6 +42,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand public double fluxLastBase; //flux created by the previous passive emission, only used for display public double fluxLastReaction; //flux created by the previous reaction, used for the next reaction public double fluxDisplay; + public boolean isOn; /* lock types for item IO */ public boolean isLocked = false; @@ -106,22 +108,23 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand segment.updateReaction(above, sharedTanks, turnedOn); } + /* send sync packets (order doesn't matter) */ + for(TileEntityWatz segment : segments) { + segment.isOn = turnedOn; + segment.sendPacket(sharedTanks); + segment.heat *= 0.99; //cool 1% per tick + } + /* re-distribute fluid from shared tanks back into actual tanks, bottom to top */ for(int i = segments.size() - 1; i >= 0; i--) { TileEntityWatz segment = segments.get(i); for(int j = 0; j < 3; j++) { int min = Math.min(segment.tanks[j].getMaxFill(), sharedTanks[j].getFill()); - segment.tanks[j].setFill(min); sharedTanks[j].setFill(sharedTanks[j].getFill() - min); + segment.tanks[j].setFill(min); } } - /* send sync packets (order doesn't matter) */ - for(TileEntityWatz segment : segments) { - segment.sendPacket(sharedTanks); - segment.heat *= 0.99; //cool 1% per tick - } - segments.get(segments.size() - 1).sendOutBottom(); } } @@ -150,8 +153,8 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand int cycles = Math.min(heatCycles, Math.min(hotCycles, coolCycles)); this.heat -= cycles * step.heatReq; - tanks[0].setFill(tanks[0].getFill() - coolCycles * step.amountReq); - tanks[1].setFill(tanks[1].getFill() + hotCycles * step.amountProduced); + tanks[0].setFill(tanks[0].getFill() - cycles * step.amountReq); + tanks[1].setFill(tanks[1].getFill() + cycles * step.amountProduced); } /** enforces strict top to bottom update order (instead of semi-random based on placement) */ @@ -244,12 +247,25 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand NBTTagCompound data = new NBTTagCompound(); data.setInteger("heat", this.heat); + data.setBoolean("isOn", isOn); + data.setBoolean("lock", isLocked); data.setDouble("flux", this.fluxLastReaction + this.fluxLastBase); for(int i = 0; i < tanks.length; i++) { tanks[i].writeToNBT(data, "t" + i); } this.networkPack(data, 25); } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.heat = nbt.getInteger("heat"); + this.isOn = nbt.getBoolean("isOn"); + this.isLocked = nbt.getBoolean("lock"); + this.fluxDisplay = nbt.getDouble("flux"); + for(int i = 0; i < tanks.length; i++) { + tanks[i].readFromNBT(nbt, "t" + i); + } + } /** Prevent manual updates when another segment is above this one */ public boolean updateLock() { @@ -281,14 +297,49 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand new DirPos(xCoord, yCoord - 1, zCoord - 2, ForgeDirection.DOWN) }; } - + @Override - public void networkUnpack(NBTTagCompound nbt) { - this.heat = nbt.getInteger("heat"); - this.fluxDisplay = nbt.getDouble("flux"); - for(int i = 0; i < tanks.length; i++) { - tanks[i].readFromNBT(nbt, "t" + i); + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList list = nbt.getTagList("locks", 10); + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) { + locks[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } } + + for(int i = 0; i < tanks.length; i++) tanks[i].readFromNBT(nbt, "t" + i); + this.fluxLastBase = nbt.getDouble("lastFluxB"); + this.fluxLastReaction = nbt.getDouble("lastFluxR"); + + this.isLocked = nbt.getBoolean("isLocked"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList list = new NBTTagList(); + + for(int i = 0; i < locks.length; i++) { + if(locks[i] != null) { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte) i); + locks[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + nbt.setTag("locks", list); + + for(int i = 0; i < tanks.length; i++) tanks[i].writeToNBT(nbt, "t" + i); + nbt.setDouble("lastFluxB", fluxLastBase); + nbt.setDouble("lastFluxR", fluxLastReaction); + + nbt.setBoolean("isLocked", isLocked); } @Override diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_watz.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_watz.png index 861c7678a0e4181bf11049b3c837de6bcdfd3790..975289a431f5c3bbbbe2f8a724f7ddaee69ef0f1 100644 GIT binary patch delta 1277 zcmV;x9SW{Zlc1isbEg-Wl6{51KxytDnYhfRSSW z2i1L5Rw`OMx!&ddpT0Hpd}U=p`{xc!yc7n|1F+AmU48%PzAwom{gXrrfWfW*!ghb9 zx0OHH(g#_qFKbWBy0Lj%`?{h%NsE_O*cFJWXj{)b8!c$RmpRY`vZ*k{}Du)Xb=V3g7 zo`C!L19{IC;|JM^6abAzL+k(Yui8D`?Dqov{r({SbNlBGw70Z1=?sALgNlEI8O$T= z^Y>f_knhoeBm>6)c275TWApaJvjO|(4pcc@2;4OY;Oy{XVMp>|>zOI<2lMmYAHVyq zq~r=TX^{iKFU<98Z)&Z+Jn>ZE-qM!VPLBM~c>X_f2-rB1&n%)0E?J2heCVR4RX!wD;j`*8zmQ_$N{b%+JpoxxmO&JF|#7h95luD|jcP z^rrTDCL4>r3()Cww0Nm^5O7=&_|HcusKW0KL@oZgxjCJkdn2KxLP)t9xMYx#djb5y z_6vR7^AQy`1mcX|dvtVEm|JL(omoF{{V@Se4+rL(p#X-yoFeZb5O#mvlX(AalhAPH zm>|@sz)5~Z)Qo@dRKKAn4Iw`0PJKle0g#R`*8zAj#-*Pq#2Fef(&|o+V2eZ0!HT@?L}mbV*qeIo+o*ey5ytJPwT#Kj66TB{VdS~fb%AG z??;~x+IkOe@vl$lF%15`Eyn=}061;52*W-e-P#9j{U<%n8oQHW5GgXSiT46jt5wzO z_1G^$JG28k4ShZM=)en%2t+$Jv@<#)5MK{&4kH55j`i*Ewe`v27?Um$CX;Xw6C4;3 zh<2=R2gzYXAlk9M9YzF74kH55j`i&@B2bf05JWI0jtB(Uh!KIzVHW^!7y$q{i~s-} zHt`@JqXN^84egAM3Jh}?6_|FcZ-;}^$zd0hy$~joIS~^_j0#LU*0+P?Fe)%|hf#se zVHW^!7y$q{i~vBc_}zb)@l8pd=Xu?ByUm*mIL7Y*c;#|A(**&--~gZ*qiDliM0zb*iMonUkKzE|HaQ&`dj?9`m*+p zw)(}tceJIo`m&^65G?Lo(cXtml}e@fOAdAaRE(b@dHbDr#&+L>rcdhXr?DGg@#i`AZWhPUP01Z`yi15U~ucduwChY zZRJn4^g-6@%i7bjZfxGxzOHCb(&D8Rb_HT8+SW7AMhn_6=E3Pf^Ne=&C(WOP*gb%Q z>b}<0oM~Qq0cOzyu*d4hgt()^~y3V?;}iX`bL$Hzn6{u`UOC8@vv?@zm- z1sxwB>-{muKe&tVS(DD1&;vkRv3mf2{sF&PrjMI<5Fzl?v{R<^01#KK063`bOOkd^ z5AOo31so4pt1oMDr*}GVZ%Vs_z-$*y(E~tSvBv{g*skc}=POg^Tim&#%HhJqc^FTi zC*XemK;Co3_(66e1wfP2n_8m zy{WyP$;M*u0(3eZEney!1RNIx{__zEs_?r5QHy_WZcbN$Q(w_V0Hh<#bpT$Bap@-t@yDL^OD%ID+iem8Zh~%cB_=fHVr1$~1#Qt6Y0Qp6e zVGt&NP5g3D6W_mAtyZjmody0*8sX@_eYJ){NIL&`N`h3v*gN46w^8EEN^LH(~joHZ8 zg9CXrtssM*pY}V0y@1hqM|%-j;}`&(=Ski>q%QgB^V7QT8zaw8Yd=f$0N}hy-TTq! zgSOs-Tm0)2dJKcVZ_9B20su}MEyA#mN4NGtTmMOqv&Jry!4M)j0swFr0RT8`;=KUX zYE|`mJ@$*x4(-5BLthU*I`9G`0@02Q?Tn5H#MgtH!-zn%V|_b(ZGCb$29qBVHIr}< z1Rq8Oq8;noL2?)oh<2=RhY^92!-zn%V|_b}2$UR-0h1sP9h1)x6hHz1a2NpqIE)d2 zXvg|?kerDl0s%H+L?Cn61ppjI000gn004(gJP63Bz_epSJENll!yHBhrXB0s;ox*~ z*aefW5H(5y0B{(i0@IH5?I1af3XI%gRA6)11ppjI000gn0FWzw_aA0_Q