private float[] GetFirstPersonHandsMatrix(EntityAgent entity, float[] viewMat, float deltaTime) { var modelMat = Mat4f.Invert(Mat4f.Create(), viewMat); // If the hands haven't been rendered in the last 10 render ticks, reset wobble and such. if (_renderTick - _lastTickHandsRendered > 10) { _moveWobble = 0; _lastYaw = entity.Pos.Yaw;; _yawDifference = 0; } _lastTickHandsRendered = _renderTick; if (entity.Controls.TriesToMove) { var moveSpeed = entity.Controls.MovespeedMultiplier * (float)entity.GetWalkSpeedMultiplier(); _moveWobble += moveSpeed * deltaTime * 5.0F; } else { var target = (float)(Math.Round(_moveWobble / Math.PI) * Math.PI); var speed = deltaTime * (0.2F + Math.Abs(target - _moveWobble) * 4); if (Math.Abs(target - _moveWobble) < speed) { _moveWobble = target; } else { _moveWobble += Math.Sign(target - _moveWobble) * speed; } } _moveWobble = _moveWobble % (GameMath.PI * 2); var moveWobbleOffsetX = GameMath.Sin((_moveWobble + GameMath.PI)) * 0.03F; var moveWobbleOffsetY = GameMath.Sin(_moveWobble * 2) * 0.02F; _yawDifference += GameMath.AngleRadDistance(_lastYaw, entity.Pos.Yaw); _yawDifference *= (1 - 0.075F); _lastYaw = entity.Pos.Yaw; var yawRotation = -_yawDifference / 2; var pitchRotation = (entity.Pos.Pitch - GameMath.PI) / 4; Mat4f.RotateY(modelMat, modelMat, yawRotation); Mat4f.Translate(modelMat, modelMat, 0.0F, -0.35F, -0.20F); Mat4f.RotateY(modelMat, modelMat, -yawRotation); Mat4f.RotateX(modelMat, modelMat, pitchRotation / 2); Mat4f.Translate(modelMat, modelMat, 0.0F, 0.0F, -0.20F); Mat4f.RotateX(modelMat, modelMat, pitchRotation); Mat4f.RotateY(modelMat, modelMat, yawRotation); Mat4f.Translate(modelMat, modelMat, moveWobbleOffsetX, moveWobbleOffsetY, 0.0F); Mat4f.RotateY(modelMat, modelMat, 90.0F * GameMath.DEG2RAD); return(modelMat); }