Spellbook fixes (#243)

* Spellbook: make middle mouse button not change spell location

* Spellbook: Much needed fixes and refactoring
This commit is contained in:
Lucwousin
2019-05-13 15:11:36 +02:00
committed by Kyleeld
parent 6a3afa085b
commit f0282fdad5

View File

@@ -25,10 +25,10 @@
package net.runelite.client.plugins.spellbook; package net.runelite.client.plugins.spellbook;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -124,7 +124,7 @@ public class SpellbookPlugin extends Plugin
private Map<Integer, Spell> spells = new HashMap<>(); private Map<Integer, Spell> spells = new HashMap<>();
private Map<Integer, Spell> tmp = null; private Map<Integer, Spell> tmp = null;
private List<String> notFilteredSpells = new ArrayList<>(); private ImmutableSet<String> notFilteredSpells;
private Spellbook spellbook; private Spellbook spellbook;
private SpellbookMouseListener mouseListener; private SpellbookMouseListener mouseListener;
@@ -196,157 +196,45 @@ public class SpellbookPlugin extends Plugin
} }
} }
@Subscribe private static boolean isUnfiltered(String spell, ImmutableSet<String> unfiltereds)
public void onScriptCallbackEvent(ScriptCallbackEvent event)
{ {
if (client.getVar(Varbits.FILTER_SPELLBOOK) != 0 || !config.enableMobile() || !event.getEventName().toLowerCase().contains("spell")) for (String str : unfiltereds)
{ {
return; WordFilterMode mode = getFilterMode(str);
} str = removeFlyingComma(str).toLowerCase();
spell = spell.toLowerCase();
int[] iStack = client.getIntStack(); if (mode == WordFilterMode.CONTAINS)
int iStackSize = client.getIntStackSize();
String[] sStack = client.getStringStack();
int sStackSize = client.getStringStackSize();
if ("startSpellRedraw".equals(event.getEventName()))
{
if (config.canDrag())
{ {
return; if (spell.contains(str))
}
spellbook = Spellbook.getByID(client.getVar(Varbits.SPELLBOOK));
loadSpells();
}
else if ("shouldFilterSpell".equals(event.getEventName()))
{
String spell = sStack[sStackSize - 1].toLowerCase();
int widget = iStack[iStackSize - 1];
// Add the spell to spells
if (!spells.containsKey(widget))
{
Spell s = new Spell();
s.setWidget(widget);
s.setX(-1);
s.setY(-1);
s.setSize(0);
s.setName(spell);
spells.put(widget, s);
}
if (notFilteredSpells.isEmpty())
{
return;
}
for (String str : notFilteredSpells)
{
WordFilterMode mode = getFilterMode(str);
str = str.replaceAll("\"", "");
if (mode == WordFilterMode.CONTAINS)
{ {
if (spell.contains(str)) return true;
{
iStack[iStackSize - 2] = 1;
break;
}
} }
else if (mode == WordFilterMode.STARTSWITH) }
else if (mode == WordFilterMode.STARTSWITH)
{
if (spell.startsWith(str))
{ {
if (spell.startsWith(str)) return true;
{
iStack[iStackSize - 2] = 1;
break;
}
} }
else if (mode == WordFilterMode.ENDSWITH) }
else if (mode == WordFilterMode.ENDSWITH)
{
if (spell.endsWith(str))
{ {
if (spell.endsWith(str)) return true;
{
iStack[iStackSize - 2] = 1;
break;
}
} }
else if (mode == WordFilterMode.EQUALS) }
else if (mode == WordFilterMode.EQUALS)
{
if (spell.equals(str))
{ {
if (spell.equals(str)) return true;
{
iStack[iStackSize - 2] = 1;
break;
}
} }
iStack[iStackSize - 2] = 0;
} }
} }
else if ("isMobileSpellbookEnabled".equals(event.getEventName()))
{
iStack[iStackSize - 1] = 1;
}
else if ("resizeSpell".equals(event.getEventName()))
{
int size = config.size();
int columns = clamp(FULL_WIDTH / size, 3, 2);
iStack[iStackSize - 2] = size; return false;
iStack[iStackSize - 1] = columns;
}
else if ("setSpellAreaSize".equals(event.getEventName()))
{
if (!config.dragSpells())
{
return;
}
iStack[iStackSize - 2] = FULL_WIDTH;
iStack[iStackSize - 1] = FULL_HEIGHT;
}
else if ("resizeIndividualSpells".equals(event.getEventName()))
{
int widget = iStack[iStackSize - 1];
int visCount = (int) spells.values().stream()
.map(Spell::getName)
.map(SpellbookPlugin::removeFlyingComma)
.filter(s -> notFilteredSpells.stream().anyMatch(s::contains))
.count();
if (visCount > 20 || visCount == 0)
{
return;
}
Spell spell = spells.get(widget);
int newSize = clamp(trueSize(spell), FULL_WIDTH, 0);
iStack[iStackSize - 3] = newSize;
iStack[iStackSize - 2] = newSize;
}
else if ("setSpellPosition".equals(event.getEventName()))
{
if (!config.dragSpells())
{
return;
}
int widget = iStack[iStackSize - 1];
Spell s = spells.get(widget);
int x = s.getX();
int y = s.getY();
if (x == -1 || y == -1)
{
return;
}
iStack[iStackSize - 5] = x;
iStack[iStackSize - 4] = y;
}
} }
@@ -415,10 +303,121 @@ public class SpellbookPlugin extends Plugin
} }
} }
private void loadFilter() @Subscribe
public void onScriptCallbackEvent(ScriptCallbackEvent event)
{ {
notFilteredSpells.clear(); if (client.getVar(Varbits.FILTER_SPELLBOOK) != 0 || !config.enableMobile() || !event.getEventName().toLowerCase().contains("spell"))
notFilteredSpells.addAll(Text.fromCSV(config.filter().toLowerCase())); {
return;
}
int[] iStack = client.getIntStack();
int iStackSize = client.getIntStackSize();
String[] sStack = client.getStringStack();
int sStackSize = client.getStringStackSize();
if ("startSpellRedraw".equals(event.getEventName()))
{
if (config.canDrag())
{
return;
}
spellbook = Spellbook.getByID(client.getVar(Varbits.SPELLBOOK));
loadSpells();
}
else if ("shouldFilterSpell".equals(event.getEventName()))
{
String spell = sStack[sStackSize - 1].toLowerCase();
int widget = iStack[iStackSize - 1];
// Add the spell to spells
if (!spells.containsKey(widget))
{
Spell s = new Spell();
s.setWidget(widget);
s.setX(-1);
s.setY(-1);
s.setSize(0);
s.setName(spell);
spells.put(widget, s);
}
if (notFilteredSpells.isEmpty())
{
return;
}
ImmutableSet<String> tmp = ImmutableSet.copyOf(notFilteredSpells);
iStack[iStackSize - 2] = isUnfiltered(spell, tmp) ? 1 : 0;
}
else if ("isMobileSpellbookEnabled".equals(event.getEventName()))
{
iStack[iStackSize - 1] = 1;
}
else if ("resizeSpell".equals(event.getEventName()))
{
int size = config.size();
int columns = clamp(FULL_WIDTH / size, 3, 2);
iStack[iStackSize - 2] = size;
iStack[iStackSize - 1] = columns;
}
else if ("setSpellAreaSize".equals(event.getEventName()))
{
if (!config.dragSpells())
{
return;
}
iStack[iStackSize - 2] = FULL_WIDTH;
iStack[iStackSize - 1] = FULL_HEIGHT;
}
else if ("resizeIndividualSpells".equals(event.getEventName()))
{
ImmutableSet<String> tmp = ImmutableSet.copyOf(notFilteredSpells);
int widget = iStack[iStackSize - 1];
int visCount = (int) spells.values().stream()
.map(Spell::getName)
.filter(s -> isUnfiltered(s, tmp))
.count();
if (visCount > 20 || visCount == 0)
{
return;
}
Spell spell = spells.get(widget);
int newSize = clamp(trueSize(spell), FULL_WIDTH, 0);
iStack[iStackSize - 3] = newSize;
iStack[iStackSize - 2] = newSize;
}
else if ("setSpellPosition".equals(event.getEventName()))
{
if (!config.dragSpells())
{
return;
}
int widget = iStack[iStackSize - 1];
Spell s = spells.get(widget);
int x = s.getX();
int y = s.getY();
if (x == -1 || y == -1)
{
return;
}
iStack[iStackSize - 5] = x;
iStack[iStackSize - 4] = y;
}
} }
private void loadSpells() private void loadSpells()
@@ -504,21 +503,9 @@ public class SpellbookPlugin extends Plugin
return currentWidget(point) != null; return currentWidget(point) != null;
} }
private Widget currentWidget(java.awt.Point point) private void loadFilter()
{ {
for (int id : spells.keySet()) notFilteredSpells = ImmutableSet.copyOf(Text.fromCSV(config.filter().toLowerCase()));
{
Widget w = client.getWidget(WidgetInfo.TO_GROUP(id), WidgetInfo.TO_CHILD(id)); // y tho let me just plop in id
if (w == null || !w.getBounds().contains(point) || notFilteredSpells.stream().noneMatch(spells.get(id).getName()::contains))
{
continue;
}
return w;
}
return null;
} }
void startDragging(java.awt.Point point) void startDragging(java.awt.Point point)
@@ -565,37 +552,23 @@ public class SpellbookPlugin extends Plugin
runRebuild(); runRebuild();
} }
void resetZoom(java.awt.Point point) private Widget currentWidget(java.awt.Point point)
{ {
Widget clickedWidget = currentWidget(point); ImmutableSet<String> tmp = ImmutableSet.copyOf(notFilteredSpells);
if (clickedWidget == null || dragging || !config.scroll()) for (int id : spells.keySet())
{ {
return; Widget w = client.getWidget(WidgetInfo.TO_GROUP(id), WidgetInfo.TO_CHILD(id)); // y tho let me just plop in id
if (w == null || !w.getBounds().contains(point) || !isUnfiltered(spells.get(id).getName(), tmp))
{
continue;
}
return w;
} }
int clickedWidgetId = clickedWidget.getId(); return null;
if (!spells.containsKey(clickedWidgetId))
{
return;
}
Spell clickedSpell = tmp.getOrDefault(clickedWidgetId, spells.get(clickedWidgetId));
int oldSize = clickedSpell.getSize();
if (oldSize == 0)
{
return;
}
clickedSpell.setX(clickedSpell.getX() + trueSize(clickedSpell) / 4);
clickedSpell.setY(clickedSpell.getY() + trueSize(clickedSpell) / 4);
clickedSpell.setSize(0);
tmp.put(clickedWidgetId, clickedSpell);
runRebuild();
} }
void increaseSize(java.awt.Point point) void increaseSize(java.awt.Point point)
@@ -633,6 +606,46 @@ public class SpellbookPlugin extends Plugin
runRebuild(); runRebuild();
} }
void resetZoom(java.awt.Point point)
{
Widget clickedWidget = currentWidget(point);
if (clickedWidget == null || dragging || !config.scroll())
{
return;
}
int clickedWidgetId = clickedWidget.getId();
if (!spells.containsKey(clickedWidgetId))
{
return;
}
Spell clickedSpell = spells.get(clickedWidgetId);
int oldSize = clickedSpell.getSize();
int tmpSize = tmp.get(clickedWidgetId).getSize();
if (tmpSize == 0 && oldSize == 0)
{
return;
}
clickedSpell.setX(clickedSpell.getX() + oldSize);
clickedSpell.setY(clickedSpell.getY() + oldSize);
clickedSpell.setSize(0);
tmp.put(clickedWidgetId, clickedSpell);
runRebuild();
}
private static int clamp(int i, int upper, int lower)
{
return Math.min(Math.max(i, lower), upper);
}
void decreaseSize(java.awt.Point point) void decreaseSize(java.awt.Point point)
{ {
Widget scrolledWidget = currentWidget(point); Widget scrolledWidget = currentWidget(point);
@@ -666,11 +679,6 @@ public class SpellbookPlugin extends Plugin
runRebuild(); runRebuild();
} }
private static int clamp(int i, int upper, int lower)
{
return Math.min(Math.max(i, lower), upper);
}
private static String removeFlyingComma(String s) private static String removeFlyingComma(String s)
{ {
return s.replaceAll("\"", ""); return s.replaceAll("\"", "");