From 2a821017f2b3a886c24c980432af30a432a97dbd Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Sat, 26 Oct 2024 12:19:16 -0700 Subject: [PATCH 1/8] fix crucible: fixed incorrect metal score calculations --- .../EasyGiantsFoundryState.java | 49 +++++++++++++------ .../easygiantsfoundry/FoundryOverlay3D.java | 2 +- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java index d2dac92..1fd8df5 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java @@ -8,14 +8,19 @@ import com.toofifty.easygiantsfoundry.enums.Stage; import static com.toofifty.easygiantsfoundry.enums.Stage.GRINDSTONE; import static com.toofifty.easygiantsfoundry.enums.Stage.POLISHING_WHEEL; import static com.toofifty.easygiantsfoundry.enums.Stage.TRIP_HAMMER; + +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import lombok.Value; import net.runelite.api.Client; import net.runelite.api.widgets.Widget; import javax.inject.Inject; import javax.inject.Singleton; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; @Singleton @@ -220,14 +225,9 @@ public class EasyGiantsFoundryState public double getCrucibleQuality() { - if (getCrucibleCount() == 0) return 0; + // https://oldschool.runescape.wiki/w/Giants%27_Foundry#Metal_score - int bronze = client.getVarbitValue(VARBIT_BRONZE_COUNT); - int iron = client.getVarbitValue(VARBIT_IRON_COUNT); - int steel = client.getVarbitValue(VARBIT_STEEL_COUNT); - int mithril = client.getVarbitValue(VARBIT_MITHRIL_COUNT); - int adamant = client.getVarbitValue(VARBIT_ADAMANT_COUNT); - int rune = client.getVarbitValue(VARBIT_RUNE_COUNT); + if (getCrucibleCount() == 0) return 0; final int BRONZE_VALUE = 1; final int IRON_VALUE = 2; @@ -236,16 +236,35 @@ public class EasyGiantsFoundryState final int ADAMANT_VALUE = 5; final int RUNE_VALUE = 6; - final double vB = (10 * BRONZE_VALUE * bronze) / 28.0; - final double vI = (10 * IRON_VALUE * iron) / 28.0; - final double vS = (10 * STEEL_VALUE * steel) / 28.0; - final double vM = (10 * MITHRIL_VALUE * mithril) / 28.0; - final double vA = (10 * ADAMANT_VALUE * adamant) / 28.0; - final double vR = (10 * RUNE_VALUE * rune) / 28.0; + + final int bronzeNum = client.getVarbitValue(VARBIT_BRONZE_COUNT); + final int ironNum = client.getVarbitValue(VARBIT_IRON_COUNT); + final int steelNum = client.getVarbitValue(VARBIT_STEEL_COUNT); + final int mithrilNum = client.getVarbitValue(VARBIT_MITHRIL_COUNT); + final int adamantNum = client.getVarbitValue(VARBIT_ADAMANT_COUNT); + final int runeNum = client.getVarbitValue(VARBIT_RUNE_COUNT); + + final double bronzeVal = (10 * BRONZE_VALUE * bronzeNum) / 28.0; + final double ironVal = (10 * IRON_VALUE * ironNum) / 28.0; + final double steelVal = (10 * STEEL_VALUE * steelNum) / 28.0; + final double mithrilVal = (10 * MITHRIL_VALUE * mithrilNum) / 28.0; + final double adamantVal = (10 * ADAMANT_VALUE * adamantNum) / 28.0; + final double runeVal = (10 * RUNE_VALUE * runeNum) / 28.0; + + Double[] metals = new Double[] { + bronzeVal, + ironVal, + steelVal, + mithrilVal, + adamantVal, + runeVal + }; + + // Descending order + Arrays.sort(metals, Collections.reverseOrder()); return - (10 * (vB + vI + vS + vM + vA + vR) - + (max1(vB) * max1(vI) * max1(vS) * max1(vM) * max1(vA) * max1(vR))) / 10.0; + ((10 * metals[0] + 10 * metals[1]) + max1(metals[0]) * max1(metals[1])) / 10.0; } /** diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 781bb02..db02f27 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -269,7 +269,7 @@ public class FoundryOverlay3D extends Overlay { return; } - String text = String.format("%d/%d quality: %d", state.getCrucibleCount(), CRUCIBLE_CAPACITY, (int)state.getCrucibleQuality()); + String text = String.format("%d/%d metal score: %d", state.getCrucibleCount(), CRUCIBLE_CAPACITY, (int)state.getCrucibleQuality()); LocalPoint crucibleLoc = crucible.getLocalLocation(); crucibleLoc = new LocalPoint(crucibleLoc.getX() - 100, crucibleLoc.getY()); From 475cb1c1f0746171c4ac46c45da2cd4c64321379 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Mon, 28 Oct 2024 01:32:24 -0700 Subject: [PATCH 2/8] sword & mould score: sword score = mould score + crucible score - (mistake * 10) This score is displayed over the title of mould, the mould panel title, and over the preform in stage == 2. *mistakes are not tracked right now. --- .../EasyGiantsFoundryPlugin.java | 27 ++++++++++- .../EasyGiantsFoundryState.java | 12 +++-- .../easygiantsfoundry/FoundryOverlay3D.java | 48 ++++++++++++++++++- .../easygiantsfoundry/MouldHelper.java | 44 +++++++++++++++++ 4 files changed, 126 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 2c57b72..3cd158a 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -1,6 +1,8 @@ package com.toofifty.easygiantsfoundry; import com.google.inject.Provides; + +import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.VARBIT_GAME_STAGE; import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.VARBIT_HEAT; import com.toofifty.easygiantsfoundry.enums.Stage; @@ -27,6 +29,7 @@ import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.StatChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.api.widgets.Widget; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; @@ -36,6 +39,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; +import java.util.Objects; import java.util.Set; @Slf4j @@ -273,8 +277,12 @@ public class EasyGiantsFoundryPlugin extends Plugin { if (event.getMenuOption().equals("Pour")) { + if (client.getVarbitValue(VARBIT_GAME_STAGE) == 1) + { + state.setLastKnownCrucibleScore((int) state.getCrucibleScore()); + } // add persistent game message of the alloy value so user can reference later. - client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", "The quality of the alloy poured is " + (int) state.getCrucibleQuality(), null); + client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", "The score of the preform is " + ((int) state.getCrucibleScore() + state.getMouldScore()), null); } } @@ -315,6 +323,23 @@ public class EasyGiantsFoundryPlugin extends Plugin || event.getScriptId() == MouldHelper.RESET_MOULD_SCRIPT) { mouldHelper.selectBest(event.getScriptId()); + updateMouldScore(); + } + } + + private void updateMouldScore() { + + state.setMouldScore(mouldHelper.getTotalScore()); + + // show mould score on Mould UI Title + Widget mouldParent = client.getWidget(47054850); + Integer mouldScore = state.getMouldScore(); + if (mouldParent != null && mouldScore != null) + { + Widget title = Objects.requireNonNull(mouldParent.getChild(1)); + + // not sure why, the ":" character turns into ": ," when rendered; obmitting it. + title.setText("Giants' Foundry Mould Setup (Score " + mouldScore + ")"); } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java index 1fd8df5..2d5c071 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java @@ -9,10 +9,8 @@ import static com.toofifty.easygiantsfoundry.enums.Stage.GRINDSTONE; import static com.toofifty.easygiantsfoundry.enums.Stage.POLISHING_WHEEL; import static com.toofifty.easygiantsfoundry.enums.Stage.TRIP_HAMMER; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import lombok.Value; import net.runelite.api.Client; import net.runelite.api.widgets.Widget; @@ -40,6 +38,14 @@ public class EasyGiantsFoundryState @Setter private int smithsOutfitPieces; + @Setter + @Getter + private Integer mouldScore; + + @Setter + @Getter + private Integer lastKnownCrucibleScore; + private final List stages = new ArrayList<>(); private double heatRangeRatio = 0; @@ -223,7 +229,7 @@ public class EasyGiantsFoundryState return bronze + iron + steel + mithril + adamant + rune; } - public double getCrucibleQuality() + public double getCrucibleScore() { // https://oldschool.runescape.wiki/w/Giants%27_Foundry#Metal_score diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index db02f27..8064292 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -119,7 +119,11 @@ public class FoundryOverlay3D extends Overlay if (config.highlightCrucible()) { drawCrucibleIfMouldSet(graphics); + drawMouldScoreIfMouldSet(graphics); } + + drawPreformScoreIfPoured(graphics); + return null; } @@ -269,7 +273,7 @@ public class FoundryOverlay3D extends Overlay { return; } - String text = String.format("%d/%d metal score: %d", state.getCrucibleCount(), CRUCIBLE_CAPACITY, (int)state.getCrucibleQuality()); + String text = String.format("%d/%d score: %d", state.getCrucibleCount(), CRUCIBLE_CAPACITY, (int)state.getCrucibleScore()); LocalPoint crucibleLoc = crucible.getLocalLocation(); crucibleLoc = new LocalPoint(crucibleLoc.getX() - 100, crucibleLoc.getY()); @@ -287,6 +291,48 @@ public class FoundryOverlay3D extends Overlay OverlayUtil.renderTextLocation(graphics, pos, text, color); } + private void drawMouldScoreIfMouldSet(Graphics2D graphics) { + if (client.getVarbitValue(SWORD_TYPE_1_VARBIT) == 0) + { + return; + } + if (client.getVarbitValue(VARBIT_GAME_STAGE) != 1) + { + return; + } + + if (state.getMouldScore() == null) + { + return; + } + + String text = String.format("score: %d", state.getMouldScore()); + LocalPoint mouldLoc = mouldJig.getLocalLocation(); + Point pos = Perspective.getCanvasTextLocation(client, graphics, mouldLoc, text, 115); + Color color = config.generalHighlight(); + + OverlayUtil.renderTextLocation(graphics, pos, text, color); + } + private void drawPreformScoreIfPoured(Graphics2D graphics) { + if (client.getVarbitValue(VARBIT_GAME_STAGE) != 2) + { + return; + } + + if (state.getMouldScore() == null || state.getLastKnownCrucibleScore() == null) + { + return; + } + + int preformScore = state.getLastKnownCrucibleScore() + state.getMouldScore(); + String text = String.format("score: %d", preformScore); + LocalPoint mouldLoc = mouldJig.getLocalLocation(); + Point pos = Perspective.getCanvasTextLocation(client, graphics, mouldLoc, text, 115); + + Color color = config.generalHighlight(); + + OverlayUtil.renderTextLocation(graphics, pos, text, color); + } private void drawCrucibleIfMouldSet(Graphics2D graphics) { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java b/src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java index a6b8b9e..5b14081 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java @@ -23,6 +23,9 @@ public class MouldHelper static final int SWORD_TYPE_2_VARBIT = 13908; // 3=Flat private static final int DISABLED_TEXT_COLOR = 0x9f9f9f; + private static final int SCORE_TYPE1_SCORE_WIDGET = 47054876; + private static final int SCORE_TYPE2_SCORE_WIDGET = 47054878; + @Inject private Client client; @@ -32,6 +35,47 @@ public class MouldHelper @Inject private EasyGiantsFoundryConfig config; + public Integer getTotalScore() + { + Widget type1Widget = client.getWidget(SCORE_TYPE1_SCORE_WIDGET); + Widget type2Widget = client.getWidget(SCORE_TYPE2_SCORE_WIDGET); + if (type1Widget == null || type2Widget == null) + { + return null; + } + + String type1Str = type1Widget.getText(); + String type2Str = type2Widget.getText(); + + // (+6) 6 + // ^ space seperated + // or + // 6 + if (type1Str.contains(" ")) + { + type1Str = type1Str.substring(type1Str.lastIndexOf(' ') + 1); + } + + if (type2Str.contains(" ")) + { + type2Str = type2Str.substring(type2Str.lastIndexOf(' ') + 1); + } + + + int type1Score; + int type2Score; + + try + { + type1Score = Integer.parseInt(type1Str); + type2Score = Integer.parseInt(type2Str); + } catch (NumberFormatException e) + { + return null; + } + + return type1Score + type2Score; + } public void selectBest(int scriptId) { Widget parent = client.getWidget(MOULD_LIST_PARENT); From 1e41e5733d178b24c60ec4ff0a6ab75e5e547ecf Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Tue, 29 Oct 2024 00:47:36 -0700 Subject: [PATCH 3/8] heat/cool prediction: fixed embarassing off-by-1 bug! removed the "margin of error" config convering up this bug. --- .../EasyGiantsFoundryConfig.java | 11 --- .../EasyGiantsFoundryPlugin.java | 4 +- .../easygiantsfoundry/FoundryOverlay3D.java | 34 +++----- .../easygiantsfoundry/HeatActionSolver.java | 7 ++ .../HeatActionStateMachine.java | 80 +++++++++++++------ .../easygiantsfoundry/HeatSolverTest.java | 8 +- 6 files changed, 79 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java index ae7402c..b5006eb 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java @@ -504,15 +504,4 @@ public interface EasyGiantsFoundryConfig extends Config ) String generalSettings = "generalSettings"; - @ConfigItem( - keyName = "heatingCoolingMarginOfError", - name = "Heating/Cooling Margin of Error", - description = "The margin of error for lava/waterfall calculations to compensate for decay and overshooting.", - position = 0, - section = generalSettings - ) - default int heatingCoolingBuffer() - { - return 20; - } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 3cd158a..6ed742e 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -338,7 +338,7 @@ public class EasyGiantsFoundryPlugin extends Plugin { Widget title = Objects.requireNonNull(mouldParent.getChild(1)); - // not sure why, the ":" character turns into ": ," when rendered; obmitting it. + // not sure why, the ":" character turns into ": ," when rendered; omitting it. title.setText("Giants' Foundry Mould Setup (Score " + mouldScore + ")"); } } @@ -369,8 +369,8 @@ public class EasyGiantsFoundryPlugin extends Plugin state.heatingCoolingState.onTick(); } - previousHeat = event.getValue(); } + previousHeat = event.getValue(); } @Subscribe diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 8064292..1eaa0bc 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -134,7 +134,7 @@ public class FoundryOverlay3D extends Overlay return null; } - drawHeatingActionOverlay(graphics, stageObject); + drawActionOverlay(graphics, stageObject); Heat heat = state.getCurrentHeat(); Color color = getObjectColor(stage, heat); @@ -155,11 +155,11 @@ public class FoundryOverlay3D extends Overlay if (state.heatingCoolingState.isCooling()) { - drawHeatingActionOverlay(graphics, waterfall, false); + drawHeatingCoolingOverlay(graphics, waterfall); } if (state.heatingCoolingState.isHeating()) { - drawHeatingActionOverlay(graphics, lavaPool, true); + drawHeatingCoolingOverlay(graphics, lavaPool); } @@ -192,10 +192,10 @@ public class FoundryOverlay3D extends Overlay modelOutlineRenderer.drawOutline(stageObject, config.borderThickness(), _color, config.borderFeather()); } - private void drawHeatingActionOverlay( + private void drawHeatingCoolingOverlay( Graphics2D graphics, - GameObject stageObject, - boolean isLava /* and not cooling */) + GameObject stageObject + ) { if (!config.drawLavaWaterInfoOverlay()) { @@ -208,22 +208,10 @@ public class FoundryOverlay3D extends Overlay } String text; - if (isLava) - { - // %d heats or %d dunks - text = String.format("%d %s", - state.heatingCoolingState.getRemainingDuration(), - state.heatingCoolingState.getActionName() - ); - } - else - { - // %d cools - text = String.format("%d %s", - state.heatingCoolingState.getRemainingDuration(), - state.heatingCoolingState.getActionName() - ); - } + text = String.format("%d %s", + state.heatingCoolingState.getRemainingDuration(), + state.heatingCoolingState.getActionName() + ); LocalPoint stageLoc = stageObject.getLocalLocation(); stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY()); @@ -437,7 +425,7 @@ public class FoundryOverlay3D extends Overlay } } - private void drawHeatingActionOverlay(Graphics2D graphics, GameObject gameObject) + private void drawActionOverlay(Graphics2D graphics, GameObject gameObject) { int actionsLeft = state.getActionsLeftInStage(); int heatLeft = state.getActionsForHeatLevel(); diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java index 6c534e6..e500b9d 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java @@ -78,6 +78,13 @@ public class HeatActionSolver { /** + * Warning: this method prefers overshooting goal. For example, if goal is 957, + * it will return index that reaches >957.
+ * This may be desirable if we're aiming to heat over range minimum, + * but undesirable when cooling below range maximum; make sure to -1 the index if so. + * + * + * * @param goal the desired heat destination * @param init_dx1 initial speed of heating/cooling. currently 7 for heat/cool, 27 for dunk/quench. * @param dx2_offset bonus acceleration. currently, 0 for heat/cool, 2 for dunk/quench. diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java index edb2cbf..00e0da6 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java @@ -113,26 +113,32 @@ public class HeatActionStateMachine */ public void calculateEstimates() { + // 0: left/min 1: right/max int[] range = State.getCurrentHeatRange(); + int stageMin = range[0]; + int stageMax = range[1]; + Stage stage = State.getCurrentStage(); int actionsLeft = State.getActionsLeftInStage(); - int actionsLeft_DeltaHeat = actionsLeft * stage.getHeatChange(); + int actionsLeft_DeltaHeat = (actionsLeft+1) * stage.getHeatChange(); if (isHeating()) { if (stage.isHeating()) { - GoalHeat = Math.max(range[0] + Config.heatingCoolingBuffer(), range[1] - actionsLeft_DeltaHeat); + GoalHeat = Math.max(stageMin, stageMax - actionsLeft_DeltaHeat); if (StartingHeat < GoalHeat) { - EstimatedDuration = HeatActionSolver.findDx0Index( + int duration = HeatActionSolver.findDx0Index( GoalHeat - StartingHeat, - Velocity, AccelerationBonus); + Velocity, AccelerationBonus + ); - GoalHeat += EstimatedDuration / 2; // compensate for decay during heating + GoalHeat += duration / 2; EstimatedDuration = HeatActionSolver.findDx0Index( GoalHeat - StartingHeat, - Velocity, AccelerationBonus); + Velocity, AccelerationBonus + ); } else // overheating { @@ -141,13 +147,21 @@ public class HeatActionStateMachine } else // is cooling { - GoalHeat = Math.min(range[1] - Config.heatingCoolingBuffer(), range[0] - actionsLeft_DeltaHeat); + // actionsLeft_DeltaHeat is negative here + GoalHeat = Math.min(stageMax, stageMin - actionsLeft_DeltaHeat); if (StartingHeat < GoalHeat) { + int duration = HeatActionSolver.findDx0Index( + GoalHeat - StartingHeat, + Velocity, AccelerationBonus + ) - 1; + + GoalHeat -= duration / 2; + EstimatedDuration = HeatActionSolver.findDx0Index( GoalHeat - StartingHeat, Velocity, AccelerationBonus - ); + ) - 1; } else // cold enough { @@ -157,11 +171,39 @@ public class HeatActionStateMachine } else if (isCooling()) { - if (stage.isCooling()) - { - GoalHeat = Math.max(range[1] - Config.heatingCoolingBuffer(), range[0] + actionsLeft_DeltaHeat); + if (stage.isHeating()) { + GoalHeat = Math.max(stageMin, stageMax - actionsLeft_DeltaHeat); + if (StartingHeat > GoalHeat) + { + int duration = HeatActionSolver.findDx0Index( + StartingHeat - GoalHeat, + Math.abs(Velocity), Math.abs(AccelerationBonus) + ) - 1; + + GoalHeat += duration / 2; + + EstimatedDuration = HeatActionSolver.findDx0Index( + (StartingHeat - GoalHeat), + Math.abs(Velocity), Math.abs(AccelerationBonus) + ) - 1; + } + else + { + EstimatedDuration = 0; + } + } + // Heating Stage + else { + GoalHeat = Math.max(stageMax, stageMin + actionsLeft_DeltaHeat); if (StartingHeat > GoalHeat) // too hot { + int duration = HeatActionSolver.findDx0Index( + StartingHeat - GoalHeat, + Math.abs(Velocity), Math.abs(AccelerationBonus) + ); + + GoalHeat -= duration / 2; + EstimatedDuration = HeatActionSolver.findDx0Index( StartingHeat - GoalHeat, Math.abs(Velocity), Math.abs(AccelerationBonus) @@ -172,21 +214,7 @@ public class HeatActionStateMachine EstimatedDuration = 0; } } - else // Heating Stage - { - GoalHeat = Math.max(range[0] + Config.heatingCoolingBuffer(), range[1] - actionsLeft_DeltaHeat); - if (StartingHeat > GoalHeat) - { - EstimatedDuration = HeatActionSolver.findDx0Index( - (StartingHeat - GoalHeat), - Math.abs(Velocity), Math.abs(AccelerationBonus) - ); - } - else - { - EstimatedDuration = 0; - } - } + } } diff --git a/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java b/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java index 69cac3c..f5fb53b 100644 --- a/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java +++ b/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java @@ -90,7 +90,7 @@ public class HeatSolverTest for (int i = 0; i < answer_dx1.length; i++) { - TestHeatSolver_Dx0_Helper(answer_dx0.get(i), answer_dx0.get(0), i + 1); + TestHeatSolver_Dx0_Helper(answer_dx0.get(i), answer_dx0.get(0), i); } } @@ -131,7 +131,9 @@ public class HeatSolverTest // System.err.println( // HeatSolver.findDx0IndexContinue(1000, 7, 0)); System.err.println( - HeatActionSolver.findDx0Index(1000, 7, 1)); + HeatActionSolver.findDx0Index(957, 27, 2)); +// System.err.println( +// HeatActionSolver.findDx0Index(1000, 7, 1)); } public void TestHeatSolver_Dx0_Helper(int dx0, int constant, int answer_index) @@ -139,7 +141,7 @@ public class HeatSolverTest System.err.print(dx0 + "->" + HeatActionSolver.findDx0Index(dx0, constant, 0) + ","); // test calcDx0Index - assertEquals("Asserting dx0 index for " + answer_index, + assertEquals("Asserting dx0 for index " + answer_index, answer_index, HeatActionSolver.findDx0Index(dx0, constant, 0)); } From 3d90c4cbb55931501343454a1caf679ee7feba86 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Tue, 29 Oct 2024 00:48:34 -0700 Subject: [PATCH 4/8] bumped version to 1.0.8 - updated build.gradle to match latest plugin-template build.gradle --- build.gradle | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 1870305..5887369 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,9 @@ repositories { mavenLocal() maven { url = 'https://repo.runelite.net' + content { + includeGroupByRegex("net\\.runelite.*") + } } mavenCentral() } @@ -24,9 +27,36 @@ dependencies { } group = 'com.toofifty' -version = '1.0.7' +version = '1.0.8' -tasks.withType(JavaCompile) { +tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' - options.release.set(11) + options.release.set(11) } + +tasks.register('shadowJar', Jar) { + dependsOn configurations.testRuntimeClasspath + manifest { + attributes('Main-Class': 'com.toofifty.easygiantsfoundry.EasyGiantsFoundryPluginTest', 'Multi-Release': true) + } + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from sourceSets.main.output + from sourceSets.test.output + from { + configurations.testRuntimeClasspath.collect { file -> + file.isDirectory() ? file : zipTree(file) + } + } + + exclude 'META-INF/INDEX.LIST' + exclude 'META-INF/*.SF' + exclude 'META-INF/*.DSA' + exclude 'META-INF/*.RSA' + exclude '**/module-info.class' + + group = BasePlugin.BUILD_GROUP + archiveClassifier.set('shadow') + archiveFileName.set("${rootProject.name}-${project.version}-all.jar") +} + From 3c2075fc6e1617dcad5bbba93e849274b608af82 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Tue, 29 Oct 2024 01:06:11 -0700 Subject: [PATCH 5/8] mould/preform overlay: toggling "Mould Info Overlay" will correctly turn off mould/preform score overlay. --- .../com/toofifty/easygiantsfoundry/FoundryOverlay3D.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 1eaa0bc..9b3706b 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -119,10 +119,13 @@ public class FoundryOverlay3D extends Overlay if (config.highlightCrucible()) { drawCrucibleIfMouldSet(graphics); + } + if (config.drawMouldInfoOverlay()) + { drawMouldScoreIfMouldSet(graphics); + drawPreformScoreIfPoured(graphics); } - drawPreformScoreIfPoured(graphics); return null; } From c7317befa092a01999c945f2e6827e7fd60e7aea Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Tue, 29 Oct 2024 01:18:16 -0700 Subject: [PATCH 6/8] search-terms: Added "ez","easy","smith" to hub search terms. --- runelite-plugin.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-plugin.properties b/runelite-plugin.properties index 0ef3afd..85e48c7 100644 --- a/runelite-plugin.properties +++ b/runelite-plugin.properties @@ -2,5 +2,5 @@ displayName=Easy Giant's Foundry author=Toofifty support=https://github.com/Toofifty/easy-giantsfoundry description=Helpful overlays for the Giant's Foundry minigame -tags=smithing,giant,foundry,giantsfoundry,minigame +tags=smithing,giant,foundry,giantsfoundry,minigame,ez,easy,smith plugins=com.toofifty.easygiantsfoundry.EasyGiantsFoundryPlugin \ No newline at end of file From f1edc659fa3b6656456e114650461aeecf7f8ab5 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Tue, 29 Oct 2024 03:27:36 -0700 Subject: [PATCH 7/8] mould/preform score: unboxed Integer into int using -1 representing unset state (instead of null). --- .../toofifty/easygiantsfoundry/EasyGiantsFoundryState.java | 4 ++-- .../java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java index 2d5c071..45c6bf6 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java @@ -40,11 +40,11 @@ public class EasyGiantsFoundryState @Setter @Getter - private Integer mouldScore; + private int mouldScore = -1; // starts -1 because mould score is unknown @Setter @Getter - private Integer lastKnownCrucibleScore; + private int lastKnownCrucibleScore = -1; // will be set when "Pour"ed private final List stages = new ArrayList<>(); private double heatRangeRatio = 0; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 9b3706b..d93101d 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -292,7 +292,7 @@ public class FoundryOverlay3D extends Overlay return; } - if (state.getMouldScore() == null) + if (state.getMouldScore() < 0) { return; } @@ -310,7 +310,7 @@ public class FoundryOverlay3D extends Overlay return; } - if (state.getMouldScore() == null || state.getLastKnownCrucibleScore() == null) + if (state.getMouldScore() < 0 || state.getLastKnownCrucibleScore() < 0) { return; } From 14130b39877213c8e4b0e8c0c54309563a754fff Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Tue, 29 Oct 2024 06:02:49 -0700 Subject: [PATCH 8/8] last known mould/crucible score now clear after picking up preform (stage == 0) --- .../easygiantsfoundry/EasyGiantsFoundryPlugin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 6ed742e..2b7e404 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -354,6 +354,14 @@ public class EasyGiantsFoundryPlugin extends Plugin reputation = client.getVarpValue(REPUTATION_VARBIT); } + // STAGE becomes 0 again after player picks up the preform + if (event.getVarbitId() == VARBIT_GAME_STAGE && event.getValue() == 0) + { + // clear out the current and soon to be previous scores. + state.setLastKnownCrucibleScore(-1); + state.setMouldScore(-1); + } + // start the heating state-machine when the varbit updates // if heat varbit updated and the user clicked, start the state-machine if (event.getVarbitId() == VARBIT_HEAT && state.heatingCoolingState.getActionName() != null)