mojira.dev
MCPE-122664

The player's limbs don't stop moving when idling in swim mode

Steps to Reproduce:

  1. Swim towards a corner, with a block above you.

  2. Stop moving.

Observed Results:
The player's arms and legs keep moving.

Expected Results:
The swimming animation pauses, and continues when you start moving again.

Screenshots/Videos attached: No

Notes: This can be fixed by changing the animation from this...

"animation.player.swim" : {
			"animation_length" : 1.3,
			"loop" : true,
			"override_previous_animation" : true,
			"bones" : {
				"leftarm" : {
					"rotation" : {
						"0" : [ 0.0, 180.0, 180.0 ],
						"0.7" : [ 0.0, 180.0, 287.2 ],
						"1.1" : [ 90.0, 180.0, 180.0 ],
						"1.3" : [ 0.0, 180.0, 180.0 ]
					}
				},
				"rightarm" : {
					"rotation" : {
						"0" : [ 0.0, 180.0, -180.0 ],
						"0.7" : [ 0.0, 180.0, -287.2 ],
						"1.1" : [ 90.0, 180.0, -180.0 ],
						"1.3" : [ 0.0, 180.0, -180.0 ]
					}
				},
				"root" : {
					"position" : [ 0.0, "(math.sin(query.target_x_rotation) * 24.0 + 3.0) * variable.swim_amount", "(math.cos(query.target_x_rotation) * 24.0 + 9.0) * variable.swim_amount" ],
					"rotation" : [ "variable.swim_amount * (90 + query.target_x_rotation)", 0.0, 0.0 ]
				}
			}
		},
		"animation.player.swim.legs" : {
			"loop" : true,
			"override_previous_animation" : true,
			"bones" : {
				"leftleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.life_time * 390.0 + 180.0) * 17.2, variable.swim_amount)", 0.0, 0.0 ]
				},
				"rightleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.life_time * 390.0) * 17.2, variable.swim_amount)", 0.0, 0.0 ]
				}
			}
		},
		"animation.player.swim.legs.single" : {
			"loop" : true,
			"override_previous_animation" : true,
			"bones" : {
				"leftleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.life_time * 390.0) * 17.2, variable.swim_amount)", 0.0, 0.0 ]
				},
				"rightleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.life_time * 390.0) * 17.2, variable.swim_amount)", 0.0, 0.0 ]
				}
			}
		}

to this:

"animation.player.swim" : {
			"loop" : true,
			"bones" : {
				"leftarm" : {
					"rotation" : [ "math.lerp(0.0, (math.mod(query.modified_distance_moved, 26.0) < 22.0 ? 90.0 * math.clamp(math.mod(query.modified_distance_moved, 26.0) - 14.0, 0.0, 8.0) / 8.0 : 90.0 - 90.0 * (math.mod(query.modified_distance_moved, 26) - 22.0) / 4.0) - this, variable.swim_amount)", "math.lerprotate(0.0, 180.0 - this, variable.swim_amount)", "math.lerprotate(0.0, (math.mod(query.modified_distance_moved, 26.0) < 14.0 ? 180.0 + 107.18873 * math.mod(query.modified_distance_moved, 26.0) / 14.0 : 287.18873 - 107.18873 * math.clamp(math.mod(query.modified_distance_moved, 26) - 14.0, 0.0, 8.0) / 8.0) - this, variable.swim_amount)" ]
				},
				"rightarm" : {
					"rotation" : [ "math.lerp(0.0, (math.mod(query.modified_distance_moved, 26.0) < 22.0 ? 90.0 * math.clamp(math.mod(query.modified_distance_moved, 26.0) - 14.0, 0.0, 8.0) / 8.0 : 90.0 - 90.0 * (math.mod(query.modified_distance_moved, 26) - 22.0) / 4.0) - this, variable.swim_amount)", "math.lerp(0.0, 180.0 - this, variable.swim_amount)", "math.lerp(0.0, (math.mod(query.modified_distance_moved, 26.0) < 14.0 ? 180.0 - 107.18873 * math.mod(query.modified_distance_moved, 26.0) / 14.0 : 72.81127 + 107.18873 * math.clamp(math.mod(query.modified_distance_moved, 26) - 14.0, 0.0, 8.0) / 8.0) - this, variable.swim_amount)" ]
				},
				"root" : {
					"position" : [ 0.0, "math.sin(math.lerp(-90.0, query.target_x_rotation, variable.swim_amount)) * 17.0 + 17.0 - 12.0 * variable.swim_amount", "math.cos(math.lerp(-90.0, query.target_x_rotation * query.is_in_water, variable.swim_amount)) * 17.0" ],
					"rotation" : [ "variable.swim_amount * (90.0 + query.target_x_rotation)", 0.0, 0.0 ]
				}
			}
		},
		"animation.player.swim.legs" : {
			"loop" : true,
			"bones" : {
				"leftleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.modified_distance_moved * 19.09859 + 180.0) * 17.18873 - this, variable.swim_amount)", 0.0, 0.0 ]
				},
				"rightleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.modified_distance_moved * 19.09859) * 17.18873 - this, variable.swim_amount)", 0.0, 0.0 ]
				}
			}
		},
		"animation.player.swim.legs.single" : {
			"loop" : true,
			"bones" : {
				"leftleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.modified_distance_moved * 19.09859) * 17.18873 - this, variable.swim_amount)", 0.0, 0.0 ]
				},
				"rightleg" : {
					"rotation" : [ "math.lerp(0.0, math.cos(query.modified_distance_moved * 19.09859) * 17.18873 - this, variable.swim_amount)", 0.0, 0.0 ]
				}
			}
		}

This fix also addresses MCPE-122663, and adds a smooth transition to the swimming pose for the limbs, which can't be done with a custom anim_time_update and keyframes.

The math has been simplified as much as possible, using clamps instead of multiple conditions. It can be shortened further by replacing every instance of math.mod(query.modified_distance_moved, 26.0) with a variable.

Linked issues

Attachments

Comments 2

This bug didn’t happen before 1.13. It was introduced in 1.13. This also means that the swimming animation isn’t affected by MCPE-31931 anymore. So before 1.13 when you held down the jump key while swimming with the swimming animation, it used to make it slower, however this is not the case anymore because of this bug.

Can confirm in 1.18.2 on iOS.

[Mod] LateLag

(Unassigned)

496397

Confirmed

Multiple

1.19.70.24/25 Preview, 1.19.70.22 Preview, 1.19.70.21 Preview, 1.18.10.26 Beta, 1.17.0.54 Beta, ..., 1.18.2 Hotfix, 1.19.60, 1.19.63, 1.20.0.24 Preview, 1.19.81 Hotfix

Retrieved