tmorph: use best of both worlds.

This commit is contained in:
Ganom
2020-01-25 15:23:48 -05:00
parent d097d95652
commit 3d66a7e102
4 changed files with 242 additions and 18 deletions

View File

@@ -0,0 +1,47 @@
package net.runelite.client.plugins.tmorph;
import java.util.Arrays;
import java.util.Map;
import javax.inject.Singleton;
@Singleton
public class Parse
{
public static boolean parse(String value)
{
try
{
final StringBuilder sb = new StringBuilder();
for (String str : value.split("\n"))
{
if (!str.startsWith("//"))
{
sb.append(str).append("\n");
}
}
final Map<String, String> tmp = TMorph.getNEWLINE_SPLITTER().withKeyValueSeparator(':').split(sb);
for (Map.Entry<String, String> entry : tmp.entrySet())
{
if (!TMorph.getKit().containsKey(entry.getValue()))
{
return false;
}
final int[] ints = Arrays.stream(entry.getKey().split(",")).map(String::trim).mapToInt(Integer::parseInt).toArray();
if (ints.length <= 1)
{
return false;
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}

View File

@@ -26,6 +26,7 @@ package net.runelite.client.plugins.tmorph;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@@ -36,10 +37,12 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import net.runelite.api.Actor; import net.runelite.api.Actor;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.events.AnimationChanged; import net.runelite.api.events.AnimationChanged;
import net.runelite.api.events.CommandExecuted;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick; import net.runelite.api.events.GameTick;
import net.runelite.api.events.SpotAnimationChanged; import net.runelite.api.events.SpotAnimationChanged;
@@ -50,13 +53,14 @@ import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.ConfigChanged;
import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType; import net.runelite.client.plugins.PluginType;
import net.runelite.client.plugins.tmorph.ui.TPanel; import net.runelite.client.plugins.tmorph.ui.TPanel;
import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.ClientToolbar;
import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.NavigationButton;
import net.runelite.client.util.Clipboard;
import net.runelite.client.util.ColorUtil;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@@ -76,10 +80,12 @@ public class TMorph extends Plugin
static static
{ {
final ImmutableMap.Builder<String, KitType> builder = new ImmutableMap.Builder<>(); final ImmutableMap.Builder<String, KitType> builder = new ImmutableMap.Builder<>();
for (KitType kit : KitType.values()) for (KitType kit : KitType.values())
{ {
builder.put(kit.getName(), kit); builder.put(kit.getName(), kit);
} }
kit = builder.build(); kit = builder.build();
} }
@@ -104,10 +110,6 @@ public class TMorph extends Plugin
@Inject @Inject
private ClientThread clientThread; private ClientThread clientThread;
@Inject
private ItemManager itemManager;
private TPanel panel; private TPanel panel;
private NavigationButton navButton; private NavigationButton navButton;
private int animation; private int animation;
@@ -118,6 +120,9 @@ public class TMorph extends Plugin
private int targetGraphic; private int targetGraphic;
@Setter @Setter
private Map<String, String> panelMorph = new HashMap<>(); private Map<String, String> panelMorph = new HashMap<>();
private Map<String, String> set1;
private Map<String, String> set2;
private Map<String, String> set3;
@Provides @Provides
TMorphConfig provideConfig(ConfigManager configManager) TMorphConfig provideConfig(ConfigManager configManager)
@@ -150,6 +155,78 @@ public class TMorph extends Plugin
eventBus.unregister(this); eventBus.unregister(this);
} }
@Subscribe
public void onCommandExecuted(CommandExecuted event)
{
final String[] args = event.getArguments();
if (event.getCommand().equals("tmorph"))
{
try
{
if (args[0].equals("copy"))
{
final StringBuilder sb = new StringBuilder();
final Player player = client.getLocalPlayer();
if (player == null
|| player.getPlayerAppearance() == null
|| client.getWidget(WidgetInfo.LOGIN_CLICK_TO_PLAY_SCREEN) != null
|| client.getViewportWidget() == null)
{
return;
}
for (KitType kitType : KitType.values())
{
if (kitType.equals(KitType.RING) || kitType.equals(KitType.AMMUNITION))
{
continue;
}
final int id = player.getPlayerAppearance().getEquipmentId(kitType);
if (id == -1)
{
continue;
}
sb.append(id);
sb.append(",-1");
sb.append(":");
sb.append(kitType.getName());
sb.append("\n");
}
client.addChatMessage(
ChatMessageType.GAMEMESSAGE,
"TMorph",
ColorUtil.prependColorTag("Your current gear has been copied to your clipboard", Color.RED),
null
);
Clipboard.store(sb.toString());
}
else
{
client.addChatMessage(
ChatMessageType.GAMEMESSAGE,
"TMorph",
ColorUtil.prependColorTag("Invalid syntax, do ::tmorph copy", Color.RED),
null
);
}
}
catch (Exception e)
{
client.addChatMessage(
ChatMessageType.GAMEMESSAGE,
"TMorph",
ColorUtil.prependColorTag("Invalid syntax, do ::tmorph copy", Color.RED),
null
);
}
}
}
@Subscribe @Subscribe
public void onGameStateChanged(GameStateChanged event) public void onGameStateChanged(GameStateChanged event)
{ {
@@ -233,11 +310,14 @@ public class TMorph extends Plugin
} }
updateGear(panelMorph, player); updateGear(panelMorph, player);
updateGear(set1, player);
updateGear(set2, player);
updateGear(set3, player);
} }
public void updateGear(Map<String, String> map, Player player) public void updateGear(Map<String, String> map, Player player)
{ {
if (map == null || map.isEmpty()) if (map == null || map.isEmpty() || player.getPlayerAppearance() == null)
{ {
return; return;
} }
@@ -281,6 +361,9 @@ public class TMorph extends Plugin
private void updateConfig() private void updateConfig()
{ {
this.set1 = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config.set1());
this.set2 = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config.set2());
this.set3 = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config.set3());
this.animation = config.animationSwap(); this.animation = config.animationSwap();
this.globalAnimSwap = config.globalAnimSwap(); this.globalAnimSwap = config.globalAnimSwap();
this.globalGraphicSwap = config.globalGraphicSwap(); this.globalGraphicSwap = config.globalGraphicSwap();

View File

@@ -27,10 +27,76 @@ import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigItem;
import net.runelite.client.config.ConfigSection; import net.runelite.client.config.ConfigSection;
import net.runelite.client.config.ConfigTitleSection;
import net.runelite.client.config.Title;
@ConfigGroup("TMorph") @ConfigGroup("TMorph")
public interface TMorphConfig extends Config public interface TMorphConfig extends Config
{ {
@ConfigTitleSection(
keyName = "swaps",
name = "Morphers",
description = "",
position = 1
)
default Title swaps()
{
return new Title();
}
@ConfigItem(
keyName = "mageSwap",
name = "Swap Set 1",
description = "<html><center>Proper Format is id,id:Slot" +
"<br>For example: 6570,21295:Cape" +
"<br>Valid Slots: Helmet, Cape, Amulet, Weapon, Torso, Shield, Legs, Head, Hands, Boots, Jaw, Ring, Ammo</center></html>",
titleSection = "swaps",
position = 1,
parse = true,
clazz = Parse.class,
method = "parse"
)
default String set1()
{
return "";
}
@ConfigItem(
keyName = "rangeSwap",
name = "Swap Set 2",
description = "<html><center>Proper Format is id,id:Slot" +
"<br>For example: 6570,21295:Cape" +
"<br>Valid Slots: Helmet, Cape, Amulet, Weapon, Torso, Shield, Legs, Head, Hands, Boots, Jaw, Ring, Ammo</center></html>",
titleSection = "swaps",
position = 2,
parse = true,
clazz = Parse.class,
method = "parse"
)
default String set2()
{
return "";
}
@ConfigItem(
keyName = "meleeSwap",
name = "Swap Set 3",
description = "<html><center>Proper Format is id,id:Slot" +
"<br>For example: 6570,21295:Cape" +
"<br>Valid Slots: Helmet, Cape, Amulet, Weapon, Torso, Shield, Legs, Head, Hands, Boots, Jaw, Ring, Ammo</center></html>",
titleSection = "swaps",
position = 3,
parse = true,
clazz = Parse.class,
method = "parse"
)
default String set3()
{
return "";
}
//////////////////Experimental Functions
@ConfigSection( @ConfigSection(
position = 4, position = 4,
keyName = "experimentalSection", keyName = "experimentalSection",
@@ -137,4 +203,18 @@ public interface TMorphConfig extends Config
{ {
return 0; return 0;
} }
@ConfigTitleSection(
keyName = "copy",
name = "<html><center>If you would like to copy your equipped" +
"<br>gear, type \"::tmorph copy\" in chat." +
"<br>This will copy your gear to your" +
"<br>clipboard for easy copy paste.</center></html>",
description = "",
position = 50
)
default Title copy()
{
return new Title();
}
} }

View File

@@ -63,6 +63,7 @@ import static net.runelite.api.kit.KitType.TORSO;
import static net.runelite.api.kit.KitType.WEAPON; import static net.runelite.api.kit.KitType.WEAPON;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.Notifier;
import net.runelite.client.database.DatabaseManager; import net.runelite.client.database.DatabaseManager;
import static net.runelite.client.database.data.Tables.TMORPH_SETS; import static net.runelite.client.database.data.Tables.TMORPH_SETS;
import net.runelite.client.database.data.tables.records.TmorphSetsRecord; import net.runelite.client.database.data.tables.records.TmorphSetsRecord;
@@ -86,6 +87,7 @@ public class TPanel extends PluginPanel
private final DatabaseManager databaseManager; private final DatabaseManager databaseManager;
private final ItemManager itemManager; private final ItemManager itemManager;
private final TMorph plugin; private final TMorph plugin;
private final Notifier notifier;
private final JComboBox<String> selector; private final JComboBox<String> selector;
private final Map<KitType, EquipSlot> equipSlots; private final Map<KitType, EquipSlot> equipSlots;
@@ -99,7 +101,8 @@ public class TPanel extends PluginPanel
final Client client, final Client client,
final DatabaseManager databaseManager, final DatabaseManager databaseManager,
final ItemManager itemManager, final ItemManager itemManager,
final TMorph plugin final TMorph plugin,
final Notifier notifier
) )
{ {
super(false); super(false);
@@ -107,6 +110,7 @@ public class TPanel extends PluginPanel
this.databaseManager = databaseManager; this.databaseManager = databaseManager;
this.itemManager = itemManager; this.itemManager = itemManager;
this.plugin = plugin; this.plugin = plugin;
this.notifier = notifier;
this.equipSlots = new LinkedHashMap<>(); this.equipSlots = new LinkedHashMap<>();
this.kitToId = new HashMap<>(); this.kitToId = new HashMap<>();
this.setMap = new HashMap<>(); this.setMap = new HashMap<>();
@@ -117,7 +121,7 @@ public class TPanel extends PluginPanel
private void init() private void init()
{ {
selector.addItem(""); selector.addItem("Populating fields...");
selector.setSelectedIndex(0); selector.setSelectedIndex(0);
selector.addActionListener((e) -> selector.addActionListener((e) ->
{ {
@@ -159,7 +163,7 @@ public class TPanel extends PluginPanel
final JPanel containerPanel = new JPanel(); final JPanel containerPanel = new JPanel();
final JLabel caption = new JLabel(); final JLabel caption = new JLabel();
caption.setText("Current Morph"); caption.setText("Morph Selector");
caption.setForeground(Color.WHITE); caption.setForeground(Color.WHITE);
caption.setHorizontalAlignment(JLabel.CENTER); caption.setHorizontalAlignment(JLabel.CENTER);
caption.setVerticalAlignment(JLabel.CENTER); caption.setVerticalAlignment(JLabel.CENTER);
@@ -290,7 +294,7 @@ public class TPanel extends PluginPanel
if (client.getGameState() == GameState.LOGGED_IN) if (client.getGameState() == GameState.LOGGED_IN)
{ {
Map<String, String> s = generate(); Map<String, String> s = generate(false);
} }
} }
}); });
@@ -300,18 +304,23 @@ public class TPanel extends PluginPanel
i++; i++;
} }
final JButton setButton = new JButton("Set Active Morph"); final JButton setButton = new JButton("Set/Copy Active Morph");
setButton.addActionListener((e) -> plugin.setPanelMorph(generate())); setButton.addActionListener((e) -> plugin.setPanelMorph(generate(true)));
equipPanel.add(setButton); equipPanel.add(setButton);
final JButton saveButton = new JButton("Save Active Morph"); final JButton saveButton = new JButton("Save Active Morph");
saveButton.addActionListener((e) -> saveButton.addActionListener((e) ->
{ {
final String result = JOptionPane.showInputDialog(saveButton, "What would you like to name the set?"); final String s = JOptionPane.showInputDialog(saveButton, "What would you like to name the set?");
if (s == null || s.isEmpty())
{
return;
}
Result<TmorphSetsRecord> records = databaseManager.getDsl() Result<TmorphSetsRecord> records = databaseManager.getDsl()
.selectFrom(TMORPH_SETS) .selectFrom(TMORPH_SETS)
.where(TMORPH_SETS.SET_NAME.eq(result)) .where(TMORPH_SETS.SET_NAME.eq(s))
.fetch(); .fetch();
boolean exists = records.isNotEmpty(); boolean exists = records.isNotEmpty();
@@ -319,7 +328,7 @@ public class TPanel extends PluginPanel
if (!exists) if (!exists)
{ {
databaseManager.getDsl().insertInto(TMORPH_SETS) databaseManager.getDsl().insertInto(TMORPH_SETS)
.set(TMORPH_SETS.SET_NAME, result) .set(TMORPH_SETS.SET_NAME, s)
.set(TMORPH_SETS.HELMET, kitToId.getOrDefault(HELMET, -1)) .set(TMORPH_SETS.HELMET, kitToId.getOrDefault(HELMET, -1))
.set(TMORPH_SETS.CAPE, kitToId.getOrDefault(CAPE, -1)) .set(TMORPH_SETS.CAPE, kitToId.getOrDefault(CAPE, -1))
.set(TMORPH_SETS.AMULET, kitToId.getOrDefault(AMULET, -1)) .set(TMORPH_SETS.AMULET, kitToId.getOrDefault(AMULET, -1))
@@ -344,7 +353,7 @@ public class TPanel extends PluginPanel
.set(TMORPH_SETS.LEGS, kitToId.getOrDefault(LEGS, -1)) .set(TMORPH_SETS.LEGS, kitToId.getOrDefault(LEGS, -1))
.set(TMORPH_SETS.HANDS, kitToId.getOrDefault(HANDS, -1)) .set(TMORPH_SETS.HANDS, kitToId.getOrDefault(HANDS, -1))
.set(TMORPH_SETS.BOOTS, kitToId.getOrDefault(BOOTS, -1)) .set(TMORPH_SETS.BOOTS, kitToId.getOrDefault(BOOTS, -1))
.where(TMORPH_SETS.SET_NAME.eq(result)) .where(TMORPH_SETS.SET_NAME.eq(s))
.execute(); .execute();
} }
}); });
@@ -359,7 +368,7 @@ public class TPanel extends PluginPanel
} }
} }
public Map<String, String> generate() public Map<String, String> generate(boolean copy)
{ {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
final Player player = client.getLocalPlayer(); final Player player = client.getLocalPlayer();
@@ -403,7 +412,12 @@ public class TPanel extends PluginPanel
} }
final String s = sb.toString(); final String s = sb.toString();
Clipboard.store(s);
if (copy)
{
Clipboard.store(s);
notifier.notify("Saved to clipboard.");
}
return plugin.getNEWLINE_SPLITTER() return plugin.getNEWLINE_SPLITTER()
.withKeyValueSeparator(":") .withKeyValueSeparator(":")