From 4d2bda7820807fb5c3557b620a1535430b7cf5c7 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 11 Apr 2022 16:17:46 +0200 Subject: [PATCH] better hadron diagnostics, chemplant + thermal cache fix (?) --- .../java/com/hbm/inventory/gui/GUIHadron.java | 46 +++++++----- .../hbm/inventory/recipes/HadronRecipes.java | 7 ++ .../hbm/tileentity/TileEntityMachineBase.java | 2 - .../tileentity/machine/TileEntityHadron.java | 70 +++++++++++++++--- .../machine/TileEntityMachineChemplant.java | 2 +- .../TileEntityMachineChemplantBase.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 6 ++ src/main/resources/assets/hbm/lang/en_US.lang | 6 ++ .../hbm/textures/gui/machine/gui_hadron.png | Bin 7491 -> 7673 bytes 9 files changed, 109 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIHadron.java b/src/main/java/com/hbm/inventory/gui/GUIHadron.java index caea1d6d8..1a50397ca 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIHadron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIHadron.java @@ -1,5 +1,8 @@ package com.hbm.inventory.gui; +import java.util.ArrayList; +import java.util.List; + import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerHadron; @@ -14,6 +17,7 @@ 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.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUIHadron extends GuiInfoContainer { @@ -44,29 +48,37 @@ public class GUIHadron extends GuiInfoContainer { this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 142, guiTop + 107, 18, 18, mouseX, mouseY, I18nUtil.resolveKeyArray("hadron.modeLine")); else this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 142, guiTop + 107, 18, 18, mouseX, mouseY, I18nUtil.resolveKeyArray("hadron.modeCircular")); + + List stats = new ArrayList(); + stats.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("hadron.stats")); + stats.add((hadron.stat_success ? EnumChatFormatting.GREEN : EnumChatFormatting.RED) + I18n.format("hadron." + this.hadron.state.name().toLowerCase())); + if(this.hadron.state.showCoord) stats.add(EnumChatFormatting.RED + I18nUtil.resolveKey("hadron.stats_coord", hadron.stat_x, hadron.stat_y, hadron.stat_z)); + stats.add(EnumChatFormatting.GRAY + I18nUtil.resolveKey("hadron.stats_momentum", hadron.stat_charge)); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 41, guiTop + 92, 25, 11, mouseX, mouseY, stats.toArray(new String[0])); } + @Override protected void mouseClicked(int x, int y, int i) { - super.mouseClicked(x, y, i); - - //Toggle hadron - if(guiLeft + 19 <= x && guiLeft + 19 + 18 > x && guiTop + 89 < y && guiTop + 89 + 18 >= y) { + super.mouseClicked(x, y, i); + + // Toggle hadron + if(guiLeft + 19 <= x && guiLeft + 19 + 18 > x && guiTop + 89 < y && guiTop + 89 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(hadron.xCoord, hadron.yCoord, hadron.zCoord, 0, 0)); - } - - //Toggle analysis chamber - if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 107 < y && guiTop + 107 + 18 >= y) { + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(hadron.xCoord, hadron.yCoord, hadron.zCoord, 0, 0)); + } + + // Toggle analysis chamber + if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 107 < y && guiTop + 107 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(hadron.xCoord, hadron.yCoord, hadron.zCoord, 0, 1)); - } - - //Toggle hopper mode - if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 89 < y && guiTop + 89 + 18 >= y) { + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(hadron.xCoord, hadron.yCoord, hadron.zCoord, 0, 1)); + } + + // Toggle hopper mode + if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 89 < y && guiTop + 89 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(hadron.xCoord, hadron.yCoord, hadron.zCoord, 0, 2)); - } - } + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(hadron.xCoord, hadron.yCoord, hadron.zCoord, 0, 2)); + } + } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { diff --git a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java index 9cf492908..a144053c1 100644 --- a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java @@ -6,6 +6,7 @@ import java.util.List; import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.TileEntityHadron.EnumHadronState; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -112,6 +113,8 @@ public class HadronRecipes { )); } + public static EnumHadronState returnCode = EnumHadronState.NORESULT; + /** * Resolves recipes, simple enough. * @param in1 @@ -126,12 +129,16 @@ public class HadronRecipes { if((r.in1.isApplicable(in1) && r.in2.isApplicable(in2)) || (r.in1.isApplicable(in2) && r.in2.isApplicable(in1))) { + + if(analysisOnly != r.analysisOnly) returnCode = EnumHadronState.NORESULT_WRONG_MODE; + if(momentum < r.momentum) returnCode = EnumHadronState.NORESULT_TOO_SLOW; if(momentum >= r.momentum && analysisOnly == r.analysisOnly) return new ItemStack[] {r.out1, r.out2}; } } + returnCode = EnumHadronState.NORESULT_WRONG_INGREDIENT; return null; } diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index de2396047..1801c52b5 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -5,14 +5,12 @@ import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; -import api.hbm.energy.ILoadedTile; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidTank; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index 0d8d4e9c8..03fd546f3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -43,6 +43,13 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs private static final int delayNoResult = 60; private static final int delayError = 100; + public boolean stat_success = false; + public EnumHadronState stat_state = EnumHadronState.IDLE; + public int stat_charge = 0; + public int stat_x = 0; + public int stat_y = 0; + public int stat_z = 0; + public TileEntityHadron() { super(5); } @@ -110,6 +117,13 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs data.setBoolean("analysis", analysisOnly); data.setBoolean("hopperMode", hopperMode); data.setByte("state", (byte) state.ordinal()); + + data.setBoolean("stat_success", stat_success); + data.setByte("stat_state", (byte) stat_state.ordinal()); + data.setInteger("stat_charge", stat_charge); + data.setInteger("stat_x", stat_x); + data.setInteger("stat_y", stat_y); + data.setInteger("stat_z", stat_z); this.networkPack(data, 50); } } @@ -119,9 +133,10 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs ItemStack[] result = HadronRecipes.getOutput(p.item1, p.item2, p.momentum, analysisOnly); if(result == null) { - this.state = EnumHadronState.NORESULT; + this.state = HadronRecipes.returnCode; this.delay = delayNoResult; worldObj.playSoundEffect(p.posX, p.posY, p.posZ, "random.orb", 2, 0.5F); + this.setStats(this.state, p.momentum, false); return; } @@ -150,6 +165,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs worldObj.playSoundEffect(p.posX, p.posY, p.posZ, "random.orb", 2, 1F); this.delay = delaySuccess; this.state = EnumHadronState.SUCCESS; + this.setStats(this.state, p.momentum, true); } @Override @@ -159,6 +175,13 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs this.analysisOnly = data.getBoolean("analysis"); this.hopperMode = data.getBoolean("hopperMode"); this.state = EnumHadronState.values()[data.getByte("state")]; + + this.stat_success = data.getBoolean("stat_success"); + this.stat_state = EnumHadronState.values()[data.getByte("stat_state")]; + this.stat_charge = data.getInteger("stat_charge"); + this.stat_x = data.getInteger("stat_x"); + this.stat_y = data.getInteger("stat_y"); + this.stat_z = data.getInteger("stat_z"); } @Override @@ -261,6 +284,21 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs return false; } + private void setStats(EnumHadronState state, int count, boolean success) { + this.stat_state = state; + this.stat_charge = count; + this.stat_success = success; + } + + private void setExpireStats(EnumHadronState state, int count, int x, int y, int z) { + this.stat_state = state; + this.stat_charge = count; + this.stat_x = x; + this.stat_y = y; + this.stat_z = z; + this.stat_success = false; + } + public class Particle { //Starting values @@ -307,6 +345,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs TileEntityHadron.this.state = reason; TileEntityHadron.this.delay = delayError; + TileEntityHadron.this.setExpireStats(reason, this.charge, posX, posY, posZ); } public boolean isExpired() { @@ -673,22 +712,31 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUs PROGRESS(0xffff00), ANALYSIS(0xffff00), NORESULT(0xff8000), + NORESULT_TOO_SLOW(0xff8000), + NORESULT_WRONG_INGREDIENT(0xff8000), + NORESULT_WRONG_MODE(0xff8000), SUCCESS(0x00ff00), - ERROR_NO_CHARGE(0xff0000), - ERROR_NO_ANALYSIS(0xff0000), - ERROR_OBSTRUCTED_CHANNEL(0xff0000), - ERROR_EXPECTED_COIL(0xff0000), - ERROR_MALFORMED_SEGMENT(0xff0000), - ERROR_ANALYSIS_TOO_LONG(0xff0000), - ERROR_ANALYSIS_TOO_SHORT(0xff0000), - ERROR_DIODE_COLLISION(0xff0000), - ERROR_BRANCHING_TURN(0xff0000), - ERROR_GENERIC(0xff0000); + ERROR_NO_CHARGE(0xff0000, true), + ERROR_NO_ANALYSIS(0xff0000, true), + ERROR_OBSTRUCTED_CHANNEL(0xff0000, true), + ERROR_EXPECTED_COIL(0xff0000, true), + ERROR_MALFORMED_SEGMENT(0xff0000, true), + ERROR_ANALYSIS_TOO_LONG(0xff0000, true), + ERROR_ANALYSIS_TOO_SHORT(0xff0000, true), + ERROR_DIODE_COLLISION(0xff0000, true), + ERROR_BRANCHING_TURN(0xff0000, true), + ERROR_GENERIC(0xff0000, true); public int color; + public boolean showCoord; private EnumHadronState(int color) { + this(color, false); + } + + private EnumHadronState(int color, boolean showCoord) { this.color = color; + this.showCoord = showCoord; } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index ff0901721..8717ebf39 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -389,7 +389,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements for(int j = 0; j < inv.getSizeInventory(); j++) { - if(inv.getStackInSlot(j) == null) { + if(inv.getStackInSlot(j) == null && inv.isItemValidForSlot(j, out)) { ItemStack copy = out.copy(); copy.stackSize = 1; inv.setInventorySlotContents(j, copy); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index 3ad9b2723..30cb133ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -286,7 +286,7 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa for(int j = 0; j < inv.getSizeInventory(); j++) { - if(inv.getStackInSlot(j) == null) { + if(inv.getStackInSlot(j) == null && inv.isItemValidForSlot(j, out)) { ItemStack copy = out.copy(); copy.stackSize = 1; inv.setInventorySlotContents(j, copy); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a5a08ce34..e40fd2465 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -437,7 +437,13 @@ hadron.idle=Leerlauf hadron.modeCircular=§eRingbeschleuniger:$Magnete bilden eine Schleife.$Schaltet mehr Rezepte frei. hadron.modeLine=§eLinearbeschleuniger:$Beschleuniger ended mit Analysekammer.$Weniger Rezepte. hadron.noresult=Kein Ergebnis. +hadron.noresult_too_slow=Momentum unz.! +hadron.noresult_wrong_ingredient=Falsches Rezept! +hadron.noresult_wrong_mode=Falscher Modus! hadron.progress=Verarbeite... +hadron.stats=Letztes Ergebnis: +hadron.stats_coord=Position des Fehlers: %s / %s / %s +hadron.stats_momentum=Momentum: %s hadron.success=Abgeschlossen! hazard.prot=Schützt vor Gefahren: diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 04d0910b7..97c9a30c7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -630,7 +630,13 @@ hadron.idle=Idle hadron.modeCircular=§eCircular Accelerator Mode:$Magnets must loop back into core.$Unlocks more recipes. hadron.modeLine=§eLinear Accelerator Mode:$Accelerator ends with analysis chamber.$Fewer Recipes. hadron.noresult=No Result. +hadron.noresult_too_slow=Insuff. momentum! +hadron.noresult_wrong_ingredient=Invalid recipe! +hadron.noresult_wrong_mode=Wrong mode! hadron.progress=In Progress... +hadron.stats=Previous results: +hadron.stats_coord=Erroring position: %s / %s / %s +hadron.stats_momentum=Momentum: %s hadron.success=Completed! hazard.prot=Protects against hazards: diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_hadron.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_hadron.png index 972b6bb2b6a9d7e68d9e32f4fa2c2acd0f51bfb3..9c5334115f2d5ce35a0cbd9f21c8b5b0ad860715 100644 GIT binary patch literal 7673 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 literal 7491 zcmbt(c{o)6+y9v{!&qYMTecxf_LOX8vW1F4_BCV|WyzYcWhZM1C5l9L^0AI=k*wK` z8H5l<_We1&zvp-TuJ1q3^Lwu6{Bh2?&UL@<{e9o}dA(yWI=3%SaZmvOa6wB`O&plX!f)Mu60C4e8OYPQuzwEV~5YLMX{#`AOoM*sUtvyO? zDvI)xG_7H_!Y>_IN=7ofAZDVl0HeAsYfhp zS9Shngws_jrorKyF0=ARA~8U8VKn|7<*|qwnw=Vn#}aqZPg-L!e=iLnLXAOQ{pF55<91Kg3{`S> zU}<>lV!tcLAS0Ac6~g=G!FMjbKmGzAMPVwiG%GYOQj_pXA4as4#6rLWP!CNRhSWziegGg zRRDxL5@e!|-X3Y2{dFgo9%|!Y^{?{&BA_krA`*5pj@MLm#0jU^_PZ!uGM3)8VzqH}4cj_CvoaVY4e8gPP}b0;E!RcYS}3jpa8r z-KY_pB0VrLU^Fu`yQ|C+2!ZSquP?DH=x9CuwCAqVSq_zi~R30)Ng2iYk4UyPJC+DfpEgf z!ErICJdMubrjdoeRa$wRY-(6IwvtwNXKyb*FAw!u2xDpKzO26Zfq;+wCAi?6zS>dMGu36gGFwY z8z35knk!?ser|99SPY^Cj zH6>fjRaNxyqo$=3)(n=mUVs2%8}8k^cL6x(4(QwRM&z0p1U3aUr!8H2@vvF|NrQqA zPhNXL?U7*y4^9@yDc3GLc^TMnqZ6-Qy9UvW#s2LpV}hZ%JpUe@eCl^`anZL0&fE9tEn`Fk;$zRfhtZ>8 zJ&@W{*_sp%rQhz;!tbsX_1g^!ztHSOE_n*SXMplSv3nhv&=(Zq;^H!>F0&+b+$c2? zK`(Wr;_B|6t^?a{HyxN5gz#3$iK^qYANw+7v;$YvW4x9r7N-((Sf5Q&V9c1}uO8xe z*YR2L|@P)jS{8dvVZlb`h z8921XrO;E8qv9~go^!$)qek32G7LVeuUEh?^^J^-ysN5`S&ejvuxQEBqX%N2HkY7` zA3qxPcYCF`O@pVr)$CSI{elAZi6^PckQ_fT5!2VF11$5PGfPDQlj}^v=1+OSFt@ZQ z``k=hQae)o39@{2bZkW8LHOlwWOL;C`9g4n%#MC6$$>HJrdZ`EmVt)P4 zA2mzM92d@6xbT=kY}6q2y*Ry>4K+1}v7c15ACv!Ff?@oeodpY>Z^K~|?FXZrsUeX< z<<6>4CQifu;cCJA=>xlKQ;vRk3(FN7saLW#te}!$51`w$#OA9j3i1dV1vL zgkEi#LwvhO#*h8}wPhaGX2}+*`lqb{uA#BPk;-))%98MK*uG1oPNvE~6BPf^4Z}vJDLn%h+AC zW>*`UF|GDOv`0EFHf~!a5U8E_cQT)dZeM|>i{N{_P*-T0qAx))=H|syggalRSA2Ul zES$i->l}$zWJF?w3Vz=+lTNjWC%7(skCvkdy9Ent&5N!|6|SQO7iHBFvhUmru9~c% zULX@rXSI;%R+@C~@FnhSU8;8qjx`O&RbR̢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