client: Add Widget Animation Smoothing
This commit is contained in:
@@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,4 +24,7 @@ public interface RSSequenceDefinition
|
|||||||
|
|
||||||
@Import("frameLengths")
|
@Import("frameLengths")
|
||||||
int[] getFrameLenths();
|
int[] getFrameLenths();
|
||||||
|
|
||||||
|
@Import("chatFrameIds")
|
||||||
|
int[] getChatFrameIds();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user