client: Add Widget Animation Smoothing

This commit is contained in:
Owain van Brakel
2019-07-10 23:32:24 +02:00
parent e7b15d9cfd
commit e85fc0e7d0
14 changed files with 325 additions and 187 deletions

View File

@@ -1353,6 +1353,20 @@ public interface Client extends GameShell
*/ */
void setInterpolateObjectAnimations(boolean interpolate); 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. * Checks whether the logged in player is in an instanced region.
* *

View File

@@ -65,4 +65,14 @@ public interface AnimationSmoothingConfig extends Config
return true; 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;
}
} }

View File

@@ -69,6 +69,7 @@ public class AnimationSmoothingPlugin extends Plugin
client.setInterpolatePlayerAnimations(false); client.setInterpolatePlayerAnimations(false);
client.setInterpolateNpcAnimations(false); client.setInterpolateNpcAnimations(false);
client.setInterpolateObjectAnimations(false); client.setInterpolateObjectAnimations(false);
client.setInterpolateWidgetAnimations(false);
} }
@Subscribe @Subscribe
@@ -85,5 +86,6 @@ public class AnimationSmoothingPlugin extends Plugin
client.setInterpolatePlayerAnimations(config.smoothPlayerAnimations()); client.setInterpolatePlayerAnimations(config.smoothPlayerAnimations());
client.setInterpolateNpcAnimations(config.smoothNpcAnimations()); client.setInterpolateNpcAnimations(config.smoothNpcAnimations());
client.setInterpolateObjectAnimations(config.smoothObjectAnimations()); client.setInterpolateObjectAnimations(config.smoothObjectAnimations());
client.setInterpolateWidgetAnimations(config.smoothWidgetAnimations());
} }
} }

View File

@@ -163,6 +163,9 @@ public abstract class RSClientMixin implements RSClient
@Inject @Inject
private static boolean interpolateObjectAnimations; private static boolean interpolateObjectAnimations;
@Inject
private static boolean interpolateWidgetAnimations;
@Inject @Inject
private static RSPlayer[] oldPlayers = new RSPlayer[2048]; private static RSPlayer[] oldPlayers = new RSPlayer[2048];
@@ -307,6 +310,20 @@ public abstract class RSClientMixin implements RSClient
interpolateObjectAnimations = interpolate; interpolateObjectAnimations = interpolate;
} }
@Inject
@Override
public boolean isInterpolateWidgetAnimations()
{
return interpolateWidgetAnimations;
}
@Inject
@Override
public void setInterpolateWidgetAnimations(boolean interpolate)
{
interpolateWidgetAnimations = interpolate;
}
@Inject @Inject
@Override @Override
public void setInventoryDragDelay(int delay) public void setInventoryDragDelay(int delay)

View File

@@ -15,10 +15,10 @@ public abstract class RSSequenceDefinitionMixin implements RSSequenceDefinition
@Shadow("client") @Shadow("client")
private static RSClient client; private static RSClient client;
@Copy("animateSequence2") @Copy("applyTransformations")
public abstract RSModel rs$applyTransformations(RSModel model, int actionFrame, RSSequenceDefinition poseSeq, int poseFrame); 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) public RSModel rl$applyTransformations(RSModel model, int actionFrame, RSSequenceDefinition poseSeq, int poseFrame)
{ {
// reset frame ids because we're not interpolating this // 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); return rs$applyTransformations(model, actionFrame, poseSeq, poseFrame);
} }
@Copy("animateSequence") @Copy("transformActorModel")
public abstract RSModel rs$transformActorModel(RSModel model, int frameIdx); public abstract RSModel rs$transformActorModel(RSModel model, int frameIdx);
@Replace("animateSequence") @Replace("transformActorModel")
public RSModel rl$transformActorModel(RSModel model, int frame) public RSModel rl$transformActorModel(RSModel model, int frame)
{ {
// check if the frame has been modified // check if the frame has not been modified
if (frame < 0) 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
{ {
return rs$transformActorModel(model, frame); 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); 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) public RSModel rl$transformObjectModel(RSModel model, int frame, int rotation)
{ {
// check if the frame has been modified // check if the frame has not been modified
if (frame < 0) 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
{ {
return rs$transformObjectModel(model, frame, rotation); 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") @Copy("transformSpotAnimationModel")
public abstract RSModel rs$transformSpotAnimModel(RSModel model, int frame); public abstract RSModel rs$transformSpotAnimationModel(RSModel model, int frame);
@Replace("animateSpotAnimation") @Replace("transformSpotAnimationModel")
public RSModel rl$transformSpotAnimModel(RSModel model, int frame) public RSModel rl$transformSpotAnimationModel(RSModel model, int frame)
{ {
// check if the frame has been modified // check if the frame has not been modified
if (frame < 0) if (frame >= 0)
{ {
// remove flag to check if the frame has been modified return rs$transformSpotAnimationModel(model, frame);
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;
}
} }
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;
} }
} }

View File

@@ -30,6 +30,8 @@ import net.runelite.api.Point;
import net.runelite.api.WidgetNode; import net.runelite.api.WidgetNode;
import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.events.WidgetHiddenChanged;
import net.runelite.api.events.WidgetPositioned; 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 net.runelite.api.widgets.Widget;
import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; 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.Mixin;
import net.runelite.api.mixins.Shadow; import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSModel;
import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSNode;
import net.runelite.rs.api.RSNodeHashTable; import net.runelite.rs.api.RSNodeHashTable;
import net.runelite.rs.api.RSPlayerAppearance;
import net.runelite.rs.api.RSSequenceDefinition;
import net.runelite.rs.api.RSWidget; import net.runelite.rs.api.RSWidget;
@Mixin(RSWidget.class) @Mixin(RSWidget.class)
@@ -581,4 +586,17 @@ public abstract class RSWidgetMixin implements RSWidget
Arrays.fill(getChildren(), null); 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);
}
} }

View File

@@ -24,4 +24,7 @@ public interface RSSequenceDefinition
@Import("frameLengths") @Import("frameLengths")
int[] getFrameLenths(); int[] getFrameLenths();
@Import("chatFrameIds")
int[] getChatFrameIds();
} }

View File

@@ -475,4 +475,10 @@ public interface RSWidget extends Widget
@Import("noScrollThrough") @Import("noScrollThrough")
@Override @Override
void setNoScrollThrough(boolean noScrollThrough); void setNoScrollThrough(boolean noScrollThrough);
@Import("modelFrame")
int getModelFrame();
@Import("modelFrameCycle")
int getModelFrameCycle();
} }

View File

@@ -424,11 +424,11 @@ public class NPCDefinition extends DualNode {
Model var10; Model var10;
if (var1 != null && var3 != null) { if (var1 != null && var3 != null) {
var10 = var1.animateSequence2(var5, var2, var3, var4); var10 = var1.applyTransformations(var5, var2, var3, var4);
} else if (var1 != null) { } else if (var1 != null) {
var10 = var1.animateSequence(var5, var2); var10 = var1.transformActorModel(var5, var2);
} else if (var3 != null) { } else if (var3 != null) {
var10 = var3.animateSequence(var5, var4); var10 = var3.transformActorModel(var5, var4);
} else { } else {
var10 = var5.toSharedSequenceModel(true); var10 = var5.toSharedSequenceModel(true);
} }

View File

@@ -662,7 +662,7 @@ public class ObjectDefinition extends DualNode {
return var11; return var11;
} else { } else {
if (var7 != null) { if (var7 != null) {
var11 = var7.animateObject(var11, var8, var2); var11 = var7.transformObjectModel(var11, var8, var2);
} else { } else {
var11 = var11.toSharedSequenceModel(true); var11 = var11.toSharedSequenceModel(true);
} }

View File

@@ -321,11 +321,11 @@ public class PlayerAppearance {
} else { } else {
Model var16; Model var16;
if (var1 != null && var3 != null) { if (var1 != null && var3 != null) {
var16 = var1.animateSequence2(var15, var2, var3, var4); var16 = var1.applyTransformations(var15, var2, var3, var4);
} else if (var1 != null) { } else if (var1 != null) {
var16 = var1.animateSequence(var15, var2); var16 = var1.transformActorModel(var15, var2);
} else { } else {
var16 = var3.animateSequence(var15, var4); var16 = var3.transformActorModel(var15, var4);
} }
return var16; return var16;

View File

@@ -38,8 +38,8 @@ public class SequenceDefinition extends DualNode {
@Export("frameIds") @Export("frameIds")
public int[] frameIds; public int[] frameIds;
@ObfuscatedName("g") @ObfuscatedName("g")
@Export("frameIds2") @Export("chatFrameIds")
int[] frameIds2; int[] chatFrameIds;
@ObfuscatedName("l") @ObfuscatedName("l")
@Export("frameLengths") @Export("frameLengths")
public int[] frameLengths; public int[] frameLengths;
@@ -179,14 +179,14 @@ public class SequenceDefinition extends DualNode {
this.field783 = var1.readUnsignedByte(); this.field783 = var1.readUnsignedByte();
} else if (var2 == 12) { } else if (var2 == 12) {
var4 = var1.readUnsignedByte(); var4 = var1.readUnsignedByte();
this.frameIds2 = new int[var4]; this.chatFrameIds = new int[var4];
for (var5 = 0; var5 < var4; ++var5) { for (var5 = 0; var5 < var4; ++var5) {
this.frameIds2[var5] = var1.readUnsignedShort(); this.chatFrameIds[var5] = var1.readUnsignedShort();
} }
for (var5 = 0; var5 < var4; ++var5) { for (var5 = 0; var5 < var4; ++var5) {
var3 = this.frameIds2; var3 = this.chatFrameIds;
var3[var5] += var1.readUnsignedShort() << 16; var3[var5] += var1.readUnsignedShort() << 16;
} }
} else if (var2 == 13) { } else if (var2 == 13) {
@@ -230,8 +230,8 @@ public class SequenceDefinition extends DualNode {
signature = "(Ldu;II)Ldu;", signature = "(Ldu;II)Ldu;",
garbageValue = "128527714" garbageValue = "128527714"
) )
@Export("animateSequence") @Export("transformActorModel")
public Model animateSequence(Model model, int frame) { public Model transformActorModel(Model model, int frame) {
frame = this.frameIds[frame]; frame = this.frameIds[frame];
Frames var3 = ItemContainer.getFrames(frame >> 16); Frames var3 = ItemContainer.getFrames(frame >> 16);
frame &= 65535; frame &= 65535;
@@ -249,8 +249,8 @@ public class SequenceDefinition extends DualNode {
signature = "(Ldu;IIB)Ldu;", signature = "(Ldu;IIB)Ldu;",
garbageValue = "-65" garbageValue = "-65"
) )
@Export("animateObject") @Export("transformObjectModel")
Model animateObject(Model model, int frame, int orientation) { Model transformObjectModel(Model model, int frame, int orientation) {
frame = this.frameIds[frame]; frame = this.frameIds[frame];
Frames var4 = ItemContainer.getFrames(frame >> 16); Frames var4 = ItemContainer.getFrames(frame >> 16);
frame &= 65535; frame &= 65535;
@@ -285,8 +285,8 @@ public class SequenceDefinition extends DualNode {
signature = "(Ldu;II)Ldu;", signature = "(Ldu;II)Ldu;",
garbageValue = "-1692496767" garbageValue = "-1692496767"
) )
@Export("animateSpotAnimation") @Export("transformSpotAnimationModel")
Model animateSpotAnimation(Model model, int frame) { Model transformSpotAnimationModel(Model model, int frame) {
frame = this.frameIds[frame]; frame = this.frameIds[frame];
Frames var3 = ItemContainer.getFrames(frame >> 16); Frames var3 = ItemContainer.getFrames(frame >> 16);
frame &= 65535; frame &= 65535;
@@ -304,13 +304,13 @@ public class SequenceDefinition extends DualNode {
signature = "(Ldu;ILjh;II)Ldu;", signature = "(Ldu;ILjh;II)Ldu;",
garbageValue = "-386360993" garbageValue = "-386360993"
) )
@Export("animateSequence2") @Export("applyTransformations")
public Model animateSequence2(Model model, int frame, SequenceDefinition sequence, int sequenceFrame) { public Model applyTransformations(Model model, int frame, SequenceDefinition sequence, int sequenceFrame) {
frame = this.frameIds[frame]; frame = this.frameIds[frame];
Frames var5 = ItemContainer.getFrames(frame >> 16); Frames var5 = ItemContainer.getFrames(frame >> 16);
frame &= 65535; frame &= 65535;
if (var5 == null) { if (var5 == null) {
return sequence.animateSequence(model, sequenceFrame); return sequence.transformActorModel(model, sequenceFrame);
} else { } else {
sequenceFrame = sequence.frameIds[sequenceFrame]; sequenceFrame = sequence.frameIds[sequenceFrame];
Frames var6 = ItemContainer.getFrames(sequenceFrame >> 16); Frames var6 = ItemContainer.getFrames(sequenceFrame >> 16);
@@ -333,8 +333,8 @@ public class SequenceDefinition extends DualNode {
signature = "(Ldu;II)Ldu;", signature = "(Ldu;II)Ldu;",
garbageValue = "-15433768" garbageValue = "-15433768"
) )
@Export("animateWidget") @Export("transformWidgetModel")
public Model animateWidget(Model model, int frame) { public Model transformWidgetModel(Model model, int frame) {
int var3 = this.frameIds[frame]; int var3 = this.frameIds[frame];
Frames var4 = ItemContainer.getFrames(var3 >> 16); Frames var4 = ItemContainer.getFrames(var3 >> 16);
var3 &= 65535; var3 &= 65535;
@@ -343,8 +343,8 @@ public class SequenceDefinition extends DualNode {
} else { } else {
Frames var5 = null; Frames var5 = null;
int var6 = 0; int var6 = 0;
if (this.frameIds2 != null && frame < this.frameIds2.length) { if (this.chatFrameIds != null && frame < this.chatFrameIds.length) {
var6 = this.frameIds2[frame]; var6 = this.chatFrameIds[frame];
var5 = ItemContainer.getFrames(var6 >> 16); var5 = ItemContainer.getFrames(var6 >> 16);
var6 &= 65535; var6 &= 65535;
} }

View File

@@ -196,7 +196,7 @@ public class SpotAnimationDefinition extends DualNode {
Model var5; Model var5;
if (this.sequence != -1 && var1 != -1) { if (this.sequence != -1 && var1 != -1) {
var5 = WorldMapAreaData.getSequenceDefinition(this.sequence).animateSpotAnimation(var2, var1); var5 = WorldMapAreaData.getSequenceDefinition(this.sequence).transformSpotAnimationModel(var2, var1);
} else { } else {
var5 = var2.toSharedSpotAnimationModel(true); var5 = var2.toSharedSpotAnimationModel(true);
} }

View File

@@ -1376,11 +1376,11 @@ public class Widget extends Node {
garbageValue = "1082545676" garbageValue = "1082545676"
) )
@Export("getModel") @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; field957 = false;
int var5; int var5;
int var6; int var6;
if (var3) { if (alternate) {
var5 = this.modelType2; var5 = this.modelType2;
var6 = this.modelId2; var6 = this.modelId2;
} else { } else {
@@ -1445,7 +1445,7 @@ public class Widget extends Node {
} }
if (sequence != null) { if (sequence != null) {
var7 = sequence.animateWidget(var7, frame); var7 = sequence.transformWidgetModel(var7, frame);
} }
return var7; return var7;