Animations for parts attached to characters with motor6ds not playing for other players

Description:

In my game, weapons can be equipped and are attached to the player’s hand using motor6ds. Upon equipping the weapon an idle animation plays which partially consists of the weapon having a rotational displacement from its default attached position. The full animation can be seen with no issues by the player that equipped the weapon, however when seen by other players, the equipped weapon remains in its default attached position. This bug also only appears while playing on a real server and not a local server in studio.

Visuals:

–How it should not look
https://gyazo.com/dde8072aab3b23795e95b289bd79f76a
The screen on the left is the pov of the player equipping the weapon and the screen on the right is the pov of another player
–How it should look
https://gyazo.com/7bb5c992fd589e59af6fd0bf6541f21c
The screen on the right is the pov of the player equipping the weapon and the screen on the left is the pov from an out-of-date microsoft store version of roblox. (and yes this bug has been experienced by multiple players who all use up-to-date versions of roblox so me using an out-of-date version in the first demonstration is not the cause of the bug)

Where it’s happening

https://www.roblox.com/games/6324186729/GGM-Showdown

When it started happening

Can’t pinpoint an exact date but roughly a month ago

Replicating the bug

The bug can be easily replicated by either playing the game above or with this file by publishing it, joining on two devices, and equipping the tool on one device and viewing the tool equipped player from the other device. The animations are provided in the rigs and will need to be re-uploaded to the publisher’s account. The new ids go into game.StarterPlayer.StarterCharacterScripts.ServerAnimationHandler.SwordIdle and SwordAttack.
BugTest.rbxl (49.3 KB)

2 Likes

Thanks for the report! We’ve filed a ticket to our internal database and we’ll follow up when we have an update for you.

1 Like

Bump. This is happening in me&a friend’s game called ZO consistently for a LONG time now and some players have begun to notice it.

Game i’m having problems with:
https://www.roblox.com/games/6678877691/ZO-WIP?refPageId=995297ac-0b3d-4d64-aed0-e39ed517370d

Some details on how my Motor6D’s are setup if its of any help:
Upon equipping the tool, the RightGrip weld of the tool’s Part0 and Part1 is set to nil and a Motor6D called “Handle” is created in RightGrip with the Part0 of the Right Arm and the Part1 to the tool’s Handle

NOTE:
Approaching any player with these motors and getting within a close vicinity seems to make the motor suddenly snap to the correct position and start working(until the motor is destroyed and created again)

I also tried calling Player1Handle:SetNetworkOwner(Player2) from the server, and that would trigger the Motor6D to snap into place for Player2 but its animation would stop working for Player1?? I don’t know why but the Motor6D animating or not seems to be linked to Network Ownership&who owns the part in some way

We’re quite limited on what we can do in-game unless we find a workaround for this or know what in the world is happening, so if you have any insight as to what’s happening here or when this may be fixed, i’d be thrilled to hear it.

2 Likes

Can confirm this is also happening with my basketball game. hopefully this gets fixed, it really messes with the gameplay.

My game is also experiencing this issue.

Same is occurring with me. My Motor6Ds attached to the torso and gun, just break.

I can confirm that this is an issue with the CurrentAngle property of the Motor6D. The behavior of this one property does not replicate from server to client or vice versa. I would consider this broken. The server side to this does not replicate to clients. It’s very strange unintended behavior because if you view this property from the developer console on the server side it shows but on all clients it does not.

I would reccomend not using this property… Or if it’s very necessary then you would have to provide the functionality of replication to all the clients… I haven’t done test but I would not reccomend firing commands to and from server on the frame by frame basis.
You should tween this property when replicating to clients. If it’s neccessary for controls on the players client then bind the animation function to the framerate on their perspective.

My personal use scenario is that I’m using an npc that is only running on the server. So if I want to use this feature I have to create a bridge when a character is in range to replicate the behavior to the client. A standalone solution would be to insert an executable local script that replicates to the client with an object value determining the npc.
But instead I’ve been figuring out how to use just the DesiredAngle and Velocity property to reach the desired position. It’s a bit more complicated but it works. This is the method ROBLOX developers originally used to animate Motor6D probably with this bug in mind… I’m not sure if Motor6D is beginning to fall under deprecation but it would be nice if this was fixed…
EDIT: After reading some other comments. If you want to not have glitchy behavior you should not manipulate this value from the server side. Just change it from the client. Keep in mind that when streaming is enabled parts outside of the render range will not be available to the client.

Here is a solution.
–Make each animation identifiable…
function AnimateType()
–First get the folder where your animations are.
–Make your script replicate the your animation values to the server.
–Directory should be where you store your NPCS players etc,
–Made for simplicity and general use…
TweenService = game:GetService(“TweenService”)

–I would reccomend using a module script to execute the animation.
—Solution without module script
Directory=workspace
TargetJoint=“Right Shoulder”
for _,v in pairs(Directory:GetChildren()) do
–Let’s only get the specific motors we are looking for…
if v:IsA(“Model”) and v:FindFirstChildOfClass(“Humanoid”)~=nil then
for _,Motors in pairs(v:GetChildren()) do
if Motors:IsA(“Motor6D”) and Motors.Name=TargetJoint then
goal = {}
goal.CurrentAngle = 1
tweenInfo = TweenInfo.new(.3)
local tween = TweenService:Create(Motors, tweenInfo, goal)
tween:Play()
end
end
end
end

–Solution with Module script
AnimationModuleName=“AnimationModule”
for _,v in pairs(Directory:GetChildren()) do
if v:FindFirstChild(“AnimationModule”)~=nil then
local Anims=v.Require("AnimationModule’)
Anims.Animate()
end
end

3 Likes

How we solved problems in the days before AI was crazy