From e85fc0e7d0e14b2b78397f0df6f32f7c4e1dc440 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 10 Jul 2019 23:32:24 +0200 Subject: [PATCH] client: Add Widget Animation Smoothing --- .../main/java/net/runelite/api/Client.java | 14 + .../AnimationSmoothingConfig.java | 10 + .../AnimationSmoothingPlugin.java | 2 + .../net/runelite/mixins/RSClientMixin.java | 17 + .../mixins/RSSequenceDefinitionMixin.java | 384 +++++++++++------- .../net/runelite/mixins/RSWidgetMixin.java | 18 + .../runelite/rs/api/RSSequenceDefinition.java | 3 + .../java/net/runelite/rs/api/RSWidget.java | 6 + .../src/main/java/NPCDefinition.java | 6 +- .../src/main/java/ObjectDefinition.java | 2 +- .../src/main/java/PlayerAppearance.java | 6 +- .../src/main/java/SequenceDefinition.java | 36 +- .../main/java/SpotAnimationDefinition.java | 2 +- runescape-client/src/main/java/Widget.java | 6 +- 14 files changed, 325 insertions(+), 187 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index ab4ee7f15b..3eaadba176 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1353,6 +1353,20 @@ public interface Client extends GameShell */ void setInterpolateObjectAnimations(boolean interpolate); + /** + * Checks whether animation smoothing is enabled for widgets. + * + * @return true if widget animation smoothing is enabled, false otherwise + */ + boolean isInterpolateWidgetAnimations(); + + /** + * Sets the animation smoothing state for widgets. + * + * @param interpolate the new smoothing state + */ + void setInterpolateWidgetAnimations(boolean interpolate); + /** * Checks whether the logged in player is in an instanced region. * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java index 9260e9ef56..05dadb450a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingConfig.java @@ -65,4 +65,14 @@ public interface AnimationSmoothingConfig extends Config return true; } + @ConfigItem( + keyName = "smoothWidgetAnimations", + name = "Smooth Widget Animations", + description = "Configures whether the widget animations are smooth or not", + position = 4 + ) + default boolean smoothWidgetAnimations() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java index 6a23856217..7c77990a26 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/animsmoothing/AnimationSmoothingPlugin.java @@ -69,6 +69,7 @@ public class AnimationSmoothingPlugin extends Plugin client.setInterpolatePlayerAnimations(false); client.setInterpolateNpcAnimations(false); client.setInterpolateObjectAnimations(false); + client.setInterpolateWidgetAnimations(false); } @Subscribe @@ -85,5 +86,6 @@ public class AnimationSmoothingPlugin extends Plugin client.setInterpolatePlayerAnimations(config.smoothPlayerAnimations()); client.setInterpolateNpcAnimations(config.smoothNpcAnimations()); client.setInterpolateObjectAnimations(config.smoothObjectAnimations()); + client.setInterpolateWidgetAnimations(config.smoothWidgetAnimations()); } } 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 43d8582787..cca4cae90d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -163,6 +163,9 @@ public abstract class RSClientMixin implements RSClient @Inject private static boolean interpolateObjectAnimations; + @Inject + private static boolean interpolateWidgetAnimations; + @Inject private static RSPlayer[] oldPlayers = new RSPlayer[2048]; @@ -307,6 +310,20 @@ public abstract class RSClientMixin implements RSClient interpolateObjectAnimations = interpolate; } + @Inject + @Override + public boolean isInterpolateWidgetAnimations() + { + return interpolateWidgetAnimations; + } + + @Inject + @Override + public void setInterpolateWidgetAnimations(boolean interpolate) + { + interpolateWidgetAnimations = interpolate; + } + @Inject @Override public void setInventoryDragDelay(int delay) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java index 2433ed1d2b..4bf1ab4538 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSequenceDefinitionMixin.java @@ -15,10 +15,10 @@ public abstract class RSSequenceDefinitionMixin implements RSSequenceDefinition @Shadow("client") private static RSClient client; - @Copy("animateSequence2") + @Copy("applyTransformations") public abstract RSModel rs$applyTransformations(RSModel model, int actionFrame, RSSequenceDefinition poseSeq, int poseFrame); - @Replace("animateSequence2") + @Replace("applyTransformations") public RSModel rl$applyTransformations(RSModel model, int actionFrame, RSSequenceDefinition poseSeq, int poseFrame) { // reset frame ids because we're not interpolating this @@ -35,185 +35,253 @@ public abstract class RSSequenceDefinitionMixin implements RSSequenceDefinition return rs$applyTransformations(model, actionFrame, poseSeq, poseFrame); } - @Copy("animateSequence") + @Copy("transformActorModel") public abstract RSModel rs$transformActorModel(RSModel model, int frameIdx); - @Replace("animateSequence") + @Replace("transformActorModel") public RSModel rl$transformActorModel(RSModel model, int frame) { - // check if the frame has been modified - if (frame < 0) - { - // remove flag to check if the frame has been modified - int packed = frame ^ Integer.MIN_VALUE; - int interval = packed >> 16; - frame = packed & 0xFFFF; - int nextFrame = frame + 1; - if (nextFrame >= getFrameIDs().length) - { - // dont interpolate last frame - nextFrame = -1; - } - int[] frameIds = getFrameIDs(); - int frameId = frameIds[frame]; - RSFrames frames = client.getFrames(frameId >> 16); - int frameIdx = frameId & 0xFFFF; - - int nextFrameIdx = -1; - RSFrames nextFrames = null; - if (nextFrame != -1) - { - int nextFrameId = frameIds[nextFrame]; - nextFrames = client.getFrames(nextFrameId >> 16); - nextFrameIdx = nextFrameId & 0xFFFF; - } - - if (frames == null) - { - // not sure what toSharedModel does but it is needed - return model.toSharedModel(true); - } - else - { - RSModel animatedModel = model.toSharedModel(!frames.getFrames()[frameIdx].isShowing()); - animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, - getFrameLenths()[frame]); - return animatedModel; - } - } - else + // check if the frame has not been modified + if (frame >= 0) { return rs$transformActorModel(model, frame); } + + // remove flag to check if the frame has been modified + int packed = frame ^ Integer.MIN_VALUE; + int interval = packed >> 16; + frame = packed & 0xFFFF; + int nextFrame = frame + 1; + if (nextFrame >= getFrameIDs().length) + { + // dont interpolate last frame + nextFrame = -1; + } + int[] frameIds = getFrameIDs(); + int frameId = frameIds[frame]; + RSFrames frames = client.getFrames(frameId >> 16); + int frameIdx = frameId & 0xFFFF; + + int nextFrameIdx = -1; + RSFrames nextFrames = null; + if (nextFrame != -1) + { + int nextFrameId = frameIds[nextFrame]; + nextFrames = client.getFrames(nextFrameId >> 16); + nextFrameIdx = nextFrameId & 0xFFFF; + } + + if (frames == null) + { + // not sure what toSharedModel does but it is needed + return model.toSharedModel(true); + } + + RSModel animatedModel = model.toSharedModel(!frames.getFrames()[frameIdx].isShowing()); + animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, + getFrameLenths()[frame]); + return animatedModel; } - @Copy("animateObject") + @Copy("transformObjectModel") public abstract RSModel rs$transformObjectModel(RSModel model, int frame, int rotation); - @Replace("animateObject") + @Replace("transformObjectModel") public RSModel rl$transformObjectModel(RSModel model, int frame, int rotation) { - // check if the frame has been modified - if (frame < 0) - { - // remove flag to check if the frame has been modified - int packed = frame ^ Integer.MIN_VALUE; - int interval = packed >> 16; - frame = packed & 0xFFFF; - - int nextFrame = frame + 1; - if (nextFrame >= getFrameIDs().length) - { - // dont interpolate last frame - nextFrame = -1; - } - int[] frameIds = getFrameIDs(); - int frameId = frameIds[frame]; - RSFrames frames = client.getFrames(frameId >> 16); - int frameIdx = frameId & 0xFFFF; - - int nextFrameIdx = -1; - RSFrames nextFrames = null; - if (nextFrame != -1) - { - int nextFrameId = frameIds[nextFrame]; - nextFrames = client.getFrames(nextFrameId >> 16); - nextFrameIdx = nextFrameId & 0xFFFF; - } - - if (frames == null) - { - return model.toSharedModel(true); - } - else - { - RSModel animatedModel = model.toSharedModel(!frames.getFrames()[frameIdx].isShowing()); - // reset rotation before animating - rotation &= 3; - if (rotation == 1) - { - animatedModel.rotateY270Ccw(); - } - else if (rotation == 2) - { - animatedModel.rotateY180Ccw(); - } - else if (rotation == 3) - { - animatedModel.rotateY90Ccw(); - } - animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, - getFrameLenths()[frame]); - // reapply rotation after animating - if (rotation == 1) - { - animatedModel.rotateY90Ccw(); - } - else if (rotation == 2) - { - animatedModel.rotateY180Ccw(); - } - else if (rotation == 3) - { - animatedModel.rotateY270Ccw(); - } - return animatedModel; - } - } - else + // check if the frame has not been modified + if (frame >= 0) { return rs$transformObjectModel(model, frame, rotation); } + + // remove flag to check if the frame has been modified + int packed = frame ^ Integer.MIN_VALUE; + int interval = packed >> 16; + frame = packed & 0xFFFF; + + int nextFrame = frame + 1; + if (nextFrame >= getFrameIDs().length) + { + // dont interpolate last frame + nextFrame = -1; + } + int[] frameIds = getFrameIDs(); + int frameId = frameIds[frame]; + RSFrames frames = client.getFrames(frameId >> 16); + int frameIdx = frameId & 0xFFFF; + + int nextFrameIdx = -1; + RSFrames nextFrames = null; + if (nextFrame != -1) + { + int nextFrameId = frameIds[nextFrame]; + nextFrames = client.getFrames(nextFrameId >> 16); + nextFrameIdx = nextFrameId & 0xFFFF; + } + + if (frames == null) + { + return model.toSharedModel(true); + } + + RSModel animatedModel = model.toSharedModel(!frames.getFrames()[frameIdx].isShowing()); + // reset rotation before animating + rotation &= 3; + if (rotation == 1) + { + animatedModel.rotateY270Ccw(); + } + else if (rotation == 2) + { + animatedModel.rotateY180Ccw(); + } + else if (rotation == 3) + { + animatedModel.rotateY90Ccw(); + } + animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, + getFrameLenths()[frame]); + // reapply rotation after animating + if (rotation == 1) + { + animatedModel.rotateY90Ccw(); + } + else if (rotation == 2) + { + animatedModel.rotateY180Ccw(); + } + else if (rotation == 3) + { + animatedModel.rotateY270Ccw(); + } + return animatedModel; } - @Copy("animateSpotAnimation") - public abstract RSModel rs$transformSpotAnimModel(RSModel model, int frame); + @Copy("transformSpotAnimationModel") + public abstract RSModel rs$transformSpotAnimationModel(RSModel model, int frame); - @Replace("animateSpotAnimation") - public RSModel rl$transformSpotAnimModel(RSModel model, int frame) + @Replace("transformSpotAnimationModel") + public RSModel rl$transformSpotAnimationModel(RSModel model, int frame) { - // check if the frame has been modified - if (frame < 0) + // check if the frame has not been modified + if (frame >= 0) { - // remove flag to check if the frame has been modified - int packed = frame ^ Integer.MIN_VALUE; - int interval = packed >> 16; - frame = packed & 0xFFFF; - int nextFrame = frame + 1; - if (nextFrame >= getFrameIDs().length) - { - // dont interpolate last frame - nextFrame = -1; - } - int[] frameIds = getFrameIDs(); - int frameId = frameIds[frame]; - RSFrames frames = client.getFrames(frameId >> 16); - int frameIdx = frameId & 0xFFFF; - - int nextFrameIdx = -1; - RSFrames nextFrames = null; - if (nextFrame != -1) - { - int nextFrameId = frameIds[nextFrame]; - nextFrames = client.getFrames(nextFrameId >> 16); - nextFrameIdx = nextFrameId & 0xFFFF; - } - - if (frames == null) - { - return model.toSharedSpotAnimModel(true); - } - else - { - RSModel animatedModel = model.toSharedSpotAnimModel(!frames.getFrames()[frameIdx].isShowing()); - animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, - getFrameLenths()[frame]); - return animatedModel; - } + return rs$transformSpotAnimationModel(model, frame); } - else + + // remove flag to check if the frame has been modified + int packed = frame ^ Integer.MIN_VALUE; + int interval = packed >> 16; + frame = packed & 0xFFFF; + int nextFrame = frame + 1; + if (nextFrame >= getFrameIDs().length) { - return rs$transformSpotAnimModel(model, frame); + // dont interpolate last frame + nextFrame = -1; } + int[] frameIds = getFrameIDs(); + int frameId = frameIds[frame]; + RSFrames frames = client.getFrames(frameId >> 16); + int frameIdx = frameId & 0xFFFF; + + int nextFrameIdx = -1; + RSFrames nextFrames = null; + if (nextFrame != -1) + { + int nextFrameId = frameIds[nextFrame]; + nextFrames = client.getFrames(nextFrameId >> 16); + nextFrameIdx = nextFrameId & 0xFFFF; + } + + if (frames == null) + { + return model.toSharedSpotAnimModel(true); + } + + RSModel animatedModel = model.toSharedSpotAnimModel(!frames.getFrames()[frameIdx].isShowing()); + animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, + getFrameLenths()[frame]); + return animatedModel; + } + + @Copy("transformWidgetModel") + public abstract RSModel rs$transformWidgetModel(RSModel model, int frame); + + @Replace("transformWidgetModel") + public RSModel rl$transformWidgetModel(RSModel model, int frame) + { + // check if the frame has not been modified + if (frame >= 0) + { + return rs$transformWidgetModel(model, frame); + } + + // remove flag to check if the frame has been modified + int packed = frame ^ Integer.MIN_VALUE; + int interval = packed >> 16; + frame = packed & 0xFFFF; + + int nextFrame = frame + 1; + if (nextFrame >= getFrameIDs().length) + { + // dont interpolate last frame + nextFrame = -1; + } + int[] frameIds = getFrameIDs(); + int frameId = frameIds[frame]; + RSFrames frames = client.getFrames(frameId >> 16); + int frameIdx = frameId & 0xFFFF; + + int nextFrameIdx = -1; + RSFrames nextFrames = null; + if (nextFrame != -1) + { + int nextFrameId = frameIds[nextFrame]; + nextFrames = client.getFrames(nextFrameId >> 16); + nextFrameIdx = nextFrameId & 0xFFFF; + } + + if (frames == null) + { + return model.toSharedModel(true); + } + + RSFrames chatFrames = null; + int chatFrameIdx = 0; + if (getChatFrameIds() != null && frame < getChatFrameIds().length) + { + int chatFrameId = getChatFrameIds()[frame]; + chatFrames = client.getFrames(chatFrameId >> 16); + chatFrameIdx = chatFrameId & 0xFFFF; + } + if (chatFrames != null && chatFrameIdx != 0xFFFF) + { + RSFrames nextChatFrames = null; + int nextChatFrameIdx = -1; + if (nextFrame != -1 && nextFrame < getChatFrameIds().length) + { + int chatFrameId = getChatFrameIds()[nextFrame]; + nextChatFrames = client.getFrames(chatFrameId >> 16); + nextChatFrameIdx = chatFrameId & 0xFFFF; + } + // not sure if this can even happen but the client checks for this so to be safe + if (nextChatFrameIdx == 0xFFFF) + { + nextChatFrames = null; + } + RSModel animatedModel = model.toSharedModel(!frames.getFrames()[frameIdx].isShowing() + & !chatFrames.getFrames()[chatFrameIdx].isShowing()); + animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, + getFrameLenths()[frame]); + animatedModel.interpolateFrames(chatFrames, chatFrameIdx, nextChatFrames, nextChatFrameIdx, + interval, getFrameLenths()[frame]); + return animatedModel; + } + + RSModel animatedModel = model.toSharedModel(!frames.getFrames()[frameIdx].isShowing()); + animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval, + getFrameLenths()[frame]); + return animatedModel; } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index 208c813667..55db558d24 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -30,6 +30,8 @@ import net.runelite.api.Point; import net.runelite.api.WidgetNode; import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.events.WidgetPositioned; +import net.runelite.api.mixins.Copy; +import net.runelite.api.mixins.Replace; import net.runelite.api.widgets.Widget; import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; @@ -44,8 +46,11 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSModel; import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSNodeHashTable; +import net.runelite.rs.api.RSPlayerAppearance; +import net.runelite.rs.api.RSSequenceDefinition; import net.runelite.rs.api.RSWidget; @Mixin(RSWidget.class) @@ -581,4 +586,17 @@ public abstract class RSWidgetMixin implements RSWidget Arrays.fill(getChildren(), null); } } + + @Copy("getModel") + public abstract RSModel rs$getModel(RSSequenceDefinition sequence, int frame, boolean alternate, RSPlayerAppearance playerComposition); + + @Replace("getModel") + public RSModel rl$getModel(RSSequenceDefinition sequence, int frame, boolean alternate, RSPlayerAppearance playerComposition) + { + if (frame != -1 && client.isInterpolateWidgetAnimations()) + { + frame = frame | getModelFrameCycle() << 16 | Integer.MIN_VALUE; + } + return rs$getModel(sequence, frame, alternate, playerComposition); + } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java index 97c8d9a91a..ce8d1bae49 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java @@ -24,4 +24,7 @@ public interface RSSequenceDefinition @Import("frameLengths") int[] getFrameLenths(); + + @Import("chatFrameIds") + int[] getChatFrameIds(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index 85c45da695..286eae5ce9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -475,4 +475,10 @@ public interface RSWidget extends Widget @Import("noScrollThrough") @Override void setNoScrollThrough(boolean noScrollThrough); + + @Import("modelFrame") + int getModelFrame(); + + @Import("modelFrameCycle") + int getModelFrameCycle(); } diff --git a/runescape-client/src/main/java/NPCDefinition.java b/runescape-client/src/main/java/NPCDefinition.java index f12aa595fa..e26103531a 100644 --- a/runescape-client/src/main/java/NPCDefinition.java +++ b/runescape-client/src/main/java/NPCDefinition.java @@ -424,11 +424,11 @@ public class NPCDefinition extends DualNode { Model var10; if (var1 != null && var3 != null) { - var10 = var1.animateSequence2(var5, var2, var3, var4); + var10 = var1.applyTransformations(var5, var2, var3, var4); } else if (var1 != null) { - var10 = var1.animateSequence(var5, var2); + var10 = var1.transformActorModel(var5, var2); } else if (var3 != null) { - var10 = var3.animateSequence(var5, var4); + var10 = var3.transformActorModel(var5, var4); } else { var10 = var5.toSharedSequenceModel(true); } diff --git a/runescape-client/src/main/java/ObjectDefinition.java b/runescape-client/src/main/java/ObjectDefinition.java index 6a6a68db6f..e8d3c9e0cf 100644 --- a/runescape-client/src/main/java/ObjectDefinition.java +++ b/runescape-client/src/main/java/ObjectDefinition.java @@ -662,7 +662,7 @@ public class ObjectDefinition extends DualNode { return var11; } else { if (var7 != null) { - var11 = var7.animateObject(var11, var8, var2); + var11 = var7.transformObjectModel(var11, var8, var2); } else { var11 = var11.toSharedSequenceModel(true); } diff --git a/runescape-client/src/main/java/PlayerAppearance.java b/runescape-client/src/main/java/PlayerAppearance.java index ad5de3e57f..d308ce0f27 100644 --- a/runescape-client/src/main/java/PlayerAppearance.java +++ b/runescape-client/src/main/java/PlayerAppearance.java @@ -321,11 +321,11 @@ public class PlayerAppearance { } else { Model var16; if (var1 != null && var3 != null) { - var16 = var1.animateSequence2(var15, var2, var3, var4); + var16 = var1.applyTransformations(var15, var2, var3, var4); } else if (var1 != null) { - var16 = var1.animateSequence(var15, var2); + var16 = var1.transformActorModel(var15, var2); } else { - var16 = var3.animateSequence(var15, var4); + var16 = var3.transformActorModel(var15, var4); } return var16; diff --git a/runescape-client/src/main/java/SequenceDefinition.java b/runescape-client/src/main/java/SequenceDefinition.java index 3db6636931..323bb88dce 100644 --- a/runescape-client/src/main/java/SequenceDefinition.java +++ b/runescape-client/src/main/java/SequenceDefinition.java @@ -38,8 +38,8 @@ public class SequenceDefinition extends DualNode { @Export("frameIds") public int[] frameIds; @ObfuscatedName("g") - @Export("frameIds2") - int[] frameIds2; + @Export("chatFrameIds") + int[] chatFrameIds; @ObfuscatedName("l") @Export("frameLengths") public int[] frameLengths; @@ -179,14 +179,14 @@ public class SequenceDefinition extends DualNode { this.field783 = var1.readUnsignedByte(); } else if (var2 == 12) { var4 = var1.readUnsignedByte(); - this.frameIds2 = new int[var4]; + this.chatFrameIds = new int[var4]; for (var5 = 0; var5 < var4; ++var5) { - this.frameIds2[var5] = var1.readUnsignedShort(); + this.chatFrameIds[var5] = var1.readUnsignedShort(); } for (var5 = 0; var5 < var4; ++var5) { - var3 = this.frameIds2; + var3 = this.chatFrameIds; var3[var5] += var1.readUnsignedShort() << 16; } } else if (var2 == 13) { @@ -230,8 +230,8 @@ public class SequenceDefinition extends DualNode { signature = "(Ldu;II)Ldu;", garbageValue = "128527714" ) - @Export("animateSequence") - public Model animateSequence(Model model, int frame) { + @Export("transformActorModel") + public Model transformActorModel(Model model, int frame) { frame = this.frameIds[frame]; Frames var3 = ItemContainer.getFrames(frame >> 16); frame &= 65535; @@ -249,8 +249,8 @@ public class SequenceDefinition extends DualNode { signature = "(Ldu;IIB)Ldu;", garbageValue = "-65" ) - @Export("animateObject") - Model animateObject(Model model, int frame, int orientation) { + @Export("transformObjectModel") + Model transformObjectModel(Model model, int frame, int orientation) { frame = this.frameIds[frame]; Frames var4 = ItemContainer.getFrames(frame >> 16); frame &= 65535; @@ -285,8 +285,8 @@ public class SequenceDefinition extends DualNode { signature = "(Ldu;II)Ldu;", garbageValue = "-1692496767" ) - @Export("animateSpotAnimation") - Model animateSpotAnimation(Model model, int frame) { + @Export("transformSpotAnimationModel") + Model transformSpotAnimationModel(Model model, int frame) { frame = this.frameIds[frame]; Frames var3 = ItemContainer.getFrames(frame >> 16); frame &= 65535; @@ -304,13 +304,13 @@ public class SequenceDefinition extends DualNode { signature = "(Ldu;ILjh;II)Ldu;", garbageValue = "-386360993" ) - @Export("animateSequence2") - public Model animateSequence2(Model model, int frame, SequenceDefinition sequence, int sequenceFrame) { + @Export("applyTransformations") + public Model applyTransformations(Model model, int frame, SequenceDefinition sequence, int sequenceFrame) { frame = this.frameIds[frame]; Frames var5 = ItemContainer.getFrames(frame >> 16); frame &= 65535; if (var5 == null) { - return sequence.animateSequence(model, sequenceFrame); + return sequence.transformActorModel(model, sequenceFrame); } else { sequenceFrame = sequence.frameIds[sequenceFrame]; Frames var6 = ItemContainer.getFrames(sequenceFrame >> 16); @@ -333,8 +333,8 @@ public class SequenceDefinition extends DualNode { signature = "(Ldu;II)Ldu;", garbageValue = "-15433768" ) - @Export("animateWidget") - public Model animateWidget(Model model, int frame) { + @Export("transformWidgetModel") + public Model transformWidgetModel(Model model, int frame) { int var3 = this.frameIds[frame]; Frames var4 = ItemContainer.getFrames(var3 >> 16); var3 &= 65535; @@ -343,8 +343,8 @@ public class SequenceDefinition extends DualNode { } else { Frames var5 = null; int var6 = 0; - if (this.frameIds2 != null && frame < this.frameIds2.length) { - var6 = this.frameIds2[frame]; + if (this.chatFrameIds != null && frame < this.chatFrameIds.length) { + var6 = this.chatFrameIds[frame]; var5 = ItemContainer.getFrames(var6 >> 16); var6 &= 65535; } diff --git a/runescape-client/src/main/java/SpotAnimationDefinition.java b/runescape-client/src/main/java/SpotAnimationDefinition.java index 3d7668daf8..d7d530aba5 100644 --- a/runescape-client/src/main/java/SpotAnimationDefinition.java +++ b/runescape-client/src/main/java/SpotAnimationDefinition.java @@ -196,7 +196,7 @@ public class SpotAnimationDefinition extends DualNode { Model var5; if (this.sequence != -1 && var1 != -1) { - var5 = WorldMapAreaData.getSequenceDefinition(this.sequence).animateSpotAnimation(var2, var1); + var5 = WorldMapAreaData.getSequenceDefinition(this.sequence).transformSpotAnimationModel(var2, var1); } else { var5 = var2.toSharedSpotAnimationModel(true); } diff --git a/runescape-client/src/main/java/Widget.java b/runescape-client/src/main/java/Widget.java index 69b5dca3b4..7b91706a4a 100644 --- a/runescape-client/src/main/java/Widget.java +++ b/runescape-client/src/main/java/Widget.java @@ -1376,11 +1376,11 @@ public class Widget extends Node { garbageValue = "1082545676" ) @Export("getModel") - public Model getModel(SequenceDefinition sequence, int frame, boolean var3, PlayerAppearance appearance) { + public Model getModel(SequenceDefinition sequence, int frame, boolean alternate, PlayerAppearance appearance) { field957 = false; int var5; int var6; - if (var3) { + if (alternate) { var5 = this.modelType2; var6 = this.modelId2; } else { @@ -1445,7 +1445,7 @@ public class Widget extends Node { } if (sequence != null) { - var7 = sequence.animateWidget(var7, frame); + var7 = sequence.transformWidgetModel(var7, frame); } return var7;