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.collect.ImmutableMap;
import com.google.inject.Provides;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.HashMap;
@@ -36,10 +37,12 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import net.runelite.api.Actor;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.GameState;
import net.runelite.api.Player;
import net.runelite.api.events.AnimationChanged;
import net.runelite.api.events.CommandExecuted;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
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.Subscribe;
import net.runelite.client.events.ConfigChanged;
import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType;
import net.runelite.client.plugins.tmorph.ui.TPanel;
import net.runelite.client.ui.ClientToolbar;
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 org.apache.commons.lang3.ObjectUtils;
@@ -76,10 +80,12 @@ public class TMorph extends Plugin
static
{
final ImmutableMap.Builder<String, KitType> builder = new ImmutableMap.Builder<>();
for (KitType kit : KitType.values())
{
builder.put(kit.getName(), kit);
}
kit = builder.build();
}
@@ -104,10 +110,6 @@ public class TMorph extends Plugin
@Inject
private ClientThread clientThread;
@Inject
private ItemManager itemManager;
private TPanel panel;
private NavigationButton navButton;
private int animation;
@@ -118,6 +120,9 @@ public class TMorph extends Plugin
private int targetGraphic;
@Setter
private Map<String, String> panelMorph = new HashMap<>();
private Map<String, String> set1;
private Map<String, String> set2;
private Map<String, String> set3;
@Provides
TMorphConfig provideConfig(ConfigManager configManager)
@@ -150,6 +155,78 @@ public class TMorph extends Plugin
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
public void onGameStateChanged(GameStateChanged event)
{
@@ -233,11 +310,14 @@ public class TMorph extends Plugin
}
updateGear(panelMorph, player);
updateGear(set1, player);
updateGear(set2, player);
updateGear(set3, player);
}
public void updateGear(Map<String, String> map, Player player)
{
if (map == null || map.isEmpty())
if (map == null || map.isEmpty() || player.getPlayerAppearance() == null)
{
return;
}
@@ -281,6 +361,9 @@ public class TMorph extends Plugin
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.globalAnimSwap = config.globalAnimSwap();
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.ConfigItem;
import net.runelite.client.config.ConfigSection;
import net.runelite.client.config.ConfigTitleSection;
import net.runelite.client.config.Title;
@ConfigGroup("TMorph")
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(
position = 4,
keyName = "experimentalSection",
@@ -137,4 +203,18 @@ public interface TMorphConfig extends Config
{
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 net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.Notifier;
import net.runelite.client.database.DatabaseManager;
import static net.runelite.client.database.data.Tables.TMORPH_SETS;
import net.runelite.client.database.data.tables.records.TmorphSetsRecord;
@@ -86,6 +87,7 @@ public class TPanel extends PluginPanel
private final DatabaseManager databaseManager;
private final ItemManager itemManager;
private final TMorph plugin;
private final Notifier notifier;
private final JComboBox<String> selector;
private final Map<KitType, EquipSlot> equipSlots;
@@ -99,7 +101,8 @@ public class TPanel extends PluginPanel
final Client client,
final DatabaseManager databaseManager,
final ItemManager itemManager,
final TMorph plugin
final TMorph plugin,
final Notifier notifier
)
{
super(false);
@@ -107,6 +110,7 @@ public class TPanel extends PluginPanel
this.databaseManager = databaseManager;
this.itemManager = itemManager;
this.plugin = plugin;
this.notifier = notifier;
this.equipSlots = new LinkedHashMap<>();
this.kitToId = new HashMap<>();
this.setMap = new HashMap<>();
@@ -117,7 +121,7 @@ public class TPanel extends PluginPanel
private void init()
{
selector.addItem("");
selector.addItem("Populating fields...");
selector.setSelectedIndex(0);
selector.addActionListener((e) ->
{
@@ -159,7 +163,7 @@ public class TPanel extends PluginPanel
final JPanel containerPanel = new JPanel();
final JLabel caption = new JLabel();
caption.setText("Current Morph");
caption.setText("Morph Selector");
caption.setForeground(Color.WHITE);
caption.setHorizontalAlignment(JLabel.CENTER);
caption.setVerticalAlignment(JLabel.CENTER);
@@ -290,7 +294,7 @@ public class TPanel extends PluginPanel
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++;
}
final JButton setButton = new JButton("Set Active Morph");
setButton.addActionListener((e) -> plugin.setPanelMorph(generate()));
final JButton setButton = new JButton("Set/Copy Active Morph");
setButton.addActionListener((e) -> plugin.setPanelMorph(generate(true)));
equipPanel.add(setButton);
final JButton saveButton = new JButton("Save Active Morph");
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()
.selectFrom(TMORPH_SETS)
.where(TMORPH_SETS.SET_NAME.eq(result))
.where(TMORPH_SETS.SET_NAME.eq(s))
.fetch();
boolean exists = records.isNotEmpty();
@@ -319,7 +328,7 @@ public class TPanel extends PluginPanel
if (!exists)
{
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.CAPE, kitToId.getOrDefault(CAPE, -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.HANDS, kitToId.getOrDefault(HANDS, -1))
.set(TMORPH_SETS.BOOTS, kitToId.getOrDefault(BOOTS, -1))
.where(TMORPH_SETS.SET_NAME.eq(result))
.where(TMORPH_SETS.SET_NAME.eq(s))
.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 Player player = client.getLocalPlayer();
@@ -403,7 +412,12 @@ public class TPanel extends PluginPanel
}
final String s = sb.toString();
Clipboard.store(s);
if (copy)
{
Clipboard.store(s);
notifier.notify("Saved to clipboard.");
}
return plugin.getNEWLINE_SPLITTER()
.withKeyValueSeparator(":")