예제 #1
0
        private void UpdateLogicalWeaponPosition()
        {
            Vector3 vector;

            if (base.Character.IsCrouching)
            {
                vector = new Vector3(0f, base.Character.Definition.CharacterCollisionCrouchHeight - (base.Character.Definition.CharacterHeadHeight * 0.5f), 0f);
            }
            else
            {
                vector = new Vector3(0f, base.Character.Definition.CharacterCollisionHeight - (base.Character.Definition.CharacterHeadHeight * 0.5f), 0f);
            }
            Vector3 weaponIronsightTranslation = m_weaponIronsightTranslation;

            if (base.Character.CurrentWeapon is MyEngineerToolBase)
            {
                Vector3 toolIronsightTranslation = m_toolIronsightTranslation;
            }
            this.LogicalPositionLocalSpace = vector;
            this.LogicalPositionWorld      = Vector3D.Transform(this.LogicalPositionLocalSpace, base.Character.PositionComp.WorldMatrix);
            this.LogicalOrientationWorld   = base.Character.ShootDirection;
            this.LogicalCrosshairPoint     = this.LogicalPositionWorld + (this.LogicalOrientationWorld * 2000.0);
            if (base.Character.CurrentWeapon != null)
            {
                MyEngineerToolBase currentWeapon = base.Character.CurrentWeapon as MyEngineerToolBase;
                if (currentWeapon != null)
                {
                    currentWeapon.UpdateSensorPosition();
                }
                else
                {
                    MyHandDrill drill = base.Character.CurrentWeapon as MyHandDrill;
                    if (drill != null)
                    {
                        drill.WorldPositionChanged(null);
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Update logical weapon position (model of the weapon will be placed there, bullet will spawn on logical position).
        /// </summary>
        private void UpdateLogicalWeaponPosition()
        {
            Vector3 templogicalPositionLocalSpace;

            // head position
            if (Character.IsCrouching)
            {
                templogicalPositionLocalSpace = new Vector3(0, Character.Definition.CharacterCollisionCrouchHeight - Character.Definition.CharacterHeadHeight, 0);
            }
            else
            {
                templogicalPositionLocalSpace = new Vector3(0, Character.Definition.CharacterCollisionHeight - Character.Definition.CharacterHeadHeight, 0);
            }

            // fetch ironsight position
            Vector3 ironsightLocation = m_weaponIronsightTranslation;

            if (Character.CurrentWeapon is MyEngineerToolBase)
            {
                ironsightLocation = m_toolIronsightTranslation;
            }

            // hand item position
            var handItemDef = Character.HandItemDefinition;

            if (handItemDef != null)
            {
                templogicalPositionLocalSpace += Character.ZoomMode == MyZoomModeEnum.IronSight ? ironsightLocation : handItemDef.ItemShootLocation.Translation;
            }

            templogicalPositionLocalSpace.Z = 0;

            // store results
            LogicalPositionLocalSpace = templogicalPositionLocalSpace;
            LogicalPositionWorld      = Vector3D.Transform(LogicalPositionLocalSpace, Character.PositionComp.WorldMatrix);

            var  jetpack = Character.JetpackComp;
            bool flying  = jetpack != null && jetpack.Running;

            float headRotXRads = MathHelper.ToRadians(Character.HeadLocalXAngle);

            if (!flying)
            {
                LogicalOrientationWorld = Character.PositionComp.WorldMatrix.Forward * Math.Cos(headRotXRads)
                                          + Character.PositionComp.WorldMatrix.Up * Math.Sin(headRotXRads);
            }
            else
            {
                LogicalOrientationWorld = Character.PositionComp.WorldMatrix.Forward;
            }

            LogicalCrosshairPoint = LogicalPositionWorld + LogicalOrientationWorld * 2000;

            if (Character.CurrentWeapon != null && Character.ControllerInfo.IsLocallyControlled() == false)
            {
                // MZ fix: weapon position not updated on DS
                MyEngineerToolBase tool = Character.CurrentWeapon as MyEngineerToolBase;
                if (tool != null)
                {
                    tool.UpdateSensorPosition();
                }
                else
                {
                    MyHandDrill drill = Character.CurrentWeapon as MyHandDrill;
                    if (drill != null)
                    {
                        drill.WorldPositionChanged(null);
                    }
                }
            }
        }