From f31d4ca6005c8088add6cbbb892473010164db8e Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Sun, 24 Nov 2024 10:42:44 -0800 Subject: [PATCH 1/7] minor: Moved TOOL_TICK_CYCLE into the Stage enum for cleanliness --- .../com/toofifty/easygiantsfoundry/HeatActionSolver.java | 9 +-------- .../java/com/toofifty/easygiantsfoundry/enums/Stage.java | 9 ++++++--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java index b40a11a..f044ea4 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java @@ -121,13 +121,6 @@ public class HeatActionSolver }; - // index is stage, ordinal order - public static final int[] TOOL_TICK_CYCLE = new int[] { - 5, - 2, - 2 - }; - public static final int MAX_INDEX = DX_1.length; public static final int FAST_INDEX = 10; @@ -222,7 +215,7 @@ public static DurationResult solve( final boolean isStageHeating = stage.isHeating(); // adding tool cycle ticks because the first cycle at a tool is almost always nulled // (unless manually reaching the tile, then clicking the tool) - final int toolDelay = TOOL_TICK_CYCLE[stage.ordinal()]; + final int toolDelay = stage.getToolTickCycle(); final int travelTicks = solveTravelTicks(isRunning, stage, isActionHeating) + toolDelay; final int travelDecay = (int) Math.ceil((double) travelTicks / 2); diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java b/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java index 72a194e..3c950ce 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java @@ -7,9 +7,9 @@ @AllArgsConstructor public enum Stage { - TRIP_HAMMER("Hammer", Heat.HIGH, 20, -25, 4, 14), - GRINDSTONE("Grind", Heat.MED, 10, 15, 7, 19), - POLISHING_WHEEL("Polish", Heat.LOW, 10, -17, 12, 10); + TRIP_HAMMER("Hammer", Heat.HIGH, 20, -25, 4, 14, 5), + GRINDSTONE("Grind", Heat.MED, 10, 15, 7, 19, 2), + POLISHING_WHEEL("Polish", Heat.LOW, 10, -17, 12, 10, 2); private final String name; private final Heat heat; @@ -19,6 +19,9 @@ public enum Stage private final int distanceToLava; private final int distanceToWaterfall; + // Ticks between action + private final int toolTickCycle; + public boolean isHeating() { return heatChange > 0; From c4827ec166607082a60a377a533a26550d8990d5 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Sun, 24 Nov 2024 20:35:37 -0800 Subject: [PATCH 2/7] overlay3d:organize and clean up code flow --- .../easygiantsfoundry/FoundryOverlay3D.java | 260 ++++++++++-------- 1 file changed, 143 insertions(+), 117 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index d7283d7..8e6a8fe 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -63,9 +63,9 @@ private FoundryOverlay3D( this.modelOutlineRenderer = modelOutlineRenderer; } - private Color getObjectColor(Stage stage, Heat heat) + private Color getToolColor() { - if (stage.getHeat() != heat) + if (state.getCurrentStage().getHeat() != state.getCurrentHeat()) { return config.toolBad(); } @@ -85,7 +85,7 @@ private Color getObjectColor(Stage stage, Heat heat) return config.toolGood(); } - private GameObject getStageObject(Stage stage) + private GameObject getStageGameObject(Stage stage) { switch (stage) { @@ -140,86 +140,134 @@ public Dimension render(Graphics2D graphics) return null; } - Stage stage = state.getCurrentStage(); - GameObject stageObject = getStageObject(stage); - if (stageObject == null || graphics == null) + if (config.drawHeatLeftOverlay()) { - return null; + drawHeatLeftInfo(graphics); + } + + if (config.drawActionLeftOverlay()) + { + drawActionLeftInfo(graphics); + } + + if (config.highlightTools()) + { + drawToolHighlight(graphics); + } + + if (config.highlightWaterAndLava()) + { + drawHeatChangersClickbox(graphics); } - drawActionOverlay(graphics, stageObject); + if (config.drawLavaWaterInfoOverlay()) + { + drawHeatChangerInfo(graphics); + } - Heat heat = state.getCurrentHeat(); - Color color = getObjectColor(stage, heat); - // TODO Config + return null; + } + + private void drawToolHighlight(Graphics2D graphics) + { + Color color = getToolColor(); + GameObject stageObject = getStageGameObject(state.getCurrentStage()); if (config.highlightStyle() == HighlightStyle.HIGHLIGHT_CLICKBOX) { drawObjectClickbox(graphics, stageObject, color); } else { - drawObjectOutline(graphics, stageObject, color); + drawObjectOutline(stageObject, color); } + } + + private void drawHeatChangerInfo(Graphics2D graphics) + { + - // !state.heatingCoolingState.isIdle() - // if the stage heat is already in range, but player still wants to do heat changes - if ((stage.getHeat() != heat || !state.heatActionStateMachine.isIdle()) && config.highlightWaterAndLava()) + if (state.heatActionStateMachine.isCooling()) { - drawHeatChangers(graphics); + drawHeatChangerStateMachineInfo(graphics, waterfall); + return; } - // mouse hover over preview - else if (config.drawLavaWaterInfoOverlay()) + + if (state.heatActionStateMachine.isHeating()) + { + drawHeatChangerStateMachineInfo(graphics, lavaPool); + return; + } + + final boolean isLava = state.getHeatChangeNeeded() > 0; + final boolean isWaterfall = state.getHeatChangeNeeded() < 0; + + if (isWaterfall) { - MenuEntry[] menuEntries = client.getMenuEntries(); - if (menuEntries.length != 0) + drawHeatChangerPreviewOverlay(graphics, waterfall, false); + return; + } + + + if (isLava) + { + drawHeatChangerPreviewOverlay(graphics, lavaPool, true); + return; + } + + MenuEntry[] menuEntries = client.getMenuEntries(); + if (menuEntries.length != 0) + { + MenuEntry hoveredMenu = menuEntries[menuEntries.length - 1]; + + if (hoveredMenu.getIdentifier() == lavaPool.getId()) { - MenuEntry hoveredMenu = menuEntries[menuEntries.length - 1]; + drawHeatChangerPreviewOverlay(graphics, lavaPool, true); + return; + } - if (hoveredMenu.getIdentifier() == lavaPool.getId()) - { - drawHeatChangerPreviewOverlay(graphics, lavaPool, true); - } - else if (hoveredMenu.getIdentifier() == waterfall.getId()) - { - drawHeatChangerPreviewOverlay(graphics, waterfall, false); - } + if (hoveredMenu.getIdentifier() == waterfall.getId()) + { + drawHeatChangerPreviewOverlay(graphics, waterfall, false); + return; } } - return null; } private void drawObjectClickbox(Graphics2D graphics, GameObject stageObject, Color color) { + if (stageObject == null) + { + return; + } + Shape objectClickbox = stageObject.getClickbox(); - if (objectClickbox != null && config.highlightTools()) + if (objectClickbox == null) { - Point mousePosition = client.getMouseCanvasPosition(); - if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY())) - { - graphics.setColor(color.darker()); - } - else - { - graphics.setColor(color); - } - graphics.draw(objectClickbox); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(objectClickbox); + return; + } + + Point mousePosition = client.getMouseCanvasPosition(); + if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY())) + { + graphics.setColor(color.darker()); } + else + { + graphics.setColor(color); + } + graphics.draw(objectClickbox); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); + graphics.fill(objectClickbox); } - private void drawObjectOutline(Graphics2D graphics, GameObject stageObject, Color color) + private void drawObjectOutline(GameObject stageObject, Color color) { Color _color = new Color(color.getRed(), color.getGreen(), color.getBlue(), config.borderAlpha()); modelOutlineRenderer.drawOutline(stageObject, config.borderThickness(), _color, config.borderFeather()); } - private void drawHeatChangerPreviewOverlay( - Graphics2D graphics, - GameObject stageObject, - boolean isLava - ) + private void drawHeatChangerPreviewOverlay(Graphics2D graphics, GameObject stageObject, boolean isLava) { HeatActionSolver.DurationResult fastResult = @@ -277,7 +325,7 @@ private void drawHeatChangerPreviewOverlay( OverlayUtil.renderTextLocation(graphics, pos, text, color); } - private void drawHeatChangerOverlay(Graphics2D graphics, GameObject stageObject) + private void drawHeatChangerStateMachineInfo(Graphics2D graphics, GameObject stageObject) { String text; @@ -307,57 +355,34 @@ private void drawHeatChangerOverlay(Graphics2D graphics, GameObject stageObject) OverlayUtil.renderTextLocation(graphics, pos, text, color); } - private void drawHeatChangers(Graphics2D graphics) + private void drawHeatChangersClickbox(Graphics2D graphics) { - int change = state.getHeatChangeNeeded(); - Shape shape = null; + final Heat heat = state.getCurrentHeat(); + final Stage stage = state.getCurrentStage(); + final int change = state.getHeatChangeNeeded(); + final boolean isLava = change > 0; + final boolean isWaterfall = change < 0; - boolean isLava = change > 0; - boolean isWaterfall = change < 0; + if (stage.getHeat() == heat && state.heatActionStateMachine.isIdle()) + { + return; + } + + GameObject shape = null; if (isWaterfall || state.heatActionStateMachine.isCooling()) { - shape = waterfall.getClickbox(); + shape = waterfall; } else if (isLava || state.heatActionStateMachine.isHeating()) { - shape = lavaPool.getClickbox(); + shape = lavaPool; } + if (shape != null) { - Point mousePosition = client.getMouseCanvasPosition(); - Color color = config.lavaWaterfallColour(); - if (shape.contains(mousePosition.getX(), mousePosition.getY())) - { - graphics.setColor(color.darker()); - } - else - { - graphics.setColor(color); - } - graphics.draw(shape); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(shape); + drawObjectClickbox(graphics, shape, config.lavaWaterfallColour()); } - if (config.drawLavaWaterInfoOverlay()) - { - if (state.heatActionStateMachine.isCooling()) - { - drawHeatChangerOverlay(graphics, waterfall); - } - else if (isWaterfall) - { - drawHeatChangerPreviewOverlay(graphics, waterfall, false); - } - if (state.heatActionStateMachine.isHeating()) - { - drawHeatChangerOverlay(graphics, lavaPool); - } - else if (isLava) - { - drawHeatChangerPreviewOverlay(graphics, lavaPool, true); - } - } } @@ -471,7 +496,7 @@ else if (config.highlightStyle() == HighlightStyle.HIGHLIGHT_BORDER) { color = config.generalHighlight(); } - drawObjectOutline(graphics, crucible, color); + drawObjectOutline(crucible, color); } } @@ -498,7 +523,7 @@ private void drawMouldIfNotSet(Graphics2D graphics) } else if (config.highlightStyle() == HighlightStyle.HIGHLIGHT_BORDER) { - drawObjectOutline(graphics, mouldJig, config.generalHighlight()); + drawObjectOutline(mouldJig, config.generalHighlight()); } if (config.drawMouldInfoOverlay()) @@ -544,39 +569,40 @@ private void drawKovacIfHandIn(Graphics2D graphics) } } - private void drawActionOverlay(Graphics2D graphics, GameObject gameObject) + private void drawActionLeftInfo(Graphics2D graphics) { - + Stage stage = state.getCurrentStage(); + GameObject stageObject = getStageGameObject(stage); int actionsLeft = state.getActionsLeftInStage(); int heatLeft = state.getActionsForHeatLevel(); - - // Draw heat left - if (config.drawHeatLeftOverlay()) + String text = "Actions left: " + actionsLeft; + LocalPoint textLocation = stageObject.getLocalLocation(); + textLocation = new LocalPoint(textLocation.getX(), textLocation.getY()); + Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 250); + if (canvasLocation == null) { - String text = "Heat left: " + heatLeft; - LocalPoint textLocation = gameObject.getLocalLocation(); - textLocation = new LocalPoint(textLocation.getX(), textLocation.getY()); - Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 250); - if (canvasLocation == null) - { - return; - } - OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); + return; } - if (config.drawActionLeftOverlay()) - // Draw actions left + canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + 10); + OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); + } + + private void drawHeatLeftInfo(Graphics2D graphics) + { + Stage stage = state.getCurrentStage(); + GameObject stageObject = getStageGameObject(stage); + + int actionsLeft = state.getActionsLeftInStage(); + int heatLeft = state.getActionsForHeatLevel(); + String text = "Heat left: " + heatLeft; + LocalPoint textLocation = stageObject.getLocalLocation(); + textLocation = new LocalPoint(textLocation.getX(), textLocation.getY()); + Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 250); + if (canvasLocation == null) { - String text = "Actions left: " + actionsLeft; - LocalPoint textLocation = gameObject.getLocalLocation(); - textLocation = new LocalPoint(textLocation.getX(), textLocation.getY()); - Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 250); - if (canvasLocation == null) - { - return; - } - canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + 10); - OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); + return; } + OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); } } From 08c1de56487acb16a5517f7bf9417b41df81b4d4 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Sun, 24 Nov 2024 20:38:08 -0800 Subject: [PATCH 3/7] rename:HeatActionStateMachine -> HeatChangerStateMachine --- .../EasyGiantsFoundryPlugin.java | 36 +++++++++---------- .../EasyGiantsFoundryState.java | 2 +- .../easygiantsfoundry/FoundryOverlay3D.java | 22 ++++++------ ...hine.java => HeatChangerStateMachine.java} | 6 ++-- 4 files changed, 33 insertions(+), 33 deletions(-) rename src/main/java/com/toofifty/easygiantsfoundry/{HeatActionStateMachine.java => HeatChangerStateMachine.java} (95%) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 3dcf978..02b082c 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -308,30 +308,30 @@ public void onMenuOptionClicked(MenuOptionClicked event) } // Could not find a varbit to capture, so capture the menu-option directly. - // start the HeatActionStateMachine when varbit begins to update in onVarbitChanged() + // start the HeatChangerStateMachine when varbit begins to update in onVarbitChanged() if (event.getMenuOption().startsWith("Heat-preform")) { - state.heatActionStateMachine.stop(); - state.heatActionStateMachine.setup(false, true, "heats"); + state.heatChangerStateMachine.stop(); + state.heatChangerStateMachine.setup(false, true, "heats"); } else if (event.getMenuOption().startsWith("Dunk-preform")) { - state.heatActionStateMachine.stop(); - state.heatActionStateMachine.setup(true, true, "dunks"); + state.heatChangerStateMachine.stop(); + state.heatChangerStateMachine.setup(true, true, "dunks"); } else if (event.getMenuOption().startsWith("Cool-preform")) { - state.heatActionStateMachine.stop(); - state.heatActionStateMachine.setup(false, false, "cools"); + state.heatChangerStateMachine.stop(); + state.heatChangerStateMachine.setup(false, false, "cools"); } else if (event.getMenuOption().startsWith("Quench-preform")) { - state.heatActionStateMachine.stop(); - state.heatActionStateMachine.setup(true, false, "quenches"); + state.heatChangerStateMachine.stop(); + state.heatChangerStateMachine.setup(true, false, "quenches"); } - else if (!state.heatActionStateMachine.isIdle()) // canceled heating/cooling, stop the heating state-machine + else if (!state.heatChangerStateMachine.isIdle()) // canceled heating/cooling, stop the heating state-machine { - state.heatActionStateMachine.stop(); + state.heatChangerStateMachine.stop(); } }); @@ -395,14 +395,14 @@ public void onVarbitChanged(VarbitChanged event) // sign check: num * num > 0 == same sign if (delta != -1) { - if (state.heatActionStateMachine.getActionname() != null) + if (state.heatChangerStateMachine.getActionname() != null) { // if the state-machine is idle, start it - if (state.heatActionStateMachine.isIdle()) + if (state.heatChangerStateMachine.isIdle()) { - state.heatActionStateMachine.start(state, config, previousHeat); + state.heatChangerStateMachine.start(state, config, previousHeat); } - state.heatActionStateMachine.onTick(); + state.heatChangerStateMachine.onTick(); } if (config.debugging()) @@ -410,9 +410,9 @@ public void onVarbitChanged(VarbitChanged event) client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", "Heat: " + event.getValue() + "" + "Delta: " + delta + " " + - "Heating Ticks: " + state.heatActionStateMachine.heatingTicks + "" + - " Cooling Ticks: " + state.heatActionStateMachine.coolingTicks + "" + - " Remaining Ticks: " + state.heatActionStateMachine.getRemainingDuration(), ""); + "Heating Ticks: " + state.heatChangerStateMachine.heatingTicks + "" + + " Cooling Ticks: " + state.heatChangerStateMachine.coolingTicks + "" + + " Remaining Ticks: " + state.heatChangerStateMachine.getRemainingDuration(), ""); } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java index 1a80774..27be191 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java @@ -49,7 +49,7 @@ public class EasyGiantsFoundryState private final List stages = new ArrayList<>(); private double heatRangeRatio = 0; - public final HeatActionStateMachine heatActionStateMachine = new HeatActionStateMachine(); + public final HeatChangerStateMachine heatChangerStateMachine = new HeatChangerStateMachine(); public void reset() { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 8e6a8fe..efbb823 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -186,13 +186,13 @@ private void drawHeatChangerInfo(Graphics2D graphics) { - if (state.heatActionStateMachine.isCooling()) + if (state.heatChangerStateMachine.isCooling()) { drawHeatChangerStateMachineInfo(graphics, waterfall); return; } - if (state.heatActionStateMachine.isHeating()) + if (state.heatChangerStateMachine.isHeating()) { drawHeatChangerStateMachineInfo(graphics, lavaPool); return; @@ -332,17 +332,17 @@ private void drawHeatChangerStateMachineInfo(Graphics2D graphics, GameObject sta if (config.debugging()) { text = String.format("%d %s (overshoot: %s) [goal-in-range: %s]", - state.heatActionStateMachine.getRemainingDuration(), - state.heatActionStateMachine.getActionname(), - state.heatActionStateMachine.isOverShooting(), - state.heatActionStateMachine.isGoalInRange() + state.heatChangerStateMachine.getRemainingDuration(), + state.heatChangerStateMachine.getActionname(), + state.heatChangerStateMachine.isOverShooting(), + state.heatChangerStateMachine.isGoalInRange() ); } else { text = String.format("%d %s", - state.heatActionStateMachine.getRemainingDuration(), - state.heatActionStateMachine.getActionname() + state.heatChangerStateMachine.getRemainingDuration(), + state.heatChangerStateMachine.getActionname() ); } @@ -363,17 +363,17 @@ private void drawHeatChangersClickbox(Graphics2D graphics) final boolean isLava = change > 0; final boolean isWaterfall = change < 0; - if (stage.getHeat() == heat && state.heatActionStateMachine.isIdle()) + if (stage.getHeat() == heat && state.heatChangerStateMachine.isIdle()) { return; } GameObject shape = null; - if (isWaterfall || state.heatActionStateMachine.isCooling()) + if (isWaterfall || state.heatChangerStateMachine.isCooling()) { shape = waterfall; } - else if (isLava || state.heatActionStateMachine.isHeating()) + else if (isLava || state.heatChangerStateMachine.isHeating()) { shape = lavaPool; } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java similarity index 95% rename from src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java rename to src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java index ccf6204..d25f662 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java @@ -8,7 +8,7 @@ */ @Slf4j @Data -public class HeatActionStateMachine +public class HeatChangerStateMachine { /** * Tick counter for heating, -1 means not currently heating. @@ -62,7 +62,7 @@ public class HeatActionStateMachine * @param state the current state of the foundry * @param config the current configuration of the plugin * @param startingHeat the starting heat amount - * @see HeatActionStateMachine#setup(boolean, boolean, String) + * @see HeatChangerStateMachine#setup(boolean, boolean, String) */ public void start(EasyGiantsFoundryState state, EasyGiantsFoundryConfig config, int startingHeat) { @@ -107,7 +107,7 @@ else if (isCooling()) } /** - * Core logic. Runs once on {@link HeatActionStateMachine#start} and assumes synchronization with the game. + * Core logic. Runs once on {@link HeatChangerStateMachine#start} and assumes synchronization with the game. * Calculate the estimated duration and goal heat amount of the heating/cooling action. */ public void updateEstimates() From 11a442fabf70b242b14b1d0762f3b4db54087702 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Sun, 24 Nov 2024 20:51:52 -0800 Subject: [PATCH 4/7] rename:actionname -> actionName --- .../easygiantsfoundry/EasyGiantsFoundryPlugin.java | 2 +- .../toofifty/easygiantsfoundry/FoundryOverlay3D.java | 4 ++-- .../easygiantsfoundry/HeatChangerStateMachine.java | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 02b082c..262e2f8 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -395,7 +395,7 @@ public void onVarbitChanged(VarbitChanged event) // sign check: num * num > 0 == same sign if (delta != -1) { - if (state.heatChangerStateMachine.getActionname() != null) + if (state.heatChangerStateMachine.getActionName() != null) { // if the state-machine is idle, start it if (state.heatChangerStateMachine.isIdle()) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index efbb823..23dc1c5 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -333,7 +333,7 @@ private void drawHeatChangerStateMachineInfo(Graphics2D graphics, GameObject sta { text = String.format("%d %s (overshoot: %s) [goal-in-range: %s]", state.heatChangerStateMachine.getRemainingDuration(), - state.heatChangerStateMachine.getActionname(), + state.heatChangerStateMachine.getActionName(), state.heatChangerStateMachine.isOverShooting(), state.heatChangerStateMachine.isGoalInRange() ); @@ -342,7 +342,7 @@ private void drawHeatChangerStateMachineInfo(Graphics2D graphics, GameObject sta { text = String.format("%d %s", state.heatChangerStateMachine.getRemainingDuration(), - state.heatChangerStateMachine.getActionname() + state.heatChangerStateMachine.getActionName() ); } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java index d25f662..fe19d69 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java @@ -48,7 +48,7 @@ public class HeatChangerStateMachine * The last action the player clicked on. Used for ui overlay to display. * When null, the state-machine will stop() and reset. */ - String actionname = null; + String actionName = null; private EasyGiantsFoundryState state; private EasyGiantsFoundryConfig config; @@ -140,9 +140,9 @@ public void updateEstimates() */ public void setup(boolean isFast, boolean isHeating, String actionName) { - actionFast = isFast; - actionHeating = isHeating; - actionname = actionName; + this.actionFast = isFast; + this.actionHeating = isHeating; + this.actionName = actionName; } /** @@ -152,7 +152,7 @@ public void stop() { heatingTicks = -1; coolingTicks = -1; - actionname = null; + actionName = null; } /** From 340ef6641cd6249332b15b05511f80aaf04f3d51 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Mon, 25 Nov 2024 01:10:15 -0800 Subject: [PATCH 5/7] heat-changer: new "pending" state for when setup, but not ticked yet. --- .../easygiantsfoundry/HeatChangerStateMachine.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java index fe19d69..ca4d812 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatChangerStateMachine.java @@ -176,9 +176,14 @@ public boolean isCooling() } /** - * Check if the heating/cooling state is currently idle. Neither heating nor cooling. - * - * @return + * @return Check if the state-machine is currently set-up and waiting to start. + */ + public boolean isPending() { + return actionName != null && heatingTicks < 0 && coolingTicks < 0; + } + + /** + * @return Check if the heating/cooling state is currently idle. Neither heating nor cooling. */ public boolean isIdle() { From 894e9eed65845f840b856da60db367d2b6786254 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Mon, 25 Nov 2024 01:11:24 -0800 Subject: [PATCH 6/7] heatchanger-statemachine: always call stop(), even when not idle. To cancel a potential pending state. (also capitalized action name string) --- .../easygiantsfoundry/EasyGiantsFoundryPlugin.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 262e2f8..232e4fd 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -307,29 +307,30 @@ public void onMenuOptionClicked(MenuOptionClicked event) } } + // Could not find a varbit to capture, so capture the menu-option directly. // start the HeatChangerStateMachine when varbit begins to update in onVarbitChanged() if (event.getMenuOption().startsWith("Heat-preform")) { state.heatChangerStateMachine.stop(); - state.heatChangerStateMachine.setup(false, true, "heats"); + state.heatChangerStateMachine.setup(false, true, "Heats"); } else if (event.getMenuOption().startsWith("Dunk-preform")) { state.heatChangerStateMachine.stop(); - state.heatChangerStateMachine.setup(true, true, "dunks"); + state.heatChangerStateMachine.setup(true, true, "Dunks"); } else if (event.getMenuOption().startsWith("Cool-preform")) { state.heatChangerStateMachine.stop(); - state.heatChangerStateMachine.setup(false, false, "cools"); + state.heatChangerStateMachine.setup(false, false, "Cools"); } else if (event.getMenuOption().startsWith("Quench-preform")) { state.heatChangerStateMachine.stop(); - state.heatChangerStateMachine.setup(true, false, "quenches"); + state.heatChangerStateMachine.setup(true, false, "Quenches"); } - else if (!state.heatChangerStateMachine.isIdle()) // canceled heating/cooling, stop the heating state-machine + else // canceled heating/cooling, stop the heating state-machine { state.heatChangerStateMachine.stop(); } From 0bdb7600714f79349145b5cac03994bb93c2241d Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Mon, 25 Nov 2024 02:03:47 -0800 Subject: [PATCH 7/7] overlay3d:now draw overlay when statemachine is in pending state; required refactor to the control flow. --- .../easygiantsfoundry/FoundryOverlay3D.java | 240 +++++++++--------- 1 file changed, 123 insertions(+), 117 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 23dc1c5..1b7e6c9 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -5,7 +5,6 @@ import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_1_VARBIT; import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_2_VARBIT; import com.toofifty.easygiantsfoundry.enums.CommissionType; -import com.toofifty.easygiantsfoundry.enums.Heat; import com.toofifty.easygiantsfoundry.enums.Stage; import java.awt.Color; @@ -155,15 +154,8 @@ public Dimension render(Graphics2D graphics) drawToolHighlight(graphics); } - if (config.highlightWaterAndLava()) - { - drawHeatChangersClickbox(graphics); - } + drawHeatChangersIfEnabled(graphics); - if (config.drawLavaWaterInfoOverlay()) - { - drawHeatChangerInfo(graphics); - } return null; } @@ -182,35 +174,40 @@ private void drawToolHighlight(Graphics2D graphics) } } - private void drawHeatChangerInfo(Graphics2D graphics) + private void drawHeatChangersIfEnabled(Graphics2D graphics) { - if (state.heatChangerStateMachine.isCooling()) { - drawHeatChangerStateMachineInfo(graphics, waterfall); + _drawHeatChangerStateMachineIfEnabled(graphics, waterfall); return; } if (state.heatChangerStateMachine.isHeating()) { - drawHeatChangerStateMachineInfo(graphics, lavaPool); + _drawHeatChangerStateMachineIfEnabled(graphics, lavaPool); return; } - final boolean isLava = state.getHeatChangeNeeded() > 0; - final boolean isWaterfall = state.getHeatChangeNeeded() < 0; - - if (isWaterfall) + if (state.heatChangerStateMachine.isPending()) { - drawHeatChangerPreviewOverlay(graphics, waterfall, false); + final boolean isLava = state.heatChangerStateMachine.actionHeating; + final GameObject gameObject = isLava ? lavaPool : waterfall; + _drawHeatChangerPreviewIfEnabled(graphics, isLava); return; } + final boolean needLava = state.getHeatChangeNeeded() > 0; + final boolean needWaterfall = state.getHeatChangeNeeded() < 0; - if (isLava) + if (needWaterfall) { - drawHeatChangerPreviewOverlay(graphics, lavaPool, true); + _drawHeatChangerPreviewIfEnabled(graphics, false); + return; + } + else if (needLava) + { + _drawHeatChangerPreviewIfEnabled(graphics, true); return; } @@ -221,54 +218,34 @@ private void drawHeatChangerInfo(Graphics2D graphics) if (hoveredMenu.getIdentifier() == lavaPool.getId()) { - drawHeatChangerPreviewOverlay(graphics, lavaPool, true); + _drawHeatChangerPreviewIfEnabled(graphics, true); return; } if (hoveredMenu.getIdentifier() == waterfall.getId()) { - drawHeatChangerPreviewOverlay(graphics, waterfall, false); + _drawHeatChangerPreviewIfEnabled(graphics, false); return; } } } - private void drawObjectClickbox(Graphics2D graphics, GameObject stageObject, Color color) + /** + * Private helper for drawHeatChangersIfEnabled + * An live updating solve for preview before the statemachine has started. Shows both fast and slow. + * Draws both clickbox & info, depending on plugin config. + */ + private void _drawHeatChangerPreviewIfEnabled(Graphics2D graphics, boolean isLava) { - if (stageObject == null) - { - return; - } - Shape objectClickbox = stageObject.getClickbox(); - if (objectClickbox == null) + // early exit if we're not rendering anything + if (!config.highlightWaterAndLava() && !config.drawLavaWaterInfoOverlay()) { return; } - Point mousePosition = client.getMouseCanvasPosition(); - if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY())) - { - graphics.setColor(color.darker()); - } - else - { - graphics.setColor(color); - } - graphics.draw(objectClickbox); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); - graphics.fill(objectClickbox); - } - - private void drawObjectOutline(GameObject stageObject, Color color) - { - Color _color = new Color(color.getRed(), color.getGreen(), color.getBlue(), config.borderAlpha()); - modelOutlineRenderer.drawOutline(stageObject, config.borderThickness(), _color, config.borderFeather()); - } - - private void drawHeatChangerPreviewOverlay(Graphics2D graphics, GameObject stageObject, boolean isLava) - { + GameObject gameObject = isLava ? lavaPool : waterfall; HeatActionSolver.DurationResult fastResult = HeatActionSolver.solve( @@ -296,96 +273,91 @@ private void drawHeatChangerPreviewOverlay(Graphics2D graphics, GameObject stage ); final int slowDuration = slowResult.getDuration(); - final String fastName = isLava ? "dunks" : "quenches"; - final String slowName = isLava ? "heats" : "cools"; - - String text; - if (config.debugging()) + if (fastDuration == 0 && slowDuration == 0) { - text = String.format("%d %s (predicted: %d) or %d %s (predicted: %d) (overshoot: %s goal-in-range: %s)", - fastDuration, fastName, fastResult.getPredictedHeat(), slowDuration, slowName, slowResult.getPredictedHeat(), slowResult.isOvershooting(), fastResult.isGoalInRange()); + return; } - else + + if (config.highlightWaterAndLava()) { - text = String.format("%d %s or %d %s ", - fastDuration, fastName, slowDuration, slowName); + drawObjectClickbox(graphics, gameObject, config.lavaWaterfallColour()); } - LocalPoint stageLoc = stageObject.getLocalLocation(); - stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY()); - - Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50); - if (pos == null) + if (config.drawLavaWaterInfoOverlay()) { - return; - } + final String fastName = isLava ? "Dunks" : "Quenches"; + final String slowName = isLava ? "Heats" : "Cools"; - Color color = config.lavaWaterfallColour(); + String text; + if (config.debugging()) + { + text = String.format("%d %s (predicted: %d) or %d %s (predicted: %d) (overshoot: %s goal-in-range: %s)", + fastDuration, fastName, fastResult.getPredictedHeat(), slowDuration, slowName, slowResult.getPredictedHeat(), slowResult.isOvershooting(), fastResult.isGoalInRange()); + } + else + { + text = String.format("%d %s or %d %s ", + fastDuration, fastName, slowDuration, slowName); + } - OverlayUtil.renderTextLocation(graphics, pos, text, color); - } + LocalPoint stageLoc = gameObject.getLocalLocation(); + stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY()); - private void drawHeatChangerStateMachineInfo(Graphics2D graphics, GameObject stageObject) - { + Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50); + if (pos == null) + { + return; + } - String text; - if (config.debugging()) - { - text = String.format("%d %s (overshoot: %s) [goal-in-range: %s]", - state.heatChangerStateMachine.getRemainingDuration(), - state.heatChangerStateMachine.getActionName(), - state.heatChangerStateMachine.isOverShooting(), - state.heatChangerStateMachine.isGoalInRange() - ); - } - else - { - text = String.format("%d %s", - state.heatChangerStateMachine.getRemainingDuration(), - state.heatChangerStateMachine.getActionName() - ); + OverlayUtil.renderTextLocation(graphics, pos, text, config.lavaWaterfallColour()); } - LocalPoint stageLoc = stageObject.getLocalLocation(); - stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY()); - - Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50); - Color color = config.lavaWaterfallColour(); - - OverlayUtil.renderTextLocation(graphics, pos, text, color); } - private void drawHeatChangersClickbox(Graphics2D graphics) + /** + * Private helper for drawHeatChangersIfEnabled. + * State Machine solves once and tracks the progress over time. Only draws the ongoing action for clarity. + * Draws both clickbox & info, depending on plugin config. + * @param gameObject Lava/Waterfall gameObject + */ + private void _drawHeatChangerStateMachineIfEnabled(Graphics2D graphics, GameObject gameObject) { - final Heat heat = state.getCurrentHeat(); - final Stage stage = state.getCurrentStage(); - final int change = state.getHeatChangeNeeded(); - final boolean isLava = change > 0; - final boolean isWaterfall = change < 0; - - if (stage.getHeat() == heat && state.heatChangerStateMachine.isIdle()) + if (config.highlightWaterAndLava()) { - return; + drawObjectClickbox(graphics, gameObject, config.lavaWaterfallColour()); } - GameObject shape = null; - if (isWaterfall || state.heatChangerStateMachine.isCooling()) - { - shape = waterfall; - } - else if (isLava || state.heatChangerStateMachine.isHeating()) + if (config.drawLavaWaterInfoOverlay()) { - shape = lavaPool; - } + String text; + if (config.debugging()) + { + text = String.format("%d %s (overshoot: %s) [goal-in-range: %s]", + state.heatChangerStateMachine.getRemainingDuration(), + state.heatChangerStateMachine.getActionName(), + state.heatChangerStateMachine.isOverShooting(), + state.heatChangerStateMachine.isGoalInRange() + ); + } + else + { + text = String.format("%d %s", + state.heatChangerStateMachine.getRemainingDuration(), + state.heatChangerStateMachine.getActionName() + ); + } - if (shape != null) - { - drawObjectClickbox(graphics, shape, config.lavaWaterfallColour()); - } + LocalPoint stageLoc = gameObject.getLocalLocation(); + stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY()); + Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50); + + OverlayUtil.renderTextLocation(graphics, pos, text, config.lavaWaterfallColour()); + } } + private void drawCrucibleContent(Graphics2D graphics) { if (!config.drawCrucibleInfoOverlay()) @@ -605,4 +577,38 @@ private void drawHeatLeftInfo(Graphics2D graphics) } OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); } + + private void drawObjectClickbox(Graphics2D graphics, GameObject stageObject, Color color) + { + if (stageObject == null) + { + return; + } + + Shape objectClickbox = stageObject.getClickbox(); + if (objectClickbox == null) + { + return; + } + + Point mousePosition = client.getMouseCanvasPosition(); + if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY())) + { + graphics.setColor(color.darker()); + } + else + { + graphics.setColor(color); + } + graphics.draw(objectClickbox); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); + graphics.fill(objectClickbox); + } + + private void drawObjectOutline(GameObject stageObject, Color color) + { + Color _color = new Color(color.getRed(), color.getGreen(), color.getBlue(), config.borderAlpha()); + modelOutlineRenderer.drawOutline(stageObject, config.borderThickness(), _color, config.borderFeather()); + } + }