public override void Flip() { base.Flip(); walkPos = -walkPos; Limb torso = GetLimb(LimbType.Torso); Vector2 difference; Matrix torsoTransform = Matrix.CreateRotationZ(torso.Rotation); for (int i = 0; i < character.SelectedItems.Length; i++) { if (character.SelectedItems[i] != null && character.SelectedItems[i].body != null) { difference = character.SelectedItems[i].body.SimPosition - torso.SimPosition; difference = Vector2.Transform(difference, torsoTransform); difference.Y = -difference.Y; character.SelectedItems[i].body.SetTransform( torso.SimPosition + Vector2.Transform(difference, -torsoTransform), MathUtils.WrapAngleTwoPi(-character.SelectedItems[i].body.Rotation)); } } foreach (Limb limb in Limbs) { bool mirror = false; bool flipAngle = false; bool wrapAngle = false; switch (limb.type) { case LimbType.LeftHand: case LimbType.LeftArm: case LimbType.RightHand: case LimbType.RightArm: mirror = true; flipAngle = true; break; case LimbType.LeftThigh: case LimbType.LeftLeg: case LimbType.LeftFoot: case LimbType.RightThigh: case LimbType.RightLeg: case LimbType.RightFoot: mirror = Crouching && !inWater; flipAngle = (limb.DoesFlip || Crouching) && !inWater; wrapAngle = !inWater; break; default: flipAngle = limb.DoesFlip && !inWater; wrapAngle = !inWater; break; } Vector2 position = limb.SimPosition; if ((limb.pullJoint == null || !limb.pullJoint.Enabled) && mirror) { difference = limb.body.SimPosition - torso.SimPosition; difference = Vector2.Transform(difference, torsoTransform); difference.Y = -difference.Y; position = torso.SimPosition + Vector2.Transform(difference, -torsoTransform); //TrySetLimbPosition(limb, limb.SimPosition, ); } float angle = flipAngle ? -limb.body.Rotation : limb.body.Rotation; if (wrapAngle) { angle = MathUtils.WrapAnglePi(angle); } TrySetLimbPosition(limb, Collider.SimPosition, position); limb.body.SetTransform(limb.body.SimPosition, angle); } }