From c57301c0d349eee321ba6b3725218d2b1189f37f Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sun, 16 Jan 2022 04:02:25 +0100 Subject: [PATCH] project: Mixins --- .../injectors/raw/CopyRuneLiteClasses.java | 5 +- .../runelite/mixins/RSClanSettingsMixin.java | 7 +- .../net/runelite/mixins/RSClientMixin.java | 49 ++++--- .../runelite/mixins/RSProjectileMixin.java | 15 +++ .../java/net/runelite/rs/api/RSActor.java | 8 ++ .../java/net/runelite/rs/api/RSClient.java | 7 + .../net/runelite/rs/api/RSProjectile.java | 9 +- .../runelite/rs/api/RSRuneLiteClanMember.java | 11 ++ runescape-client/src/main/java/Actor.java | 3 +- .../GrandExchangeOfferOwnWorldComparator.java | 2 +- runescape-client/src/main/java/NPC.java | 2 +- runescape-client/src/main/java/Player.java | 2 +- .../src/main/java/RuneLiteClanMember.java | 124 ++++++++++++++++++ runescape-client/src/main/java/class65.java | 2 +- 14 files changed, 214 insertions(+), 32 deletions(-) create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteClanMember.java create mode 100644 runescape-client/src/main/java/RuneLiteClanMember.java diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java index 9296d10b8f..f2b8bc85fd 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java @@ -35,11 +35,12 @@ import org.objectweb.asm.Opcodes; public class CopyRuneLiteClasses extends AbstractInjector { private static final List RUNELITE_OBJECTS = List.of( - "RuneLiteObject", + "RuneLiteClanMember", "RuneLiteIterableLinkDeque", "RuneLiteIterableNodeDeque", "RuneLiteIterableNodeHashTable", - "RuneLiteMenuEntry" + "RuneLiteMenuEntry", + "RuneLiteObject" ); public CopyRuneLiteClasses(InjectData inject) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClanSettingsMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClanSettingsMixin.java index d181dd7c91..f48bc9e341 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClanSettingsMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClanSettingsMixin.java @@ -47,13 +47,11 @@ public abstract class RSClanSettingsMixin implements RSClanSettings public List getMembers() { int memberCount = getMemberCount(); - String[] memberNames = getMemberNames(); - byte[] memberRanks = getMemberRanks(); List memberList = new ArrayList<>(memberCount); 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; @@ -65,7 +63,6 @@ public abstract class RSClanSettingsMixin implements RSClanSettings { name = name.replace(" ", "\u00A0").toLowerCase(); String[] memberNames = getMemberNames(); - byte[] memberRanks = getMemberRanks(); int[] sorted = getSortedMembers(); int i = 0; @@ -82,7 +79,7 @@ public abstract class RSClanSettingsMixin implements RSClanSettings } else if (compare == 0) { - // return new ClanMember(memberName, client.getClanRankFromRs(memberRanks[tag])); + return (ClanMember) client.runeliteClanMember(this, memberIndex); } else { diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 398ad47f69..ceadb07016 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -39,8 +39,10 @@ import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.runelite.api.Actor; import net.runelite.api.Animation; import net.runelite.api.ChatMessageType; +import net.runelite.api.Deque; import net.runelite.api.EnumComposition; import net.runelite.api.FriendContainer; import net.runelite.api.GameState; @@ -70,7 +72,6 @@ import net.runelite.api.Model; import net.runelite.api.NPC; import net.runelite.api.NPCComposition; import net.runelite.api.NameableContainer; -import net.runelite.api.Node; import net.runelite.api.NodeCache; import net.runelite.api.ObjectComposition; 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.RSPacketBuffer; 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.RSScene; import net.runelite.rs.api.RSScriptEvent; @@ -1046,34 +1049,36 @@ public abstract class RSClientMixin implements RSClient @Inject @Override - public List 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 projectiles = new ArrayList(); - RSNodeDeque projectileDeque = this.getProjectilesDeque(); - Node head = projectileDeque.getSentinel(); - - for (Node node = head.getNext(); node != head; node = node.getNext()) + int targetIndex = 0; + if (target instanceof NPC) { - 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 @Override - public List getGraphicsObjects() + public Deque getProjectiles() { - List graphicsObjects = new ArrayList(); - RSNodeDeque graphicsObjectDeque = this.getGraphicsObjectDeque(); - Node head = graphicsObjectDeque.getSentinel(); + return this.getProjectilesDeque(); + } - for (Node node = head.getNext(); node != head; node = node.getNext()) - { - graphicsObjects.add((GraphicsObject) node); - } - - return graphicsObjects; + @Inject + @Override + public Deque getGraphicsObjects() + { + return this.getGraphicsObjectDeque(); } @Inject @@ -1448,6 +1453,12 @@ public abstract class RSClientMixin implements RSClient } } + @Inject + public static RSRuneLiteClanMember runeLiteClanMember() + { + throw new NotImplementedException(); + } + @FieldHook("friendsChat") @Inject public static void clanMemberManagerChanged(int idx) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java index e33cea8d1f..a802784762 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java @@ -43,6 +43,12 @@ public abstract class RSProjectileMixin implements RSProjectile @Shadow("client") private static RSClient client; + @Inject + private int targetX; + + @Inject + private int targetY; + @Inject 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 * projectiles that target the ground, like AoE projectiles from @@ -104,6 +117,8 @@ public abstract class RSProjectileMixin implements RSProjectile @MethodHook("setDestination") 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 ProjectileMoved projectileMoved = new ProjectileMoved(); projectileMoved.setProjectile(this); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java b/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java index 925b3ae6c1..dfa62b8662 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java @@ -98,6 +98,14 @@ public interface RSActor extends RSRenderable, Actor @Override void setGraphic(int id); + @Import("spotAnimationHeight") + @Override + int getGraphicHeight(); + + @Import("spotAnimationHeight") + @Override + void setGraphicHeight(int id); + @Import("spotAnimationFrame") int getSpotAnimFrame(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 12a87220d3..1e662044d5 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -32,6 +32,7 @@ import net.runelite.api.Deque; import net.runelite.api.SpritePixels; import net.runelite.api.World; import net.runelite.api.clan.ClanRank; +import net.runelite.api.clan.ClanSettings; import net.runelite.api.widgets.Widget; import net.runelite.mapping.Construct; import net.runelite.mapping.Import; @@ -1562,4 +1563,10 @@ public interface RSClient extends RSGameEngine, Client @Construct 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); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java index 5f6283632c..d1c3f4aa72 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java @@ -62,12 +62,16 @@ public interface RSProjectile extends RSRenderable, Projectile @Import("cycleStart") @Override - int getStartMovementCycle(); + int getStartCycle(); @Import("cycleEnd") @Override int getEndCycle(); + @Import("cycleEnd") + @Override + void setEndCycle(int cycle); + @Import("slope") @Override int getSlope(); @@ -103,4 +107,7 @@ public interface RSProjectile extends RSRenderable, Projectile @Import("speedZ") @Override double getVelocityZ(); + + @Import("setDestination") + void setDestination(int targetX, int targetY, int targetZ, int cycle); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteClanMember.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteClanMember.java new file mode 100644 index 0000000000..1da0b11561 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteClanMember.java @@ -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(); +} diff --git a/runescape-client/src/main/java/Actor.java b/runescape-client/src/main/java/Actor.java index b007374c5e..3ca6f70d55 100644 --- a/runescape-client/src/main/java/Actor.java +++ b/runescape-client/src/main/java/Actor.java @@ -233,7 +233,8 @@ public abstract class Actor extends Renderable { @ObfuscatedGetter( intValue = -2034554825 ) - int field1131; + @Export("spotAnimationHeight") + int spotAnimationHeight; @ObfuscatedName("bo") @ObfuscatedGetter( intValue = -873586319 diff --git a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java index a6bc2953d1..86e4f4fe6e 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java @@ -358,7 +358,7 @@ public class GrandExchangeOfferOwnWorldComparator implements Comparator { if ((var5 & 2) != 0) { var15.spotAnimation = var1.method7403(); var6 = var1.method7412(); - var15.field1131 = var6 >> 16; + var15.spotAnimationHeight = var6 >> 16; var15.field1130 = (var6 & 65535) + Client.cycle; var15.spotAnimationFrame = 0; var15.spotAnimationFrameCycle = 0; diff --git a/runescape-client/src/main/java/NPC.java b/runescape-client/src/main/java/NPC.java index 54bc07a1b2..bc80ef444f 100644 --- a/runescape-client/src/main/java/NPC.java +++ b/runescape-client/src/main/java/NPC.java @@ -118,7 +118,7 @@ public final class NPC extends Actor { if (super.spotAnimation != -1 && super.spotAnimationFrame != -1) { Model var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); if (var4 != null) { - var4.offsetBy(0, -super.field1131, 0); + var4.offsetBy(0, -super.spotAnimationHeight, 0); Model[] var5 = new Model[]{var3, var4}; var3 = new Model(var5, 2); } diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index b0e15a332a..0da892fe7a 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -337,7 +337,7 @@ public final class Player extends Actor { if (!this.isUnanimated && super.spotAnimation != -1 && super.spotAnimationFrame != -1) { var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); if (var4 != null) { - var4.offsetBy(0, -super.field1131, 0); + var4.offsetBy(0, -super.spotAnimationHeight, 0); var5 = new Model[]{var3, var4}; var3 = new Model(var5, 2); } diff --git a/runescape-client/src/main/java/RuneLiteClanMember.java b/runescape-client/src/main/java/RuneLiteClanMember.java new file mode 100644 index 0000000000..6e4d758a3d --- /dev/null +++ b/runescape-client/src/main/java/RuneLiteClanMember.java @@ -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() + ")"; + } +} diff --git a/runescape-client/src/main/java/class65.java b/runescape-client/src/main/java/class65.java index 54b360adc0..9df06b3019 100644 --- a/runescape-client/src/main/java/class65.java +++ b/runescape-client/src/main/java/class65.java @@ -180,7 +180,7 @@ public class class65 { if ((var3 & 2048) != 0) { var2.spotAnimation = var0.method7499(); var5 = var0.method7412(); - var2.field1131 = var5 >> 16; + var2.spotAnimationHeight = var5 >> 16; var2.field1130 = (var5 & 65535) + Client.cycle; var2.spotAnimationFrame = 0; var2.spotAnimationFrameCycle = 0;