From 1b1dc6f9986ab9a5e2d1573e086edec7ebe8c781 Mon Sep 17 00:00:00 2001 From: DaSH Date: Mon, 27 Apr 2026 23:32:45 +0200 Subject: [PATCH 01/12] Can deactivate leading zeroes --- .../render/tileentity/RenderRBMKNumitron.java | 4 +++- .../machine/rbmk/TileEntityRBMKNumitron.java | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index 704d3425d..83c4202ef 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -56,7 +56,8 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { double yOffset = 0.5625D; String value = BobMathUtil.getShortNumber(unit.value); - while(value.length() < 7) value = "0" + value; + String fill_char = unit.no_leading_zeroes?" ":"0"; + while(value.length() < 7) value = fill_char + value; Tessellator tess = Tessellator.instance; tess.startDrawingQuads(); @@ -65,6 +66,7 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { char c = value.charAt(j); double u = -1; double v = 0; + if(c == ' ') continue; if(c == '.') {u = 0.9; v = 0.5;} if(c == '-') {u = 0.8; v = 0.5;} else if(c == 'k') {u = 0.0; v = 0.5;} diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 75daa384b..7356543cc 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -88,6 +88,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public long value; /** Whether this display is visible on the panel */ public boolean active; + /** If leading zeros should not be added */ + public boolean no_leading_zeroes; public DisplayUnit(int initialIndex) { label = "Display " + (initialIndex + 1); @@ -113,6 +115,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void serialize(ByteBuf buf) { + buf.writeBoolean(no_leading_zeroes); buf.writeBoolean(active); buf.writeBoolean(polling); BufferUtil.writeString(buf, label); @@ -121,6 +124,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void deserialize(ByteBuf buf) { + no_leading_zeroes = buf.readBoolean(); active = buf.readBoolean(); polling = buf.readBoolean(); label = BufferUtil.readString(buf); @@ -129,6 +133,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void readFromNBT(NBTTagCompound nbt, int index) { + this.no_leading_zeroes = nbt.getBoolean("no_leading_zeroes" + index); this.active = nbt.getBoolean("active" + index); this.polling = nbt.getBoolean("polling" + index); this.label = nbt.getString("label" + index); @@ -137,6 +142,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void writeToNBT(NBTTagCompound nbt, int index) { + nbt.setBoolean("no_leading_zeroes" + index, no_leading_zeroes); nbt.setBoolean("active" + index, active); nbt.setBoolean("polling" + index, polling); nbt.setString("label" + index, label); @@ -183,6 +189,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {null, "Invalid index (1-2)"}; java.util.LinkedHashMap map = new java.util.LinkedHashMap<>(); + map.put("no_leading_zeroes", displays[idx].no_leading_zeroes); map.put("active", displays[idx].active); map.put("polling", displays[idx].polling); map.put("label", displays[idx].label); @@ -241,4 +248,14 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI markDirty(); return new Object[] {true}; } + + @Callback(direct = true, limit = 2) + @Optional.Method(modid = "OpenComputers") + public Object[] setDisplayNoLeadingZeroes(Context context, Arguments args) { + int idx = args.checkInteger(0) - 1; + if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; + displays[idx].no_leading_zeroes = args.checkBoolean(1); + markDirty(); + return new Object[] {true}; + } } From 92c86a571985cb2d4272b07ae816d55a4011ae73 Mon Sep 17 00:00:00 2001 From: DaSH Date: Tue, 28 Apr 2026 02:17:43 +0200 Subject: [PATCH 02/12] Hexadecimal Display, Negative Number Display Fix, Active Digit Selection --- .../render/tileentity/RenderRBMKNumitron.java | 104 +++++++++++++++--- .../machine/rbmk/TileEntityRBMKNumitron.java | 37 +++++++ src/main/java/com/hbm/util/BobMathUtil.java | 56 +++++----- .../models/network/numitron_lights.png | Bin 712 -> 487 bytes 4 files changed, 157 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index 83c4202ef..ec1e3cfd6 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -54,35 +54,109 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { double w = 8D / scale; double h = 13D / scale; double yOffset = 0.5625D; + double line_height = 0.25D; - String value = BobMathUtil.getShortNumber(unit.value); - String fill_char = unit.no_leading_zeroes?" ":"0"; - while(value.length() < 7) value = fill_char + value; + String value = ""; + switch((int)unit.display_mode) { + case 0: // Normal + value = BobMathUtil.getShortNumber(unit.value); + break; + case 1: // Integer display + // Overflow handling + if (unit.value > 9999999) { + value = "9999999"; + break; + } + // Underflow handling + if (unit.value < -999999) { + value = "-999999"; + break; + } + value = Long.toString(unit.value); + break; + case 2: // Signed Hexadecimal display + // Overflow handling + if (unit.value > 0x7FFFFFF) { + value = "7ffffff"; + break; + } + // Underflow handling + // Theoretically this value is equal to 0x8000000 in a 28bit signed integer, but it's a long so we have to adapt + if (unit.value < -134217728) { + value = "8000000"; + break; + } + value = Long.toHexString(unit.value); + long length = value.length(); + + // A negative number will have many leading F's, so this needs to be accounted for + if(length > 7) { + value = value.substring((int)length-7); + } + break; + case 3: // Unsigned Hexadecimal display + // Overflow handling + if (unit.value > 0xFFFFFFF) { + value = "fffffff"; + break; + } + // Underflow handling + if (unit.value < 0) { + value = "-0"; + break; + } + value = Long.toHexString(unit.value); + break; + default: + value = BobMathUtil.getShortNumber(unit.value); + break; + } + + //** Fill up to 7 characters */ + if ((value.length() < 7) && (value.charAt(0) == '-') && (unit.no_leading_zeroes == false)) { + value = value.substring(1); + while(value.length() < 6) value = "0" + value; + value = "-" + value; + } else { + String fill_char = unit.no_leading_zeroes?" ":"0"; + while(value.length() < 7) value = fill_char + value; + } Tessellator tess = Tessellator.instance; tess.startDrawingQuads(); for(int j = 0; j < 7; j++) { + + //** Check if this digit is active */ + //** 0x40 is the bit for the left-most digit, with which this starts */ + if((unit.active_digits & (0x40L>>j)) == 0) continue; + double zOffset = (j - 3) * 0.1D; char c = value.charAt(j); double u = -1; double v = 0; if(c == ' ') continue; - if(c == '.') {u = 0.9; v = 0.5;} - if(c == '-') {u = 0.8; v = 0.5;} - else if(c == 'k') {u = 0.0; v = 0.5;} - else if(c == 'M') {u = 0.1; v = 0.5;} - else if(c == 'G') {u = 0.2; v = 0.5;} - else if(c == 'T') {u = 0.3; v = 0.5;} - else if(c == 'P') {u = 0.4; v = 0.5;} - else if(c == 'E') {u = 0.5; v = 0.5;} // i would love to say this sucks, but this is actually surprisingly easy to read and probably the most performant way of doing it - int charVal = c - '0'; // no string operations, no int parsing, no nothing, we just rawdog shit shit + if(c == '.') {u = 0.9; v = 1*line_height;} + if(c == '-') {u = 0.8; v = 1*line_height;} + else if(c == 'k') {u = 0.0; v = 1*line_height;} + else if(c == 'M') {u = 0.1; v = 1*line_height;} + else if(c == 'G') {u = 0.2; v = 1*line_height;} + else if(c == 'T') {u = 0.3; v = 1*line_height;} + else if(c == 'P') {u = 0.4; v = 1*line_height;} + else if(c == 'E') {u = 0.5; v = 1*line_height;} + else if(c == 'a') {u = 0.0; v = 2*line_height;} + else if(c == 'b') {u = 0.1; v = 2*line_height;} + else if(c == 'c') {u = 0.2; v = 2*line_height;} + else if(c == 'd') {u = 0.3; v = 2*line_height;} + else if(c == 'e') {u = 0.4; v = 2*line_height;} + else if(c == 'f') {u = 0.5; v = 2*line_height;} // i would love to say this sucks, but this is actually surprisingly easy to read and probably the most performant way of doing it + int charVal = c - '0'; // no string operations, no int parsing, no nothing, we just rawdog this shit if(charVal >= 0 && charVal <= 9) {u = 0.1 * charVal; v = 0.0;} - if(u == -1) {u = 0.8; v = 0.5;} + if(u == -1) {u = 0.8; v = 1*line_height;} tess.setNormal(0F, 1F, 0F); - tess.addVertexWithUV(0.03135, -h + yOffset, w - zOffset, u, v + 0.5); + tess.addVertexWithUV(0.03135, -h + yOffset, w - zOffset, u, v + line_height); tess.addVertexWithUV(0.03135, h + yOffset, w - zOffset, u, v); tess.addVertexWithUV(0.03135, h + yOffset, -w - zOffset, u + 0.1, v); - tess.addVertexWithUV(0.03135, -h + yOffset, -w - zOffset, u + 0.1, v + 0.5); + tess.addVertexWithUV(0.03135, -h + yOffset, -w - zOffset, u + 0.1, v + line_height); } tess.draw(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 7356543cc..2413f13ac 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -90,9 +90,14 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public boolean active; /** If leading zeros should not be added */ public boolean no_leading_zeroes; + /** Which digits are activated (bit mask, msb ignored) */ + public long active_digits; + /** Display mode 0=normal, 1=integer, 2=signed hexadecimal 3=unsigned hexadecimal */ + public long display_mode; public DisplayUnit(int initialIndex) { label = "Display " + (initialIndex + 1); + active_digits = 0b01111111; } public void update() { @@ -115,6 +120,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void serialize(ByteBuf buf) { + buf.writeLong(display_mode); + buf.writeLong(active_digits); buf.writeBoolean(no_leading_zeroes); buf.writeBoolean(active); buf.writeBoolean(polling); @@ -124,6 +131,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void deserialize(ByteBuf buf) { + display_mode = buf.readLong(); + active_digits = buf.readLong(); no_leading_zeroes = buf.readBoolean(); active = buf.readBoolean(); polling = buf.readBoolean(); @@ -133,6 +142,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void readFromNBT(NBTTagCompound nbt, int index) { + this.display_mode = nbt.getLong("display_mode" + index); + this.active_digits = nbt.getLong("active_digits" + index); this.no_leading_zeroes = nbt.getBoolean("no_leading_zeroes" + index); this.active = nbt.getBoolean("active" + index); this.polling = nbt.getBoolean("polling" + index); @@ -142,6 +153,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void writeToNBT(NBTTagCompound nbt, int index) { + nbt.setLong("display_mode" + index, display_mode); + nbt.setLong("active_digits" + index, active_digits); nbt.setBoolean("no_leading_zeroes" + index, no_leading_zeroes); nbt.setBoolean("active" + index, active); nbt.setBoolean("polling" + index, polling); @@ -189,6 +202,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {null, "Invalid index (1-2)"}; java.util.LinkedHashMap map = new java.util.LinkedHashMap<>(); + map.put("display_mode", displays[idx].display_mode); + map.put("active_digits", displays[idx].active_digits); map.put("no_leading_zeroes", displays[idx].no_leading_zeroes); map.put("active", displays[idx].active); map.put("polling", displays[idx].polling); @@ -258,4 +273,26 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI markDirty(); return new Object[] {true}; } + + @Callback(direct = true, limit = 2) + @Optional.Method(modid = "OpenComputers") + public Object[] setDisplayActiveDigits(Context context, Arguments args) { + int idx = args.checkInteger(0) - 1; + if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; + long val = (long) args.checkInteger(1); + displays[idx].active_digits = val; + markDirty(); + return new Object[] {true}; + } + + @Callback(direct = true, limit = 2) + @Optional.Method(modid = "OpenComputers") + public Object[] setDisplayMode(Context context, Arguments args) { + int idx = args.checkInteger(0) - 1; + if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; + long val = (long) args.checkInteger(1); + displays[idx].display_mode = val; + markDirty(); + return new Object[] {true}; + } } diff --git a/src/main/java/com/hbm/util/BobMathUtil.java b/src/main/java/com/hbm/util/BobMathUtil.java index 2bd421991..a38522a07 100644 --- a/src/main/java/com/hbm/util/BobMathUtil.java +++ b/src/main/java/com/hbm/util/BobMathUtil.java @@ -193,39 +193,45 @@ public class BobMathUtil { } public static String getShortNumber(long l) { + double res; + String magnitude_letter = ""; - if(l >= Math.pow(10, 18)) { - double res = l / Math.pow(10, 18); - res = Math.round(res * 100.0) / 100.0; - return res + "E"; + if(Math.abs(l) >= Math.pow(10, 18)) { + res = l / Math.pow(10, 18); + magnitude_letter = "E"; } - if(l >= Math.pow(10, 15)) { - double res = l / Math.pow(10, 15); - res = Math.round(res * 100.0) / 100.0; - return res + "P"; + else if(Math.abs(l) >= Math.pow(10, 15)) { + res = l / Math.pow(10, 15); + magnitude_letter = "P"; } - if(l >= Math.pow(10, 12)) { - double res = l / Math.pow(10, 12); - res = Math.round(res * 100.0) / 100.0; - return res + "T"; + else if(Math.abs(l) >= Math.pow(10, 12)) { + res = l / Math.pow(10, 12); + magnitude_letter = "T"; } - if(l >= Math.pow(10, 9)) { - double res = l / Math.pow(10, 9); - res = Math.round(res * 100.0) / 100.0; - return res + "G"; + else if(Math.abs(l) >= Math.pow(10, 9)) { + res = l / Math.pow(10, 9); + magnitude_letter = "G"; } - if(l >= Math.pow(10, 6)) { - double res = l / Math.pow(10, 6); - res = Math.round(res * 100.0) / 100.0; - return res + "M"; + else if(Math.abs(l) >= Math.pow(10, 6)) { + res = l / Math.pow(10, 6); + magnitude_letter = "M"; } - if(l >= Math.pow(10, 3)) { - double res = l / Math.pow(10, 3); - res = Math.round(res * 100.0) / 100.0; - return res + "k"; + else if(Math.abs(l) >= Math.pow(10, 3)) { + res = l / Math.pow(10, 3); + magnitude_letter = "k"; + } + else { + return Long.toString(l); } - return Long.toString(l); + // Edgecase: a negative triple digit number would result in a 8 character long result so we will loose one decimal place + if (res <= -100.0) { + res = Math.round(res * 10.0) / 10.0; + } else { + res = Math.round(res * 100.0) / 100.0; + } + + return res + magnitude_letter; } /** diff --git a/src/main/resources/assets/hbm/textures/models/network/numitron_lights.png b/src/main/resources/assets/hbm/textures/models/network/numitron_lights.png index 438ad67240cb0b3f0344740fc558f5485135e237..5fd0ed71a64f8344112c57f88b33d5ce6f4b4c43 100644 GIT binary patch delta 474 zcmV<00VV#(1?K~h7k@Ma0{{R3?^>eL00001b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^ z1poj54^T{0MF0Q*X)FN0PXPbqV~02Z^7T;300009a7bBm000id000id0mpBsWB>pG zVM# z0p9VQ7p|H=fPXnk=c8wexUN1Hzcjr(0$H@16I2<$D{=tdbEKjts@B$;9hjea&TshV zz?1_K$ifMfl;+t(B^1}Z85mWBMH-FMr&xXO|I+)%_?NiLCp1{fQ*;QE>~@vUhhq{CjCYj8OUUt0dA49kMIZ$Vj}k2x|2)|FeC<)+BD_twm7M$NWEwh!K7VN=a0L zl*FYXBEedOBuM&{e{&~d?F1zI)*>`z{n{e9xKH}^UiGiqUpkT#xG~Ce^K%xb;i*4P zV_5^$O17fBwik6gH$U|Wa2E}ny`2U+0Z=bqFg#H~aP3v>qh!56yxWcCvPVd%|;@wv_fN~T00JY~?hUx7J*nj}64sC@uF%{Ewzhy-6C8O;KHyJYT#HOGKh|0?yh jvBH(=m*>1}NbSIHT+k~E{O| Date: Tue, 28 Apr 2026 10:24:17 +0200 Subject: [PATCH 03/12] Comment enhancement --- src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index ec1e3cfd6..72ca5ae42 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -113,6 +113,7 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { } //** Fill up to 7 characters */ + //** For negative numbers when zeroes are added: put the zeroes between the - and hte number */ if ((value.length() < 7) && (value.charAt(0) == '-') && (unit.no_leading_zeroes == false)) { value = value.substring(1); while(value.length() < 6) value = "0" + value; From 3e9b104dbcada21ff92fb6e64cd91fa51d90240f Mon Sep 17 00:00:00 2001 From: DaSH Date: Tue, 28 Apr 2026 10:28:13 +0200 Subject: [PATCH 04/12] OpenComputers Conventions: -display mode id now starts at 1 as seen from OC -range checks for setting active digits and display mode --- .../hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 2413f13ac..299f5d052 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -202,7 +202,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {null, "Invalid index (1-2)"}; java.util.LinkedHashMap map = new java.util.LinkedHashMap<>(); - map.put("display_mode", displays[idx].display_mode); + map.put("display_mode", displays[idx].display_mode + 1); map.put("active_digits", displays[idx].active_digits); map.put("no_leading_zeroes", displays[idx].no_leading_zeroes); map.put("active", displays[idx].active); @@ -280,6 +280,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; long val = (long) args.checkInteger(1); + if(val < 0 || val >= 128) return new Object[] {false, "Invalid value (0-127)"}; displays[idx].active_digits = val; markDirty(); return new Object[] {true}; @@ -290,7 +291,8 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public Object[] setDisplayMode(Context context, Arguments args) { int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; - long val = (long) args.checkInteger(1); + long val = (long) args.checkInteger(1) - 1; + if(val < 0 || val >= 4) return new Object[] {false, "Invalid value (1-4)"}; displays[idx].display_mode = val; markDirty(); return new Object[] {true}; From a4a66475022c10d1d9b2c1470f79eebc89d10f8f Mon Sep 17 00:00:00 2001 From: DaSH Date: Tue, 28 Apr 2026 12:45:33 +0200 Subject: [PATCH 05/12] comment fix --- src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index 72ca5ae42..1e129296c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -113,7 +113,7 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { } //** Fill up to 7 characters */ - //** For negative numbers when zeroes are added: put the zeroes between the - and hte number */ + //** For negative numbers when zeroes are added: put the zeroes between the '-' and the number */ if ((value.length() < 7) && (value.charAt(0) == '-') && (unit.no_leading_zeroes == false)) { value = value.substring(1); while(value.length() < 6) value = "0" + value; From d57a8c9dc4d87d693a5e6589471f1dabd353c75e Mon Sep 17 00:00:00 2001 From: DaSH Date: Thu, 30 Apr 2026 10:24:04 +0200 Subject: [PATCH 06/12] Hard Exception when setting display mode or active digits with an illegal value --- .../hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 299f5d052..31a2f42a8 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -280,7 +280,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; long val = (long) args.checkInteger(1); - if(val < 0 || val >= 128) return new Object[] {false, "Invalid value (0-127)"}; + if(val < 0 || val >= 128) throw new IllegalArgumentException("Invalid value (0-127)"); displays[idx].active_digits = val; markDirty(); return new Object[] {true}; @@ -292,7 +292,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; long val = (long) args.checkInteger(1) - 1; - if(val < 0 || val >= 4) return new Object[] {false, "Invalid value (1-4)"}; + if(val < 0 || val >= 4) throw new IllegalArgumentException("Invalid value (1-4)"); displays[idx].display_mode = val; markDirty(); return new Object[] {true}; From 70e1f48de04fdd98e27b7cc2d13c4d763928f641 Mon Sep 17 00:00:00 2001 From: DaSH Date: Thu, 30 Apr 2026 10:36:16 +0200 Subject: [PATCH 07/12] No more hexadecimal display --- .../render/tileentity/RenderRBMKNumitron.java | 62 ++++-------------- .../machine/rbmk/TileEntityRBMKNumitron.java | 4 +- .../models/network/numitron_lights.png | Bin 487 -> 712 bytes 3 files changed, 13 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index 1e129296c..5d0bb2b62 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -54,7 +54,6 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { double w = 8D / scale; double h = 13D / scale; double yOffset = 0.5625D; - double line_height = 0.25D; String value = ""; switch((int)unit.display_mode) { @@ -74,39 +73,6 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { } value = Long.toString(unit.value); break; - case 2: // Signed Hexadecimal display - // Overflow handling - if (unit.value > 0x7FFFFFF) { - value = "7ffffff"; - break; - } - // Underflow handling - // Theoretically this value is equal to 0x8000000 in a 28bit signed integer, but it's a long so we have to adapt - if (unit.value < -134217728) { - value = "8000000"; - break; - } - value = Long.toHexString(unit.value); - long length = value.length(); - - // A negative number will have many leading F's, so this needs to be accounted for - if(length > 7) { - value = value.substring((int)length-7); - } - break; - case 3: // Unsigned Hexadecimal display - // Overflow handling - if (unit.value > 0xFFFFFFF) { - value = "fffffff"; - break; - } - // Underflow handling - if (unit.value < 0) { - value = "-0"; - break; - } - value = Long.toHexString(unit.value); - break; default: value = BobMathUtil.getShortNumber(unit.value); break; @@ -136,28 +102,22 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { double u = -1; double v = 0; if(c == ' ') continue; - if(c == '.') {u = 0.9; v = 1*line_height;} - if(c == '-') {u = 0.8; v = 1*line_height;} - else if(c == 'k') {u = 0.0; v = 1*line_height;} - else if(c == 'M') {u = 0.1; v = 1*line_height;} - else if(c == 'G') {u = 0.2; v = 1*line_height;} - else if(c == 'T') {u = 0.3; v = 1*line_height;} - else if(c == 'P') {u = 0.4; v = 1*line_height;} - else if(c == 'E') {u = 0.5; v = 1*line_height;} - else if(c == 'a') {u = 0.0; v = 2*line_height;} - else if(c == 'b') {u = 0.1; v = 2*line_height;} - else if(c == 'c') {u = 0.2; v = 2*line_height;} - else if(c == 'd') {u = 0.3; v = 2*line_height;} - else if(c == 'e') {u = 0.4; v = 2*line_height;} - else if(c == 'f') {u = 0.5; v = 2*line_height;} // i would love to say this sucks, but this is actually surprisingly easy to read and probably the most performant way of doing it + if(c == '.') {u = 0.9; v = 0.5;} + if(c == '-') {u = 0.8; v = 0.5;} + else if(c == 'k') {u = 0.0; v = 0.5;} + else if(c == 'M') {u = 0.1; v = 0.5;} + else if(c == 'G') {u = 0.2; v = 0.5;} + else if(c == 'T') {u = 0.3; v = 0.5;} + else if(c == 'P') {u = 0.4; v = 0.5;} + else if(c == 'E') {u = 0.5; v = 0.5;} // i would love to say this sucks, but this is actually surprisingly easy to read and probably the most performant way of doing it int charVal = c - '0'; // no string operations, no int parsing, no nothing, we just rawdog this shit if(charVal >= 0 && charVal <= 9) {u = 0.1 * charVal; v = 0.0;} - if(u == -1) {u = 0.8; v = 1*line_height;} + if(u == -1) {u = 0.8; v = 0.5;} tess.setNormal(0F, 1F, 0F); - tess.addVertexWithUV(0.03135, -h + yOffset, w - zOffset, u, v + line_height); + tess.addVertexWithUV(0.03135, -h + yOffset, w - zOffset, u, v + 0.5); tess.addVertexWithUV(0.03135, h + yOffset, w - zOffset, u, v); tess.addVertexWithUV(0.03135, h + yOffset, -w - zOffset, u + 0.1, v); - tess.addVertexWithUV(0.03135, -h + yOffset, -w - zOffset, u + 0.1, v + line_height); + tess.addVertexWithUV(0.03135, -h + yOffset, -w - zOffset, u + 0.1, v + 0.5); } tess.draw(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 31a2f42a8..34eb63e4a 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -92,7 +92,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public boolean no_leading_zeroes; /** Which digits are activated (bit mask, msb ignored) */ public long active_digits; - /** Display mode 0=normal, 1=integer, 2=signed hexadecimal 3=unsigned hexadecimal */ + /** Display mode 0=normal, 1=integer */ public long display_mode; public DisplayUnit(int initialIndex) { @@ -292,7 +292,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; long val = (long) args.checkInteger(1) - 1; - if(val < 0 || val >= 4) throw new IllegalArgumentException("Invalid value (1-4)"); + if(val < 0 || val >= 2) throw new IllegalArgumentException("Invalid value (1-2)"); displays[idx].display_mode = val; markDirty(); return new Object[] {true}; diff --git a/src/main/resources/assets/hbm/textures/models/network/numitron_lights.png b/src/main/resources/assets/hbm/textures/models/network/numitron_lights.png index 5fd0ed71a64f8344112c57f88b33d5ce6f4b4c43..438ad67240cb0b3f0344740fc558f5485135e237 100644 GIT binary patch delta 701 zcmV;u0z&=g1IPuC7k?TE1^@s6Aky2X00004b3#c}2nYxWdH-FMr&xXO|I+)%_?NiLCp1{fQ*;QE>~@vUhhq{CjCYj8OUUt0dA49kMIZ$Vj}k2x|2)|FeC<)+BD_twm7M$NWEwh!K7VN=a0L zl*FYXBEedOBuM&{e{&~d?F1zI)*>`z{n{e9xKH}^UiGiqUpkT#xG~Ce^K%xb;i*4P zV_5^$O17fBwik6gH$U|Wa2E}ny`2U+0Z=bqFg#H~aP3v>qh!56yxWcCvPVd%|;@wv_fN~T00JY~?hUx7J*nj}64sC@uF%{Ewzhy-6C8O;KHyJYT#HOGKh|0?yh jvBH(=m*>1}NbSIHT+k~E{O|eL00001b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^ z1poj54^T{0MF0Q*X)FN0PXPbqV~02Z^7T;300009a7bBm000id000id0mpBsWB>pG zVM# z0p9VQ7p|H=fPXnk=c8wexUN1Hzcjr(0$H@16I2<$D{=tdbEKjts@B$;9hjea&TshV zz?1_K$ifMfl;+t(B^1}Z85mWBM Date: Thu, 30 Apr 2026 11:56:00 +0200 Subject: [PATCH 08/12] display mode long changed to shorten number boolean --- .../render/tileentity/RenderRBMKNumitron.java | 30 ++++++++----------- .../machine/rbmk/TileEntityRBMKNumitron.java | 19 ++++++------ 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index 5d0bb2b62..b1a1d1bb0 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -56,26 +56,20 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { double yOffset = 0.5625D; String value = ""; - switch((int)unit.display_mode) { - case 0: // Normal - value = BobMathUtil.getShortNumber(unit.value); + if (unit.shorten_number) { + value = BobMathUtil.getShortNumber(unit.value); + } else { + // Overflow handling + if (unit.value > 9999999) { + value = "9999999"; break; - case 1: // Integer display - // Overflow handling - if (unit.value > 9999999) { - value = "9999999"; - break; - } - // Underflow handling - if (unit.value < -999999) { - value = "-999999"; - break; - } - value = Long.toString(unit.value); - break; - default: - value = BobMathUtil.getShortNumber(unit.value); + } + // Underflow handling + if (unit.value < -999999) { + value = "-999999"; break; + } + value = Long.toString(unit.value); } //** Fill up to 7 characters */ diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 34eb63e4a..2df44ce5b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -93,11 +93,12 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI /** Which digits are activated (bit mask, msb ignored) */ public long active_digits; /** Display mode 0=normal, 1=integer */ - public long display_mode; + public boolean shorten_number; public DisplayUnit(int initialIndex) { label = "Display " + (initialIndex + 1); active_digits = 0b01111111; + shorten_number = true; } public void update() { @@ -120,7 +121,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void serialize(ByteBuf buf) { - buf.writeLong(display_mode); + buf.writeBoolean(shorten_number); buf.writeLong(active_digits); buf.writeBoolean(no_leading_zeroes); buf.writeBoolean(active); @@ -131,7 +132,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void deserialize(ByteBuf buf) { - display_mode = buf.readLong(); + shorten_number = buf.readBoolean(); active_digits = buf.readLong(); no_leading_zeroes = buf.readBoolean(); active = buf.readBoolean(); @@ -142,7 +143,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void readFromNBT(NBTTagCompound nbt, int index) { - this.display_mode = nbt.getLong("display_mode" + index); + this.shorten_number = nbt.getBoolean("shorten_number" + index); this.active_digits = nbt.getLong("active_digits" + index); this.no_leading_zeroes = nbt.getBoolean("no_leading_zeroes" + index); this.active = nbt.getBoolean("active" + index); @@ -153,7 +154,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI } public void writeToNBT(NBTTagCompound nbt, int index) { - nbt.setLong("display_mode" + index, display_mode); + nbt.setBoolean("shorten_number" + index, shorten_number); nbt.setLong("active_digits" + index, active_digits); nbt.setBoolean("no_leading_zeroes" + index, no_leading_zeroes); nbt.setBoolean("active" + index, active); @@ -202,7 +203,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {null, "Invalid index (1-2)"}; java.util.LinkedHashMap map = new java.util.LinkedHashMap<>(); - map.put("display_mode", displays[idx].display_mode + 1); + map.put("shorten_number", displays[idx].shorten_number); map.put("active_digits", displays[idx].active_digits); map.put("no_leading_zeroes", displays[idx].no_leading_zeroes); map.put("active", displays[idx].active); @@ -288,12 +289,10 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI @Callback(direct = true, limit = 2) @Optional.Method(modid = "OpenComputers") - public Object[] setDisplayMode(Context context, Arguments args) { + public Object[] setDisplayShortenNumber(Context context, Arguments args) { int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; - long val = (long) args.checkInteger(1) - 1; - if(val < 0 || val >= 2) throw new IllegalArgumentException("Invalid value (1-2)"); - displays[idx].display_mode = val; + displays[idx].shorten_number = args.checkBoolean(1); markDirty(); return new Object[] {true}; } From a3c89f6077407103616a119adea0b2502ce72b65 Mon Sep 17 00:00:00 2001 From: DaSH Date: Thu, 30 Apr 2026 12:05:42 +0200 Subject: [PATCH 09/12] inverted no_leading_zeroes to leading_zeroes --- .../render/tileentity/RenderRBMKNumitron.java | 4 ++-- .../machine/rbmk/TileEntityRBMKNumitron.java | 17 +++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index b1a1d1bb0..2270591b7 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -74,12 +74,12 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { //** Fill up to 7 characters */ //** For negative numbers when zeroes are added: put the zeroes between the '-' and the number */ - if ((value.length() < 7) && (value.charAt(0) == '-') && (unit.no_leading_zeroes == false)) { + if ((value.length() < 7) && (value.charAt(0) == '-') && unit.leading_zeroes) { value = value.substring(1); while(value.length() < 6) value = "0" + value; value = "-" + value; } else { - String fill_char = unit.no_leading_zeroes?" ":"0"; + String fill_char = unit.leading_zeroes?"0":" "; while(value.length() < 7) value = fill_char + value; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index 2df44ce5b..c7fe719c2 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -89,7 +89,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI /** Whether this display is visible on the panel */ public boolean active; /** If leading zeros should not be added */ - public boolean no_leading_zeroes; + public boolean leading_zeroes; /** Which digits are activated (bit mask, msb ignored) */ public long active_digits; /** Display mode 0=normal, 1=integer */ @@ -99,6 +99,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI label = "Display " + (initialIndex + 1); active_digits = 0b01111111; shorten_number = true; + leading_zeroes = true; } public void update() { @@ -123,7 +124,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public void serialize(ByteBuf buf) { buf.writeBoolean(shorten_number); buf.writeLong(active_digits); - buf.writeBoolean(no_leading_zeroes); + buf.writeBoolean(leading_zeroes); buf.writeBoolean(active); buf.writeBoolean(polling); BufferUtil.writeString(buf, label); @@ -134,7 +135,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public void deserialize(ByteBuf buf) { shorten_number = buf.readBoolean(); active_digits = buf.readLong(); - no_leading_zeroes = buf.readBoolean(); + leading_zeroes = buf.readBoolean(); active = buf.readBoolean(); polling = buf.readBoolean(); label = BufferUtil.readString(buf); @@ -145,7 +146,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public void readFromNBT(NBTTagCompound nbt, int index) { this.shorten_number = nbt.getBoolean("shorten_number" + index); this.active_digits = nbt.getLong("active_digits" + index); - this.no_leading_zeroes = nbt.getBoolean("no_leading_zeroes" + index); + this.leading_zeroes = nbt.getBoolean("leading_zeroes" + index); this.active = nbt.getBoolean("active" + index); this.polling = nbt.getBoolean("polling" + index); this.label = nbt.getString("label" + index); @@ -156,7 +157,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI public void writeToNBT(NBTTagCompound nbt, int index) { nbt.setBoolean("shorten_number" + index, shorten_number); nbt.setLong("active_digits" + index, active_digits); - nbt.setBoolean("no_leading_zeroes" + index, no_leading_zeroes); + nbt.setBoolean("leading_zeroes" + index, leading_zeroes); nbt.setBoolean("active" + index, active); nbt.setBoolean("polling" + index, polling); nbt.setString("label" + index, label); @@ -205,7 +206,7 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI java.util.LinkedHashMap map = new java.util.LinkedHashMap<>(); map.put("shorten_number", displays[idx].shorten_number); map.put("active_digits", displays[idx].active_digits); - map.put("no_leading_zeroes", displays[idx].no_leading_zeroes); + map.put("leading_zeroes", displays[idx].leading_zeroes); map.put("active", displays[idx].active); map.put("polling", displays[idx].polling); map.put("label", displays[idx].label); @@ -267,10 +268,10 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI @Callback(direct = true, limit = 2) @Optional.Method(modid = "OpenComputers") - public Object[] setDisplayNoLeadingZeroes(Context context, Arguments args) { + public Object[] setDisplayLeadingZeroes(Context context, Arguments args) { int idx = args.checkInteger(0) - 1; if(idx < 0 || idx >= 2) return new Object[] {false, "Invalid index (1-2)"}; - displays[idx].no_leading_zeroes = args.checkBoolean(1); + displays[idx].leading_zeroes = args.checkBoolean(1); markDirty(); return new Object[] {true}; } From 93a159c342ed8674f2ba4189fc47fd4ee3eb9cb4 Mon Sep 17 00:00:00 2001 From: DaSH Date: Thu, 30 Apr 2026 12:08:01 +0200 Subject: [PATCH 10/12] First work on Numitron GUI --- .../inventory/gui/GUIScreenRBMKDisplay.java | 18 +++++++++++------- .../gui/machine/gui_rbmk_numitron.png | Bin 2618 -> 1630 bytes 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java index 3a69051be..b3e04c134 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java @@ -21,7 +21,7 @@ public class GUIScreenRBMKDisplay extends GuiScreen { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rbmk_numitron.png"); public TileEntityRBMKNumitron display; protected int xSize = 256; - protected int ySize = 114; + protected int ySize = 150; protected int guiLeft; protected int guiTop; @@ -29,6 +29,8 @@ public class GUIScreenRBMKDisplay extends GuiScreen { protected GuiTextField[] rtty = new GuiTextField[2]; protected boolean[] active = new boolean[2]; protected boolean[] polling = new boolean[2]; + protected boolean[] shorten_number = new boolean[2]; + protected boolean[] leading_zeroes = new boolean[2]; public GUIScreenRBMKDisplay(TileEntityRBMKNumitron display) { this.display = display; @@ -46,13 +48,15 @@ public class GUIScreenRBMKDisplay extends GuiScreen { int oY = 4; for(int i = 0; i < 2; i++) { - label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 175 + oX, guiTop + 55 + oY + i * 36, 72 - oX * 2, 14); + label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 54, 72 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 30, display.displays[i].label); - rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 36, 72 - oX * 2, 14); + rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 54, 72 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, display.displays[i].rtty); active[i] = display.displays[i].active; polling[i] = display.displays[i].polling; + shorten_number[i] = display.displays[i].shorten_number; + leading_zeroes[i] = display.displays[i].leading_zeroes; } } @@ -76,8 +80,8 @@ public class GUIScreenRBMKDisplay extends GuiScreen { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); for(int i = 0; i < 2; i++) { - if(this.active[i]) drawTexturedModalRect(guiLeft + 111, guiTop + i * 36 + 54, 18, 114, 16, 16); - if(this.polling[i]) drawTexturedModalRect(guiLeft + 128, guiTop + i * 36 + 53, 0, 114, 18, 18); + if(this.active[i]) drawTexturedModalRect(guiLeft + 111, guiTop + i * 54 + 54, 18, 150, 16, 16); + if(this.polling[i]) drawTexturedModalRect(guiLeft + 128, guiTop + i * 54 + 53, 0, 150, 18, 18); } for(int i = 0; i < 2; i++) { @@ -91,13 +95,13 @@ public class GUIScreenRBMKDisplay extends GuiScreen { super.mouseClicked(x, y, b); for(int i = 0; i < 2; i++) { - if(guiLeft + 111 <= x && guiLeft + 111 + 16 > x && guiTop + i * 36 + 54 < y && guiTop + i * 36 + 54 + 16 >= y) { + if(guiLeft + 111 <= x && guiLeft + 111 + 16 > x && guiTop + i * 54 + 54 < y && guiTop + i * 54 + 54 + 16 >= y) { this.active[i] = !this.active[i]; mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.active[i] ? 0.25F : 0F))); return; } - if(guiLeft + 128 <= x && guiLeft + 128 + 18 > x && guiTop + i * 36 + 53 < y && guiTop + i * 36 + 53 + 18 >= y) { + if(guiLeft + 128 <= x && guiLeft + 128 + 18 > x && guiTop + i * 54 + 53 < y && guiTop + i * 54 + 53 + 18 >= y) { this.polling[i] = !this.polling[i]; mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.polling[i] ? 0.25F : 0F))); return; diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_numitron.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_numitron.png index f340bfb02c4ca8c20a73e4b818294d2923be3d0b..924fbaf7d56eb9437b44135852e6681dee5e41b7 100644 GIT binary patch literal 1630 zcmdT^Yfw{16yAHuEtm*c6i^x^#Sk=Th++VrTr6lJ1PKO2DiF$3WGqh!Nq`Fl1S=py zEu(<(RV-v^Km{g(#`3I15Jf10fHIb1#n)6tf^07x{o$|9^j~+*neTja=Inm^?abzS zd2TnPT2KK1h628;HvkA(BEUe8g#9W%@f?fy-o6!7chM(ELWyt@x&Tm9K${81NUrhn z5WA7se*J85L9&mJk5Z|`aU22wA>?woVzKyUNQhD>T+B0%jEqclc3$FQ?g0To5U?*a z4S;kC$TR@i^Fhu6K%gK41BVPjo;fJA1mCd$OiP14p76^ZFw_kmaE1prK)E9%Qee0% zjN1f>b?`6;9<_z(a+sD1Gwfj@8=kO+r#^?7Nsv&$GAnp~8N5J;Ik7N92CF`UDhv2+ zG|Z2LS&5|V8rG>-By36W_S{7Z{_hKDbg>TPPV-{;d*T5wYMx7^{p$;%q-SFSR~NA~ zaPnlX=NNa9+h#ps@QO=iYP+zJ{#x@62>VtDt6J(47Krlh56Lx*0PDlD8NO9}H#7Hv zwZNpPB&e|@VQNk2!}?z+GvQ(3ZRb$#?=C14e;*%+G7b$dv^Y?>ONj8aqh{+(7>J3N z2oZ@3&Rpo?Fzj(QV>yq3G`Qtc#C~{F;7{?ij$sq6Eujli=1}Gayxb7p-cNpJjc()< zl=lJJHhoNRj-+d)bQEnkGoI!yV|j`|C$pU5mQZhc5+J=#OJ zl?3lw!FXw>+*e3d7rp!qHKVS|Vk&zgFW=rdJz0xpnBI!6^PjMJH~W^_@q#7sLk1#l zn{w|&G!g`xq4Ut7S51zN35h}K;3wtLCamU!y%_vjjy_pXs3s zM&E2<0K_S(q}?&9P#p7ggIfxbSj3Fe(du{FMxA^O%02-tN}RW{kXrgpIu`qj&1~xcdNtP;PGDXAsjndTX0hO&brfN-!G*vfs z@6VeRo z7z?{)qLnTWrAe-scF9d^&sWAKCV|S9U;IztsxIkH{sp*Vn zV!R4*R%@KIN`Wc9EN09ZfofjZ!mSS;jX z&Tl`3P@5a=_i`VIqPhPpp>H*L5?y}FEU*$gF20_p^W>WGxOb)4G$v|AgKh}%)PGKXu3y?d7BwdZp<6<<<^_jFw$$b_boD8CR{#?mfdd&--bEoq_Pr7cfs(TS;j)Z zJ8zL0Nl4&jts`q%VQ$-vWKGqrc}B?c3UXamtV%f(tWrxLb!mPiv{&O!mec4A8r33^ z#QWe0_ve2I{BGhjgyaVWw08oAKmCvJ4H9cKMp3ptCugF#>YzrcU>Z*VSkO>o)^=R*isFIl2rECI}SY8UrDovoGVo9d;tKw127U zAI1IY=W*o2CVaDMuLD=rU{eH?iHE(CjA_H8fSHgqh(?W@1VT zGCm=p0_XJ|UV+P}%Qz#M%;}jCoHPA`wb2cjbB;4>SCeTWzUZC@Ke99lDqmp+d(}bD z-(#+HYZPB{sGL$Hb-m*<7)#6YwWXmu%kc}cDY?Yd8zZvzKpy=X7#Q&Gt*D!vt7}YZ zpI$FZR>-q^!}jtc!6RP-LbcZEGouOw9IjaA1>aj4?kU+H?eLIX<#-IkaXPLQ;=ge7 za9C!_i_X$jgZWF}U`OfJ7e-h!$$Qxs?C+jj1g@vd%)&QJuXh(rG>C*B*JwF?!KC+6 z7GKwu_SODGQCq)S6qYiYfnnTaxw6Zzk`bX#8&ALIS)#!-Qve2HWWB~5q|>N zb?jRtG4@{j(bH7$+~@RxfdP;&3irU&2`Om@a+r3i-5kLb#LAn-mZrbj_aZKj2cA85 z&JEQCL{){$g@V4`;!? zH~%vJ-em7;!~0suT~t8aebOV|0C9tD)(oMA6Bm;*(bfUFG>YD$-j9WOf{rnS+-45; zeeCBRO_d7P^zz19N7%3AG_8@B){+M%ebaX1911L*h%dq^O+CY_@4gL+fd%JW3FFMq zC+KUPXHX~x&JSbbNQ>LM zjRr@#%SJ{zE(;s(FlLs15em;qRj(F&Ih~b EdVH&i@0!H~2Yq}X2)ILsx#!;jEL zQ>5H$WOXZ-p`jr-JfPQ(!63##K3QgEbm--@b>}p(BU;d-4ZnL@lm?pP%uCoX@|*GC zTG8P1AFGZMbRjmrS!TRfo3@uo158W3bNmCc{8Ow;>vfJNJy;qTGk~Y(8cPh&`p!2a zY>lJqjmAH9WdzY41*&~qg56Xdek;m|Z|wg;ch2!FHqkeezC25Ct3sfQ9WoMQT|$M1 zq2&RcF~@QeUuw_C*p9P3TT(5?XBE^5h~{2)t84xfpRx!UVKCQz)qb3no3+VbsM?(R zJVN$7997QY*ZQJ@W({;6)B%sXZ$uM{9nAC;4Ts}8TDL=;`c@DtiBJ z{lN5AP;UQN=g_KFR7r|la@_KMiQ7K&R+i*x>&vb{)R3(QRlU4qUBov!Y00Ew9${>5 ziWn?445`(gr~76@66t}RL)h3&n{*!50TBotV;RYTH7ao0xD;VJ&OB{2L)juiRHN&} zKnUDZ2vPpA(#uj3PjRx@_5SJ^xK{5CPzY^)UEruq?a2;JJm10w<>^n$(xEi-F-JrH z>|KzU;tHnZ!%z}+F5LV^&04@ydxqbTUF@pY55#q?{SHjqym-2VNj zFDmxOV5b{pYr-mfx?cd&ku_TVH79UOP^v$)TnG(=-#v^UE2!+77EYa|Rmjwoudx4D bJN81MQYo&;)DCr2e5t|1%?nk1FyzV~^u*s| From 820da70e5f548dad55b4565b792f9387af7e50eb Mon Sep 17 00:00:00 2001 From: DaSH Date: Thu, 30 Apr 2026 13:09:12 +0200 Subject: [PATCH 11/12] Numitron GUI --- .../inventory/gui/GUIScreenRBMKDisplay.java | 32 ++++++++++++++---- .../machine/rbmk/TileEntityRBMKNumitron.java | 4 +++ .../gui/machine/gui_rbmk_numitron.png | Bin 1630 -> 1809 bytes 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java index b3e04c134..71583b47f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRBMKDisplay.java @@ -48,9 +48,9 @@ public class GUIScreenRBMKDisplay extends GuiScreen { int oY = 4; for(int i = 0; i < 2; i++) { - label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 54, 72 - oX * 2, 14); + label[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 73 + oY + i * 54, 85 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(label[i], 30, display.displays[i].label); - rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 54, 72 - oX * 2, 14); + rtty[i] = new GuiTextField(this.fontRendererObj, guiLeft + 27 + oX, guiTop + 55 + oY + i * 54, 85 - oX * 2, 14); GUIScreenRBMKKeyPad.setupTextFieldStandard(rtty[i], 10, display.displays[i].rtty); active[i] = display.displays[i].active; @@ -80,8 +80,10 @@ public class GUIScreenRBMKDisplay extends GuiScreen { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); for(int i = 0; i < 2; i++) { - if(this.active[i]) drawTexturedModalRect(guiLeft + 111, guiTop + i * 54 + 54, 18, 150, 16, 16); - if(this.polling[i]) drawTexturedModalRect(guiLeft + 128, guiTop + i * 54 + 53, 0, 150, 18, 18); + if(this.active[i]) drawTexturedModalRect(guiLeft + 124, guiTop + i * 54 + 54, 18, 150, 16, 16); + if(this.polling[i]) drawTexturedModalRect(guiLeft + 159, guiTop + i * 54 + 53, 0, 150, 18, 18); + if(this.shorten_number[i]) drawTexturedModalRect(guiLeft + 195, guiTop + i * 54 + 53, 34, 150, 18, 18); + if(this.leading_zeroes[i]) drawTexturedModalRect(guiLeft + 231, guiTop + i * 54 + 53, 52, 150, 18, 18); } for(int i = 0; i < 2; i++) { @@ -95,17 +97,29 @@ public class GUIScreenRBMKDisplay extends GuiScreen { super.mouseClicked(x, y, b); for(int i = 0; i < 2; i++) { - if(guiLeft + 111 <= x && guiLeft + 111 + 16 > x && guiTop + i * 54 + 54 < y && guiTop + i * 54 + 54 + 16 >= y) { + if(guiLeft + 124 <= x && guiLeft + 124 + 16 > x && guiTop + i * 54 + 54 < y && guiTop + i * 54 + 54 + 16 >= y) { this.active[i] = !this.active[i]; mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.active[i] ? 0.25F : 0F))); return; } - if(guiLeft + 128 <= x && guiLeft + 128 + 18 > x && guiTop + i * 54 + 53 < y && guiTop + i * 54 + 53 + 18 >= y) { + if(guiLeft + 159 <= x && guiLeft + 159 + 18 > x && guiTop + i * 54 + 53 < y && guiTop + i * 54 + 53 + 18 >= y) { this.polling[i] = !this.polling[i]; mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.polling[i] ? 0.25F : 0F))); return; } + + if(guiLeft + 195 <= x && guiLeft + 195 + 18 > x && guiTop + i * 54 + 53 < y && guiTop + i * 54 + 53 + 18 >= y) { + this.shorten_number[i] = !this.shorten_number[i]; + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.shorten_number[i] ? 0.25F : 0F))); + return; + } + + if(guiLeft + 231 <= x && guiLeft + 231 + 18 > x && guiTop + i * 54 + 53 < y && guiTop + i * 54 + 53 + 18 >= y) { + this.leading_zeroes[i] = !this.leading_zeroes[i]; + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F + (this.leading_zeroes[i] ? 0.25F : 0F))); + return; + } } if(guiLeft + 209 <= x && guiLeft + 209 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { @@ -113,12 +127,18 @@ public class GUIScreenRBMKDisplay extends GuiScreen { NBTTagCompound data = new NBTTagCompound(); byte active = 0; byte polling = 0; + byte shorten_number = 0; + byte leading_zeroes = 0; for(int i = 0; i < 2; i++) { if(this.active[i]) active |= 1 << i; if(this.polling[i]) polling |= 1 << i; + if(this.shorten_number[i]) shorten_number |= 1 << i; + if(this.leading_zeroes[i]) leading_zeroes |= 1 << i; } data.setByte("active", active); data.setByte("polling", polling); + data.setByte("shorten_number", shorten_number); + data.setByte("leading_zeroes", leading_zeroes); for(int i = 0; i < 2; i++) { data.setString("label" + i, this.label[i].getText()); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java index c7fe719c2..c9897aa3d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKNumitron.java @@ -179,9 +179,13 @@ public class TileEntityRBMKNumitron extends TileEntityLoadedBase implements IGUI int active = data.getByte("active"); int polling = data.getByte("polling"); + int shorten_number = data.getByte("shorten_number"); + int leading_zeroes = data.getByte("leading_zeroes"); for(int i = 0; i < 2; i++) { this.displays[i].active = (active & (1 << i)) != 0; this.displays[i].polling = (polling & (1 << i)) != 0; + this.displays[i].shorten_number = (shorten_number & (1 << i)) != 0; + this.displays[i].leading_zeroes = (leading_zeroes & (1 << i)) != 0; } for(int i = 0; i < 2; i++) { diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_numitron.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rbmk_numitron.png index 924fbaf7d56eb9437b44135852e6681dee5e41b7..99a8d67032d140f9a54a29a17388a14f58722913 100644 GIT binary patch delta 1320 zcmZuudsLDK6zBVplp#q#?)lw6e)ryUAHO?s$y2O!Mp zh^?V$hxg{+t11O^RYQYk);8jpt5)!Z&i^t^t!=9m4Bb5;4HaqX?Ia*84bM&BGH zZf1&JPch2xFbNFK$fBaex;772ts5hQolV}p?T5=%Fp zm68~SGz2EOAzJjX7R?8Q01Lo20a&D%fK6)>IGBKkfu0bo(h6C$yh{SuJ+$0C*0nYbLG-Vg?H>ZX!l+d zHsr%jL~dESLj-9{jUnELoXAub(p-P#;eeC^wxF8bMUYmew(bG$-Mh(ID3S$E2m-Kw z@^fzLEFejWF@mHI5cqU8e8Bkr>gsJsy{Sn+XjyPEj};u^?J+4B+0<_ebLf#OIi@?| zNK|AK>LigW>JaD@(}}Axo&(Tck$Ksv<08(+9o1P^t#y&I+kqbiy}h?$s8NDN5v!KqzgvQydUpJ#SYRmw*%x6f!nr6KC=Nc=GWtyFc?XxBEAiy zHzt&{o9~<$cuURrnpQ~Md5`E=5l}Z5xQ$h8CQi-ysk_p;E@dyCf9kopQi>K0`z40a zE5v{X16PV&Ck07Rr$ODir!(ke69iu%?)k|L7LUbEJ%kxe^R9jr zaP{`}6|i5m;jAk&;J;cv0eXQ!nooY#qcVQ!foCwkl-xUnIknvCFL!!-cMI=+Pz=nz z)CtaRP2D3LT#0CVY!b)js$0*zf8D)?FOT>fgxyJn1z%yLxu+X;TjJ}tGyOzz@YRpVET7Guhq9T_O zEdMRtv`4NBRnvmtjE^7tR6Xxrym;56>eFV10fAqIczR025{ai*p55zL(3qKTt+L?F}4eo-y z_|Z@Z3-}|esJcq%VF8s<=#lZ4qs`5oynblIhDR^epP`ooI=I&kMl%9kU{KEOMUggD?p&*sJ<+E2bU~24^X#oe(C%zwSNvm;&Q3i`(L~j*` Har6HMi3(EK delta 1120 zcmbQpcaLX7Dq}s%V^0^ykczmsvpfAB8;H2tGW#ZKY?-@3KlT3gP2wm1|G%c;yZXrX z5`n9?-753J%@cgS1ZdlyrS*gRw?Jf534*MDXTW5Mzo@#P5+?Sugu>3(IcTKwI z`6HZ;4dH8w8+unuF5K{;K$L@0T^f(p#clP6;@Ca8AMupx*kZvtd@MS4s@jCDbbT zHn{Ol{^ZliAYM)@i|hW++y`UI=>tm7!! z;^q;X+_CFeP10QEoS3s5t*z~=9U>}raJ95*F=#o&CNoD=w_Pz^w$8A$H}ygs>zcsB zOKgIbfD*5yHoJrTT94PW1>7?{Syj?LJeVY$Jn2Y+M~kP=B$Xd2O&uzRJAz8Li5)N8 zvuD$;ZQFKjk~v;DB}B^jSB_rab#t@r+sezfZ8tN&wwUi-kggG9plx+3)3x&N-}w3Z z`}p|3eJ|_hWX*Xqch0=}x$!Y`=Fgq?CN}P&-qlCKjHhS+UVhztdwKbG^Xtoh->ts0 zG^(bEFXE<^#qP?AnyRXr9hTM=bq8Zt9aR_Iu&cJB?)Q&dulL&BnoO(gX?m&fd3U|V8 z(R0 Date: Fri, 1 May 2026 00:26:59 +0200 Subject: [PATCH 12/12] Bug fix --- .../com/hbm/render/tileentity/RenderRBMKNumitron.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java index 2270591b7..bb3f17d09 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKNumitron.java @@ -62,14 +62,14 @@ public class RenderRBMKNumitron extends TileEntitySpecialRenderer { // Overflow handling if (unit.value > 9999999) { value = "9999999"; - break; } // Underflow handling - if (unit.value < -999999) { + else if (unit.value < -999999) { value = "-999999"; - break; } - value = Long.toString(unit.value); + else { + value = Long.toString(unit.value); + } } //** Fill up to 7 characters */