diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 73e12683dd..3277622f4d 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -439,6 +439,7 @@ public enum Varbits FARMING_7909(7909), FARMING_7910(7910), FARMING_7911(7911), + FARMING_7912(7912), /** * Transmog controllers for grapes diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java index 2d9ffced83..50190234e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/CropState.java @@ -36,7 +36,9 @@ public enum CropState HARVESTABLE(ColorScheme.PROGRESS_COMPLETE_COLOR), GROWING(ColorScheme.PROGRESS_COMPLETE_COLOR), DISEASED(ColorScheme.PROGRESS_INPROGRESS_COLOR), - DEAD(ColorScheme.PROGRESS_ERROR_COLOR); + DEAD(ColorScheme.PROGRESS_ERROR_COLOR), + EMPTY(ColorScheme.MEDIUM_GRAY_COLOR), + FILLING(ColorScheme.PROGRESS_INPROGRESS_COLOR); private final Color color; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java index 870ca5020f..1c068790c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTabPanel.java @@ -177,6 +177,12 @@ public class FarmingTabPanel extends TabContentPanel case DEAD: panel.getEstimate().setText("Dead"); break; + case EMPTY: + panel.getEstimate().setText("Empty"); + break; + case FILLING: + panel.getEstimate().setText("Filling"); + break; } /* Hide any fully grown weeds' progress bar. */ diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java index 6ba40c76b1..9d9812b319 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java @@ -73,7 +73,8 @@ class FarmingWorld new FarmingPatch("North", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT), new FarmingPatch("South", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT), new FarmingPatch("", Varbits.FARMING_4773, PatchImplementation.FLOWER), - new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB) + new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB), + new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.COMPOST) )); add(new FarmingRegion("Brimhaven", 11058, @@ -85,7 +86,8 @@ class FarmingWorld new FarmingPatch("North", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT), new FarmingPatch("South", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT), new FarmingPatch("", Varbits.FARMING_4773, PatchImplementation.FLOWER), - new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB) + new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB), + new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.COMPOST) ) { @Override @@ -133,7 +135,8 @@ class FarmingWorld new FarmingPatch("North West", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT), new FarmingPatch("South East", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT), new FarmingPatch("", Varbits.FARMING_4773, PatchImplementation.FLOWER), - new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB) + new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB), + new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.COMPOST) ) { @Override @@ -167,7 +170,8 @@ class FarmingWorld new FarmingPatch("North East", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT), new FarmingPatch("South West", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT), new FarmingPatch("", Varbits.FARMING_4773, PatchImplementation.FLOWER), - new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB) + new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB), + new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.COMPOST) )); add(new FarmingRegion("Kourend", 6711, new FarmingPatch("", Varbits.FARMING_7904, PatchImplementation.SPIRIT_TREE) @@ -205,7 +209,8 @@ class FarmingWorld new FarmingPatch("North West", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT), new FarmingPatch("South East", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT), new FarmingPatch("", Varbits.FARMING_4773, PatchImplementation.FLOWER), - new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB) + new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB), + new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.COMPOST) )); @@ -260,6 +265,7 @@ class FarmingWorld new FarmingPatch("", Varbits.FARMING_7906, PatchImplementation.FLOWER), new FarmingPatch("North", Varbits.FARMING_4773, PatchImplementation.ALLOTMENT), new FarmingPatch("South", Varbits.FARMING_4774, PatchImplementation.ALLOTMENT), + new FarmingPatch("", Varbits.FARMING_7912, PatchImplementation.GIANT_COMPOST), new FarmingPatch("", Varbits.FARMING_7904, PatchImplementation.CACTUS), new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.SPIRIT_TREE), new FarmingPatch("", Varbits.FARMING_7909, PatchImplementation.FRUIT_TREE), @@ -272,7 +278,8 @@ class FarmingWorld new FarmingPatch("North", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT), new FarmingPatch("South", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT), new FarmingPatch("", Varbits.FARMING_4773, PatchImplementation.FLOWER), - new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.CRYSTAL_TREE) + new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.CRYSTAL_TREE), + new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.COMPOST) // TODO: Find correct varbit )); // Finalize diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java index 401269d34d..c4af8c2596 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchImplementation.java @@ -2603,6 +2603,182 @@ public enum PatchImplementation } return null; } + }, + COMPOST(Tab.SPECIAL, "Compost Bin") + { + @Override + PatchState forVarbitValue(int value) + { + if (value == 0) + { + // Compost bin[Examine] 7808 + return new PatchState(Produce.EMPTY_COMPOST_BIN, CropState.EMPTY, 0); + } + if (value >= 1 && value <= 15) + { + // Compost bin[Examine,Dump] 3830 + return new PatchState(Produce.COMPOST, CropState.FILLING, value - 1); + } + if (value >= 16 && value <= 30) + { + // Compost bin[Take,Examine,Dump] 19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064 + return new PatchState(Produce.COMPOST, CropState.HARVESTABLE, value - 16); + } + if (value == 31 || value == 32) + { + // Compost bin[Open,Examine,Dump] 3849,3849 + return new PatchState(Produce.COMPOST, CropState.GROWING, value - 31); + } + if (value >= 33 && value <= 47) + { + // Compost bin[Examine,Dump] 19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080 + return new PatchState(Produce.SUPERCOMPOST, CropState.FILLING, value - 33); // 33 means there is 1 item + } + if (value >= 48 && value <= 62) + { + // Compost bin[Take,Examine,Dump] 19097 + return new PatchState(Produce.SUPERCOMPOST, CropState.HARVESTABLE, value - 48); // 48 means there is only 1 bucket left + } + if (value == 94) + { + // Compost bin[Open,Examine,Dump] 3850 + return new PatchState(Produce.COMPOST, CropState.GROWING, Produce.COMPOST.getStages() - 1); + } + if (value == 95 || value == 96) + { + // Compost bin[Open,Examine,Dump] 19082,19082 + return new PatchState(Produce.SUPERCOMPOST, CropState.GROWING, value - 95); + } + if (value == 126) + { + // Compost bin[Open,Examine,Dump] 19082 + return new PatchState(Produce.SUPERCOMPOST, CropState.GROWING, Produce.SUPERCOMPOST.getStages() - 1); + } + if (value >= 129 && value <= 143) + { + // Giant compost bin[Close,Examine,Dump] 19098..19111,20099 + return new PatchState(Produce.ROTTEN_TOMATO, CropState.FILLING, value - 129); + } + if (value >= 144 && value <= 158) + { + // Giant compost bin[Take,Examine,Dump] 20102..20116 + return new PatchState(Produce.ROTTEN_TOMATO, CropState.HARVESTABLE, value - 144); + } + if (value >= 159 && value <= 160) + { + // Giant compost bin[Open,Examine,Dump] 20100 + return new PatchState(Produce.ROTTEN_TOMATO, CropState.GROWING, value - 159); + } + if (value >= 176 && value <= 190) + { + // Compost bin[Take,Examine,Dump] 30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516 + return new PatchState(Produce.ULTRACOMPOST, CropState.HARVESTABLE, value - 176); + } + return null; + } + }, + GIANT_COMPOST(Tab.SPECIAL, "Giant Compost Bin") + { + @Override + PatchState forVarbitValue(int value) + { + if (value == 0) + { + // Big compost bin[Examine] 33762 + return new PatchState(Produce.EMPTY_GIANT_COMPOST_BIN, CropState.EMPTY, 0); + } + if (value >= 1 && value <= 15) + { + // Big compost bin[Examine,Dump] 33763..33777 + return new PatchState(Produce.GIANT_COMPOST, CropState.FILLING, value - 1); + } + if (value >= 16 && value <= 30) + { + // Big compost bin[Take,Examine,Dump] 33795..33809 + return new PatchState(Produce.GIANT_COMPOST, CropState.HARVESTABLE, value - 16); + } + if (value >= 33 && value <= 47) + { + // Big compost bin[Examine,Dump] 33825..33839 + return new PatchState(Produce.GIANT_SUPERCOMPOST, CropState.FILLING, value - 33); + } + if (value >= 48 && value <= 62) + { + // Big compost bin[Take,Examine,Dump] 33857..33871 + return new PatchState(Produce.GIANT_SUPERCOMPOST, CropState.HARVESTABLE, value - 48); + } + if (value >= 63 && value <= 77) + { + // Big compost bin[Examine,Dump] 33778..33792 + return new PatchState(Produce.GIANT_COMPOST, CropState.FILLING, 15 + value - 63); + } + if (value >= 78 && value <= 92) + { + // Giant compost bin[Take,Examine,Dump] 33810..33824 + return new PatchState(Produce.GIANT_COMPOST, CropState.HARVESTABLE, 15 + value - 78); + } + if (value == 93) + { + // Giant compost bin[Open,Examine,Dump] 33794 + return new PatchState(Produce.GIANT_COMPOST, CropState.GROWING, Produce.GIANT_COMPOST.getStages() - 1); + } + if (value >= 97 && value <= 99) + { + // Giant compost bin[Open,Examin,Dump] 33855,33855 + return new PatchState(Produce.GIANT_SUPERCOMPOST, CropState.GROWING, value - 97); // Once closed, starts rotting (super compost) + } + if (value >= 100 && value <= 114) + { + // Giant compost bin[Take,Examine,Dump] 33872..33886 + return new PatchState(Produce.GIANT_SUPERCOMPOST, CropState.HARVESTABLE, 15 + value - 100); + } + if (value >= 127 && value <= 128) + { + // Giant compost bin[Open,Examine,Dump] 33793,33793 + return new PatchState(Produce.GIANT_COMPOST, CropState.GROWING, value - 127); + } + if (value >= 129 && value <= 143) + { + // Giant compost bin[Close,Examine,Dump] 33887..33901 + return new PatchState(Produce.GIANT_ROTTEN_TOMATO, CropState.FILLING, value - 129); + } + if (value >= 144 && value <= 158) + { + // Giant compost bin[Take,Examine,Dump] 33919..33933 + return new PatchState(Produce.GIANT_ROTTEN_TOMATO, CropState.HARVESTABLE, value - 144); + } + if (value >= 159 && value <= 160) + { + // Giant compost bin[Open,Examine,Dump] 33917,33917 + return new PatchState(Produce.GIANT_ROTTEN_TOMATO, CropState.GROWING, value - 159); + } + if (value >= 161 && value <= 175) + { + // Giant compost bin[Examine,Dump] 33840..33854 + return new PatchState(Produce.GIANT_SUPERCOMPOST, CropState.FILLING, 15 + value - 161); // 161 means there are 16 items + } + if (value >= 176 && value <= 205) + { + // Giant compost bin[Take,Examine,Dump] 33957..33986 + return new PatchState(Produce.GIANT_ULTRACOMPOST, CropState.HARVESTABLE, value - 176); + } + if (value >= 207 && value <= 221) + { + // Giant compost bin[Take,Examine,Dump] 33934..33948 + return new PatchState(Produce.GIANT_ROTTEN_TOMATO, CropState.HARVESTABLE, 15 + value - 207); + } + if (value == 222) + { + // Giant compost bin[Open,Examine,Dump] 33918 + return new PatchState(Produce.GIANT_ROTTEN_TOMATO, CropState.GROWING, Produce.GIANT_ROTTEN_TOMATO.getStages() - 1); + } + if (value >= 223 && value <= 237) + { + // Giant compost bin[Close,Examine,Dump] 33902..33916 + return new PatchState(Produce.GIANT_ROTTEN_TOMATO, CropState.FILLING, 15 + value - 223); + } + return null; + } }; @Nullable diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java index 2857882b3f..1f2655c248 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/PatchState.java @@ -35,7 +35,7 @@ class PatchState int getStages() { - return cropState == CropState.HARVESTABLE ? produce.getHarvestStages() : produce.getStages(); + return cropState == CropState.HARVESTABLE || cropState == CropState.FILLING ? produce.getHarvestStages() : produce.getStages(); } int getTickRate() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java index 8909a54b92..ae19316f54 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/Produce.java @@ -131,7 +131,19 @@ public enum Produce CELASTRUS("Celastrus", "Celastrus tree", PatchImplementation.CELASTRUS, ItemID.BATTLESTAFF, 160, 6, 0, 4), REDWOOD("Redwood", "Redwood tree", PatchImplementation.REDWOOD, ItemID.REDWOOD_LOGS, 640, 11), HESPORI("Hespori", NullItemID.NULL_23044, 640, 4, 0, 2), - CRYSTAL_TREE("Crystal tree", ItemID.CRYSTAL_SHARDS, 80, 7); + CRYSTAL_TREE("Crystal tree", ItemID.CRYSTAL_SHARDS, 80, 7), + + // Compost bins + EMPTY_COMPOST_BIN("Compost Bin", PatchImplementation.COMPOST, ItemID.COMPOST_BIN, 0, 1, 0, 0), // Dummy produce for the empty state + COMPOST("Compost", PatchImplementation.COMPOST, ItemID.COMPOST, 40, 3, 0, 15), + SUPERCOMPOST("Supercompost", PatchImplementation.COMPOST, ItemID.SUPERCOMPOST, 40, 3, 0, 15), + ULTRACOMPOST("Ultracompost", PatchImplementation.COMPOST, ItemID.ULTRACOMPOST, 0, 3, 0, 15), // Ultra doesn't compost, + ROTTEN_TOMATO("Rotten Tomato", PatchImplementation.COMPOST, ItemID.ROTTEN_TOMATO, 40, 3, 0, 15), + EMPTY_GIANT_COMPOST_BIN("Giant Compost Bin", PatchImplementation.COMPOST, ItemID.COMPOST_BIN, 0, 1, 0, 0), // Dummy produce for the empty state + GIANT_COMPOST("Compost", PatchImplementation.GIANT_COMPOST, ItemID.COMPOST, 40, 3, 0, 30), + GIANT_SUPERCOMPOST("Supercompost", PatchImplementation.GIANT_COMPOST, ItemID.SUPERCOMPOST, 40, 3, 0, 30), + GIANT_ULTRACOMPOST("Ultracompost", PatchImplementation.GIANT_COMPOST, ItemID.ULTRACOMPOST, 0, 3, 0, 30), // Ultra doesn't compost + GIANT_ROTTEN_TOMATO("Rotten Tomato", PatchImplementation.GIANT_COMPOST, ItemID.ROTTEN_TOMATO, 40, 3, 0, 30); /** * User-visible name diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java index 6ed2f81f60..66ed12bca1 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timetracking/farming/PatchImplementationTest.java @@ -52,7 +52,7 @@ public class PatchImplementationTest collector.checkThat(pfx + ": produce", s.getProduce(), notNullValue()); collector.checkThat(pfx + ": negative stage", s.getStage(), greaterThanOrEqualTo(0)); int stages = s.getProduce().getStages(); - if (s.getCropState() == CropState.HARVESTABLE) + if (s.getCropState() == CropState.HARVESTABLE || s.getCropState() == CropState.FILLING) { stages = s.getProduce().getHarvestStages(); } @@ -63,7 +63,8 @@ public class PatchImplementationTest } if (s.getCropState() == CropState.GROWING && s.getProduce() != Produce.WEEDS && s.getStage() < stages) { - harvestStages.computeIfAbsent(s.getProduce(), k -> new boolean[s.getProduce().getStages()])[s.getStage()] = true; + final int realStages = stages; + harvestStages.computeIfAbsent(s.getProduce(), k -> new boolean[realStages])[s.getStage()] = true; } } }