Spellbook fixes (#243)
* Spellbook: make middle mouse button not change spell location * Spellbook: Much needed fixes and refactoring
This commit is contained in:
@@ -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("\"", "");
|
||||||
|
|||||||
Reference in New Issue
Block a user