project: Mixins

This commit is contained in:
Owain van Brakel
2022-01-16 04:02:25 +01:00
parent c3fe9b5377
commit c57301c0d3
14 changed files with 214 additions and 32 deletions

View File

@@ -35,11 +35,12 @@ import org.objectweb.asm.Opcodes;
public class CopyRuneLiteClasses extends AbstractInjector public class CopyRuneLiteClasses extends AbstractInjector
{ {
private static final List<String> RUNELITE_OBJECTS = List.of( private static final List<String> RUNELITE_OBJECTS = List.of(
"RuneLiteObject", "RuneLiteClanMember",
"RuneLiteIterableLinkDeque", "RuneLiteIterableLinkDeque",
"RuneLiteIterableNodeDeque", "RuneLiteIterableNodeDeque",
"RuneLiteIterableNodeHashTable", "RuneLiteIterableNodeHashTable",
"RuneLiteMenuEntry" "RuneLiteMenuEntry",
"RuneLiteObject"
); );
public CopyRuneLiteClasses(InjectData inject) public CopyRuneLiteClasses(InjectData inject)

View File

@@ -47,13 +47,11 @@ public abstract class RSClanSettingsMixin implements RSClanSettings
public List<ClanMember> getMembers() public List<ClanMember> getMembers()
{ {
int memberCount = getMemberCount(); int memberCount = getMemberCount();
String[] memberNames = getMemberNames();
byte[] memberRanks = getMemberRanks();
List<ClanMember> memberList = new ArrayList<>(memberCount); List<ClanMember> memberList = new ArrayList<>(memberCount);
for (int i = 0; i < memberCount; i++) for (int i = 0; i < memberCount; i++)
{ {
// memberList.add(new ClanMember(memberNames[i], client.getClanRankFromRs(memberRanks[i]))); memberList.add((ClanMember) client.runeliteClanMember(this, i));
} }
return memberList; return memberList;
@@ -65,7 +63,6 @@ public abstract class RSClanSettingsMixin implements RSClanSettings
{ {
name = name.replace(" ", "\u00A0").toLowerCase(); name = name.replace(" ", "\u00A0").toLowerCase();
String[] memberNames = getMemberNames(); String[] memberNames = getMemberNames();
byte[] memberRanks = getMemberRanks();
int[] sorted = getSortedMembers(); int[] sorted = getSortedMembers();
int i = 0; int i = 0;
@@ -82,7 +79,7 @@ public abstract class RSClanSettingsMixin implements RSClanSettings
} }
else if (compare == 0) else if (compare == 0)
{ {
// return new ClanMember(memberName, client.getClanRankFromRs(memberRanks[tag])); return (ClanMember) client.runeliteClanMember(this, memberIndex);
} }
else else
{ {

View File

@@ -39,8 +39,10 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import net.runelite.api.Actor;
import net.runelite.api.Animation; import net.runelite.api.Animation;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.Deque;
import net.runelite.api.EnumComposition; import net.runelite.api.EnumComposition;
import net.runelite.api.FriendContainer; import net.runelite.api.FriendContainer;
import net.runelite.api.GameState; import net.runelite.api.GameState;
@@ -70,7 +72,6 @@ import net.runelite.api.Model;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.NPCComposition; import net.runelite.api.NPCComposition;
import net.runelite.api.NameableContainer; import net.runelite.api.NameableContainer;
import net.runelite.api.Node;
import net.runelite.api.NodeCache; import net.runelite.api.NodeCache;
import net.runelite.api.ObjectComposition; import net.runelite.api.ObjectComposition;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
@@ -158,6 +159,8 @@ import net.runelite.rs.api.RSNodeDeque;
import net.runelite.rs.api.RSNodeHashTable; import net.runelite.rs.api.RSNodeHashTable;
import net.runelite.rs.api.RSPacketBuffer; import net.runelite.rs.api.RSPacketBuffer;
import net.runelite.rs.api.RSPlayer; import net.runelite.rs.api.RSPlayer;
import net.runelite.rs.api.RSProjectile;
import net.runelite.rs.api.RSRuneLiteClanMember;
import net.runelite.rs.api.RSRuneLiteMenuEntry; import net.runelite.rs.api.RSRuneLiteMenuEntry;
import net.runelite.rs.api.RSScene; import net.runelite.rs.api.RSScene;
import net.runelite.rs.api.RSScriptEvent; import net.runelite.rs.api.RSScriptEvent;
@@ -1046,34 +1049,36 @@ public abstract class RSClientMixin implements RSClient
@Inject @Inject
@Override @Override
public List<Projectile> getProjectiles() public Projectile createProjectile(int id, int plane, int startX, int startY, int startZ, int startCycle, int endCycle, int slope, int startHeight, int endHeight, Actor target, int targetX, int targetY)
{ {
List<Projectile> projectiles = new ArrayList<Projectile>(); int targetIndex = 0;
RSNodeDeque projectileDeque = this.getProjectilesDeque(); if (target instanceof NPC)
Node head = projectileDeque.getSentinel();
for (Node node = head.getNext(); node != head; node = node.getNext())
{ {
projectiles.add((Projectile) node); targetIndex = ((NPC)target).getIndex() + 1;
}
else if (target instanceof Player)
{
targetIndex = -(((Player)target).getPlayerId() + 1);
} }
return projectiles; RSProjectile projectile = client.newProjectile(id, plane, startX, startY, startZ, startCycle, endCycle, slope, startHeight, targetIndex, endHeight);
projectile.setDestination(targetX, targetY, Perspective.getTileHeight(client, new LocalPoint(targetX, targetY), client.getPlane()), startCycle + client.getGameCycle());
return projectile;
} }
@Inject @Inject
@Override @Override
public List<GraphicsObject> getGraphicsObjects() public Deque<Projectile> getProjectiles()
{ {
List<GraphicsObject> graphicsObjects = new ArrayList<GraphicsObject>(); return this.getProjectilesDeque();
RSNodeDeque graphicsObjectDeque = this.getGraphicsObjectDeque();
Node head = graphicsObjectDeque.getSentinel();
for (Node node = head.getNext(); node != head; node = node.getNext())
{
graphicsObjects.add((GraphicsObject) node);
} }
return graphicsObjects; @Inject
@Override
public Deque<GraphicsObject> getGraphicsObjects()
{
return this.getGraphicsObjectDeque();
} }
@Inject @Inject
@@ -1448,6 +1453,12 @@ public abstract class RSClientMixin implements RSClient
} }
} }
@Inject
public static RSRuneLiteClanMember runeLiteClanMember()
{
throw new NotImplementedException();
}
@FieldHook("friendsChat") @FieldHook("friendsChat")
@Inject @Inject
public static void clanMemberManagerChanged(int idx) public static void clanMemberManagerChanged(int idx)

View File

@@ -43,6 +43,12 @@ public abstract class RSProjectileMixin implements RSProjectile
@Shadow("client") @Shadow("client")
private static RSClient client; private static RSClient client;
@Inject
private int targetX;
@Inject
private int targetY;
@Inject @Inject
RSProjectileMixin() RSProjectileMixin()
{ {
@@ -90,6 +96,13 @@ public abstract class RSProjectileMixin implements RSProjectile
} }
} }
@Inject
@Override
public LocalPoint getTarget()
{
return new LocalPoint(this.targetX, this.targetY);
}
/** /**
* Called when a projectile is set to move towards a point. For * Called when a projectile is set to move towards a point. For
* projectiles that target the ground, like AoE projectiles from * projectiles that target the ground, like AoE projectiles from
@@ -104,6 +117,8 @@ public abstract class RSProjectileMixin implements RSProjectile
@MethodHook("setDestination") @MethodHook("setDestination")
public void projectileMoved(int targetX, int targetY, int targetZ, int cycle) public void projectileMoved(int targetX, int targetY, int targetZ, int cycle)
{ {
this.targetX = targetX;
this.targetY = targetY;
final LocalPoint position = new LocalPoint(targetX, targetY); final LocalPoint position = new LocalPoint(targetX, targetY);
final ProjectileMoved projectileMoved = new ProjectileMoved(); final ProjectileMoved projectileMoved = new ProjectileMoved();
projectileMoved.setProjectile(this); projectileMoved.setProjectile(this);

View File

@@ -98,6 +98,14 @@ public interface RSActor extends RSRenderable, Actor
@Override @Override
void setGraphic(int id); void setGraphic(int id);
@Import("spotAnimationHeight")
@Override
int getGraphicHeight();
@Import("spotAnimationHeight")
@Override
void setGraphicHeight(int id);
@Import("spotAnimationFrame") @Import("spotAnimationFrame")
int getSpotAnimFrame(); int getSpotAnimFrame();

View File

@@ -32,6 +32,7 @@ import net.runelite.api.Deque;
import net.runelite.api.SpritePixels; import net.runelite.api.SpritePixels;
import net.runelite.api.World; import net.runelite.api.World;
import net.runelite.api.clan.ClanRank; import net.runelite.api.clan.ClanRank;
import net.runelite.api.clan.ClanSettings;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.mapping.Construct; import net.runelite.mapping.Construct;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
@@ -1562,4 +1563,10 @@ public interface RSClient extends RSGameEngine, Client
@Construct @Construct
RSIterableNodeHashTable createIterableNodeHashTable(int size); RSIterableNodeHashTable createIterableNodeHashTable(int size);
@Construct
RSRuneLiteClanMember runeliteClanMember(ClanSettings var1, int var2);
@Construct
RSProjectile newProjectile(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11);
} }

View File

@@ -62,12 +62,16 @@ public interface RSProjectile extends RSRenderable, Projectile
@Import("cycleStart") @Import("cycleStart")
@Override @Override
int getStartMovementCycle(); int getStartCycle();
@Import("cycleEnd") @Import("cycleEnd")
@Override @Override
int getEndCycle(); int getEndCycle();
@Import("cycleEnd")
@Override
void setEndCycle(int cycle);
@Import("slope") @Import("slope")
@Override @Override
int getSlope(); int getSlope();
@@ -103,4 +107,7 @@ public interface RSProjectile extends RSRenderable, Projectile
@Import("speedZ") @Import("speedZ")
@Override @Override
double getVelocityZ(); double getVelocityZ();
@Import("setDestination")
void setDestination(int targetX, int targetY, int targetZ, int cycle);
} }

View File

@@ -0,0 +1,11 @@
package net.runelite.rs.api;
import net.runelite.api.MenuEntry;
import net.runelite.api.clan.ClanRank;
public interface RSRuneLiteClanMember extends MenuEntry
{
ClanRank getRank();
String getName();
}

View File

@@ -233,7 +233,8 @@ public abstract class Actor extends Renderable {
@ObfuscatedGetter( @ObfuscatedGetter(
intValue = -2034554825 intValue = -2034554825
) )
int field1131; @Export("spotAnimationHeight")
int spotAnimationHeight;
@ObfuscatedName("bo") @ObfuscatedName("bo")
@ObfuscatedGetter( @ObfuscatedGetter(
intValue = -873586319 intValue = -873586319

View File

@@ -358,7 +358,7 @@ public class GrandExchangeOfferOwnWorldComparator implements Comparator {
if ((var5 & 2) != 0) { if ((var5 & 2) != 0) {
var15.spotAnimation = var1.method7403(); var15.spotAnimation = var1.method7403();
var6 = var1.method7412(); var6 = var1.method7412();
var15.field1131 = var6 >> 16; var15.spotAnimationHeight = var6 >> 16;
var15.field1130 = (var6 & 65535) + Client.cycle; var15.field1130 = (var6 & 65535) + Client.cycle;
var15.spotAnimationFrame = 0; var15.spotAnimationFrame = 0;
var15.spotAnimationFrameCycle = 0; var15.spotAnimationFrameCycle = 0;

View File

@@ -118,7 +118,7 @@ public final class NPC extends Actor {
if (super.spotAnimation != -1 && super.spotAnimationFrame != -1) { if (super.spotAnimation != -1 && super.spotAnimationFrame != -1) {
Model var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); Model var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame);
if (var4 != null) { if (var4 != null) {
var4.offsetBy(0, -super.field1131, 0); var4.offsetBy(0, -super.spotAnimationHeight, 0);
Model[] var5 = new Model[]{var3, var4}; Model[] var5 = new Model[]{var3, var4};
var3 = new Model(var5, 2); var3 = new Model(var5, 2);
} }

View File

@@ -337,7 +337,7 @@ public final class Player extends Actor {
if (!this.isUnanimated && super.spotAnimation != -1 && super.spotAnimationFrame != -1) { if (!this.isUnanimated && super.spotAnimation != -1 && super.spotAnimationFrame != -1) {
var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame);
if (var4 != null) { if (var4 != null) {
var4.offsetBy(0, -super.field1131, 0); var4.offsetBy(0, -super.spotAnimationHeight, 0);
var5 = new Model[]{var3, var4}; var5 = new Model[]{var3, var4};
var3 = new Model(var5, 2); var3 = new Model(var5, 2);
} }

View File

@@ -0,0 +1,124 @@
import net.runelite.api.clan.ClanMember;
import net.runelite.api.clan.ClanRank;
public class RuneLiteClanMember implements ClanMember
{
public final int idx;
public final ClanSettings clanSettings;
public RuneLiteClanMember(ClanSettings clanSettings, int idx) {
this.clanSettings = clanSettings;
this.idx = idx;
}
public ClanRank getRank() {
return getClanRank(this.clanSettings.memberRanks[this.idx]);
}
public String getName() {
return this.clanSettings.memberNames[this.idx];
}
public ClanRank getClanRank(int rank)
{
switch (rank)
{
case -1:
return ClanRank.GUEST;
case 10:
return ClanRank.CLAN_RANK_2;
case 20:
return ClanRank.CLAN_RANK_3;
case 30:
return ClanRank.CLAN_RANK_4;
case 40:
return ClanRank.CLAN_RANK_5;
case 50:
return ClanRank.CLAN_RANK_6;
case 60:
return ClanRank.CLAN_RANK_7;
case 70:
return ClanRank.CLAN_RANK_8;
case 80:
return ClanRank.CLAN_RANK_9;
case 90:
return ClanRank.CLAN_RANK_10;
case 100:
return ClanRank.ADMINISTRATOR;
case 105:
return ClanRank.CLAN_RANK_11;
case 110:
return ClanRank.CLAN_RANK_12;
case 115:
return ClanRank.CLAN_RANK_13;
case 120:
return ClanRank.CLAN_RANK_14;
case 125:
return ClanRank.DEPUTY_OWNER;
case 126:
return ClanRank.OWNER;
case 127:
return ClanRank.JMOD;
default:
return ClanRank.CLAN_RANK_1;
}
}
public boolean instanceOf(Object o) {
return o instanceof RuneLiteClanMember;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof RuneLiteClanMember)) {
return false;
} else {
RuneLiteClanMember clanMember = (RuneLiteClanMember)o;
if (!clanMember.instanceOf(this)) {
return false;
} else {
String thisName = this.getName();
String objName = clanMember.getName();
if (thisName == null) {
if (objName != null) {
return false;
}
} else if (!thisName.equals(objName)) {
return false;
}
ClanRank thisRank = this.getRank();
ClanRank objRank = clanMember.getRank();
if (thisRank == null) {
if (objRank != null) {
return false;
}
} else if (!thisRank.equals(objRank)) {
return false;
}
return true;
}
}
}
@Override
public int hashCode() {
byte b = 1;
String name = this.getName();
int hash = b * 59 + (name == null ? 43 : name.hashCode());
ClanRank rank = this.getRank();
hash = hash * 59 + (rank == null ? 43 : rank.hashCode());
return hash;
}
public String toString() {
return "ClanMemberImpl(getName=" + this.getName() + ", getRank=" + this.getRank() + ")";
}
}

View File

@@ -180,7 +180,7 @@ public class class65 {
if ((var3 & 2048) != 0) { if ((var3 & 2048) != 0) {
var2.spotAnimation = var0.method7499(); var2.spotAnimation = var0.method7499();
var5 = var0.method7412(); var5 = var0.method7412();
var2.field1131 = var5 >> 16; var2.spotAnimationHeight = var5 >> 16;
var2.field1130 = (var5 & 65535) + Client.cycle; var2.field1130 = (var5 & 65535) + Client.cycle;
var2.spotAnimationFrame = 0; var2.spotAnimationFrame = 0;
var2.spotAnimationFrameCycle = 0; var2.spotAnimationFrameCycle = 0;