project: fix lambda things and add mixins and rename two fields (#12)

This commit is contained in:
ThatGamerBlue
2020-01-28 17:49:43 +00:00
committed by Kyle
parent ed5acca637
commit db1bfdfb47
12 changed files with 128 additions and 77 deletions

View File

@@ -67,7 +67,7 @@ public class BankItemQuery extends WidgetItemQuery
Rectangle bounds = child.getBounds(); Rectangle bounds = child.getBounds();
bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32); bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32);
// Index is set to 0 because the widget's index does not correlate to the order in the bank // Index is set to 0 because the widget's index does not correlate to the order in the bank
widgetItems.add(new WidgetItem(child.getItemId(), child.getItemQuantity(), 0, bounds, child)); widgetItems.add(new WidgetItem(child.getItemId(), child.getItemQuantity(), 0, bounds, child, false));
} }
} }
return widgetItems; return widgetItems;

View File

@@ -73,7 +73,7 @@ public class DialogQuery extends WidgetItemQuery
// set bounds to same size as default inventory // set bounds to same size as default inventory
Rectangle bounds = child.getBounds(); Rectangle bounds = child.getBounds();
bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32); bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32);
widgetItems.add(new WidgetItem(child.getId(), child.getItemQuantity(), i - 1, bounds, child)); widgetItems.add(new WidgetItem(child.getId(), child.getItemQuantity(), i - 1, bounds, child, false));
} }
} }
return widgetItems; return widgetItems;

View File

@@ -30,6 +30,7 @@ import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Point;
import net.runelite.api.QueryResults; import net.runelite.api.QueryResults;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
@@ -79,10 +80,20 @@ public class InventoryWidgetItemQuery extends WidgetItemQuery
for (int i = 0; i < children.length; i++) for (int i = 0; i < children.length; i++)
{ {
Widget child = children[i]; Widget child = children[i];
boolean isDragged = child.isWidgetItemDragged(child.getItemId());
int dragOffsetX = 0;
int dragOffsetY = 0;
if (isDragged)
{
Point p = child.getWidgetItemDragOffsets();
dragOffsetX = p.getX();
dragOffsetY = p.getY();
}
// set bounds to same size as default inventory // set bounds to same size as default inventory
Rectangle bounds = child.getBounds(); Rectangle bounds = child.getBounds();
bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32); bounds.setBounds(bounds.x + dragOffsetX, bounds.y + dragOffsetY, 32, 32);
widgetItems.add(new WidgetItem(child.getItemId(), child.getItemQuantity(), i, bounds, child)); widgetItems.add(new WidgetItem(child.getItemId(), child.getItemQuantity(), i, bounds, child, isDragged));
} }
break; break;
} }

View File

@@ -60,7 +60,7 @@ public class ShopItemQuery extends WidgetItemQuery
// set bounds to same size as default inventory // set bounds to same size as default inventory
Rectangle bounds = child.getBounds(); Rectangle bounds = child.getBounds();
bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32); bounds.setBounds(bounds.x - 1, bounds.y - 1, 32, 32);
widgetItems.add(new WidgetItem(child.getItemId(), child.getItemQuantity(), i - 1, bounds, child)); widgetItems.add(new WidgetItem(child.getItemId(), child.getItemQuantity(), i - 1, bounds, child, false)); // todo: maybe this shouldnt just be "false"
} }
} }
return widgetItems; return widgetItems;

View File

@@ -946,4 +946,8 @@ public interface Widget
* @param args A ScriptID, then the args for the script * @param args A ScriptID, then the args for the script
*/ */
void setOnReleaseListener(Object ...args); void setOnReleaseListener(Object ...args);
boolean isWidgetItemDragged(int index);
Point getWidgetItemDragOffsets();
} }

View File

@@ -83,7 +83,6 @@ import net.runelite.client.task.ScheduledMethod;
import net.runelite.client.task.Scheduler; import net.runelite.client.task.Scheduler;
import net.runelite.client.ui.RuneLiteSplashScreen; import net.runelite.client.ui.RuneLiteSplashScreen;
import net.runelite.client.util.GameEventManager; import net.runelite.client.util.GameEventManager;
import net.runelite.client.util.ReflectUtil;
@Singleton @Singleton
@Slf4j @Slf4j
@@ -547,45 +546,10 @@ public class PluginManager
return plugins; return plugins;
} }
private void schedule(Plugin plugin) public void schedule(Object plugin)
{ {
for (Method method : plugin.getClass().getMethods()) // note to devs: this method will almost certainly merge conflict in the future, just apply the changes in the scheduler instead
{ scheduler.registerObject(plugin);
Schedule schedule = method.getAnnotation(Schedule.class);
if (schedule == null)
{
continue;
}
Runnable runnable = null;
try
{
final Class<?> clazz = method.getDeclaringClass();
final MethodHandles.Lookup caller = ReflectUtil.privateLookupIn(clazz);
final MethodType subscription = MethodType.methodType(method.getReturnType(), method.getParameterTypes());
final MethodHandle target = caller.findVirtual(clazz, method.getName(), subscription);
final CallSite site = LambdaMetafactory.metafactory(
caller,
"run",
MethodType.methodType(Runnable.class, clazz),
subscription,
target,
subscription);
final MethodHandle factory = site.getTarget();
runnable = (Runnable) factory.bindTo(plugin).invokeExact();
}
catch (Throwable e)
{
log.warn("Unable to create lambda for method {}", method, e);
}
ScheduledMethod scheduledMethod = new ScheduledMethod(schedule, method, plugin, runnable);
log.debug("Scheduled task {}", scheduledMethod);
scheduler.addScheduledMethod(scheduledMethod);
}
} }
private void unschedule(Plugin plugin) private void unschedule(Plugin plugin)

View File

@@ -24,6 +24,11 @@
*/ */
package net.runelite.client.task; package net.runelite.client.task;
import java.lang.invoke.CallSite;
import java.lang.invoke.LambdaMetafactory;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.time.Duration; import java.time.Duration;
@@ -62,15 +67,41 @@ public class Scheduler
public void registerObject(Object obj) public void registerObject(Object obj)
{ {
for (Method method : obj.getClass().getDeclaredMethods()) for (Method method : obj.getClass().getMethods())
{ {
Schedule schedule = method.getAnnotation(Schedule.class); Schedule schedule = method.getAnnotation(Schedule.class);
if (schedule == null) if (schedule == null)
{ {
continue; continue;
} }
ScheduledMethod scheduledMethod = new ScheduledMethod(schedule, method, obj); Runnable runnable = null;
try
{
final Class<?> clazz = method.getDeclaringClass();
final MethodHandles.Lookup caller = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup());
final MethodType subscription = MethodType.methodType(method.getReturnType(), method.getParameterTypes());
final MethodHandle target = caller.findVirtual(clazz, method.getName(), subscription);
final CallSite site = LambdaMetafactory.metafactory(
caller,
"run",
MethodType.methodType(Runnable.class, clazz),
subscription,
target,
subscription);
final MethodHandle factory = site.getTarget();
runnable = (Runnable) factory.bindTo(obj).invokeExact();
}
catch (Throwable e)
{
log.warn("Unable to create lambda for method {}", method, e);
}
ScheduledMethod scheduledMethod = new ScheduledMethod(schedule, method, obj, runnable);
log.debug("Scheduled task {}", scheduledMethod);
addScheduledMethod(scheduledMethod); addScheduledMethod(scheduledMethod);
} }
} }

View File

@@ -1529,7 +1529,7 @@ public abstract class RSClientMixin implements RSClient
{ {
if (renderX >= minX && renderX <= maxX && renderY >= minY && renderY <= maxY) if (renderX >= minX && renderX <= maxX && renderY >= minY && renderY <= maxY)
{ {
WidgetItem widgetItem = new WidgetItem(widget.getItemId(), widget.getItemQuantity(), -1, widget.getBounds(), widget); WidgetItem widgetItem = new WidgetItem(widget.getItemId(), widget.getItemQuantity(), -1, widget.getBounds(), widget, false);
callbacks.drawItem(widget.getItemId(), widgetItem); callbacks.drawItem(widget.getItemId(), widgetItem);
} }
} }

View File

@@ -24,11 +24,6 @@
*/ */
package net.runelite.mixins; package net.runelite.mixins;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import net.runelite.api.HashTable; import net.runelite.api.HashTable;
import net.runelite.api.Node; import net.runelite.api.Node;
import net.runelite.api.Point; import net.runelite.api.Point;
@@ -42,8 +37,6 @@ import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow; import net.runelite.api.mixins.Shadow;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
import static net.runelite.api.widgets.WidgetInfo.TO_GROUP;
import net.runelite.api.widgets.WidgetItem; import net.runelite.api.widgets.WidgetItem;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSModel; import net.runelite.rs.api.RSModel;
@@ -52,24 +45,26 @@ import net.runelite.rs.api.RSNodeHashTable;
import net.runelite.rs.api.RSPlayerAppearance; import net.runelite.rs.api.RSPlayerAppearance;
import net.runelite.rs.api.RSSequenceDefinition; import net.runelite.rs.api.RSSequenceDefinition;
import net.runelite.rs.api.RSWidget; import net.runelite.rs.api.RSWidget;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
import static net.runelite.api.widgets.WidgetInfo.TO_GROUP;
@Mixin(RSWidget.class) @Mixin(RSWidget.class)
public abstract class RSWidgetMixin implements RSWidget public abstract class RSWidgetMixin implements RSWidget
{ {
private static final int ITEM_SLOT_SIZE = 32; private static final int ITEM_SLOT_SIZE = 32;
@Shadow("client") @Shadow("client")
private static RSClient client; private static RSClient client;
@Inject @Inject
private static int rl$widgetLastPosChanged; private static int rl$widgetLastPosChanged;
@Inject @Inject
private int rl$parentId; private int rl$parentId;
@Inject @Inject
private int rl$x; private int rl$x;
@Inject @Inject
private int rl$y; private int rl$y;
@@ -295,8 +290,19 @@ public abstract class RSWidgetMixin implements RSWidget
int itemX = rl$x + ((ITEM_SLOT_SIZE + xPitch) * col); int itemX = rl$x + ((ITEM_SLOT_SIZE + xPitch) * col);
int itemY = rl$y + ((ITEM_SLOT_SIZE + yPitch) * row); int itemY = rl$y + ((ITEM_SLOT_SIZE + yPitch) * row);
Rectangle bounds = new Rectangle(itemX, itemY, ITEM_SLOT_SIZE, ITEM_SLOT_SIZE); boolean isDragged = isWidgetItemDragged(index);
return new WidgetItem(itemId - 1, itemQuantity, index, bounds, this); int dragOffsetX = 0;
int dragOffsetY = 0;
if (isDragged)
{
Point p = getWidgetItemDragOffsets();
dragOffsetX = p.getX();
dragOffsetY = p.getY();
}
Rectangle bounds = new Rectangle(itemX + dragOffsetX, itemY + dragOffsetY, ITEM_SLOT_SIZE, ITEM_SLOT_SIZE);
return new WidgetItem(itemId - 1, itemQuantity, index, bounds, this, isDragged);
} }
@Inject @Inject
@@ -587,4 +593,31 @@ public abstract class RSWidgetMixin implements RSWidget
} }
return rs$getModel(sequence, frame, alternate, playerComposition); return rs$getModel(sequence, frame, alternate, playerComposition);
} }
@Inject
@Override
public boolean isWidgetItemDragged(int index)
{
return client.getIf1DraggedWidget() == this && client.getItemPressedDuration() >= 5 &&
client.getIf1DraggedItemIndex() == index;
}
@Inject
public Point getWidgetItemDragOffsets()
{
int dragOffsetX = client.getMouseX() - client.getDraggedWidgetX();
int dragOffsetY = client.getMouseY() - client.getDraggedWidgetY();
if (dragOffsetX < 5 && dragOffsetX > -5)
{
dragOffsetX = 0;
}
if (dragOffsetY < 5 && dragOffsetY > -5)
{
dragOffsetY = 0;
}
return new Point(dragOffsetX, dragOffsetY);
}
} }

View File

@@ -1146,4 +1146,10 @@ public interface RSClient extends RSGameShell, Client
@Import("showMouseCross") @Import("showMouseCross")
@Override @Override
void setShowMouseCross(boolean show); void setShowMouseCross(boolean show);
@Import("draggedWidgetX")
int getDraggedWidgetX(); // these should probably have if1 in their names somewhere
@Import("draggedWidgetY")
int getDraggedWidgetY();
} }

View File

@@ -1049,12 +1049,14 @@ public final class Client extends GameShell implements Usernamed {
@ObfuscatedGetter( @ObfuscatedGetter(
intValue = 1858822219 intValue = 1858822219
) )
static int field863; @Export("draggedWidgetX")
static int draggedWidgetX;
@ObfuscatedName("jd") @ObfuscatedName("jd")
@ObfuscatedGetter( @ObfuscatedGetter(
intValue = 1449162079 intValue = 1449162079
) )
static int field738; @Export("draggedWidgetY")
static int draggedWidgetY;
@ObfuscatedName("jy") @ObfuscatedName("jy")
@ObfuscatedGetter( @ObfuscatedGetter(
intValue = -1787846911 intValue = -1787846911
@@ -1372,8 +1374,8 @@ public final class Client extends GameShell implements Usernamed {
field764 = 0; field764 = 0;
field735 = 0; field735 = 0;
dragItemSlotSource = 0; dragItemSlotSource = 0;
field863 = 0; draggedWidgetX = 0;
field738 = 0; draggedWidgetY = 0;
dragItemSlotDestination = 0; dragItemSlotDestination = 0;
field768 = false; field768 = false;
itemDragDuration = 0; itemDragDuration = 0;
@@ -3765,10 +3767,10 @@ public final class Client extends GameShell implements Usernamed {
packetWriter.addNode(var27); packetWriter.addNode(var27);
} }
} else if (this.shouldLeftClickOpenMenu()) { } else if (this.shouldLeftClickOpenMenu()) {
this.openMenu(field863, field738); this.openMenu(draggedWidgetX, draggedWidgetY);
} else if (menuOptionsCount > 0) { } else if (menuOptionsCount > 0) {
var4 = field863; var4 = draggedWidgetX;
var5 = field738; var5 = draggedWidgetY;
Messages.method2231(LoginType.tempMenuAction, var4, var5); Messages.method2231(LoginType.tempMenuAction, var4, var5);
LoginType.tempMenuAction = null; LoginType.tempMenuAction = null;
} }
@@ -3776,7 +3778,7 @@ public final class Client extends GameShell implements Usernamed {
field764 = 10; field764 = 10;
MouseHandler.MouseHandler_lastButton = 0; MouseHandler.MouseHandler_lastButton = 0;
ClientPreferences.dragInventoryWidget = null; ClientPreferences.dragInventoryWidget = null;
} else if (itemDragDuration >= 5 && (MouseHandler.MouseHandler_x > field863 + 5 || MouseHandler.MouseHandler_x < field863 - 5 || MouseHandler.MouseHandler_y > field738 + 5 || MouseHandler.MouseHandler_y < field738 - 5)) { } else if (itemDragDuration >= 5 && (MouseHandler.MouseHandler_x > draggedWidgetX + 5 || MouseHandler.MouseHandler_x < draggedWidgetX - 5 || MouseHandler.MouseHandler_y > draggedWidgetY + 5 || MouseHandler.MouseHandler_y < draggedWidgetY - 5)) {
field768 = true; field768 = true;
} }
} }
@@ -5795,8 +5797,8 @@ public final class Client extends GameShell implements Usernamed {
} }
if (ClientPreferences.dragInventoryWidget != null && !field768 && menuOptionsCount > 0 && !this.shouldLeftClickOpenMenu()) { if (ClientPreferences.dragInventoryWidget != null && !field768 && menuOptionsCount > 0 && !this.shouldLeftClickOpenMenu()) {
var13 = field863; var13 = draggedWidgetX;
var10 = field738; var10 = draggedWidgetY;
Messages.method2231(LoginType.tempMenuAction, var13, var10); Messages.method2231(LoginType.tempMenuAction, var13, var10);
LoginType.tempMenuAction = null; LoginType.tempMenuAction = null;
} }
@@ -5809,8 +5811,8 @@ public final class Client extends GameShell implements Usernamed {
ClientPreferences.dragInventoryWidget = Tile.getWidget(var5); ClientPreferences.dragInventoryWidget = Tile.getWidget(var5);
dragItemSlotSource = var4; dragItemSlotSource = var4;
field863 = MouseHandler.MouseHandler_lastPressedX; draggedWidgetX = MouseHandler.MouseHandler_lastPressedX;
field738 = MouseHandler.MouseHandler_lastPressedY; draggedWidgetY = MouseHandler.MouseHandler_lastPressedY;
if (var2 >= 0) { if (var2 >= 0) {
BuddyRankComparator.method3361(var2); BuddyRankComparator.method3361(var2);
} }

View File

@@ -400,8 +400,8 @@ public class UserComparator7 extends AbstractUserComparator {
if (var27 != null) { if (var27 != null) {
if (var10 == ClientPreferences.dragInventoryWidget && var30 == Client.dragItemSlotSource) { if (var10 == ClientPreferences.dragInventoryWidget && var30 == Client.dragItemSlotSource) {
var24 = MouseHandler.MouseHandler_x - Client.field863; var24 = MouseHandler.MouseHandler_x - Client.draggedWidgetX;
var25 = MouseHandler.MouseHandler_y - Client.field738; var25 = MouseHandler.MouseHandler_y - Client.draggedWidgetY;
if (var24 < 5 && var24 > -5) { if (var24 < 5 && var24 > -5) {
var24 = 0; var24 = 0;
} }
@@ -430,7 +430,7 @@ public class UserComparator7 extends AbstractUserComparator {
} }
var28.scrollY -= var29; var28.scrollY -= var29;
Client.field738 += var29; Client.draggedWidgetY += var29;
LoginPacket.invalidateWidget(var28); LoginPacket.invalidateWidget(var28);
} }
@@ -445,7 +445,7 @@ public class UserComparator7 extends AbstractUserComparator {
} }
var28.scrollY += var29; var28.scrollY += var29;
Client.field738 -= var29; Client.draggedWidgetY -= var29;
LoginPacket.invalidateWidget(var28); LoginPacket.invalidateWidget(var28);
} }
} }