Merge branch 'master' into loot-tracker-update

This commit is contained in:
PKLite
2019-06-09 01:49:50 -04:00
4 changed files with 147 additions and 209 deletions

View File

@@ -103,4 +103,5 @@ public interface Model extends Renderable
int getExtremeZ(); int getExtremeZ();
int getXYZMag(); int getXYZMag();
boolean isClickable();
} }

View File

@@ -29,166 +29,106 @@ public abstract class ClickboxMixin implements RSClient
private static final int[] rl$modelViewportYs = new int[4700]; private static final int[] rl$modelViewportYs = new int[4700];
@Inject @Inject
public void checkClickbox(Model rlModel, int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int _x, int _y, int _z, long hash) public void checkClickbox(net.runelite.api.Model model, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, long l2)
{ {
RSModel model = (RSModel) rlModel; int n10;
boolean hasFlag = hash != 0L && (int) (hash >>> 16 & 1L) != 1; int n11;
boolean viewportContainsMouse = client.getViewportContainsMouse(); int n12;
int n13;
if (!hasFlag || !viewportContainsMouse || client.getOculusOrbState() != 0) int n14;
net.runelite.rs.api.RSModel rSModel = (net.runelite.rs.api.RSModel) model;
boolean bl2 = l2 != 0L && (int) (l2 >>> 16 & 1L) != 1;
boolean bl3 = client.getViewportContainsMouse();
if (!bl2)
{ {
return; return;
} }
if (!bl3)
boolean bb = boundingboxCheck(model, _x, _y, _z);
if (!bb)
{ {
return; return;
} }
boolean bl4 = this.boundingboxCheck(rSModel, n7, n8, n9);
if (Math.sqrt(_x * _x + _z * _z) > OBJECT_INTERACTION_FAR * Perspective.LOCAL_TILE_SIZE) if (!bl4)
{ {
return; return;
} }
if (rSModel.isClickable())
// only need a boundingbox check?
if (model.isSingleTile())
{ {
addHashAtMouse(hash); this.addHashAtMouse(l2);
return; return;
} }
int n15 = rSModel.getVerticesCount();
// otherwise we must check if the mouse is in a triangle int n16 = rSModel.getTrianglesCount();
final int vertexCount = model.getVerticesCount(); int[] arrn = rSModel.getVerticesX();
final int triangleCount = model.getTrianglesCount(); int[] arrn2 = rSModel.getVerticesY();
int[] arrn3 = rSModel.getVerticesZ();
final int[] vertexX = model.getVerticesX(); int[] arrn4 = rSModel.getTrianglesX();
final int[] vertexY = model.getVerticesY(); int[] arrn5 = rSModel.getTrianglesY();
final int[] vertexZ = model.getVerticesZ(); int[] arrn6 = rSModel.getTrianglesZ();
int[] arrn7 = rSModel.getFaceColors3();
final int[] triangleX = model.getTrianglesX(); int n17 = client.get3dZoom();
final int[] triangleY = model.getTrianglesY(); int n18 = client.getCenterX();
final int[] triangleZ = model.getTrianglesZ(); int n19 = client.getCenterY();
int n20 = 0;
final int[] color3 = model.getFaceColors3(); int n21 = 0;
if (n2 != 0)
final int zoom = client.get3dZoom();
final int centerX = client.getCenterX();
final int centerY = client.getCenterY();
int sin = 0;
int cos = 0;
if (orientation != 0)
{ {
sin = Perspective.SINE[orientation]; n20 = net.runelite.api.Perspective.SINE[n2];
cos = Perspective.COSINE[orientation]; n21 = net.runelite.api.Perspective.COSINE[n2];
} }
for (n14 = 0; n14 < n15; ++n14)
for (int i = 0; i < vertexCount; ++i)
{ {
int x = vertexX[i]; n11 = arrn[n14];
int y = vertexY[i]; n13 = arrn2[n14];
int z = vertexZ[i]; n12 = arrn3[n14];
if (n2 != 0)
int var42;
if (orientation != 0)
{ {
var42 = z * sin + x * cos >> 16; n10 = n12 * n20 + n11 * n21 >> 16;
z = z * cos - x * sin >> 16; n12 = n12 * n21 - n11 * n20 >> 16;
x = var42; n11 = n10;
} }
n10 = (n12 += n9) * n5 + n6 * (n11 += n7) >> 16;
x += _x; n12 = n6 * n12 - n11 * n5 >> 16;
y += _y; n11 = n10;
z += _z; n10 = n4 * (n13 += n8) - n12 * n3 >> 16;
if ((n12 = n13 * n3 + n4 * n12 >> 16) >= 50)
var42 = z * yawSin + yawCos * x >> 16;
z = yawCos * z - x * yawSin >> 16;
x = var42;
var42 = pitchCos * y - z * pitchSin >> 16;
z = y * pitchSin + pitchCos * z >> 16;
if (z >= 50)
{
rl$modelViewportYs[i] = x * zoom / z + centerX;
rl$modelViewportXs[i] = var42 * zoom / z + centerY;
}
else
{
rl$modelViewportYs[i] = -5000;
}
}
final int viewportMouseX = client.getViewportMouseX();
final int viewportMouseY = client.getViewportMouseY();
for (int i = 0; i < triangleCount; ++i)
{
if (color3[i] == -2)
{ {
rl$modelViewportYs[n14] = n11 * n17 / n12 + n18;
rl$modelViewportXs[n14] = n10 * n17 / n12 + n19;
continue; continue;
} }
rl$modelViewportYs[n14] = -5000;
final int vA = triangleX[i]; }
final int vB = triangleY[i]; n14 = client.getViewportMouseX();
final int vC = triangleZ[i]; n11 = client.getViewportMouseY();
n13 = 0;
int y1 = rl$modelViewportYs[vA]; while (n13 < n16)
int y2 = rl$modelViewportYs[vB]; {
int y3 = rl$modelViewportYs[vC]; if (arrn7[n13] != -2)
int x1 = rl$modelViewportXs[vA];
int x2 = rl$modelViewportXs[vB];
int x3 = rl$modelViewportXs[vC];
if (y1 == -5000 || y2 == -5000 || y3 == -5000)
{ {
continue; int n22;
} boolean bl5;
int n23;
final int radius = model.isSingleTile() ? 20 : 5; n12 = arrn4[n13];
n10 = arrn5[n13];
int var18 = radius + viewportMouseY; int n24 = arrn6[n13];
boolean var34; int n25 = rl$modelViewportYs[n12];
if (var18 < x1 && var18 < x2 && var18 < x3) int n26 = rl$modelViewportYs[n10];
{ int n27 = rl$modelViewportYs[n24];
var34 = false; int n28 = rl$modelViewportXs[n12];
} int n29 = rl$modelViewportXs[n10];
else int n30 = rl$modelViewportXs[n24];
{ if (n25 != -5000 && n26 != -5000 && n27 != -5000 && (bl5 = (n23 = (n22 = rSModel.isClickable() ? 20
var18 = viewportMouseY - radius; : 5) + n11) < n28 && n23 < n29 && n23 < n30 ? false
if (var18 > x1 && var18 > x2 && var18 > x3) : ((n23 = n11 - n22) > n28 && n23 > n29 && n23 > n30 ? false
: ((n23 = n22 + n14) < n25 && n23 < n26 && n23 < n27 ? false
: (n23 = n14 - n22) <= n25 || n23 <= n26 || n23 <= n27))))
{ {
var34 = false; this.addHashAtMouse(l2);
} return;
else
{
var18 = radius + viewportMouseX;
if (var18 < y1 && var18 < y2 && var18 < y3)
{
var34 = false;
}
else
{
var18 = viewportMouseX - radius;
if (var18 > y1 && var18 > y2 && var18 > y3)
{
var34 = false;
}
else
{
var34 = true;
}
}
} }
} }
++n13;
if (var34)
{
addHashAtMouse(hash);
break;
}
} }
} }
@@ -205,93 +145,77 @@ public abstract class ClickboxMixin implements RSClient
} }
@Inject @Inject
private boolean boundingboxCheck(Model model, int x, int y, int z) public boolean boundingboxCheck(net.runelite.api.Model model, int n2, int n3, int n4)
{ {
final int cameraPitch = client.getCameraPitch(); int n5 = client.getCameraPitch();
final int cameraYaw = client.getCameraYaw(); int n6 = client.getCameraYaw();
int n7 = net.runelite.api.Perspective.SINE[n5];
final int pitchSin = Perspective.SINE[cameraPitch]; int n8 = net.runelite.api.Perspective.COSINE[n5];
final int pitchCos = Perspective.COSINE[cameraPitch]; int n9 = net.runelite.api.Perspective.SINE[n6];
int n10 = net.runelite.api.Perspective.COSINE[n6];
final int yawSin = Perspective.SINE[cameraYaw]; int n11 = client.getCenterX();
final int yawCos = Perspective.COSINE[cameraYaw]; int n12 = client.getCenterY();
int n13 = client.getViewportMouseX();
final int centerX = client.getCenterX(); int n14 = client.getViewportMouseY();
final int centerY = client.getCenterY(); int n15 = client.get3dZoom();
int n16 = (n13 - n11) * 50 / n15;
final int viewportMouseX = client.getViewportMouseX(); int n17 = (n14 - n12) * 50 / n15;
final int viewportMouseY = client.getViewportMouseY(); int n18 = (n13 - n11) * 10000 / n15;
int n19 = (n14 - n12) * 10000 / n15;
final int Rasterizer3D_zoom = client.get3dZoom(); int n20 = rl$rot1(n17, 50, n8, n7);
int n21 = rl$rot2(n17, 50, n8, n7);
int var6 = (viewportMouseX - centerX) * CLICKBOX_CLOSE / Rasterizer3D_zoom; n17 = n20;
int var7 = (viewportMouseY - centerY) * CLICKBOX_CLOSE / Rasterizer3D_zoom; n20 = rl$rot1(n19, 10000, n8, n7);
int var8 = (viewportMouseX - centerX) * CLICKBOX_FAR / Rasterizer3D_zoom; int n22 = rl$rot2(n19, 10000, n8, n7);
int var9 = (viewportMouseY - centerY) * CLICKBOX_FAR / Rasterizer3D_zoom; n19 = n20;
int var10 = rl$rot1(var7, CLICKBOX_CLOSE, pitchCos, pitchSin); n20 = rl$rot3(n16, n21, n10, n9);
int var11 = rl$rot2(var7, CLICKBOX_CLOSE, pitchCos, pitchSin); n21 = rl$rot4(n16, n21, n10, n9);
var7 = var10; n16 = n20;
var10 = rl$rot1(var9, CLICKBOX_FAR, pitchCos, pitchSin); n20 = rl$rot3(n18, n22, n10, n9);
int var12 = rl$rot2(var9, CLICKBOX_FAR, pitchCos, pitchSin); n22 = rl$rot4(n18, n22, n10, n9);
var9 = var10; int n23 = (n20 - n16) / 2;
var10 = rl$rot3(var6, var11, yawCos, yawSin); int n24 = (n19 - n17) / 2;
var11 = rl$rot4(var6, var11, yawCos, yawSin); int n25 = (n22 - n21) / 2;
var6 = var10; int n26 = Math.abs(n23);
var10 = rl$rot3(var8, var12, yawCos, yawSin); int n27 = Math.abs(n24);
var12 = rl$rot4(var8, var12, yawCos, yawSin); int n28 = Math.abs(n25);
int field1720 = (var10 - var6) / 2; int n29 = n2 + model.getCenterX();
int field638 = (var9 - var7) / 2; int n30 = n3 + model.getCenterY();
int field1846 = (var12 - var11) / 2; int n31 = n4 + model.getCenterZ();
int field1722 = Math.abs(field1720); int n32 = model.getExtremeX();
int field601 = Math.abs(field638); int n33 = model.getExtremeY();
int field38 = Math.abs(field1846); int n34 = model.getExtremeZ();
int n35 = (n16 + n20) / 2;
int var38 = x + model.getCenterX(); int n36 = (n17 + n19) / 2;
int var39 = y + model.getCenterY(); int n37 = (n22 + n21) / 2;
int var40 = z + model.getCenterZ(); int n38 = n35 - n29;
int var41 = model.getExtremeX(); int n39 = n36 - n30;
int var42 = model.getExtremeY(); int n40 = n37 - n31;
int var43 = model.getExtremeZ(); if (Math.abs(n38) > n32 + n26)
int field1861 = (var6 + var10) / 2;
int field2317 = (var7 + var9) / 2;
int field528 = (var12 + var11) / 2;
int var44 = field1861 - var38;
int var45 = field2317 - var39;
int var46 = field528 - var40;
boolean passes;
if (Math.abs(var44) > var41 + field1722)
{ {
passes = false; return false;
} }
else if (Math.abs(var45) > var42 + field601) if (Math.abs(n39) > n33 + n27)
{ {
passes = false; return false;
} }
else if (Math.abs(var46) > var43 + field38) if (Math.abs(n40) > n34 + n28)
{ {
passes = false; return false;
} }
else if (Math.abs(var46 * field638 - var45 * field1846) > var42 * field38 + var43 * field601) if (Math.abs(n40 * n24 - n39 * n25) > n33 * n28 + n34 * n27)
{ {
passes = false; return false;
} }
else if (Math.abs(var44 * field1846 - var46 * field1720) > var43 * field1722 + var41 * field38) if (Math.abs(n38 * n25 - n40 * n23) > n34 * n26 + n32 * n28)
{ {
passes = false; return false;
} }
else if (Math.abs(var45 * field1720 - var44 * field638) > var42 * field1722 + var41 * field601) if (Math.abs(n39 * n23 - n38 * n24) <= n33 * n26 + n32 * n27)
{ {
passes = false; return true;
} }
else return false;
{
passes = true;
}
return passes;
} }
@Inject @Inject

View File

@@ -54,6 +54,10 @@ public abstract class RSModelMixin implements RSModel
@Inject @Inject
private int rl$sceneId; private int rl$sceneId;
@Inject
private boolean isClickable;
@Inject @Inject
private int rl$bufferOffset; private int rl$bufferOffset;
@@ -72,6 +76,11 @@ public abstract class RSModelMixin implements RSModel
rl$init((RSModel[]) models, length); rl$init((RSModel[]) models, length);
} }
@Inject
public boolean isClickable() {
return isClickable;
};
@MethodHook(value = "<init>", end = true) @MethodHook(value = "<init>", end = true)
@Inject @Inject
public void rl$init(RSModel[] models, int length) public void rl$init(RSModel[] models, int length)

View File

@@ -157,6 +157,10 @@ public interface RSModel extends RSEntity, Model
@Override @Override
int getXYZMag(); int getXYZMag();
@Import("__du_bx")
@Override
boolean isClickable();
void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, int intervalCount); void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, int intervalCount);
/** /**