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); } } } }
/// <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); } } } }