From d3630f1bbb702bb88d23145d723151c3be531e06 Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 10:34:37 +0000 Subject: [PATCH 1/7] refactor: remove junk param --- .../java/org/runejs/client/cache/media/AnimationSequence.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/runejs/client/cache/media/AnimationSequence.java b/src/main/java/org/runejs/client/cache/media/AnimationSequence.java index e05c04b8d..455f7991d 100644 --- a/src/main/java/org/runejs/client/cache/media/AnimationSequence.java +++ b/src/main/java/org/runejs/client/cache/media/AnimationSequence.java @@ -63,10 +63,8 @@ public static void loadTerrainBlock(CollisionMap[] collisions, int regionX_maybe } } - public static boolean method596(int arg0, int arg1, byte arg2, int arg3) { + public static boolean method596(int arg0, int arg1, byte junk, int arg3) { int i = 0x7fff & arg1 >> 14; - if(arg2 > -9) - method596(-4, -74, (byte) -44, -62); int i_14_ = Npc.currentScene.getArrangement(Player.worldLevel, arg0, arg3, arg1); if(i_14_ == -1) return false; From 28f6ca2c7f512a194a793dea07b412eb7e057b48 Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 11:20:45 +0000 Subject: [PATCH 2/7] refactor: create `ObjectInteractionOutboundMessage` --- .../ObjectInteractionOutboundMessage.java | 39 +++++++++++++++++++ .../runejs/client/net/OutgoingPackets.java | 2 + 2 files changed, 41 insertions(+) create mode 100644 src/main/java/org/runejs/client/message/outbound/interactions/ObjectInteractionOutboundMessage.java diff --git a/src/main/java/org/runejs/client/message/outbound/interactions/ObjectInteractionOutboundMessage.java b/src/main/java/org/runejs/client/message/outbound/interactions/ObjectInteractionOutboundMessage.java new file mode 100644 index 000000000..9447c234e --- /dev/null +++ b/src/main/java/org/runejs/client/message/outbound/interactions/ObjectInteractionOutboundMessage.java @@ -0,0 +1,39 @@ +package org.runejs.client.message.outbound.interactions; + +import org.runejs.client.message.OutboundMessage; + +/** + * Represents a message sent to the server when a player interacts with an object. + * + * e.g. clicking on a tree to chop it down + */ +public class ObjectInteractionOutboundMessage implements OutboundMessage { + /** + * Which option on the object was clicked + * + * i.e. 1 = first option, 2 = second option, etc. + */ + public final int option; + + /** + * The id of the object + */ + public final int objectId; + + /** + * The x coordinate of the object + */ + public final int x; + + /** + * The y coordinate of the object + */ + public final int y; + + public ObjectInteractionOutboundMessage(int option, int objectId, int x, int y) { + this.option = option; + this.objectId = objectId; + this.x = x; + this.y = y; + } +} diff --git a/src/main/java/org/runejs/client/net/OutgoingPackets.java b/src/main/java/org/runejs/client/net/OutgoingPackets.java index 786b3d72f..9a855f097 100644 --- a/src/main/java/org/runejs/client/net/OutgoingPackets.java +++ b/src/main/java/org/runejs/client/net/OutgoingPackets.java @@ -17,6 +17,8 @@ public static void init(ISAAC outCipher) { /** * Opens a fixed-size packet with the specified opcode. + * + * @param size The size of the packet in bytes, not including the opcode. */ public static PacketBuffer openFixedSizePacket(int size, int opcode) { // data + 1 byte for opcode From a97ffad9c6e023ffd675350299261dd9d350a746 Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 11:21:06 +0000 Subject: [PATCH 3/7] refactor: encode `ObjectInteractionOutboundMessage` option 1 (opcode `30`) --- .../media/gameInterface/GameInterface.java | 18 ++++++++--- .../codec/runejs435/RuneJS435PacketCodec.java | 3 ++ .../ObjectInteractionMessageEncoder.java | 30 +++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java diff --git a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java index 9b1547549..5bdb02f0b 100644 --- a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java +++ b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java @@ -17,7 +17,9 @@ import org.runejs.client.media.renderable.actor.Pathfinding; import org.runejs.client.media.renderable.actor.Player; import org.runejs.client.media.renderable.actor.PlayerAppearance; +import org.runejs.client.message.outbound.interactions.ObjectInteractionOutboundMessage; import org.runejs.client.net.ISAAC; +import org.runejs.client.net.OutgoingPackets; import org.runejs.client.net.PacketBuffer; import org.runejs.client.node.CachedNode; import org.runejs.client.scene.InteractiveObject; @@ -1242,10 +1244,18 @@ public static void processMenuActions(int arg0, int arg1) { } if(action == ActionRowType.INTERACT_WITH_OBJECT_OPTION_1.getId()) { AnimationSequence.method596(i, npcIdx, (byte) -47, i_10_); - SceneCluster.packetBuffer.putPacket(30); - SceneCluster.packetBuffer.putShortBE(0x7fff & npcIdx >> 14); - SceneCluster.packetBuffer.putShortBE(Class26.baseY + i_10_); - SceneCluster.packetBuffer.putShortLE(i + MovedStatics.baseX); + int objectId = 0x7fff & npcIdx >> 14; + int objectX = i + MovedStatics.baseX; + int objectY = i_10_ + Class26.baseY; + + OutgoingPackets.sendMessage( + new ObjectInteractionOutboundMessage( + 1, + objectId, + objectX, + objectY + ) + ); } if(action == ActionRowType.INTERACT_WITH_NPC_OPTION_5.getId()) { Npc class40_sub5_sub17_sub4_sub2 = Player.npcs[npcIdx]; diff --git a/src/main/java/org/runejs/client/net/codec/runejs435/RuneJS435PacketCodec.java b/src/main/java/org/runejs/client/net/codec/runejs435/RuneJS435PacketCodec.java index 5b36e1164..c8a57e7fd 100644 --- a/src/main/java/org/runejs/client/net/codec/runejs435/RuneJS435PacketCodec.java +++ b/src/main/java/org/runejs/client/net/codec/runejs435/RuneJS435PacketCodec.java @@ -1,7 +1,9 @@ package org.runejs.client.net.codec.runejs435; +import org.runejs.client.message.outbound.interactions.ObjectInteractionOutboundMessage; import org.runejs.client.net.PacketType; import org.runejs.client.net.codec.MessagePacketCodec; +import org.runejs.client.net.codec.runejs435.encoder.interactions.ObjectInteractionMessageEncoder; /** * A {@link MessagePacketCodec} for the RuneJS customised 435 protocol. @@ -15,6 +17,7 @@ public RuneJS435PacketCodec() { } private void registerEncoders() { + register(ObjectInteractionOutboundMessage.class, new ObjectInteractionMessageEncoder()); } private void registerDecoders() { diff --git a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java new file mode 100644 index 000000000..4985e303b --- /dev/null +++ b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java @@ -0,0 +1,30 @@ +package org.runejs.client.net.codec.runejs435.encoder.interactions; + +import org.runejs.client.message.outbound.interactions.ObjectInteractionOutboundMessage; +import org.runejs.client.net.OutgoingPackets; +import org.runejs.client.net.PacketBuffer; +import org.runejs.client.net.codec.MessageEncoder; + +public class ObjectInteractionMessageEncoder implements MessageEncoder { + + @Override + public PacketBuffer encode(ObjectInteractionOutboundMessage message) { + switch (message.option) { + case 1: + return encodeOption1Interaction(message); + default: + throw new RuntimeException("Invalid option: " + message.option); + } + } + + private PacketBuffer encodeOption1Interaction(ObjectInteractionOutboundMessage message) { + PacketBuffer buffer = OutgoingPackets.openFixedSizePacket(6, 30); + + buffer.putShortBE(message.objectId); + buffer.putShortBE(message.y); + buffer.putShortLE(message.x); + + return buffer; + } + +} From 6c8ca2444370bbf890ee4688d92344a454a23a36 Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 11:22:45 +0000 Subject: [PATCH 4/7] refactor: encode `ObjectInteractionOutboundMessage` option 2 (opcode `164`) --- .../media/gameInterface/GameInterface.java | 17 +++++++++++++---- .../ObjectInteractionMessageEncoder.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java index 5bdb02f0b..fd200b32d 100644 --- a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java +++ b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java @@ -869,10 +869,19 @@ public static void processMenuActions(int arg0, int arg1) { } if(action == ActionRowType.INTERACT_WITH_OBJECT_OPTION_2.getId()) { AnimationSequence.method596(i, npcIdx, (byte) -77, i_10_); - SceneCluster.packetBuffer.putPacket(164); - SceneCluster.packetBuffer.putShortLE(MovedStatics.baseX + i); - SceneCluster.packetBuffer.putShortLE(Class26.baseY + i_10_); - SceneCluster.packetBuffer.putShortLE(npcIdx >> 14 & 0x7fff); + + int objectX = i + MovedStatics.baseX; + int objectY = i_10_ + Class26.baseY; + int objectId = npcIdx >> 14 & 0x7fff; + + OutgoingPackets.sendMessage( + new ObjectInteractionOutboundMessage( + 2, + objectId, + objectX, + objectY + ) + ); } if(action == ActionRowType.USE_ITEM_ON_OBJECT.getId() && AnimationSequence.method596(i, npcIdx, (byte) -104, i_10_)) { SceneCluster.packetBuffer.putPacket(24); diff --git a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java index 4985e303b..865c3f488 100644 --- a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java +++ b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java @@ -12,6 +12,8 @@ public PacketBuffer encode(ObjectInteractionOutboundMessage message) { switch (message.option) { case 1: return encodeOption1Interaction(message); + case 2: + return encodeOption2Interaction(message); default: throw new RuntimeException("Invalid option: " + message.option); } @@ -26,5 +28,15 @@ private PacketBuffer encodeOption1Interaction(ObjectInteractionOutboundMessage m return buffer; } + + private PacketBuffer encodeOption2Interaction(ObjectInteractionOutboundMessage message) { + PacketBuffer buffer = OutgoingPackets.openFixedSizePacket(6, 164); + + buffer.putShortLE(message.x); + buffer.putShortLE(message.y); + buffer.putShortLE(message.objectId); + + return buffer; + } } From 1841518cf99889f6db31318807c0d7576e0c8930 Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 11:23:46 +0000 Subject: [PATCH 5/7] refactor: encode `ObjectInteractionOutboundMessage` option 3 (opcode `183`) --- .../media/gameInterface/GameInterface.java | 17 +++++++++++++---- .../ObjectInteractionMessageEncoder.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java index fd200b32d..725cc7c01 100644 --- a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java +++ b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java @@ -1092,10 +1092,19 @@ public static void processMenuActions(int arg0, int arg1) { } if(action == ActionRowType.INTERACT_WITH_OBJECT_OPTION_3.getId()) { AnimationSequence.method596(i, npcIdx, (byte) -104, i_10_); - SceneCluster.packetBuffer.putPacket(183); - SceneCluster.packetBuffer.putShortBE(i_10_ + Class26.baseY); - SceneCluster.packetBuffer.putShortBE(npcIdx >> 14 & 0x7fff); - SceneCluster.packetBuffer.putShortBE(i + MovedStatics.baseX); + + int objectY = i_10_ + Class26.baseY; + int objectId = npcIdx >> 14 & 0x7fff; + int objectX = i + MovedStatics.baseX; + + OutgoingPackets.sendMessage( + new ObjectInteractionOutboundMessage( + 3, + objectId, + objectX, + objectY + ) + ); } if(action == 50) { Class33.method406(i, npcIdx, i_10_); diff --git a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java index 865c3f488..270b48832 100644 --- a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java +++ b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java @@ -14,6 +14,8 @@ public PacketBuffer encode(ObjectInteractionOutboundMessage message) { return encodeOption1Interaction(message); case 2: return encodeOption2Interaction(message); + case 3: + return encodeOption3Interaction(message); default: throw new RuntimeException("Invalid option: " + message.option); } @@ -38,5 +40,15 @@ private PacketBuffer encodeOption2Interaction(ObjectInteractionOutboundMessage m return buffer; } + + private PacketBuffer encodeOption3Interaction(ObjectInteractionOutboundMessage message) { + PacketBuffer buffer = OutgoingPackets.openFixedSizePacket(6, 183); + + buffer.putShortBE(message.y); + buffer.putShortBE(message.objectId); + buffer.putShortBE(message.x); + + return buffer; + } } From bbf1ea616d31cdea90e45d41b5785e1623e39057 Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 11:26:04 +0000 Subject: [PATCH 6/7] refactor: encode `ObjectInteractionOutboundMessage` option 4 (opcode `229`) --- .../media/gameInterface/GameInterface.java | 17 +++++++++++++---- .../ObjectInteractionMessageEncoder.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java index 725cc7c01..a6c3833e0 100644 --- a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java +++ b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java @@ -584,10 +584,19 @@ public static void processMenuActions(int arg0, int arg1) { } if(action == ActionRowType.INTERACT_WITH_OBJECT_OPTION_4.getId()) { AnimationSequence.method596(i, npcIdx, (byte) -79, i_10_); - SceneCluster.packetBuffer.putPacket(229); - SceneCluster.packetBuffer.putShortLE(MovedStatics.baseX + i); - SceneCluster.packetBuffer.putShortLE((0x1ffffd20 & npcIdx) >> 14); - SceneCluster.packetBuffer.putShortLE(Class26.baseY + i_10_); + + int objectX = MovedStatics.baseX + i; + int objectId = (0x1ffffd20 & npcIdx) >> 14; + int objectY = Class26.baseY + i_10_; + + OutgoingPackets.sendMessage( + new ObjectInteractionOutboundMessage( + 4, + objectId, + objectX, + objectY + ) + ); } if(action == ActionRowType.CAST_MAGIC_ON_PLAYER.getId()) { Player class40_sub5_sub17_sub4_sub1 = Player.trackedPlayers[npcIdx]; diff --git a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java index 270b48832..6f99ac06d 100644 --- a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java +++ b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java @@ -16,6 +16,8 @@ public PacketBuffer encode(ObjectInteractionOutboundMessage message) { return encodeOption2Interaction(message); case 3: return encodeOption3Interaction(message); + case 4: + return encodeOption4Interaction(message); default: throw new RuntimeException("Invalid option: " + message.option); } @@ -50,5 +52,15 @@ private PacketBuffer encodeOption3Interaction(ObjectInteractionOutboundMessage m return buffer; } + + private PacketBuffer encodeOption4Interaction(ObjectInteractionOutboundMessage message) { + PacketBuffer buffer = OutgoingPackets.openFixedSizePacket(6, 229); + + buffer.putShortLE(message.x); + buffer.putShortLE(message.objectId); + buffer.putShortLE(message.y); + + return buffer; + } } From 7a685ee4549c129b3c9053f36582bcca879af30e Mon Sep 17 00:00:00 2001 From: James Monger Date: Sat, 25 Feb 2023 11:30:28 +0000 Subject: [PATCH 7/7] refactor: encode `ObjectInteractionOutboundMessage` option 5 (opcode `62`) --- .../media/gameInterface/GameInterface.java | 17 +++++++++++++---- .../ObjectInteractionMessageEncoder.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java index a6c3833e0..bf3e3f80f 100644 --- a/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java +++ b/src/main/java/org/runejs/client/cache/media/gameInterface/GameInterface.java @@ -844,10 +844,19 @@ public static void processMenuActions(int arg0, int arg1) { } if(action == ActionRowType.INTERACT_WITH_OBJECT_OPTION_5.getId()) { AnimationSequence.method596(i, npcIdx, (byte) -11, i_10_); - SceneCluster.packetBuffer.putPacket(62); - SceneCluster.packetBuffer.putShortBE((0x1fffd05d & npcIdx) >> 14); - SceneCluster.packetBuffer.putShortLE(i_10_ + Class26.baseY); - SceneCluster.packetBuffer.putShortLE(i + MovedStatics.baseX); + + int objectId = (0x1ffffd20 & npcIdx) >> 14; + int objectY = i_10_ + Class26.baseY; + int objectX = i + MovedStatics.baseX; + + OutgoingPackets.sendMessage( + new ObjectInteractionOutboundMessage( + 5, + objectId, + objectX, + objectY + ) + ); } if(action == ActionRowType.INTERACT_WITH_NPC_OPTION_2.getId()) { Npc class40_sub5_sub17_sub4_sub2 = Player.npcs[npcIdx]; diff --git a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java index 6f99ac06d..59e34a6c0 100644 --- a/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java +++ b/src/main/java/org/runejs/client/net/codec/runejs435/encoder/interactions/ObjectInteractionMessageEncoder.java @@ -18,6 +18,8 @@ public PacketBuffer encode(ObjectInteractionOutboundMessage message) { return encodeOption3Interaction(message); case 4: return encodeOption4Interaction(message); + case 5: + return encodeOption5Interaction(message); default: throw new RuntimeException("Invalid option: " + message.option); } @@ -62,5 +64,15 @@ private PacketBuffer encodeOption4Interaction(ObjectInteractionOutboundMessage m return buffer; } + + private PacketBuffer encodeOption5Interaction(ObjectInteractionOutboundMessage message) { + PacketBuffer buffer = OutgoingPackets.openFixedSizePacket(6, 62); + + buffer.putShortBE(message.objectId); + buffer.putShortLE(message.y); + buffer.putShortLE(message.x); + + return buffer; + } }