project: Update mixins

This commit is contained in:
Owain van Brakel
2019-11-06 12:38:16 +01:00
parent 5efce1e3d6
commit ce8f3f48c0
23 changed files with 814 additions and 322 deletions

View File

@@ -1,10 +1,10 @@
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import net.runelite.api.Model;
import net.runelite.api.Perspective;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.geometry.Shapes;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
@@ -86,6 +86,11 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject
return null;
}
if (clickboxA != null && clickboxB != null)
{
return new Shapes(new Shape[]{clickboxA, clickboxB});
}
if (clickboxA != null)
{
return clickboxA;
@@ -94,11 +99,9 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject
return clickboxB;
}
@Inject
@Override
public Polygon getConvexHull()
public Shape getConvexHull()
{
RSModel model = getModelA();
@@ -108,6 +111,23 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX(), getY(), 0, tileHeight);
}
@Inject
@Override
public Shape getConvexHull2()
{
RSModel model = getModelB();
if (model == null)
{
return null;
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX(), getY(), 0, tileHeight);
}
}

View File

@@ -49,6 +49,7 @@ import net.runelite.api.HintArrowType;
import net.runelite.api.Ignore;
import net.runelite.api.IndexDataBase;
import net.runelite.api.IndexedSprite;
import net.runelite.api.IntegerNode;
import net.runelite.api.InventoryID;
import net.runelite.api.MenuEntry;
import net.runelite.api.MenuOpcode;
@@ -111,6 +112,7 @@ import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow;
import net.runelite.api.vars.AccountType;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetConfig;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.api.widgets.WidgetItem;
import net.runelite.api.widgets.WidgetType;
@@ -215,6 +217,9 @@ public abstract class RSClientMixin implements RSClient
@Inject
private static boolean hideClanmateCastOptions = false;
@Inject
private static boolean allWidgetsAreOpTargetable = false;
@Inject
private static Set<String> unhiddenCasts = new HashSet<String>();
@@ -260,6 +265,13 @@ public abstract class RSClientMixin implements RSClient
hideClanmateCastOptions = yes;
}
@Inject
@Override
public void setAllWidgetsAreOpTargetable(boolean yes)
{
allWidgetsAreOpTargetable = yes;
}
@Inject
@Override
public void setUnhiddenCasts(Set<String> casts)
@@ -1820,4 +1832,28 @@ public abstract class RSClientMixin implements RSClient
client.getCallbacks().post(VolumeChanged.class, volumeChanged);
}
}
@Replace("getWidgetClickMask")
public static int getWidgetClickMask(Widget widget)
{
IntegerNode integerNode = (IntegerNode) client.getWidgetFlags().get(((long) widget.getId() << 32) + (long) widget.getIndex());
int widgetClickMask;
if (integerNode == null)
{
widgetClickMask = widget.getClickMask();
}
else
{
widgetClickMask = integerNode.getValue();
}
if (allWidgetsAreOpTargetable)
{
widgetClickMask |= WidgetConfig.WIDGET_USE_TARGET;
}
return widgetClickMask;
}
}

View File

@@ -1,6 +1,5 @@
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import net.runelite.api.Model;
import net.runelite.api.Perspective;
@@ -60,7 +59,7 @@ public abstract class RSFloorDecorationMixin implements RSFloorDecoration
@Inject
@Override
public Polygon getConvexHull()
public Shape getConvexHull()
{
RSModel model = getModel();
@@ -70,6 +69,7 @@ public abstract class RSFloorDecorationMixin implements RSFloorDecoration
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX(), getY(), 0, tileHeight);
}

View File

@@ -24,7 +24,6 @@
*/
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
@@ -87,7 +86,7 @@ public abstract class RSGameObjectMixin implements RSGameObject
@Inject
@Override
public Polygon getConvexHull()
public Shape getConvexHull()
{
RSModel model = getModel();
@@ -97,6 +96,7 @@ public abstract class RSGameObjectMixin implements RSGameObject
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX(), getY(), getRsOrientation(), tileHeight);
}

View File

@@ -24,13 +24,11 @@
*/
package net.runelite.mixins;
import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.mixins.Copy;
import net.runelite.api.mixins.FieldHook;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSItemContainer;
@@ -41,11 +39,8 @@ public abstract class RSItemContainerMixin implements RSItemContainer
@Shadow("client")
private static RSClient client;
@Inject
static private int rl$lastCycle;
@Inject
static private int rl$lastContainer;
@Shadow("changedItemContainers")
private static int[] changedItemContainers;
@Inject
@Override
@@ -67,35 +62,22 @@ public abstract class RSItemContainerMixin implements RSItemContainer
return items;
}
@Copy("itemContainerSetItem")
static void rs$itemContainerSetItem(int itemContainerId, int index, int itemId, int itemQuantity)
@FieldHook("changedItemContainers")
@Inject
public static void onItemContainerUpdate(int idx)
{
}
@Replace("itemContainerSetItem")
static void rl$itemContainerSetItem(int itemContainerId, int index, int itemId, int itemQuantity)
{
rs$itemContainerSetItem(itemContainerId, index, itemId, itemQuantity);
int cycle = client.getGameCycle();
if (rl$lastCycle == cycle && rl$lastContainer == itemContainerId)
if (idx != -1)
{
// Limit item container updates to one per cycle per container
return;
int changedId = idx - 1 & 31;
int containerId = changedItemContainers[changedId];
RSItemContainer changedContainer = (RSItemContainer) client.getItemContainers().get(containerId);
if (changedContainer != null)
{
ItemContainerChanged event = new ItemContainerChanged(containerId, changedContainer);
client.getCallbacks().postDeferred(ItemContainerChanged.class, event);
}
}
InventoryID container = InventoryID.getValue(itemContainerId);
if (container == null)
{
return;
}
rl$lastCycle = cycle;
rl$lastContainer = itemContainerId;
ItemContainerChanged event = new ItemContainerChanged(itemContainerId, client.getItemContainer(container));
client.getCallbacks().postDeferred(ItemContainerChanged.class, event);
}
}

View File

@@ -24,12 +24,11 @@
*/
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.List;
import net.runelite.api.Model;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.mixins.Copy;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.MethodHook;
@@ -140,7 +139,7 @@ public abstract class RSModelMixin implements RSModel
int[] trianglesZ = getTrianglesZ();
List<Vertex> vertices = getVertices();
List<Triangle> triangles = new ArrayList<Triangle>(getTrianglesCount());
List<Triangle> triangles = new ArrayList<>(getTrianglesCount());
for (int i = 0; i < getTrianglesCount(); ++i)
{
@@ -321,49 +320,14 @@ public abstract class RSModelMixin implements RSModel
@Override
@Inject
public Polygon getConvexHull(int localX, int localY, int orientation, int tileHeight)
public Shape getConvexHull(int localX, int localY, int orientation, int tileHeight)
{
assert client.isClientThread();
int[] x2d = new int[this.getVerticesCount()];
int[] y2d = new int[this.getVerticesCount()];
List<Vertex> vertices = getVertices();
Perspective.modelToCanvas(client, this.getVerticesCount(), localX, localY, tileHeight, orientation, this.getVerticesX(), this.getVerticesZ(), this.getVerticesY(), x2d, y2d);
// rotate vertices
for (int i = 0; i < vertices.size(); ++i)
{
Vertex v = vertices.get(i);
vertices.set(i, v.rotate(orientation));
}
List<Point> points = new ArrayList<Point>();
for (Vertex v : vertices)
{
// Compute canvas location of vertex
Point p = Perspective.localToCanvas(client,
localX - v.getX(),
localY - v.getZ(),
tileHeight + v.getY());
if (p != null)
{
points.add(p);
}
}
// Run Jarvis march algorithm
points = Jarvis.convexHull(points);
if (points == null)
{
return null;
}
// Convert to a polygon
Polygon p = new Polygon();
for (Point point : points)
{
p.addPoint(point.getX(), point.getY());
}
return p;
return Jarvis.convexHull(x2d, y2d);
}
@Inject

View File

@@ -24,7 +24,7 @@
*/
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import net.runelite.api.AnimationID;
import net.runelite.api.NPCDefinition;
import net.runelite.api.Perspective;
@@ -178,7 +178,7 @@ public abstract class RSNPCMixin implements RSNPC
@Inject
@Override
public Polygon getConvexHull()
public Shape getConvexHull()
{
RSModel model = getModel();
if (model == null)
@@ -192,6 +192,7 @@ public abstract class RSNPCMixin implements RSNPC
size * Perspective.LOCAL_HALF_TILE_SIZE - Perspective.LOCAL_HALF_TILE_SIZE + getY());
int tileHeight = Perspective.getTileHeight(client, tileHeightPoint, client.getPlane());
return model.getConvexHull(getX(), getY(), getOrientation(), tileHeight);
}
}

View File

@@ -25,8 +25,8 @@
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.List;
import net.runelite.api.HeadIcon;
import static net.runelite.api.HeadIcon.MAGIC;
import static net.runelite.api.HeadIcon.MELEE;
@@ -36,7 +36,6 @@ import static net.runelite.api.HeadIcon.RETRIBUTION;
import static net.runelite.api.HeadIcon.SMITE;
import net.runelite.api.Model;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.SkullIcon;
import static net.runelite.api.SkullIcon.DEAD_MAN_FIVE;
import static net.runelite.api.SkullIcon.DEAD_MAN_FOUR;
@@ -52,8 +51,6 @@ import net.runelite.api.mixins.MethodHook;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow;
import net.runelite.api.model.Triangle;
import net.runelite.api.model.Vertex;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSModel;
import net.runelite.rs.api.RSPlayer;
@@ -148,58 +145,42 @@ public abstract class RSPlayerMixin implements RSPlayer
return null;
}
int[] x2d = new int[model.getVerticesCount()];
int[] y2d = new int[model.getVerticesCount()];
int localX = getX();
int localY = getY();
int orientation = getOrientation();
final int tileHeight = Perspective.getTileHeight(client, new LocalPoint(localX, localY), client.getPlane());
List<Triangle> triangles = model.getTriangles();
Perspective.modelToCanvas(client, model.getVerticesCount(), localX, localY, tileHeight, getOrientation(), model.getVerticesX(), model.getVerticesZ(), model.getVerticesY(), x2d, y2d);
ArrayList polys = new ArrayList(model.getTrianglesCount());
triangles = rotate(triangles, orientation);
int[] trianglesX = model.getTrianglesX();
int[] trianglesY = model.getTrianglesY();
int[] trianglesZ = model.getTrianglesZ();
List<Polygon> polys = new ArrayList<Polygon>();
for (Triangle triangle : triangles)
for (int triangle = 0; triangle < model.getTrianglesCount(); ++triangle)
{
Vertex vx = triangle.getA();
Vertex vy = triangle.getB();
Vertex vz = triangle.getC();
System.err.println("vx: " + vx.getX() + " localX: " + localX);
Point x = Perspective.localToCanvas(client,
localX - vx.getX(),
localY - vx.getZ(),
tileHeight + vx.getY());
Point y = Perspective.localToCanvas(client,
localX - vy.getX(),
localY - vy.getZ(),
tileHeight + vy.getY());
Point z = Perspective.localToCanvas(client,
localX - vz.getX(),
localY - vz.getZ(),
tileHeight + vz.getY());
int[] xx =
{
x.getX(), y.getX(), z.getX()
x2d[trianglesX[triangle]], x2d[trianglesY[triangle]], x2d[trianglesZ[triangle]]
};
int[] yy =
{
x.getY(), y.getY(), z.getY()
y2d[trianglesX[triangle]], y2d[trianglesY[triangle]], y2d[trianglesZ[triangle]]
};
polys.add(new Polygon(xx, yy, 3));
}
return polys.toArray(new Polygon[polys.size()]);
return (Polygon[]) polys.toArray(new Polygon[0]);
}
@Inject
@Override
public Polygon getConvexHull()
public Shape getConvexHull()
{
RSModel model = getModel();
if (model == null)
@@ -208,29 +189,10 @@ public abstract class RSPlayerMixin implements RSPlayer
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX(), getY(), getOrientation(), tileHeight);
}
@Inject
private List<Triangle> rotate(List<Triangle> triangles, int orientation)
{
List<Triangle> rotatedTriangles = new ArrayList<Triangle>();
for (Triangle triangle : triangles)
{
Vertex a = triangle.getA();
Vertex b = triangle.getB();
Vertex c = triangle.getC();
Triangle rotatedTriangle = new Triangle(
a.rotate(orientation),
b.rotate(orientation),
c.rotate(orientation)
);
rotatedTriangles.add(rotatedTriangle);
}
return rotatedTriangles;
}
@Copy("getModel")
public abstract RSModel rs$getModel();

View File

@@ -1,11 +1,10 @@
package net.runelite.mixins;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.Area;
import net.runelite.api.Model;
import net.runelite.api.Perspective;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.geometry.Shapes;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
@@ -89,9 +88,8 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration
@Override
public Shape getClickbox()
{
Area clickbox = new Area();
LocalPoint lp = getLocalLocation();
Shape clickboxA = Perspective.getClickbox(client, getModel1(), 0,
new LocalPoint(lp.getX() + getXOffset(), lp.getY() + getYOffset()));
Shape clickboxB = Perspective.getClickbox(client, getModel2(), 0, lp);
@@ -101,6 +99,11 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration
return null;
}
if (clickboxA != null && clickboxB != null)
{
return new Shapes(new Shape[]{clickboxA, clickboxB});
}
if (clickboxA != null)
{
return clickboxA;
@@ -111,7 +114,7 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration
@Inject
@Override
public Polygon getConvexHull()
public Shape getConvexHull()
{
RSModel model = getModel1();
@@ -121,12 +124,13 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX() + getXOffset(), getY() + getYOffset(), 0, tileHeight);
}
@Inject
@Override
public Polygon getConvexHull2()
public Shape getConvexHull2()
{
RSModel model = getModel2();
@@ -136,6 +140,7 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration
}
int tileHeight = Perspective.getTileHeight(client, new LocalPoint(getX(), getY()), client.getPlane());
return model.getConvexHull(getX(), getY(), 0, tileHeight);
}
}