Add FarmingTracker plugin
With help from NotFoxtrot
This commit is contained in:
@@ -310,7 +310,36 @@ public enum Varbits
|
||||
FAIR_RING_LAST_DESTINATION(5374),
|
||||
FAIRY_RING_DIAL_ADCB(3985), //Left dial
|
||||
FAIRY_RIGH_DIAL_ILJK(3986), //Middle dial
|
||||
FAIRY_RING_DIAL_PSRQ(3987); //Right dial
|
||||
FAIRY_RING_DIAL_PSRQ(3987), //Right dial
|
||||
|
||||
/**
|
||||
* Transmog controllers for farming
|
||||
*/
|
||||
FARMING_4771(4771),
|
||||
FARMING_4772(4772),
|
||||
FARMING_4773(4773),
|
||||
FARMING_4774(4774),
|
||||
|
||||
/**
|
||||
* Transmog controllers for grapes
|
||||
*/
|
||||
GRAPES_4953(4953),
|
||||
GRAPES_4954(4954),
|
||||
GRAPES_4955(4955),
|
||||
GRAPES_4956(4956),
|
||||
GRAPES_4957(4957),
|
||||
GRAPES_4958(4958),
|
||||
GRAPES_4959(4959),
|
||||
GRAPES_4960(4960),
|
||||
GRAPES_4961(4961),
|
||||
GRAPES_4962(4962),
|
||||
GRAPES_4963(4963),
|
||||
GRAPES_4964(4964),
|
||||
|
||||
/**
|
||||
* Automatically weed farming patches
|
||||
*/
|
||||
AUTOWEED(5557);
|
||||
|
||||
/**
|
||||
* varbit id
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.api.vars;
|
||||
|
||||
public enum Autoweed
|
||||
{
|
||||
UNOWNED,
|
||||
OFF,
|
||||
ON
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import java.awt.Color;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Getter
|
||||
public enum CropState
|
||||
{
|
||||
HARVESTABLE(Color.GREEN),
|
||||
GROWING(Color.GREEN),
|
||||
DISEASED(Color.ORANGE),
|
||||
DEAD(Color.RED);
|
||||
|
||||
private final Color color;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import net.runelite.api.Varbits;
|
||||
|
||||
@RequiredArgsConstructor(
|
||||
access = AccessLevel.PACKAGE
|
||||
)
|
||||
@Getter
|
||||
public class FarmingPatch
|
||||
{
|
||||
@Setter(AccessLevel.PACKAGE)
|
||||
private FarmingRegion region;
|
||||
private final String name;
|
||||
private final Varbits varbit;
|
||||
private final PatchImplementation implementation;
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import javax.swing.GroupLayout;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JProgressBar;
|
||||
import lombok.Getter;
|
||||
import net.runelite.client.ui.FontManager;
|
||||
|
||||
@Getter
|
||||
class FarmingPatchPanel extends JPanel
|
||||
{
|
||||
private final FarmingPatch patch;
|
||||
private final JLabel icon = new JLabel();
|
||||
private final JLabel estimate = new JLabel();
|
||||
private final JProgressBar progress = new JProgressBar();
|
||||
|
||||
FarmingPatchPanel(FarmingPatch patch)
|
||||
{
|
||||
this.patch = patch;
|
||||
|
||||
GroupLayout layout = new GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
|
||||
final JLabel location = new JLabel(patch.getRegion().getName() + " " + patch.getName());
|
||||
location.setFont(FontManager.getRunescapeSmallFont());
|
||||
icon.setMinimumSize(new Dimension(36, 32));
|
||||
|
||||
layout.setVerticalGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
|
||||
.addComponent(icon)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(1)
|
||||
.addComponent(location)
|
||||
.addGap(1)
|
||||
.addComponent(estimate)
|
||||
)
|
||||
)
|
||||
.addComponent(progress, 8, 8, 8)
|
||||
.addGap(4)
|
||||
);
|
||||
|
||||
layout.setHorizontalGroup(layout.createParallelGroup()
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(icon)
|
||||
.addGroup(layout.createParallelGroup()
|
||||
.addComponent(location)
|
||||
.addComponent(estimate)
|
||||
)
|
||||
)
|
||||
.addComponent(progress)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import lombok.Getter;
|
||||
import net.runelite.api.Varbits;
|
||||
import net.runelite.api.coords.WorldPoint;
|
||||
|
||||
@Getter
|
||||
public class FarmingRegion
|
||||
{
|
||||
private final String name;
|
||||
private final int regionID;
|
||||
private final FarmingPatch[] patches;
|
||||
private final Varbits[] varbits;
|
||||
|
||||
FarmingRegion(String name, int regionID, FarmingPatch... patches)
|
||||
{
|
||||
this.name = name;
|
||||
this.regionID = regionID;
|
||||
this.patches = patches;
|
||||
this.varbits = new Varbits[patches.length];
|
||||
for (int i = 0; i < patches.length; i++)
|
||||
{
|
||||
FarmingPatch p = patches[i];
|
||||
p.setRegion(this);
|
||||
varbits[i] = p.getVarbit();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInBounds(WorldPoint loc)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import net.runelite.client.config.Config;
|
||||
import net.runelite.client.config.ConfigGroup;
|
||||
import net.runelite.client.config.ConfigItem;
|
||||
|
||||
@ConfigGroup(
|
||||
keyName = "farmingTracker",
|
||||
name = "Farming Tracker",
|
||||
description = "Configuration for the farming tracker"
|
||||
)
|
||||
public interface FarmingTrackerConfig extends Config
|
||||
{
|
||||
String KEY_NAME = "farmingTracker";
|
||||
String AUTOWEED = "autoweed";
|
||||
|
||||
@ConfigItem(
|
||||
keyName = "estimateRelative",
|
||||
name = "Show relative time",
|
||||
description = "Show amount of time remaining for a patch, opposed to when the patch is finished"
|
||||
)
|
||||
default boolean estimateRelative()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
keyName = "patch",
|
||||
name = "Default patch",
|
||||
description = "Default patch on opening the panel",
|
||||
hidden = true
|
||||
)
|
||||
default Tab patch()
|
||||
{
|
||||
return Tab.ALLOTMENT;
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
keyName = "patch",
|
||||
name = "",
|
||||
description = "",
|
||||
hidden = true
|
||||
)
|
||||
void setPatch(Tab t);
|
||||
}
|
||||
@@ -0,0 +1,319 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Image;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.format.TextStyle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTabbedPane;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.vars.Autoweed;
|
||||
import net.runelite.client.config.ConfigManager;
|
||||
import net.runelite.client.game.AsyncBufferedImage;
|
||||
import net.runelite.client.game.ItemManager;
|
||||
import net.runelite.client.ui.PluginPanel;
|
||||
|
||||
@Slf4j
|
||||
class FarmingTrackerPanel extends PluginPanel
|
||||
{
|
||||
private final Client client;
|
||||
private final ItemManager itemManager;
|
||||
private final ConfigManager configManager;
|
||||
private final FarmingTrackerConfig config;
|
||||
|
||||
private boolean active;
|
||||
|
||||
private List<FarmingPatchPanel> patchPanels = new ArrayList<>();
|
||||
|
||||
FarmingTrackerPanel(
|
||||
Client client,
|
||||
ItemManager itemManager,
|
||||
ConfigManager configManager,
|
||||
FarmingTrackerConfig config,
|
||||
FarmingWorld farmingWorld
|
||||
)
|
||||
{
|
||||
super(false);
|
||||
|
||||
this.client = client;
|
||||
this.itemManager = itemManager;
|
||||
this.configManager = configManager;
|
||||
this.config = config;
|
||||
|
||||
setLayout(new BorderLayout());
|
||||
|
||||
JTabbedPane tabs = new JTabbedPane();
|
||||
farmingWorld.getTabs().forEach((tab, patches) ->
|
||||
{
|
||||
JPanel panel = new JPanel(new GridBagLayout())
|
||||
{
|
||||
@Override
|
||||
public Dimension getPreferredSize()
|
||||
{
|
||||
return new Dimension(PluginPanel.PANEL_WIDTH, super.getPreferredSize().height);
|
||||
}
|
||||
};
|
||||
panel.setBorder(new EmptyBorder(2, 6, 6, 6));
|
||||
|
||||
GridBagConstraints c = new GridBagConstraints();
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
c.weightx = 1;
|
||||
c.gridx = 0;
|
||||
c.gridy = 0;
|
||||
|
||||
for (FarmingPatch patch : patches)
|
||||
{
|
||||
FarmingPatchPanel p = new FarmingPatchPanel(patch);
|
||||
patchPanels.add(p);
|
||||
panel.add(p, c);
|
||||
c.gridy++;
|
||||
}
|
||||
|
||||
JPanel wrapped = new JPanel(new BorderLayout());
|
||||
wrapped.add(panel, BorderLayout.NORTH);
|
||||
JScrollPane scroller = new JScrollPane(wrapped);
|
||||
scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scroller.getVerticalScrollBar().setUnitIncrement(16);
|
||||
|
||||
AsyncBufferedImage icon = itemManager.getImage(tab.getItemID());
|
||||
tabs.addTab(null, null, scroller, tab.getName());
|
||||
int idx = tabs.getTabCount() - 1;
|
||||
Runnable resize = () ->
|
||||
{
|
||||
tabs.setIconAt(idx, new ImageIcon(icon.getScaledInstance(24, 21, Image.SCALE_SMOOTH)));
|
||||
};
|
||||
icon.onChanged(resize);
|
||||
resize.run();
|
||||
|
||||
if (config.patch() == tab)
|
||||
{
|
||||
tabs.setSelectedComponent(scroller);
|
||||
}
|
||||
tabs.addChangeListener(e ->
|
||||
{
|
||||
if (tabs.getSelectedComponent() == scroller)
|
||||
{
|
||||
config.setPatch(tab);
|
||||
}
|
||||
});
|
||||
});
|
||||
add(tabs, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
void update()
|
||||
{
|
||||
if (!active)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
long unixNow = Instant.now().getEpochSecond();
|
||||
log.debug("Updating panel with username {}", client.getUsername());
|
||||
boolean autoweed = false;
|
||||
{
|
||||
String group = FarmingTrackerConfig.KEY_NAME + "." + client.getUsername();
|
||||
autoweed = Integer.toString(Autoweed.ON.ordinal())
|
||||
.equals(configManager.getConfiguration(group, FarmingTrackerConfig.AUTOWEED));
|
||||
}
|
||||
for (FarmingPatchPanel panel : patchPanels)
|
||||
{
|
||||
FarmingPatch patch = panel.getPatch();
|
||||
String group = FarmingTrackerConfig.KEY_NAME + "." + client.getUsername() + "." + patch.getRegion().getRegionID();
|
||||
String key = Integer.toString(patch.getVarbit().getId());
|
||||
String storedValue = configManager.getConfiguration(group, key);
|
||||
long unixTime = 0;
|
||||
int value = 0;
|
||||
if (storedValue != null)
|
||||
{
|
||||
String[] parts = storedValue.split(":");
|
||||
if (parts.length == 2)
|
||||
{
|
||||
try
|
||||
{
|
||||
value = Integer.parseInt(parts[0]);
|
||||
unixTime = Long.parseLong(parts[1]);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PatchState state = unixTime <= 0 ? null : patch.getImplementation().forVarbitValue(value);
|
||||
if (state == null)
|
||||
{
|
||||
panel.getIcon().setIcon(null);
|
||||
panel.getIcon().setToolTipText("Unknown state");
|
||||
panel.getProgress().setMaximum(0);
|
||||
panel.getProgress().setValue(0);
|
||||
panel.getEstimate().setText("Unknown");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (state.getProduce().getItemID() < 0)
|
||||
{
|
||||
panel.getIcon().setIcon(null);
|
||||
panel.getIcon().setToolTipText("Unknown state");
|
||||
}
|
||||
else
|
||||
{
|
||||
itemManager.getImage(state.getProduce().getItemID()).addTo(panel.getIcon());
|
||||
panel.getIcon().setToolTipText(state.getProduce().getName());
|
||||
}
|
||||
|
||||
int stage = state.getStage();
|
||||
int stages = state.getCropState() == CropState.HARVESTABLE ?
|
||||
state.getProduce().getHarvestStages() :
|
||||
state.getProduce().getStages();
|
||||
int tickrate = 0;
|
||||
switch (state.getCropState())
|
||||
{
|
||||
case HARVESTABLE:
|
||||
tickrate = state.getProduce().getRegrowTickrate() * 60;
|
||||
break;
|
||||
case GROWING:
|
||||
tickrate = state.getProduce().getTickrate() * 60;
|
||||
break;
|
||||
}
|
||||
if (autoweed && state.getProduce() == Produce.WEEDS)
|
||||
{
|
||||
stage = 0;
|
||||
stages = 1;
|
||||
tickrate = 0;
|
||||
}
|
||||
if (tickrate > 0)
|
||||
{
|
||||
long tickNow = unixNow / tickrate;
|
||||
long tickTime = unixTime / tickrate;
|
||||
int delta = (int) (tickNow - tickTime);
|
||||
|
||||
long doneEstimate = ((stages - 1 - stage) + tickTime) * tickrate;
|
||||
|
||||
stage += delta;
|
||||
if (stage >= stages)
|
||||
{
|
||||
stage = stages - 1;
|
||||
}
|
||||
|
||||
if (doneEstimate < unixNow)
|
||||
{
|
||||
panel.getEstimate().setText("Done");
|
||||
}
|
||||
else if (config.estimateRelative())
|
||||
{
|
||||
int remaining = (int) (59 + doneEstimate - unixNow) / 60;
|
||||
StringBuilder f = new StringBuilder();
|
||||
f.append("Done in ");
|
||||
int min = remaining % 60;
|
||||
int hours = (remaining / 60) % 24;
|
||||
int days = remaining / (60 * 24);
|
||||
if (days > 0)
|
||||
{
|
||||
f.append(days).append("d ");
|
||||
}
|
||||
if (hours > 0)
|
||||
{
|
||||
f.append(hours).append("h ");
|
||||
}
|
||||
if (min > 0)
|
||||
{
|
||||
f.append(min).append("m ");
|
||||
}
|
||||
panel.getEstimate().setText(f.toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder f = new StringBuilder();
|
||||
LocalDateTime ldtTime = LocalDateTime.ofEpochSecond(doneEstimate, 0, OffsetDateTime.now().getOffset());
|
||||
LocalDateTime ldtNow = LocalDateTime.now();
|
||||
f.append("Done ");
|
||||
if (ldtTime.getDayOfWeek() != ldtNow.getDayOfWeek())
|
||||
{
|
||||
f.append(ldtTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault())).append(" ");
|
||||
}
|
||||
f.append(String.format("at %d:%02d", ldtTime.getHour(), ldtTime.getMinute()));
|
||||
panel.getEstimate().setText(f.toString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (state.getCropState())
|
||||
{
|
||||
case HARVESTABLE:
|
||||
panel.getEstimate().setText("Done");
|
||||
break;
|
||||
case GROWING:
|
||||
if (stage == stages - 1)
|
||||
{
|
||||
panel.getEstimate().setText("Done");
|
||||
}
|
||||
else
|
||||
{
|
||||
panel.getEstimate().setText("Unknown");
|
||||
}
|
||||
break;
|
||||
case DISEASED:
|
||||
panel.getEstimate().setText("Diseased");
|
||||
break;
|
||||
case DEAD:
|
||||
panel.getEstimate().setText("Dead");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
panel.getProgress().setBackground(state.getCropState().getColor().darker());
|
||||
panel.getProgress().setMaximum(stages - 1);
|
||||
panel.getProgress().setValue(stage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivate()
|
||||
{
|
||||
active = true;
|
||||
update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeactivate()
|
||||
{
|
||||
active = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.google.inject.Provides;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.inject.Inject;
|
||||
import javax.swing.SwingUtilities;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.GameState;
|
||||
import net.runelite.api.Varbits;
|
||||
import net.runelite.api.coords.WorldPoint;
|
||||
import net.runelite.api.events.GameTick;
|
||||
import net.runelite.api.events.UsernameChanged;
|
||||
import net.runelite.client.config.ConfigManager;
|
||||
import net.runelite.client.game.ItemManager;
|
||||
import net.runelite.client.plugins.Plugin;
|
||||
import net.runelite.client.plugins.PluginDescriptor;
|
||||
import net.runelite.client.task.Schedule;
|
||||
import net.runelite.client.ui.NavigationButton;
|
||||
import net.runelite.client.ui.PluginToolbar;
|
||||
|
||||
@PluginDescriptor(
|
||||
name = "Farming Tracker"
|
||||
)
|
||||
@Slf4j
|
||||
public class FarmingTrackerPlugin extends Plugin
|
||||
{
|
||||
@Inject
|
||||
private PluginToolbar pluginToolbar;
|
||||
|
||||
@Inject
|
||||
private ConfigManager configManager;
|
||||
|
||||
@Inject
|
||||
private Client client;
|
||||
|
||||
@Inject
|
||||
private FarmingWorld farmingWorld;
|
||||
|
||||
@Inject
|
||||
private ItemManager itemManager;
|
||||
|
||||
@Inject
|
||||
private FarmingTrackerConfig config;
|
||||
|
||||
private FarmingTrackerPanel panel;
|
||||
|
||||
private NavigationButton navButton;
|
||||
|
||||
private WorldPoint lastTickLoc;
|
||||
|
||||
@Provides
|
||||
FarmingTrackerConfig provideConfig(ConfigManager configManager)
|
||||
{
|
||||
return configManager.getConfig(FarmingTrackerConfig.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void startUp() throws Exception
|
||||
{
|
||||
BufferedImage icon;
|
||||
synchronized (ImageIO.class)
|
||||
{
|
||||
icon = ImageIO.read(getClass().getResourceAsStream("farming.png"));
|
||||
}
|
||||
|
||||
panel = new FarmingTrackerPanel(client, itemManager, configManager, config, farmingWorld);
|
||||
|
||||
navButton = NavigationButton.builder()
|
||||
.name("Farming Tracker")
|
||||
.icon(icon)
|
||||
.panel(panel)
|
||||
.build();
|
||||
|
||||
pluginToolbar.addNavigation(navButton);
|
||||
|
||||
updatePanel();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onUsernameChanged(UsernameChanged e)
|
||||
{
|
||||
updatePanel();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shutDown() throws Exception
|
||||
{
|
||||
pluginToolbar.removeNavigation(navButton);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onGameTick(GameTick t)
|
||||
{
|
||||
if (client.getGameState() != GameState.LOGGED_IN)
|
||||
{
|
||||
lastTickLoc = null;
|
||||
return;
|
||||
}
|
||||
|
||||
WorldPoint loc = lastTickLoc;
|
||||
lastTickLoc = client.getLocalPlayer().getWorldLocation();
|
||||
if (loc == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
boolean changed = false;
|
||||
|
||||
{
|
||||
String group = FarmingTrackerConfig.KEY_NAME + "." + client.getUsername();
|
||||
String autoweed = Integer.toString(client.getSetting(Varbits.AUTOWEED));
|
||||
if (!autoweed.equals(configManager.getConfiguration(group, FarmingTrackerConfig.AUTOWEED)))
|
||||
{
|
||||
configManager.setConfiguration(group, FarmingTrackerConfig.AUTOWEED, autoweed);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
FarmingRegion region = farmingWorld.getRegions().get(loc.getRegionID());
|
||||
if (region != null && region.isInBounds(loc))
|
||||
{
|
||||
// Write config with new varbits
|
||||
// farmingTracker.<login-username>.<regionID>.<VarbitID>=<varbitValue>:<unix time>
|
||||
String group = FarmingTrackerConfig.KEY_NAME + "." + client.getUsername() + "." + region.getRegionID();
|
||||
long unixNow = Instant.now().getEpochSecond();
|
||||
for (Varbits varbit : region.getVarbits())
|
||||
{
|
||||
// Write the config value if it doesn't match what is current, or it is more than 5 minutes old
|
||||
String key = Integer.toString(varbit.getId());
|
||||
String strVarbit = Integer.toString(client.getSetting(varbit));
|
||||
String storedValue = configManager.getConfiguration(group, key);
|
||||
if (storedValue != null)
|
||||
{
|
||||
String[] parts = storedValue.split(":");
|
||||
if (parts.length == 2 && parts[0].equals(strVarbit))
|
||||
{
|
||||
long unixTime = 0;
|
||||
try
|
||||
{
|
||||
unixTime = Long.parseLong(parts[1]);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
}
|
||||
if (unixTime + (5 * 60) > unixNow && unixNow + 30 > unixTime)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
String value = strVarbit + ":" + unixNow;
|
||||
configManager.setConfiguration(group, key, value);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (changed)
|
||||
{
|
||||
updatePanel();
|
||||
}
|
||||
}
|
||||
|
||||
@Schedule(period = 10, unit = ChronoUnit.SECONDS)
|
||||
public void updatePanel()
|
||||
{
|
||||
SwingUtilities.invokeLater(panel::update);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
/*
|
||||
* Copyright (c) 2018, NotFoxtrot <https://github.com/NotFoxtrot>
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import com.google.inject.Singleton;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.TreeSet;
|
||||
import lombok.Getter;
|
||||
import net.runelite.api.Varbits;
|
||||
import net.runelite.api.coords.WorldPoint;
|
||||
|
||||
@Singleton
|
||||
public class FarmingWorld
|
||||
{
|
||||
@Getter
|
||||
private Map<Integer, FarmingRegion> regions = new HashMap<>();
|
||||
|
||||
@Getter
|
||||
private Map<Tab, Set<FarmingPatch>> tabs = new HashMap<>();
|
||||
|
||||
private final Comparator<FarmingPatch> tabSorter = Comparator
|
||||
.comparing(FarmingPatch::getImplementation)
|
||||
.thenComparing((FarmingPatch p) -> p.getRegion().getName())
|
||||
.thenComparing(FarmingPatch::getName);
|
||||
|
||||
public FarmingWorld()
|
||||
{
|
||||
// Some of these patches get updated in multiple regions.
|
||||
// It may be worth it to add a specialization for these patches
|
||||
add(new FarmingRegion("Al Kharid", 13106,
|
||||
new FarmingPatch("Cactus", Varbits.FARMING_4771, PatchImplementation.CACTUS)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Ardougne", 10290,
|
||||
new FarmingPatch("Bush", Varbits.FARMING_4771, PatchImplementation.BUSH)
|
||||
));
|
||||
add(new FarmingRegion("Ardougne", 10548,
|
||||
new FarmingPatch("North", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("South", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("Flower", Varbits.FARMING_4773, PatchImplementation.FLOWER),
|
||||
new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Brimhaven", 11058,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.FRUIT_TREE),
|
||||
new FarmingPatch("Spirit Tree", Varbits.FARMING_4772, PatchImplementation.SPIRIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Catherby", 11062,
|
||||
new FarmingPatch("North", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("South", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("Flower", Varbits.FARMING_4773, PatchImplementation.FLOWER),
|
||||
new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB)
|
||||
));
|
||||
add(new FarmingRegion("Catherby", 11317,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.FRUIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Champion's Guild", 12596,
|
||||
new FarmingPatch("Bush", Varbits.FARMING_4771, PatchImplementation.BUSH)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Draynor Manor", 12340,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.BELLADONNA)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Entrana", 11060,
|
||||
new FarmingPatch("Hops", Varbits.FARMING_4771, PatchImplementation.HOPS)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Etceteria", 10300,
|
||||
new FarmingPatch("Bush", Varbits.FARMING_4771, PatchImplementation.BUSH),
|
||||
new FarmingPatch("Spirit Tree", Varbits.FARMING_4772, PatchImplementation.SPIRIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Falador", 11828,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.TREE)
|
||||
));
|
||||
add(new FarmingRegion("Falador", 12083,
|
||||
new FarmingPatch("North West", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("South East", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("Flower", Varbits.FARMING_4773, PatchImplementation.FLOWER),
|
||||
new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB)
|
||||
)
|
||||
{
|
||||
@Override
|
||||
public boolean isInBounds(WorldPoint loc)
|
||||
{
|
||||
return loc.getY() > 3280;
|
||||
}
|
||||
});
|
||||
|
||||
add(new FarmingRegion("Fossil Island", 14651,
|
||||
new FarmingPatch("East", Varbits.FARMING_4771, PatchImplementation.HARDWOOD_TREE),
|
||||
new FarmingPatch("Middle", Varbits.FARMING_4772, PatchImplementation.HARDWOOD_TREE),
|
||||
new FarmingPatch("West", Varbits.FARMING_4773, PatchImplementation.HARDWOOD_TREE)
|
||||
), 14907);
|
||||
add(new FarmingRegion("Seaweed", 15008,
|
||||
new FarmingPatch("North", Varbits.FARMING_4771, PatchImplementation.SEAWEED),
|
||||
new FarmingPatch("South", Varbits.FARMING_4772, PatchImplementation.SEAWEED)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Gnome Stronghold", 9781,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.TREE),
|
||||
new FarmingPatch("", Varbits.FARMING_4772, PatchImplementation.FRUIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Harmony", 15148,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("", Varbits.FARMING_4772, PatchImplementation.HERB)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Kourend", 7222,
|
||||
new FarmingPatch("North East", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("South West", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("Flower", Varbits.FARMING_4773, PatchImplementation.FLOWER),
|
||||
new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB)
|
||||
));
|
||||
add(new FarmingRegion("Kourend", 6711,
|
||||
new FarmingPatch("Spirit Tree", Varbits.FARMING_4771, PatchImplementation.SPIRIT_TREE)
|
||||
));
|
||||
add(new FarmingRegion("Kourend", 7223,
|
||||
new FarmingPatch("West 1", Varbits.GRAPES_4953, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("West 2", Varbits.GRAPES_4954, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("West 3", Varbits.GRAPES_4955, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("West 4", Varbits.GRAPES_4956, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("West 5", Varbits.GRAPES_4957, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("West 6", Varbits.GRAPES_4958, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("East 1", Varbits.GRAPES_4959, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("East 2", Varbits.GRAPES_4960, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("East 3", Varbits.GRAPES_4961, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("East 4", Varbits.GRAPES_4962, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("East 5", Varbits.GRAPES_4963, PatchImplementation.GRAPES),
|
||||
new FarmingPatch("East 6", Varbits.GRAPES_4964, PatchImplementation.GRAPES)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Lletya", 9265,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.FRUIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Lumbridge", 12851,
|
||||
new FarmingPatch("Hops", Varbits.FARMING_4771, PatchImplementation.HOPS)
|
||||
));
|
||||
add(new FarmingRegion("Lumbridge", 12594,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Morytania", 13622,
|
||||
new FarmingPatch("Mushroom", Varbits.FARMING_4771, PatchImplementation.MUSHROOM)
|
||||
));
|
||||
add(new FarmingRegion("Morytania", 14391,
|
||||
new FarmingPatch("North West", Varbits.FARMING_4771, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("South East", Varbits.FARMING_4772, PatchImplementation.ALLOTMENT),
|
||||
new FarmingPatch("Flower", Varbits.FARMING_4773, PatchImplementation.FLOWER),
|
||||
new FarmingPatch("", Varbits.FARMING_4774, PatchImplementation.HERB)
|
||||
));
|
||||
|
||||
|
||||
add(new FarmingRegion("Port Sarim", 12082,
|
||||
new FarmingPatch("Spirit tree", Varbits.FARMING_4771, PatchImplementation.SPIRIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Rimmington", 11570,
|
||||
new FarmingPatch("Bush", Varbits.FARMING_4771, PatchImplementation.BUSH)
|
||||
), 11826);
|
||||
|
||||
add(new FarmingRegion("Seers' Village", 10551,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.HOPS)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Tai Bwo Wannai", 11056,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.CALQUAT)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Taverly", 11573,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Tree Gnome Village", 9777,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.FRUIT_TREE)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Troll Stronghold", 11321,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.HERB)
|
||||
));
|
||||
|
||||
add(new FarmingRegion("Varrock", 12854,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.TREE)
|
||||
), 12853);
|
||||
|
||||
add(new FarmingRegion("Yanille", 10288,
|
||||
new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.HOPS)
|
||||
));
|
||||
|
||||
// Finalize
|
||||
this.regions = Collections.unmodifiableMap(regions);
|
||||
Map<Tab, Set<FarmingPatch>> umtabs = new TreeMap<>();
|
||||
for (Map.Entry<Tab, Set<FarmingPatch>> e : tabs.entrySet())
|
||||
{
|
||||
umtabs.put(e.getKey(), Collections.unmodifiableSet(e.getValue()));
|
||||
}
|
||||
this.tabs = Collections.unmodifiableMap(umtabs);
|
||||
}
|
||||
|
||||
private void add(FarmingRegion r, int... extraRegions)
|
||||
{
|
||||
regions.put(r.getRegionID(), r);
|
||||
for (int er : extraRegions)
|
||||
{
|
||||
regions.put(er, r);
|
||||
}
|
||||
for (FarmingPatch p : r.getPatches())
|
||||
{
|
||||
tabs
|
||||
.computeIfAbsent(p.getImplementation().getTab(), k -> new TreeSet<>(tabSorter))
|
||||
.add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import lombok.Value;
|
||||
|
||||
@Value
|
||||
public class PatchState
|
||||
{
|
||||
private final Produce produce;
|
||||
private final CropState cropState;
|
||||
private final int stage;
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* Copyright (c) 2018, NotFoxtrot <https://github.com/NotFoxtrot>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.runelite.api.ItemID;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Getter
|
||||
public enum Produce
|
||||
{
|
||||
WEEDS("Weeds", ItemID.WEEDS, 5, 4),
|
||||
SCARECROW("Scarecrow", ItemID.SCARECROW, 5, 4),
|
||||
|
||||
// Allotment crops
|
||||
POTATO("Potato", ItemID.POTATO, 10, 5, 0, 3),
|
||||
ONION("Onion", ItemID.ONION, 10, 5, 0, 3),
|
||||
CABBAGE("Cabbage", ItemID.CABBAGE, 10, 5, 0, 3),
|
||||
TOMATO("Tomato", ItemID.TOMATO, 10, 5, 0, 3),
|
||||
SWEETCORN("Sweetcorn", ItemID.SWEETCORN, 10, 6, 0, 3),
|
||||
STRAWBERRY("Strawberry", ItemID.STRAWBERRY, 10, 7, 0, 3),
|
||||
WATERMELON("Watermelon", ItemID.WATERMELON, 10, 8, 0, 3),
|
||||
|
||||
// Flower crops
|
||||
MARIGOLD("Marigold", ItemID.MARIGOLDS, 5, 5),
|
||||
ROSEMARY("Rosemary", ItemID.ROSEMARY, 5, 5),
|
||||
NASTURTIUM("Nasturtium", ItemID.NASTURTIUMS, 5, 5),
|
||||
WOAD("Woad", ItemID.WOAD_LEAF, 5, 5),
|
||||
LIMPWURT("Limpwurt", ItemID.LIMPWURT_ROOT, 5, 5),
|
||||
|
||||
// Bush crops
|
||||
REDBERRIES("Redberry", ItemID.REDBERRIES, 20, 6, 20, 5),
|
||||
CADAVABERRIES("Cadavaberry", ItemID.CADAVA_BERRIES, 20, 7, 20, 5),
|
||||
DWELLBERRIES("Dwellberry", ItemID.DWELLBERRIES, 20, 8, 20, 5),
|
||||
JANGERBERRIES("Jangerberry", ItemID.JANGERBERRIES, 20, 9, 20, 5),
|
||||
WHITEBERRIES("Whiteberry", ItemID.WHITE_BERRIES, 20, 9, 20, 5),
|
||||
POISON_IVY("Poison", ItemID.POISON_IVY_BERRIES, 20, 9, 20, 5),
|
||||
|
||||
// Hop crops
|
||||
BARLEY("Barley", ItemID.BARLEY, 10, 5, 0, 3),
|
||||
HAMMERSTONE("Hammerstone", ItemID.HAMMERSTONE_HOPS, 10, 5, 0, 3),
|
||||
ASGARNIAN("Asgarnian", ItemID.ASGARNIAN_HOPS, 10, 6, 0, 3),
|
||||
JUTE("Jute", ItemID.JUTE_FIBRE, 10, 6, 0, 3),
|
||||
YANILLIAN("Yanillian", ItemID.YANILLIAN_HOPS, 10, 7, 0, 3),
|
||||
KRANDORIAN("Krandorian", ItemID.KRANDORIAN_HOPS, 10, 8, 0, 3),
|
||||
WILDBLOOD("Wildblood", ItemID.WILDBLOOD_HOPS, 10, 9, 0, 3),
|
||||
|
||||
// Herb crops
|
||||
GUAM("Guam", ItemID.GUAM_LEAF, 20, 5, 0, 3),
|
||||
MARRENTILL("Marrentill", ItemID.MARRENTILL, 20, 5, 0, 3),
|
||||
TARROMIN("Tarromin", ItemID.TARROMIN, 20, 5, 0, 3),
|
||||
HARRALANDER("Harralander", ItemID.HARRALANDER, 20, 5, 0, 3),
|
||||
RANARR("Ranarr", ItemID.RANARR_WEED, 20, 5, 0, 3),
|
||||
TOADFLAX("Toadflax", ItemID.TOADFLAX, 20, 5, 0, 3),
|
||||
IRIT("Irit", ItemID.IRIT_LEAF, 20, 5, 0, 3),
|
||||
AVANTOE("Avantoe", ItemID.AVANTOE, 20, 5, 0, 3),
|
||||
KWUARM("Kwuarm", ItemID.KWUARM, 20, 5, 0, 3),
|
||||
SNAPDRAGON("Snapdragon", ItemID.SNAPDRAGON, 20, 5, 0, 3),
|
||||
CADANTINE("Cadantine", ItemID.CADANTINE, 20, 5, 0, 3),
|
||||
LANTADYME("Lantadyme", ItemID.LANTADYME, 20, 5, 0, 3),
|
||||
DWARF_WEED("Dwarf Weed", ItemID.DWARF_WEED, 20, 5, 0, 3),
|
||||
TORSTOL("Torstol", ItemID.TORSTOL, 20, 5, 0, 3),
|
||||
GOUTWEED("Goutweed", ItemID.GOUTWEED, 20, 5, 0, 2),
|
||||
ANYHERB("Any Herb", ItemID.GUAM_LEAF, 20, 5, 0, 3),
|
||||
|
||||
// Tree crops
|
||||
OAK("Oak", ItemID.OAK_LOGS, 40, 6),
|
||||
WILLOW("Willow", ItemID.WILLOW_LOGS, 40, 8),
|
||||
MAPLE("Maple", ItemID.MAPLE_TREE, 40, 9),
|
||||
YEW("Yew", ItemID.YEW_TREE, 40, 11),
|
||||
MAGIC("Magic", ItemID.MAGIC_LOGS, 40, 13),
|
||||
|
||||
// Fruit tree crops
|
||||
APPLE("Apple", ItemID.COOKING_APPLE, 160, 7, 45, 7),
|
||||
BANANA("Banana", ItemID.BANANA, 160, 7, 45, 7),
|
||||
ORANGE("Orange", ItemID.ORANGE, 160, 7, 45, 7),
|
||||
CURRY("Curry", ItemID.CURRY_LEAF, 160, 7, 45, 7),
|
||||
PINEAPPLE("Pineapple", ItemID.PINEAPPLE, 160, 7, 45, 7),
|
||||
PAPAYA("Papaya", ItemID.PAPAYA_FRUIT, 160, 7, 45, 7),
|
||||
PALM("Palm", ItemID.COCONUT, 160, 7, 45, 7),
|
||||
|
||||
// Special crops
|
||||
SEAWEED("Seaweed", ItemID.GIANT_SEAWEED, 10, 8, 0, 4),
|
||||
TEAK("Teak", ItemID.TEAK_LOGS, 560, 9),
|
||||
GRAPE("Grape", ItemID.GRAPES, 5, 8, 0, 5),
|
||||
MUSHROOM("Mushroom", ItemID.MUSHROOM, 40, 7, 0, 7),
|
||||
MAHOGANY("Mahogany", ItemID.MAHOGANY_LOGS, 640, 10),
|
||||
CACTUS("Cactus", ItemID.POTATO_CACTUS, 80, 8, 20, 4),
|
||||
BELLADONNA("Belladonna", ItemID.CAVE_NIGHTSHADE, 80, 5),
|
||||
CALQUAT("Calquat", ItemID.CALQUAT_FRUIT, 160, 9, 0, 7),
|
||||
SPIRIT_TREE("Spirit Tree", ItemID.SPIRIT_TREE, 320, 13);
|
||||
|
||||
/**
|
||||
* User-visible name
|
||||
*/
|
||||
private final String name;
|
||||
/**
|
||||
* User-visible item icon
|
||||
*/
|
||||
private final int itemID;
|
||||
/**
|
||||
* How many minutes per growth tick
|
||||
*/
|
||||
private final int tickrate;
|
||||
/**
|
||||
* How many states this crop has during groth. Typically tickcount+1
|
||||
*/
|
||||
private final int stages;
|
||||
/**
|
||||
* How many minutes to regrow crops, or zero if it doesn't regrow
|
||||
*/
|
||||
private final int regrowTickrate;
|
||||
/**
|
||||
* How many states this crop has during harvest.
|
||||
* This is often called lives.
|
||||
*/
|
||||
private final int harvestStages;
|
||||
|
||||
Produce(String name, int itemID, int tickrate, int stages)
|
||||
{
|
||||
this(name, itemID, tickrate, stages, 0, 1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.runelite.api.ItemID;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Getter
|
||||
public enum Tab
|
||||
{
|
||||
ALLOTMENT("Allotments", ItemID.CABBAGE),
|
||||
HERB("Herbs", ItemID.GRIMY_RANARR_WEED),
|
||||
TREE("Trees", ItemID.MAHOGANY_LOGS),
|
||||
FRUIT_TREE("Fruit Trees", ItemID.PINEAPPLE),
|
||||
SPECIAL("Special", ItemID.MUSHROOM);
|
||||
|
||||
private final String name;
|
||||
private final int itemID;
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class FarmingWorldTest
|
||||
{
|
||||
@Test
|
||||
public void testInit()
|
||||
{
|
||||
new FarmingWorld();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) 2018 Abex
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* 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
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.farmingtracker;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class PatchImplementationTest
|
||||
{
|
||||
@Test
|
||||
public void testRange()
|
||||
{
|
||||
for (PatchImplementation impl : PatchImplementation.values())
|
||||
{
|
||||
for (int i = 0; i < 256; i++)
|
||||
{
|
||||
PatchState s = impl.forVarbitValue(i);
|
||||
if (s != null)
|
||||
{
|
||||
String pfx = impl.name() + "[" + i + "]";
|
||||
Assert.assertNotNull(pfx + ": null cropState", s.getCropState());
|
||||
Assert.assertNotNull(pfx + ": null produce", s.getProduce());
|
||||
Assert.assertTrue(pfx + ": " + s.getStage() + " < 0", s.getStage() >= 0);
|
||||
int stages = s.getProduce().getStages();
|
||||
if (s.getCropState() == CropState.HARVESTABLE)
|
||||
{
|
||||
stages = s.getProduce().getHarvestStages();
|
||||
}
|
||||
Assert.assertTrue(pfx + ": " + s.getStage() + " >= " + stages, s.getStage() < stages);
|
||||
if (s.getCropState() == CropState.DEAD || s.getCropState() == CropState.DISEASED)
|
||||
{
|
||||
Assert.assertTrue(pfx + ": dead seed", s.getStage() > 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user