private unsafe void ApplyWeaponBouncing(MyHandItemDefinition handItemDefinition, ref MatrixD weaponMatrixLocal, float fpsBounceMultiplier, float ironsightWeight) { if (base.Character.AnimationController.CharacterBones.IsValidIndex <MyCharacterBone>(base.Character.SpineBoneIndex)) { Vector3 * vectorPtr1; float z; bool flag = base.Character.ControllerInfo.IsLocallyControlled(); bool flag2 = (base.Character.IsInFirstPersonView || base.Character.ForceFirstPersonCamera) & flag; Vector3 translation = base.Character.AnimationController.CharacterBonesSorted[0].Translation; MyCharacterBone bone1 = base.Character.AnimationController.CharacterBones[base.Character.SpineBoneIndex]; Vector3 vector2 = bone1.AbsoluteTransform.Translation - translation; this.m_spineRestPositionX.Add((double)vector2.X); this.m_spineRestPositionY.Add((double)vector2.Y); this.m_spineRestPositionZ.Add((double)vector2.Z); Vector3 position = bone1.GetAbsoluteRigTransform().Translation; Vector3 vector4 = new Vector3((double)position.X, this.m_spineRestPositionY.Get(), (double)position.Z); Vector3 vector5 = (vector2 - vector4) * fpsBounceMultiplier; if (!flag2) { z = 0f; } else { vectorPtr1 = (Vector3 *)ref vector5; z = vector5.Z; } vectorPtr1->Z = z; this.m_sprintStatusWeight += base.Character.IsSprinting ? this.m_sprintStatusGainSpeed : -this.m_sprintStatusGainSpeed; this.m_sprintStatusWeight = MathHelper.Clamp(this.m_sprintStatusWeight, 0f, 1f); if (!flag2) { vector5 *= handItemDefinition.AmplitudeMultiplier3rd; } else { vector5 *= 1f + (Math.Max((float)0f, (float)(handItemDefinition.RunMultiplier - 1f)) * this.m_sprintStatusWeight); float *singlePtr1 = (float *)ref vector5.X; singlePtr1[0] *= handItemDefinition.XAmplitudeScale; float *singlePtr2 = (float *)ref vector5.Y; singlePtr2[0] *= handItemDefinition.YAmplitudeScale; float *singlePtr3 = (float *)ref vector5.Z; singlePtr3[0] *= handItemDefinition.ZAmplitudeScale; } weaponMatrixLocal.Translation += vector5; BoundingBox localAABB = base.Character.PositionComp.LocalAABB; if ((ironsightWeight < 1f) && (weaponMatrixLocal.M43 > (((position.Z + translation.Z) - (localAABB.Max.Z * 0.5)) - (base.Character.HandItemDefinition.RightHand.Translation.Z * 0.75)))) { double num = ((position.Z + translation.Z) - (localAABB.Max.Z * 0.5)) - (base.Character.HandItemDefinition.RightHand.Translation.Z * 0.75); weaponMatrixLocal.M43 = MathHelper.Lerp(num, weaponMatrixLocal.M43, (double)ironsightWeight); } if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW && MyDebugDrawSettings.DEBUG_DRAW_CHARACTER_TOOLS) { MatrixD?cameraViewMatrix = null; MyDebugDrawHelper.DrawNamedPoint(Vector3D.Transform(position, base.Character.WorldMatrix), "spine", new Color?(Color.Gray), cameraViewMatrix); } } }
private unsafe void UpdateGraphicalWeaponPosition3rd(MyHandItemDefinition handItemDefinition) { bool jetpackRunning = base.Character.JetpackRunning; MyAnimationControllerComponent animationController = base.Character.AnimationController; MatrixD xd = base.Character.GetHeadMatrix(false, !jetpackRunning, false, true, true) * base.Character.PositionComp.WorldMatrixInvScaled; if (animationController.CharacterBones.IsValidIndex <MyCharacterBone>(base.Character.HeadBoneIndex)) { double *numPtr1 = (double *)ref xd.M42; numPtr1[0] += animationController.CharacterBonesSorted[0].Translation.Y; } MatrixD xd2 = handItemDefinition.ItemLocation3rd; MatrixD xd3 = handItemDefinition.ItemWalkingLocation3rd; MatrixD xd4 = handItemDefinition.ItemShootLocation3rd; MatrixD itemIronsightLocation = handItemDefinition.ItemIronsightLocation; MatrixD xd6 = animationController.CharacterBones.IsValidIndex <MyCharacterBone>(base.Character.WeaponBone) ? (this.GetWeaponRelativeMatrix() * animationController.CharacterBones[base.Character.WeaponBone].AbsoluteTransform) : this.GetWeaponRelativeMatrix(); itemIronsightLocation.Translation = m_weaponIronsightTranslation; if (base.Character.CurrentWeapon is MyEngineerToolBase) { itemIronsightLocation.Translation = m_toolIronsightTranslation; } Vector4D vectord = this.UpdateAndGetWeaponVariantWeights(handItemDefinition); MatrixD weaponMatrixLocal = MatrixD.Normalize((MatrixD)((((vectord.X * xd2) + (vectord.Y * xd3)) + (vectord.Z * xd4)) + (vectord.W * itemIronsightLocation))); double num = 0.0; if (handItemDefinition.ItemPositioning3rd == MyItemPositioningEnum.TransformFromData) { num += vectord.X; } if (handItemDefinition.ItemPositioningWalk3rd == MyItemPositioningEnum.TransformFromData) { num += vectord.Y; } if (handItemDefinition.ItemPositioningShoot3rd == MyItemPositioningEnum.TransformFromData) { num += vectord.Z; } if (handItemDefinition.ItemPositioningIronsight3rd == MyItemPositioningEnum.TransformFromData) { num += vectord.W; } num /= ((vectord.X + vectord.Y) + vectord.Z) + vectord.W; double num2 = 0.0; if (handItemDefinition.ItemPositioning3rd != MyItemPositioningEnum.TransformFromAnim) { num2 += vectord.X; } if (handItemDefinition.ItemPositioningWalk3rd != MyItemPositioningEnum.TransformFromAnim) { num2 += vectord.Y; } if (handItemDefinition.ItemPositioningShoot3rd != MyItemPositioningEnum.TransformFromAnim) { num2 += vectord.Z; } if (handItemDefinition.ItemPositioningIronsight3rd != MyItemPositioningEnum.TransformFromAnim) { num2 += vectord.W; } num2 /= ((vectord.X + vectord.Y) + vectord.Z) + vectord.W; this.ApplyWeaponBouncing(handItemDefinition, ref weaponMatrixLocal, (float)(1.0 - (0.95 * vectord.W)), 0f); double *numPtr2 = (double *)ref xd.M43; numPtr2[0] += (0.5 * weaponMatrixLocal.M43) * Math.Max(0.0, xd.M32); double *numPtr3 = (double *)ref xd.M42; numPtr3[0] += (0.5 * weaponMatrixLocal.M42) * Math.Max(0.0, xd.M32); double *numPtr4 = (double *)ref xd.M42; numPtr4[0] -= 0.25 * Math.Max(0.0, xd.M32); double *numPtr5 = (double *)ref xd.M43; numPtr5[0] -= 0.05 * Math.Min(0.0, xd.M32); double *numPtr6 = (double *)ref xd.M41; numPtr6[0] -= 0.25 * Math.Max(0.0, xd.M32); MatrixD xd8 = weaponMatrixLocal * xd; MyEngineerToolBase currentWeapon = base.Character.CurrentWeapon as MyEngineerToolBase; if (currentWeapon != null) { currentWeapon.SensorDisplacement = (Vector3) - weaponMatrixLocal.Translation; } double amount = (num * this.m_currentAnimationToIkTime) / ((double)this.m_animationToIKDelay); MatrixD weaponAnimMatrix = MatrixD.Lerp(xd6, xd8, amount); this.UpdateScattering(ref weaponAnimMatrix, handItemDefinition); this.ApplyBackkick(ref weaponAnimMatrix); MatrixD matrix = weaponAnimMatrix * base.Character.WorldMatrix; this.GraphicalPositionWorld = matrix.Translation; this.ArmsIkWeight = (float)num2; ((MyEntity)base.Character.CurrentWeapon).WorldMatrix = matrix; if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW && MyDebugDrawSettings.DEBUG_DRAW_CHARACTER_TOOLS) { MyDebugDrawHelper.DrawNamedColoredAxis(xd6 * base.Character.WorldMatrix, 0.25f, "weapon anim " + (100.0 - (100.0 * amount)) + "%", new Color?(Color.Orange)); MyDebugDrawHelper.DrawNamedColoredAxis(xd8 * base.Character.WorldMatrix, 0.25f, "weapon data " + (100.0 * amount) + "%", new Color?(Color.Magenta)); MyDebugDrawHelper.DrawNamedColoredAxis(matrix, 0.25f, "weapon final", new Color?(Color.White)); } }