示例#1
0
        public MyEngineerToolBase(MyHandItemDefinition definition, float toolDistance, int cooldownMs)
        {
            ToolCooldownMs       = cooldownMs;
            m_toolActionDistance = toolDistance;
            m_handItemDef        = definition;
            System.Diagnostics.Debug.Assert(definition != null, "Missing definition for tool!");
            if (definition != null)
            {
                m_physItemDef = MyDefinitionManager.Static.GetPhysicalItemForHandItem(definition.Id);
                m_gunBase     = new MyToolBase(m_handItemDef.MuzzlePosition, WorldMatrix);
            }
            else
            {
                m_gunBase = new MyToolBase(Vector3.Zero, WorldMatrix);
            }
            m_activated  = false;
            m_wasPowered = false;

            NeedsUpdate      = MyEntityUpdateEnum.EACH_FRAME;
            Render.NeedsDraw = true;

            (PositionComp as MyPositionComponent).WorldPositionChanged = WorldPositionChanged;
            Render = new Components.MyRenderComponentEngineerTool();
            AddDebugRenderComponent(new MyDebugRenderComponentEngineerTool(this));
        }
示例#2
0
        /// <summary>
        /// Update and get current weights of the weapon variants.
        /// </summary>
        /// <returns>Weights. Normalized.</returns>
        Vector4D UpdateAndGetWeaponVariantWeights(MyHandItemDefinition handItemDefinition)
        {
            float characterSpeed;

            Character.AnimationController.Variables.GetValue(MyAnimationVariableStorageHints.StrIdSpeed, out characterSpeed);
            bool isWalkingState = MyCharacter.IsRunningState(Character.GetCurrentMovementState()) && characterSpeed > Character.Definition.MaxWalkSpeed;
            bool isShooting     = Character.IsShooting(MyShootActionEnum.PrimaryAction) && (!Character.IsSprinting);
            bool isInIronSight  = Character.ZoomMode == MyZoomModeEnum.IronSight && (!Character.IsSprinting);

            float deltaW      = MyEngineConstants.UPDATE_STEP_SIZE_IN_SECONDS / handItemDefinition.BlendTime;
            float deltaShootW = MyEngineConstants.UPDATE_STEP_SIZE_IN_SECONDS / handItemDefinition.ShootBlend;

            // blend into the current variant
            // if currently shooting/ironsight -> use "shooting" blend speed
            m_weaponPositionVariantWeightCounters.X += !isWalkingState && !isShooting && !isInIronSight ? deltaW : (isShooting || isInIronSight ? -deltaShootW : -deltaW);
            m_weaponPositionVariantWeightCounters.Y += isWalkingState && !isShooting && !isInIronSight ? deltaW : (isShooting || isInIronSight ? -deltaShootW : -deltaW);
            m_weaponPositionVariantWeightCounters.Z += isShooting && !isInIronSight ? deltaShootW : (isInIronSight ? -deltaShootW : -deltaW);
            m_weaponPositionVariantWeightCounters.W += isInIronSight ? deltaShootW : (isShooting ? -deltaShootW : -deltaW);
            m_weaponPositionVariantWeightCounters    = Vector4.Clamp(m_weaponPositionVariantWeightCounters, Vector4.Zero, Vector4.One);

            Vector4D rtnWeights = new Vector4D(MathHelper.SmoothStep(0, 1, m_weaponPositionVariantWeightCounters.X),
                                               MathHelper.SmoothStep(0, 1, m_weaponPositionVariantWeightCounters.Y),
                                               MathHelper.SmoothStep(0, 1, m_weaponPositionVariantWeightCounters.Z),
                                               MathHelper.SmoothStep(0, 1, m_weaponPositionVariantWeightCounters.W));

            double weightSum = rtnWeights.X + rtnWeights.Y + rtnWeights.Z + rtnWeights.W;

            return(rtnWeights / weightSum);
        }
示例#3
0
 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);
         }
     }
 }
示例#4
0
        private void UpdateScattering(ref MatrixD weaponAnimMatrix, MyHandItemDefinition handItemDefinition)
        {
            MyEngineerToolBase currentWeapon = base.Character.CurrentWeapon as MyEngineerToolBase;
            bool flag = false;

            if (handItemDefinition.ScatterSpeed > 0f)
            {
                bool hasHitBlock = false;
                if (currentWeapon != null)
                {
                    hasHitBlock = currentWeapon.HasHitBlock;
                }
                flag = this.IsShooting & hasHitBlock;
                if (!flag && (this.m_currentScatterToAnimRatio >= 1f))
                {
                    this.m_currentScatterBlend = 0f;
                }
                else
                {
                    if (this.m_currentScatterBlend == 0f)
                    {
                        this.m_lastScatterPos = Vector3.Zero;
                    }
                    if (this.m_currentScatterBlend == handItemDefinition.ScatterSpeed)
                    {
                        this.m_lastScatterPos      = this.m_currentScatterPos;
                        this.m_currentScatterBlend = 0f;
                    }
                    if ((this.m_currentScatterBlend == 0f) || (this.m_currentScatterBlend == handItemDefinition.ScatterSpeed))
                    {
                        this.m_currentScatterPos = new Vector3(MyUtils.GetRandomFloat(-handItemDefinition.ShootScatter.X / 2f, handItemDefinition.ShootScatter.X / 2f), MyUtils.GetRandomFloat(-handItemDefinition.ShootScatter.Y / 2f, handItemDefinition.ShootScatter.Y / 2f), MyUtils.GetRandomFloat(-handItemDefinition.ShootScatter.Z / 2f, handItemDefinition.ShootScatter.Z / 2f));
                    }
                    this.m_currentScatterBlend += 0.01f;
                    if (this.m_currentScatterBlend > handItemDefinition.ScatterSpeed)
                    {
                        this.m_currentScatterBlend = handItemDefinition.ScatterSpeed;
                    }
                    Vector3 vector = Vector3.Lerp(this.m_lastScatterPos, this.m_currentScatterPos, this.m_currentScatterBlend / handItemDefinition.ScatterSpeed);
                    weaponAnimMatrix.Translation += (1f - this.m_currentScatterToAnimRatio) * vector;
                }
                this.m_currentScatterToAnimRatio += flag ? -0.1f : 0.1f;
                if (this.m_currentScatterToAnimRatio > 1f)
                {
                    this.m_currentScatterToAnimRatio = 1f;
                }
                else if (this.m_currentScatterToAnimRatio < 0f)
                {
                    this.m_currentScatterToAnimRatio = 0f;
                }
            }
        }
示例#5
0
        private void TransformItem(MyHandItemDefinition item)
        {
            //SwapYZ(ref item.ItemLocation);
            //SwapYZ(ref item.ItemLocation3rd);
            //SwapYZ(ref item.ItemShootLocation);
            //SwapYZ(ref item.ItemShootLocation3rd);
            //SwapYZ(ref item.ItemWalkingLocation);
            //SwapYZ(ref item.ItemWalkingLocation3rd);
            ////SwapYZ(ref CurrentSelectedItem.LeftHand);
            ////SwapYZ(ref CurrentSelectedItem.RightHand);
            //SwapYZ(ref item.MuzzlePosition);


            Reorientate(ref item.LeftHand);
            Reorientate(ref item.RightHand);
        }
示例#6
0
        /// <summary>
        /// Apply bouncing movement on weapon.
        /// </summary>
        /// <param name="handItemDefinition">definition of hand item</param>
        /// <param name="weaponMatrixLocal">current weapon matrix (character local space)</param>
        private void ApplyWeaponBouncing(MyHandItemDefinition handItemDefinition, ref MatrixD weaponMatrixLocal, float fpsBounceMultiplier)
        {
            if (!Character.AnimationController.CharacterBones.IsValidIndex(Character.SpineBoneIndex))
            {
                return;
            }

            bool isLocallyControlled = Character.ControllerInfo.IsLocallyControlled();
            bool isInFirstPerson     = (Character.IsInFirstPersonView || Character.ForceFirstPersonCamera) && isLocallyControlled;

            var     spineBone = Character.AnimationController.CharacterBones[Character.SpineBoneIndex];
            Vector3 spinePos  = spineBone.AbsoluteTransform.Translation - Character.AnimationController.CharacterBonesSorted[0].Translation;

            m_spineRestPositionX.Add(spinePos.X);
            m_spineRestPositionY.Add(spinePos.Y);
            m_spineRestPositionZ.Add(spinePos.Z);
            Vector3 spineAbsRigPos = spineBone.GetAbsoluteRigTransform().Translation;
            Vector3 spineRestPos   = new Vector3(spineAbsRigPos.X, m_spineRestPositionY.Get(), spineAbsRigPos.Z);

            Vector3 bounceOffset = (spinePos - spineRestPos) * fpsBounceMultiplier;

            bounceOffset.Z        = isInFirstPerson ? bounceOffset.Z : 0;
            m_sprintStatusWeight += Character.IsSprinting ? m_sprintStatusGainSpeed : -m_sprintStatusGainSpeed;
            m_sprintStatusWeight  = MathHelper.Clamp(m_sprintStatusWeight, 0, 1);
            if (isInFirstPerson)
            {
                // multiply only when in first person
                bounceOffset   *= 1 + Math.Max(0, handItemDefinition.RunMultiplier - 1) * m_sprintStatusWeight;
                bounceOffset.X *= handItemDefinition.XAmplitudeScale;
                bounceOffset.Y *= handItemDefinition.YAmplitudeScale;
                bounceOffset.Z *= handItemDefinition.ZAmplitudeScale;
            }
            else
            {
                bounceOffset *= handItemDefinition.AmplitudeMultiplier3rd;
            }

            bounceOffset.Z += m_backkickPos;

            weaponMatrixLocal.Translation += bounceOffset;
        }
        public void Init(MyObjectBuilder_EntityBase builder, MyHandItemDefinition definition)
        {
            m_handItemDef = definition;
            System.Diagnostics.Debug.Assert(definition != null, "Missing definition for tool!");
            if (definition != null)
            {
                m_physItemDef = MyDefinitionManager.Static.GetPhysicalItemForHandItem(definition.Id);
                m_gunBase     = new MyToolBase(m_handItemDef.MuzzlePosition, WorldMatrix);
            }
            else
            {
                m_gunBase = new MyToolBase(Vector3.Zero, WorldMatrix);
            }
            base.Init(builder);

            if (PhysicalObject != null)
            {
                PhysicalObject.GunEntity = builder;
            }
            if ((definition as MyEngineerToolBaseDefinition) != null)
            {
                m_speedMultiplier    = (m_handItemDef as MyEngineerToolBaseDefinition).SpeedMultiplier;
                m_distanceMultiplier = (definition as MyEngineerToolBaseDefinition).DistanceMultiplier;
            }
            MyDrillSensorRayCast raycaster = new MyDrillSensorRayCast(0f, DEFAULT_REACH_DISTANCE * m_distanceMultiplier);

            m_raycastComponent = new MyCasterComponent(raycaster);
            m_raycastComponent.SetPointOfReference(m_gunBase.GetMuzzleWorldPosition());
            Components.Add <MyCasterComponent>(m_raycastComponent);

            var sinkComp = new MyResourceSinkComponent();

            sinkComp.Init(
                MyStringHash.GetOrCompute("Utility"),
                MyEnergyConstants.REQUIRED_INPUT_ENGINEERING_TOOL,
                CalculateRequiredPower);
            SinkComp       = sinkComp;
            m_soundEmitter = new MyEntity3DSoundEmitter(this);
        }
示例#8
0
        private void UpdateGraphicalWeaponPosition()
        {
            MyAnimationControllerComponent animationController = base.Character.AnimationController;
            MyHandItemDefinition           handItemDefinition  = base.Character.HandItemDefinition;

            if (((handItemDefinition != null) && (base.Character.CurrentWeapon != null)) && (animationController.CharacterBones != null))
            {
                bool flag  = base.Character.ControllerInfo.IsLocallyControlled() && ReferenceEquals(MySession.Static.CameraController, base.Character);
                bool flag2 = (base.Character.IsInFirstPersonView || base.Character.ForceFirstPersonCamera) & flag;
                if (MyFakes.FORCE_CHARTOOLS_1ST_PERSON)
                {
                    flag2 = true;
                }
                bool jetpackRunning = base.Character.JetpackRunning;
                if (this.m_lastStateWasFalling & jetpackRunning)
                {
                    this.m_currentAnimationToIkTime = this.m_animationToIKDelay * ((float)Math.Cos((double)(base.Character.HeadLocalXAngle - this.m_lastLocalRotX)));
                }
                if (this.m_lastStateWasCrouching != base.Character.IsCrouching)
                {
                    this.m_suppressBouncingForTimeSec = m_suppressBouncingDelay;
                }
                if (this.m_suppressBouncingForTimeSec > 0f)
                {
                    this.m_spineRestPositionX.Clear();
                    this.m_spineRestPositionY.Clear();
                    this.m_spineRestPositionZ.Clear();
                }
                this.m_lastLocalRotX = base.Character.HeadLocalXAngle;
                if (flag2)
                {
                    this.UpdateGraphicalWeaponPosition1st(handItemDefinition);
                }
                else
                {
                    this.UpdateGraphicalWeaponPosition3rd(handItemDefinition);
                }
            }
        }
 protected MyBlockPlacerBase(MyHandItemDefinition definition)
     : base(500)
 {
     m_definition = definition;
 }
示例#10
0
 protected virtual void handItemsCombo_ItemSelected()
 {
     CurrentSelectedItem = m_handItemDefinitions[(int)m_handItemsCombo.GetSelectedKey()];;
 }
示例#11
0
        /// <summary>
        /// Update shown position of the weapon.
        /// </summary>
        private void UpdateGraphicalWeaponPosition()
        {
            var animController = Character.AnimationController;
            MyHandItemDefinition handItemDefinition = Character.HandItemDefinition;

            if (handItemDefinition == null || Character.CurrentWeapon == null || animController.CharacterBones == null)
            {
                return;
            }
            // ---------

            // gather useful variables
            bool isLocallyControlled = Character.ControllerInfo.IsLocallyControlled();
            bool isInFirstPerson     = (Character.IsInFirstPersonView || Character.ForceFirstPersonCamera) && isLocallyControlled;
            var  jetpack             = Character.JetpackComp;
            bool flying = jetpack != null && jetpack.Running;

            if (m_lastStateWasFalling && flying)
            {
                m_currentAnimationToIkTime = m_animationToIKDelay * (float)Math.Cos(Character.HeadLocalXAngle - m_lastLocalRotX);
            }
            if (m_lastStateWasCrouching != Character.IsCrouching)
            {
                m_suppressBouncingForTimeSec = m_suppressBouncingDelay;
            }
            if (m_suppressBouncingForTimeSec > 0)
            {
                m_spineRestPositionX.Clear();
                m_spineRestPositionY.Clear();
                m_spineRestPositionZ.Clear();
            }

            m_lastLocalRotX = Character.HeadLocalXAngle;
            // get head matrix
            MatrixD weaponMatrixPositioned = Character.GetHeadMatrix(false, !flying, false, true, preferLocalOverSync: true) * Character.PositionComp.WorldMatrixInvScaled;

            if (!isInFirstPerson && animController.CharacterBones.IsValidIndex(Character.HeadBoneIndex))
            {
                // apply feet ik (head bone is stabilized)
                weaponMatrixPositioned.M42 += animController.CharacterBonesSorted[0].Translation.Y;
            }

            // ---------

            // mix positioning matrices (variants: stand/walk/shoot/ironsight), all in character local space

            // standing (IK)
            MatrixD standingMatrix = isInFirstPerson ? handItemDefinition.ItemLocation : handItemDefinition.ItemLocation3rd;
            // walking (IK)
            MatrixD walkingMatrix = isInFirstPerson ? handItemDefinition.ItemWalkingLocation : handItemDefinition.ItemWalkingLocation3rd;
            // shooting (IK)
            MatrixD shootingMatrix = isInFirstPerson ? handItemDefinition.ItemShootLocation : handItemDefinition.ItemShootLocation3rd;
            // ironsight (IK)
            MatrixD ironsightMatrix = handItemDefinition.ItemIronsightLocation;
            // animation pose
            MatrixD weaponAnimMatrix = animController.CharacterBones.IsValidIndex(Character.WeaponBone)
                ? GetWeaponRelativeMatrix() * animController.CharacterBones[Character.WeaponBone].AbsoluteTransform
                : GetWeaponRelativeMatrix();

            ironsightMatrix.Translation = m_weaponIronsightTranslation;
            if (Character.CurrentWeapon is MyEngineerToolBase)
            {
                ironsightMatrix.Translation = m_toolIronsightTranslation;
            }
            // get weights of all state variants
            Vector4D variantWeights = UpdateAndGetWeaponVariantWeights(handItemDefinition);
            // interpolate matrices to get the resulting one
            MatrixD weaponMatrixLocal = variantWeights.X * standingMatrix
                                        + variantWeights.Y * walkingMatrix
                                        + variantWeights.Z * shootingMatrix
                                        + variantWeights.W * ironsightMatrix;

            weaponMatrixLocal = MatrixD.Normalize(weaponMatrixLocal);

            // weapon positioning - IK weight
            double weaponDataPosWeight = 0;

            if (handItemDefinition.ItemPositioning == MyItemPositioningEnum.TransformFromData && isInFirstPerson ||
                handItemDefinition.ItemPositioning3rd == MyItemPositioningEnum.TransformFromData && !isInFirstPerson)
            {
                weaponDataPosWeight += variantWeights.X;
            }
            if (handItemDefinition.ItemPositioningWalk == MyItemPositioningEnum.TransformFromData && isInFirstPerson ||
                handItemDefinition.ItemPositioningWalk3rd == MyItemPositioningEnum.TransformFromData && !isInFirstPerson)
            {
                weaponDataPosWeight += variantWeights.Y;
            }
            if (handItemDefinition.ItemPositioningShoot == MyItemPositioningEnum.TransformFromData && isInFirstPerson ||
                handItemDefinition.ItemPositioningShoot3rd == MyItemPositioningEnum.TransformFromData && !isInFirstPerson)
            {
                weaponDataPosWeight += variantWeights.Z;
            }

            weaponDataPosWeight += variantWeights.W;
            weaponDataPosWeight /= variantWeights.X + variantWeights.Y + variantWeights.Z + variantWeights.W;
            // now computing hand IK weight
            double armsIkWeight = 0;

            if (handItemDefinition.ItemPositioning != MyItemPositioningEnum.TransformFromAnim && isInFirstPerson ||
                handItemDefinition.ItemPositioning3rd != MyItemPositioningEnum.TransformFromAnim && !isInFirstPerson)
            {
                armsIkWeight += variantWeights.X;
            }
            if (handItemDefinition.ItemPositioningWalk != MyItemPositioningEnum.TransformFromAnim && isInFirstPerson ||
                handItemDefinition.ItemPositioningWalk3rd != MyItemPositioningEnum.TransformFromAnim && !isInFirstPerson)
            {
                armsIkWeight += variantWeights.Y;
            }
            if (handItemDefinition.ItemPositioningShoot != MyItemPositioningEnum.TransformFromAnim && isInFirstPerson ||
                handItemDefinition.ItemPositioningShoot3rd != MyItemPositioningEnum.TransformFromAnim && !isInFirstPerson)
            {
                armsIkWeight += variantWeights.Z;
            }
            armsIkWeight /= variantWeights.X + variantWeights.Y + variantWeights.Z + variantWeights.W;

            ApplyWeaponBouncing(handItemDefinition, ref weaponMatrixLocal, (float)(1.0 - 0.95 * variantWeights.W));

            // apply head transform on top of it
            if (!isInFirstPerson)
            {
                weaponMatrixPositioned.M43 += 0.5 * weaponMatrixLocal.M43 * Math.Max(0, weaponMatrixPositioned.M32);   // offset not to interfere with body
                weaponMatrixPositioned.M42 += 0.5 * weaponMatrixLocal.M42 * Math.Max(0, weaponMatrixPositioned.M32);   // offset not to interfere with body
            }

            MatrixD weaponMatrixPositionedLocal = weaponMatrixLocal * weaponMatrixPositioned;
            // displace sensor (maybe move to logical part? does not seem to be used at all)
            var characterWeaponEngToolBase = Character.CurrentWeapon as MyEngineerToolBase;

            if (characterWeaponEngToolBase != null)
            {
                characterWeaponEngToolBase.SensorDisplacement = -weaponMatrixLocal.Translation;
            }

            // mix plain animation with (anim+ik) result - for example, medieval uses plain animations
            double  ikRatio          = weaponDataPosWeight * m_currentAnimationToIkTime / m_animationToIKDelay;
            MatrixD weaponFinalWorld = MatrixD.Lerp(weaponAnimMatrix, weaponMatrixPositionedLocal, ikRatio) * Character.WorldMatrix;

            // propagate result to fields
            GraphicalPositionWorld = weaponFinalWorld.Translation;
            ArmsIkWeight           = (float)armsIkWeight;
            ((MyEntity)Character.CurrentWeapon).WorldMatrix = weaponFinalWorld;

            if (MyDebugDrawSettings.ENABLE_DEBUG_DRAW)
            {
                MyRenderProxy.DebugDrawAxis(weaponFinalWorld, 0.5f, false);
            }
        }
示例#12
0
 protected MyBlockPlacerBase(MyHandItemDefinition definition)
     : base(definition, 0.5f, 500)
 {
 }
示例#13
0
        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));
            }
        }
示例#14
0
        private unsafe Vector4D UpdateAndGetWeaponVariantWeights(MyHandItemDefinition handItemDefinition)
        {
            float num;
            int   num1;
            int   num5;
            float single1;
            float single2;
            float single3;

            base.Character.AnimationController.Variables.GetValue(MyAnimationVariableStorageHints.StrIdSpeed, out num);
            if (base.Character.IsSprinting || MyCharacter.IsRunningState(base.Character.GetPreviousMovementState()))
            {
                num1 = (int)(num > base.Character.Definition.MaxWalkSpeed);
            }
            else
            {
                num1 = 0;
            }
            bool flag = (bool)num1;

            if (base.Character.IsShooting(MyShootActionEnum.PrimaryAction) || ((base.Character.ZoomMode == MyZoomModeEnum.Classic) && (base.Character.IsShooting(MyShootActionEnum.SecondaryAction) || base.Character.IsShooting(MyShootActionEnum.TertiaryAction))))
            {
                num5 = (int)!base.Character.IsSprinting;
            }
            else
            {
                num5 = 0;
            }
            this.IsShooting    = (bool)num5;
            this.IsInIronSight = (base.Character.ZoomMode == MyZoomModeEnum.IronSight) && !base.Character.IsSprinting;
            this.ShouldSupressShootAnimation = base.Character.ShouldSupressShootAnimation;
            bool   isShooting    = this.IsShooting;
            bool   isInIronSight = this.IsInIronSight;
            float  num2          = 0.01666667f / handItemDefinition.BlendTime;
            float  num3          = 0.01666667f / handItemDefinition.ShootBlend;
            float *singlePtr1    = &this.m_weaponPositionVariantWeightCounters.X;

            if ((flag || isShooting) || isInIronSight)
            {
                single1 = (isShooting | isInIronSight) ? -num3 : -num2;
            }
            else
            {
                single1 = num2;
            }
            *(singlePtr1[0]) = singlePtr1 + single1;
            float *singlePtr2 = (float *)ref this.m_weaponPositionVariantWeightCounters.Y;

            if ((!flag || isShooting) || isInIronSight)
            {
                single2 = (isShooting | isInIronSight) ? -num3 : -num2;
            }
            else
            {
                single2 = num2;
            }
            singlePtr2[0] += single2;
            float *singlePtr3 = (float *)ref this.m_weaponPositionVariantWeightCounters.Z;

            if (!isShooting || isInIronSight)
            {
                single3 = isInIronSight ? -num3 : -num2;
            }
            else
            {
                single3 = num3;
            }
            singlePtr3[0] += single3;
            float *singlePtr4 = (float *)ref this.m_weaponPositionVariantWeightCounters.W;

            singlePtr4[0] += isInIronSight ? num3 : (isShooting ? -num3 : -num2);
            this.m_weaponPositionVariantWeightCounters = Vector4.Clamp(this.m_weaponPositionVariantWeightCounters, Vector4.Zero, Vector4.One);
            Vector4D vectord = new Vector4D((double)MathHelper.SmoothStep(0f, 1f, this.m_weaponPositionVariantWeightCounters.X), (double)MathHelper.SmoothStep(0f, 1f, this.m_weaponPositionVariantWeightCounters.Y), (double)MathHelper.SmoothStep(0f, 1f, this.m_weaponPositionVariantWeightCounters.Z), (double)MathHelper.SmoothStep(0f, 1f, this.m_weaponPositionVariantWeightCounters.W));

            return(vectord / (((vectord.X + vectord.Y) + vectord.Z) + vectord.W));
        }