Merge pull request #7384 from Abextm/farming-guild

farming: Support Kebos Lowlands update
This commit is contained in:
Abex
2019-01-16 16:09:02 -07:00
committed by GitHub
11 changed files with 947 additions and 610 deletions

View File

@@ -390,6 +390,15 @@ public enum Varbits
FARMING_4772(4772), FARMING_4772(4772),
FARMING_4773(4773), FARMING_4773(4773),
FARMING_4774(4774), FARMING_4774(4774),
FARMING_4775(4775),
FARMING_7904(7904),
FARMING_7905(7905),
FARMING_7906(7906),
FARMING_7907(7907),
FARMING_7908(7908),
FARMING_7909(7909),
FARMING_7910(7910),
FARMING_7911(7911),
/** /**
* Transmog controllers for grapes * Transmog controllers for grapes

View File

@@ -220,6 +220,12 @@
<version>4.12</version> <version>4.12</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.mockito</groupId> <groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId> <artifactId>mockito-all</artifactId>

View File

@@ -226,7 +226,6 @@ public class GrandExchangeOfferSlot extends JPanel
progressBar.setForeground(getProgressColor(newOffer)); progressBar.setForeground(getProgressColor(newOffer));
progressBar.setMaximumValue(newOffer.getTotalQuantity()); progressBar.setMaximumValue(newOffer.getTotalQuantity());
progressBar.setValue(newOffer.getQuantitySold()); progressBar.setValue(newOffer.getQuantitySold());
progressBar.update();
/* Couldn't set the tooltip for the container panel as the children override it, so I'm setting /* Couldn't set the tooltip for the container panel as the children override it, so I'm setting
* the tooltips on the children instead. */ * the tooltips on the children instead. */

View File

@@ -250,7 +250,6 @@ public class FarmingTabPanel extends TabContentPanel
panel.getProgress().setForeground(state.getCropState().getColor().darker()); panel.getProgress().setForeground(state.getCropState().getColor().darker());
panel.getProgress().setMaximumValue(stages - 1); panel.getProgress().setMaximumValue(stages - 1);
panel.getProgress().setValue(stage); panel.getProgress().setValue(stage);
panel.getProgress().update();
} }
else else
{ {

View File

@@ -57,7 +57,7 @@ class FarmingWorld
// Some of these patches get updated in multiple regions. // Some of these patches get updated in multiple regions.
// It may be worth it to add a specialization for these patches // It may be worth it to add a specialization for these patches
add(new FarmingRegion("Al Kharid", 13106, add(new FarmingRegion("Al Kharid", 13106,
new FarmingPatch("Cactus", Varbits.FARMING_4771, PatchImplementation.CACTUS) new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.CACTUS)
)); ));
add(new FarmingRegion("Ardougne", 10290, add(new FarmingRegion("Ardougne", 10290,
@@ -225,6 +225,25 @@ class FarmingWorld
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.HERB) new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.HERB)
)); ));
add(new FarmingRegion("Farming Guild", 5021,
new FarmingPatch("Hespori", Varbits.FARMING_7908, PatchImplementation.HESPORI)
));
add(new FarmingRegion("Farming Guild", 4922,
new FarmingPatch("", Varbits.FARMING_7905, PatchImplementation.TREE),
new FarmingPatch("", Varbits.FARMING_4775, PatchImplementation.HERB),
new FarmingPatch("", Varbits.FARMING_4772, PatchImplementation.BUSH),
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_7904, PatchImplementation.CACTUS),
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.SPIRIT_TREE),
new FarmingPatch("", Varbits.FARMING_7909, PatchImplementation.FRUIT_TREE),
new FarmingPatch("Anima", Varbits.FARMING_7911, PatchImplementation.ANIMA),
new FarmingPatch("", Varbits.FARMING_7910, PatchImplementation.CELASTRUS),
new FarmingPatch("", Varbits.FARMING_7907, PatchImplementation.REDWOOD)
));
// Finalize // Finalize
this.regions = Collections.unmodifiableMap(regions); this.regions = Collections.unmodifiableMap(regions);
Map<Tab, Set<FarmingPatch>> umtabs = new TreeMap<>(); Map<Tab, Set<FarmingPatch>> umtabs = new TreeMap<>();

View File

@@ -28,6 +28,7 @@ package net.runelite.client.plugins.timetracking.farming;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.NullItemID;
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
@@ -44,6 +45,7 @@ public enum Produce
SWEETCORN("Sweetcorn", ItemID.SWEETCORN, 10, 6, 0, 3), SWEETCORN("Sweetcorn", ItemID.SWEETCORN, 10, 6, 0, 3),
STRAWBERRY("Strawberry", ItemID.STRAWBERRY, 10, 7, 0, 3), STRAWBERRY("Strawberry", ItemID.STRAWBERRY, 10, 7, 0, 3),
WATERMELON("Watermelon", ItemID.WATERMELON, 10, 8, 0, 3), WATERMELON("Watermelon", ItemID.WATERMELON, 10, 8, 0, 3),
SNAPE_GRASS("Snape grass", ItemID.SNAPE_GRASS, 10, 8, 0, 3),
// Flower crops // Flower crops
MARIGOLD("Marigold", ItemID.MARIGOLDS, 5, 5), MARIGOLD("Marigold", ItemID.MARIGOLDS, 5, 5),
@@ -51,6 +53,7 @@ public enum Produce
NASTURTIUM("Nasturtium", ItemID.NASTURTIUMS, 5, 5), NASTURTIUM("Nasturtium", ItemID.NASTURTIUMS, 5, 5),
WOAD("Woad", ItemID.WOAD_LEAF, 5, 5), WOAD("Woad", ItemID.WOAD_LEAF, 5, 5),
LIMPWURT("Limpwurt", ItemID.LIMPWURT_ROOT, 5, 5), LIMPWURT("Limpwurt", ItemID.LIMPWURT_ROOT, 5, 5),
WHITE_LILY("While lily", ItemID.WHITE_LILY, 5, 5),
// Bush crops // Bush crops
REDBERRIES("Redberry", ItemID.REDBERRIES, 20, 6, 20, 5), REDBERRIES("Redberry", ItemID.REDBERRIES, 20, 6, 20, 5),
@@ -85,7 +88,7 @@ public enum Produce
DWARF_WEED("Dwarf Weed", ItemID.DWARF_WEED, 20, 5, 0, 3), DWARF_WEED("Dwarf Weed", ItemID.DWARF_WEED, 20, 5, 0, 3),
TORSTOL("Torstol", ItemID.TORSTOL, 20, 5, 0, 3), TORSTOL("Torstol", ItemID.TORSTOL, 20, 5, 0, 3),
GOUTWEED("Goutweed", ItemID.GOUTWEED, 20, 5, 0, 2), GOUTWEED("Goutweed", ItemID.GOUTWEED, 20, 5, 0, 2),
ANYHERB("Any Herb", ItemID.GUAM_LEAF, 20, 5, 0, 3), ANYHERB("Any herb", ItemID.GUAM_LEAF, 20, 5, 0, 3),
// Tree crops // Tree crops
OAK("Oak", ItemID.OAK_LOGS, 40, 5), OAK("Oak", ItemID.OAK_LOGS, 40, 5),
@@ -102,17 +105,31 @@ public enum Produce
PINEAPPLE("Pineapple", ItemID.PINEAPPLE, 160, 7, 45, 7), PINEAPPLE("Pineapple", ItemID.PINEAPPLE, 160, 7, 45, 7),
PAPAYA("Papaya", ItemID.PAPAYA_FRUIT, 160, 7, 45, 7), PAPAYA("Papaya", ItemID.PAPAYA_FRUIT, 160, 7, 45, 7),
PALM("Palm", ItemID.COCONUT, 160, 7, 45, 7), PALM("Palm", ItemID.COCONUT, 160, 7, 45, 7),
DRAGONFRUIT("Dragonfruit", ItemID.DRAGONFRUIT, 160, 7, 45, 7),
// Cactus
CACTUS("Cactus", ItemID.CACTUS_SPINE, 80, 8, 20, 4),
POTATO_CACTUS("Potato cactus", ItemID.POTATO_CACTUS, 10, 8, 5, 7),
// Hardwood
TEAK("Teak", ItemID.TEAK_LOGS, 560, 8),
MAHOGANY("Mahogany", ItemID.MAHOGANY_LOGS, 640, 9),
// Anima
ATTAS("Attas", NullItemID.NULL_22940, 640, 9),
IASOR("Iasro", NullItemID.NULL_22939, 640, 9),
KRONOS("Kronos", NullItemID.NULL_22938, 640, 9),
// Special crops // Special crops
SEAWEED("Seaweed", ItemID.GIANT_SEAWEED, 10, 5, 0, 4), SEAWEED("Seaweed", ItemID.GIANT_SEAWEED, 10, 5, 0, 4),
TEAK("Teak", ItemID.TEAK_LOGS, 560, 8),
GRAPE("Grape", ItemID.GRAPES, 5, 8, 0, 5), GRAPE("Grape", ItemID.GRAPES, 5, 8, 0, 5),
MUSHROOM("Mushroom", ItemID.MUSHROOM, 40, 7, 0, 7), MUSHROOM("Mushroom", ItemID.MUSHROOM, 40, 7, 0, 7),
MAHOGANY("Mahogany", ItemID.MAHOGANY_LOGS, 640, 9),
CACTUS("Cactus", ItemID.POTATO_CACTUS, 80, 8, 20, 4),
BELLADONNA("Belladonna", ItemID.CAVE_NIGHTSHADE, 80, 5), BELLADONNA("Belladonna", ItemID.CAVE_NIGHTSHADE, 80, 5),
CALQUAT("Calquat", ItemID.CALQUAT_FRUIT, 160, 9, 0, 7), CALQUAT("Calquat", ItemID.CALQUAT_FRUIT, 160, 9, 0, 7),
SPIRIT_TREE("Spirit Tree", ItemID.SPIRIT_TREE, 320, 13); SPIRIT_TREE("Spirit tree", ItemID.SPIRIT_TREE, 320, 13),
CELASTRUS("Celastrus", ItemID.BATTLESTAFF, 160, 6, 0, 4),
REDWOOD("Redwood", ItemID.REDWOOD_LOGS, 640, 11),
HESPORI("Hespori", NullItemID.NULL_23044, 640, 4, 0, 2);
/** /**
* User-visible name * User-visible name

View File

@@ -144,8 +144,6 @@ public class BirdHouseTabPanel extends TabContentPanel
panel.getEstimate().setText("Unknown"); panel.getEstimate().setText("Unknown");
break; break;
} }
panel.getProgress().update();
} }
} }
} }

View File

@@ -25,69 +25,71 @@
*/ */
package net.runelite.client.ui.components; package net.runelite.client.ui.components;
import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel; import javax.swing.JPanel;
import lombok.Setter; import lombok.Getter;
import net.runelite.client.ui.ColorScheme;
/** /**
* A progress bar to be displayed underneath the GE offer item panels * A progress bar to be displayed underneath the GE offer item panels
*/ */
public class ThinProgressBar extends JPanel public class ThinProgressBar extends JPanel
{ {
@Setter @Getter
private int maximumValue; private int maximumValue = 1;
@Setter @Getter
private int value; private int value;
private final JPanel topBar = new JPanel();
public ThinProgressBar() public ThinProgressBar()
{ {
setLayout(new BorderLayout()); setForeground(Color.GREEN);
setBackground(Color.GREEN.darker()); setMaximumSize(new Dimension(Integer.MAX_VALUE, 4));
setMinimumSize(new Dimension(0, 4));
topBar.setPreferredSize(new Dimension(100, 4)); setPreferredSize(new Dimension(0, 4));
topBar.setBackground(ColorScheme.PROGRESS_COMPLETE_COLOR); setSize(new Dimension(0, 4));
setOpaque(true);
add(topBar, BorderLayout.WEST);
}
/**
* Updates the UI based on the percentage progress
*/
public void update()
{
double percentage = getPercentage();
int topWidth = (int) (getSize().width * (percentage / 100));
topBar.setPreferredSize(new Dimension(topWidth, 4));
topBar.repaint();
revalidate();
repaint();
} }
public double getPercentage() public double getPercentage()
{ {
if (value == 0)
{
return 0;
}
return (value * 100) / maximumValue; return (value * 100) / maximumValue;
} }
@Override @Override
public void setForeground(Color color) public void setForeground(Color color)
{ {
if (topBar != null) super.setForeground(color);
{
topBar.setBackground(color);
}
setBackground(color.darker()); setBackground(color.darker());
} }
public void setMaximumValue(int maximumValue)
{
if (maximumValue < 1)
{
maximumValue = 1;
}
this.maximumValue = maximumValue;
repaint();
}
public void setValue(int value)
{
this.value = value;
repaint();
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int w = getWidth();
int h = getHeight();
int div = (value * w) / maximumValue;
g.setColor(getBackground());
g.fillRect(div, 0, w, h);
g.setColor(getForeground());
g.fillRect(0, 0, div, h);
}
} }

View File

@@ -21,7 +21,8 @@
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/package net.runelite.client.plugins.timetracking.farming; */
package net.runelite.client.plugins.timetracking.farming;
import org.junit.Test; import org.junit.Test;

View File

@@ -26,11 +26,16 @@ package net.runelite.client.plugins.timetracking.farming;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.junit.Assert; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ErrorCollector;
import static org.hamcrest.Matchers.*;
public class PatchImplementationTest public class PatchImplementationTest
{ {
@Rule
public ErrorCollector collector = new ErrorCollector();
@Test @Test
public void testRange() public void testRange()
{ {
@@ -43,20 +48,20 @@ public class PatchImplementationTest
if (s != null) if (s != null)
{ {
String pfx = impl.name() + "[" + i + "]"; String pfx = impl.name() + "[" + i + "]";
Assert.assertNotNull(pfx + ": null cropState", s.getCropState()); collector.checkThat(pfx + ": cropState", s.getCropState(), notNullValue());
Assert.assertNotNull(pfx + ": null produce", s.getProduce()); collector.checkThat(pfx + ": produce", s.getProduce(), notNullValue());
Assert.assertTrue(pfx + ": " + s.getStage() + " < 0", s.getStage() >= 0); collector.checkThat(pfx + ": negative stage", s.getStage(), greaterThanOrEqualTo(0));
int stages = s.getProduce().getStages(); int stages = s.getProduce().getStages();
if (s.getCropState() == CropState.HARVESTABLE) if (s.getCropState() == CropState.HARVESTABLE)
{ {
stages = s.getProduce().getHarvestStages(); stages = s.getProduce().getHarvestStages();
} }
Assert.assertTrue(pfx + ": " + s.getStage() + " >= " + stages, s.getStage() < stages); collector.checkThat(pfx + ": out of bounds stage", s.getStage(), lessThan(stages));
if (s.getCropState() == CropState.DEAD || s.getCropState() == CropState.DISEASED) if (s.getCropState() == CropState.DEAD || s.getCropState() == CropState.DISEASED)
{ {
Assert.assertTrue(pfx + ": dead seed", s.getStage() > 0); collector.checkThat(pfx + ": dead seed", s.getStage(), greaterThan(0));
} }
if (s.getCropState() == CropState.GROWING && s.getProduce() != Produce.WEEDS) 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; harvestStages.computeIfAbsent(s.getProduce(), k -> new boolean[s.getProduce().getStages()])[s.getStage()] = true;
} }
@@ -69,7 +74,7 @@ public class PatchImplementationTest
// Alot of time the final stage is not hit, because some plants do not have a "Check-health" stage // Alot of time the final stage is not hit, because some plants do not have a "Check-health" stage
for (int i = 0; i < states.length - 1; i++) for (int i = 0; i < states.length - 1; i++)
{ {
Assert.assertTrue(produce.getKey().getName() + " stage " + i + " never found by varbit", states[i]); collector.checkThat(produce.getKey().getName() + " stage " + i + " never found by varbit", states[i], is(true));
} }
} }
} }