From 78f6909ff08e269a9d325d8777729b5d835ba0af Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Tue, 7 Oct 2025 10:08:56 +0200 Subject: [PATCH 01/88] update --- dependencies.gradle | 16 ++++++++-------- settings.gradle.kts | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index d4a2fbb..625bcb8 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.7.77-GTNH:dev") - implementation("com.github.GTNewHorizons:GTNHLib:0.6.39:dev") - compileOnly("com.github.GTNewHorizons:BetterQuesting:3.7.11-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.2.18-1.7.10:dev") - // implementation("com.github.GTNewHorizons:ModularUI2:99.99:dev") - implementation("com.github.GTNewHorizons:StructureLib:1.4.18:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.51.440:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.6-GTNH:dev") + implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") + compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.4-GTNH:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") + // implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") + implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.19:dev") } // deps may transitively add Baubles, so we replace it @@ -49,7 +49,7 @@ project.getConfigurations() final DependencySubstitutions ds = c.getResolutionStrategy() .getDependencySubstitution() ds.substitute(ds.module("com.github.GTNewHorizons:Baubles")) - .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.1.9-GTNH")) + .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.2.0-GTNH")) .withClassifier("dev") .because("Baubles-Expanded replaces Baubles") }) diff --git a/settings.gradle.kts b/settings.gradle.kts index cbf0d00..0966c6f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,5 +17,5 @@ pluginManagement { } plugins { - id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.41") + id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.43") } From ee6c746eed123cf52d213094a9f33b6d0193b4b1 Mon Sep 17 00:00:00 2001 From: Ranzu <66495944+Ranzuu@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:54:02 +0200 Subject: [PATCH 02/88] pixels --- .../vendingmachine/textures/gui/tabs_left.png | Bin 3140 -> 3188 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/vendingmachine/textures/gui/tabs_left.png b/src/main/resources/assets/vendingmachine/textures/gui/tabs_left.png index 0c532c63b880212a322cf41a264edf3881e04bc5..9e5b665373066bd798a762a156320dd830c46589 100644 GIT binary patch literal 3188 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 DUC74X literal 3140 zcmXw*c|6qH8^^!M*s^a;WXm$jSSF1vWf=^TeP0@l^@f=kS;x-UuPu>1JJ+@E5!thh zJriZA5LrS@L-kYl^*iVFeBRIboadb9{CVPx?&&ZyUS1t`h<&@xX=y@doAmj2f{me{BJOpBw zLYGk*TYSdkLpKv@By$%sRr;D71Djq?3LpYUm|+pdsb%yq$VynTW@^1id^DAD{q_Yg zV)hZ1i!W2xsRq3KB4BSkXIbzh|&7>*XqVVY*KDC-IJ?1s#S+Mng5ojlHThzi{WBLvBP$Ce@4%s^e4b2EuT@O0+} z?6;|mI)4zxQ8GY$L$@yr{*gdOu!Bkenw0DH>ZK(+eX4?ok}{inlmeDe&HKSblkRtW zpB()U(-qTja+(ebUM_)Ui2mV;HSG6`>jea|Al*-20Uq`<(e7B83@yZH*)u$8)|tWKue8gOO0=nhO_5FOAmV+z`8<1 ztqzI3@CYTh62X;1g%IN93TrOBlo3&blBfXr7P8An!m*cd;pi24MLOy5QPhPcDic|j z{4mLV#xXUvsOVufZW97dNOPFKA=)a1?;{PZCc6=T2ECZ329lavZM)E3 zb`yfT+yO9awiX(@aZtDe>8{E$l=a%wv3t-qq6`)3lcRWhNA_Wgg3=MKJx{PS!EC!x zhJ8<0*sU1vgqO32v9T*ZPmpEjd8Mt9>MzQ`E?k|$Q9|vm_BKVJM6f*`nOZ(<%LUTX zk~6xS!Sq^?J9_PTW|2h^ytvAk&M2?q_N@6V;~EopN~&XYyvnbWpG}Cw67^^fvA|8_j{fOp*k z54je`AhsZmAX=4VeB{+N9JWRAzTK^RvDf>}S8T8nSW7Ht8~6psd$zqq)`7$Q(XY;A z?O@gr`a8)5!Vu0xhJT}w8rK}5MQM}Tiu!H({_3I}-(v6eW1ok$#aQXyLfkUs7wZ-? zM!JZ?CBsF9J%x89@fJX0x z1KLkITv7wEYnrRZ@sLx9D+Fy8Rb}XG+CJ+$tG#8trO2##ql|Xa#J#i$;}+Q@$sHe` zr`M#Hub1@t5x3-(BEBh_&Cf?LiX+9BqGAp;H#G0w5}$+5U9YO0TdxSH_&TRI`*u!y z_I>4zS^VtGY-^=o z!#|ljKRtgi^Ln~!TDka}SjPA6s%pQQQqTR=+`iV8}B>=Nf+Ub3i@)@ za(pnt_?0o*_0Dkubdu*Dk46G0f$uKIOnP>ohjX&cG&B;*1nrb6um)QV*m^c@wNl(X zF?n9^-0(v&4>;XS-Dc2-)iv4BH!Xw5Z|x53mfNd09ux6iu3kf}i)g=@{J#VryzK3M z^D{ECIC8jX+;MuUM{cTq{wpY9kP+?alIN$P5};J`Sb6#Qm>1xh}JGI6F+;u6~-b_!^bI|hs+yH8-CFdlVOuPMJKNk`!b{P zg2@c5OtlQ5mmE2b*`{8Gb)ZHfGHGi?xt(8SSnSZT9B;ssXKcc|__UuEZY5JkKg7OJ6-#cFxgK8%o7>r6B;16FqgxmDm zPuUjQ*0rE;r5mp)=95*W)q$4VwbC}K-Gi9%@aCvy_lKd7CTS^|;C5*jd&5+Vsb|mY zzlChuCUD1V4Jg3dJSrAr-$E7?+uV1{stg46{l$3oYxJ+{Eo0Wby2($*EuY-SzfEg$ zt{W@zAX;wjZbDXHe%FY;}q60qRxn=(2z4%)3F4YD{_S zQvqs%C_x}JhrIKxPn{6-cU^K5-j!_cN!MIl!ntMlUTN;hwAfDaw!rPn{!OhzrR5)j zM)ytxXH+eG>^}LE7+%Fa=PbClUXXkHiSO3u&mU*dUHXB0xpAsKH8L+S`yP{|!;N5K z-sh7qcLLsjJF91!;7xXLvj5WY5nJig6H@qr?o?12bOoeB;3ss*sMzm<^A&>E;!mH< zSa#Lsck*C&riaf`SGSGdVBRC!gu6yMzi(PlYBpMZyogKIKD_wWkNMMG@u$yD_(J4= z)Z1?fsovgFRo+MSMyjBf>Lur6XGk0`A#=xp?0=>^pPpSl zaOe6jyVJ3cB)^ybXE0fAm7729j?QLkbM9BXT=+G;>%50sIQn4;u61#E`ocKWX9c?L z`KvR_kMl;1#~buLpzsHk(bba%;$^$) zey|Ww8Tb^ie^Yv)#q*RKmA{d(RLw-yAmBh@F*;opJAc^kVU_R)Na{Zjg0lVQN-ChA z4KqlmbQ?1956LajHu#(XbJ~=MkWq9e%gWDD;^V1x>dWqOM5g`$Tvd z_KX(S2lr>_fsbi_}G+&12+!BbDGzB~FY2{Hp5BI14TRSeNrT2jf c`SETSupVERbz7BT;P*jYt$T=nHBb@%1D;gDL;wH) From 32e7bd24f56b9917072c4dcda45ecf21510b3c7b Mon Sep 17 00:00:00 2001 From: cubefury Date: Tue, 7 Oct 2025 22:06:45 +0800 Subject: [PATCH 03/88] Fixed structurelib display and added hint for uplink hatch in tooltip --- .../blocks/MTEVendingMachine.java | 17 +++++++++++------ .../blocks/gui/MTEVendingMachineGui.java | 17 +++++++++++------ .../assets/vendingmachine/lang/en_US.lang | 1 + 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 54df808..a149496 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -5,6 +5,8 @@ import static com.cubefury.vendingmachine.api.enums.Textures.VM_MACHINE_FRONT_ON_GLOW; import static com.cubefury.vendingmachine.api.enums.Textures.VM_OVERLAY; import static com.cubefury.vendingmachine.api.enums.Textures.VM_OVERLAY_ACTIVE; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; import static gregtech.api.util.GTStructureUtility.ofHatchAdderOptional; import java.util.ArrayList; @@ -79,12 +81,14 @@ public class MTEVendingMachine extends MTEMultiBlockBase .addShape("main", new String[][] { { "cc", "c~", "cc" } }) .addElement( 'c', - ofHatchAdderOptional( - MTEVendingMachine::addUplinkHatch, - ((BlockCasings11) GregTechAPI.sBlockCasings11).getTextureIndex(0), - 1, - GregTechAPI.sBlockCasings11, - 0)) + ofChain( + ofBlock(GregTechAPI.sBlockCasings11, 0), + ofHatchAdderOptional( + MTEVendingMachine::addUplinkHatch, + ((BlockCasings11) GregTechAPI.sBlockCasings11).getTextureIndex(0), + 1, + GregTechAPI.sBlockCasings11, + 0))) .build(); private final ArrayList uplinkHatches = new ArrayList<>(); @@ -359,6 +363,7 @@ protected MultiblockTooltipBuilder getTooltip() { .beginStructureBlock(2, 3, 1, false) .addController("Middle") .addOtherStructurePart("Tin Item Pipe Casings", "Everything except the controller") + .addOtherStructurePart("ME Vending Uplink Hatch", "Any Pipe Casing, Optional") .addStructureInfo("Cannot be flipped onto its side") .toolTipFinisher(); } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 5fcfd38..47e9bdc 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -128,7 +128,7 @@ public ModularPanel build(PosGuiData guiData, PanelSyncManager syncManager, UISe panel.child( new Column().size(20) .right(5)); - panel.child(createIOColumn(syncManager)); + panel.child(createIOColumn()); return panel; } @@ -253,7 +253,7 @@ private void doEjectItems() { ejectItems = false; } - private IWidget createIOColumn(PanelSyncManager syncManager) { + private IWidget createIOColumn() { return new ParentWidget<>().excludeAreaInNEI() .width(50) .height(178) @@ -336,10 +336,14 @@ private SlotGroupWidget createOutputSlots() { return SlotGroupWidget.builder() .matrix("II", "II", "II") .key('I', index -> { - ModularSlot ms = new ModularSlot(base.outputItems, index).accessibility(false, true) - .slotGroup("outputSlotGroup"); - ms.changeListener((newItem, onlyAmountChanged, client, init) -> {}); - return new ItemSlot().slot(ms); + /* + * ModularSlot ms = new ModularSlot(base.outputItems, index).accessibility(false, true) + * .slotGroup("outputSlotGroup"); + */ + // ms.changeListener((newItem, onlyAmountChanged, client, init) -> {}); + return new ItemSlot().slot( + new ModularSlot(base.outputItems, index).accessibility(false, true) + .slotGroup("outputSlotGroup")); }) .build(); } @@ -388,6 +392,7 @@ private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller t builder.emptyLine(); builder.addLine(IKey.str(cur.label).style(IKey.GRAY)); + builder.addLine(IKey.str(Translator.translate("vendingmachine.gui.trade_hint")).style(IKey.GRAY)); } } } diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 70de284..58623e3 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -14,6 +14,7 @@ vendingmachine.gui.coin_eject=Eject All Coins vendingmachine.gui.single_coin_type_eject_hint=Shift-Click to Extract vendingmachine.gui.search=Search vendingmachine.gui.required_inputs=Requires: +vendingmachine.gui.trade_hint=Shift-Click to Purchase vendingmachine.gui.cooldown_display.second=s vendingmachine.gui.cooldown_display.minute=m From 04a55e5a721e0f3570f1cc5e97a222ab638476be Mon Sep 17 00:00:00 2001 From: cubefury Date: Tue, 7 Oct 2025 23:31:47 +0800 Subject: [PATCH 04/88] Cleaned up input/output slot method naming --- .../blocks/gui/MTEVendingMachineGui.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 47e9bdc..f2d80ad 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -268,7 +268,7 @@ private IWidget createIOColumn() { .width(30) .height(20)) .child( - new Row().child(createInputRow().center()) + new Row().child(createInputSlots().center()) .top(20) .height(18 * 3)) .child( @@ -299,7 +299,7 @@ private IWidget createIOColumn() { .right(1)); } - private SlotGroupWidget createInputRow() { + private SlotGroupWidget createInputSlots() { return SlotGroupWidget.builder() .matrix("II", "II", "II") .key('I', index -> { @@ -336,11 +336,6 @@ private SlotGroupWidget createOutputSlots() { return SlotGroupWidget.builder() .matrix("II", "II", "II") .key('I', index -> { - /* - * ModularSlot ms = new ModularSlot(base.outputItems, index).accessibility(false, true) - * .slotGroup("outputSlotGroup"); - */ - // ms.changeListener((newItem, onlyAmountChanged, client, init) -> {}); return new ItemSlot().slot( new ModularSlot(base.outputItems, index).accessibility(false, true) .slotGroup("outputSlotGroup")); @@ -493,8 +488,8 @@ private IWidget createInventoryRow() { @Override protected void registerSyncValues(PanelSyncManager syncManager) { super.registerSyncValues(syncManager); - syncManager.registerSlotGroup("inputSlotGroup", 6, true); - syncManager.registerSlotGroup("outputSlotGroup", 4, false); + syncManager.registerSlotGroup("inputSlotGroup", 2, true); + syncManager.registerSlotGroup("outputSlotGroup", 2, false); BooleanSyncValue ejectItemsSyncer = new BooleanSyncValue(() -> this.ejectItems, val -> { this.ejectItems = val; From 9a52adde08abd574b22353a41e2b17d80b469f16 Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 8 Oct 2025 00:17:07 +0800 Subject: [PATCH 05/88] Fixed structure hint. --- .../cubefury/vendingmachine/blocks/MTEVendingMachine.java | 7 ++++--- src/main/resources/assets/vendingmachine/lang/en_US.lang | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index a149496..41cdc09 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -48,6 +48,7 @@ import com.cubefury.vendingmachine.trade.TradeRequest; import com.cubefury.vendingmachine.util.BigItemStack; import com.cubefury.vendingmachine.util.OverlayHelper; +import com.cubefury.vendingmachine.util.Translator; import com.gtnewhorizon.structurelib.StructureLibAPI; import com.gtnewhorizon.structurelib.alignment.IAlignment; import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; @@ -82,13 +83,13 @@ public class MTEVendingMachine extends MTEMultiBlockBase .addElement( 'c', ofChain( - ofBlock(GregTechAPI.sBlockCasings11, 0), ofHatchAdderOptional( MTEVendingMachine::addUplinkHatch, ((BlockCasings11) GregTechAPI.sBlockCasings11).getTextureIndex(0), 1, GregTechAPI.sBlockCasings11, - 0))) + 0), + ofBlock(GregTechAPI.sBlockCasings11, 0))) .build(); private final ArrayList uplinkHatches = new ArrayList<>(); @@ -347,7 +348,7 @@ public boolean getDefaultHasMaintenanceChecks() { @Override public String[] getStructureDescription(ItemStack stackSize) { - return getTooltip().getStructureHint(); + return new String[] { Translator.translate("structure.vendingmachine.hint.1") }; } @Override diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 58623e3..9446c0b 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -2,6 +2,8 @@ item.vendingmachine.placeholder.name=Placeholder Item tooltip.vendingmachine=Who's even restocking this... +structure.vendingmachine.hint.1=Hint 1 Dot: Tin Item Pipe Casing, ME Vending Uplink Hatch + vendingmachine.gui.requirementHeader=Requirements: vendingmachine.gui.requirement.unknown=Unknown Requirement vendingmachine.gui.requirement.betterquesting=Quest From 9a7af7d0ade6a6760b5b43ae06ce18333f5adfa0 Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 8 Oct 2025 00:45:08 +0800 Subject: [PATCH 06/88] Fix edge-case NPE on load when player attempts to load tradestate for a removed tradegroup. --- .../java/com/cubefury/vendingmachine/trade/TradeDatabase.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java index a6e669a..4d16562 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java @@ -126,7 +126,9 @@ public void populateTradeStateFromNBT(NBTTagCompound nbt, UUID player, boolean m UUID tgId = NBTConverter.UuidValueType.TRADEGROUP.readId(state); TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroupFromId(tgId); TradeHistory th = new TradeHistory(state.getLong("lastTrade"), state.getInteger("tradeCount")); - tg.setTradeState(player, th); + if (tg != null) { + tg.setTradeState(player, th); + } } TradeManager.INSTANCE.populateCurrencyFromNBT(nbt, player, merge); } From d7ab8bb5cb7634337e7cb5046f74006afca7c250 Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Wed, 8 Oct 2025 08:33:00 +0200 Subject: [PATCH 07/88] update --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 625bcb8..9bd54c8 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -36,11 +36,11 @@ dependencies { implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.6-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") - compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.4-GTNH:dev") + compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") // implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.19:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.21:dev") } // deps may transitively add Baubles, so we replace it From e0646fb6c545568c0a7e87bd15e67b8f94b14879 Mon Sep 17 00:00:00 2001 From: Omgise <106000018+Omgise@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:44:57 +0800 Subject: [PATCH 08/88] Update zh_CN.lang --- .../assets/vendingmachine/lang/zh_CN.lang | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/resources/assets/vendingmachine/lang/zh_CN.lang b/src/main/resources/assets/vendingmachine/lang/zh_CN.lang index 2893c68..070ba55 100644 --- a/src/main/resources/assets/vendingmachine/lang/zh_CN.lang +++ b/src/main/resources/assets/vendingmachine/lang/zh_CN.lang @@ -2,6 +2,8 @@ item.vendingmachine.placeholder.name=占位符物品 tooltip.vendingmachine=到底是谁在补货啊... +structure.vendingmachine.hint.1=Hint 1 Dot: Tin Item Pipe Casing, ME Vending Uplink Hatch + vendingmachine.gui.requirementHeader=需求条件: vendingmachine.gui.requirement.unknown=未知需求 vendingmachine.gui.requirement.betterquesting=任务 @@ -10,15 +12,21 @@ vendingmachine.gui.neiColor.conditionDefault=000000 vendingmachine.gui.neiColor.conditionSatisfied=55D441 vendingmachine.gui.neiColor.conditionUnsatisfied=A87A5E vendingmachine.gui.item_eject=取出物品 +vendingmachine.gui.coin_eject=取出所有代币 +vendingmachine.gui.single_coin_type_eject_hint=Shift-点击提取 vendingmachine.gui.search=搜索 vendingmachine.gui.required_inputs=需要: +vendingmachine.gui.trade_hint=Shift-Click to Purchase vendingmachine.gui.cooldown_display.second=秒 vendingmachine.gui.cooldown_display.minute=分 vendingmachine.gui.cooldown_display.hour=时 vendingmachine.gui.cooldown_display.day=天 +vendingmachine.gui.error.player_using=当前有其他玩家正在使用此自动售货机 + gt.blockmachines.multimachine.vendingmachine.name=自动售货机 +hatch.vendinguplink.me.name=ME自动售货接入接口 vendingmachine.category.unknown=未知分类 vendingmachine.category.all=全部物品 @@ -29,3 +37,18 @@ vendingmachine.category.chemistry=化工 vendingmachine.category.magic=魔法 vendingmachine.category.bees=蜜蜂 vendingmachine.category.misc=杂项 + +vendingmachine.coin.adventure=探险家代币 +vendingmachine.coin.bees=养蜂员代币 +vendingmachine.coin.blood=吸血鬼代币 +vendingmachine.coin.chemist=化学家代币 +vendingmachine.coin.cook=厨师代币 +vendingmachine.coin.darkWizard=魔法师代币 +vendingmachine.coin.farmer=农民代币 +vendingmachine.coin.flower=园艺代币 +vendingmachine.coin.forestry=护林员代币 +vendingmachine.coin.smith=匠师代币 +vendingmachine.coin.space=太空代币 +vendingmachine.coin.survivor=幸存者代币 +vendingmachine.coin.technician=技术员代币 +vendingmachine.coin.witch=巫师代币 From e1f86c51dd68d5501453099392488a2c6c832df8 Mon Sep 17 00:00:00 2001 From: Omgise <106000018+Omgise@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:50:01 +0800 Subject: [PATCH 09/88] Update zh_CN.lang --- src/main/resources/assets/vendingmachine/lang/zh_CN.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/vendingmachine/lang/zh_CN.lang b/src/main/resources/assets/vendingmachine/lang/zh_CN.lang index 070ba55..dbbc6ac 100644 --- a/src/main/resources/assets/vendingmachine/lang/zh_CN.lang +++ b/src/main/resources/assets/vendingmachine/lang/zh_CN.lang @@ -2,7 +2,7 @@ item.vendingmachine.placeholder.name=占位符物品 tooltip.vendingmachine=到底是谁在补货啊... -structure.vendingmachine.hint.1=Hint 1 Dot: Tin Item Pipe Casing, ME Vending Uplink Hatch +structure.vendingmachine.hint.1=提示 1:锡质物品管道外壳,ME自动售货接入接口 vendingmachine.gui.requirementHeader=需求条件: vendingmachine.gui.requirement.unknown=未知需求 @@ -16,7 +16,7 @@ vendingmachine.gui.coin_eject=取出所有代币 vendingmachine.gui.single_coin_type_eject_hint=Shift-点击提取 vendingmachine.gui.search=搜索 vendingmachine.gui.required_inputs=需要: -vendingmachine.gui.trade_hint=Shift-Click to Purchase +vendingmachine.gui.trade_hint=Shift-点击购买 vendingmachine.gui.cooldown_display.second=秒 vendingmachine.gui.cooldown_display.minute=分 From 8f27d4cc60596f807f93d112d8bc34fddaf031fb Mon Sep 17 00:00:00 2001 From: Ranzu <66495944+Ranzuu@users.noreply.github.com> Date: Wed, 8 Oct 2025 13:54:52 +0200 Subject: [PATCH 10/88] Separate Tile name and gui title --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 6 +++++- src/main/resources/assets/vendingmachine/lang/en_US.lang | 1 + src/main/resources/assets/vendingmachine/lang/zh_CN.lang | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index f2d80ad..e3a7b50 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -118,7 +118,11 @@ public ModularPanel build(PosGuiData guiData, PanelSyncManager syncManager, UISe panel.child(createCategoryTabs(this.tabController)); Flow mainColumn = new Column().width(170); if (VendingMachine.proxy.isClient()) { // client side filtering - mainColumn.child(createTitleTextStyle(base.getLocalName())) + mainColumn.child( + createTitleTextStyle( + IKey.lang("gt.blockmachines.multimachine.vendingmachine.name.gui") + .style(IKey.DARK_GRAY) + .get())) .child(this.searchBar) .child(createTradeUI((TradeMainPanel) panel, this.tabController)); mainColumn.child(createCoinInventoryRow((TradeMainPanel) panel)); diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 9446c0b..0583853 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -26,6 +26,7 @@ vendingmachine.gui.cooldown_display.day=d vendingmachine.gui.error.player_using=Someone is using the vending machine at the moment. gt.blockmachines.multimachine.vendingmachine.name=Vending Machine +gt.blockmachines.multimachine.vendingmachine.name.gui=Vending Machine hatch.vendinguplink.me.name=ME Vending Uplink Hatch vendingmachine.category.unknown=Unknown Category diff --git a/src/main/resources/assets/vendingmachine/lang/zh_CN.lang b/src/main/resources/assets/vendingmachine/lang/zh_CN.lang index dbbc6ac..40f3eea 100644 --- a/src/main/resources/assets/vendingmachine/lang/zh_CN.lang +++ b/src/main/resources/assets/vendingmachine/lang/zh_CN.lang @@ -26,6 +26,7 @@ vendingmachine.gui.cooldown_display.day=天 vendingmachine.gui.error.player_using=当前有其他玩家正在使用此自动售货机 gt.blockmachines.multimachine.vendingmachine.name=自动售货机 +gt.blockmachines.multimachine.vendingmachine.name.gui=自动售货机 hatch.vendinguplink.me.name=ME自动售货接入接口 vendingmachine.category.unknown=未知分类 From d286e856c0dab1cd77ec92651702eb6d72ae2e96 Mon Sep 17 00:00:00 2001 From: Ranzu <66495944+Ranzuu@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:29:48 +0200 Subject: [PATCH 11/88] Localize the ME Vending Uplink Hatch Overlay --- .../vendingmachine/api/enums/Textures.java | 5 ++++- .../blocks/MTEVendingUplinkHatch.java | 8 ++++---- .../vending_uplink_machine_overlay_active.png | Bin 0 -> 426 bytes .../vending_uplink_machine_overlay_inactive.png | Bin 0 -> 429 bytes 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/vendingmachine/textures/blocks/vending_uplink_machine_overlay_active.png create mode 100644 src/main/resources/assets/vendingmachine/textures/blocks/vending_uplink_machine_overlay_inactive.png diff --git a/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java b/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java index 13af61d..59354b4 100644 --- a/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java +++ b/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java @@ -18,7 +18,10 @@ public class Textures { VM_OVERLAY_ACTIVE_0 = new CustomIcon("vendingmachine:vending_machine_overlay_active_0"), VM_OVERLAY_ACTIVE_1 = new CustomIcon("vendingmachine:vending_machine_overlay_active_1"), VM_OVERLAY_ACTIVE_2 = new CustomIcon("vendingmachine:vending_machine_overlay_active_2"), - VM_OVERLAY_ACTIVE_3 = new CustomIcon("vendingmachine:vending_machine_overlay_active_3"); + VM_OVERLAY_ACTIVE_3 = new CustomIcon("vendingmachine:vending_machine_overlay_active_3"), + + VUPLINK_OVERLAY_0 = new CustomIcon("vendingmachine:vending_uplink_machine_overlay_inactive"), + VUPLINK_OVERLAY_1 = new CustomIcon("vendingmachine:vending_uplink_machine_overlay_active"); public static final IIconContainer[] VM_OVERLAY_ACTIVE = { VM_OVERLAY_ACTIVE_0, VM_OVERLAY_ACTIVE_1, VM_OVERLAY_ACTIVE_2, VM_OVERLAY_ACTIVE_3, VM_OVERLAY_4 // bottom right not animated diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index 10e6d6b..d190276 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -1,7 +1,7 @@ package com.cubefury.vendingmachine.blocks; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE; +import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_0; +import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_1; import java.util.EnumSet; @@ -120,12 +120,12 @@ public void securityBreak() {} @Override public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE) }; + return new ITexture[] { aBaseTexture, TextureFactory.of(VUPLINK_OVERLAY_1) }; } @Override public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH) }; + return new ITexture[] { aBaseTexture, TextureFactory.of(VUPLINK_OVERLAY_0) }; } @Override diff --git a/src/main/resources/assets/vendingmachine/textures/blocks/vending_uplink_machine_overlay_active.png b/src/main/resources/assets/vendingmachine/textures/blocks/vending_uplink_machine_overlay_active.png new file mode 100644 index 0000000000000000000000000000000000000000..358ce0b7992ef1d0370b35d2795e4adb0933ccee GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|>0G|+72L}gU$3-bADL{ck%Ukb*)RhGJ1^@s5pTR+Ezyvgx39K^6(gMhW>M}Gi0Lf}A zepk0~Vh1TU^mK6y(FjgXaAUr~A~AtMkI_xTfy1DYv5wJA;Fxy9LRMb}t_MsU4Y3TO d3pfponHioNS%G~10G|+72M320D^{eWr0_Z}0*XD_)N=_)v6ck+1^)*EhTq%xKn8IZctjR6 zFz_7$VMb96uLhu?M2TxeNpOBzNqJ&XDnmeGW?qS&pKFMMsh**pWlr8LJD{3vsS%!O zo}O9^96$~$gA^kx10#^-1;o-&Hpt}~jLcwhCLr68kqPXRC?GqtodqnO1!RN3r!q!{ z7eEifXf#V1fKn6K8CZZS4UCKp7#BcH1=+~D0AkVNZa7AjJlrE{-7@!O01Z%r{shCNStRx@kCY7&J20F{Y(CF-b&SU|GPR*T8Ut gHGpvz12;E=T0E0x;OV literal 0 HcmV?d00001 From 3f80365152835e6abd304ec85eff34fa451a0ae9 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 10 Oct 2025 01:49:37 +0800 Subject: [PATCH 12/88] Now sorts by tradegroup id before writing to file, and does not add indices for NBT arrays. This change ensures that changelogs won't be massive every time a new trade is added, from all the tradegroups and their indices getting shuffled around. --- .../vendingmachine/trade/TradeDatabase.java | 7 +-- .../vendingmachine/util/NBTConverter.java | 45 +++++-------------- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java index 4d16562..f1db10f 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java @@ -109,9 +109,10 @@ public void readFromNBT(NBTTagCompound nbt, boolean merge) { public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setInteger("version", this.version); NBTTagList tgList = new NBTTagList(); - for (TradeGroup tg : tradeGroups.values()) { - tgList.appendTag(tg.writeToNBT(new NBTTagCompound())); - } + tradeGroups.values() + .stream() + .sorted(Comparator.comparing(TradeGroup::getId)) + .forEach(tg -> tgList.appendTag(tg.writeToNBT(new NBTTagCompound()))); nbt.setTag("tradeGroups", tgList); return nbt; } diff --git a/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java b/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java index 5daf73f..d09ef91 100644 --- a/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java +++ b/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java @@ -176,20 +176,11 @@ else if (value instanceof NBTTagByteArray) { out.endArray(); } else if (value instanceof NBTTagList) { List tagList = getTagList((NBTTagList) value); - if (format) { - out.beginObject(); - for (int i = 0; i < tagList.size(); i++) { - NBTBase tag = tagList.get(i); - out.name(i + ":" + tag.getId()); - NBTtoJSON_Base(tag, true, out); - } - out.endObject(); - } else { - out.beginArray(); - for (NBTBase tag : tagList) { - NBTtoJSON_Base(tag, false, out); - } + out.beginArray(); + for (NBTBase tag : tagList) { + NBTtoJSON_Base(tag, format, out); } + out.endArray(); } else if (value instanceof NBTTagCompound) { NBTtoJSON_Compound((NBTTagCompound) value, out, format); } else { @@ -233,31 +224,15 @@ private static JsonElement NBTtoJSON_Base(NBTBase tag, boolean format) { } else if (tag instanceof NBTTagCompound) { return NBTtoJSON_Compound((NBTTagCompound) tag, new JsonObject(), format); } else if (tag instanceof NBTTagList) { - if (format) { - JsonObject jAry = new JsonObject(); - - List tagList = getTagList((NBTTagList) tag); - - for (int i = 0; i < tagList.size(); i++) { - jAry.add( - i + ":" - + tagList.get(i) - .getId(), - NBTtoJSON_Base(tagList.get(i), true)); - } - - return jAry; - } else { - JsonArray jAry = new JsonArray(); - - List tagList = getTagList((NBTTagList) tag); + JsonArray jAry = new JsonArray(); - for (NBTBase t : tagList) { - jAry.add(NBTtoJSON_Base(t, false)); - } + List tagList = getTagList((NBTTagList) tag); - return jAry; + for (NBTBase t : tagList) { + jAry.add(NBTtoJSON_Base(t, format)); } + + return jAry; } else if (tag instanceof NBTTagByteArray) { JsonArray jAry = new JsonArray(); From eb7bb00aab46fcfe11825f2854f088859bd71fa4 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 10 Oct 2025 03:23:56 +0800 Subject: [PATCH 13/88] Fix edge-case crash when loading trade history for an already-removed tradegroup. --- .../vendingmachine/blocks/gui/TradeMainPanel.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java index c25667b..b7812d1 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java @@ -21,6 +21,7 @@ import com.cubefury.vendingmachine.network.handlers.NetResetVMUser; import com.cubefury.vendingmachine.trade.TradeCategory; import com.cubefury.vendingmachine.trade.TradeDatabase; +import com.cubefury.vendingmachine.trade.TradeGroup; import com.cubefury.vendingmachine.trade.TradeManager; import com.cubefury.vendingmachine.util.BigItemStack; @@ -126,8 +127,11 @@ public Map> formatTrades() { Map> trades = new HashMap<>(); trades.put(TradeCategory.ALL, new ArrayList<>()); for (TradeItemDisplay tid : TradeManager.INSTANCE.tradeData) { - TradeCategory category = TradeDatabase.INSTANCE.getTradeGroupFromId(tid.tgID) - .getCategory(); + TradeGroup group = TradeDatabase.INSTANCE.getTradeGroupFromId(tid.tgID); + if (group == null) { + continue; + } + TradeCategory category = group.getCategory(); trades.putIfAbsent(category, new ArrayList<>()); trades.get(category) .add(tid); From 2dfa8592021452c057e7dc45779c84eec95cc943 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 10 Oct 2025 17:16:40 +0800 Subject: [PATCH 14/88] Add list trade display format --- .../com/cubefury/vendingmachine/Config.java | 13 ++ .../blocks/gui/MTEVendingMachineGui.java | 193 ++++++++++++++---- .../blocks/gui/TradeItemDisplayWidget.java | 107 ++++++++-- .../blocks/gui/TradeMainPanel.java | 2 +- .../vendingmachine/gui/GuiTextures.java | 31 ++- .../assets/vendingmachine/lang/en_US.lang | 3 + .../background/list_trade_button_pressed.png | Bin 0 -> 3183 bytes ...t_trade_button_pressed_color_corrected.png | Bin 0 -> 3210 bytes .../list_trade_button_unpressed.png | Bin 0 -> 3182 bytes ...trade_button_unpressed_color_corrected.png | Bin 0 -> 3211 bytes .../textures/gui/overlay/mode_list.png | Bin 0 -> 597 bytes .../textures/gui/overlay/mode_tile.png | Bin 0 -> 613 bytes 12 files changed, 285 insertions(+), 64 deletions(-) create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed.png create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed_color_corrected.png create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed.png create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed_color_corrected.png create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/overlay/mode_list.png create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/overlay/mode_tile.png diff --git a/src/main/java/com/cubefury/vendingmachine/Config.java b/src/main/java/com/cubefury/vendingmachine/Config.java index 8972650..d9f405f 100644 --- a/src/main/java/com/cubefury/vendingmachine/Config.java +++ b/src/main/java/com/cubefury/vendingmachine/Config.java @@ -4,6 +4,8 @@ import net.minecraftforge.common.config.Configuration; +import com.cubefury.vendingmachine.blocks.gui.TradeItemDisplayWidget.DisplayType; + public class Config { private static final String CONFIG_CATEGORY_VM = "Vending Machine Settings"; @@ -13,6 +15,7 @@ public class Config { public static int gui_refresh_interval = 20; public static int dispense_frequency = 10; public static int dispense_amount = 16; + public static DisplayType display_type = DisplayType.TILE; public static File worldDir = null; @@ -36,6 +39,16 @@ public static void init(File configFile) { 1, Integer.MAX_VALUE, "Number of items per dispense cycle"); + try { + display_type = DisplayType.valueOf( + configuration.getString( + "display_type", + CONFIG_CATEGORY_VM, + "TILE", + "Default trade display format, either TILE or LIST. Case sensitive.")); + } catch (IllegalArgumentException e) { + display_type = DisplayType.TILE; + } if (configuration.hasChanged()) { configuration.save(); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index e3a7b50..73bc0e0 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -13,14 +13,18 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.SingleChildWidget; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ListWidget; import com.cleanroommc.modularui.widgets.PagedWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; @@ -30,6 +34,7 @@ import com.cleanroommc.modularui.widgets.layout.Row; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cubefury.vendingmachine.Config; import com.cubefury.vendingmachine.VendingMachine; import com.cubefury.vendingmachine.blocks.MTEVendingMachine; import com.cubefury.vendingmachine.gui.GuiTextures; @@ -57,7 +62,8 @@ public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { private boolean ejectItems = false; private boolean ejectCoins = false; private final Map ejectSingleCoin = new HashMap<>(); - private final Map> displayedTrades = new HashMap<>(); + private final Map> displayedTradesTiles = new HashMap<>(); + private final Map> displayedTradesList = new HashMap<>(); private final List tradeCategories = new ArrayList<>(); private final List inputSlots = new ArrayList<>(); @@ -67,12 +73,17 @@ public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { public static String lastSearch = ""; public static int lastPage = 0; + public static TradeItemDisplayWidget.DisplayType displayType = Config.display_type; public static final int CUSTOM_UI_HEIGHT = 320; - public static final int ITEMS_PER_ROW = 3; - public static final int ITEM_HEIGHT = 25; - public static final int ITEM_WIDTH = 47; + // Trade Item Display + public static final int TILE_ITEMS_PER_ROW = 3; + public static final int TILE_ITEM_HEIGHT = 25; + public static final int TILE_ITEM_WIDTH = 47; + public static final int LIST_ITEM_HEIGHT = 14; + public static final int LIST_ITEM_WIDTH = 153; + private static final int COIN_COLUMN_WIDTH = 40; private static final int COIN_COLUMN_ROW_COUNT = 4; @@ -88,10 +99,15 @@ public MTEVendingMachineGui(MTEVendingMachine base) { this.tradeCategories.addAll(TradeDatabase.INSTANCE.getTradeCategories()); for (TradeCategory c : this.tradeCategories) { - displayedTrades.put(c, new ArrayList<>(MTEVendingMachine.MAX_TRADES)); + displayedTradesTiles.put(c, new ArrayList<>(MTEVendingMachine.MAX_TRADES)); + for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { + displayedTradesTiles.get(c) + .add(new TradeItemDisplayWidget(null, TradeItemDisplayWidget.DisplayType.TILE)); + } + displayedTradesList.put(c, new ArrayList<>(MTEVendingMachine.MAX_TRADES)); for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { - displayedTrades.get(c) - .add(new TradeItemDisplayWidget(null)); + displayedTradesList.get(c) + .add(new TradeItemDisplayWidget(null, TradeItemDisplayWidget.DisplayType.LIST)); } } @@ -117,7 +133,8 @@ public ModularPanel build(PosGuiData guiData, PanelSyncManager syncManager, UISe .padding(4); panel.child(createCategoryTabs(this.tabController)); Flow mainColumn = new Column().width(170); - if (VendingMachine.proxy.isClient()) { // client side filtering + if (VendingMachine.proxy.isClient()) { // client side sort and filtering + panel.child(createQolButtonColumn()); mainColumn.child( createTitleTextStyle( IKey.lang("gt.blockmachines.multimachine.vendingmachine.name.gui") @@ -143,6 +160,32 @@ public void restorePreviousSettings() { this.searchBar.setText(lastSearch); } + public IWidget createQolButtonColumn() { + Flow buttonColumn = new Column().width(8) + .height(20) + .left(-17) + .top(1) + .coverChildren(); + buttonColumn.child( + new CycleButtonWidget().size(14) + .overlay( + new DynamicDrawable( + () -> displayType.getTexture() + .size(14))) + .stateCount(TradeItemDisplayWidget.DisplayType.values().length) + .value( + new IntValue.Dynamic( + () -> displayType.ordinal(), + val -> { displayType = TradeItemDisplayWidget.DisplayType.values()[val]; })) + .tooltipDynamic(builder -> { + builder.clearText(); + builder + .addLine(IKey.lang("vendingmachine.gui.display_mode") + " " + displayType.getLocalizedName()); + }) + .tooltipAutoUpdate(true)); + return buttonColumn; + } + public IWidget createCategoryTabs(PagedWidget.Controller tabController) { Flow tabColumn = new Column().width(40) .height(100) @@ -347,6 +390,45 @@ private SlotGroupWidget createOutputSlots() { .build(); } + private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { + if (cur != null) { + for (BigItemStack toItem : cur.toItems) { + builder.addLine( + IKey.str( + toItem.stackSize + " " + + toItem.getBaseStack() + .getDisplayName()) + .style(IKey.AQUA)); + // builder.add(new ItemDrawable(toItem.getBaseStack())); + } + builder.emptyLine(); + builder.addLine( + IKey.str(Translator.translate("vendingmachine.gui.required_inputs")) + .style(IKey.DARK_GREEN, IKey.ITALIC)); + for (CurrencyItem currencyItem : cur.fromCurrency) { + builder.addLine( + IKey.str(currencyItem.value + " " + currencyItem.type.getLocalizedName()) + .style(IKey.DARK_GREEN)); + } + for (BigItemStack fromItem : cur.fromItems) { + builder.addLine( + IKey.str( + fromItem.stackSize + " " + + fromItem.getBaseStack() + .getDisplayName()) + .style(IKey.DARK_GREEN)); + } + + builder.emptyLine(); + builder.addLine( + IKey.str(cur.label) + .style(IKey.GRAY)); + builder.addLine( + IKey.str(Translator.translate("vendingmachine.gui.trade_hint")) + .style(IKey.GRAY)); + } + } + // spotless:off private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller tabController) { PagedWidget paged = new PagedWidget<>() @@ -364,50 +446,60 @@ private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller t tradeList.child(new Row().height(2)); // Higher first row top margin - Flow row = new TradeRow().height(ITEM_HEIGHT+2).left(2); + Flow row = new TradeRow().height(TILE_ITEM_HEIGHT +2).left(2); + // Tiles Display for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { int index = i; - displayedTrades.get(category).get(i).setRootPanel(rootPanel); - row.child(displayedTrades.get(category).get(i) + displayedTradesTiles.get(category).get(i).setRootPanel(rootPanel); + row.child(displayedTradesTiles.get(category).get(i) .tooltipDynamic(builder -> { builder.clearText(); - synchronized (displayedTrades) { - if (index < displayedTrades.get(category).size()) { - TradeItemDisplay cur = displayedTrades.get(category).get(index).getDisplay(); - if (cur != null) { - for (BigItemStack toItem : cur.toItems) { - builder.addLine(IKey.str(toItem.stackSize + " " + toItem.getBaseStack().getDisplayName()).style(IKey.AQUA)); - // builder.add(new ItemDrawable(toItem.getBaseStack())); - } - builder.emptyLine(); - builder.addLine(IKey.str(Translator.translate("vendingmachine.gui.required_inputs")).style(IKey.DARK_GREEN, IKey.ITALIC)); - for (CurrencyItem currencyItem: cur.fromCurrency) { - builder.addLine(IKey.str(currencyItem.value + " " + currencyItem.type.getLocalizedName()).style(IKey.DARK_GREEN)); - } - for (BigItemStack fromItem : cur.fromItems) { - builder.addLine(IKey.str(fromItem.stackSize + " " + fromItem.getBaseStack().getDisplayName()).style(IKey.DARK_GREEN)); - } - - builder.emptyLine(); - builder.addLine(IKey.str(cur.label).style(IKey.GRAY)); - builder.addLine(IKey.str(Translator.translate("vendingmachine.gui.trade_hint")).style(IKey.GRAY)); + synchronized (displayedTradesTiles) { + if (index < displayedTradesTiles.get(category).size()) { + constructTradeTooltip(builder, displayedTradesTiles.get(category).get(index).getDisplay()); } } - } }) .tooltipAutoUpdate(true) - .setEnabledIf(slot -> ((TradeItemDisplayWidget) slot).getDisplay() != null) + .setEnabledIf(slot -> { + TradeItemDisplayWidget display = ((TradeItemDisplayWidget) slot); + return displayType == display.displayType && display.getDisplay() != null; + }) .margin(2)); - if (i % ITEMS_PER_ROW == ITEMS_PER_ROW - 1) { + if (i % TILE_ITEMS_PER_ROW == TILE_ITEMS_PER_ROW - 1) { tradeList.child(row); - row = new TradeRow().height(ITEM_HEIGHT+2).left(2); + row = new TradeRow().height(TILE_ITEM_HEIGHT +2).left(2); } } if (row.hasChildren()) { tradeList.child(row); } + + // List Display + row = new TradeRow().height(LIST_ITEM_HEIGHT).left(2); + for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { + int index = i; + displayedTradesList.get(category).get(i).setRootPanel(rootPanel); + row.child(displayedTradesList.get(category).get(i) + .tooltipDynamic(builder -> { + builder.clearText(); + synchronized (displayedTradesList) { + if (index < displayedTradesList.get(category).size()) { + constructTradeTooltip(builder, displayedTradesList.get(category).get(index).getDisplay()); + } + } + }) + .tooltipAutoUpdate(true) + .setEnabledIf(slot -> { + TradeItemDisplayWidget display = ((TradeItemDisplayWidget) slot); + return displayType == display.displayType && display.getDisplay() != null; + })); + tradeList.child(row); + row = new TradeRow().height(LIST_ITEM_HEIGHT).left(2); + } + tradeList.child(new Row().height(2)); // bottom padding for last row paged.addPage(tradeList); } @@ -537,9 +629,10 @@ public static void resetForceRefresh() { forceRefresh = false; } - public void updateTradeDisplay(Map> trades) { - synchronized (displayedTrades) { - for (Map.Entry> entry : displayedTrades.entrySet()) { + private void updateTradeDisplay(Map> trades, + Map> display) { + synchronized (display) { + for (Map.Entry> entry : display.entrySet()) { int displayedSize = trades.get(entry.getKey()) == null ? 0 : trades.get(entry.getKey()) .size(); @@ -560,10 +653,16 @@ public void updateTradeDisplay(Map> trades } } - public Map> getTradeDisplayData() { + public void updateTradeDisplay(Map> trades) { + this.updateTradeDisplay(trades, displayedTradesTiles); + this.updateTradeDisplay(trades, displayedTradesList); + } + + public Map> getCurrentTradeDisplayData() { Map> currentData = new HashMap<>(); - synchronized (displayedTrades) { - this.displayedTrades.forEach((k, v) -> { + + synchronized (displayedTradesTiles) { + this.displayedTradesTiles.forEach((k, v) -> { currentData.put( k, v.stream() @@ -572,6 +671,18 @@ public Map> getTradeDisplayData() { .collect(Collectors.toList())); }); } + + synchronized (displayedTradesList) { + this.displayedTradesList.forEach((k, v) -> { + currentData.get(k) + .addAll( + v.stream() + .map(TradeItemDisplayWidget::getDisplay) + .filter(Objects::nonNull) + .collect(Collectors.toList())); + }); + } + return currentData; } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 65641ef..66c1d36 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -1,5 +1,8 @@ package com.cubefury.vendingmachine.blocks.gui; +import static com.cubefury.vendingmachine.gui.GuiTextures.MODE_LIST; +import static com.cubefury.vendingmachine.gui.GuiTextures.MODE_TILE; + import net.minecraft.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -9,6 +12,8 @@ import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.drawable.Icon; +import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Platform; @@ -19,17 +24,51 @@ public class TradeItemDisplayWidget extends ItemDisplayWidget implements Interactable { + public enum DisplayType { + + TILE("tile", MODE_TILE), + LIST("list", MODE_LIST); + + private String type; + private Icon texture; + + DisplayType(String type, UITexture texture) { + this.type = type; + this.texture = texture.asIcon(); + } + + public String getLocalizedName() { + return IKey.lang("vendingmachine.gui.display_mode_" + this.type) + .toString(); + } + + public Icon getTexture() { + return this.texture; + } + } + private TradeMainPanel rootPanel; private boolean pressed = false; private IValue value; + public final DisplayType displayType; private TradeItemDisplay display; - public TradeItemDisplayWidget(TradeItemDisplay display) { - height(MTEVendingMachineGui.ITEM_HEIGHT); - width(MTEVendingMachineGui.ITEM_WIDTH); - background( - new DynamicDrawable(() -> pressed ? GuiTextures.TRADE_BUTTON_PRESSED : GuiTextures.TRADE_BUTTON_UNPRESSED)); + public TradeItemDisplayWidget(TradeItemDisplay display, DisplayType displayType) { + this.displayType = displayType; + if (displayType == DisplayType.TILE) { + height(MTEVendingMachineGui.TILE_ITEM_HEIGHT); + width(MTEVendingMachineGui.TILE_ITEM_WIDTH); + background( + new DynamicDrawable( + () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); + } else if (displayType == DisplayType.LIST) { + height(MTEVendingMachineGui.LIST_ITEM_HEIGHT); + width(MTEVendingMachineGui.LIST_ITEM_WIDTH); + background( + new DynamicDrawable( + () -> pressed ? GuiTextures.LIST_TRADE_BUTTON_PRESSED : GuiTextures.LIST_TRADE_BUTTON_UNPRESSED)); + } this.display = display; this.item((ItemStack) null); @@ -57,24 +96,52 @@ public TradeItemDisplay getDisplay() { public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { ItemStack item = value.getValue(); if (!Platform.isStackEmpty(item)) { - GuiDraw.drawText(" " + this.display.display.stackSize, 4, 9, 1.0f, 0x0, false); - GuiDraw.drawItem(item, 26, 4, 16, 16, context.getCurrentDrawingZ()); - if (this.display.tradeableNow) { - GuiDraw.drawOutline(1, 1, 45, 23, 0x883CFF00, 2); - } - if (this.display.hasCooldown || !this.display.enabled) { - GuiDraw.drawRoundedRect( - 1, + if (this.displayType == DisplayType.TILE) { + GuiDraw.drawText(" " + this.display.display.stackSize, 4, 9, 1.0f, 0x0, false); + GuiDraw.drawItem(item, 26, 4, 16, 16, context.getCurrentDrawingZ()); + if (this.display.tradeableNow) { + GuiDraw.drawOutline(1, 1, 45, 23, 0x883CFF00, 2); + } + if (this.display.hasCooldown || !this.display.enabled) { + GuiDraw.drawRoundedRect( + 1, + 1, + MTEVendingMachineGui.TILE_ITEM_WIDTH - 2, + MTEVendingMachineGui.TILE_ITEM_HEIGHT - 2, + 0xBB000000, + 1, + 1); + } + this.overlay( + IKey.str(display.hasCooldown ? this.display.cooldownText : "") + .style(IKey.WHITE)); + } else if (this.displayType == DisplayType.LIST) { + GuiDraw.drawText( + " " + this.display.display.stackSize + " " + this.display.display.getDisplayName(), + 4, + 4, + 0.9f, + 0x0, + false); + GuiDraw.drawRect( 1, - MTEVendingMachineGui.ITEM_WIDTH - 2, - MTEVendingMachineGui.ITEM_HEIGHT - 2, - 0xBB000000, 1, - 1); + 3, + MTEVendingMachineGui.LIST_ITEM_HEIGHT - 3, + this.display.tradeableNow ? 0x883CFF00 : 0x88333333); + if (this.display.hasCooldown || !this.display.enabled) { + GuiDraw.drawRect( + 1, + 1, + MTEVendingMachineGui.LIST_ITEM_WIDTH - 2, + MTEVendingMachineGui.LIST_ITEM_HEIGHT - 2, + 0xBB000000); + } + this.overlay( + IKey.str(display.hasCooldown ? this.display.cooldownText : "") + .style(IKey.WHITE) + .scale(0.9f)); } - this.overlay( - IKey.str(display.hasCooldown ? this.display.cooldownText : "") - .style(IKey.WHITE)); } } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java index b7812d1..e663327 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java @@ -65,7 +65,7 @@ public boolean onKeyRelease(char typedChar, int keyCode) { public void updateGui() { if (shiftHeld) { - this.updateTradeInformation(gui.getTradeDisplayData()); + this.updateTradeInformation(gui.getCurrentTradeDisplayData()); } else { Map> trades = formatTrades(); gui.updateTradeDisplay(trades); diff --git a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java index 8ee5829..c020280 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java @@ -45,20 +45,47 @@ public final class GuiTextures { .name("text_field_background") .build(); - public static final UITexture TRADE_BUTTON_UNPRESSED = UITexture.builder() + // TODO: Restore canApplyTheme to trade button textures after scrolling texture bug is fixed in MUI2 + public static final UITexture TILE_TRADE_BUTTON_UNPRESSED = UITexture.builder() .location(VendingMachine.MODID, "gui/background/trade_button_unpressed_color_corrected") .imageSize(195, 136) .adaptable(4) .name("trade_button_unpressed") .build(); - public static final UITexture TRADE_BUTTON_PRESSED = UITexture.builder() + public static final UITexture TILE_TRADE_BUTTON_PRESSED = UITexture.builder() .location(VendingMachine.MODID, "gui/background/trade_button_pressed_color_corrected") .imageSize(195, 136) .adaptable(4) .name("trade_button_pressed") .build(); + public static final UITexture LIST_TRADE_BUTTON_UNPRESSED = UITexture.builder() + .location(VendingMachine.MODID, "gui/background/list_trade_button_unpressed_color_corrected") + .imageSize(195, 136) + .adaptable(2) + .name("list_trade_button_unpressed") + .build(); + + public static final UITexture LIST_TRADE_BUTTON_PRESSED = UITexture.builder() + .location(VendingMachine.MODID, "gui/background/list_trade_button_pressed_color_corrected") + .imageSize(195, 136) + .adaptable(2) + .name("list_trade_button_pressed") + .build(); + + public static final UITexture MODE_TILE = UITexture.builder() + .location(VendingMachine.MODID, "gui/overlay/mode_tile") + .imageSize(32, 32) + .name("mode_tile") + .build(); + + public static final UITexture MODE_LIST = UITexture.builder() + .location(VendingMachine.MODID, "gui/overlay/mode_list") + .imageSize(32, 32) + .name("mode_list") + .build(); + public static final UITexture INPUT_SPRITE = UITexture.builder() .location(VendingMachine.MODID, "gui/background/input") .imageSize(30, 20) diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 0583853..c5cc5ea 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -17,6 +17,9 @@ vendingmachine.gui.single_coin_type_eject_hint=Shift-Click to Extract vendingmachine.gui.search=Search vendingmachine.gui.required_inputs=Requires: vendingmachine.gui.trade_hint=Shift-Click to Purchase +vendingmachine.gui.display_mode=Display: +vendingmachine.gui.display_mode_tile=Tiles +vendingmachine.gui.display_mode_list=List vendingmachine.gui.cooldown_display.second=s vendingmachine.gui.cooldown_display.minute=m diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed.png b/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..aefd2f76dd49a5b1b1d181bca0e76d0831b0e7ab GIT binary patch literal 3183 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed.png b/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed.png new file mode 100644 index 0000000000000000000000000000000000000000..48b5d2275de7fa1a5cc90b9ed44096a70153a956 GIT binary patch literal 3182 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed_color_corrected.png b/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed_color_corrected.png new file mode 100644 index 0000000000000000000000000000000000000000..e931d75bdf6a09fa21f0cb1fa1657e1299308aaf GIT binary patch literal 3211 zcmd5;=|9wq7ycrI>{}DrvP@ZL(%7@iU~Jh9LZb<}VJ6144zjOvL&?5mE3PComPTZc zG4?2B>mssmV^BZ$Pq^=XFV6Fv=Q+>kyg6@9lGQC^PWDUe003~BAQ3ia+<8`s=UL9s zdF~GL8J+Xex6lWGy1zJ1+|M+-nl~J76<}j*AYoz%he0%8Fh!^m1OSjp1zACMw$nlh zRI(b`DuXBa$?${wHjGG4GBRE18ib9#8F^=xjQi} z#S6{KaA6Bz@&V>>_4NiqG$Y0w#_*|BpB#RgFu8?G;^_F=m~LtZ@Vn?qvy&7Au*yzd z-l0vqfQ0+ibx`>-B+LHnx2hIHDyBnHPSH?@%zzz*+u;W}9^4wc&{%EIK)}#~$JX~5 zxy3XMzP8kKG)Q>)JgphpCX0!|o5bt&V87Ra!f(Ls5GcINfMGvkjuWZtbxFX?q!l^cG zUpN1858lmG&%i_AZfbs>p%sX(zM%!&(S@a=1e!SOuRt*&-V^DzMCB)jh=B@o3G=MR z+kO0r%sB?}dbFZk8h7Wfvgzimq|Y?o;VehSa>+}25n=%N8m|Of*gg5-O#(-cG1Czx zWh5uN;Fucyi-2k}|J5fX9ZAF(BcM%u)+P`rd2(W6(;`nb8p*un*i=P zCPsa5;<<-t$Xv9*V+MqTus~E}@x>?6HE6jPEP=(msxdI!Mf@YooT@sj(xUzV7i5Vk!K6Zn7bDF@Wd-XQ>p}G*V?>QOP*19RMV;f{nvA3sObtGDr7zQh61jrSU&2W4FLy%xsB_3-7gAxu1bXJ-1)i+g*J z3jB@0(?FS){g#-P>!CfN)}e8s>!F8xY;=WF>C?+}GToL%lSPt+nWct>#JL@>&?(UA z8h;vJo0gh(Hx+g<5TpZjxXz_Aq~>>{?STR8p_-HDDB7PQfcXfuxc=2Qbov6UUd;?r z4H1DRP%aNLFSSw<6o-Xw2^plYq==aFjb-L^`gjnXM-^ifITTwJikv`>-M4+~S4s5y zzSsi4ulEVP@pt*}+uk3;>{i$0D1Lg|bMV<^$7Qy;dihT(!OzRDm-Gb_G*rd!&M^mB=J9H#*NOa%9bxai@i;q{Wk52>A5 zaRhN98#hNSTjWJ|erukQ_fakA{^%^`S}C&BfYc@;2VwF&v{bN^|9M{No!;QyC%s5a z&0SQFTk=>Ue^+2HX0dcJZ=q6{t}xS#)9$!gqCQWTS~LtvQBs(6%x|O7__}5CWsLbo zk|0TnNt+ra`7A?wqfzCJW|d7o8%i7eg{)XsY{uqCStztg z-?3{Kvg0VMq*qRsx835f_)>ImRY#Vr!}KgY`=K3@w}R~$+IW2znovJjpIl!ykpFDm z1t!DJcf$ido${u&TXmW`9@T|-;|9%L%(Bhgl~vO`L>BrNs$kL0(>oReayx|G_im4z zJ6uO@7vFyU7L6}o{z$hUt}3q%MXl8;IqS6bU@4CpV;j96M1mWX6qLi8l{{T7(;Y@~ zpV#e2tldr#Og8LRgEjfQ_>%Y;Jf+^`y-`tRA#N5dBWzY zXz+MFSmHx<7<8DQT>COZx(r4sQI*BNh`k{Puwsn+iO;m2{d{NTj!w*)uJ~kq3`KKET!?uglvMw zu^7xq?I4muZ)r9uecAA%Gh#mC$D>3h0)_*7#n zNzcR>6QmQwBJ*hL`~yA{bJ_wLvs#O{?Z#=WuxIb~fpTJVXcw4L|KFHnQ z1Au$@1cU@g*y024d1EE)uvnjt%K2~rV0dPN(6XaeR!*?Wcl+W(we?vFd*OSQLnU}M;Xv?kr>UdpKnQEyEnZbUV$U`Tc zhUbz#rCgk&UVQ7jgoA9O-(BE==;fQ7K^MTwg!otehemf*|39Sv)9U}D@R49=L`czT lxHFk8>xk&S&qL#G1OA@!G2ei7TtB-cU}AU+@yY-l{Xc^Ew6OpH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/overlay/mode_list.png b/src/main/resources/assets/vendingmachine/textures/gui/overlay/mode_list.png new file mode 100644 index 0000000000000000000000000000000000000000..039e5ef7a8733fa20e80b8c60c2b82adb5a41d7e GIT binary patch literal 597 zcmV-b0;>IqP)1q~8j=(jN5Qq=;KyRs!Nplu2UkH5`~Y!ua#D1W691PJTEuv8+>dwn9(V5mp;2L) z6&eRL-8R$7gqY2(is4rX2qB7o1Y~9zbCQ&T@A$e$fUkFPp5=e;&(W*qEd~Tc;#p>x zHt`1W^rmfa-Y1T-lB^P+6OWm6LE=ZQD;~dbF1jr6%&3`3&l5+9#bO659n4CmMm$9v zQ#GCPg{;Ra=Pk}!rN&zKyGn%>^RL6AovVi>1}_t z0nB`oUT${ujJ0}MVHvMIY#kfu;50Pkn?O*vrT7U)^?dTZ_D^a03F zSE(D|;1C!sQueyfySqDk`}a(%zaQGQa%$ya9j jfP6v#azJ+g0LTFkXY-H2qYs)-00000NkvXXu0mjf!kqM0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/overlay/mode_tile.png b/src/main/resources/assets/vendingmachine/textures/gui/overlay/mode_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..426e54fd832ed051320122c44661b4d207a3cf32 GIT binary patch literal 613 zcmV-r0-F7aP)1q~8j=(jN5Qq=;KyRs!Nplu2UkH5`~Y!ua#D1W691PJTEuv8+>dwn9(V5mp;2L) z6&eRL-8R$7gqY2(is4rX2qB7o1Y~9zbCQ&T@A$e$fUkFPp5=e;&(W*qEd~Tc;#p>x zHt`1W^rmfa-Y1T-lB^P+6OWm6LE=ZQD;~dbF1jr6%&3`3&l5+9#bO659n4CmMm$9v zQ#GCPg{;Ra=Pk}!rN&zKyGn%>^RL6AovVi>1}_t z0nB`oUT${ujJ0}MVHvMIY#kfu;50Pkn?O*vrT7U)^?dTZ_D^a03F zSE(D|;1C!sQueyfySqDk`}a(%zaQGQa%$yP)ITUB@t=3 z1El1xp;h7n++Pp|;9f%j0FaWqhE@Rp0C&I!j|o4}b*$wK00000NkvXXu0mjf<%9f+ literal 0 HcmV?d00001 From e9c7a7ef2d005a992ceb03c451fdaf2fa5fa506d Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 10 Oct 2025 17:48:42 +0800 Subject: [PATCH 15/88] Added alphabetical sort order --- .../com/cubefury/vendingmachine/Config.java | 12 +++++ .../blocks/gui/MTEVendingMachineGui.java | 44 ++++++++++++++++ .../blocks/gui/TradeMainPanel.java | 49 +++++++++++------- .../vendingmachine/gui/GuiTextures.java | 12 +++++ .../assets/vendingmachine/lang/en_US.lang | 3 ++ .../textures/gui/overlay/sort_alphabet.png | Bin 0 -> 765 bytes .../textures/gui/overlay/sort_smart.png | Bin 0 -> 339 bytes 7 files changed, 100 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/overlay/sort_alphabet.png create mode 100644 src/main/resources/assets/vendingmachine/textures/gui/overlay/sort_smart.png diff --git a/src/main/java/com/cubefury/vendingmachine/Config.java b/src/main/java/com/cubefury/vendingmachine/Config.java index d9f405f..d812ea9 100644 --- a/src/main/java/com/cubefury/vendingmachine/Config.java +++ b/src/main/java/com/cubefury/vendingmachine/Config.java @@ -4,6 +4,7 @@ import net.minecraftforge.common.config.Configuration; +import com.cubefury.vendingmachine.blocks.gui.MTEVendingMachineGui; import com.cubefury.vendingmachine.blocks.gui.TradeItemDisplayWidget.DisplayType; public class Config { @@ -16,6 +17,7 @@ public class Config { public static int dispense_frequency = 10; public static int dispense_amount = 16; public static DisplayType display_type = DisplayType.TILE; + public static MTEVendingMachineGui.SortMode sort_mode = MTEVendingMachineGui.SortMode.SMART; public static File worldDir = null; @@ -49,6 +51,16 @@ public static void init(File configFile) { } catch (IllegalArgumentException e) { display_type = DisplayType.TILE; } + try { + sort_mode = MTEVendingMachineGui.SortMode.valueOf( + configuration.getString( + "sort_mode", + CONFIG_CATEGORY_VM, + "SMART", + "Default sort mode, either SMART or ALPHABET. Case sensitive.")); + } catch (IllegalArgumentException e) { + sort_mode = MTEVendingMachineGui.SortMode.SMART; + } if (configuration.hasChanged()) { configuration.save(); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 73bc0e0..a3d3f66 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -1,5 +1,8 @@ package com.cubefury.vendingmachine.blocks.gui; +import static com.cubefury.vendingmachine.gui.GuiTextures.SORT_ALPHABET; +import static com.cubefury.vendingmachine.gui.GuiTextures.SORT_SMART; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -14,6 +17,8 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.drawable.Icon; +import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.RichTooltip; @@ -74,6 +79,7 @@ public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { public static String lastSearch = ""; public static int lastPage = 0; public static TradeItemDisplayWidget.DisplayType displayType = Config.display_type; + public static SortMode sortMode = Config.sort_mode; public static final int CUSTOM_UI_HEIGHT = 320; @@ -87,6 +93,29 @@ public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { private static final int COIN_COLUMN_WIDTH = 40; private static final int COIN_COLUMN_ROW_COUNT = 4; + public enum SortMode { + + SMART("smart", SORT_SMART), + ALPHABET("alphabet", SORT_ALPHABET); + + private String mode; + private Icon texture; + + SortMode(String mode, UITexture texture) { + this.mode = mode; + this.texture = texture.asIcon(); + } + + public String getLocalizedName() { + return IKey.lang("vendingmachine.gui.display_sort_" + this.mode) + .toString(); + } + + public Icon getTexture() { + return this.texture; + } + } + public MTEVendingMachineGui(MTEVendingMachine base) { super(base); this.base = base; @@ -183,6 +212,21 @@ public IWidget createQolButtonColumn() { .addLine(IKey.lang("vendingmachine.gui.display_mode") + " " + displayType.getLocalizedName()); }) .tooltipAutoUpdate(true)); + buttonColumn.child( + new CycleButtonWidget().size(14) + .top(17) + .overlay( + new DynamicDrawable( + () -> sortMode.getTexture() + .size(14))) + .stateCount(SortMode.values().length) + .value(new IntValue.Dynamic(() -> sortMode.ordinal(), val -> { sortMode = SortMode.values()[val]; })) + .tooltipDynamic(builder -> { + builder.clearText(); + builder.addLine(IKey.lang("vendingmachine.gui.display_sort") + " " + sortMode.getLocalizedName()); + setForceRefresh(); + }) + .tooltipAutoUpdate(true)); return buttonColumn; } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java index e663327..37cbccc 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeMainPanel.java @@ -126,6 +126,8 @@ public ItemStack convertToItemStack(BigItemStack stack) { public Map> formatTrades() { Map> trades = new HashMap<>(); trades.put(TradeCategory.ALL, new ArrayList<>()); + MTEVendingMachineGui.SortMode sortMode = MTEVendingMachineGui.sortMode; + for (TradeItemDisplay tid : TradeManager.INSTANCE.tradeData) { TradeGroup group = TradeDatabase.INSTANCE.getTradeGroupFromId(tid.tgID); if (group == null) { @@ -156,28 +158,35 @@ public Map> formatTrades() { if (a.display.getItem() == null) return 1; if (b.display.getItem() == null) return -1; - // enabled or has cooldown - int rankA = getRank(a); - int rankB = getRank(b); - - if (rankA != rankB) { - return Integer.compare(rankA, rankB); + if (sortMode == MTEVendingMachineGui.SortMode.ALPHABET) { + return (a.display.getDisplayName() + .compareTo(b.display.getDisplayName())); + } else if (sortMode == MTEVendingMachineGui.SortMode.SMART) { + // enabled or has cooldown + int rankA = getRank(a); + int rankB = getRank(b); + + if (rankA != rankB) { + return Integer.compare(rankA, rankB); + } + + // cooldown time + int cooldownCmp = Long.compare(b.cooldown, a.cooldown); + if (cooldownCmp != 0) return cooldownCmp; + + // display item ordering + int idCmp = Integer + .compare(Item.getIdFromItem(a.display.getItem()), Item.getIdFromItem(b.display.getItem())); + if (idCmp != 0) return idCmp; + int dmgCmp = Integer.compare(a.display.getItemDamage(), b.display.getItemDamage()); + if (dmgCmp != 0) return dmgCmp; + + // sort by tradegroup Order + return Integer.compare(a.tradeGroupOrder, b.tradeGroupOrder); } - // cooldown time - int cooldownCmp = Long.compare(b.cooldown, a.cooldown); - if (cooldownCmp != 0) return cooldownCmp; - - // display item ordering - int idCmp = Integer - .compare(Item.getIdFromItem(a.display.getItem()), Item.getIdFromItem(b.display.getItem())); - if (idCmp != 0) return idCmp; - int dmgCmp = Integer.compare(a.display.getItemDamage(), b.display.getItemDamage()); - if (dmgCmp != 0) return dmgCmp; - - // sort by tradegroup Order - return Integer.compare(a.tradeGroupOrder, b.tradeGroupOrder); - + // impossible + return 0; }); trades.replace(category, filteredTrades); } diff --git a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java index c020280..3de4571 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java @@ -86,6 +86,18 @@ public final class GuiTextures { .name("mode_list") .build(); + public static final UITexture SORT_SMART = UITexture.builder() + .location(VendingMachine.MODID, "gui/overlay/sort_smart") + .imageSize(32, 32) + .name("sort_smart") + .build(); + + public static final UITexture SORT_ALPHABET = UITexture.builder() + .location(VendingMachine.MODID, "gui/overlay/sort_alphabet") + .imageSize(32, 32) + .name("sort_alphabet") + .build(); + public static final UITexture INPUT_SPRITE = UITexture.builder() .location(VendingMachine.MODID, "gui/background/input") .imageSize(30, 20) diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index c5cc5ea..1162c3d 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -20,6 +20,9 @@ vendingmachine.gui.trade_hint=Shift-Click to Purchase vendingmachine.gui.display_mode=Display: vendingmachine.gui.display_mode_tile=Tiles vendingmachine.gui.display_mode_list=List +vendingmachine.gui.display_sort=Sort: +vendingmachine.gui.display_sort_smart=Smart +vendingmachine.gui.display_sort_alphabet=Alphabetical Order vendingmachine.gui.cooldown_display.second=s vendingmachine.gui.cooldown_display.minute=m diff --git a/src/main/resources/assets/vendingmachine/textures/gui/overlay/sort_alphabet.png b/src/main/resources/assets/vendingmachine/textures/gui/overlay/sort_alphabet.png new file mode 100644 index 0000000000000000000000000000000000000000..19f0991e96f6fa1ad5d77b9f1b9cf1c4de96f2df GIT binary patch literal 765 zcmV1q~8j=(jN5Qq=;KyRs!Nplu2UkH5`~Y!ua#D1W691PJTEuv8+>dwn9(V5mp;2L) z6&eRL-8R$7gqY2(is4rX2qB7o1Y~9zbCQ&T@A$e$fUkFPp5=e;&(W*qEd~Tc;#p>x zHt`1W^rmfa-Y1T-lB^P+6OWm6LE=ZQD;~dbF1jr6%&3`3&l5+9#bO659n4CmMm$9v zQ#GCPg{;Ra=Pk}!rN&zKyGn%>^RL6AovVi>1}_t z0nB`oUT${ujJ0}MVHvMIY#kfu;50Pkn?O*vrT7U)^?dTZ_D^a03F zSE(D|;1C!sQueyfySqDk`}a(%zaQGQa%$y zgCGtR6b~kj;Rx*pb`!e=35ULJU^id{H?RjWAw=bAr1ro|y!hww`w&s| zeUBqcBtQZrKmyDGWKqt_NGsvocLhMq@rbm_{~I8S^5s4-(WC-kEF_mjdA8@4s$K&a zPt>HwHm;iS_2qxbR;3Us5td9{a|VtDxB+Mv v#_LF{PfS3l_TP%5{SALr36KB@a5&%#lEEL)+t!YV00000NkvXXu0mjfu%1ND literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/overlay/sort_smart.png b/src/main/resources/assets/vendingmachine/textures/gui/overlay/sort_smart.png new file mode 100644 index 0000000000000000000000000000000000000000..7df0dc2e83fa17a7016d234d5eb0733ec4ecd43c GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A$W zHKHUqKdq!Zu_%?nIW?!avREOwq%eANX_uGre3zY_)%z;53->dA^J4tfW_W7nJLfCULz|ZU)a8uo{>{5VakFl$`Y}y^ z&0T5F!r7uqr9N-(zRPe!p!i110#Wak3=B6F|LnM-+rTTi{^f_% Date: Fri, 10 Oct 2025 18:03:01 +0800 Subject: [PATCH 16/88] Separated Item and Item Count in list mode. --- .../blocks/gui/TradeItemDisplayWidget.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 66c1d36..4a4c680 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -116,13 +116,8 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IKey.str(display.hasCooldown ? this.display.cooldownText : "") .style(IKey.WHITE)); } else if (this.displayType == DisplayType.LIST) { - GuiDraw.drawText( - " " + this.display.display.stackSize + " " + this.display.display.getDisplayName(), - 4, - 4, - 0.9f, - 0x0, - false); + GuiDraw.drawText("" + this.display.display.stackSize, 6, 4, 0.9f, 0x0, false); + GuiDraw.drawText("" + this.display.display.getDisplayName(), 24, 4, 0.9f, 0x0, false); GuiDraw.drawRect( 1, 1, From 8711e4677e8685cc79840a8b07afff16926851a3 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 10 Oct 2025 22:02:54 +0800 Subject: [PATCH 17/88] Separated Item and Item Count in list mode. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c193ac2..e91cd13 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Alpha Testing This can be used as a standalone mod with several dependencies. The vending machine block and ME Vending Uplink do not come with default recipes. ### Required Dependencies: -- GT5U +- GT5Unofficial-GTNH (Not compatible with main GT5U branch!) - ModularUI 2 - NotEnoughItems - Applied Energistics 2 From 15dfef509dcd26eac0ee5f95fe435ea824b66094 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 02:45:36 +0800 Subject: [PATCH 18/88] Changes: - Added Color settings for VM displayed text - Added small icon next to name of tradeable item --- .../com/cubefury/vendingmachine/Config.java | 12 ++++++++++++ .../blocks/gui/TradeItemDisplayWidget.java | 18 +++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/Config.java b/src/main/java/com/cubefury/vendingmachine/Config.java index d812ea9..4e50247 100644 --- a/src/main/java/com/cubefury/vendingmachine/Config.java +++ b/src/main/java/com/cubefury/vendingmachine/Config.java @@ -16,6 +16,7 @@ public class Config { public static int gui_refresh_interval = 20; public static int dispense_frequency = 10; public static int dispense_amount = 16; + public static int display_text_color = 0x0; public static DisplayType display_type = DisplayType.TILE; public static MTEVendingMachineGui.SortMode sort_mode = MTEVendingMachineGui.SortMode.SMART; @@ -41,6 +42,17 @@ public static void init(File configFile) { 1, Integer.MAX_VALUE, "Number of items per dispense cycle"); + + try { + display_text_color = Integer.decode( + configuration.getString( + "display_text_color", + CONFIG_CATEGORY_VM, + "0x0", + "Color for text in Vending Machine GUI.")); + } catch (NumberFormatException e) { + display_text_color = 0x0; + } try { display_type = DisplayType.valueOf( configuration.getString( diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 4a4c680..e9b9570 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -20,6 +20,7 @@ import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.ItemDisplayWidget; +import com.cubefury.vendingmachine.Config; import com.cubefury.vendingmachine.gui.GuiTextures; public class TradeItemDisplayWidget extends ItemDisplayWidget implements Interactable { @@ -97,7 +98,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { ItemStack item = value.getValue(); if (!Platform.isStackEmpty(item)) { if (this.displayType == DisplayType.TILE) { - GuiDraw.drawText(" " + this.display.display.stackSize, 4, 9, 1.0f, 0x0, false); + GuiDraw.drawText(" " + this.display.display.stackSize, 4, 9, 1.0f, Config.display_text_color, false); GuiDraw.drawItem(item, 26, 4, 16, 16, context.getCurrentDrawingZ()); if (this.display.tradeableNow) { GuiDraw.drawOutline(1, 1, 45, 23, 0x883CFF00, 2); @@ -116,8 +117,19 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IKey.str(display.hasCooldown ? this.display.cooldownText : "") .style(IKey.WHITE)); } else if (this.displayType == DisplayType.LIST) { - GuiDraw.drawText("" + this.display.display.stackSize, 6, 4, 0.9f, 0x0, false); - GuiDraw.drawText("" + this.display.display.getDisplayName(), 24, 4, 0.9f, 0x0, false); + GuiDraw.drawText("" + this.display.display.stackSize, 6, 4, 0.9f, Config.display_text_color, false); + GuiDraw.drawItem(item, 24, 2, 9, 9, context.getCurrentDrawingZ()); + GuiDraw.drawText( + this.display.display.getDisplayName() + .length() > 21 + ? this.display.display.getDisplayName() + .substring(0, 21) + "..." + : this.display.display.getDisplayName(), + 36, + 4, + 0.9f, + Config.display_text_color, + false); GuiDraw.drawRect( 1, 1, From 6bda1e8f514ab0c21ea971804ec20822892d8ff3 Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Fri, 10 Oct 2025 21:21:05 +0200 Subject: [PATCH 19/88] update --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 9bd54c8..80be233 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.6-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.9-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") // implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.21:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.24:dev") } // deps may transitively add Baubles, so we replace it From e2aed96abe339ae52a7f274079c7b84ce634bbec Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 03:33:06 +0800 Subject: [PATCH 20/88] Shifted text color setting to lang file --- src/main/java/com/cubefury/vendingmachine/Config.java | 11 ----------- .../blocks/gui/TradeItemDisplayWidget.java | 9 +++++---- .../resources/assets/vendingmachine/lang/en_US.lang | 2 +- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/Config.java b/src/main/java/com/cubefury/vendingmachine/Config.java index 4e50247..3e4af3e 100644 --- a/src/main/java/com/cubefury/vendingmachine/Config.java +++ b/src/main/java/com/cubefury/vendingmachine/Config.java @@ -16,7 +16,6 @@ public class Config { public static int gui_refresh_interval = 20; public static int dispense_frequency = 10; public static int dispense_amount = 16; - public static int display_text_color = 0x0; public static DisplayType display_type = DisplayType.TILE; public static MTEVendingMachineGui.SortMode sort_mode = MTEVendingMachineGui.SortMode.SMART; @@ -43,16 +42,6 @@ public static void init(File configFile) { Integer.MAX_VALUE, "Number of items per dispense cycle"); - try { - display_text_color = Integer.decode( - configuration.getString( - "display_text_color", - CONFIG_CATEGORY_VM, - "0x0", - "Color for text in Vending Machine GUI.")); - } catch (NumberFormatException e) { - display_text_color = 0x0; - } try { display_type = DisplayType.valueOf( configuration.getString( diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index e9b9570..ebb0549 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -20,8 +20,8 @@ import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.ItemDisplayWidget; -import com.cubefury.vendingmachine.Config; import com.cubefury.vendingmachine.gui.GuiTextures; +import com.cubefury.vendingmachine.util.Translator; public class TradeItemDisplayWidget extends ItemDisplayWidget implements Interactable { @@ -95,10 +95,11 @@ public TradeItemDisplay getDisplay() { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + int textColor = Translator.getColor("vendingmachine.gui.display_text_color"); ItemStack item = value.getValue(); if (!Platform.isStackEmpty(item)) { if (this.displayType == DisplayType.TILE) { - GuiDraw.drawText(" " + this.display.display.stackSize, 4, 9, 1.0f, Config.display_text_color, false); + GuiDraw.drawText(" " + this.display.display.stackSize, 4, 9, 1.0f, textColor, false); GuiDraw.drawItem(item, 26, 4, 16, 16, context.getCurrentDrawingZ()); if (this.display.tradeableNow) { GuiDraw.drawOutline(1, 1, 45, 23, 0x883CFF00, 2); @@ -117,7 +118,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IKey.str(display.hasCooldown ? this.display.cooldownText : "") .style(IKey.WHITE)); } else if (this.displayType == DisplayType.LIST) { - GuiDraw.drawText("" + this.display.display.stackSize, 6, 4, 0.9f, Config.display_text_color, false); + GuiDraw.drawText("" + this.display.display.stackSize, 6, 4, 0.9f, textColor, false); GuiDraw.drawItem(item, 24, 2, 9, 9, context.getCurrentDrawingZ()); GuiDraw.drawText( this.display.display.getDisplayName() @@ -128,7 +129,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { 36, 4, 0.9f, - Config.display_text_color, + textColor, false); GuiDraw.drawRect( 1, diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 1162c3d..6c91d26 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -23,7 +23,7 @@ vendingmachine.gui.display_mode_list=List vendingmachine.gui.display_sort=Sort: vendingmachine.gui.display_sort_smart=Smart vendingmachine.gui.display_sort_alphabet=Alphabetical Order - +vendingmachine.gui.display_text_color=000000 vendingmachine.gui.cooldown_display.second=s vendingmachine.gui.cooldown_display.minute=m vendingmachine.gui.cooldown_display.hour=h From 39a01d43d2990a67c4acf819163af5771ae18560 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 17:45:02 +0800 Subject: [PATCH 21/88] Removed flavortext labels from trades. --- .../blocks/gui/MTEVendingMachineGui.java | 3 --- .../vendingmachine/blocks/gui/TradeItemDisplay.java | 10 ++-------- .../network/handlers/NetTradeDisplaySync.java | 1 - .../com/cubefury/vendingmachine/trade/TradeGroup.java | 7 ------- 4 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index a3d3f66..50e4ad6 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -464,9 +464,6 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { } builder.emptyLine(); - builder.addLine( - IKey.str(cur.label) - .style(IKey.GRAY)); builder.addLine( IKey.str(Translator.translate("vendingmachine.gui.trade_hint")) .style(IKey.GRAY)); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java index 1845e84..6e5e68b 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java @@ -18,7 +18,6 @@ public class TradeItemDisplay { public ItemStack display; public UUID tgID; public int tradeGroupOrder; - public String label; public long cooldown; public String cooldownText; public boolean hasCooldown; @@ -26,15 +25,14 @@ public class TradeItemDisplay { public boolean tradeableNow; public TradeItemDisplay(List fromCurrency, List fromItems, List toItems, - ItemStack display, UUID tgID, int tradeGroupOrder, String label, long cooldown, String cooldownText, - boolean hasCooldown, boolean enabled, boolean tradeableNow) { + ItemStack display, UUID tgID, int tradeGroupOrder, long cooldown, String cooldownText, boolean hasCooldown, + boolean enabled, boolean tradeableNow) { this.fromCurrency = fromCurrency; this.fromItems = fromItems; this.toItems = toItems; this.display = display; this.tgID = tgID; this.tradeGroupOrder = tradeGroupOrder; - this.label = label; this.cooldown = cooldown; this.cooldownText = cooldownText; this.hasCooldown = hasCooldown; @@ -43,10 +41,6 @@ public TradeItemDisplay(List fromCurrency, List from } public boolean satisfiesSearch(ItemFilter filter, String searchStringNoCase) { - if (filter == null) { - return this.label.toLowerCase() - .contains(searchStringNoCase); - } return filter.matches(this.display) || this.toItems.stream() .anyMatch(bis -> filter.matches(bis.getBaseStack())) || this.fromItems.stream() diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java index a399f08..eb1210a 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java @@ -89,7 +89,6 @@ public TradeItemDisplay formatItemDisplay() { t.displayItem == null ? t.displayItem.convertToItemStack() : displayItem, this.tgID, this.tradeGroupOrder, - tg.getLabel(), this.cooldown, convertCooldownText(this.cooldown), this.cooldown > 0, diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeGroup.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeGroup.java index 1436b1d..f45b017 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeGroup.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeGroup.java @@ -28,7 +28,6 @@ public class TradeGroup { private final List trades = new ArrayList<>(); public int cooldown = -1; public int maxTrades = -1; - public String label = ""; private TradeCategory category = TradeCategory.UNKNOWN; private String original_category_str = ""; private final Set requirementSet = new HashSet<>(); @@ -193,7 +192,6 @@ public boolean readFromNBT(NBTTagCompound nbt) { } this.cooldown = nbt.getInteger("cooldown"); this.maxTrades = nbt.getInteger("maxTrades"); - this.label = nbt.getString("label"); NBTTagList tradeList = nbt.getTagList("trades", Constants.NBT.TAG_COMPOUND); for (int i = 0; i < tradeList.tagCount(); i++) { NBTTagCompound trade = tradeList.getCompoundTagAt(i); @@ -217,7 +215,6 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setTag("id", NBTConverter.UuidValueType.TRADEGROUP.writeId(this.id)); nbt.setInteger("cooldown", this.cooldown); nbt.setInteger("maxTrades", this.maxTrades); - nbt.setString("label", this.label); nbt.setString("category", this.category.getKey()); NBTTagList tList = new NBTTagList(); for (Trade t : trades) { @@ -232,10 +229,6 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { return nbt; } - public String getLabel() { - return this.label; - } - @Optional.Method(modid = "betterquesting") public void removeAllSatisfiedBqConditions(UUID player) { synchronized (tradeState) { From 0c3f7e6ff49dcee2529311be3b4b1f7279f93ed3 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 18:03:40 +0800 Subject: [PATCH 22/88] Fixed item display override --- .../network/handlers/NetTradeDisplaySync.java | 3 +-- .../com/cubefury/vendingmachine/trade/Trade.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java index eb1210a..fe339ba 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java @@ -80,8 +80,7 @@ public TradeItemDisplay formatItemDisplay() { TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroupFromId(this.tgID); Trade t = tg.getTrades() .get(this.tradeGroupOrder); - ItemStack displayItem = t.toItems.get(0) - .convertToItemStack(); + ItemStack displayItem = t.getDisplayItem(); return new TradeItemDisplay( t.fromCurrency, t.fromItems, diff --git a/src/main/java/com/cubefury/vendingmachine/trade/Trade.java b/src/main/java/com/cubefury/vendingmachine/trade/Trade.java index a0f9a7c..e6d0e26 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/Trade.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/Trade.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; @@ -56,6 +57,8 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { } public void readFromNBT(NBTTagCompound nbt) { + displayItem = BigItemStack.loadItemStackFromNBT(nbt.getCompoundTag("displayItem")); + fromCurrency.clear(); fromItems.clear(); toItems.clear(); @@ -76,9 +79,18 @@ public void readFromNBT(NBTTagCompound nbt) { } } + public ItemStack getDisplayItem() { + return this.displayItem.getBaseStack() + .isItemEqual(new ItemStack(ItemPlaceholder.placeholder)) + ? this.toItems.get(0) + .convertToItemStack() + : this.displayItem.getBaseStack(); + } + @Optional.Method(modid = "betterquesting") @SideOnly(Side.CLIENT) public IGuiPanel getTradeGui(IGuiRect rect) { return new PanelQBTrade(rect, this); } + } From 698ebb4f44de66d1ab6cfb567817e344e4dce222 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 18:57:50 +0800 Subject: [PATCH 23/88] Regularized save file format by sorting the names of NBT tags within compound before writing --- .../com/cubefury/vendingmachine/Config.java | 9 ++++++++ .../vendingmachine/trade/TradeDatabase.java | 3 ++- .../vendingmachine/util/NBTConverter.java | 22 ++++++++++--------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/Config.java b/src/main/java/com/cubefury/vendingmachine/Config.java index 3e4af3e..a208507 100644 --- a/src/main/java/com/cubefury/vendingmachine/Config.java +++ b/src/main/java/com/cubefury/vendingmachine/Config.java @@ -10,6 +10,7 @@ public class Config { private static final String CONFIG_CATEGORY_VM = "Vending Machine Settings"; + private static final String CONFIG_CATEGORY_DEVELOPER = "Developer Settings"; public static String data_dir = "vendingmachine"; public static String config_dir = "config/vendingmachine"; @@ -18,6 +19,7 @@ public class Config { public static int dispense_amount = 16; public static DisplayType display_type = DisplayType.TILE; public static MTEVendingMachineGui.SortMode sort_mode = MTEVendingMachineGui.SortMode.SMART; + public static boolean forceRewriteDatabase = false; public static File worldDir = null; @@ -42,6 +44,13 @@ public static void init(File configFile) { Integer.MAX_VALUE, "Number of items per dispense cycle"); + configuration.addCustomCategoryComment(CONFIG_CATEGORY_DEVELOPER, "Developer Settings"); + forceRewriteDatabase = configuration.getBoolean( + "force_rewrite_database", + CONFIG_CATEGORY_DEVELOPER, + forceRewriteDatabase, + "Force rewrite database on load, for add/remove trades or change of format"); + try { display_type = DisplayType.valueOf( configuration.getString( diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java index f1db10f..ebdf6a7 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java @@ -13,6 +13,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; +import com.cubefury.vendingmachine.Config; import com.cubefury.vendingmachine.VendingMachine; import com.cubefury.vendingmachine.integration.betterquesting.BqAdapter; import com.cubefury.vendingmachine.integration.nei.NeiRecipeCache; @@ -94,7 +95,7 @@ public void readFromNBT(NBTTagCompound nbt, boolean merge) { tradeGroups.put(tg.getId(), tg); } - if (newMetadataCount > 0) { + if (Config.forceRewriteDatabase || newMetadataCount > 0) { VendingMachine.LOG.info("Appended metadata to {} new trades", newMetadataCount); DirtyDbMarker.markDirty(); } diff --git a/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java b/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java index d09ef91..660194f 100644 --- a/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java +++ b/src/main/java/com/cubefury/vendingmachine/util/NBTConverter.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Map.Entry; import java.util.Optional; -import java.util.Set; import java.util.TreeSet; import java.util.UUID; import java.util.stream.Collectors; @@ -194,17 +193,20 @@ else if (value instanceof NBTTagByteArray) { public static void NBTtoJSON_Compound(NBTTagCompound parent, JsonWriter out, boolean format) throws IOException { out.beginObject(); - if (parent != null) for (String key : (Set) parent.func_150296_c()) { - NBTBase tag = parent.getTag(key); + if (parent != null) for (String key : parent.func_150296_c() + .stream() + .sorted(String::compareTo) + .collect(Collectors.toList())) { + NBTBase tag = parent.getTag(key); - if (format) { - out.name(key + ":" + tag.getId()); - NBTtoJSON_Base(tag, true, out); - } else { - out.name(key); - NBTtoJSON_Base(tag, false, out); + if (format) { + out.name(key + ":" + tag.getId()); + NBTtoJSON_Base(tag, true, out); + } else { + out.name(key); + NBTtoJSON_Base(tag, false, out); + } } - } out.endObject(); } From 2bad5a00907a07b79ddf22a51708f1c5cb1532b0 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 18:58:28 +0800 Subject: [PATCH 24/88] Remove commented out dependency --- dependencies.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 80be233..5b1a875 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -38,7 +38,6 @@ dependencies { implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") - // implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.24:dev") } From 02df82b3f8798f8d3823c1326b1483e0e330c9de Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 11 Oct 2025 19:12:16 +0800 Subject: [PATCH 25/88] Fixed a bug where connecting to a server would override a player's local trade database. --- .../vendingmachine/network/handlers/NetTradeDbSync.java | 2 +- .../java/com/cubefury/vendingmachine/trade/TradeDatabase.java | 4 ++-- .../java/com/cubefury/vendingmachine/util/JsonHelper.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDbSync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDbSync.java index 1529d58..8ec2b08 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDbSync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDbSync.java @@ -68,6 +68,6 @@ public static void onClient(NBTTagCompound message) { ) { return; } - TradeDatabase.INSTANCE.readFromNBT(message.getCompoundTag("data"), message.getBoolean("merge")); + TradeDatabase.INSTANCE.readFromNBT(message.getCompoundTag("data"), message.getBoolean("merge"), false); } } diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java index ebdf6a7..6c14035 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java @@ -72,7 +72,7 @@ public int getTradeCount() { .sum(); } - public void readFromNBT(NBTTagCompound nbt, boolean merge) { + public void readFromNBT(NBTTagCompound nbt, boolean merge, boolean isFileLoad) { if (!merge) { this.clear(); if (VendingMachine.isBqLoaded) { @@ -95,7 +95,7 @@ public void readFromNBT(NBTTagCompound nbt, boolean merge) { tradeGroups.put(tg.getId(), tg); } - if (Config.forceRewriteDatabase || newMetadataCount > 0) { + if (isFileLoad && (Config.forceRewriteDatabase || newMetadataCount > 0)) { VendingMachine.LOG.info("Appended metadata to {} new trades", newMetadataCount); DirtyDbMarker.markDirty(); } diff --git a/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java b/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java index 0dc336f..de316a9 100644 --- a/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java +++ b/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java @@ -55,7 +55,7 @@ public static void populateTradeDatabaseFromFile(File file) { Function readNbt = f -> NBTConverter .JSONtoNBT_Object(FileIO.ReadFromFile(f), new NBTTagCompound(), true); - db.readFromNBT(readNbt.apply(file), false); + db.readFromNBT(readNbt.apply(file), false, true); } public static void populateTradeStateFromFiles(List files) { From 35b153f08af429eb67e0993cf867eace14c81453 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 04:05:29 +0800 Subject: [PATCH 26/88] [V2 Fix] Fixed a bug where the coins display in GUI would not update correctly. --- .../blocks/gui/MTEVendingMachineGui.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index a3d3f66..6014419 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -4,6 +4,7 @@ import static com.cubefury.vendingmachine.gui.GuiTextures.SORT_SMART; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -572,8 +573,10 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel) { .left(3); Flow coinColumn = new Column().width(COIN_COLUMN_WIDTH); int coinCount = 0; + + UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(getBase().getCurrentUser()); Map currentAmounts = TradeManager.INSTANCE.playerCurrency - .getOrDefault(NameCache.INSTANCE.getUUIDFromPlayer(getBase().getCurrentUser()), new HashMap<>()); + .getOrDefault(playerId, Collections.EMPTY_MAP); for (CurrencyItem.CurrencyType type : CurrencyItem.CurrencyType.values()) { coinColumn.child( new Row().child( @@ -592,15 +595,17 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel) { .style(IKey.GRAY, IKey.ITALIC)); builder.setAutoUpdate(true); })) - .child( - IKey.dynamic( - () -> getReadableStringFromCoinAmount( - currentAmounts.get(type) == null ? 0 : currentAmounts.get(type))) - .scale(0.8f) - .asWidget() - .top(3) - .left(14) - .width(21)) + .child(IKey.dynamic(() -> { + Map currencyMap = TradeManager.INSTANCE.playerCurrency + .getOrDefault(playerId, Collections.EMPTY_MAP); + return getReadableStringFromCoinAmount( + currencyMap.get(type) == null ? 0 : currencyMap.get(type)); + }) + .scale(0.8f) + .asWidget() + .top(3) + .left(14) + .width(21)) .height(14)); if (++coinCount % COIN_COLUMN_ROW_COUNT == 0) { parent.child(coinColumn.left(3 + COIN_COLUMN_WIDTH * (coinCount / COIN_COLUMN_ROW_COUNT - 1))); From 19fd3c252c9bc44857cc4a78af0e99245e97c075 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 19:31:26 +0800 Subject: [PATCH 27/88] Adapt to MUI2 update --- dependencies.gradle | 4 ++-- .../blocks/gui/MTEVendingMachineGui.java | 4 ++-- .../vendingmachine/blocks/gui/SearchBar.java | 10 +++++++--- .../blocks/gui/TradeItemDisplayWidget.java | 4 ++-- .../com/cubefury/vendingmachine/gui/GuiTextures.java | 12 ++++++++++-- .../cubefury/vendingmachine/gui/WidgetThemes.java | 8 +++++--- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 80be233..f9b2b97 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -37,10 +37,10 @@ dependencies { implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.9-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.1-1.7.10:dev") // implementation("com.github.GTNewHorizons:ModularUI2:2.2.20-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.24:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.30:dev") } // deps may transitively add Baubles, so we replace it diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 6014419..ca01956 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -280,7 +280,7 @@ private SearchBar createSearchBar() { return new SearchBar(this).width(162) .left(3) .top(5) - .height(10); + .height(14); } // Eject code is in GUI instead of MTE since the syncers are per-gui instance @@ -346,7 +346,7 @@ private void doEjectItems() { } private IWidget createIOColumn() { - return new ParentWidget<>().excludeAreaInNEI() + return new ParentWidget<>().excludeAreaInRecipeViewer() .width(50) .height(178) .right(-48) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java index 72de631..2d4ba8a 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java @@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTextFieldTheme; +import com.cleanroommc.modularui.theme.TextFieldTheme; import com.cleanroommc.modularui.widgets.textfield.BaseTextFieldWidget; import com.cubefury.vendingmachine.gui.GuiTextures; import com.cubefury.vendingmachine.util.Translator; @@ -21,6 +21,7 @@ public SearchBar(MTEVendingMachineGui gui) { this.gui = gui; background(GuiTextures.TEXT_FIELD_BACKGROUND); + hoverBackground(GuiTextures.TEXT_FIELD_BACKGROUND); setText(""); this.previousText = ""; hintText(Translator.translate("vendingmachine.gui.search")); @@ -69,9 +70,12 @@ public String getText() { } @Override - protected void setupDrawText(ModularGuiContext context, WidgetTextFieldTheme widgetTheme) { + protected void setupDrawText(ModularGuiContext context, TextFieldTheme widgetTheme) { this.renderer.setSimulate(false); - this.renderer.setPos(getArea().getPadding().left, 0); + this.renderer.setPos( + getArea().getPadding() + .getLeft(), + 0); this.renderer.setScale(this.scale); this.renderer.setAlignment(this.textAlignment, -1, getArea().height); } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index ebb0549..88500bc 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -15,7 +15,7 @@ import com.cleanroommc.modularui.drawable.Icon; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.utils.Platform; import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.SyncHandler; @@ -94,7 +94,7 @@ public TradeItemDisplay getDisplay() { } @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { int textColor = Translator.getColor("vendingmachine.gui.display_text_color"); ItemStack item = value.getValue(); if (!Platform.isStackEmpty(item)) { diff --git a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java index 3de4571..ba50881 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java @@ -1,6 +1,9 @@ package com.cubefury.vendingmachine.gui; +import net.minecraft.util.ResourceLocation; + import com.cleanroommc.modularui.api.GuiAxis; +import com.cleanroommc.modularui.drawable.ColorType; import com.cleanroommc.modularui.drawable.TabTexture; import com.cleanroommc.modularui.drawable.UITexture; import com.cubefury.vendingmachine.VendingMachine; @@ -116,6 +119,11 @@ public final class GuiTextures { .name("coin_eject") .build(); - public static final TabTexture TAB_LEFT = TabTexture - .of(UITexture.fullImage(VendingMachine.MODID, "gui/tabs_left", true), GuiAxis.X, false, 32, 28, 4); + public static final TabTexture TAB_LEFT = TabTexture.of( + UITexture.fullImage(new ResourceLocation(VendingMachine.MODID, "gui/tabs_left"), ColorType.DEFAULT), + GuiAxis.X, + false, + 32, + 28, + 4); } diff --git a/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java b/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java index caf00cf..2fe524f 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java @@ -11,13 +11,15 @@ public final class WidgetThemes { public static void register() { IThemeApi themeApi = IThemeApi.get(); - registerThemedTexture(themeApi, BACKGROUND_SIDEPANEL, GuiTextures.SIDE_PANEL_BACKGROUND); + registerThemedTexture(themeApi, BACKGROUND_SIDEPANEL, GuiTextures.SIDE_PANEL_BACKGROUND, 0, 0); } - private static void registerThemedTexture(IThemeApi themeApi, String textureThemeId, UITexture background) { + private static void registerThemedTexture(IThemeApi themeApi, String textureThemeId, UITexture background, + int defaultWidth, int defaultHeight) { themeApi.registerWidgetTheme( textureThemeId, - new WidgetTheme(background, null, Color.WHITE.main, 0xFF404040, false), + new WidgetTheme(defaultWidth, defaultHeight, background, Color.WHITE.main, 0xFF404040, false, 0), + new WidgetTheme(defaultWidth, defaultHeight, background, Color.WHITE.main, 0xFF404040, false, 0), WidgetTheme::new); } } From b96f487215a22cf2d05b52e7d24a2263c0ef6cd0 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 19:54:34 +0800 Subject: [PATCH 28/88] Fix hoverbackground behavior --- .../vendingmachine/blocks/gui/TradeItemDisplayWidget.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 88500bc..44d8576 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -63,12 +63,18 @@ public TradeItemDisplayWidget(TradeItemDisplay display, DisplayType displayType) background( new DynamicDrawable( () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); + hoverBackground( + new DynamicDrawable( + () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); } else if (displayType == DisplayType.LIST) { height(MTEVendingMachineGui.LIST_ITEM_HEIGHT); width(MTEVendingMachineGui.LIST_ITEM_WIDTH); background( new DynamicDrawable( () -> pressed ? GuiTextures.LIST_TRADE_BUTTON_PRESSED : GuiTextures.LIST_TRADE_BUTTON_UNPRESSED)); + hoverBackground( + new DynamicDrawable( + () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); } this.display = display; From c224aca13996fc890a56865b4821e91a2c82dccd Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 19:59:39 +0800 Subject: [PATCH 29/88] Fix hoverbackground behavior for lists --- .../vendingmachine/blocks/gui/TradeItemDisplayWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 44d8576..5817d67 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -74,7 +74,7 @@ public TradeItemDisplayWidget(TradeItemDisplay display, DisplayType displayType) () -> pressed ? GuiTextures.LIST_TRADE_BUTTON_PRESSED : GuiTextures.LIST_TRADE_BUTTON_UNPRESSED)); hoverBackground( new DynamicDrawable( - () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); + () -> pressed ? GuiTextures.LIST_TRADE_BUTTON_PRESSED : GuiTextures.LIST_TRADE_BUTTON_UNPRESSED)); } this.display = display; From 08b498474c3b4e48df04c31e4b9f413899a06443 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 20:11:53 +0800 Subject: [PATCH 30/88] Fixed persistent tooltips onMouseEndHover. --- .../vendingmachine/blocks/gui/TradeItemDisplayWidget.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 5817d67..602f7f1 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -30,8 +30,8 @@ public enum DisplayType { TILE("tile", MODE_TILE), LIST("list", MODE_LIST); - private String type; - private Icon texture; + private final String type; + private final Icon texture; DisplayType(String type, UITexture texture) { this.type = type; @@ -177,6 +177,7 @@ public ItemDisplayWidget item(IValue itemSupplier) { @Override public void onMouseEndHover() { pressed = false; + super.onMouseEndHover(); } @Override From f2eb1363108d5eac590ef028a6f55cc223d8a54b Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 21:02:07 +0800 Subject: [PATCH 31/88] Fix element positioning --- .../blocks/gui/MTEVendingMachineGui.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index ca01956..8a9176c 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -85,6 +85,7 @@ public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { public static final int CUSTOM_UI_HEIGHT = 320; // Trade Item Display + public static final int TRADE_ROW_WIDTH = 154; public static final int TILE_ITEMS_PER_ROW = 3; public static final int TILE_ITEM_HEIGHT = 25; public static final int TILE_ITEM_WIDTH = 47; @@ -484,14 +485,14 @@ private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller t .height(146); for (TradeCategory category : this.tradeCategories) { ListWidget tradeList = new ListWidget<>().debugName("items") - .width(156) + .width(161) .top(1) .height(144) .collapseDisabledChild(true); tradeList.child(new Row().height(2)); // Higher first row top margin - Flow row = new TradeRow().height(TILE_ITEM_HEIGHT +2).left(2); + Flow row = new TradeRow().height(TILE_ITEM_HEIGHT +2).width(TRADE_ROW_WIDTH).marginLeft(2); // Tiles Display for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { @@ -515,7 +516,7 @@ private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller t if (i % TILE_ITEMS_PER_ROW == TILE_ITEMS_PER_ROW - 1) { tradeList.child(row); - row = new TradeRow().height(TILE_ITEM_HEIGHT +2).left(2); + row = new TradeRow().height(TILE_ITEM_HEIGHT +2).width(TRADE_ROW_WIDTH).marginLeft(2); } } if (row.hasChildren()) { @@ -523,7 +524,7 @@ private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller t } // List Display - row = new TradeRow().height(LIST_ITEM_HEIGHT).left(2); + row = new TradeRow().height(LIST_ITEM_HEIGHT).width(TRADE_ROW_WIDTH).marginLeft(2); for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { int index = i; displayedTradesList.get(category).get(i).setRootPanel(rootPanel); @@ -542,7 +543,7 @@ private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller t return displayType == display.displayType && display.getDisplay() != null; })); tradeList.child(row); - row = new TradeRow().height(LIST_ITEM_HEIGHT).left(2); + row = new TradeRow().height(LIST_ITEM_HEIGHT).width(TRADE_ROW_WIDTH).marginLeft(2); } tradeList.child(new Row().height(2)); // bottom padding for last row From 9b87a8c59d86919e5b2cffb9f051f36b9de45386 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 21:05:25 +0800 Subject: [PATCH 32/88] Remove color-correction work around for ListWidget elements --- .../cubefury/vendingmachine/gui/GuiTextures.java | 12 ++++++++---- ...list_trade_button_pressed_color_corrected.png | Bin 3210 -> 0 bytes ...st_trade_button_unpressed_color_corrected.png | Bin 3211 -> 0 bytes .../trade_button_pressed_color_corrected.png | Bin 3261 -> 0 bytes .../trade_button_unpressed_color_corrected.png | Bin 3280 -> 0 bytes 5 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed_color_corrected.png delete mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed_color_corrected.png delete mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/trade_button_pressed_color_corrected.png delete mode 100644 src/main/resources/assets/vendingmachine/textures/gui/background/trade_button_unpressed_color_corrected.png diff --git a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java index ba50881..2a9c414 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/GuiTextures.java @@ -50,28 +50,32 @@ public final class GuiTextures { // TODO: Restore canApplyTheme to trade button textures after scrolling texture bug is fixed in MUI2 public static final UITexture TILE_TRADE_BUTTON_UNPRESSED = UITexture.builder() - .location(VendingMachine.MODID, "gui/background/trade_button_unpressed_color_corrected") + .location(VendingMachine.MODID, "gui/background/trade_button_unpressed") + .canApplyTheme() .imageSize(195, 136) .adaptable(4) .name("trade_button_unpressed") .build(); public static final UITexture TILE_TRADE_BUTTON_PRESSED = UITexture.builder() - .location(VendingMachine.MODID, "gui/background/trade_button_pressed_color_corrected") + .location(VendingMachine.MODID, "gui/background/trade_button_pressed") + .canApplyTheme() .imageSize(195, 136) .adaptable(4) .name("trade_button_pressed") .build(); public static final UITexture LIST_TRADE_BUTTON_UNPRESSED = UITexture.builder() - .location(VendingMachine.MODID, "gui/background/list_trade_button_unpressed_color_corrected") + .location(VendingMachine.MODID, "gui/background/list_trade_button_unpressed") + .canApplyTheme() .imageSize(195, 136) .adaptable(2) .name("list_trade_button_unpressed") .build(); public static final UITexture LIST_TRADE_BUTTON_PRESSED = UITexture.builder() - .location(VendingMachine.MODID, "gui/background/list_trade_button_pressed_color_corrected") + .location(VendingMachine.MODID, "gui/background/list_trade_button_pressed") + .canApplyTheme() .imageSize(195, 136) .adaptable(2) .name("list_trade_button_pressed") diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed_color_corrected.png b/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_pressed_color_corrected.png deleted file mode 100644 index 994c3d1ba371eff912417a0ceaa616768a1ddb8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3210 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 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed_color_corrected.png b/src/main/resources/assets/vendingmachine/textures/gui/background/list_trade_button_unpressed_color_corrected.png deleted file mode 100644 index e931d75bdf6a09fa21f0cb1fa1657e1299308aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3211 zcmd5;=|9wq7ycrI>{}DrvP@ZL(%7@iU~Jh9LZb<}VJ6144zjOvL&?5mE3PComPTZc zG4?2B>mssmV^BZ$Pq^=XFV6Fv=Q+>kyg6@9lGQC^PWDUe003~BAQ3ia+<8`s=UL9s zdF~GL8J+Xex6lWGy1zJ1+|M+-nl~J76<}j*AYoz%he0%8Fh!^m1OSjp1zACMw$nlh zRI(b`DuXBa$?${wHjGG4GBRE18ib9#8F^=xjQi} z#S6{KaA6Bz@&V>>_4NiqG$Y0w#_*|BpB#RgFu8?G;^_F=m~LtZ@Vn?qvy&7Au*yzd z-l0vqfQ0+ibx`>-B+LHnx2hIHDyBnHPSH?@%zzz*+u;W}9^4wc&{%EIK)}#~$JX~5 zxy3XMzP8kKG)Q>)JgphpCX0!|o5bt&V87Ra!f(Ls5GcINfMGvkjuWZtbxFX?q!l^cG zUpN1858lmG&%i_AZfbs>p%sX(zM%!&(S@a=1e!SOuRt*&-V^DzMCB)jh=B@o3G=MR z+kO0r%sB?}dbFZk8h7Wfvgzimq|Y?o;VehSa>+}25n=%N8m|Of*gg5-O#(-cG1Czx zWh5uN;Fucyi-2k}|J5fX9ZAF(BcM%u)+P`rd2(W6(;`nb8p*un*i=P zCPsa5;<<-t$Xv9*V+MqTus~E}@x>?6HE6jPEP=(msxdI!Mf@YooT@sj(xUzV7i5Vk!K6Zn7bDF@Wd-XQ>p}G*V?>QOP*19RMV;f{nvA3sObtGDr7zQh61jrSU&2W4FLy%xsB_3-7gAxu1bXJ-1)i+g*J z3jB@0(?FS){g#-P>!CfN)}e8s>!F8xY;=WF>C?+}GToL%lSPt+nWct>#JL@>&?(UA z8h;vJo0gh(Hx+g<5TpZjxXz_Aq~>>{?STR8p_-HDDB7PQfcXfuxc=2Qbov6UUd;?r z4H1DRP%aNLFSSw<6o-Xw2^plYq==aFjb-L^`gjnXM-^ifITTwJikv`>-M4+~S4s5y zzSsi4ulEVP@pt*}+uk3;>{i$0D1Lg|bMV<^$7Qy;dihT(!OzRDm-Gb_G*rd!&M^mB=J9H#*NOa%9bxai@i;q{Wk52>A5 zaRhN98#hNSTjWJ|erukQ_fakA{^%^`S}C&BfYc@;2VwF&v{bN^|9M{No!;QyC%s5a z&0SQFTk=>Ue^+2HX0dcJZ=q6{t}xS#)9$!gqCQWTS~LtvQBs(6%x|O7__}5CWsLbo zk|0TnNt+ra`7A?wqfzCJW|d7o8%i7eg{)XsY{uqCStztg z-?3{Kvg0VMq*qRsx835f_)>ImRY#Vr!}KgY`=K3@w}R~$+IW2znovJjpIl!ykpFDm z1t!DJcf$ido${u&TXmW`9@T|-;|9%L%(Bhgl~vO`L>BrNs$kL0(>oReayx|G_im4z zJ6uO@7vFyU7L6}o{z$hUt}3q%MXl8;IqS6bU@4CpV;j96M1mWX6qLi8l{{T7(;Y@~ zpV#e2tldr#Og8LRgEjfQ_>%Y;Jf+^`y-`tRA#N5dBWzY zXz+MFSmHx<7<8DQT>COZx(r4sQI*BNh`k{Puwsn+iO;m2{d{NTj!w*)uJ~kq3`KKET!?uglvMw zu^7xq?I4muZ)r9uecAA%Gh#mC$D>3h0)_*7#n zNzcR>6QmQwBJ*hL`~yA{bJ_wLvs#O{?Z#=WuxIb~fpTJVXcw4L|KFHnQ z1Au$@1cU@g*y024d1EE)uvnjt%K2~rV0dPN(6XaeR!*?Wcl+W(we?vFd*OSQLnU}M;Xv?kr>UdpKnQEyEnZbUV$U`Tc zhUbz#rCgk&UVQ7jgoA9O-(BE==;fQ7K^MTwg!otehemf*|39Sv)9U}D@R49=L`czT lxHFk8>xk&S&qL#G1OA@!G2ei7TtB-cU}AU+@yY-l{Xc^Ew6OpH diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/trade_button_pressed_color_corrected.png b/src/main/resources/assets/vendingmachine/textures/gui/background/trade_button_pressed_color_corrected.png deleted file mode 100644 index 1c15f01d60f3eb27b5e2c35f4a16befc66aab7c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3261 zcmds(={wX77sr1iTNtv8+mu^miDbr-NTxzUG-I-x$eL{!%Vf-0vyP#WY%!JfW<-{; zG|G}COUbR0ts;Ywtdl+D@%#=da005hrUcGtf zorjS5c@Nd``)!^>89NjAaSdPFkm-xdO?@V)v+C@BM` z9yH^&PUSyWS3wvSi2AKhQ)wN0dYZ8_A3f-oxeygdynp=ObCHY_gX!F%%jTU4p1K}ty=-0_jVT>i_|mk+Bt=MD^WsO z(mGYztw4cZOU{K~x9kdbqhe)`7L}+X| zK*2cDuZ{DD=*=P~|HXgPKlQ$rmezfybapzkplu;qZx0;FLCAAL+j5eY-zIwsWN_ny zzS*mosTf{DAhP;cgWv=Gt^?iG>NWf0y~(qy7xd9r>E3Ud&ARAUL~KPKu}OX_mz)NpOzb2%nF%q2x&W5G=Pl?30x5!<=KqAZh7RVfxI{9^c6l`Ff8WXcRl9OXpbQ2H_N-0PiHB$KNuF0FlOm1kQof=}jN zerFy36*4~#(Og-Z6*R#-I1Er7<8Lb#-XTMvmJ+TrrEWD89>Bck4wHURiv3Oxo zHdK07(xj`L)gQRb9v@*3Zl_rEy zy3MZXH_p`%F#J%!w6xDu%Ot&3e5(sF`dmmti_?vVaP<8lr~`D&lTpZUVAwFcJWRa# zZ_wDr=0#b9$iYPKl^kVwkYk4f!`E2gmXn$=eoN6l2`4S=oHD)3U2`SZkGZPAP;`H=ru){E!%vix%Ou(4@^0 z>SJmSl8USwFmhs4#RcRAJX!Wfq{@660z{KuzSSL z4bA=ITZ-$}tk8Vrk33J%ne?9U`4gPmt~tPnd$;Upc{W0=(E*Q%sIOfa_4nB^? z7#j>&i!Ky>O=Fs(Jw850D&Fu}Ae_%W&qWhI-!^)DTxtCL7!o$(FyP?a7SWIVM)k4t z({V$+NNc?8ahX-XevPMxgt6#Ty`k8^$AKS1t_SL|*E`0#a#y~x_2=BC856V3s;r+= zjz7j%l%^$Fw)2~#PTvp%En|`0ogMB^dWfj{vKMm!|GL6G;n{Y@BmDvukOjN-u#D!o zX4RJb?H{|VkuM`$Cn2rj5htsL9Q!b1Q+#{Pdz;&cUn3mU+QB72{QF5u$m+SlbLu)Z zI%F{k$dJUk(&z=I!nOf9fUI6}(OUDIX1xX;)~{W84(pM{dA3nem82RU(s@z7Mzl~A zELvCb&345JA>$+JaO^_;HLn}Pc@=(;VWsB?aYg8xR6Xc@s&GmG<Rv3;>L z1(-sDVuRB3!{Q7S$0IDc`Kd%!W@Y9*>$suVq4aaK`W7Fp2waqrUS_LOi`5m#zQxAT zy9tP*Dks9e&12#+w$62FH7F*oq@%1Tq>cT@Y4@^qx7|c}aFy?K+h-GK z1R*BUWwl_sJ^T1!y)8Cn^+jY3&w!ihJB8zqv zraj&f94BpFpvMKi6mBkV=2Ew*=>w|+_pDTrcL`&m4UxF@{q#@1WfcRxPgO3M>(Zh_ zr)~{2jjff>mBG85q!y?@qXL6IzxjdyA@*~c;Z9A9Q9EwcRx3@ap?1jI4Nat<$EO{8 z?!H@Cij<7>zihuZIE)*cjOzS(ZSKYb&FRQHz5!u9A!p_+Y2lZD^_P*A%4RKf2~9jf zH#lqtw!1vjQW6ed@%ow{T{AED+jUC5++;Q_OJ-!BzU96^p6$&=k9=r7ZGe(Vt?hn# zkoo6R5@)Y$rfgRHnfU#TI~iqVU&{h6VfL|m#Gh+B^RfB=L{~)>?y_FpmX4mMIcRJB zd3X>!HNvv{RZVSn-h3H89KFe*&FHL!B;aNzWg>gRMs_bP?srA7`4*EXX{3{{E)kXit0%VN*LHQdRb&p|%%g#(4j}*_DE41KAHPNI9S%?6jqUMPxI1`)Yp^F^9Ne5TB0WphqKb?dRjH!oG*uq;_6^< h&h><9yhiu7$b7`P4vD7uDClRvEg){s%~7?P&l2 diff --git a/src/main/resources/assets/vendingmachine/textures/gui/background/trade_button_unpressed_color_corrected.png b/src/main/resources/assets/vendingmachine/textures/gui/background/trade_button_unpressed_color_corrected.png deleted file mode 100644 index 13c9e0107d5860a4bad8cc3bcaff39113a2bc9bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3280 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 From 8dfe321e8a97be28167f851b2c8297cf19c33253 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 21:50:09 +0800 Subject: [PATCH 33/88] [Crashing] Address Review Comments --- .../vendingmachine/VendingMachine.java | 4 --- .../vendingmachine/blocks/gui/SearchBar.java | 6 ++--- .../vendingmachine/gui/WidgetThemes.java | 26 +++++++++---------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/VendingMachine.java b/src/main/java/com/cubefury/vendingmachine/VendingMachine.java index 7ef5787..6bac1b5 100644 --- a/src/main/java/com/cubefury/vendingmachine/VendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/VendingMachine.java @@ -3,7 +3,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.cubefury.vendingmachine.gui.WidgetThemes; import com.cubefury.vendingmachine.items.VMItems; import com.cubefury.vendingmachine.network.PacketTypeRegistry; import com.cubefury.vendingmachine.network.SerializedPacket; @@ -66,9 +65,6 @@ public void preInit(FMLPreInitializationEvent event) { network.registerMessage(SerializedPacket.HandleClient.class, SerializedPacket.class, 0, Side.CLIENT); network.registerMessage(SerializedPacket.HandleServer.class, SerializedPacket.class, 0, Side.SERVER); - // ModularUI - WidgetThemes.register(); - } @Mod.EventHandler diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java index 2d4ba8a..b611874 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/SearchBar.java @@ -7,7 +7,7 @@ import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.TextFieldTheme; import com.cleanroommc.modularui.widgets.textfield.BaseTextFieldWidget; -import com.cubefury.vendingmachine.gui.GuiTextures; +import com.cubefury.vendingmachine.gui.WidgetThemes; import com.cubefury.vendingmachine.util.Translator; public class SearchBar extends BaseTextFieldWidget { @@ -19,9 +19,7 @@ public SearchBar(MTEVendingMachineGui gui) { super(); this.gui = gui; - - background(GuiTextures.TEXT_FIELD_BACKGROUND); - hoverBackground(GuiTextures.TEXT_FIELD_BACKGROUND); + widgetTheme(WidgetThemes.BACKGROUND_SEARCH_BAR); setText(""); this.previousText = ""; hintText(Translator.translate("vendingmachine.gui.search")); diff --git a/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java b/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java index 2fe524f..ebad55b 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java @@ -1,25 +1,23 @@ package com.cubefury.vendingmachine.gui; import com.cleanroommc.modularui.api.IThemeApi; -import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeKey; import com.cleanroommc.modularui.utils.Color; public final class WidgetThemes { - public static final String BACKGROUND_SIDEPANEL = "background_side_panel"; + private static final IThemeApi themeApi = IThemeApi.get(); - public static void register() { - IThemeApi themeApi = IThemeApi.get(); - registerThemedTexture(themeApi, BACKGROUND_SIDEPANEL, GuiTextures.SIDE_PANEL_BACKGROUND, 0, 0); - } + public static final WidgetThemeKey BACKGROUND_SIDEPANEL = themeApi + .widgetThemeKeyBuilder("background_side_panel", WidgetTheme.class) + .defaultTheme(new WidgetTheme(0, 0, GuiTextures.SIDE_PANEL_BACKGROUND, Color.WHITE.main, 0xFF404040, false, 0)) + .defaultHoverTheme(null) + .register(); - private static void registerThemedTexture(IThemeApi themeApi, String textureThemeId, UITexture background, - int defaultWidth, int defaultHeight) { - themeApi.registerWidgetTheme( - textureThemeId, - new WidgetTheme(defaultWidth, defaultHeight, background, Color.WHITE.main, 0xFF404040, false, 0), - new WidgetTheme(defaultWidth, defaultHeight, background, Color.WHITE.main, 0xFF404040, false, 0), - WidgetTheme::new); - } + public static final WidgetThemeKey BACKGROUND_SEARCH_BAR = themeApi + .widgetThemeKeyBuilder("background_search_bar", WidgetTheme.class) + .defaultTheme(new WidgetTheme(0, 0, GuiTextures.TEXT_FIELD_BACKGROUND, Color.WHITE.main, 0xFF404040, false, 0)) + .defaultHoverTheme(null) + .register(); } From c948122513dbdab94e65f92c5d1e5f4457a69571 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 12 Oct 2025 22:39:22 +0800 Subject: [PATCH 34/88] [Working] Address Review Comments --- .../vendingmachine/VendingMachine.java | 4 +++ .../blocks/gui/TradeItemDisplayWidget.java | 8 ++---- .../vendingmachine/gui/WidgetThemes.java | 25 ++++++++++++++++--- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/VendingMachine.java b/src/main/java/com/cubefury/vendingmachine/VendingMachine.java index 6bac1b5..4e9ca12 100644 --- a/src/main/java/com/cubefury/vendingmachine/VendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/VendingMachine.java @@ -3,6 +3,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.cubefury.vendingmachine.gui.WidgetThemes; import com.cubefury.vendingmachine.items.VMItems; import com.cubefury.vendingmachine.network.PacketTypeRegistry; import com.cubefury.vendingmachine.network.SerializedPacket; @@ -61,6 +62,9 @@ public void preInit(FMLPreInitializationEvent event) { proxy.registerHandlers(); PacketTypeRegistry.INSTANCE.init(); + // MUI2 + WidgetThemes.init(); + // Register network handlers network.registerMessage(SerializedPacket.HandleClient.class, SerializedPacket.class, 0, Side.CLIENT); network.registerMessage(SerializedPacket.HandleServer.class, SerializedPacket.class, 0, Side.SERVER); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index 602f7f1..fccdf13 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -21,6 +21,7 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.ItemDisplayWidget; import com.cubefury.vendingmachine.gui.GuiTextures; +import com.cubefury.vendingmachine.gui.WidgetThemes; import com.cubefury.vendingmachine.util.Translator; public class TradeItemDisplayWidget extends ItemDisplayWidget implements Interactable { @@ -57,24 +58,19 @@ public Icon getTexture() { public TradeItemDisplayWidget(TradeItemDisplay display, DisplayType displayType) { this.displayType = displayType; + widgetTheme(WidgetThemes.THEME_TRADE_BUTTON); if (displayType == DisplayType.TILE) { height(MTEVendingMachineGui.TILE_ITEM_HEIGHT); width(MTEVendingMachineGui.TILE_ITEM_WIDTH); background( new DynamicDrawable( () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); - hoverBackground( - new DynamicDrawable( - () -> pressed ? GuiTextures.TILE_TRADE_BUTTON_PRESSED : GuiTextures.TILE_TRADE_BUTTON_UNPRESSED)); } else if (displayType == DisplayType.LIST) { height(MTEVendingMachineGui.LIST_ITEM_HEIGHT); width(MTEVendingMachineGui.LIST_ITEM_WIDTH); background( new DynamicDrawable( () -> pressed ? GuiTextures.LIST_TRADE_BUTTON_PRESSED : GuiTextures.LIST_TRADE_BUTTON_UNPRESSED)); - hoverBackground( - new DynamicDrawable( - () -> pressed ? GuiTextures.LIST_TRADE_BUTTON_PRESSED : GuiTextures.LIST_TRADE_BUTTON_UNPRESSED)); } this.display = display; diff --git a/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java b/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java index ebad55b..3aa882f 100644 --- a/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java +++ b/src/main/java/com/cubefury/vendingmachine/gui/WidgetThemes.java @@ -1,12 +1,15 @@ package com.cubefury.vendingmachine.gui; import com.cleanroommc.modularui.api.IThemeApi; +import com.cleanroommc.modularui.theme.TextFieldTheme; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.theme.WidgetThemeKey; import com.cleanroommc.modularui.utils.Color; public final class WidgetThemes { + public static void init() {} + private static final IThemeApi themeApi = IThemeApi.get(); public static final WidgetThemeKey BACKGROUND_SIDEPANEL = themeApi @@ -15,9 +18,25 @@ public final class WidgetThemes { .defaultHoverTheme(null) .register(); - public static final WidgetThemeKey BACKGROUND_SEARCH_BAR = themeApi - .widgetThemeKeyBuilder("background_search_bar", WidgetTheme.class) - .defaultTheme(new WidgetTheme(0, 0, GuiTextures.TEXT_FIELD_BACKGROUND, Color.WHITE.main, 0xFF404040, false, 0)) + public static final WidgetThemeKey BACKGROUND_SEARCH_BAR = themeApi + .widgetThemeKeyBuilder("background_search_bar", TextFieldTheme.class) + .defaultTheme( + new TextFieldTheme( + 0, + 0, + GuiTextures.TEXT_FIELD_BACKGROUND, + Color.WHITE.main, + 0xFF404040, + false, + 0, + 0, + 0xFF404040)) + .defaultHoverTheme(null) + .register(); + + public static final WidgetThemeKey THEME_TRADE_BUTTON = themeApi + .widgetThemeKeyBuilder("background_tile_trade_button", WidgetTheme.class) + .defaultTheme(new WidgetTheme(0, 0, null, Color.WHITE.main, 0xFF404040, false, 0)) .defaultHoverTheme(null) .register(); } From 634b9c5eedf31a600d895afc25429cb40ab57d37 Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Sun, 12 Oct 2025 20:11:58 +0200 Subject: [PATCH 35/88] update --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index c85977f..fd08254 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.9-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.11-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.3.1-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.30:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.32:dev") } // deps may transitively add Baubles, so we replace it From 84a716d4ff8181f2316ae81bb68cddd9a0119dbe Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 13 Oct 2025 02:45:01 +0800 Subject: [PATCH 36/88] Changes: - Replaced method used to get widget width as it no longer exists - Set recipe height and width in handler info --- .../vendingmachine/integration/nei/NEIConfig.java | 4 +++- .../vendingmachine/integration/nei/NeiRecipeHandler.java | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java index 9a16209..730f565 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java @@ -32,7 +32,9 @@ public String getVersion() { @SubscribeEvent public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) { event.registerHandlerInfo( - new HandlerInfo.Builder("vendingmachine", VendingMachine.NAME, VendingMachine.MODID).setMaxRecipesPerPage(3) + new HandlerInfo.Builder("vendingmachine", VendingMachine.NAME, VendingMachine.MODID).setHeight(104) + .setWidth(166) + .setMaxRecipesPerPage(3) .setDisplayStack(VMItems.vendingMachine) .build()); } diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index 3e5f78a..75ef983 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -197,8 +197,8 @@ public boolean isMouseOverBqCondition(int recipeIndex, int curY, UUID questId, S Point pos = GuiDraw.getMousePosition(); - int guiLeft = (gui.width - gui.getWidgetSize().width) / 2; - int guiTop = 19 + (gui.height - gui.getWidgetSize().height) / 2; + int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; + int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().w) / 2; Point relMousePos = new Point(pos.x - guiLeft - offset.x, pos.y - guiTop - offset.y); Rectangle textArea = new Rectangle(2, curY - GuiDraw.fontRenderer.FONT_HEIGHT, width + 2, height + 1); if (textArea.contains(relMousePos)) { @@ -214,8 +214,8 @@ public boolean isMouseOnLastHovered(GuiRecipe gui, int recipeIndex) { if (lastHoveredTextArea == null || lastHoveredQuestId == null || lastHoveredRecipeIndex != recipeIndex) { return false; } - int guiLeft = (gui.width - gui.getWidgetSize().width) / 2; - int guiTop = 19 + (gui.height - gui.getWidgetSize().height) / 2; + int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; + int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().h) / 2; Point offset = gui.getRecipePosition(recipeIndex); Point pos = GuiDraw.getMousePosition(); From 8d8c2b2245197cf190c78911fbd200f4631f0779 Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 13 Oct 2025 14:03:15 +0800 Subject: [PATCH 37/88] Fixed coins not updating in multiplayer. --- .../vendingmachine/handlers/EventHandler.java | 4 ---- .../network/handlers/NetCurrencySync.java | 5 ++--- .../cubefury/vendingmachine/trade/TradeDatabase.java | 6 ++++-- .../cubefury/vendingmachine/trade/TradeManager.java | 11 +++++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java b/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java index 06febcf..993c95e 100644 --- a/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java @@ -78,8 +78,6 @@ public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) { } NetBulkSync.sendReset(mpPlayer, true, true); - - UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(mpPlayer); } @SubscribeEvent @@ -146,7 +144,6 @@ public void onServerTick(TickEvent.ServerTickEvent event) { } private void terminateVendingSession(@Nonnull EntityPlayer player) { - VendingMachine.LOG.info("terminating session for {}", player); if (VendingMachine.proxy.isClient()) { return; } @@ -162,7 +159,6 @@ private void terminateVendingSession(@Nonnull EntityPlayer player) { te instanceof IGregTechTileEntity && ((IGregTechTileEntity) te).getMetaTileEntity() instanceof MTEVendingMachine ) { - VendingMachine.LOG.info("found VM MTE terminating session for {}", player); ((MTEVendingMachine) ((IGregTechTileEntity) te).getMetaTileEntity()).resetCurrentUser(player); SaveLoadHandler.INSTANCE .writeTradeState(Collections.singleton(NameCache.INSTANCE.getUUIDFromPlayer(player))); diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java index 84d8f61..2731569 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java @@ -32,15 +32,14 @@ public static void registerHandler() { } } - // server side code for sending tradegroup data when player opens gui + // server side code for sending currency data when player opens gui public static void syncCurrencyToClient(@Nonnull EntityPlayerMP player) { UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(player); NBTTagCompound payload = new NBTTagCompound(); payload.setString("dataType", "currencySync"); NBTConverter.UuidValueType.PLAYER.writeId(playerId, payload); - payload.setTag("data", TradeManager.INSTANCE.writeCurrencyToNBT(playerId)); - + payload.setTag("data", TradeManager.INSTANCE.writeCurrencyToNBT(new NBTTagCompound(), playerId)); PacketSender.INSTANCE.sendToPlayers(new UnserializedPacket(ID_NAME, payload), player); } diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java index 6c14035..5bf941c 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java @@ -9,6 +9,8 @@ import java.util.Set; import java.util.UUID; +import javax.annotation.Nonnull; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; @@ -135,7 +137,7 @@ public void populateTradeStateFromNBT(NBTTagCompound nbt, UUID player, boolean m TradeManager.INSTANCE.populateCurrencyFromNBT(nbt, player, merge); } - public NBTTagCompound writeTradeStateToNBT(NBTTagCompound nbt, UUID player) { + public NBTTagCompound writeTradeStateToNBT(NBTTagCompound nbt, @Nonnull UUID player) { NBTTagList tradeStateList = new NBTTagList(); for (Map.Entry entry : tradeGroups.entrySet()) { TradeHistory history = entry.getValue() @@ -149,7 +151,7 @@ public NBTTagCompound writeTradeStateToNBT(NBTTagCompound nbt, UUID player) { } } nbt.setTag("tradeState", tradeStateList); - nbt.setTag("playerCurrency", TradeManager.INSTANCE.writeCurrencyToNBT(player)); + TradeManager.INSTANCE.writeCurrencyToNBT(nbt, player); return nbt; } diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java index d527cd6..93c90c8 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java @@ -8,6 +8,8 @@ import java.util.Set; import java.util.UUID; +import javax.annotation.Nonnull; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; @@ -130,24 +132,25 @@ public void populateCurrencyFromNBT(NBTTagCompound nbt, UUID player, boolean mer this.hasCurrencyUpdate = true; } - public NBTTagList writeCurrencyToNBT(UUID player) { - NBTTagList nbt = new NBTTagList(); + public NBTTagCompound writeCurrencyToNBT(NBTTagCompound nbt, @Nonnull UUID player) { if (this.playerCurrency.get(player) == null) { return nbt; } + NBTTagList nbtCurrencyList = new NBTTagList(); for (Map.Entry entry : this.playerCurrency.get(player) .entrySet()) { NBTTagCompound currencyEntry = new NBTTagCompound(); currencyEntry.setString("currency", entry.getKey().id); currencyEntry.setInteger("amount", entry.getValue()); - nbt.appendTag(currencyEntry); + nbtCurrencyList.appendTag(currencyEntry); } if (this.invalidCurrency.get(player) != null) { for (NBTTagCompound tag : this.invalidCurrency.get(player)) { - nbt.appendTag(tag); + nbtCurrencyList.appendTag(tag); } } + nbt.setTag("playerCurrency", nbtCurrencyList); return nbt; } From 1606b03eee1606af0ae58fea235b993278ce01c2 Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 13 Oct 2025 14:08:44 +0800 Subject: [PATCH 38/88] Revert event handler changes - out of scope for PR --- .../com/cubefury/vendingmachine/handlers/EventHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java b/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java index 993c95e..06febcf 100644 --- a/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java @@ -78,6 +78,8 @@ public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) { } NetBulkSync.sendReset(mpPlayer, true, true); + + UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(mpPlayer); } @SubscribeEvent @@ -144,6 +146,7 @@ public void onServerTick(TickEvent.ServerTickEvent event) { } private void terminateVendingSession(@Nonnull EntityPlayer player) { + VendingMachine.LOG.info("terminating session for {}", player); if (VendingMachine.proxy.isClient()) { return; } @@ -159,6 +162,7 @@ private void terminateVendingSession(@Nonnull EntityPlayer player) { te instanceof IGregTechTileEntity && ((IGregTechTileEntity) te).getMetaTileEntity() instanceof MTEVendingMachine ) { + VendingMachine.LOG.info("found VM MTE terminating session for {}", player); ((MTEVendingMachine) ((IGregTechTileEntity) te).getMetaTileEntity()).resetCurrentUser(player); SaveLoadHandler.INSTANCE .writeTradeState(Collections.singleton(NameCache.INSTANCE.getUUIDFromPlayer(player))); From 29c4350741ec866c163d2059181cd9038626fa84 Mon Sep 17 00:00:00 2001 From: Dream Master Date: Mon, 13 Oct 2025 13:22:05 +0200 Subject: [PATCH 39/88] update --- dependencies.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index fd08254..38202ca 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.11-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.14-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.3.1-1.7.10:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.2-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.32:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.34:dev") } // deps may transitively add Baubles, so we replace it From 6b6a6da74149ffcbce1f22b3ede2b703ab606c8a Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 13 Oct 2025 19:54:10 +0800 Subject: [PATCH 40/88] Changes: - Fixed a bug where tradestate is not written for a player if the server closes while they're still in the GUI. - Fixed Netcode using Betterquesting's packet assembly instead of its own --- .../java/com/cubefury/vendingmachine/VendingMachine.java | 8 ++++++++ .../cubefury/vendingmachine/api/storage/INameCache.java | 2 ++ .../cubefury/vendingmachine/handlers/EventHandler.java | 6 +----- .../cubefury/vendingmachine/network/PacketAssembly.java | 2 +- .../vendingmachine/network/handlers/NetBulkSync.java | 6 +++++- .../com/cubefury/vendingmachine/storage/NameCache.java | 8 ++++++++ 6 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/VendingMachine.java b/src/main/java/com/cubefury/vendingmachine/VendingMachine.java index 4e9ca12..89346c5 100644 --- a/src/main/java/com/cubefury/vendingmachine/VendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/VendingMachine.java @@ -4,9 +4,11 @@ import org.apache.logging.log4j.Logger; import com.cubefury.vendingmachine.gui.WidgetThemes; +import com.cubefury.vendingmachine.handlers.SaveLoadHandler; import com.cubefury.vendingmachine.items.VMItems; import com.cubefury.vendingmachine.network.PacketTypeRegistry; import com.cubefury.vendingmachine.network.SerializedPacket; +import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.util.ItemPlaceholder; import cpw.mods.fml.common.Loader; @@ -19,6 +21,7 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.event.FMLServerStoppedEvent; +import cpw.mods.fml.common.event.FMLServerStoppingEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.common.registry.GameRegistry; @@ -105,6 +108,11 @@ public void serverStarting(FMLServerStartingEvent event) { proxy.serverStarting(event); } + @Mod.EventHandler + public void serverStopping(FMLServerStoppingEvent event) { + SaveLoadHandler.INSTANCE.writeTradeState(NameCache.INSTANCE.getAllUUIDS()); + } + @Mod.EventHandler public void serverStop(FMLServerStoppedEvent event) {} diff --git a/src/main/java/com/cubefury/vendingmachine/api/storage/INameCache.java b/src/main/java/com/cubefury/vendingmachine/api/storage/INameCache.java index 5aa211c..86be29e 100644 --- a/src/main/java/com/cubefury/vendingmachine/api/storage/INameCache.java +++ b/src/main/java/com/cubefury/vendingmachine/api/storage/INameCache.java @@ -20,6 +20,8 @@ public interface INameCache { List getAllNames(); + List getAllUUIDS(); + /** * Used primarily to know if a user is an OP client side
*/ diff --git a/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java b/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java index 06febcf..0420450 100644 --- a/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/handlers/EventHandler.java @@ -2,7 +2,6 @@ import java.util.ArrayDeque; import java.util.Collections; -import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; @@ -78,8 +77,6 @@ public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) { } NetBulkSync.sendReset(mpPlayer, true, true); - - UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(mpPlayer); } @SubscribeEvent @@ -146,7 +143,6 @@ public void onServerTick(TickEvent.ServerTickEvent event) { } private void terminateVendingSession(@Nonnull EntityPlayer player) { - VendingMachine.LOG.info("terminating session for {}", player); if (VendingMachine.proxy.isClient()) { return; } @@ -162,7 +158,7 @@ private void terminateVendingSession(@Nonnull EntityPlayer player) { te instanceof IGregTechTileEntity && ((IGregTechTileEntity) te).getMetaTileEntity() instanceof MTEVendingMachine ) { - VendingMachine.LOG.info("found VM MTE terminating session for {}", player); + VendingMachine.LOG.info("Force terminating VM session for {}", player); ((MTEVendingMachine) ((IGregTechTileEntity) te).getMetaTileEntity()).resetCurrentUser(player); SaveLoadHandler.INSTANCE .writeTradeState(Collections.singleton(NameCache.INSTANCE.getUUIDFromPlayer(player))); diff --git a/src/main/java/com/cubefury/vendingmachine/network/PacketAssembly.java b/src/main/java/com/cubefury/vendingmachine/network/PacketAssembly.java index b9231fc..772e3be 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/PacketAssembly.java +++ b/src/main/java/com/cubefury/vendingmachine/network/PacketAssembly.java @@ -20,7 +20,7 @@ public final class PacketAssembly { - public static final betterquesting.network.PacketAssembly INSTANCE = new betterquesting.network.PacketAssembly(); + public static final PacketAssembly INSTANCE = new PacketAssembly(); // TODO: Allow for simultaneous packet assembly (may not be necessary) // TODO: Implement PROPER thread safety that doesn't cause dirty read/writes diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetBulkSync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetBulkSync.java index 2a80342..be1aa33 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetBulkSync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetBulkSync.java @@ -9,10 +9,12 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.MinecraftForge; import com.cubefury.vendingmachine.VendingMachine; import com.cubefury.vendingmachine.api.network.UnserializedPacket; import com.cubefury.vendingmachine.api.util.Tuple2; +import com.cubefury.vendingmachine.events.MarkDirtyNamesEvent; import com.cubefury.vendingmachine.handlers.SaveLoadHandler; import com.cubefury.vendingmachine.network.PacketSender; import com.cubefury.vendingmachine.network.PacketTypeRegistry; @@ -23,7 +25,7 @@ public class NetBulkSync { - private static final ResourceLocation ID_NAME = new ResourceLocation("vending_machine:main_sync"); + private static final ResourceLocation ID_NAME = new ResourceLocation("vendingmachine:bulk_sync"); public static void registerHandler() { PacketTypeRegistry.INSTANCE.registerServerHandler(ID_NAME, NetBulkSync::onServer); @@ -48,6 +50,8 @@ public static void sendReset(@Nullable EntityPlayerMP player, boolean reset, boo public static void sendSync(@Nonnull EntityPlayerMP player) { NameCache.INSTANCE.updateName(player); + MinecraftForge.EVENT_BUS.post(new MarkDirtyNamesEvent()); + UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(player); NetNameSync.sendNames(new EntityPlayerMP[] { player }, new UUID[] { playerId }, null); diff --git a/src/main/java/com/cubefury/vendingmachine/storage/NameCache.java b/src/main/java/com/cubefury/vendingmachine/storage/NameCache.java index 10b812f..36ec99e 100644 --- a/src/main/java/com/cubefury/vendingmachine/storage/NameCache.java +++ b/src/main/java/com/cubefury/vendingmachine/storage/NameCache.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -145,6 +146,13 @@ public synchronized List getAllNames() { return Collections.unmodifiableList(nameCache); } + @Override + public List getAllUUIDS() { + return cache.keySet() + .stream() + .collect(Collectors.toList()); + } + @Override public UUID getUUIDFromPlayer(EntityPlayer player) { if (player == null) { From 2407461a807a9bb627263c67f9cf2590cd506e68 Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 13 Oct 2025 21:06:43 +0800 Subject: [PATCH 41/88] Fix NPE from trade item display load --- .../vendingmachine/network/handlers/NetTradeDisplaySync.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java index fe339ba..964bf83 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java @@ -6,7 +6,6 @@ import javax.annotation.Nonnull; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; @@ -80,12 +79,11 @@ public TradeItemDisplay formatItemDisplay() { TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroupFromId(this.tgID); Trade t = tg.getTrades() .get(this.tradeGroupOrder); - ItemStack displayItem = t.getDisplayItem(); return new TradeItemDisplay( t.fromCurrency, t.fromItems, t.toItems, - t.displayItem == null ? t.displayItem.convertToItemStack() : displayItem, + t.getDisplayItem(), this.tgID, this.tradeGroupOrder, this.cooldown, @@ -148,7 +146,6 @@ public static void syncTradesToClient(@Nonnull EntityPlayerMP player, MTEVending @SideOnly(Side.CLIENT) public static void onClient(NBTTagCompound message) { - // TODO: Load trade view on client List tradeData = TradeManager.INSTANCE.tradeData; tradeData.clear(); From af399f898702c8a09172e80334d35f3210a1f0bb Mon Sep 17 00:00:00 2001 From: cubefury Date: Tue, 14 Oct 2025 01:00:07 +0800 Subject: [PATCH 42/88] Fix coins going missing on server start in multiplayer. --- .../cubefury/vendingmachine/trade/TradeManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java index 93c90c8..3ae8fe6 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java @@ -105,8 +105,14 @@ public List getAvailableTradeGroups(UUID player) { public void populateCurrencyFromNBT(NBTTagCompound nbt, UUID player, boolean merge) { NBTTagList tagList = nbt.getTagList("playerCurrency", Constants.NBT.TAG_COMPOUND); if (!merge) { - this.playerCurrency.clear(); - this.invalidCurrency.clear(); + if (player == null) { + this.playerCurrency.clear(); + this.invalidCurrency.clear(); + } else { + this.playerCurrency.remove(player); + this.invalidCurrency.remove(player); + } + } this.playerCurrency.computeIfAbsent(player, k -> new HashMap<>()); for (int i = 0; i < tagList.tagCount(); i++) { From 2d322b10ea401e21e6d0f40b29bf3034689121a4 Mon Sep 17 00:00:00 2001 From: cubefury Date: Tue, 14 Oct 2025 01:15:21 +0800 Subject: [PATCH 43/88] Fixed backing up of tradestate file during write. --- .../vendingmachine/handlers/SaveLoadHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java b/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java index 8bb920e..a5e70e0 100644 --- a/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java @@ -30,6 +30,7 @@ public class SaveLoadHandler { private File fileDatabase = null; private File fileNames = null; private File dirTradeState = null; + private File dirBackupTradeState = null; private SaveLoadHandler() {} @@ -42,6 +43,7 @@ public void init(MinecraftServer server) { fileDatabase = new File(Config.config_dir, "tradeDatabase.json"); dirTradeState = new File(Config.worldDir, "tradeState"); + dirBackupTradeState = new File(Config.worldDir, "backup/tradeState"); fileNames = new File(Config.worldDir, "names.json"); createFilesAndDirectories(); @@ -79,7 +81,6 @@ public Future writeDatabase() { public void loadTradeState() { if (dirTradeState.exists()) { - CopyPaste(dirTradeState, new File(Config.worldDir + "/backup", "tradeState")); File[] fileList = dirTradeState.listFiles(); if (fileList != null) { @@ -96,11 +97,15 @@ public void loadTradeState() { } public List> writeTradeState(Collection players) { + if (!dirBackupTradeState.exists()) { + CopyPaste(dirTradeState, dirBackupTradeState); + } + TradeDatabase db = TradeDatabase.INSTANCE; List> futures = new ArrayList<>(); for (UUID player : players) { File playerFile = new File(dirTradeState, player.toString() + ".json"); - CopyPaste(playerFile, new File(Config.worldDir + "/backup", player.toString() + ".json")); + CopyPaste(playerFile, new File(dirBackupTradeState, player.toString() + ".json")); NBTTagCompound state = db.writeTradeStateToNBT(new NBTTagCompound(), player); futures.add(FileIO.WriteToFile(playerFile, out -> NBTConverter.NBTtoJSON_Compound(state, out, true))); } From f560ff8a90a3c3f4f13be4120c517c138938e639 Mon Sep 17 00:00:00 2001 From: cubefury Date: Tue, 14 Oct 2025 19:14:43 +0800 Subject: [PATCH 44/88] Fixed bug where coins from MP session would persist into SP worlds. Cleaned up load/unload. --- .../handlers/SaveLoadHandler.java | 2 ++ .../vendingmachine/trade/TradeDatabase.java | 1 + .../vendingmachine/trade/TradeManager.java | 19 +++++++++++-------- .../vendingmachine/util/JsonHelper.java | 4 ---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java b/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java index a5e70e0..5ae0e59 100644 --- a/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java @@ -48,6 +48,8 @@ public void init(MinecraftServer server) { createFilesAndDirectories(); + unloadAll(); + loadDatabase(); loadTradeState(); loadNames(); diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java index 5bf941c..4a4ca50 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeDatabase.java @@ -41,6 +41,7 @@ public void clear() { public void clearTradeState(UUID player) { tradeGroups.forEach((k, v) -> v.clearTradeState(player)); + TradeManager.INSTANCE.clearCurrency(player); } public TradeGroup getTradeGroupFromId(UUID tgId) { diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java index 3ae8fe6..bfc5a31 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java @@ -105,14 +105,7 @@ public List getAvailableTradeGroups(UUID player) { public void populateCurrencyFromNBT(NBTTagCompound nbt, UUID player, boolean merge) { NBTTagList tagList = nbt.getTagList("playerCurrency", Constants.NBT.TAG_COMPOUND); if (!merge) { - if (player == null) { - this.playerCurrency.clear(); - this.invalidCurrency.clear(); - } else { - this.playerCurrency.remove(player); - this.invalidCurrency.remove(player); - } - + this.clearCurrency(player); } this.playerCurrency.computeIfAbsent(player, k -> new HashMap<>()); for (int i = 0; i < tagList.tagCount(); i++) { @@ -185,4 +178,14 @@ public void addCurrency(UUID playerId, CurrencyItem mapped) { } this.hasCurrencyUpdate = true; } + + public void clearCurrency(UUID player) { + if (player == null) { + this.playerCurrency.clear(); + this.invalidCurrency.clear(); + } else { + this.playerCurrency.remove(player); + this.invalidCurrency.remove(player); + } + } } diff --git a/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java b/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java index de316a9..f3390d0 100644 --- a/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java +++ b/src/main/java/com/cubefury/vendingmachine/util/JsonHelper.java @@ -50,7 +50,6 @@ public static NBTTagCompound ItemStackToJson(BigItemStack stack, NBTTagCompound public static void populateTradeDatabaseFromFile(File file) { TradeDatabase db = TradeDatabase.INSTANCE; - db.clear(); Function readNbt = f -> NBTConverter .JSONtoNBT_Object(FileIO.ReadFromFile(f), new NBTTagCompound(), true); @@ -59,8 +58,6 @@ public static void populateTradeDatabaseFromFile(File file) { } public static void populateTradeStateFromFiles(List files) { - TradeDatabase db = TradeDatabase.INSTANCE; - db.clearTradeState(null); files.forEach(JsonHelper::populateTradeStateFromFile); } @@ -71,7 +68,6 @@ public static void populateTradeStateFromFile(File file) { } public static void populateNameCacheFromFile(File file) { - NameCache.INSTANCE.clear(); JsonObject json = FileIO.ReadFromFile(file); NBTTagCompound nbt = NBTConverter.JSONtoNBT_Object(json, new NBTTagCompound(), true); From 34896d7c1526869811fd0b82e771ecacd6e03c32 Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Tue, 14 Oct 2025 19:09:12 +0200 Subject: [PATCH 45/88] update --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 38202ca..1c677c1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.14-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.15-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.3.2-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.34:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.42:dev") } // deps may transitively add Baubles, so we replace it From 53e020acb7ddba6893e73694efeb1048fe011942 Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 15 Oct 2025 02:02:49 +0800 Subject: [PATCH 46/88] Pull CurrencyType out of CurrencyItem class --- .../blocks/MTEVendingMachine.java | 9 ++-- .../vendingmachine/blocks/gui/CoinButton.java | 6 +-- .../blocks/gui/MTEVendingMachineGui.java | 19 +++---- .../network/handlers/NetCurrencySync.java | 5 +- .../vendingmachine/trade/CurrencyItem.java | 54 +------------------ .../vendingmachine/trade/CurrencyType.java | 53 ++++++++++++++++++ .../vendingmachine/trade/TradeManager.java | 9 ++-- 7 files changed, 79 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/cubefury/vendingmachine/trade/CurrencyType.java diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 41cdc09..afc81be 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -42,6 +42,7 @@ import com.cubefury.vendingmachine.network.handlers.NetTradeRequestSync; import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.trade.CurrencyItem; +import com.cubefury.vendingmachine.trade.CurrencyType; import com.cubefury.vendingmachine.trade.Trade; import com.cubefury.vendingmachine.trade.TradeDatabase; import com.cubefury.vendingmachine.trade.TradeManager; @@ -265,9 +266,9 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { UUID currentPlayer = NameCache.INSTANCE.getUUIDFromPlayer(this.getCurrentUser()); TradeManager.INSTANCE.playerCurrency.putIfAbsent(currentPlayer, new HashMap<>()); - Map coinInventory = TradeManager.INSTANCE.playerCurrency.get(currentPlayer); + Map coinInventory = TradeManager.INSTANCE.playerCurrency.get(currentPlayer); - Map newCoinInventory = new HashMap<>(); + Map newCoinInventory = new HashMap<>(); for (CurrencyItem ci : trade.fromCurrency) { int oldValue = coinInventory.get(ci.type); if (!coinInventory.containsKey(ci.type) || oldValue < ci.value) { @@ -308,7 +309,7 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { } } - for (Map.Entry entry : newCoinInventory.entrySet()) { + for (Map.Entry entry : newCoinInventory.entrySet()) { if (entry.getValue() == 0) { coinInventory.remove(entry.getKey()); } else { @@ -605,7 +606,7 @@ public boolean inputCurrencySatisfied(List currencyItems, UUID pla if (currencyItems == null || currencyItems.isEmpty()) { return true; } - Map availableCurrency = TradeManager.INSTANCE.playerCurrency.get(player); + Map availableCurrency = TradeManager.INSTANCE.playerCurrency.get(player); if (availableCurrency == null) { return false; } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/CoinButton.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/CoinButton.java index 88f4b14..b8d52f1 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/CoinButton.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/CoinButton.java @@ -5,14 +5,14 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cubefury.vendingmachine.trade.CurrencyItem; +import com.cubefury.vendingmachine.trade.CurrencyType; public class CoinButton extends ToggleButton { private final TradeMainPanel panel; - private final CurrencyItem.CurrencyType type; + private final CurrencyType type; - public CoinButton(TradeMainPanel panel, CurrencyItem.CurrencyType type) { + public CoinButton(TradeMainPanel panel, CurrencyType type) { super(); background(IDrawable.EMPTY); selectedBackground(IDrawable.EMPTY); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 4421be0..175c5f1 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -49,6 +49,7 @@ import com.cubefury.vendingmachine.network.handlers.NetTradeDisplaySync; import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.trade.CurrencyItem; +import com.cubefury.vendingmachine.trade.CurrencyType; import com.cubefury.vendingmachine.trade.TradeCategory; import com.cubefury.vendingmachine.trade.TradeDatabase; import com.cubefury.vendingmachine.trade.TradeManager; @@ -67,7 +68,7 @@ public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { private boolean ejectItems = false; private boolean ejectCoins = false; - private final Map ejectSingleCoin = new HashMap<>(); + private final Map ejectSingleCoin = new HashMap<>(); private final Map> displayedTradesTiles = new HashMap<>(); private final Map> displayedTradesList = new HashMap<>(); private final List tradeCategories = new ArrayList<>(); @@ -122,7 +123,7 @@ public MTEVendingMachineGui(MTEVendingMachine base) { super(base); this.base = base; - for (CurrencyItem.CurrencyType type : CurrencyItem.CurrencyType.values()) { + for (CurrencyType type : CurrencyType.values()) { ejectSingleCoin.put(type, false); } @@ -285,7 +286,7 @@ private SearchBar createSearchBar() { } // Eject code is in GUI instead of MTE since the syncers are per-gui instance - private void doEjectCoin(CurrencyItem.CurrencyType type) { + private void doEjectCoin(CurrencyType type) { if (this.guiData.isClient()) { return; } @@ -320,9 +321,9 @@ private void doEjectCoins() { return; } - Map coins = TradeManager.INSTANCE.playerCurrency + Map coins = TradeManager.INSTANCE.playerCurrency .getOrDefault(currentUser, new HashMap<>()); - for (Map.Entry entry : coins.entrySet()) { + for (Map.Entry entry : coins.entrySet()) { for (ItemStack ejectable : new CurrencyItem(entry.getKey(), entry.getValue()).itemize()) { base.spawnItem(ejectable); } @@ -573,9 +574,9 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel) { int coinCount = 0; UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(getBase().getCurrentUser()); - Map currentAmounts = TradeManager.INSTANCE.playerCurrency + Map currentAmounts = TradeManager.INSTANCE.playerCurrency .getOrDefault(playerId, Collections.EMPTY_MAP); - for (CurrencyItem.CurrencyType type : CurrencyItem.CurrencyType.values()) { + for (CurrencyType type : CurrencyType.values()) { coinColumn.child( new Row().child( new CoinButton(panel, type).overlay( @@ -594,7 +595,7 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel) { builder.setAutoUpdate(true); })) .child(IKey.dynamic(() -> { - Map currencyMap = TradeManager.INSTANCE.playerCurrency + Map currencyMap = TradeManager.INSTANCE.playerCurrency .getOrDefault(playerId, Collections.EMPTY_MAP); return getReadableStringFromCoinAmount( currencyMap.get(type) == null ? 0 : currencyMap.get(type)); @@ -649,7 +650,7 @@ protected void registerSyncValues(PanelSyncManager syncManager) { syncManager.syncValue("ejectItems", ejectItemsSyncer); syncManager.syncValue("ejectCoins", ejectCoinsSyncer); - for (CurrencyItem.CurrencyType type : CurrencyItem.CurrencyType.values()) { + for (CurrencyType type : CurrencyType.values()) { BooleanSyncValue ejectCoinSyncer = new BooleanSyncValue(() -> this.ejectSingleCoin.get(type), val -> { this.ejectSingleCoin.put(type, val); if (val) { diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java index 2731569..30a7ae0 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java @@ -16,6 +16,7 @@ import com.cubefury.vendingmachine.network.PacketTypeRegistry; import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.trade.CurrencyItem; +import com.cubefury.vendingmachine.trade.CurrencyType; import com.cubefury.vendingmachine.trade.TradeManager; import com.cubefury.vendingmachine.util.NBTConverter; @@ -51,7 +52,7 @@ public static void sendPlayerCurrency(@Nonnull EntityPlayerMP player, CurrencyIt PacketSender.INSTANCE.sendToPlayers(new UnserializedPacket(ID_NAME, payload), player); } - public static void resetPlayerCurrency(@Nonnull EntityPlayerMP player, @Nullable CurrencyItem.CurrencyType type) { + public static void resetPlayerCurrency(@Nonnull EntityPlayerMP player, @Nullable CurrencyType type) { NBTTagCompound payload = new NBTTagCompound(); payload.setString("dataType", "currencyReset"); if (type != null) { @@ -87,7 +88,7 @@ public static void onClient(NBTTagCompound message) { } case "currencyReset" -> TradeManager.INSTANCE.resetCurrency( player, - message.hasKey("type") ? CurrencyItem.CurrencyType.getTypeFromId(message.getString("type")) : null); + message.hasKey("type") ? CurrencyType.getTypeFromId(message.getString("type")) : null); default -> VendingMachine.LOG.warn("Unknown trade state sync data received: {}", dataType); } } diff --git a/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java b/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java index a0535af..646c790 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java @@ -9,18 +9,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import com.cleanroommc.modularui.drawable.UITexture; -import com.cubefury.vendingmachine.VendingMachine; -import com.cubefury.vendingmachine.util.Translator; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class CurrencyItem { public CurrencyType type; public int value; - private static final Map typeMap = new HashMap<>(); + public static final Map typeMap = new HashMap<>(); private static final String[] coinSuffixes = new String[] { "IV", "III", "II", "I", "" }; private static final int[] coinValues = new int[] { 10000, 1000, 100, 10, 1 }; @@ -59,51 +52,6 @@ public ItemStack getItemRepresentation() { return new ItemStack(outputItem, value); } - public enum CurrencyType { - - ADVENTURE("adventure", "dreamcraft:item.CoinAdventure", "gui/icons/itemCoinAdventure.png"), - BEES("bees", "dreamcraft:item.CoinBees", "gui/icons/itemCoinBees.png"), - BLOOD("blood", "dreamcraft:item.CoinBlood", "gui/icons/itemCoinBlood.png"), - CHEMIST("chemist", "dreamcraft:item.CoinChemist", "gui/icons/itemCoinChemist.png"), - COOK("cook", "dreamcraft:item.CoinCook", "gui/icons/itemCoinCook.png"), - DARK_WIZARD("darkWizard", "dreamcraft:item.CoinDarkWizard", "gui/icons/itemCoinDarkWizard.png"), - FARMER("farmer", "dreamcraft:item.CoinFarmer", "gui/icons/itemCoinFarmer.png"), - FLOWER("flower", "dreamcraft:item.CoinFlower", "gui/icons/itemCoinFlower.png"), - FORESTRY("forestry", "dreamcraft:item.CoinForestry", "gui/icons/itemCoinForestry.png"), - SMITH("smith", "dreamcraft:item.CoinSmith", "gui/icons/itemCoinSmith.png"), - SPACE("space", "dreamcraft:item.CoinSpace", "gui/icons/itemCoinSpace.png"), - SURVIVOR("survivor", "dreamcraft:item.CoinSurvivor", "gui/icons/itemCoinSurvivor.png"), - TECHNICIAN("technician", "dreamcraft:item.CoinTechnician", "gui/icons/itemCoinTechnician.png"), - WITCH("witch", "dreamcraft:item.CoinWitch", "gui/icons/itemCoinWitch.png"), - // comment before semicolon to reduce merge conflicts - ; - - public final String id; - public final String itemPrefix; - public final UITexture texture; - - CurrencyType(String id, String itemPrefix, String texture) { - this.id = id; - this.itemPrefix = itemPrefix; - this.texture = UITexture.builder() - .location(VendingMachine.MODID, texture) - .imageSize(32, 32) - .name("VM_UI_Coin_" + id) - .build(); - - typeMap.put(this.id, this); - } - - public static CurrencyType getTypeFromId(String type) { - return typeMap.get(type); - } - - @SideOnly(Side.CLIENT) - public String getLocalizedName() { - return Translator.translate("vendingmachine.coin." + this.id); - } - } - public CurrencyItem(CurrencyType type, int value) { this.type = type; this.value = value; diff --git a/src/main/java/com/cubefury/vendingmachine/trade/CurrencyType.java b/src/main/java/com/cubefury/vendingmachine/trade/CurrencyType.java new file mode 100644 index 0000000..8851367 --- /dev/null +++ b/src/main/java/com/cubefury/vendingmachine/trade/CurrencyType.java @@ -0,0 +1,53 @@ +package com.cubefury.vendingmachine.trade; + +import com.cleanroommc.modularui.drawable.UITexture; +import com.cubefury.vendingmachine.VendingMachine; +import com.cubefury.vendingmachine.util.Translator; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public enum CurrencyType { + + ADVENTURE("adventure", "dreamcraft:item.CoinAdventure", "gui/icons/itemCoinAdventure.png"), + BEES("bees", "dreamcraft:item.CoinBees", "gui/icons/itemCoinBees.png"), + BLOOD("blood", "dreamcraft:item.CoinBlood", "gui/icons/itemCoinBlood.png"), + CHEMIST("chemist", "dreamcraft:item.CoinChemist", "gui/icons/itemCoinChemist.png"), + COOK("cook", "dreamcraft:item.CoinCook", "gui/icons/itemCoinCook.png"), + DARK_WIZARD("darkWizard", "dreamcraft:item.CoinDarkWizard", "gui/icons/itemCoinDarkWizard.png"), + FARMER("farmer", "dreamcraft:item.CoinFarmer", "gui/icons/itemCoinFarmer.png"), + FLOWER("flower", "dreamcraft:item.CoinFlower", "gui/icons/itemCoinFlower.png"), + FORESTRY("forestry", "dreamcraft:item.CoinForestry", "gui/icons/itemCoinForestry.png"), + SMITH("smith", "dreamcraft:item.CoinSmith", "gui/icons/itemCoinSmith.png"), + SPACE("space", "dreamcraft:item.CoinSpace", "gui/icons/itemCoinSpace.png"), + SURVIVOR("survivor", "dreamcraft:item.CoinSurvivor", "gui/icons/itemCoinSurvivor.png"), + TECHNICIAN("technician", "dreamcraft:item.CoinTechnician", "gui/icons/itemCoinTechnician.png"), + WITCH("witch", "dreamcraft:item.CoinWitch", "gui/icons/itemCoinWitch.png"), + // comment before semicolon to reduce merge conflicts + ; + + public final String id; + public final String itemPrefix; + public final UITexture texture; + + CurrencyType(String id, String itemPrefix, String texture) { + this.id = id; + this.itemPrefix = itemPrefix; + this.texture = UITexture.builder() + .location(VendingMachine.MODID, texture) + .imageSize(32, 32) + .name("VM_UI_Coin_" + id) + .build(); + + CurrencyItem.typeMap.put(this.id, this); + } + + public static CurrencyType getTypeFromId(String type) { + return CurrencyItem.typeMap.get(type); + } + + @SideOnly(Side.CLIENT) + public String getLocalizedName() { + return Translator.translate("vendingmachine.coin." + this.id); + } +} diff --git a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java index bfc5a31..058f734 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/TradeManager.java @@ -26,7 +26,7 @@ public class TradeManager { private final Map> availableTrades = new HashMap<>(); private final List noConditionTrades = new ArrayList<>(); - public final Map> playerCurrency = new HashMap<>(); + public final Map> playerCurrency = new HashMap<>(); // For writeback to file in original format, to prevent data loss private final Map> invalidCurrency = new HashMap<>(); @@ -110,8 +110,7 @@ public void populateCurrencyFromNBT(NBTTagCompound nbt, UUID player, boolean mer this.playerCurrency.computeIfAbsent(player, k -> new HashMap<>()); for (int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound currencyEntry = tagList.getCompoundTagAt(i); - CurrencyItem.CurrencyType type = CurrencyItem.CurrencyType - .getTypeFromId(currencyEntry.getString("currency")); + CurrencyType type = CurrencyType.getTypeFromId(currencyEntry.getString("currency")); if (type == null) { VendingMachine.LOG.warn("Unknown currency type found: {}", currencyEntry.getString("currency")); this.invalidCurrency.computeIfAbsent(player, k -> new ArrayList<>()); @@ -136,7 +135,7 @@ public NBTTagCompound writeCurrencyToNBT(NBTTagCompound nbt, @Nonnull UUID playe return nbt; } NBTTagList nbtCurrencyList = new NBTTagList(); - for (Map.Entry entry : this.playerCurrency.get(player) + for (Map.Entry entry : this.playerCurrency.get(player) .entrySet()) { NBTTagCompound currencyEntry = new NBTTagCompound(); currencyEntry.setString("currency", entry.getKey().id); @@ -153,7 +152,7 @@ public NBTTagCompound writeCurrencyToNBT(NBTTagCompound nbt, @Nonnull UUID playe return nbt; } - public void resetCurrency(UUID playerId, CurrencyItem.CurrencyType type) { + public void resetCurrency(UUID playerId, CurrencyType type) { this.playerCurrency.computeIfAbsent(playerId, k -> new HashMap<>()); if (type == null) { this.playerCurrency.get(playerId) From 00339a2f83a7d431ce90f0d9d686924211fffe7f Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 15 Oct 2025 21:40:04 +0800 Subject: [PATCH 47/88] Swapped coin amount display to synchandlers --- .../blocks/gui/MTEVendingMachineGui.java | 82 +++++++++++-------- .../handlers/SaveLoadHandler.java | 3 +- 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 175c5f1..aba4c84 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -27,6 +27,7 @@ import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.SingleChildWidget; @@ -174,7 +175,7 @@ public ModularPanel build(PosGuiData guiData, PanelSyncManager syncManager, UISe .get())) .child(this.searchBar) .child(createTradeUI((TradeMainPanel) panel, this.tabController)); - mainColumn.child(createCoinInventoryRow((TradeMainPanel) panel)); + mainColumn.child(createCoinInventoryRow((TradeMainPanel) panel, syncManager)); } mainColumn.child(createInventoryRow()); panel.child(mainColumn); @@ -564,7 +565,7 @@ private static String getReadableStringFromCoinAmount(int amount) { } } - private IWidget createCoinInventoryRow(TradeMainPanel panel) { + private IWidget createCoinInventoryRow(TradeMainPanel panel, PanelSyncManager syncManager) { Flow parent = new Row() // .background(GuiTextures.TEXT_FIELD_BACKGROUND) .width(162) .height(36) @@ -573,39 +574,8 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel) { Flow coinColumn = new Column().width(COIN_COLUMN_WIDTH); int coinCount = 0; - UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(getBase().getCurrentUser()); - Map currentAmounts = TradeManager.INSTANCE.playerCurrency - .getOrDefault(playerId, Collections.EMPTY_MAP); for (CurrencyType type : CurrencyType.values()) { - coinColumn.child( - new Row().child( - new CoinButton(panel, type).overlay( - type.texture.asIcon() - .size(12)) - .size(12) - .left(0) - .syncHandler("ejectCoin_" + type.id) - .tooltipDynamic((builder) -> { - builder.clearText(); - builder.addLine(currentAmounts.getOrDefault(type, 0) + " " + type.getLocalizedName()); - builder.emptyLine(); - builder.addLine( - IKey.str(Translator.translate("vendingmachine.gui.single_coin_type_eject_hint")) - .style(IKey.GRAY, IKey.ITALIC)); - builder.setAutoUpdate(true); - })) - .child(IKey.dynamic(() -> { - Map currencyMap = TradeManager.INSTANCE.playerCurrency - .getOrDefault(playerId, Collections.EMPTY_MAP); - return getReadableStringFromCoinAmount( - currencyMap.get(type) == null ? 0 : currencyMap.get(type)); - }) - .scale(0.8f) - .asWidget() - .top(3) - .left(14) - .width(21)) - .height(14)); + coinColumn.child(createCoinDisplay(panel, type, syncManager)); if (++coinCount % COIN_COLUMN_ROW_COUNT == 0) { parent.child(coinColumn.left(3 + COIN_COLUMN_WIDTH * (coinCount / COIN_COLUMN_ROW_COUNT - 1))); coinColumn = new Column().width(COIN_COLUMN_WIDTH); @@ -617,6 +587,34 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel) { return parent; } + private IWidget createCoinDisplay(TradeMainPanel panel, CurrencyType type, PanelSyncManager syncManager) { + IntSyncValue coinSyncValue = ((IntSyncValue) syncManager.getSyncHandler("coinAmount_" + type.id + ":0")); + return new Row().child( + new CoinButton(panel, type).overlay( + type.texture.asIcon() + .size(12)) + .size(12) + .left(0) + .syncHandler("ejectCoin_" + type.id) + .tooltipDynamic((builder) -> { + builder.clearText(); + builder.addLine(coinSyncValue.getValue() + " " + type.getLocalizedName()); + builder.emptyLine(); + builder.addLine( + IKey.str(Translator.translate("vendingmachine.gui.single_coin_type_eject_hint")) + .style(IKey.GRAY, IKey.ITALIC)); + builder.setAutoUpdate(true); + })) + .child( + IKey.dynamic(() -> getReadableStringFromCoinAmount(coinSyncValue.getValue())) + .scale(0.8f) + .asWidget() + .top(3) + .left(14) + .width(21)) + .height(14); + } + // why is the original method private lmao private IWidget createInventoryRow() { return new Row().widthRel(1) @@ -632,25 +630,38 @@ private IWidget createInventoryRow() { @Override protected void registerSyncValues(PanelSyncManager syncManager) { super.registerSyncValues(syncManager); + + // Item Slots syncManager.registerSlotGroup("inputSlotGroup", 2, true); syncManager.registerSlotGroup("outputSlotGroup", 2, false); + // Eject Items BooleanSyncValue ejectItemsSyncer = new BooleanSyncValue(() -> this.ejectItems, val -> { this.ejectItems = val; if (this.ejectItems) { doEjectItems(); } }); + syncManager.syncValue("ejectItems", ejectItemsSyncer); + + // Eject Coins BooleanSyncValue ejectCoinsSyncer = new BooleanSyncValue(() -> this.ejectCoins, val -> { this.ejectCoins = val; if (this.ejectCoins) { doEjectCoins(); } }); - syncManager.syncValue("ejectItems", ejectItemsSyncer); syncManager.syncValue("ejectCoins", ejectCoinsSyncer); + UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(getBase().getCurrentUser()); for (CurrencyType type : CurrencyType.values()) { + // Coin Value Display + IntSyncValue coinAmountSyncer = new IntSyncValue( + () -> TradeManager.INSTANCE.playerCurrency.getOrDefault(playerId, Collections.emptyMap()) + .getOrDefault(type, 0)); + syncManager.syncValue("coinAmount_" + type.id, coinAmountSyncer); + + // Eject Individual Coins BooleanSyncValue ejectCoinSyncer = new BooleanSyncValue(() -> this.ejectSingleCoin.get(type), val -> { this.ejectSingleCoin.put(type, val); if (val) { @@ -659,6 +670,7 @@ protected void registerSyncValues(PanelSyncManager syncManager) { }); syncManager.syncValue("ejectCoin_" + type.id, ejectCoinSyncer); } + } public void attemptPurchase(TradeItemDisplay display) { diff --git a/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java b/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java index 5ae0e59..89fda28 100644 --- a/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/handlers/SaveLoadHandler.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.concurrent.Future; @@ -93,7 +94,7 @@ public void loadTradeState() { .endsWith(".json")) .collect(Collectors.toList())); } else { - JsonHelper.populateTradeStateFromFiles(new ArrayList<>()); + JsonHelper.populateTradeStateFromFiles(Collections.emptyList()); } } } From 8df80c6eaff916a348a5a75e731811e0b43ffc2c Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 15 Oct 2025 22:24:46 +0800 Subject: [PATCH 48/88] Removed homebrewed currency sync --- .../blocks/MTEVendingMachine.java | 2 - .../blocks/gui/InterceptingSlot.java | 3 - .../blocks/gui/MTEVendingMachineGui.java | 3 - .../network/PacketTypeRegistry.java | 2 - .../network/handlers/NetCurrencySync.java | 95 ------------------- 5 files changed, 105 deletions(-) delete mode 100644 src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index afc81be..7c6e17f 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -37,7 +37,6 @@ import com.cubefury.vendingmachine.VendingMachine; import com.cubefury.vendingmachine.blocks.gui.MTEVendingMachineGui; import com.cubefury.vendingmachine.blocks.gui.TradeItemDisplay; -import com.cubefury.vendingmachine.network.handlers.NetCurrencySync; import com.cubefury.vendingmachine.network.handlers.NetTradeDisplaySync; import com.cubefury.vendingmachine.network.handlers.NetTradeRequestSync; import com.cubefury.vendingmachine.storage.NameCache; @@ -563,7 +562,6 @@ public void sendTradeUpdate() { if (this.currentUser == null) { return; } - NetCurrencySync.syncCurrencyToClient((EntityPlayerMP) this.currentUser); NetTradeDisplaySync.syncTradesToClient((EntityPlayerMP) this.currentUser, this); } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java index 582335e..2a869f0 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java @@ -1,12 +1,10 @@ package com.cubefury.vendingmachine.blocks.gui; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import com.cleanroommc.modularui.utils.item.ItemStackHandler; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.cubefury.vendingmachine.network.handlers.NetCurrencySync; import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.trade.CurrencyItem; import com.cubefury.vendingmachine.trade.TradeManager; @@ -24,7 +22,6 @@ public boolean intercept(ItemStack newItem, boolean client, EntityPlayer player) this.putStack(null); if (!client) { TradeManager.INSTANCE.addCurrency(NameCache.INSTANCE.getUUIDFromPlayer(player), mapped); - NetCurrencySync.sendPlayerCurrency((EntityPlayerMP) player, mapped); } return true; } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index aba4c84..dabe338 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -46,7 +46,6 @@ import com.cubefury.vendingmachine.blocks.MTEVendingMachine; import com.cubefury.vendingmachine.gui.GuiTextures; import com.cubefury.vendingmachine.gui.WidgetThemes; -import com.cubefury.vendingmachine.network.handlers.NetCurrencySync; import com.cubefury.vendingmachine.network.handlers.NetTradeDisplaySync; import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.trade.CurrencyItem; @@ -307,7 +306,6 @@ private void doEjectCoin(CurrencyType type) { base.spawnItem(ejectable); } TradeManager.INSTANCE.resetCurrency(currentUser, type); - NetCurrencySync.resetPlayerCurrency((EntityPlayerMP) base.getCurrentUser(), type); this.ejectSingleCoin.put(type, false); } @@ -330,7 +328,6 @@ private void doEjectCoins() { } } TradeManager.INSTANCE.resetCurrency(currentUser, null); - NetCurrencySync.resetPlayerCurrency((EntityPlayerMP) base.getCurrentUser(), null); ejectCoins = false; } diff --git a/src/main/java/com/cubefury/vendingmachine/network/PacketTypeRegistry.java b/src/main/java/com/cubefury/vendingmachine/network/PacketTypeRegistry.java index 6def7a2..6540eef 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/PacketTypeRegistry.java +++ b/src/main/java/com/cubefury/vendingmachine/network/PacketTypeRegistry.java @@ -13,7 +13,6 @@ import com.cubefury.vendingmachine.api.network.IPacketRegistry; import com.cubefury.vendingmachine.api.util.Tuple2; import com.cubefury.vendingmachine.network.handlers.NetBulkSync; -import com.cubefury.vendingmachine.network.handlers.NetCurrencySync; import com.cubefury.vendingmachine.network.handlers.NetNameSync; import com.cubefury.vendingmachine.network.handlers.NetResetVMUser; import com.cubefury.vendingmachine.network.handlers.NetSatisfiedQuestSync; @@ -30,7 +29,6 @@ public class PacketTypeRegistry implements IPacketRegistry { public void init() { NetTradeDbSync.registerHandler(); - NetCurrencySync.registerHandler(); NetTradeDisplaySync.registerHandler(); NetTradeRequestSync.registerHandler(); NetSatisfiedQuestSync.registerHandler(); diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java deleted file mode 100644 index 30a7ae0..0000000 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetCurrencySync.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.cubefury.vendingmachine.network.handlers; - -import java.util.UUID; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; - -import com.cubefury.vendingmachine.VendingMachine; -import com.cubefury.vendingmachine.api.network.UnserializedPacket; -import com.cubefury.vendingmachine.network.PacketSender; -import com.cubefury.vendingmachine.network.PacketTypeRegistry; -import com.cubefury.vendingmachine.storage.NameCache; -import com.cubefury.vendingmachine.trade.CurrencyItem; -import com.cubefury.vendingmachine.trade.CurrencyType; -import com.cubefury.vendingmachine.trade.TradeManager; -import com.cubefury.vendingmachine.util.NBTConverter; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class NetCurrencySync { - - private static final ResourceLocation ID_NAME = new ResourceLocation("vendingmachine:currency_sync"); - - public static void registerHandler() { - if (VendingMachine.proxy.isClient()) { - PacketTypeRegistry.INSTANCE.registerClientHandler(ID_NAME, NetCurrencySync::onClient); - } - } - - // server side code for sending currency data when player opens gui - public static void syncCurrencyToClient(@Nonnull EntityPlayerMP player) { - UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(player); - - NBTTagCompound payload = new NBTTagCompound(); - payload.setString("dataType", "currencySync"); - NBTConverter.UuidValueType.PLAYER.writeId(playerId, payload); - payload.setTag("data", TradeManager.INSTANCE.writeCurrencyToNBT(new NBTTagCompound(), playerId)); - PacketSender.INSTANCE.sendToPlayers(new UnserializedPacket(ID_NAME, payload), player); - } - - public static void sendPlayerCurrency(@Nonnull EntityPlayerMP player, CurrencyItem currencyItem) { - NBTTagCompound payload = new NBTTagCompound(); - payload.setString("dataType", "currencyAdd"); - currencyItem.writeToNBT(payload); - - PacketSender.INSTANCE.sendToPlayers(new UnserializedPacket(ID_NAME, payload), player); - } - - public static void resetPlayerCurrency(@Nonnull EntityPlayerMP player, @Nullable CurrencyType type) { - NBTTagCompound payload = new NBTTagCompound(); - payload.setString("dataType", "currencyReset"); - if (type != null) { - payload.setString("type", type.id); - } - PacketSender.INSTANCE.sendToPlayers(new UnserializedPacket(ID_NAME, payload), player); - } - - @SideOnly(Side.CLIENT) - public static void onClient(NBTTagCompound message) { - // Don't wipe everyone else's data if on LAN, since - // we receive only the requested player's data - // In SP and LAN, we'll have this data already anyway - if ( - Minecraft.getMinecraft() - .isIntegratedServerRunning() - ) { - return; - } - String dataType = message.getString("dataType"); - UUID player = NBTConverter.UuidValueType.PLAYER.readId(message); - switch (dataType) { - case "currencySync" -> { - TradeManager.INSTANCE.populateCurrencyFromNBT( - message.getCompoundTag("data"), - NBTConverter.UuidValueType.PLAYER.readId(message), - false); - } - case "currencyAdd" -> { - CurrencyItem currencyItem = CurrencyItem.fromNBT(message.getCompoundTag("currencyItem")); - - TradeManager.INSTANCE.addCurrency(player, currencyItem); - } - case "currencyReset" -> TradeManager.INSTANCE.resetCurrency( - player, - message.hasKey("type") ? CurrencyType.getTypeFromId(message.getString("type")) : null); - default -> VendingMachine.LOG.warn("Unknown trade state sync data received: {}", dataType); - } - } -} From 88375c53453082b560afe2febb33bf0dd16e0e33 Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 15 Oct 2025 22:25:33 +0800 Subject: [PATCH 49/88] Fixed a bug where if you had exactly 10, 100, 1k or 10k of some coin, it would split it into the lower denominator, or void if you had only 1 of that coin. --- .../java/com/cubefury/vendingmachine/trade/CurrencyItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java b/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java index 646c790..495ae3f 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/CurrencyItem.java @@ -37,7 +37,7 @@ public List itemize() { return outputs; } for (int i = 0; i < coinValues.length; i++) { - while (this.value > coinValues[i]) { + while (this.value >= coinValues[i]) { Item outputItem = (Item) Item.itemRegistry.getObject(this.type.itemPrefix + coinSuffixes[i]); int stackSize = Math.min(this.value / coinValues[i], outputItem.getItemStackLimit()); outputs.add(new ItemStack(outputItem, stackSize)); From cba40a956d1a83b3795c0b2207ef16aec4d3f283 Mon Sep 17 00:00:00 2001 From: cubefury Date: Wed, 15 Oct 2025 22:59:45 +0800 Subject: [PATCH 50/88] Address comments + bumped mui to 2.3.3 --- dependencies.gradle | 2 +- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 1c677c1..f694c70 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -38,7 +38,7 @@ dependencies { implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.3.2-1.7.10:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.3-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.42:dev") } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index dabe338..61cb084 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -628,11 +628,9 @@ private IWidget createInventoryRow() { protected void registerSyncValues(PanelSyncManager syncManager) { super.registerSyncValues(syncManager); - // Item Slots syncManager.registerSlotGroup("inputSlotGroup", 2, true); syncManager.registerSlotGroup("outputSlotGroup", 2, false); - // Eject Items BooleanSyncValue ejectItemsSyncer = new BooleanSyncValue(() -> this.ejectItems, val -> { this.ejectItems = val; if (this.ejectItems) { @@ -641,7 +639,6 @@ protected void registerSyncValues(PanelSyncManager syncManager) { }); syncManager.syncValue("ejectItems", ejectItemsSyncer); - // Eject Coins BooleanSyncValue ejectCoinsSyncer = new BooleanSyncValue(() -> this.ejectCoins, val -> { this.ejectCoins = val; if (this.ejectCoins) { @@ -652,13 +649,11 @@ protected void registerSyncValues(PanelSyncManager syncManager) { UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(getBase().getCurrentUser()); for (CurrencyType type : CurrencyType.values()) { - // Coin Value Display IntSyncValue coinAmountSyncer = new IntSyncValue( () -> TradeManager.INSTANCE.playerCurrency.getOrDefault(playerId, Collections.emptyMap()) .getOrDefault(type, 0)); syncManager.syncValue("coinAmount_" + type.id, coinAmountSyncer); - // Eject Individual Coins BooleanSyncValue ejectCoinSyncer = new BooleanSyncValue(() -> this.ejectSingleCoin.get(type), val -> { this.ejectSingleCoin.put(type, val); if (val) { From 9e4d47f43610897d0059d19e8432dd8686978b67 Mon Sep 17 00:00:00 2001 From: cubefury Date: Thu, 16 Oct 2025 02:47:57 +0800 Subject: [PATCH 51/88] Added support for non-consumable items in a trade. --- .../blocks/MTEVendingMachine.java | 1 + .../blocks/gui/MTEVendingMachineGui.java | 42 +++++++++++----- .../blocks/gui/TradeItemDisplay.java | 8 ++-- .../betterquesting/gui/BqTradeGroup.java | 48 ------------------- .../betterquesting/gui/PanelQBTrade.java | 11 +++++ .../integration/nei/NeiRecipeHandler.java | 11 +++++ .../network/handlers/NetTradeDisplaySync.java | 2 + .../cubefury/vendingmachine/trade/Trade.java | 14 ++++++ .../assets/vendingmachine/lang/en_US.lang | 1 + 9 files changed, 75 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 7c6e17f..4104994 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -252,6 +252,7 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { if ( !this.inputCurrencySatisfied(trade.fromCurrency, tradeRequest.playerID) || !this.inputItemsSatisfied(trade.fromItems) + || !this.inputItemsSatisfied(trade.nonConsumedItems) ) { return false; } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 61cb084..8294263 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -447,21 +447,39 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { // builder.add(new ItemDrawable(toItem.getBaseStack())); } builder.emptyLine(); - builder.addLine( - IKey.str(Translator.translate("vendingmachine.gui.required_inputs")) - .style(IKey.DARK_GREEN, IKey.ITALIC)); - for (CurrencyItem currencyItem : cur.fromCurrency) { + + if (!cur.fromCurrency.isEmpty() || !cur.fromItems.isEmpty()) { builder.addLine( - IKey.str(currencyItem.value + " " + currencyItem.type.getLocalizedName()) - .style(IKey.DARK_GREEN)); + IKey.lang("vendingmachine.gui.required_inputs") + .style(IKey.DARK_GREEN, IKey.ITALIC)); + for (CurrencyItem currencyItem : cur.fromCurrency) { + builder.addLine( + IKey.str(currencyItem.value + " " + currencyItem.type.getLocalizedName()) + .style(IKey.DARK_GREEN)); + } + for (BigItemStack fromItem : cur.fromItems) { + builder.addLine( + IKey.str( + fromItem.stackSize + " " + + fromItem.getBaseStack() + .getDisplayName()) + .style(IKey.DARK_GREEN)); + } } - for (BigItemStack fromItem : cur.fromItems) { + + builder.emptyLine(); + if (!cur.ncItems.isEmpty()) { builder.addLine( - IKey.str( - fromItem.stackSize + " " - + fromItem.getBaseStack() - .getDisplayName()) - .style(IKey.DARK_GREEN)); + IKey.lang("vendingmachine.gui.nc_inputs") + .style(IKey.DARK_GREEN, IKey.ITALIC)); + for (BigItemStack fromItem : cur.ncItems) { + builder.addLine( + IKey.str( + fromItem.stackSize + " " + + fromItem.getBaseStack() + .getDisplayName()) + .style(IKey.DARK_GREEN)); + } } builder.emptyLine(); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java index 6e5e68b..615c3ab 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java @@ -14,6 +14,7 @@ public class TradeItemDisplay { public List fromCurrency; public List fromItems; + public List ncItems; public List toItems; public ItemStack display; public UUID tgID; @@ -24,11 +25,12 @@ public class TradeItemDisplay { public boolean enabled; public boolean tradeableNow; - public TradeItemDisplay(List fromCurrency, List fromItems, List toItems, - ItemStack display, UUID tgID, int tradeGroupOrder, long cooldown, String cooldownText, boolean hasCooldown, - boolean enabled, boolean tradeableNow) { + public TradeItemDisplay(List fromCurrency, List fromItems, List ncItems, + List toItems, ItemStack display, UUID tgID, int tradeGroupOrder, long cooldown, + String cooldownText, boolean hasCooldown, boolean enabled, boolean tradeableNow) { this.fromCurrency = fromCurrency; this.fromItems = fromItems; + this.ncItems = ncItems; this.toItems = toItems; this.display = display; this.tgID = tgID; diff --git a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java deleted file mode 100644 index fcdf3cc..0000000 --- a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.cubefury.vendingmachine.integration.betterquesting.gui; - -import java.util.UUID; - -import com.cubefury.vendingmachine.trade.Trade; -import com.cubefury.vendingmachine.trade.TradeDatabase; -import com.cubefury.vendingmachine.trade.TradeGroup; - -import betterquesting.api2.client.gui.misc.GuiAlign; -import betterquesting.api2.client.gui.misc.GuiTransform; -import betterquesting.api2.client.gui.misc.IGuiRect; -import betterquesting.api2.client.gui.panels.CanvasEmpty; -import betterquesting.api2.client.gui.panels.IGuiPanel; -import betterquesting.api2.client.gui.panels.lists.CanvasScrolling; - -public class BqTradeGroup { - - public static int addTradePanel(CanvasScrolling csReward, IGuiRect rectReward, UUID tradeGroup, int yOffset) { - TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroups() - .get(tradeGroup); - if (tg == null || tg.getTrades() == null) { - return yOffset; - } - for (Trade trade : tg.getTrades()) { - IGuiPanel tradeGui = trade.getTradeGui( - new GuiTransform(GuiAlign.FULL_BOX, 0, 0, rectReward.getWidth(), rectReward.getHeight(), 111)); - if (tradeGui != null) { - tradeGui.initPanel(); - CanvasEmpty tempCanvas = new CanvasEmpty( - new GuiTransform( - GuiAlign.TOP_LEFT, - 0, - yOffset, - rectReward.getWidth(), - tradeGui.getTransform() - .getHeight() - - tradeGui.getTransform() - .getY(), - 1)); - csReward.addPanel(tempCanvas); - tempCanvas.addPanel(tradeGui); - yOffset += tempCanvas.getTransform() - .getHeight(); - } - } - return yOffset; - } -} diff --git a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java index 78dfc7a..39564bc 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java @@ -42,6 +42,17 @@ public void initPanel() { x_offset += 20; } + for (int i = 0; i < trade.nonConsumedItems.size(); i++) { + BigItemStack stack = trade.nonConsumedItems.get(i) + .toBQBigItemStack(); + GuiRectangle rectangle = new GuiRectangle(x_offset, 0, 18, 18, 0); + PanelItemSlot is = PanelItemSlotBuilder.forValue(stack, rectangle) + .showCount(true) + .build(); + this.addPanel(is); + x_offset += 20; + } + for (int i = 0; i < trade.fromCurrency.size(); i++) { CurrencyItem currencyItem = trade.fromCurrency.get(i); BigItemStack stack = new BigItemStack(currencyItem.getItemRepresentation()); diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index 75ef983..c418567 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -331,6 +331,17 @@ private void loadInputs(Trade trade) { inputs.add(new PositionedStack(extractStacks(stack), x, y)); index++; } + + // TODO: Add NC annotation on top of item + for (BigItemStack stack : trade.nonConsumedItems) { + if (index >= GRID_COUNT) { + break; + } + int x = xOffset + index * SLOT_SIZE; + inputs.add(new PositionedStack(extractStacks(stack), x, y)); + index++; + } + for (CurrencyItem ci : trade.fromCurrency) { if (index >= GRID_COUNT) { break; diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java index 964bf83..8babf1b 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java @@ -82,6 +82,7 @@ public TradeItemDisplay formatItemDisplay() { return new TradeItemDisplay( t.fromCurrency, t.fromItems, + t.nonConsumedItems, t.toItems, t.getDisplayItem(), this.tgID, @@ -133,6 +134,7 @@ public static void syncTradesToClient(@Nonnull EntityPlayerMP player, MTEVending Trade trade = tg.getTrades() .get(i); boolean tradableNow = base.inputItemsSatisfied(trade.fromItems) + && base.inputItemsSatisfied(trade.nonConsumedItems) && base.inputCurrencySatisfied(trade.fromCurrency, playerId); trades.appendTag( new Tradable(tg.getId(), i, cooldownRemaining, enabled, tradableNow) diff --git a/src/main/java/com/cubefury/vendingmachine/trade/Trade.java b/src/main/java/com/cubefury/vendingmachine/trade/Trade.java index e6d0e26..8a3c70b 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/Trade.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/Trade.java @@ -23,6 +23,7 @@ public class Trade { public final List fromCurrency = new ArrayList<>(); public final List fromItems = new ArrayList<>(); + public final List nonConsumedItems = new ArrayList<>(); public final List toItems = new ArrayList<>(); public BigItemStack displayItem = new BigItemStack(ItemPlaceholder.placeholder); @@ -45,6 +46,14 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setTag("fromItems", fromItemsArray); } + if (!this.nonConsumedItems.isEmpty()) { + NBTTagList ncArray = new NBTTagList(); + for (BigItemStack stack : this.nonConsumedItems) { + ncArray.appendTag(JsonHelper.ItemStackToJson(stack, new NBTTagCompound())); + } + nbt.setTag("nonConsumedItems", ncArray); + } + if (!this.toItems.isEmpty()) { NBTTagList toItemsArray = new NBTTagList(); for (BigItemStack stack : this.toItems) { @@ -73,6 +82,11 @@ public void readFromNBT(NBTTagCompound nbt) { fromItems.add(JsonHelper.JsonToItemStack(fromList.getCompoundTagAt(i))); } + NBTTagList ncList = nbt.getTagList("nonConsumedItems", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < ncList.tagCount(); i++) { + nonConsumedItems.add(JsonHelper.JsonToItemStack(ncList.getCompoundTagAt(i))); + } + NBTTagList toList = nbt.getTagList("toItems", Constants.NBT.TAG_COMPOUND); for (int i = 0; i < toList.tagCount(); i++) { toItems.add(JsonHelper.JsonToItemStack(toList.getCompoundTagAt(i))); diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 6c91d26..661c159 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -16,6 +16,7 @@ vendingmachine.gui.coin_eject=Eject All Coins vendingmachine.gui.single_coin_type_eject_hint=Shift-Click to Extract vendingmachine.gui.search=Search vendingmachine.gui.required_inputs=Requires: +vendingmachine.gui.nc_inputs=Requires (Not Consumed): vendingmachine.gui.trade_hint=Shift-Click to Purchase vendingmachine.gui.display_mode=Display: vendingmachine.gui.display_mode_tile=Tiles From 66f4215abed729b72cefee63c88c527f8b0f3d7c Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Thu, 16 Oct 2025 10:47:04 +0200 Subject: [PATCH 52/88] update --- dependencies.gradle | 4 ++-- settings.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index f694c70..78b21d2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -36,11 +36,11 @@ dependencies { implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.15-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") - compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") + compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.10-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.3.3-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.42:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.45:dev") } // deps may transitively add Baubles, so we replace it diff --git a/settings.gradle.kts b/settings.gradle.kts index 0966c6f..76ee14e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,5 +17,5 @@ pluginManagement { } plugins { - id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.43") + id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.44") } From b8f2f24077e71e878a1da46dd1a2c8f1284cd4e4 Mon Sep 17 00:00:00 2001 From: cubefury Date: Thu, 16 Oct 2025 20:55:59 +0800 Subject: [PATCH 53/88] Tidied up extra newlines in tooltips --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 8294263..f47c98e 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -465,9 +465,8 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { .getDisplayName()) .style(IKey.DARK_GREEN)); } + builder.emptyLine(); } - - builder.emptyLine(); if (!cur.ncItems.isEmpty()) { builder.addLine( IKey.lang("vendingmachine.gui.nc_inputs") @@ -480,9 +479,9 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { .getDisplayName()) .style(IKey.DARK_GREEN)); } + builder.emptyLine(); } - builder.emptyLine(); builder.addLine( IKey.str(Translator.translate("vendingmachine.gui.trade_hint")) .style(IKey.GRAY)); From 0b08db48a7238e24cc44ecbf8b81de27203fe22d Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 02:13:34 +0800 Subject: [PATCH 54/88] Fix NEI recipe handler underlines --- .../betterquesting/gui/BqTradeGroup.java | 48 +++++++++++++++++++ .../integration/nei/NeiRecipeHandler.java | 19 ++++++-- 2 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java diff --git a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java new file mode 100644 index 0000000..fcdf3cc --- /dev/null +++ b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java @@ -0,0 +1,48 @@ +package com.cubefury.vendingmachine.integration.betterquesting.gui; + +import java.util.UUID; + +import com.cubefury.vendingmachine.trade.Trade; +import com.cubefury.vendingmachine.trade.TradeDatabase; +import com.cubefury.vendingmachine.trade.TradeGroup; + +import betterquesting.api2.client.gui.misc.GuiAlign; +import betterquesting.api2.client.gui.misc.GuiTransform; +import betterquesting.api2.client.gui.misc.IGuiRect; +import betterquesting.api2.client.gui.panels.CanvasEmpty; +import betterquesting.api2.client.gui.panels.IGuiPanel; +import betterquesting.api2.client.gui.panels.lists.CanvasScrolling; + +public class BqTradeGroup { + + public static int addTradePanel(CanvasScrolling csReward, IGuiRect rectReward, UUID tradeGroup, int yOffset) { + TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroups() + .get(tradeGroup); + if (tg == null || tg.getTrades() == null) { + return yOffset; + } + for (Trade trade : tg.getTrades()) { + IGuiPanel tradeGui = trade.getTradeGui( + new GuiTransform(GuiAlign.FULL_BOX, 0, 0, rectReward.getWidth(), rectReward.getHeight(), 111)); + if (tradeGui != null) { + tradeGui.initPanel(); + CanvasEmpty tempCanvas = new CanvasEmpty( + new GuiTransform( + GuiAlign.TOP_LEFT, + 0, + yOffset, + rectReward.getWidth(), + tradeGui.getTransform() + .getHeight() + - tradeGui.getTransform() + .getY(), + 1)); + csReward.addPanel(tempCanvas); + tempCanvas.addPanel(tradeGui); + yOffset += tempCanvas.getTransform() + .getHeight(); + } + } + return yOffset; + } +} diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index c418567..b8e44be 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -47,6 +47,7 @@ import codechicken.nei.api.API; import codechicken.nei.recipe.GuiCraftingRecipe; import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.GuiRecipeCatalyst; import codechicken.nei.recipe.TemplateRecipeHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Optional; @@ -197,8 +198,12 @@ public boolean isMouseOverBqCondition(int recipeIndex, int curY, UUID questId, S Point pos = GuiDraw.getMousePosition(); - int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; - int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().w) / 2; + // very cursed I'm sorry :doom: + GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); + + int guiLeft = catalystWidget.x + catalystWidget.w - 6; + int guiTop = catalystWidget.y + 9; + Point relMousePos = new Point(pos.x - guiLeft - offset.x, pos.y - guiTop - offset.y); Rectangle textArea = new Rectangle(2, curY - GuiDraw.fontRenderer.FONT_HEIGHT, width + 2, height + 1); if (textArea.contains(relMousePos)) { @@ -214,8 +219,10 @@ public boolean isMouseOnLastHovered(GuiRecipe gui, int recipeIndex) { if (lastHoveredTextArea == null || lastHoveredQuestId == null || lastHoveredRecipeIndex != recipeIndex) { return false; } - int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; - int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().h) / 2; + GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); + + int guiLeft = catalystWidget.x + catalystWidget.w - 6; + int guiTop = catalystWidget.y + 9; Point offset = gui.getRecipePosition(recipeIndex); Point pos = GuiDraw.getMousePosition(); @@ -286,7 +293,9 @@ public void drawExtras(int recipeIndex) { } else { String translatedQuestKey = getTextWithoutFormattingCodes( QuestTranslation.translateQuestName(questId, quest)); - unformatted.append(translatedQuestKey); + unformatted.append( + translatedQuestKey.length() <= 18 ? translatedQuestKey + : translatedQuestKey.substring(0, 18) + "..."); requirementString.append( isMouseOverBqCondition(recipeIndex, y, questId, unformatted.toString()) ? UNDERLINE : ""); requirementString.append(unformatted); From 1d1ad1731ac5ac0b2a86a1e8db094554320fd932 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 13:06:41 +0800 Subject: [PATCH 55/88] Revert out of scope recipe handler change. --- .../integration/nei/NeiRecipeHandler.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index b8e44be..c418567 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -47,7 +47,6 @@ import codechicken.nei.api.API; import codechicken.nei.recipe.GuiCraftingRecipe; import codechicken.nei.recipe.GuiRecipe; -import codechicken.nei.recipe.GuiRecipeCatalyst; import codechicken.nei.recipe.TemplateRecipeHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Optional; @@ -198,12 +197,8 @@ public boolean isMouseOverBqCondition(int recipeIndex, int curY, UUID questId, S Point pos = GuiDraw.getMousePosition(); - // very cursed I'm sorry :doom: - GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); - - int guiLeft = catalystWidget.x + catalystWidget.w - 6; - int guiTop = catalystWidget.y + 9; - + int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; + int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().w) / 2; Point relMousePos = new Point(pos.x - guiLeft - offset.x, pos.y - guiTop - offset.y); Rectangle textArea = new Rectangle(2, curY - GuiDraw.fontRenderer.FONT_HEIGHT, width + 2, height + 1); if (textArea.contains(relMousePos)) { @@ -219,10 +214,8 @@ public boolean isMouseOnLastHovered(GuiRecipe gui, int recipeIndex) { if (lastHoveredTextArea == null || lastHoveredQuestId == null || lastHoveredRecipeIndex != recipeIndex) { return false; } - GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); - - int guiLeft = catalystWidget.x + catalystWidget.w - 6; - int guiTop = catalystWidget.y + 9; + int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; + int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().h) / 2; Point offset = gui.getRecipePosition(recipeIndex); Point pos = GuiDraw.getMousePosition(); @@ -293,9 +286,7 @@ public void drawExtras(int recipeIndex) { } else { String translatedQuestKey = getTextWithoutFormattingCodes( QuestTranslation.translateQuestName(questId, quest)); - unformatted.append( - translatedQuestKey.length() <= 18 ? translatedQuestKey - : translatedQuestKey.substring(0, 18) + "..."); + unformatted.append(translatedQuestKey); requirementString.append( isMouseOverBqCondition(recipeIndex, y, questId, unformatted.toString()) ? UNDERLINE : ""); requirementString.append(unformatted); From ac1140641b9a0efd29c4c4a066c1ee834bf526dd Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Thu, 16 Oct 2025 10:47:04 +0200 Subject: [PATCH 56/88] update --- dependencies.gradle | 4 ++-- settings.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index f694c70..78b21d2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -36,11 +36,11 @@ dependencies { implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.15-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") - compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.8-GTNH:dev") + compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.10-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.3.3-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.42:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.45:dev") } // deps may transitively add Baubles, so we replace it diff --git a/settings.gradle.kts b/settings.gradle.kts index 0966c6f..76ee14e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,5 +17,5 @@ pluginManagement { } plugins { - id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.43") + id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.44") } From 5593fbb28bb710d6f12716d200a24ad9cd968f29 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 13:13:41 +0800 Subject: [PATCH 57/88] Fixed recipe underlines in NEI --- .../integration/nei/NeiRecipeHandler.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index c418567..b8e44be 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -47,6 +47,7 @@ import codechicken.nei.api.API; import codechicken.nei.recipe.GuiCraftingRecipe; import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.GuiRecipeCatalyst; import codechicken.nei.recipe.TemplateRecipeHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Optional; @@ -197,8 +198,12 @@ public boolean isMouseOverBqCondition(int recipeIndex, int curY, UUID questId, S Point pos = GuiDraw.getMousePosition(); - int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; - int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().w) / 2; + // very cursed I'm sorry :doom: + GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); + + int guiLeft = catalystWidget.x + catalystWidget.w - 6; + int guiTop = catalystWidget.y + 9; + Point relMousePos = new Point(pos.x - guiLeft - offset.x, pos.y - guiTop - offset.y); Rectangle textArea = new Rectangle(2, curY - GuiDraw.fontRenderer.FONT_HEIGHT, width + 2, height + 1); if (textArea.contains(relMousePos)) { @@ -214,8 +219,10 @@ public boolean isMouseOnLastHovered(GuiRecipe gui, int recipeIndex) { if (lastHoveredTextArea == null || lastHoveredQuestId == null || lastHoveredRecipeIndex != recipeIndex) { return false; } - int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; - int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().h) / 2; + GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); + + int guiLeft = catalystWidget.x + catalystWidget.w - 6; + int guiTop = catalystWidget.y + 9; Point offset = gui.getRecipePosition(recipeIndex); Point pos = GuiDraw.getMousePosition(); @@ -286,7 +293,9 @@ public void drawExtras(int recipeIndex) { } else { String translatedQuestKey = getTextWithoutFormattingCodes( QuestTranslation.translateQuestName(questId, quest)); - unformatted.append(translatedQuestKey); + unformatted.append( + translatedQuestKey.length() <= 18 ? translatedQuestKey + : translatedQuestKey.substring(0, 18) + "..."); requirementString.append( isMouseOverBqCondition(recipeIndex, y, questId, unformatted.toString()) ? UNDERLINE : ""); requirementString.append(unformatted); From 3eb9255a89789f6aee6e9c05e3ecb8a639860c07 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 16:04:03 +0800 Subject: [PATCH 58/88] Added NC to corner of non-consumable stacks --- .../integration/nei/NeiRecipeHandler.java | 26 ++++++++++++++++--- .../assets/vendingmachine/lang/en_US.lang | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index b8e44be..ca8acac 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -271,6 +271,19 @@ public void processBqGui() { public void drawExtras(int recipeIndex) { CachedTradeRecipe recipe = (CachedTradeRecipe) this.arecipes.get(recipeIndex); + float scale = 0.5f; + GL11.glPushMatrix(); + GL11.glScalef(scale, scale, 1); + for (PositionedStack ps : recipe.ncInputs) { + GuiDraw.fontRenderer.drawString( + "NC", + (int) (ps.relx / scale), + (int) (ps.rely / scale), + Translator.getColor("vendingmachine.gui.nc_inputs_overlay_color"), + false); + } + GL11.glPopMatrix(); + GuiDraw.drawString( Translator.translate("vendingmachine.gui.requirementHeader"), 2, @@ -319,6 +332,7 @@ public void drawExtras(int recipeIndex) { public class CachedTradeRecipe extends CachedRecipe { private final List inputs = new ArrayList<>(); + private final List ncInputs = new ArrayList<>(); private final List outputs = new ArrayList<>(); private final List requirements = new ArrayList<>(); @@ -341,13 +355,12 @@ private void loadInputs(Trade trade) { index++; } - // TODO: Add NC annotation on top of item for (BigItemStack stack : trade.nonConsumedItems) { if (index >= GRID_COUNT) { break; } int x = xOffset + index * SLOT_SIZE; - inputs.add(new PositionedStack(extractStacks(stack), x, y)); + ncInputs.add(new PositionedStack(extractStacks(stack), x, y)); index++; } @@ -381,13 +394,20 @@ public PositionedStack getResult() { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + List allInputs = new ArrayList<>(); + allInputs.addAll(inputs); + allInputs.addAll(ncInputs); + return getCycledIngredients(cycleticks / 20, allInputs); } @Override public List getOtherStacks() { return outputs; } + + public List getNcInputs() { + return ncInputs; + } } @Override diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 661c159..28ae3b8 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -17,6 +17,7 @@ vendingmachine.gui.single_coin_type_eject_hint=Shift-Click to Extract vendingmachine.gui.search=Search vendingmachine.gui.required_inputs=Requires: vendingmachine.gui.nc_inputs=Requires (Not Consumed): +vendingmachine.gui.nc_inputs_overlay_color=FDD835 vendingmachine.gui.trade_hint=Shift-Click to Purchase vendingmachine.gui.display_mode=Display: vendingmachine.gui.display_mode_tile=Tiles From fa66518c16862ce03db818dcb17ca520b51cdec8 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 17:01:36 +0800 Subject: [PATCH 59/88] Update GT package to reference new location of MTEMultiBlockBaseGui --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 61cb084..0adab80 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -56,9 +56,9 @@ import com.cubefury.vendingmachine.util.BigItemStack; import com.cubefury.vendingmachine.util.Translator; -import gregtech.api.metatileentity.implementations.gui.MTEMultiBlockBaseGui; import gregtech.api.modularui2.GTGuiTextures; import gregtech.api.modularui2.GTWidgetThemes; +import gregtech.common.gui.modularui.multiblock.base.MTEMultiBlockBaseGui; public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { @@ -475,12 +475,11 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller tabController) { PagedWidget paged = new PagedWidget<>() .width(162) - .debugName("paged") .controller(tabController) .background(GuiTextures.TEXT_FIELD_BACKGROUND) .height(146); for (TradeCategory category : this.tradeCategories) { - ListWidget tradeList = new ListWidget<>().debugName("items") + ListWidget tradeList = new ListWidget<>() .width(161) .top(1) .height(144) @@ -585,7 +584,7 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel, PanelSyncManager sy } private IWidget createCoinDisplay(TradeMainPanel panel, CurrencyType type, PanelSyncManager syncManager) { - IntSyncValue coinSyncValue = ((IntSyncValue) syncManager.getSyncHandler("coinAmount_" + type.id + ":0")); + IntSyncValue coinSyncValue = syncManager.findSyncHandler("coinAmount_" + type.id, 0, IntSyncValue.class); return new Row().child( new CoinButton(panel, type).overlay( type.texture.asIcon() From efc9aec0badb1bd38cf537843ab2836a735f1739 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 17:05:23 +0800 Subject: [PATCH 60/88] Address comments --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 0adab80..7ed6394 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -474,12 +474,14 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { // spotless:off private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller tabController) { PagedWidget paged = new PagedWidget<>() + .name("paged") .width(162) .controller(tabController) .background(GuiTextures.TEXT_FIELD_BACKGROUND) .height(146); for (TradeCategory category : this.tradeCategories) { ListWidget tradeList = new ListWidget<>() + .name("items") .width(161) .top(1) .height(144) @@ -584,7 +586,7 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel, PanelSyncManager sy } private IWidget createCoinDisplay(TradeMainPanel panel, CurrencyType type, PanelSyncManager syncManager) { - IntSyncValue coinSyncValue = syncManager.findSyncHandler("coinAmount_" + type.id, 0, IntSyncValue.class); + IntSyncValue coinSyncValue = syncManager.findSyncHandler("coinAmount_" + type.id, 0, IntSyncValue.class); return new Row().child( new CoinButton(panel, type).overlay( type.texture.asIcon() From 7bf7d976c2906eeafead8740d81198787c9d90f6 Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Fri, 17 Oct 2025 17:05:10 +0200 Subject: [PATCH 61/88] update --- dependencies.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 78b21d2..0c9dec4 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.15-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.16-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.10-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.3.3-1.7.10:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.4-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.45:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.55:dev") } // deps may transitively add Baubles, so we replace it From a0ef8b22168727949f4e943652c1047e793eb5ff Mon Sep 17 00:00:00 2001 From: cubefury Date: Thu, 16 Oct 2025 02:47:57 +0800 Subject: [PATCH 62/88] Added support for non-consumable items in a trade. --- .../blocks/MTEVendingMachine.java | 1 + .../blocks/gui/MTEVendingMachineGui.java | 42 +++++++++++----- .../blocks/gui/TradeItemDisplay.java | 8 ++-- .../betterquesting/gui/BqTradeGroup.java | 48 ------------------- .../betterquesting/gui/PanelQBTrade.java | 11 +++++ .../integration/nei/NeiRecipeHandler.java | 11 +++++ .../network/handlers/NetTradeDisplaySync.java | 2 + .../cubefury/vendingmachine/trade/Trade.java | 14 ++++++ .../assets/vendingmachine/lang/en_US.lang | 1 + 9 files changed, 75 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 7c6e17f..4104994 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -252,6 +252,7 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { if ( !this.inputCurrencySatisfied(trade.fromCurrency, tradeRequest.playerID) || !this.inputItemsSatisfied(trade.fromItems) + || !this.inputItemsSatisfied(trade.nonConsumedItems) ) { return false; } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 7ed6394..6fa7c44 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -447,21 +447,39 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { // builder.add(new ItemDrawable(toItem.getBaseStack())); } builder.emptyLine(); - builder.addLine( - IKey.str(Translator.translate("vendingmachine.gui.required_inputs")) - .style(IKey.DARK_GREEN, IKey.ITALIC)); - for (CurrencyItem currencyItem : cur.fromCurrency) { + + if (!cur.fromCurrency.isEmpty() || !cur.fromItems.isEmpty()) { builder.addLine( - IKey.str(currencyItem.value + " " + currencyItem.type.getLocalizedName()) - .style(IKey.DARK_GREEN)); + IKey.lang("vendingmachine.gui.required_inputs") + .style(IKey.DARK_GREEN, IKey.ITALIC)); + for (CurrencyItem currencyItem : cur.fromCurrency) { + builder.addLine( + IKey.str(currencyItem.value + " " + currencyItem.type.getLocalizedName()) + .style(IKey.DARK_GREEN)); + } + for (BigItemStack fromItem : cur.fromItems) { + builder.addLine( + IKey.str( + fromItem.stackSize + " " + + fromItem.getBaseStack() + .getDisplayName()) + .style(IKey.DARK_GREEN)); + } } - for (BigItemStack fromItem : cur.fromItems) { + + builder.emptyLine(); + if (!cur.ncItems.isEmpty()) { builder.addLine( - IKey.str( - fromItem.stackSize + " " - + fromItem.getBaseStack() - .getDisplayName()) - .style(IKey.DARK_GREEN)); + IKey.lang("vendingmachine.gui.nc_inputs") + .style(IKey.DARK_GREEN, IKey.ITALIC)); + for (BigItemStack fromItem : cur.ncItems) { + builder.addLine( + IKey.str( + fromItem.stackSize + " " + + fromItem.getBaseStack() + .getDisplayName()) + .style(IKey.DARK_GREEN)); + } } builder.emptyLine(); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java index 6e5e68b..615c3ab 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplay.java @@ -14,6 +14,7 @@ public class TradeItemDisplay { public List fromCurrency; public List fromItems; + public List ncItems; public List toItems; public ItemStack display; public UUID tgID; @@ -24,11 +25,12 @@ public class TradeItemDisplay { public boolean enabled; public boolean tradeableNow; - public TradeItemDisplay(List fromCurrency, List fromItems, List toItems, - ItemStack display, UUID tgID, int tradeGroupOrder, long cooldown, String cooldownText, boolean hasCooldown, - boolean enabled, boolean tradeableNow) { + public TradeItemDisplay(List fromCurrency, List fromItems, List ncItems, + List toItems, ItemStack display, UUID tgID, int tradeGroupOrder, long cooldown, + String cooldownText, boolean hasCooldown, boolean enabled, boolean tradeableNow) { this.fromCurrency = fromCurrency; this.fromItems = fromItems; + this.ncItems = ncItems; this.toItems = toItems; this.display = display; this.tgID = tgID; diff --git a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java deleted file mode 100644 index fcdf3cc..0000000 --- a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.cubefury.vendingmachine.integration.betterquesting.gui; - -import java.util.UUID; - -import com.cubefury.vendingmachine.trade.Trade; -import com.cubefury.vendingmachine.trade.TradeDatabase; -import com.cubefury.vendingmachine.trade.TradeGroup; - -import betterquesting.api2.client.gui.misc.GuiAlign; -import betterquesting.api2.client.gui.misc.GuiTransform; -import betterquesting.api2.client.gui.misc.IGuiRect; -import betterquesting.api2.client.gui.panels.CanvasEmpty; -import betterquesting.api2.client.gui.panels.IGuiPanel; -import betterquesting.api2.client.gui.panels.lists.CanvasScrolling; - -public class BqTradeGroup { - - public static int addTradePanel(CanvasScrolling csReward, IGuiRect rectReward, UUID tradeGroup, int yOffset) { - TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroups() - .get(tradeGroup); - if (tg == null || tg.getTrades() == null) { - return yOffset; - } - for (Trade trade : tg.getTrades()) { - IGuiPanel tradeGui = trade.getTradeGui( - new GuiTransform(GuiAlign.FULL_BOX, 0, 0, rectReward.getWidth(), rectReward.getHeight(), 111)); - if (tradeGui != null) { - tradeGui.initPanel(); - CanvasEmpty tempCanvas = new CanvasEmpty( - new GuiTransform( - GuiAlign.TOP_LEFT, - 0, - yOffset, - rectReward.getWidth(), - tradeGui.getTransform() - .getHeight() - - tradeGui.getTransform() - .getY(), - 1)); - csReward.addPanel(tempCanvas); - tempCanvas.addPanel(tradeGui); - yOffset += tempCanvas.getTransform() - .getHeight(); - } - } - return yOffset; - } -} diff --git a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java index 78dfc7a..39564bc 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/PanelQBTrade.java @@ -42,6 +42,17 @@ public void initPanel() { x_offset += 20; } + for (int i = 0; i < trade.nonConsumedItems.size(); i++) { + BigItemStack stack = trade.nonConsumedItems.get(i) + .toBQBigItemStack(); + GuiRectangle rectangle = new GuiRectangle(x_offset, 0, 18, 18, 0); + PanelItemSlot is = PanelItemSlotBuilder.forValue(stack, rectangle) + .showCount(true) + .build(); + this.addPanel(is); + x_offset += 20; + } + for (int i = 0; i < trade.fromCurrency.size(); i++) { CurrencyItem currencyItem = trade.fromCurrency.get(i); BigItemStack stack = new BigItemStack(currencyItem.getItemRepresentation()); diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index 75ef983..c418567 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -331,6 +331,17 @@ private void loadInputs(Trade trade) { inputs.add(new PositionedStack(extractStacks(stack), x, y)); index++; } + + // TODO: Add NC annotation on top of item + for (BigItemStack stack : trade.nonConsumedItems) { + if (index >= GRID_COUNT) { + break; + } + int x = xOffset + index * SLOT_SIZE; + inputs.add(new PositionedStack(extractStacks(stack), x, y)); + index++; + } + for (CurrencyItem ci : trade.fromCurrency) { if (index >= GRID_COUNT) { break; diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java index 964bf83..8babf1b 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java @@ -82,6 +82,7 @@ public TradeItemDisplay formatItemDisplay() { return new TradeItemDisplay( t.fromCurrency, t.fromItems, + t.nonConsumedItems, t.toItems, t.getDisplayItem(), this.tgID, @@ -133,6 +134,7 @@ public static void syncTradesToClient(@Nonnull EntityPlayerMP player, MTEVending Trade trade = tg.getTrades() .get(i); boolean tradableNow = base.inputItemsSatisfied(trade.fromItems) + && base.inputItemsSatisfied(trade.nonConsumedItems) && base.inputCurrencySatisfied(trade.fromCurrency, playerId); trades.appendTag( new Tradable(tg.getId(), i, cooldownRemaining, enabled, tradableNow) diff --git a/src/main/java/com/cubefury/vendingmachine/trade/Trade.java b/src/main/java/com/cubefury/vendingmachine/trade/Trade.java index e6d0e26..8a3c70b 100644 --- a/src/main/java/com/cubefury/vendingmachine/trade/Trade.java +++ b/src/main/java/com/cubefury/vendingmachine/trade/Trade.java @@ -23,6 +23,7 @@ public class Trade { public final List fromCurrency = new ArrayList<>(); public final List fromItems = new ArrayList<>(); + public final List nonConsumedItems = new ArrayList<>(); public final List toItems = new ArrayList<>(); public BigItemStack displayItem = new BigItemStack(ItemPlaceholder.placeholder); @@ -45,6 +46,14 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setTag("fromItems", fromItemsArray); } + if (!this.nonConsumedItems.isEmpty()) { + NBTTagList ncArray = new NBTTagList(); + for (BigItemStack stack : this.nonConsumedItems) { + ncArray.appendTag(JsonHelper.ItemStackToJson(stack, new NBTTagCompound())); + } + nbt.setTag("nonConsumedItems", ncArray); + } + if (!this.toItems.isEmpty()) { NBTTagList toItemsArray = new NBTTagList(); for (BigItemStack stack : this.toItems) { @@ -73,6 +82,11 @@ public void readFromNBT(NBTTagCompound nbt) { fromItems.add(JsonHelper.JsonToItemStack(fromList.getCompoundTagAt(i))); } + NBTTagList ncList = nbt.getTagList("nonConsumedItems", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < ncList.tagCount(); i++) { + nonConsumedItems.add(JsonHelper.JsonToItemStack(ncList.getCompoundTagAt(i))); + } + NBTTagList toList = nbt.getTagList("toItems", Constants.NBT.TAG_COMPOUND); for (int i = 0; i < toList.tagCount(); i++) { toItems.add(JsonHelper.JsonToItemStack(toList.getCompoundTagAt(i))); diff --git a/src/main/resources/assets/vendingmachine/lang/en_US.lang b/src/main/resources/assets/vendingmachine/lang/en_US.lang index 6c91d26..661c159 100644 --- a/src/main/resources/assets/vendingmachine/lang/en_US.lang +++ b/src/main/resources/assets/vendingmachine/lang/en_US.lang @@ -16,6 +16,7 @@ vendingmachine.gui.coin_eject=Eject All Coins vendingmachine.gui.single_coin_type_eject_hint=Shift-Click to Extract vendingmachine.gui.search=Search vendingmachine.gui.required_inputs=Requires: +vendingmachine.gui.nc_inputs=Requires (Not Consumed): vendingmachine.gui.trade_hint=Shift-Click to Purchase vendingmachine.gui.display_mode=Display: vendingmachine.gui.display_mode_tile=Tiles From b8af72854aac945cf30ffeb4547a580245ce04f1 Mon Sep 17 00:00:00 2001 From: cubefury Date: Thu, 16 Oct 2025 20:55:59 +0800 Subject: [PATCH 63/88] Tidied up extra newlines in tooltips --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 6fa7c44..683c962 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -465,9 +465,8 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { .getDisplayName()) .style(IKey.DARK_GREEN)); } + builder.emptyLine(); } - - builder.emptyLine(); if (!cur.ncItems.isEmpty()) { builder.addLine( IKey.lang("vendingmachine.gui.nc_inputs") @@ -480,9 +479,9 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { .getDisplayName()) .style(IKey.DARK_GREEN)); } + builder.emptyLine(); } - builder.emptyLine(); builder.addLine( IKey.str(Translator.translate("vendingmachine.gui.trade_hint")) .style(IKey.GRAY)); From 760207ab71ddd5ab212b1d2c40ee3af12722d549 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 02:13:34 +0800 Subject: [PATCH 64/88] Fix NEI recipe handler underlines --- .../betterquesting/gui/BqTradeGroup.java | 48 +++++++++++++++++++ .../integration/nei/NeiRecipeHandler.java | 19 ++++++-- 2 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java diff --git a/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java new file mode 100644 index 0000000..fcdf3cc --- /dev/null +++ b/src/main/java/com/cubefury/vendingmachine/integration/betterquesting/gui/BqTradeGroup.java @@ -0,0 +1,48 @@ +package com.cubefury.vendingmachine.integration.betterquesting.gui; + +import java.util.UUID; + +import com.cubefury.vendingmachine.trade.Trade; +import com.cubefury.vendingmachine.trade.TradeDatabase; +import com.cubefury.vendingmachine.trade.TradeGroup; + +import betterquesting.api2.client.gui.misc.GuiAlign; +import betterquesting.api2.client.gui.misc.GuiTransform; +import betterquesting.api2.client.gui.misc.IGuiRect; +import betterquesting.api2.client.gui.panels.CanvasEmpty; +import betterquesting.api2.client.gui.panels.IGuiPanel; +import betterquesting.api2.client.gui.panels.lists.CanvasScrolling; + +public class BqTradeGroup { + + public static int addTradePanel(CanvasScrolling csReward, IGuiRect rectReward, UUID tradeGroup, int yOffset) { + TradeGroup tg = TradeDatabase.INSTANCE.getTradeGroups() + .get(tradeGroup); + if (tg == null || tg.getTrades() == null) { + return yOffset; + } + for (Trade trade : tg.getTrades()) { + IGuiPanel tradeGui = trade.getTradeGui( + new GuiTransform(GuiAlign.FULL_BOX, 0, 0, rectReward.getWidth(), rectReward.getHeight(), 111)); + if (tradeGui != null) { + tradeGui.initPanel(); + CanvasEmpty tempCanvas = new CanvasEmpty( + new GuiTransform( + GuiAlign.TOP_LEFT, + 0, + yOffset, + rectReward.getWidth(), + tradeGui.getTransform() + .getHeight() + - tradeGui.getTransform() + .getY(), + 1)); + csReward.addPanel(tempCanvas); + tempCanvas.addPanel(tradeGui); + yOffset += tempCanvas.getTransform() + .getHeight(); + } + } + return yOffset; + } +} diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index c418567..b8e44be 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -47,6 +47,7 @@ import codechicken.nei.api.API; import codechicken.nei.recipe.GuiCraftingRecipe; import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.GuiRecipeCatalyst; import codechicken.nei.recipe.TemplateRecipeHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Optional; @@ -197,8 +198,12 @@ public boolean isMouseOverBqCondition(int recipeIndex, int curY, UUID questId, S Point pos = GuiDraw.getMousePosition(); - int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; - int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().w) / 2; + // very cursed I'm sorry :doom: + GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); + + int guiLeft = catalystWidget.x + catalystWidget.w - 6; + int guiTop = catalystWidget.y + 9; + Point relMousePos = new Point(pos.x - guiLeft - offset.x, pos.y - guiTop - offset.y); Rectangle textArea = new Rectangle(2, curY - GuiDraw.fontRenderer.FONT_HEIGHT, width + 2, height + 1); if (textArea.contains(relMousePos)) { @@ -214,8 +219,10 @@ public boolean isMouseOnLastHovered(GuiRecipe gui, int recipeIndex) { if (lastHoveredTextArea == null || lastHoveredQuestId == null || lastHoveredRecipeIndex != recipeIndex) { return false; } - int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; - int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().h) / 2; + GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); + + int guiLeft = catalystWidget.x + catalystWidget.w - 6; + int guiTop = catalystWidget.y + 9; Point offset = gui.getRecipePosition(recipeIndex); Point pos = GuiDraw.getMousePosition(); @@ -286,7 +293,9 @@ public void drawExtras(int recipeIndex) { } else { String translatedQuestKey = getTextWithoutFormattingCodes( QuestTranslation.translateQuestName(questId, quest)); - unformatted.append(translatedQuestKey); + unformatted.append( + translatedQuestKey.length() <= 18 ? translatedQuestKey + : translatedQuestKey.substring(0, 18) + "..."); requirementString.append( isMouseOverBqCondition(recipeIndex, y, questId, unformatted.toString()) ? UNDERLINE : ""); requirementString.append(unformatted); From d9d70d6f0f86531ced29eb014fb9b224c1307779 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 13:06:41 +0800 Subject: [PATCH 65/88] Revert out of scope recipe handler change. --- .../integration/nei/NeiRecipeHandler.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index b8e44be..c418567 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -47,7 +47,6 @@ import codechicken.nei.api.API; import codechicken.nei.recipe.GuiCraftingRecipe; import codechicken.nei.recipe.GuiRecipe; -import codechicken.nei.recipe.GuiRecipeCatalyst; import codechicken.nei.recipe.TemplateRecipeHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Optional; @@ -198,12 +197,8 @@ public boolean isMouseOverBqCondition(int recipeIndex, int curY, UUID questId, S Point pos = GuiDraw.getMousePosition(); - // very cursed I'm sorry :doom: - GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); - - int guiLeft = catalystWidget.x + catalystWidget.w - 6; - int guiTop = catalystWidget.y + 9; - + int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; + int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().w) / 2; Point relMousePos = new Point(pos.x - guiLeft - offset.x, pos.y - guiTop - offset.y); Rectangle textArea = new Rectangle(2, curY - GuiDraw.fontRenderer.FONT_HEIGHT, width + 2, height + 1); if (textArea.contains(relMousePos)) { @@ -219,10 +214,8 @@ public boolean isMouseOnLastHovered(GuiRecipe gui, int recipeIndex) { if (lastHoveredTextArea == null || lastHoveredQuestId == null || lastHoveredRecipeIndex != recipeIndex) { return false; } - GuiRecipeCatalyst catalystWidget = gui.getRecipeCatalystWidget(); - - int guiLeft = catalystWidget.x + catalystWidget.w - 6; - int guiTop = catalystWidget.y + 9; + int guiLeft = (gui.width - gui.getRecipeCatalystWidget().w) / 2; + int guiTop = 19 + (gui.height - gui.getRecipeCatalystWidget().h) / 2; Point offset = gui.getRecipePosition(recipeIndex); Point pos = GuiDraw.getMousePosition(); @@ -293,9 +286,7 @@ public void drawExtras(int recipeIndex) { } else { String translatedQuestKey = getTextWithoutFormattingCodes( QuestTranslation.translateQuestName(questId, quest)); - unformatted.append( - translatedQuestKey.length() <= 18 ? translatedQuestKey - : translatedQuestKey.substring(0, 18) + "..."); + unformatted.append(translatedQuestKey); requirementString.append( isMouseOverBqCondition(recipeIndex, y, questId, unformatted.toString()) ? UNDERLINE : ""); requirementString.append(unformatted); From 61ad4b7dfd38e0a31fbf9f994e4d77d66ee30220 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 17:01:36 +0800 Subject: [PATCH 66/88] Update GT package to reference new location of MTEMultiBlockBaseGui --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index f47c98e..bc4f74d 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -56,9 +56,9 @@ import com.cubefury.vendingmachine.util.BigItemStack; import com.cubefury.vendingmachine.util.Translator; -import gregtech.api.metatileentity.implementations.gui.MTEMultiBlockBaseGui; import gregtech.api.modularui2.GTGuiTextures; import gregtech.api.modularui2.GTWidgetThemes; +import gregtech.common.gui.modularui.multiblock.base.MTEMultiBlockBaseGui; public class MTEVendingMachineGui extends MTEMultiBlockBaseGui { @@ -492,12 +492,11 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller tabController) { PagedWidget paged = new PagedWidget<>() .width(162) - .debugName("paged") .controller(tabController) .background(GuiTextures.TEXT_FIELD_BACKGROUND) .height(146); for (TradeCategory category : this.tradeCategories) { - ListWidget tradeList = new ListWidget<>().debugName("items") + ListWidget tradeList = new ListWidget<>() .width(161) .top(1) .height(144) @@ -602,7 +601,7 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel, PanelSyncManager sy } private IWidget createCoinDisplay(TradeMainPanel panel, CurrencyType type, PanelSyncManager syncManager) { - IntSyncValue coinSyncValue = ((IntSyncValue) syncManager.getSyncHandler("coinAmount_" + type.id + ":0")); + IntSyncValue coinSyncValue = syncManager.findSyncHandler("coinAmount_" + type.id, 0, IntSyncValue.class); return new Row().child( new CoinButton(panel, type).overlay( type.texture.asIcon() From 3abb3d4ef8adb0ec9cecadb243f34dc05ea55d82 Mon Sep 17 00:00:00 2001 From: cubefury Date: Fri, 17 Oct 2025 17:05:23 +0800 Subject: [PATCH 67/88] Address comments --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index bc4f74d..683c962 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -491,12 +491,14 @@ private void constructTradeTooltip(RichTooltip builder, TradeItemDisplay cur) { // spotless:off private IWidget createTradeUI(TradeMainPanel rootPanel, PagedWidget.Controller tabController) { PagedWidget paged = new PagedWidget<>() + .name("paged") .width(162) .controller(tabController) .background(GuiTextures.TEXT_FIELD_BACKGROUND) .height(146); for (TradeCategory category : this.tradeCategories) { ListWidget tradeList = new ListWidget<>() + .name("items") .width(161) .top(1) .height(144) @@ -601,7 +603,7 @@ private IWidget createCoinInventoryRow(TradeMainPanel panel, PanelSyncManager sy } private IWidget createCoinDisplay(TradeMainPanel panel, CurrencyType type, PanelSyncManager syncManager) { - IntSyncValue coinSyncValue = syncManager.findSyncHandler("coinAmount_" + type.id, 0, IntSyncValue.class); + IntSyncValue coinSyncValue = syncManager.findSyncHandler("coinAmount_" + type.id, 0, IntSyncValue.class); return new Row().child( new CoinButton(panel, type).overlay( type.texture.asIcon() From 87c12bbf9aeab0c4329183140077071dd464c12b Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Fri, 17 Oct 2025 17:05:10 +0200 Subject: [PATCH 68/88] update --- dependencies.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 78b21d2..0c9dec4 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.15-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.16-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.10-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.3.3-1.7.10:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.4-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.45:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.55:dev") } // deps may transitively add Baubles, so we replace it From f44cae1a89d0553b4a875ac5eaa23d6f3e8652be Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 02:39:25 +0800 Subject: [PATCH 69/88] formatted nei display with more rows --- .../integration/nei/NeiRecipeHandler.java | 30 ++++++++++-------- .../vendingmachine/textures/gui/nei.png | Bin 4280 -> 4551 bytes 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index ca8acac..a0831c4 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -59,7 +59,7 @@ public class NeiRecipeHandler extends TemplateRecipeHandler { private static final int GUI_WIDTH = 166; private static final int GRID_COUNT = 4; private static final int LINE_SPACE = GuiDraw.fontRenderer.FONT_HEIGHT + 1; - private static final int CONDITIONS_START_Y = 27 + LINE_SPACE; + private static final int CONDITIONS_START_Y = 63 + LINE_SPACE; private UUID currentPlayerId; private int textColorConditionDefault; private int textColorConditionSatisfied; @@ -179,7 +179,7 @@ public String getGuiTexture() { public void drawBackground(int recipe) { GL11.glColor4f(1, 1, 1, 1); changeTexture(getGuiTexture()); - drawTexturedModalRect(0, 0, 0, 0, GUI_WIDTH, 105); + drawTexturedModalRect(0, 0, 0, 0, GUI_WIDTH, 140); } // Caching the last hovered valid quest here is a bit jank, but it works I guess @@ -348,30 +348,36 @@ private void loadInputs(Trade trade) { int index = 0; for (BigItemStack stack : trade.fromItems) { if (index >= GRID_COUNT) { - break; + y += SLOT_SIZE; + index = 0; } int x = xOffset + index * SLOT_SIZE; inputs.add(new PositionedStack(extractStacks(stack), x, y)); index++; } - for (BigItemStack stack : trade.nonConsumedItems) { + for (CurrencyItem ci : trade.fromCurrency) { if (index >= GRID_COUNT) { - break; + y += SLOT_SIZE; + index = 0; } int x = xOffset + index * SLOT_SIZE; - ncInputs.add(new PositionedStack(extractStacks(stack), x, y)); + inputs.add(new PositionedStack(ci.getItemRepresentation(), x, y)); index++; } - for (CurrencyItem ci : trade.fromCurrency) { + y += SLOT_SIZE; + index = 0; + for (BigItemStack stack : trade.nonConsumedItems) { if (index >= GRID_COUNT) { - break; + y += SLOT_SIZE; + index = 0; } int x = xOffset + index * SLOT_SIZE; - inputs.add(new PositionedStack(ci.getItemRepresentation(), x, y)); + ncInputs.add(new PositionedStack(extractStacks(stack), x, y)); index++; } + } private void loadOutputs(Trade trade) { @@ -404,14 +410,10 @@ public List getIngredients() { public List getOtherStacks() { return outputs; } - - public List getNcInputs() { - return ncInputs; - } } @Override public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(75, 0, 16, 24), getOverlayIdentifier())); + transferRects.add(new RecipeTransferRect(new Rectangle(75, 16, 16, 24), getOverlayIdentifier())); } } diff --git a/src/main/resources/assets/vendingmachine/textures/gui/nei.png b/src/main/resources/assets/vendingmachine/textures/gui/nei.png index be099bde14db6222697f5ecd7b4d17806ae14222..bf64099b320ec883d2f8e35c8bb70c402a52e54e 100644 GIT binary patch delta 1790 zcmdm?cwBkIJ+6AT%bqTdAr*7p-i^%*4wq=VSgWv8ZxIjM5fdB1CdX7h9@V9bls!K1 zAGX@NV$wFPt>(U8zcuHtW!&Qwt=|9U$UU9oj|*i3&UB0GPy7G-{)K}|3?V8El1vVs zOcN9trl2yvGgf?kb+!4p+3d4B_U-$pS01;ozUJqHxrTE-@0`24SgfIEKTE>qn>HCa zyYKcrKR>^Iy7hef`nn6pWS`emJ%2ZcRUz3@hVS(z9l0~c)=U#_3O494&bTAkaHfwT zh4a7@AX&zu;LV^`&Z4kcnIV$NV5c&}Oj*VgpTZkX0;x9~4$~NX-f=jjxif5HNhoq> zFtV;^nxM)snH0l>FwJ_$Twoz{tZaAfhX=pEzu$j)?td+Yb3aWOPZTL%c+w}`Xk?wo za_W;2F){m&eGcZ4aG z9t_8RC?hlhT{5#CXk(G?k0*Wi89{-U4GLe0@7`ry>)~%DX*>>{^OisFS)3m#J+wH2poQMV*b&n~fY!B0k zsBgdj?$YUIm;*Ey6yLh-f9qtK3d%r{$TZ>U#j5h zu-w7z=}x uFoIK$!lOT@9^FB7c0w7JFrlgw>X>tu{_L21rXi962s~Z=T-G@yGywoge`sI; delta 1517 zcmX@EyhCxrJ+6AzBc3jfAr*7p-c9tA4wqhkcBN?*Jq()w|T+aSX*qSL| zvogb0mW0RWrZMQ8{`6!%*SVix`WUVVHS}6XGaDSUkYs#bQ{~Q(#d+Y^-1nRZB>u}G z3-BJ0xZl@MTyM7*Xi5#&hQjCjSrU5c-40mJzbDub#RL@i*!Xj;`p@8hQb_uq0~OgT zKbYhHp2IWT%--$bUyufIgKRm|wKq^ryW#Tn zKg<$923WBrL{2NLt^NDv;OyD6<%^#G=V~an^JU2T>1hB8Iwl8irT}M#3{QqE4hCIL z2VTYnsyM?LNwG}5n2eQRgH&{-K`(HYbA>8y>T;wyu7e-3U!3^$e!Z68Fa+p98V<-@liae|?^9 z{`k+IKTFrM_5oe{=j*q!+TY*a{&@NI_4IvW7Qn#xyuDxkdi=e;(!1}zgQ~jo{`>1M zatvpIZnEFUV{&W;lY=r-z~Np8w1hYVlw5bM1KS1)&U%KdAI}${DMAVpGJ>3>_^BsJ zH5C*eiwQqp@1e>d;KQIWgTbNRfUzNgiQym%LlY+hi!cL+8cc>h67>UWdqYC~0Qw!| e^;9Z{d@ZYc^eUh9nHSO+fWXt$&t;ucLK6VTDd+0| From 33eafc7bfd153d73182756f6730ad382118bf570 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 02:42:41 +0800 Subject: [PATCH 70/88] Fix element positions --- .../vendingmachine/integration/nei/NeiRecipeHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java index a0831c4..abb1921 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NeiRecipeHandler.java @@ -287,7 +287,7 @@ public void drawExtras(int recipeIndex) { GuiDraw.drawString( Translator.translate("vendingmachine.gui.requirementHeader"), 2, - 27, + 63, textColorConditionDefault, false); int y = CONDITIONS_START_Y; @@ -414,6 +414,6 @@ public List getOtherStacks() { @Override public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(75, 16, 16, 24), getOverlayIdentifier())); + transferRects.add(new RecipeTransferRect(new Rectangle(75, 5, 16, 55), getOverlayIdentifier())); } } From 3664069c84b9bc28694469b675da7c7ea45395fe Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Fri, 17 Oct 2025 22:37:06 +0200 Subject: [PATCH 71/88] update --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 0c9dec4..a09c502 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.16-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.18-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.10-GTNH:dev") implementation("com.github.GTNewHorizons:ModularUI2:2.3.4-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.55:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.57:dev") } // deps may transitively add Baubles, so we replace it From f3a46e8e020018955b48747e8f713927f97ce738 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 12:03:21 +0800 Subject: [PATCH 72/88] Disable trades and trade UI refresh when machine unforms --- .../vendingmachine/blocks/MTEVendingMachine.java | 8 ++++++-- .../blocks/gui/MTEVendingMachineGui.java | 4 ++-- .../blocks/gui/TradeItemDisplayWidget.java | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 4104994..4795359 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -151,7 +151,7 @@ public boolean usingAnimations() { public void sendTradeRequest(TradeItemDisplay trade) { IGregTechTileEntity baseTile = getBaseMetaTileEntity(); - if (baseTile == null) { + if (baseTile == null || !baseTile.isActive()) { return; } NetTradeRequestSync.sendTradeRequest( @@ -167,6 +167,10 @@ public void addTradeRequest(TradeRequest trade) { } public void dispenseItems() { + IGregTechTileEntity base = this.getBaseMetaTileEntity(); + if (base == null || !base.isActive()) { + return; + } if (!this.pendingTrades.isEmpty()) { TradeRequest tradeRequest = this.pendingTrades.poll(); if (!processTradeOnServer(tradeRequest)) { @@ -548,7 +552,7 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { } if (aBaseMetaTileEntity.isServerSide()) { dispenseItems(); - if (this.ticksSinceTradeUpdate++ >= Config.gui_refresh_interval) { + if (aBaseMetaTileEntity.isActive() && this.ticksSinceTradeUpdate++ >= Config.gui_refresh_interval) { this.sendTradeUpdate(); } if (this.mUpdate++ % STRUCTURE_CHECK_TICKS == 0) { diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 683c962..931c39b 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -134,12 +134,12 @@ public MTEVendingMachineGui(MTEVendingMachine base) { displayedTradesTiles.put(c, new ArrayList<>(MTEVendingMachine.MAX_TRADES)); for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { displayedTradesTiles.get(c) - .add(new TradeItemDisplayWidget(null, TradeItemDisplayWidget.DisplayType.TILE)); + .add(new TradeItemDisplayWidget(null, this.base, TradeItemDisplayWidget.DisplayType.TILE)); } displayedTradesList.put(c, new ArrayList<>(MTEVendingMachine.MAX_TRADES)); for (int i = 0; i < MTEVendingMachine.MAX_TRADES; i++) { displayedTradesList.get(c) - .add(new TradeItemDisplayWidget(null, TradeItemDisplayWidget.DisplayType.LIST)); + .add(new TradeItemDisplayWidget(null, this.base, TradeItemDisplayWidget.DisplayType.LIST)); } } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index fccdf13..c4391be 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -20,10 +20,13 @@ import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.ItemDisplayWidget; +import com.cubefury.vendingmachine.blocks.MTEVendingMachine; import com.cubefury.vendingmachine.gui.GuiTextures; import com.cubefury.vendingmachine.gui.WidgetThemes; import com.cubefury.vendingmachine.util.Translator; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + public class TradeItemDisplayWidget extends ItemDisplayWidget implements Interactable { public enum DisplayType { @@ -49,6 +52,7 @@ public Icon getTexture() { } } + private IGregTechTileEntity baseMTE; private TradeMainPanel rootPanel; private boolean pressed = false; private IValue value; @@ -56,7 +60,8 @@ public Icon getTexture() { private TradeItemDisplay display; - public TradeItemDisplayWidget(TradeItemDisplay display, DisplayType displayType) { + public TradeItemDisplayWidget(TradeItemDisplay display, MTEVendingMachine base, DisplayType displayType) { + this.baseMTE = base.getBaseMetaTileEntity(); this.displayType = displayType; widgetTheme(WidgetThemes.THEME_TRADE_BUTTON); if (displayType == DisplayType.TILE) { @@ -82,6 +87,10 @@ public void setDisplay(TradeItemDisplay display) { this.item(display == null ? null : display.display); } + private boolean checkVmActive() { + return this.baseMTE != null && this.baseMTE.isActive(); + } + public TradeItemDisplay getDisplay() { return this.display; } @@ -106,7 +115,7 @@ public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { if (this.display.tradeableNow) { GuiDraw.drawOutline(1, 1, 45, 23, 0x883CFF00, 2); } - if (this.display.hasCooldown || !this.display.enabled) { + if (!this.checkVmActive() || this.display.hasCooldown || !this.display.enabled) { GuiDraw.drawRoundedRect( 1, 1, @@ -139,7 +148,7 @@ public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { 3, MTEVendingMachineGui.LIST_ITEM_HEIGHT - 3, this.display.tradeableNow ? 0x883CFF00 : 0x88333333); - if (this.display.hasCooldown || !this.display.enabled) { + if (!this.checkVmActive() || this.display.hasCooldown || !this.display.enabled) { GuiDraw.drawRect( 1, 1, From 654a52cfcad810ded934dde0b9455cad2f0aafb5 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 12:12:08 +0800 Subject: [PATCH 73/88] Removed clunky baseMTE reference --- .../vendingmachine/blocks/gui/TradeItemDisplayWidget.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java index c4391be..5125b14 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/TradeItemDisplayWidget.java @@ -25,8 +25,6 @@ import com.cubefury.vendingmachine.gui.WidgetThemes; import com.cubefury.vendingmachine.util.Translator; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; - public class TradeItemDisplayWidget extends ItemDisplayWidget implements Interactable { public enum DisplayType { @@ -52,7 +50,7 @@ public Icon getTexture() { } } - private IGregTechTileEntity baseMTE; + private MTEVendingMachine vm; private TradeMainPanel rootPanel; private boolean pressed = false; private IValue value; @@ -61,7 +59,7 @@ public Icon getTexture() { private TradeItemDisplay display; public TradeItemDisplayWidget(TradeItemDisplay display, MTEVendingMachine base, DisplayType displayType) { - this.baseMTE = base.getBaseMetaTileEntity(); + this.vm = base; this.displayType = displayType; widgetTheme(WidgetThemes.THEME_TRADE_BUTTON); if (displayType == DisplayType.TILE) { @@ -88,7 +86,7 @@ public void setDisplay(TradeItemDisplay display) { } private boolean checkVmActive() { - return this.baseMTE != null && this.baseMTE.isActive(); + return this.vm != null && this.vm.getActive(); } public TradeItemDisplay getDisplay() { From 803d62cfb5305c32f3d0160ed2d7464f96ff00ad Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 12:38:56 +0800 Subject: [PATCH 74/88] Disabled coin insert/eject when vm is not formed --- .../blocks/gui/InterceptingSlot.java | 9 ++++++++- .../blocks/gui/MTEVendingMachineGui.java | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java index 2a869f0..a340e1c 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/InterceptingSlot.java @@ -5,18 +5,25 @@ import com.cleanroommc.modularui.utils.item.ItemStackHandler; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cubefury.vendingmachine.blocks.MTEVendingMachine; import com.cubefury.vendingmachine.storage.NameCache; import com.cubefury.vendingmachine.trade.CurrencyItem; import com.cubefury.vendingmachine.trade.TradeManager; public class InterceptingSlot extends ModularSlot { - public InterceptingSlot(ItemStackHandler inputItems, int index) { + private MTEVendingMachine vm; + + public InterceptingSlot(ItemStackHandler inputItems, int index, MTEVendingMachine vm) { super(inputItems, index); + this.vm = vm; } // intercept item on both ends, but only do the post-intercept actions on server side public boolean intercept(ItemStack newItem, boolean client, EntityPlayer player) { + if (vm == null || !vm.getActive()) { + return false; + } CurrencyItem mapped = mapToCurrency(newItem); if (mapped != null) { this.putStack(null); diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index 931c39b..d6f5632 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -287,7 +287,7 @@ private SearchBar createSearchBar() { // Eject code is in GUI instead of MTE since the syncers are per-gui instance private void doEjectCoin(CurrencyType type) { - if (this.guiData.isClient()) { + if (this.guiData.isClient() || this.base == null || !this.base.getActive()) { return; } UUID currentUser = NameCache.INSTANCE.getUUIDFromPlayer(base.getCurrentUser()); @@ -314,6 +314,11 @@ private void doEjectCoins() { return; } + if (!this.base.getActive()) { + ejectCoins = false; + return; + } + UUID currentUser = NameCache.INSTANCE.getUUIDFromPlayer(base.getCurrentUser()); if (!TradeManager.INSTANCE.playerCurrency.containsKey(currentUser)) { ejectCoins = false; @@ -335,6 +340,11 @@ private void doEjectItems() { if (this.guiData.isClient()) { return; } + if (!this.base.getActive()) { + ejectItems = false; + return; + } + for (int i = 0; i < MTEVendingMachine.INPUT_SLOTS; i++) { ItemStack stack = base.inputItems.getStackInSlot(i); if (stack != null) { @@ -395,7 +405,7 @@ private SlotGroupWidget createInputSlots() { return SlotGroupWidget.builder() .matrix("II", "II", "II") .key('I', index -> { - InterceptingSlot slot = new InterceptingSlot(base.inputItems, index); + InterceptingSlot slot = new InterceptingSlot(base.inputItems, index, this.base); this.inputSlots.add(slot); return new ItemSlot().slot( slot.slotGroup("inputSlotGroup") From 01ed57a4c2c236661e1b17dfd137f0537902bd4b Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 12:45:13 +0800 Subject: [PATCH 75/88] swapped to getActive() --- .../com/cubefury/vendingmachine/blocks/MTEVendingMachine.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 4795359..002f38f 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -167,8 +167,7 @@ public void addTradeRequest(TradeRequest trade) { } public void dispenseItems() { - IGregTechTileEntity base = this.getBaseMetaTileEntity(); - if (base == null || !base.isActive()) { + if (!this.getActive()) { return; } if (!this.pendingTrades.isEmpty()) { From b345def5cb62a850f0f8ef8a368f074202c56554 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 12:48:15 +0800 Subject: [PATCH 76/88] Removed unnecessary null check --- .../vendingmachine/blocks/gui/MTEVendingMachineGui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java index d6f5632..02798a3 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/gui/MTEVendingMachineGui.java @@ -287,7 +287,7 @@ private SearchBar createSearchBar() { // Eject code is in GUI instead of MTE since the syncers are per-gui instance private void doEjectCoin(CurrencyType type) { - if (this.guiData.isClient() || this.base == null || !this.base.getActive()) { + if (this.guiData.isClient() || !this.base.getActive()) { return; } UUID currentUser = NameCache.INSTANCE.getUUIDFromPlayer(base.getCurrentUser()); From 528796bab0cb4672f99c0f74089e4004213e28af Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 12:51:33 +0800 Subject: [PATCH 77/88] missed one --- .../com/cubefury/vendingmachine/blocks/MTEVendingMachine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 002f38f..d38077b 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -551,7 +551,7 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) { } if (aBaseMetaTileEntity.isServerSide()) { dispenseItems(); - if (aBaseMetaTileEntity.isActive() && this.ticksSinceTradeUpdate++ >= Config.gui_refresh_interval) { + if (this.getActive() && this.ticksSinceTradeUpdate++ >= Config.gui_refresh_interval) { this.sendTradeUpdate(); } if (this.mUpdate++ % STRUCTURE_CHECK_TICKS == 0) { From 94e2a3a4f0308261b18a29887f1566cf3e8df2a4 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 13:08:57 +0800 Subject: [PATCH 78/88] reduced max recipes per page --- .../com/cubefury/vendingmachine/integration/nei/NEIConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java index 730f565..de47849 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java @@ -34,7 +34,7 @@ public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) { event.registerHandlerInfo( new HandlerInfo.Builder("vendingmachine", VendingMachine.NAME, VendingMachine.MODID).setHeight(104) .setWidth(166) - .setMaxRecipesPerPage(3) + .setMaxRecipesPerPage(2) .setDisplayStack(VMItems.vendingMachine) .build()); } From e5994ad261a2ad9c12a91ec6e29173cdd1861f80 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sat, 18 Oct 2025 13:11:51 +0800 Subject: [PATCH 79/88] Changed UI height --- .../cubefury/vendingmachine/integration/nei/NEIConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java b/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java index de47849..cfcc638 100644 --- a/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java +++ b/src/main/java/com/cubefury/vendingmachine/integration/nei/NEIConfig.java @@ -32,9 +32,9 @@ public String getVersion() { @SubscribeEvent public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) { event.registerHandlerInfo( - new HandlerInfo.Builder("vendingmachine", VendingMachine.NAME, VendingMachine.MODID).setHeight(104) + new HandlerInfo.Builder("vendingmachine", VendingMachine.NAME, VendingMachine.MODID).setHeight(140) .setWidth(166) - .setMaxRecipesPerPage(2) + .setMaxRecipesPerPage(3) .setDisplayStack(VMItems.vendingMachine) .build()); } From 733d8a4c821ef32bc010c91f21c7a9be89fb3e4b Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Sat, 18 Oct 2025 14:04:23 +0200 Subject: [PATCH 80/88] update --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a09c502..6eaa03a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -40,7 +40,7 @@ dependencies { implementation("com.github.GTNewHorizons:ModularUI2:2.3.4-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.57:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.59:dev") } // deps may transitively add Baubles, so we replace it From 18ae904dd760d669de0e6e3a3d0182eca9bd1ac5 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 19 Oct 2025 03:30:48 +0800 Subject: [PATCH 81/88] ignore nbt --- .../cubefury/vendingmachine/blocks/MTEVendingMachine.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index d38077b..c3d4ca7 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -284,6 +284,7 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { for (BigItemStack stack : trade.fromItems) { ItemStack requiredStack = stack.getBaseStack() .copy(); + requiredStack.setTagCompound(null); requiredStack.stackSize = 1; // just in case it's not pulled as 1 for some reason int requiredAmount = stack.stackSize; // Remove Items from last stacks if possible @@ -293,10 +294,7 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { } ItemStack tmp = inputSlots[i].copy(); tmp.stackSize = 1; - if ( - ItemStack.areItemStacksEqual(requiredStack, tmp) - && ItemStack.areItemStackTagsEqual(requiredStack, tmp) - ) { + if (ItemStack.areItemStacksEqual(requiredStack, tmp)) { if (requiredAmount >= inputSlots[i].stackSize) { requiredAmount -= inputSlots[i].stackSize; inputSlots[i] = null; @@ -575,6 +573,7 @@ public void refreshInputSlotCache() { ItemStack stack = this.inputItems.getStackInSlot(i); if (stack != null) { BigItemStack tmp = new BigItemStack(stack); + tmp.setTagCompound(null); tmp.stackSize = 1; items.putIfAbsent(tmp, 0); items.replace(tmp, items.get(tmp) + stack.stackSize); @@ -586,6 +585,7 @@ public void refreshInputSlotCache() { public boolean inputItemsSatisfied(List fromItems) { for (BigItemStack bis : fromItems) { BigItemStack base = bis.copy(); + bis.setTagCompound(null); base.stackSize = 1; // shouldn't need this, but just in case ItemStack aeStackSearch = base.getBaseStack(); From ae4a89ba34be3a65fd23733bbe224cd2618d320c Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 19 Oct 2025 17:15:06 +0800 Subject: [PATCH 82/88] Ignore NBT for items in ME system --- .../blocks/MTEVendingMachine.java | 6 ++ .../blocks/MTEVendingUplinkHatch.java | 99 ++++++++++++++++++- .../network/handlers/NetTradeDisplaySync.java | 1 + 3 files changed, 101 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index c3d4ca7..7e767fd 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -753,4 +753,10 @@ private boolean addUplinkHatch(IGregTechTileEntity aBaseMetaTileEntity, int aBas this.uplinkHatches.add(uplinkHatch); return true; } + + public void refreshMeItemCache() { + for (MTEVendingUplinkHatch hatch : this.uplinkHatches) { + hatch.refreshStorageContents(); + } + } } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index d190276..77f9867 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -3,7 +3,9 @@ import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_0; import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_1; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -14,6 +16,7 @@ import com.cubefury.vendingmachine.items.VMItems; import appeng.api.config.Actionable; +import appeng.api.config.FuzzyMode; import appeng.api.implementations.IPowerChannelState; import appeng.api.networking.GridFlags; import appeng.api.networking.IGridNode; @@ -21,11 +24,13 @@ import appeng.api.networking.security.MachineSource; import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; import appeng.me.GridAccessException; import appeng.me.helpers.AENetworkProxy; import appeng.me.helpers.IGridProxyable; +import appeng.util.IterationCounter; import appeng.util.item.AEItemStack; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; @@ -37,6 +42,7 @@ public class MTEVendingUplinkHatch extends MTEHatch implements IGridProxyable, I protected AENetworkProxy gridProxy = null; protected boolean additionalConnection = false; + private IItemList cachedItems; public static final int mTier = 3; @@ -172,15 +178,98 @@ private IStorageGrid accessStorage() { return null; } + public void refreshStorageContents() { + IStorageGrid storage = accessStorage(); + if (storage == null) return; + + cachedItems = storage.getItemInventory() + .getStorageList(); + } + public boolean removeItem(ItemStack remove, boolean simulate) { if (remove == null || remove.stackSize <= 0) return true; IStorageGrid storage = accessStorage(); if (storage == null) return false; - IAEItemStack stack = storage.getItemInventory() - .extractItems( + + MachineSource source = new MachineSource(this); + if (!remove.isItemStackDamageable()) { + IAEItemStack stack = storage.getItemInventory() + .extractItems(AEItemStack.create(remove), simulate ? Actionable.SIMULATE : Actionable.MODULATE, source); + return stack != null && stack.getStackSize() >= remove.stackSize; + } + VendingMachine.LOG.info("target remove: {}", remove); + + List outputList = new ArrayList<>(); + for (IAEItemStack stack : cachedItems) { + if (stack.getItem() == remove.getItem() && stack.getItemDamage() == remove.getItemDamage()) { + outputList.add(stack); + } + } + + // test + List result = new ArrayList<>(); + storage.getItemInventory() + .getSortedFuzzyItems( + result, + AEItemStack.create(remove), + FuzzyMode.IGNORE_ALL, + IterationCounter.fetchNewId()); + VendingMachine.LOG.info( + "found {} matched items with fuzzy search IGNOREALL", + result.stream() + .mapToLong(s -> s.getStackSize()) + .sum()); + + result = new ArrayList<>(); + storage.getItemInventory() + .getSortedFuzzyItems( + result, AEItemStack.create(remove), - simulate ? Actionable.SIMULATE : Actionable.MODULATE, - new MachineSource(this)); - return stack != null && stack.getStackSize() >= remove.stackSize; + FuzzyMode.PERCENT_99, + IterationCounter.fetchNewId()); + VendingMachine.LOG.info( + "found {} matched items with fuzzy search 99", + result.stream() + .mapToLong(s -> s.getStackSize()) + .sum()); + + // endtest + + long numMatch = outputList.stream() + .mapToLong(stack -> stack.getStackSize()) + .sum(); + VendingMachine.LOG.info("found {} matched items", numMatch); + if (simulate || numMatch < remove.stackSize) { + return numMatch >= remove.stackSize; + } + + // Simulate removing the needed count first, and add successful to modulateList for actual removal, + // due to possible view-only items that can't be actually extracted + long remain = remove.stackSize; + List modulateList = new ArrayList<>(); + for (IAEItemStack removable : outputList) { + long toRemove = Math.min(removable.getStackSize(), remain); + removable.setStackSize(toRemove); + IAEItemStack stack = storage.getItemInventory() + .extractItems(removable, Actionable.SIMULATE, source); + if (stack != null && stack.getItemDamage() == remove.getItemDamage()) { + modulateList.add(stack); + } else { + continue; + } + remain -= toRemove; + if (remain <= 0) { + break; + } + } + if (remain > 0) { + return false; + } + + for (IAEItemStack modulate : modulateList) { + storage.getItemInventory() + .extractItems(modulate, Actionable.MODULATE, source); + } + return true; } } diff --git a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java index 8babf1b..4ac7275 100644 --- a/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java +++ b/src/main/java/com/cubefury/vendingmachine/network/handlers/NetTradeDisplaySync.java @@ -112,6 +112,7 @@ public static void syncTradesToClient(@Nonnull EntityPlayerMP player, MTEVending UUID playerId = NameCache.INSTANCE.getUUIDFromPlayer(player); List availableGroups = TradeManager.INSTANCE.getAvailableTradeGroups(playerId); base.refreshInputSlotCache(); + base.refreshMeItemCache(); long currentTimestamp = System.currentTimeMillis(); From adf454b67b332dcb1282f9dede857136497b5715 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 19 Oct 2025 17:27:12 +0800 Subject: [PATCH 83/88] Removed experimental code and added null check for cached items --- .../blocks/MTEVendingUplinkHatch.java | 35 +++---------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index 77f9867..2082323 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -197,7 +197,10 @@ public boolean removeItem(ItemStack remove, boolean simulate) { .extractItems(AEItemStack.create(remove), simulate ? Actionable.SIMULATE : Actionable.MODULATE, source); return stack != null && stack.getStackSize() >= remove.stackSize; } - VendingMachine.LOG.info("target remove: {}", remove); + + if (cachedItems == null) { + return false; + } List outputList = new ArrayList<>(); for (IAEItemStack stack : cachedItems) { @@ -206,39 +209,9 @@ public boolean removeItem(ItemStack remove, boolean simulate) { } } - // test - List result = new ArrayList<>(); - storage.getItemInventory() - .getSortedFuzzyItems( - result, - AEItemStack.create(remove), - FuzzyMode.IGNORE_ALL, - IterationCounter.fetchNewId()); - VendingMachine.LOG.info( - "found {} matched items with fuzzy search IGNOREALL", - result.stream() - .mapToLong(s -> s.getStackSize()) - .sum()); - - result = new ArrayList<>(); - storage.getItemInventory() - .getSortedFuzzyItems( - result, - AEItemStack.create(remove), - FuzzyMode.PERCENT_99, - IterationCounter.fetchNewId()); - VendingMachine.LOG.info( - "found {} matched items with fuzzy search 99", - result.stream() - .mapToLong(s -> s.getStackSize()) - .sum()); - - // endtest - long numMatch = outputList.stream() .mapToLong(stack -> stack.getStackSize()) .sum(); - VendingMachine.LOG.info("found {} matched items", numMatch); if (simulate || numMatch < remove.stackSize) { return numMatch >= remove.stackSize; } From bf4933127fd2a512414d1d8cf42461e1702e24b3 Mon Sep 17 00:00:00 2001 From: cubefury Date: Sun, 19 Oct 2025 17:27:27 +0800 Subject: [PATCH 84/88] spotless --- .../cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index 2082323..cb3b273 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -16,7 +16,6 @@ import com.cubefury.vendingmachine.items.VMItems; import appeng.api.config.Actionable; -import appeng.api.config.FuzzyMode; import appeng.api.implementations.IPowerChannelState; import appeng.api.networking.GridFlags; import appeng.api.networking.IGridNode; @@ -30,7 +29,6 @@ import appeng.me.GridAccessException; import appeng.me.helpers.AENetworkProxy; import appeng.me.helpers.IGridProxyable; -import appeng.util.IterationCounter; import appeng.util.item.AEItemStack; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; From 466acf89d916f013f9864751f6a57e373cd2db7d Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 20 Oct 2025 10:56:49 +0800 Subject: [PATCH 85/88] Made uplink texture update correctly when powered by ME system --- .../vendingmachine/api/enums/Textures.java | 4 ++-- .../blocks/MTEVendingUplinkHatch.java | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java b/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java index 59354b4..277dfd2 100644 --- a/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java +++ b/src/main/java/com/cubefury/vendingmachine/api/enums/Textures.java @@ -20,8 +20,8 @@ public class Textures { VM_OVERLAY_ACTIVE_2 = new CustomIcon("vendingmachine:vending_machine_overlay_active_2"), VM_OVERLAY_ACTIVE_3 = new CustomIcon("vendingmachine:vending_machine_overlay_active_3"), - VUPLINK_OVERLAY_0 = new CustomIcon("vendingmachine:vending_uplink_machine_overlay_inactive"), - VUPLINK_OVERLAY_1 = new CustomIcon("vendingmachine:vending_uplink_machine_overlay_active"); + VUPLINK_OVERLAY_INACTIVE = new CustomIcon("vendingmachine:vending_uplink_machine_overlay_inactive"), + VUPLINK_OVERLAY_ACTIVE = new CustomIcon("vendingmachine:vending_uplink_machine_overlay_active"); public static final IIconContainer[] VM_OVERLAY_ACTIVE = { VM_OVERLAY_ACTIVE_0, VM_OVERLAY_ACTIVE_1, VM_OVERLAY_ACTIVE_2, VM_OVERLAY_ACTIVE_3, VM_OVERLAY_4 // bottom right not animated diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index d190276..c7c7021 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -1,7 +1,7 @@ package com.cubefury.vendingmachine.blocks; -import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_0; -import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_1; +import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_ACTIVE; +import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_INACTIVE; import java.util.EnumSet; @@ -120,12 +120,12 @@ public void securityBreak() {} @Override public ITexture[] getTexturesActive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(VUPLINK_OVERLAY_1) }; + return new ITexture[] { aBaseTexture, TextureFactory.of(VUPLINK_OVERLAY_ACTIVE) }; } @Override public ITexture[] getTexturesInactive(ITexture aBaseTexture) { - return new ITexture[] { aBaseTexture, TextureFactory.of(VUPLINK_OVERLAY_0) }; + return new ITexture[] { aBaseTexture, TextureFactory.of(VUPLINK_OVERLAY_INACTIVE) }; } @Override @@ -144,6 +144,14 @@ public void onFirstTick(IGregTechTileEntity baseMetaTileEntity) { getProxy().onReady(); } + @Override + public void onPostTick(IGregTechTileEntity baseMetaTileEntity, long tick) { + if (baseMetaTileEntity.isServerSide()) { + baseMetaTileEntity.setActive(isActive()); + } + super.onPostTick(baseMetaTileEntity, tick); + } + private void updateValidGridProxySides() { if (additionalConnection) { getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN))); From f253d283c0d012f59773a26b800f790059e50ae1 Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 20 Oct 2025 11:01:08 +0800 Subject: [PATCH 86/88] reduced frequency of active check --- .../cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index c7c7021..eba8b4f 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -146,7 +146,7 @@ public void onFirstTick(IGregTechTileEntity baseMetaTileEntity) { @Override public void onPostTick(IGregTechTileEntity baseMetaTileEntity, long tick) { - if (baseMetaTileEntity.isServerSide()) { + if (baseMetaTileEntity.isServerSide() && tick % 20 == 0) { baseMetaTileEntity.setActive(isActive()); } super.onPostTick(baseMetaTileEntity, tick); From b9d34b674924e2d43d3a707bd986b602c4d8d920 Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Wed, 22 Oct 2025 21:34:42 +0200 Subject: [PATCH 87/88] update --- dependencies.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 6eaa03a..00b2fd6 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,13 +34,13 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.18-GTNH:dev") + implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.20-GTNH:dev") implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") compileOnly("com.github.GTNewHorizons:BetterQuesting:3.8.10-GTNH:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.3.4-1.7.10:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.5-1.7.10:dev") implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.59:dev") + implementation("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.65:dev") } // deps may transitively add Baubles, so we replace it @@ -49,7 +49,7 @@ project.getConfigurations() final DependencySubstitutions ds = c.getResolutionStrategy() .getDependencySubstitution() ds.substitute(ds.module("com.github.GTNewHorizons:Baubles")) - .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.2.0-GTNH")) + .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.2.2-GTNH")) .withClassifier("dev") .because("Baubles-Expanded replaces Baubles") }) From e634d9480cccf345395536cb84ccc938156804f2 Mon Sep 17 00:00:00 2001 From: cubefury Date: Mon, 27 Oct 2025 19:16:53 +0800 Subject: [PATCH 88/88] Added oredict compatability for input items --- .../blocks/MTEVendingMachine.java | 53 +++++++++++++++++-- .../blocks/MTEVendingUplinkHatch.java | 16 ++++-- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java index 7e767fd..a4ff659 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingMachine.java @@ -10,6 +10,7 @@ import static gregtech.api.util.GTStructureUtility.ofHatchAdderOptional; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,6 +29,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import org.jetbrains.annotations.NotNull; import org.lwjgl.input.Keyboard; @@ -287,7 +289,7 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { requiredStack.setTagCompound(null); requiredStack.stackSize = 1; // just in case it's not pulled as 1 for some reason int requiredAmount = stack.stackSize; - // Remove Items from last stacks if possible + // Remove Items from last stacks if possible (exact matches) for (int i = MTEVendingMachine.INPUT_SLOTS - 1; i >= 0 && requiredAmount > 0; i--) { if (inputSlots[i] == null) { continue; @@ -304,8 +306,35 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { } } } + // Remove Items from last stacks if possible (oredict matches) + if (stack.hasOreDict()) { + int oreId = OreDictionary.getOreID(stack.getOreDict()); + for (int i = MTEVendingMachine.INPUT_SLOTS - 1; i >= 0 && requiredAmount > 0; i--) { + if (inputSlots[i] == null) { + continue; + } + ItemStack tmp = inputSlots[i].copy(); + tmp.stackSize = 1; + if ( + Arrays.stream(OreDictionary.getOreIDs(tmp)) + .anyMatch(id -> id == oreId) + ) { + if (requiredAmount >= inputSlots[i].stackSize) { + requiredAmount -= inputSlots[i].stackSize; + inputSlots[i] = null; + } else { + inputSlots[i].stackSize -= requiredAmount; + requiredAmount = 0; + } + } + } + } + requiredStack.stackSize = requiredAmount; - if (requiredAmount > 0 && !fetchItemFromAE(requiredStack, false)) { + if ( + requiredAmount > 0 + && !fetchItemFromAE(requiredStack, false, stack.hasOreDict() ? stack.getOreDict() : null) + ) { return false; } } @@ -334,9 +363,9 @@ private boolean processTradeOnServer(TradeRequest tradeRequest) { return true; } - public boolean fetchItemFromAE(ItemStack requiredStack, boolean simulate) { + public boolean fetchItemFromAE(ItemStack requiredStack, boolean simulate, String matchOreDict) { for (MTEVendingUplinkHatch hatch : this.uplinkHatches) { - if (hatch.removeItem(requiredStack, simulate)) { + if (hatch.removeItem(requiredStack, simulate, matchOreDict)) { return true; } } @@ -585,6 +614,8 @@ public void refreshInputSlotCache() { public boolean inputItemsSatisfied(List fromItems) { for (BigItemStack bis : fromItems) { BigItemStack base = bis.copy(); + boolean hasOreDict = bis.hasOreDict(); + int oreId = OreDictionary.getOreID(bis.getOreDict()); bis.setTagCompound(null); base.stackSize = 1; // shouldn't need this, but just in case @@ -593,11 +624,23 @@ public boolean inputItemsSatisfied(List fromItems) { if (this.inputSlotCache.get(base) != null) { aeStackSearch.stackSize = Math .max(aeStackSearch.stackSize - this.inputSlotCache.getOrDefault(base, 0), 0); + } else if (hasOreDict) { + for (Map.Entry item : this.inputSlotCache.entrySet()) { + if ( + Arrays.stream( + OreDictionary.getOreIDs( + item.getKey() + .getBaseStack())) + .anyMatch(id -> id == oreId) + ) { + aeStackSearch.stackSize = Math.max(aeStackSearch.stackSize - item.getValue(), 0); + } + } } if (aeStackSearch.stackSize == 0) { continue; } - if (!this.fetchItemFromAE(aeStackSearch, true)) { + if (!this.fetchItemFromAE(aeStackSearch, true, hasOreDict ? bis.getOreDict() : null)) { return false; } } diff --git a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java index c6d23b1..55452f5 100644 --- a/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java +++ b/src/main/java/com/cubefury/vendingmachine/blocks/MTEVendingUplinkHatch.java @@ -4,6 +4,7 @@ import static com.cubefury.vendingmachine.api.enums.Textures.VUPLINK_OVERLAY_INACTIVE; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.List; @@ -11,6 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentTranslation; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import com.cubefury.vendingmachine.VendingMachine; import com.cubefury.vendingmachine.items.VMItems; @@ -192,13 +194,13 @@ public void refreshStorageContents() { .getStorageList(); } - public boolean removeItem(ItemStack remove, boolean simulate) { + public boolean removeItem(ItemStack remove, boolean simulate, String matchOreDict) { if (remove == null || remove.stackSize <= 0) return true; IStorageGrid storage = accessStorage(); if (storage == null) return false; MachineSource source = new MachineSource(this); - if (!remove.isItemStackDamageable()) { + if (!remove.isItemStackDamageable() && matchOreDict != null) { IAEItemStack stack = storage.getItemInventory() .extractItems(AEItemStack.create(remove), simulate ? Actionable.SIMULATE : Actionable.MODULATE, source); return stack != null && stack.getStackSize() >= remove.stackSize; @@ -208,9 +210,17 @@ public boolean removeItem(ItemStack remove, boolean simulate) { return false; } + int oreId = OreDictionary.getOreID(matchOreDict); List outputList = new ArrayList<>(); for (IAEItemStack stack : cachedItems) { - if (stack.getItem() == remove.getItem() && stack.getItemDamage() == remove.getItemDamage()) { + // no oredict data: check if item + item damage matches required item + // oredict data: check if item contains desired oredict string + if ( + (matchOreDict == null && stack.getItem() == remove.getItem() + && stack.getItemDamage() == remove.getItemDamage()) + || (matchOreDict != null && Arrays.stream(OreDictionary.getOreIDs(stack.getItemStack())) + .anyMatch(id -> id == oreId)) + ) { outputList.add(stack); } }