Merge remote-tracking branch 'runelite/master'
This commit is contained in:
@@ -57,6 +57,10 @@ public enum InventoryID
|
|||||||
* Looting Bag inventory
|
* Looting Bag inventory
|
||||||
*/
|
*/
|
||||||
LOOTING_BAG(516),
|
LOOTING_BAG(516),
|
||||||
|
/**
|
||||||
|
* Kingdom Of Miscellania reward inventory.
|
||||||
|
*/
|
||||||
|
KINGDOM_OF_MISCELLANIA(390),
|
||||||
/**
|
/**
|
||||||
* Chambers of Xeric chest inventory.
|
* Chambers of Xeric chest inventory.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -215,6 +215,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
|
|
||||||
private int centerX;
|
private int centerX;
|
||||||
private int centerY;
|
private int centerY;
|
||||||
|
private int yaw;
|
||||||
|
private int pitch;
|
||||||
|
|
||||||
// Uniforms
|
// Uniforms
|
||||||
private int uniUseFog;
|
private int uniUseFog;
|
||||||
@@ -746,6 +748,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
{
|
{
|
||||||
centerX = client.getCenterX();
|
centerX = client.getCenterX();
|
||||||
centerY = client.getCenterY();
|
centerY = client.getCenterY();
|
||||||
|
yaw = client.getCameraYaw();
|
||||||
|
pitch = client.getCameraPitch();
|
||||||
|
|
||||||
final Scene scene = client.getScene();
|
final Scene scene = client.getScene();
|
||||||
final int drawDistance = Math.max(0, Math.min(MAX_DISTANCE, this.drawDistance));
|
final int drawDistance = Math.max(0, Math.min(MAX_DISTANCE, this.drawDistance));
|
||||||
@@ -945,8 +949,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
|
|||||||
gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId);
|
gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId);
|
||||||
uniformBuffer.clear();
|
uniformBuffer.clear();
|
||||||
uniformBuffer
|
uniformBuffer
|
||||||
.put(client.getCameraYaw())
|
.put(yaw)
|
||||||
.put(client.getCameraPitch())
|
.put(pitch)
|
||||||
.put(centerX)
|
.put(centerX)
|
||||||
.put(centerY)
|
.put(centerY)
|
||||||
.put(client.getScale())
|
.put(client.getScale())
|
||||||
|
|||||||
@@ -209,6 +209,7 @@ public class HunterPlugin extends Plugin
|
|||||||
case ObjectID.SHAKING_BOX: // Black chinchompa caught
|
case ObjectID.SHAKING_BOX: // Black chinchompa caught
|
||||||
case ObjectID.SHAKING_BOX_9382: // Grey chinchompa caught
|
case ObjectID.SHAKING_BOX_9382: // Grey chinchompa caught
|
||||||
case ObjectID.SHAKING_BOX_9383: // Red chinchompa caught
|
case ObjectID.SHAKING_BOX_9383: // Red chinchompa caught
|
||||||
|
case ObjectID.SHAKING_BOX_9384: // Ferret caught
|
||||||
case ObjectID.BOULDER_20648: // Prickly kebbit caught
|
case ObjectID.BOULDER_20648: // Prickly kebbit caught
|
||||||
case ObjectID.BOULDER_20649: // Sabre-tooth kebbit caught
|
case ObjectID.BOULDER_20649: // Sabre-tooth kebbit caught
|
||||||
case ObjectID.BOULDER_20650: // Barb-tailed kebbit caught
|
case ObjectID.BOULDER_20650: // Barb-tailed kebbit caught
|
||||||
@@ -261,25 +262,30 @@ public class HunterPlugin extends Plugin
|
|||||||
// Imp entering box
|
// Imp entering box
|
||||||
case ObjectID.MAGIC_BOX_19225:
|
case ObjectID.MAGIC_BOX_19225:
|
||||||
|
|
||||||
// Black chin shaking box
|
// Black chin shaking box
|
||||||
case ObjectID.BOX_TRAP:
|
case ObjectID.BOX_TRAP:
|
||||||
case ObjectID.BOX_TRAP_2026:
|
case ObjectID.BOX_TRAP_2026:
|
||||||
case ObjectID.BOX_TRAP_2028:
|
case ObjectID.BOX_TRAP_2028:
|
||||||
case ObjectID.BOX_TRAP_2029:
|
case ObjectID.BOX_TRAP_2029:
|
||||||
|
|
||||||
// Red chin shaking box
|
// Red chin shaking box
|
||||||
case ObjectID.BOX_TRAP_9381:
|
case ObjectID.BOX_TRAP_9381:
|
||||||
case ObjectID.BOX_TRAP_9390:
|
case ObjectID.BOX_TRAP_9390:
|
||||||
case ObjectID.BOX_TRAP_9391:
|
case ObjectID.BOX_TRAP_9391:
|
||||||
case ObjectID.BOX_TRAP_9392:
|
case ObjectID.BOX_TRAP_9392:
|
||||||
case ObjectID.BOX_TRAP_9393:
|
case ObjectID.BOX_TRAP_9393:
|
||||||
|
|
||||||
// Grey chin shaking box
|
// Grey chin shaking box
|
||||||
case ObjectID.BOX_TRAP_9386:
|
case ObjectID.BOX_TRAP_9386:
|
||||||
case ObjectID.BOX_TRAP_9387:
|
case ObjectID.BOX_TRAP_9387:
|
||||||
case ObjectID.BOX_TRAP_9388:
|
case ObjectID.BOX_TRAP_9388:
|
||||||
|
|
||||||
// Bird traps
|
// Ferret shaking box
|
||||||
|
case ObjectID.BOX_TRAP_9394:
|
||||||
|
case ObjectID.BOX_TRAP_9396:
|
||||||
|
case ObjectID.BOX_TRAP_9397:
|
||||||
|
|
||||||
|
// Bird traps
|
||||||
case ObjectID.BIRD_SNARE_9346:
|
case ObjectID.BIRD_SNARE_9346:
|
||||||
case ObjectID.BIRD_SNARE_9347:
|
case ObjectID.BIRD_SNARE_9347:
|
||||||
case ObjectID.BIRD_SNARE_9349:
|
case ObjectID.BIRD_SNARE_9349:
|
||||||
@@ -287,7 +293,7 @@ public class HunterPlugin extends Plugin
|
|||||||
case ObjectID.BIRD_SNARE_9376:
|
case ObjectID.BIRD_SNARE_9376:
|
||||||
case ObjectID.BIRD_SNARE_9378:
|
case ObjectID.BIRD_SNARE_9378:
|
||||||
|
|
||||||
// Deadfall trap
|
// Deadfall trap
|
||||||
case ObjectID.DEADFALL_19218:
|
case ObjectID.DEADFALL_19218:
|
||||||
case ObjectID.DEADFALL_19851:
|
case ObjectID.DEADFALL_19851:
|
||||||
case ObjectID.DEADFALL_20128:
|
case ObjectID.DEADFALL_20128:
|
||||||
@@ -295,7 +301,7 @@ public class HunterPlugin extends Plugin
|
|||||||
case ObjectID.DEADFALL_20130:
|
case ObjectID.DEADFALL_20130:
|
||||||
case ObjectID.DEADFALL_20131:
|
case ObjectID.DEADFALL_20131:
|
||||||
|
|
||||||
// Net trap
|
// Net trap
|
||||||
case ObjectID.NET_TRAP_9003:
|
case ObjectID.NET_TRAP_9003:
|
||||||
case ObjectID.NET_TRAP_9005:
|
case ObjectID.NET_TRAP_9005:
|
||||||
case ObjectID.NET_TRAP_8972:
|
case ObjectID.NET_TRAP_8972:
|
||||||
@@ -305,7 +311,7 @@ public class HunterPlugin extends Plugin
|
|||||||
case ObjectID.NET_TRAP_8993:
|
case ObjectID.NET_TRAP_8993:
|
||||||
case ObjectID.NET_TRAP_8997:
|
case ObjectID.NET_TRAP_8997:
|
||||||
|
|
||||||
// Maniacal monkey boulder trap
|
// Maniacal monkey boulder trap
|
||||||
case ObjectID.MONKEY_TRAP_28828:
|
case ObjectID.MONKEY_TRAP_28828:
|
||||||
case ObjectID.MONKEY_TRAP_28829:
|
case ObjectID.MONKEY_TRAP_28829:
|
||||||
if (myTrap != null)
|
if (myTrap != null)
|
||||||
|
|||||||
@@ -77,6 +77,14 @@ class InventoryGridOverlay extends Overlay
|
|||||||
|
|
||||||
final net.runelite.api.Point mouse = client.getMouseCanvasPosition();
|
final net.runelite.api.Point mouse = client.getMouseCanvasPosition();
|
||||||
final Point mousePoint = new Point(mouse.getX(), mouse.getY());
|
final Point mousePoint = new Point(mouse.getX(), mouse.getY());
|
||||||
|
final int if1DraggedItemIndex = client.getIf1DraggedItemIndex();
|
||||||
|
final WidgetItem draggedItem = inventoryWidget.getWidgetItem(if1DraggedItemIndex);
|
||||||
|
final int itemId = draggedItem.getId();
|
||||||
|
|
||||||
|
if (itemId == -1)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < INVENTORY_SIZE; ++i)
|
for (int i = 0; i < INVENTORY_SIZE; ++i)
|
||||||
{
|
{
|
||||||
@@ -87,8 +95,7 @@ class InventoryGridOverlay extends Overlay
|
|||||||
|
|
||||||
if (plugin.isShowItem() && inBounds)
|
if (plugin.isShowItem() && inBounds)
|
||||||
{
|
{
|
||||||
final WidgetItem draggedItem = inventoryWidget.getWidgetItem(client.getIf1DraggedItemIndex());
|
final BufferedImage draggedItemImage = itemManager.getImage(itemId);
|
||||||
final BufferedImage draggedItemImage = itemManager.getImage(draggedItem.getId());
|
|
||||||
final int x = (int) bounds.getX();
|
final int x = (int) bounds.getX();
|
||||||
final int y = (int) bounds.getY();
|
final int y = (int) bounds.getY();
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,12 @@ public class ItemStatChanges
|
|||||||
add(boost(MAGIC, perc(.15, 5)), SUPER_MAGIC_POTION_1, SUPER_MAGIC_POTION_2, SUPER_MAGIC_POTION_3, SUPER_MAGIC_POTION_4);
|
add(boost(MAGIC, perc(.15, 5)), SUPER_MAGIC_POTION_1, SUPER_MAGIC_POTION_2, SUPER_MAGIC_POTION_3, SUPER_MAGIC_POTION_4);
|
||||||
add(combo(2, boost(RANGED, perc(0.1, 4)), boost(DEFENCE, perc(0.15, 5))), BASTION_POTION1, BASTION_POTION2, BASTION_POTION3, BASTION_POTION4);
|
add(combo(2, boost(RANGED, perc(0.1, 4)), boost(DEFENCE, perc(0.15, 5))), BASTION_POTION1, BASTION_POTION2, BASTION_POTION3, BASTION_POTION4);
|
||||||
add(combo(2, boost(MAGIC, 4), boost(DEFENCE, perc(0.15, 5))), BATTLEMAGE_POTION1, BATTLEMAGE_POTION2, BATTLEMAGE_POTION3, BATTLEMAGE_POTION4);
|
add(combo(2, boost(MAGIC, 4), boost(DEFENCE, perc(0.15, 5))), BATTLEMAGE_POTION1, BATTLEMAGE_POTION2, BATTLEMAGE_POTION3, BATTLEMAGE_POTION4);
|
||||||
|
add(combo(boost(MAGIC, 4), heal(HITPOINTS, -10)), DIVINE_MAGIC_POTION1, DIVINE_MAGIC_POTION2, DIVINE_MAGIC_POTION3, DIVINE_MAGIC_POTION4);
|
||||||
|
add(combo(boost(RANGED, perc(.10, 4)), heal(HITPOINTS, -10)), DIVINE_RANGING_POTION1, DIVINE_RANGING_POTION2, DIVINE_RANGING_POTION3, DIVINE_RANGING_POTION4);
|
||||||
|
add(combo(boost(ATTACK, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_ATTACK_POTION1, DIVINE_SUPER_ATTACK_POTION2, DIVINE_SUPER_ATTACK_POTION3, DIVINE_SUPER_ATTACK_POTION4);
|
||||||
|
add(combo(boost(STRENGTH, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_STRENGTH_POTION1, DIVINE_SUPER_STRENGTH_POTION2, DIVINE_SUPER_STRENGTH_POTION3, DIVINE_SUPER_STRENGTH_POTION4);
|
||||||
|
add(combo(boost(DEFENCE, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_DEFENCE_POTION1, DIVINE_SUPER_DEFENCE_POTION2, DIVINE_SUPER_DEFENCE_POTION3, DIVINE_SUPER_DEFENCE_POTION4);
|
||||||
|
add(combo(3, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_COMBAT_POTION1, DIVINE_SUPER_COMBAT_POTION2, DIVINE_SUPER_COMBAT_POTION3, DIVINE_SUPER_COMBAT_POTION4);
|
||||||
|
|
||||||
// Regular overload (NMZ)
|
// Regular overload (NMZ)
|
||||||
add(combo(5, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), boost(RANGED, perc(.15, 5)), boost(MAGIC, perc(.15, 5)), heal(HITPOINTS, -50)), OVERLOAD_1, OVERLOAD_2, OVERLOAD_3, OVERLOAD_4);
|
add(combo(5, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), boost(RANGED, perc(.15, 5)), boost(MAGIC, perc(.15, 5)), heal(HITPOINTS, -50)), OVERLOAD_1, OVERLOAD_2, OVERLOAD_3, OVERLOAD_4);
|
||||||
|
|||||||
@@ -181,10 +181,16 @@ class KeyRemappingListener extends MouseAdapter implements KeyListener
|
|||||||
switch (e.getKeyCode())
|
switch (e.getKeyCode())
|
||||||
{
|
{
|
||||||
case KeyEvent.VK_ESCAPE:
|
case KeyEvent.VK_ESCAPE:
|
||||||
// When existing typing mode, block the escape key
|
// When exiting typing mode, block the escape key
|
||||||
// so that it doesn't trigger the in-game hotkeys
|
// so that it doesn't trigger the in-game hotkeys
|
||||||
e.consume();
|
e.consume();
|
||||||
// FALLTHROUGH
|
plugin.setTyping(false);
|
||||||
|
clientThread.invoke(() ->
|
||||||
|
{
|
||||||
|
client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, "");
|
||||||
|
plugin.lockChat();
|
||||||
|
});
|
||||||
|
break;
|
||||||
case KeyEvent.VK_ENTER:
|
case KeyEvent.VK_ENTER:
|
||||||
plugin.setTyping(false);
|
plugin.setTyping(false);
|
||||||
clientThread.invoke(plugin::lockChat);
|
clientThread.invoke(plugin::lockChat);
|
||||||
|
|||||||
@@ -141,6 +141,8 @@ public class KeyRemappingPlugin extends Plugin
|
|||||||
if (client.getGameState() == GameState.LOGGED_IN)
|
if (client.getGameState() == GameState.LOGGED_IN)
|
||||||
{
|
{
|
||||||
lockChat();
|
lockChat();
|
||||||
|
// Clear any typed text
|
||||||
|
client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, "");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -255,8 +257,6 @@ public class KeyRemappingPlugin extends Plugin
|
|||||||
if (chatboxInput != null)
|
if (chatboxInput != null)
|
||||||
{
|
{
|
||||||
chatboxInput.setText(getWaitingText());
|
chatboxInput.setText(getWaitingText());
|
||||||
// Typed text can be non-empty on plugin start, so clear it now
|
|
||||||
client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, "");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ package net.runelite.client.plugins.loottracker;
|
|||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Component;
|
||||||
import java.awt.GridLayout;
|
import java.awt.GridLayout;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
@@ -62,6 +63,8 @@ class LootTrackerBox extends JPanel
|
|||||||
private final JLabel priceLabel = new JLabel();
|
private final JLabel priceLabel = new JLabel();
|
||||||
private final JLabel subTitleLabel = new JLabel();
|
private final JLabel subTitleLabel = new JLabel();
|
||||||
private final JLabel dateLabel = new JLabel();
|
private final JLabel dateLabel = new JLabel();
|
||||||
|
private final JPanel logTitle = new JPanel(new BorderLayout(5, 0));
|
||||||
|
private final JLabel titleLabel = new JLabel();
|
||||||
private final ItemManager itemManager;
|
private final ItemManager itemManager;
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private final String id;
|
private final String id;
|
||||||
@@ -92,11 +95,10 @@ class LootTrackerBox extends JPanel
|
|||||||
setLayout(new BorderLayout(0, 1));
|
setLayout(new BorderLayout(0, 1));
|
||||||
setBorder(new EmptyBorder(5, 0, 0, 0));
|
setBorder(new EmptyBorder(5, 0, 0, 0));
|
||||||
|
|
||||||
final JPanel logTitle = new JPanel(new BorderLayout(5, 0));
|
|
||||||
logTitle.setBorder(new EmptyBorder(7, 7, 7, 7));
|
logTitle.setBorder(new EmptyBorder(7, 7, 7, 7));
|
||||||
logTitle.setBackground(ColorScheme.DARKER_GRAY_COLOR.darker());
|
logTitle.setBackground(ColorScheme.DARKER_GRAY_COLOR.darker());
|
||||||
|
|
||||||
final JLabel titleLabel = new JLabel(Text.removeTags(id));
|
titleLabel.setText(Text.removeTags(id));
|
||||||
titleLabel.setFont(FontManager.getRunescapeSmallFont());
|
titleLabel.setFont(FontManager.getRunescapeSmallFont());
|
||||||
titleLabel.setForeground(Color.WHITE);
|
titleLabel.setForeground(Color.WHITE);
|
||||||
|
|
||||||
@@ -201,6 +203,39 @@ class LootTrackerBox extends JPanel
|
|||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void collapse()
|
||||||
|
{
|
||||||
|
if (!isCollapsed())
|
||||||
|
{
|
||||||
|
itemContainer.setVisible(false);
|
||||||
|
applyDimmer(false, logTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void expand()
|
||||||
|
{
|
||||||
|
if (isCollapsed())
|
||||||
|
{
|
||||||
|
itemContainer.setVisible(true);
|
||||||
|
applyDimmer(true, logTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isCollapsed()
|
||||||
|
{
|
||||||
|
return !itemContainer.isVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyDimmer(boolean brighten, JPanel panel)
|
||||||
|
{
|
||||||
|
for (Component component : panel.getComponents())
|
||||||
|
{
|
||||||
|
Color color = component.getForeground();
|
||||||
|
|
||||||
|
component.setForeground(brighten ? color.brighter() : color.darker());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method creates stacked items from the item list, calculates total price and then
|
* This method creates stacked items from the item list, calculates total price and then
|
||||||
* displays all the items in the UI.
|
* displays all the items in the UI.
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
private static final ImageIcon RESET_ICON;
|
private static final ImageIcon RESET_ICON;
|
||||||
private static final ImageIcon RESET_ICON_FADED;
|
private static final ImageIcon RESET_ICON_FADED;
|
||||||
private static final ImageIcon RESET_ICON_HOVER;
|
private static final ImageIcon RESET_ICON_HOVER;
|
||||||
|
private static final ImageIcon COLLAPSE_ICON;
|
||||||
|
private static final ImageIcon EXPAND_ICON;
|
||||||
|
|
||||||
|
|
||||||
private static final String HTML_LABEL_TEMPLATE =
|
private static final String HTML_LABEL_TEMPLATE =
|
||||||
@@ -109,7 +111,8 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
private final JLabel singleLootBtn = new JLabel();
|
private final JLabel singleLootBtn = new JLabel();
|
||||||
private final JLabel groupedLootBtn = new JLabel();
|
private final JLabel groupedLootBtn = new JLabel();
|
||||||
private final JLabel resetIcon = new JLabel();
|
private final JLabel resetIcon = new JLabel();
|
||||||
private JComboBox dateFilterComboBox = new JComboBox<>(new Vector<LootRecordDateFilter>(Arrays.asList(LootRecordDateFilter.values())));
|
private final JLabel collapseBtn = new JLabel();
|
||||||
|
private JComboBox dateFilterComboBox = new JComboBox<>(new Vector<>(Arrays.asList(LootRecordDateFilter.values())));
|
||||||
|
|
||||||
// Log collection
|
// Log collection
|
||||||
private final List<LootTrackerRecord> records = new ArrayList<>();
|
private final List<LootTrackerRecord> records = new ArrayList<>();
|
||||||
@@ -133,6 +136,8 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "visible_icon.png");
|
final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "visible_icon.png");
|
||||||
final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "invisible_icon.png");
|
final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "invisible_icon.png");
|
||||||
final BufferedImage resetImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "delete-white.png");
|
final BufferedImage resetImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "delete-white.png");
|
||||||
|
final BufferedImage collapseImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "collapsed.png");
|
||||||
|
final BufferedImage expandedImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "expanded.png");
|
||||||
|
|
||||||
SINGLE_LOOT_VIEW = new ImageIcon(singleLootImg);
|
SINGLE_LOOT_VIEW = new ImageIcon(singleLootImg);
|
||||||
SINGLE_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -180));
|
SINGLE_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -180));
|
||||||
@@ -155,9 +160,13 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
|
|
||||||
INVISIBLE_ICON = new ImageIcon(invisibleImg);
|
INVISIBLE_ICON = new ImageIcon(invisibleImg);
|
||||||
INVISIBLE_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -220));
|
INVISIBLE_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -220));
|
||||||
|
|
||||||
|
COLLAPSE_ICON = new ImageIcon(collapseImg);
|
||||||
|
EXPAND_ICON = new ImageIcon(expandedImg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter @Setter
|
@Getter
|
||||||
|
@Setter
|
||||||
private LootRecordSortType lootRecordSortType = LootRecordSortType.TIMESTAMP;
|
private LootRecordSortType lootRecordSortType = LootRecordSortType.TIMESTAMP;
|
||||||
|
|
||||||
LootTrackerPanel(final LootTrackerPlugin plugin, final ItemManager itemManager, final LootTrackerConfig config)
|
LootTrackerPanel(final LootTrackerPlugin plugin, final ItemManager itemManager, final LootTrackerConfig config)
|
||||||
@@ -185,6 +194,16 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
final JPanel viewControls = new JPanel(new GridLayout(1, 5, 5, 0));
|
final JPanel viewControls = new JPanel(new GridLayout(1, 5, 5, 0));
|
||||||
viewControls.setBackground(ColorScheme.DARKER_GRAY_COLOR);
|
viewControls.setBackground(ColorScheme.DARKER_GRAY_COLOR);
|
||||||
|
|
||||||
|
collapseBtn.setIcon(EXPAND_ICON);
|
||||||
|
collapseBtn.addMouseListener(new MouseAdapter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e)
|
||||||
|
{
|
||||||
|
changeCollapse();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
singleLootBtn.setIcon(SINGLE_LOOT_VIEW);
|
singleLootBtn.setIcon(SINGLE_LOOT_VIEW);
|
||||||
singleLootBtn.setToolTipText("Show each kill separately");
|
singleLootBtn.setToolTipText("Show each kill separately");
|
||||||
singleLootBtn.addMouseListener(new MouseAdapter()
|
singleLootBtn.addMouseListener(new MouseAdapter()
|
||||||
@@ -282,13 +301,14 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
dateFilterComboBox.setMaximumSize(new Dimension(15, 0));
|
dateFilterComboBox.setMaximumSize(new Dimension(15, 0));
|
||||||
dateFilterComboBox.setMaximumRowCount(3);
|
dateFilterComboBox.setMaximumRowCount(3);
|
||||||
dateFilterComboBox.addItemListener(e ->
|
dateFilterComboBox.addItemListener(e ->
|
||||||
{
|
{
|
||||||
final LootRecordDateFilter dateFilterSelected = (LootRecordDateFilter) e.getItem();
|
final LootRecordDateFilter dateFilterSelected = (LootRecordDateFilter) e.getItem();
|
||||||
dateFilter = dateFilterSelected;
|
dateFilter = dateFilterSelected;
|
||||||
rebuild();
|
rebuild();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
viewControls.add(collapseBtn);
|
||||||
//viewControls.add(dateFilterComboBox);
|
//viewControls.add(dateFilterComboBox);
|
||||||
viewControls.add(resetIcon);
|
viewControls.add(resetIcon);
|
||||||
viewControls.add(groupedLootBtn);
|
viewControls.add(groupedLootBtn);
|
||||||
@@ -332,8 +352,8 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
leftTitleContainer.add(detailsTitle, BorderLayout.CENTER);
|
leftTitleContainer.add(detailsTitle, BorderLayout.CENTER);
|
||||||
|
|
||||||
actionsContainer.add(dateFilterComboBox);
|
actionsContainer.add(dateFilterComboBox);
|
||||||
actionsContainer.add(leftTitleContainer, BorderLayout.WEST);
|
|
||||||
actionsContainer.add(viewControls, BorderLayout.EAST);
|
actionsContainer.add(viewControls, BorderLayout.EAST);
|
||||||
|
actionsContainer.add(leftTitleContainer, BorderLayout.WEST);
|
||||||
|
|
||||||
// Create panel that will contain overall data
|
// Create panel that will contain overall data
|
||||||
overallPanel.setBorder(BorderFactory.createCompoundBorder(
|
overallPanel.setBorder(BorderFactory.createCompoundBorder(
|
||||||
@@ -399,6 +419,27 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
actionsContainer.setVisible(true);
|
actionsContainer.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateCollapseText()
|
||||||
|
{
|
||||||
|
if (isAllCollapsed())
|
||||||
|
{
|
||||||
|
collapseBtn.setToolTipText("Un-Collapse All");
|
||||||
|
collapseBtn.setIcon(COLLAPSE_ICON);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
collapseBtn.setToolTipText("Collapse All");
|
||||||
|
collapseBtn.setIcon(EXPAND_ICON);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isAllCollapsed()
|
||||||
|
{
|
||||||
|
return boxes.stream()
|
||||||
|
.filter(i -> i.isCollapsed())
|
||||||
|
.count() == boxes.size();
|
||||||
|
}
|
||||||
|
|
||||||
void loadHeaderIcon(BufferedImage img)
|
void loadHeaderIcon(BufferedImage img)
|
||||||
{
|
{
|
||||||
overallIcon.setIcon(new ImageIcon(img));
|
overallIcon.setIcon(new ImageIcon(img));
|
||||||
@@ -412,7 +453,7 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
void add(final String eventName, final String localUsername, final int actorLevel, LootTrackerItem[] items)
|
void add(final String eventName, final String localUsername, final int actorLevel, LootTrackerItem[] items)
|
||||||
{
|
{
|
||||||
final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : "";
|
final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : "";
|
||||||
final LootTrackerRecord record = new LootTrackerRecord( eventName, localUsername, subTitle, items, Instant.now());
|
final LootTrackerRecord record = new LootTrackerRecord(eventName, localUsername, subTitle, items, Instant.now());
|
||||||
records.add(record);
|
records.add(record);
|
||||||
LootTrackerBox box = buildBox(record);
|
LootTrackerBox box = buildBox(record);
|
||||||
if (box != null)
|
if (box != null)
|
||||||
@@ -468,6 +509,28 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
plugin.deleteLocalRecords();
|
plugin.deleteLocalRecords();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the collapse status of loot entries
|
||||||
|
*/
|
||||||
|
private void changeCollapse()
|
||||||
|
{
|
||||||
|
boolean isAllCollapsed = isAllCollapsed();
|
||||||
|
|
||||||
|
for (LootTrackerBox box : boxes)
|
||||||
|
{
|
||||||
|
if (isAllCollapsed)
|
||||||
|
{
|
||||||
|
box.expand();
|
||||||
|
}
|
||||||
|
else if (!box.isCollapsed())
|
||||||
|
{
|
||||||
|
box.collapse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCollapseText();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After an item changed it's ignored state, iterate all the records and make
|
* After an item changed it's ignored state, iterate all the records and make
|
||||||
* sure all items of the same name also get updated
|
* sure all items of the same name also get updated
|
||||||
@@ -477,11 +540,13 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
for (LootTrackerRecord r : records)
|
for (LootTrackerRecord r : records)
|
||||||
{
|
{
|
||||||
if (plugin.isIgnoredNPC(r.getTitle()))
|
if (plugin.isIgnoredNPC(r.getTitle()))
|
||||||
for (LootTrackerItem item : r.getItems())
|
|
||||||
{
|
{
|
||||||
if (plugin.isIgnored(item.getName()) != item.isIgnored())
|
for (LootTrackerItem item : r.getItems())
|
||||||
{
|
{
|
||||||
item.setIgnored(plugin.isIgnored(item.getName()));
|
if (plugin.isIgnored(item.getName()) != item.isIgnored())
|
||||||
|
{
|
||||||
|
item.setIgnored(plugin.isIgnored(item.getName()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -544,15 +609,11 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
boxes.forEach(LootTrackerBox::rebuild);
|
boxes.forEach(LootTrackerBox::rebuild);
|
||||||
updateOverall();
|
updateOverall();
|
||||||
logsContainer.revalidate();
|
logsContainer.revalidate();
|
||||||
logsContainer.repaint();
|
logsContainer.repaint();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -606,7 +667,7 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
overallPanel.setVisible(true);
|
overallPanel.setVisible(true);
|
||||||
|
|
||||||
// Create box
|
// Create box
|
||||||
final LootTrackerBox box = new LootTrackerBox(record.getTimestamp().toEpochMilli(), itemManager, record.getTitle(), record.getSubTitle(),
|
final LootTrackerBox box = new LootTrackerBox(record.getTimestamp().toEpochMilli(), itemManager, record.getTitle(), record.getSubTitle(),
|
||||||
hideIgnoredItems, config.displayDate(), plugin::toggleItem);
|
hideIgnoredItems, config.displayDate(), plugin::toggleItem);
|
||||||
box.combine(record);
|
box.combine(record);
|
||||||
|
|
||||||
@@ -615,6 +676,27 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
popupMenu.setBorder(new EmptyBorder(5, 5, 5, 5));
|
popupMenu.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||||
box.setComponentPopupMenu(popupMenu);
|
box.setComponentPopupMenu(popupMenu);
|
||||||
|
|
||||||
|
// Create collapse event
|
||||||
|
box.addMouseListener(new MouseAdapter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(MouseEvent e)
|
||||||
|
{
|
||||||
|
if (e.getButton() == MouseEvent.BUTTON1)
|
||||||
|
{
|
||||||
|
if (box.isCollapsed())
|
||||||
|
{
|
||||||
|
box.expand();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
box.collapse();
|
||||||
|
}
|
||||||
|
updateCollapseText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Create Hide Menu item
|
// Create Hide Menu item
|
||||||
|
|
||||||
final JMenuItem hide;
|
final JMenuItem hide;
|
||||||
@@ -737,7 +819,10 @@ class LootTrackerPanel extends PluginPanel
|
|||||||
|
|
||||||
overallKillsLabel.setText(htmlLabel("Total count: ", overallKills));
|
overallKillsLabel.setText(htmlLabel("Total count: ", overallKills));
|
||||||
overallGpLabel.setText(htmlLabel("Total value: ", overallGp));
|
overallGpLabel.setText(htmlLabel("Total value: ", overallGp));
|
||||||
|
|
||||||
|
updateCollapseText();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String htmlLabel(String key, long value)
|
private static String htmlLabel(String key, long value)
|
||||||
{
|
{
|
||||||
final String valueStr = StackFormatter.quantityToStackSize(value);
|
final String valueStr = StackFormatter.quantityToStackSize(value);
|
||||||
|
|||||||
@@ -629,6 +629,10 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
// Clue Scrolls use same InventoryID as Barrows
|
// Clue Scrolls use same InventoryID as Barrows
|
||||||
container = client.getItemContainer(InventoryID.BARROWS_REWARD);
|
container = client.getItemContainer(InventoryID.BARROWS_REWARD);
|
||||||
break;
|
break;
|
||||||
|
case (WidgetID.KINGDOM_GROUP_ID):
|
||||||
|
eventType = "Kingdom of Miscellania";
|
||||||
|
container = client.getItemContainer(InventoryID.KINGDOM_OF_MISCELLANIA);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1150,7 +1150,8 @@ public class SlayerPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (TASK_STRING_VALIDATION.matcher(task.getTask()).find() || task.getTask().length() > TASK_STRING_MAX_LENGTH ||
|
if (TASK_STRING_VALIDATION.matcher(task.getTask()).find() || task.getTask().length() > TASK_STRING_MAX_LENGTH ||
|
||||||
TASK_STRING_VALIDATION.matcher(task.getLocation()).find() || task.getLocation().length() > TASK_STRING_MAX_LENGTH)
|
TASK_STRING_VALIDATION.matcher(task.getLocation()).find() || task.getLocation().length() > TASK_STRING_MAX_LENGTH ||
|
||||||
|
Task.getTask(task.getTask()) == null || !Task.LOCATIONS.contains(task.getLocation()))
|
||||||
{
|
{
|
||||||
log.debug("Validation failed for task name or location: {}", task);
|
log.debug("Validation failed for task name or location: {}", task);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
package net.runelite.client.plugins.slayer;
|
package net.runelite.client.plugins.slayer;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
@@ -242,6 +243,48 @@ enum Task
|
|||||||
//</editor-fold>
|
//</editor-fold>
|
||||||
|
|
||||||
private static final Map<String, Task> tasks;
|
private static final Map<String, Task> tasks;
|
||||||
|
static final List<String> LOCATIONS = ImmutableList.of(
|
||||||
|
"", // no location is a valid location
|
||||||
|
"Abyss",
|
||||||
|
"Ancient Cavern",
|
||||||
|
"Asgarnian Ice Dungeon",
|
||||||
|
"Brimhaven Dungeon",
|
||||||
|
"Brine Rat Cavern",
|
||||||
|
"Catacombs of Kourend",
|
||||||
|
"Chasm of Fire",
|
||||||
|
"Clan Wars",
|
||||||
|
"Death Plateau",
|
||||||
|
"Evil Chicken's Lair",
|
||||||
|
"Fossil Island",
|
||||||
|
"Fremennik Slayer Dungeon",
|
||||||
|
"God Wars Dungeon",
|
||||||
|
"Iorwerth Dungeon",
|
||||||
|
"Kalphite Lair",
|
||||||
|
"Karuulm Slayer Dungeon",
|
||||||
|
"Keldagrim",
|
||||||
|
"Kraken Cove",
|
||||||
|
"Lighthouse",
|
||||||
|
"Lithkren Vault",
|
||||||
|
"Lizardman Canyon",
|
||||||
|
"Lizardman Settlement",
|
||||||
|
"Molch",
|
||||||
|
"Mount Quidamortem",
|
||||||
|
"Mourner Tunnels",
|
||||||
|
"Ogre Enclave",
|
||||||
|
"Slayer Tower",
|
||||||
|
"Smoke Devil Dungeon",
|
||||||
|
"Smoke Dungeon",
|
||||||
|
"Stronghold of Security",
|
||||||
|
"Stronghold Slayer Dungeon",
|
||||||
|
"task-only Kalphite Cave",
|
||||||
|
"Taverley Dungeon",
|
||||||
|
"Troll Stronghold",
|
||||||
|
"Waterbirth Island",
|
||||||
|
"Waterfall Dungeon",
|
||||||
|
"Wilderness",
|
||||||
|
"Witchaven Dungeon",
|
||||||
|
"Zanaris"
|
||||||
|
);
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final int itemSpriteId;
|
private final int itemSpriteId;
|
||||||
|
|||||||
@@ -26,12 +26,16 @@ package net.runelite.client.ui.overlay;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Composite;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Paint;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.RenderingHints;
|
||||||
|
import java.awt.Stroke;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
@@ -145,7 +149,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onClientTick(ClientTick t)
|
private void onClientTick(ClientTick t)
|
||||||
{
|
{
|
||||||
if (menuEntries == null)
|
if (menuEntries == null)
|
||||||
{
|
{
|
||||||
@@ -499,11 +503,15 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
|
|||||||
graphics.setFont(this.interfaceFont);
|
graphics.setFont(this.interfaceFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the default color
|
// Save graphics2d properties so we can restore them later
|
||||||
graphics.setColor(Color.WHITE);
|
final AffineTransform transform = graphics.getTransform();
|
||||||
|
final Stroke stroke = graphics.getStroke();
|
||||||
|
final Composite composite = graphics.getComposite();
|
||||||
|
final Paint paint = graphics.getPaint();
|
||||||
|
final Color color = graphics.getColor();
|
||||||
|
final RenderingHints renderingHints = graphics.getRenderingHints();
|
||||||
|
final Color background = graphics.getBackground();
|
||||||
|
|
||||||
// Get transform so we can reset it after drawing
|
|
||||||
AffineTransform transform = graphics.getTransform();
|
|
||||||
graphics.translate(point.x, point.y);
|
graphics.translate(point.x, point.y);
|
||||||
|
|
||||||
final Dimension overlayDimension;
|
final Dimension overlayDimension;
|
||||||
@@ -518,7 +526,14 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
// Restore graphics2d properties
|
||||||
graphics.setTransform(transform);
|
graphics.setTransform(transform);
|
||||||
|
graphics.setStroke(stroke);
|
||||||
|
graphics.setComposite(composite);
|
||||||
|
graphics.setPaint(paint);
|
||||||
|
graphics.setColor(color);
|
||||||
|
graphics.setRenderingHints(renderingHints);
|
||||||
|
graphics.setBackground(background);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension());
|
final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension());
|
||||||
|
|||||||
@@ -4087,5 +4087,10 @@
|
|||||||
"22622": 10,
|
"22622": 10,
|
||||||
"22634": 100,
|
"22634": 100,
|
||||||
"22636": 100,
|
"22636": 100,
|
||||||
"22647": 10
|
"22647": 10,
|
||||||
|
"23499": 11000,
|
||||||
|
"23517": 100,
|
||||||
|
"23522": 70,
|
||||||
|
"23525": 4,
|
||||||
|
"23528": 70
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 131 B |
Binary file not shown.
|
After Width: | Height: | Size: 161 B |
@@ -510,6 +510,12 @@
|
|||||||
"name": "Amethyst Arrow",
|
"name": "Amethyst Arrow",
|
||||||
"xp": 13.5
|
"xp": 13.5
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"level": 84,
|
||||||
|
"icon": 21930,
|
||||||
|
"name": "Dragon Bolts",
|
||||||
|
"xp": 12
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"level": 84,
|
"level": 84,
|
||||||
"icon": 21318,
|
"icon": 21318,
|
||||||
|
|||||||
@@ -276,6 +276,12 @@
|
|||||||
"name": "Stamina Potion (3)",
|
"name": "Stamina Potion (3)",
|
||||||
"xp": 76.5
|
"xp": 76.5
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"level": 77,
|
||||||
|
"icon": 12625,
|
||||||
|
"name": "Stamina Potion (4)",
|
||||||
|
"xp": 102
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"level": 78,
|
"level": 78,
|
||||||
"icon": 189,
|
"icon": 189,
|
||||||
|
|||||||
@@ -407,8 +407,8 @@ public class SlayerPluginTest
|
|||||||
public void testTaskLookup() throws IOException
|
public void testTaskLookup() throws IOException
|
||||||
{
|
{
|
||||||
net.runelite.http.api.chat.Task task = new net.runelite.http.api.chat.Task();
|
net.runelite.http.api.chat.Task task = new net.runelite.http.api.chat.Task();
|
||||||
task.setTask("task");
|
task.setTask("Abyssal demons");
|
||||||
task.setLocation("loc");
|
task.setLocation("Abyss");
|
||||||
task.setAmount(42);
|
task.setAmount(42);
|
||||||
task.setInitialAmount(42);
|
task.setInitialAmount(42);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user