From 148ee94347f9783bd0aa70632db6c5a49a868cbc Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 21 Nov 2024 11:37:10 -0800 Subject: [PATCH 1/5] bugfix: sometimes perspective returns null, I assume because object culled? --- .../com/toofifty/easygiantsfoundry/FoundryOverlay3D.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 3f60076..5d49698 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -271,6 +271,11 @@ public class FoundryOverlay3D extends Overlay stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY()); Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50); + if (pos == null) + { + return; + } + Color color = config.lavaWaterfallColour(); OverlayUtil.renderTextLocation(graphics, pos, text, color); From d6281c17540889ee9e4019c3db0e313ba467dd2d Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 21 Nov 2024 11:39:52 -0800 Subject: [PATCH 2/5] removed unused code --- .../com/toofifty/easygiantsfoundry/FoundryOverlay3D.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 5d49698..8689ee4 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -222,12 +222,6 @@ public class FoundryOverlay3D extends Overlay ) { - int sign = isLava ? 1 : -1; - int fastVelocity = 27 * sign; - int slowVelocity = 7 * sign; - int fastAccelBonus = 2 * sign; - int slowAccelBonus = 0; - HeatActionSolver.DurationResult fastResult = HeatActionSolver.solve( state.getCurrentStage(), From 77e2e2ebe4a4fac22cd180462d8ca115570ff1db Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 21 Nov 2024 11:46:46 -0800 Subject: [PATCH 3/5] heat solver: decay calculations now considers distances to tools. can now use 0 padding without issues. --- .../EasyGiantsFoundryConfig.java | 8 +-- .../EasyGiantsFoundryState.java | 8 ++- .../easygiantsfoundry/FoundryOverlay3D.java | 6 ++- .../easygiantsfoundry/HeatActionSolver.java | 50 +++++++++++++++++-- .../HeatActionStateMachine.java | 3 +- 5 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java index baf7ea2..7766f3b 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java @@ -520,15 +520,15 @@ public interface EasyGiantsFoundryConfig extends Config max = 50 ) @ConfigItem( - keyName = "heatActionBuffer", // renamed to reset player's settings for previous bugged implementation - name = "Lava/Waterfall Padding Ticks", - description = "Units in ticks; buffers more than optimal heat when in lava/waterfall calculations to compensate for heat decay when the player is afk or running/walking slower than optimal.", + keyName = "paddingTicks", // renamed to reset player's settings for previous bugged implementation + name = "Padding Ticks", + description = "Number of inefficient idle ticks between actions; calculations will pad more than optimal heat compensate for heat decay during idle/afk.", position = 0, section = advancedSettings ) default int heatActionPadTicks() { - return 4; + return 3; } @ConfigItem( diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java index 0e1ba90..1a80774 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java @@ -49,6 +49,8 @@ public class EasyGiantsFoundryState private final List stages = new ArrayList<>(); private double heatRangeRatio = 0; + public final HeatActionStateMachine heatActionStateMachine = new HeatActionStateMachine(); + public void reset() { stages.clear(); @@ -335,5 +337,9 @@ public class EasyGiantsFoundryState return actions; } - public HeatActionStateMachine heatActionStateMachine = new HeatActionStateMachine(); + + public boolean isPlayerRunning() + { + return client.getVarpValue(173) == 1; + } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 8689ee4..d7283d7 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -230,7 +230,8 @@ public class FoundryOverlay3D extends Overlay state.getHeatAmount(), true, isLava, - config.heatActionPadTicks() * 2 + config.heatActionPadTicks(), + state.isPlayerRunning() ); final int fastDuration = fastResult.getDuration(); @@ -242,7 +243,8 @@ public class FoundryOverlay3D extends Overlay state.getHeatAmount(), false, isLava, - config.heatActionPadTicks() * 2 + config.heatActionPadTicks(), + state.isPlayerRunning() ); final int slowDuration = slowResult.getDuration(); diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java index 6516e15..0478f40 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java @@ -119,6 +119,24 @@ public class HeatActionSolver 95, 91, // last one will always overshoot 1000 }; + + + // index 1 is stage, ordinal order + // index 2 [0] = lava [1] = waterfall + // in units of tiles + public static final int[][] DISTANCE_TO_STAGE = new int[][] { + new int[] {4, 14}, + new int[] {7, 9}, + new int[] {12, 10} + }; + + // 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; @@ -206,16 +224,24 @@ public class HeatActionSolver int start, boolean isFast, boolean isActionHeating, - int padding) + int paddingTicks, + boolean isRunning) { 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 travelTicks = solveTravelTicks(isRunning, stage, isActionHeating) + toolDelay; + final int travelDecay = (int) Math.ceil((double) travelTicks / 2); + + final int paddingDecay = (int) Math.ceil((double) paddingTicks / 2); // adding 2.4s/8ticks worth of padding so preform doesn't decay out of range // average distance from lava+waterfall around 8 ticks // preform decays 1 heat every 2 ticks - final int min = Math.max(0, Math.min(1000, range[0] + padding)); - final int max = Math.max(0, Math.min(1000, range[1] + padding)); + final int min = Math.max(0, Math.min(1000, range[0] + paddingDecay + travelDecay)); + final int max = Math.max(0, Math.min(1000, range[1] + paddingDecay + travelDecay)); final int actionsLeft_DeltaHeat = actionLeftInStage * stage.getHeatChange(); @@ -340,5 +366,23 @@ public class HeatActionSolver return DurationResult.of(estimatedDuration, goalInRange, overshoot, start + dx0); } + private static int solveTravelTicks(boolean isRunning, Stage stage, boolean isLava) + { + final int index1 = stage.ordinal(); + final int index2 = isLava ? 0 : 1; + final int distance = DISTANCE_TO_STAGE[index1][index2]; + + if (isRunning) + { + // for odd distances, like 7 + // 7 / 2 = 3.5 + // rounded to 4 + return (int) Math.ceil((double) distance / 2); + } + else + { + return distance; + } + } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java index c0c3d19..ccf6204 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java @@ -121,7 +121,8 @@ public class HeatActionStateMachine getStartingHeat(), actionFast, isHeating(), - config.heatActionPadTicks() * 2 + config.heatActionPadTicks(), + state.isPlayerRunning() ); goalInRange = result.isGoalInRange(); From 1ece6c01d421b6830fa3d75739888f7dcfdde258 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 21 Nov 2024 12:01:44 -0800 Subject: [PATCH 4/5] renamed padding ticks config back to heatActionBuffer. --- .../com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java index 7766f3b..2c85d84 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java @@ -520,7 +520,7 @@ public interface EasyGiantsFoundryConfig extends Config max = 50 ) @ConfigItem( - keyName = "paddingTicks", // renamed to reset player's settings for previous bugged implementation + keyName = "heatActionBuffer", // renamed to reset player's settings for previous bugged implementation name = "Padding Ticks", description = "Number of inefficient idle ticks between actions; calculations will pad more than optimal heat compensate for heat decay during idle/afk.", position = 0, From 22108a330ff124cffd118c18472f44d2082dd124 Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 21 Nov 2024 12:53:41 -0800 Subject: [PATCH 5/5] minor:refactor for tool to lava/water distances for clarity --- .../easygiantsfoundry/HeatActionSolver.java | 21 ++++++++----------- .../easygiantsfoundry/enums/Stage.java | 10 ++++++--- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java index 0478f40..b40a11a 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java @@ -121,15 +121,6 @@ public class HeatActionSolver }; - // index 1 is stage, ordinal order - // index 2 [0] = lava [1] = waterfall - // in units of tiles - public static final int[][] DISTANCE_TO_STAGE = new int[][] { - new int[] {4, 14}, - new int[] {7, 9}, - new int[] {12, 10} - }; - // index is stage, ordinal order public static final int[] TOOL_TICK_CYCLE = new int[] { 5, @@ -368,9 +359,15 @@ public class HeatActionSolver private static int solveTravelTicks(boolean isRunning, Stage stage, boolean isLava) { - final int index1 = stage.ordinal(); - final int index2 = isLava ? 0 : 1; - final int distance = DISTANCE_TO_STAGE[index1][index2]; + final int distance; + if (isLava) + { + distance = stage.getDistanceToLava(); + } + else + { + distance = stage.getDistanceToWaterfall(); + } if (isRunning) { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java b/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java index 35b670c..72a194e 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java @@ -7,15 +7,18 @@ import lombok.Getter; @AllArgsConstructor public enum Stage { - TRIP_HAMMER("Hammer", Heat.HIGH, 20, -25), - GRINDSTONE("Grind", Heat.MED, 10, 15), - POLISHING_WHEEL("Polish", Heat.LOW, 10, -17); + 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); private final String name; private final Heat heat; private final int progressPerAction; private final int heatChange; + private final int distanceToLava; + private final int distanceToWaterfall; + public boolean isHeating() { return heatChange > 0; @@ -25,4 +28,5 @@ public enum Stage { return heatChange < 0; } + }