diff --git a/Data/Scripts/CoreSystems/Ai/AiConstruct.cs b/Data/Scripts/CoreSystems/Ai/AiConstruct.cs index 95a4dc32..c9350525 100644 --- a/Data/Scripts/CoreSystems/Ai/AiConstruct.cs +++ b/Data/Scripts/CoreSystems/Ai/AiConstruct.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using CoreSystems.Platform; using CoreSystems.Projectiles; using Sandbox.Game.Entities; @@ -59,20 +60,40 @@ public void RegisterSubGrid(MyCubeGrid grid) grid.OnFatBlockAdded += FatBlockAdded; grid.OnFatBlockRemoved += FatBlockRemoved; - SubGridsRegistered[grid] = byte.MaxValue; - - foreach (var cube in grid.GetFatBlocks()) { - - var battery = cube as MyBatteryBlock; - var stator = cube as IMyMotorStator; - var tool = cube as IMyShipToolBase; - var offense = cube as IMyOffensiveCombatBlock; + //BDC Temp debugging + var tempBlockArray = grid.GetFatBlocks().ToArray(); + try + { + foreach (var cube in grid.GetFatBlocks()) + { + var battery = cube as MyBatteryBlock; + var stator = cube as IMyMotorStator; + var tool = cube as IMyShipToolBase; + var offense = cube as IMyOffensiveCombatBlock; - if (battery != null || cube.HasInventory || stator != null || tool != null || offense != null) + if (battery != null || cube.HasInventory || stator != null || tool != null || offense != null) + FatBlockAdded(cube); + } + } + catch (Exception ex) + { + var modifiedBlockArray = grid.GetFatBlocks(); + var msg = $"Original GetFatBlocks contained {tempBlockArray.Length} items, modified contains {modifiedBlockArray.Count}"; + foreach (var original in tempBlockArray) + { + if(!modifiedBlockArray.Contains(original)) + msg += $"Block {original.DisplayName} was removed \n"; + } + foreach (var modified in modifiedBlockArray) { - FatBlockAdded(cube); + if (!tempBlockArray.Contains(modified)) + msg += $"Block {modified.DisplayName} was added \n"; } + Log.Line(msg); + MyLog.Default.WriteLine(msg); + throw ex; } + SubGridsRegistered[grid] = byte.MaxValue; } public void UnRegisterSubGrid(MyCubeGrid grid) diff --git a/Data/Scripts/CoreSystems/Ai/AiEvents.cs b/Data/Scripts/CoreSystems/Ai/AiEvents.cs index 6dfe58d2..fd8d5832 100644 --- a/Data/Scripts/CoreSystems/Ai/AiEvents.cs +++ b/Data/Scripts/CoreSystems/Ai/AiEvents.cs @@ -8,6 +8,7 @@ using VRage.Collections; using VRage.Game.Entity; using VRage.Game.ModAPI; +using VRage.Utils; using VRageMath; namespace CoreSystems.Support @@ -186,6 +187,10 @@ internal void FatBlockAdded(MyCubeBlock cube) if (Session.I.IsServer) { cube.CubeGrid.RemoveBlock(cube.SlimBlock, true); + //BDC Temp debugging + var msg = $"WeaponCore Removed {cube.BlockDefinition.Id.SubtypeId} block due to placement violations"; + Log.Line(msg); + MyLog.Default.WriteLine(msg); } } } diff --git a/Data/Scripts/CoreSystems/Ai/AiTargeting.cs b/Data/Scripts/CoreSystems/Ai/AiTargeting.cs index f6ddbd40..5f9c00d3 100644 --- a/Data/Scripts/CoreSystems/Ai/AiTargeting.cs +++ b/Data/Scripts/CoreSystems/Ai/AiTargeting.cs @@ -324,7 +324,11 @@ private static bool AcquireTopMostEntity(Weapon w, ProtoWeaponOverrides overRide if (w.LastHitInfo?.HitEntity != null && (!w.System.Values.HardPoint.Other.MuzzleCheck || !w.MuzzleHitSelf())) { TargetInfo hitInfo; - if (w.LastHitInfo.HitEntity == info.Target || ai.Targets.TryGetValue((MyEntity)w.LastHitInfo.HitEntity, out hitInfo) && (hitInfo.EntInfo.Relationship == MyRelationsBetweenPlayerAndBlock.Enemies || hitInfo.EntInfo.Relationship == MyRelationsBetweenPlayerAndBlock.Neutral || hitInfo.EntInfo.Relationship == MyRelationsBetweenPlayerAndBlock.NoOwnership)) + var targMatch = w.LastHitInfo.HitEntity == info.Target; + var targOther = !targMatch && ai.Targets.TryGetValue((MyEntity)w.LastHitInfo.HitEntity, out hitInfo) && (hitInfo.EntInfo.Relationship == MyRelationsBetweenPlayerAndBlock.Enemies || hitInfo.EntInfo.Relationship == MyRelationsBetweenPlayerAndBlock.Neutral || hitInfo.EntInfo.Relationship == MyRelationsBetweenPlayerAndBlock.NoOwnership); + var targChar = !targMatch && character != null && !ai.ObstructionLookup.ContainsKey((MyEntity)w.LastHitInfo.HitEntity); + + if (targMatch || targOther || targChar) { double rayDist; Vector3D.Distance(ref weaponPos, ref targetCenter, out rayDist); diff --git a/Data/Scripts/CoreSystems/AudioVisual/AvShot.cs b/Data/Scripts/CoreSystems/AudioVisual/AvShot.cs index b1133d80..2e4ab009 100644 --- a/Data/Scripts/CoreSystems/AudioVisual/AvShot.cs +++ b/Data/Scripts/CoreSystems/AudioVisual/AvShot.cs @@ -659,7 +659,7 @@ internal void LineVariableEffects() var color = skipTracerFactionColor ? aConst.LinearTracerColor : aConst.TracerFactionColor == FactionColor.Foreground ? FgFactionColor : BgFactionColor; var segmentColor = skipSegFactionColor ? aConst.LinearSegmentColor : aConst.SegFactionColor == FactionColor.Foreground ? FgFactionColor : BgFactionColor; - if (aConst.LineColorVariance) + if (aConst.LineColorVariance && skipTracerFactionColor) { var tracerStart = aConst.LinearTracerColorStart; var tracerEnd = aConst.LinearTracerColorEnd; @@ -682,7 +682,7 @@ internal void LineVariableEffects() } } - if (aConst.SegmentColorVariance) + if (aConst.SegmentColorVariance && skipSegFactionColor) { // gross inlined random var tempX = rnd.Y; @@ -1030,21 +1030,30 @@ internal void SetupSounds(double distanceFromCameraSqr) if (AmmoDef.Const.ShotSound) { - if (distanceFromCameraSqr <= AmmoDef.Const.ShotSoundDistSqr && (IsFragment || Weapon.System.FiringSound == WeaponSystem.FiringSoundState.None)) + try //SharpDX bughunting { - FireEmitter = Session.Av.FireEmitters.Count > 0 ? Session.Av.FireEmitters.Pop() : new MyEntity3DSoundEmitter(null); - FireEmitter.CanPlayLoopSounds = true; - FireEmitter.Entity = null; - FireEmitter.SetPosition(Origin); - FireEmitter.PlaySound(AmmoDef.Const.ShotSoundPair, true); + if (distanceFromCameraSqr <= AmmoDef.Const.ShotSoundDistSqr && (IsFragment || Weapon.System.FiringSound == WeaponSystem.FiringSoundState.None)) + { + FireEmitter = Session.Av.FireEmitters.Count > 0 ? Session.Av.FireEmitters.Pop() : new MyEntity3DSoundEmitter(null); + FireEmitter.CanPlayLoopSounds = true; + FireEmitter.Entity = null; + FireEmitter.SetPosition(Origin); + FireEmitter.PlaySound(AmmoDef.Const.ShotSoundPair, true); + } + else if (Weapon.System.FiringSound == WeaponSystem.FiringSoundState.PerShot && distanceFromCameraSqr <= Weapon.System.FiringSoundDistSqr) + { + FireEmitter = Session.Av.FireEmitters.Count > 0 ? Session.Av.FireEmitters.Pop() : new MyEntity3DSoundEmitter(null); + FireEmitter.CanPlayLoopSounds = true; + FireEmitter.Entity = Weapon.Comp.CoreEntity; + FireEmitter.SetPosition(Origin); + FireEmitter.PlaySound(AmmoDef.Const.ShotSoundPair, true); + } } - else if (Weapon.System.FiringSound == WeaponSystem.FiringSoundState.PerShot && distanceFromCameraSqr <= Weapon.System.FiringSoundDistSqr) + catch (Exception e) { - FireEmitter = Session.Av.FireEmitters.Count > 0 ? Session.Av.FireEmitters.Pop() : new MyEntity3DSoundEmitter(null); - FireEmitter.CanPlayLoopSounds = true; - FireEmitter.Entity = Weapon.Comp.CoreEntity; - FireEmitter.SetPosition(Origin); - FireEmitter.PlaySound(AmmoDef.Const.ShotSoundPair, true); + MyLog.Default.Error($"Sound error with ammo: {AmmoDef.AmmoRound} from {Weapon.Comp.TerminalBlock.DisplayName} soundID {AmmoDef.Const.ShotSoundPair.SoundId} cuename {AmmoDef.Const.ShotSoundPair.GetCueName()}" + + $"FireEmitter.Entity null? {FireEmitter?.Entity == null} \n Origin: {Origin}"); + throw e; } } } diff --git a/Data/Scripts/CoreSystems/Definitions/CoreDefinitions.cs b/Data/Scripts/CoreSystems/Definitions/CoreDefinitions.cs index 1721c3c9..26043637 100644 --- a/Data/Scripts/CoreSystems/Definitions/CoreDefinitions.cs +++ b/Data/Scripts/CoreSystems/Definitions/CoreDefinitions.cs @@ -514,6 +514,7 @@ public struct LoadingDef [ProtoMember(22)] internal int MaxReloads; [ProtoMember(23)] internal bool GoHomeToReload; [ProtoMember(24)] internal bool DropTargetUntilLoaded; + [ProtoMember(25)] internal bool ProhibitCoolingWhenOff; } @@ -529,6 +530,8 @@ public struct UiDef [ProtoMember(6)] internal bool DisableStatus; [ProtoMember(7)] internal float RateOfFireMin; [ProtoMember(8)] internal bool DisableSupportingPD; + [ProtoMember(9)] internal bool ProhibitShotDelay; + [ProtoMember(10)] internal bool ProhibitBurstCount; } @@ -784,6 +787,7 @@ public struct ObjectsHitDef { [ProtoMember(1)] internal int MaxObjectsHit; [ProtoMember(2)] internal bool CountBlocks; + [ProtoMember(3)] internal bool SkipBlocksForAOE; } @@ -1084,6 +1088,7 @@ public enum EwarType Push, Pull, Tractor, + AntiSmartv2, } public enum EwarMode diff --git a/Data/Scripts/CoreSystems/Definitions/CoreSystems.cs b/Data/Scripts/CoreSystems/Definitions/CoreSystems.cs index 98cf3f43..f1cd9c31 100644 --- a/Data/Scripts/CoreSystems/Definitions/CoreSystems.cs +++ b/Data/Scripts/CoreSystems/Definitions/CoreSystems.cs @@ -176,6 +176,7 @@ public AmmoType(AmmoDef ammoDef, MyDefinitionId ammoDefinitionId, MyDefinitionId public readonly bool OnlySubSystems; public readonly bool ClosestFirst; public readonly bool DegRof; + public readonly bool ProhibitCoolingWhenOff; public readonly bool TrackProjectile; public readonly bool DisableSupportingPD; public readonly bool ScanTrackOnly; @@ -357,7 +358,7 @@ public WeaponSystem(WeaponStructure structure, MyStringHash partNameIdHash, MySt HasScope = !string.IsNullOrEmpty(Values.Assignments.Scope); AltScopeName = HasScope ? "subpart_" + Values.Assignments.Scope : string.Empty; TurretMovements(out AzStep, out ElStep, out MinAzimuth, out MaxAzimuth, out MinElevation, out MaxElevation, out HomeAzimuth, out HomeElevation, out TurretMovement); - Heat(out DegRof, out MaxHeat, out WepCoolDown); + Heat(out DegRof, out MaxHeat, out WepCoolDown, out ProhibitCoolingWhenOff); BarrelValues(out BarrelsPerShot, out ShotsPerBurst); BarrelsAv(out BarrelEffect1, out BarrelEffect2, out Barrel1AvTicks, out Barrel2AvTicks, out BarrelSpinRate, out HasBarrelRotation); Track(out ScanTrackOnly, out NonThreatsOnly, out TrackProjectile, out TrackGrids, out TrackCharacters, out TrackMeteors, out TrackNeutrals, out ScanNonThreats, out ScanThreats, out MaxTrackingTime, out MaxTrackingTicks, out TrackTopMostEntities); @@ -482,8 +483,9 @@ private void GetThreats(out HashSet set, out bool projectilesFirst, out boo projectilesOnly = projectilesFirst && Values.Targeting.Threats.Length == 1; } - private void Heat(out bool degRof, out int maxHeat, out float wepCoolDown) + private void Heat(out bool degRof, out int maxHeat, out float wepCoolDown, out bool coolWhenOff) { + coolWhenOff = Values.HardPoint.Loading.ProhibitCoolingWhenOff; degRof = Values.HardPoint.Loading.DegradeRof; maxHeat = Values.HardPoint.Loading.MaxHeat; wepCoolDown = Values.HardPoint.Loading.Cooldown; diff --git a/Data/Scripts/CoreSystems/Definitions/SerializedConfigs/AmmoConstants.cs b/Data/Scripts/CoreSystems/Definitions/SerializedConfigs/AmmoConstants.cs index 7e115a92..b74402a4 100644 --- a/Data/Scripts/CoreSystems/Definitions/SerializedConfigs/AmmoConstants.cs +++ b/Data/Scripts/CoreSystems/Definitions/SerializedConfigs/AmmoConstants.cs @@ -344,9 +344,6 @@ internal AmmoConstants(WeaponSystem.AmmoType ammo, WeaponDefinition wDef, Weapon else if (ammo.AmmoDef.Ejection.Type == AmmoDef.EjectionDef.SpawnType.Particle && !string.IsNullOrEmpty(ammo.AmmoDef.AmmoGraphics.Particles.Eject.Name)) HasEjectEffect = true; - if (AmmoItem.Content != null && !Session.I.AmmoItems.ContainsKey(AmmoItem.ItemId)) - Session.I.AmmoItems[AmmoItem.ItemId] = AmmoItem; - var fragGuidedAmmo = false; var fragAntiSmart = false; var fragTargetOverride = false; @@ -371,7 +368,7 @@ internal AmmoConstants(WeaponSystem.AmmoType ammo, WeaponDefinition wDef, Weapon if (hasTimed) fragHasTimedSpawn = true; - if (ammoType.Ewar.Type == EwarType.AntiSmart) + if (ammoType.Ewar.Type == EwarType.AntiSmart || ammoType.Ewar.Type == EwarType.AntiSmartv2) fragAntiSmart = true; if (hasGuidance && ammoType.Trajectory.Smarts.OverideTarget) @@ -890,7 +887,7 @@ private void ComputeAmmoPattern(WeaponSystem.AmmoType ammo, WeaponSystem system, if (!patternGuidedAmmo && hasGuidance) patternGuidedAmmo = true; - if (!patternAntiSmart && ammoDef.Ewar.Type == EwarType.AntiSmart) + if (!patternAntiSmart && (ammoDef.Ewar.Type == EwarType.AntiSmart || ammoDef.Ewar.Type == EwarType.AntiSmartv2)) patternAntiSmart = true; if (hasGuidance && ammoDef.Trajectory.Smarts.OverideTarget) patternTargetOverride = true; @@ -905,7 +902,7 @@ private void ComputeAmmoPattern(WeaponSystem.AmmoType ammo, WeaponSystem system, } hasGuidedAmmo = fragGuidedAmmo || patternGuidedAmmo || ammo.AmmoDef.Trajectory.Guidance != TrajectoryDef.GuidanceType.None; - hasAntiSmart = fragAntiSmart || patternAntiSmart || ammo.AmmoDef.Ewar.Type == EwarType.AntiSmart; + hasAntiSmart = fragAntiSmart || patternAntiSmart || ammo.AmmoDef.Ewar.Type == EwarType.AntiSmart || ammo.AmmoDef.Ewar.Type == EwarType.AntiSmartv2; hasTargetOverride = fragTargetOverride || patternTargetOverride || OverrideTarget; } @@ -957,7 +954,7 @@ private void AreaEffects(AmmoDef ammoDef, out float byBlockHitDepth, out float e largestHitSize = Math.Max(byBlockHitRadius, Math.Max(endOfLifeRadius, ewarEffectSize)); eWar = ammoDef.Ewar.Enable; - nonAntiSmart = !eWar || ewarType != EwarType.AntiSmart; + nonAntiSmart = !eWar || !(ewarType == EwarType.AntiSmart || ewarType == EwarType.AntiSmartv2); eWarFieldTrigger = eWar && EwarField && ammoDef.Ewar.Field.TriggerRange > 0; minArmingTime = ammoDef.AreaOfDamage.EndOfLife.MinArmingTime; if (ammoDef.AreaOfDamage.ByBlockHit.Enable) byBlockHitDepth = ammoDef.AreaOfDamage.ByBlockHit.Depth <= 0 ? (float)ammoDef.AreaOfDamage.ByBlockHit.Radius : ammoDef.AreaOfDamage.ByBlockHit.Depth; diff --git a/Data/Scripts/CoreSystems/EntityComp/Controls/TerminalHelpers.cs b/Data/Scripts/CoreSystems/EntityComp/Controls/TerminalHelpers.cs index 3cae5e54..51106bdf 100644 --- a/Data/Scripts/CoreSystems/EntityComp/Controls/TerminalHelpers.cs +++ b/Data/Scripts/CoreSystems/EntityComp/Controls/TerminalHelpers.cs @@ -80,7 +80,7 @@ internal static void AddTurretOrTrackingControls(Session session) where T : I Separator(session, "WC_sep3", IsTrue); AddWeaponBurstCountSliderRange(session, "Burst Count", Localization.GetText("TerminalBurstShotsTitle"), Localization.GetText("TerminalBurstShotsTooltip"), BlockUi.GetBurstCount, BlockUi.RequestSetBurstCount, CanBurstIsNotBomb, BlockUi.GetMinBurstCount, BlockUi.GetMaxBurstCount, true); - AddWeaponBurstDelaySliderRange(session, "Burst Delay", Localization.GetText("TerminalBurstDelayTitle"), Localization.GetText("TerminalBurstDelayTooltip"), BlockUi.GetBurstDelay, BlockUi.RequestSetBurstDelay, IsNotBomb, BlockUi.GetMinBurstDelay, BlockUi.GetMaxBurstDelay, true); + AddWeaponBurstDelaySliderRange(session, "Burst Delay", Localization.GetText("TerminalBurstDelayTitle"), Localization.GetText("TerminalBurstDelayTooltip"), BlockUi.GetBurstDelay, BlockUi.RequestSetBurstDelay, AllowShotDelay, BlockUi.GetMinBurstDelay, BlockUi.GetMaxBurstDelay, true); AddWeaponSequenceIdSliderRange(session, "Sequence Id", Localization.GetText("TerminalSequenceIdTitle"), Localization.GetText("TerminalSequenceIdTooltip"), BlockUi.GetSequenceId, BlockUi.RequestSetSequenceId, IsNotBomb, BlockUi.GetMinSequenceId, BlockUi.GetMaxSequenceId, false); AddWeaponGroupIdIdSliderRange(session, "Weapon Group Id", Localization.GetText("TerminalWeaponGroupIdTitle"), Localization.GetText("TerminalWeaponGroupIdTooltip"), BlockUi.GetWeaponGroupId, BlockUi.RequestSetWeaponGroupId, IsNotBomb, BlockUi.GetMinWeaponGroupId, BlockUi.GetMaxWeaponGroupId, true); @@ -316,7 +316,7 @@ internal static bool CanBurst(IMyTerminalBlock block) if (!valid || Session.I.PlayerId != comp.Data.Repo.Values.State.PlayerId && !comp.TakeOwnerShip()) return false; - return !comp.HasDisabledBurst; + return !comp.ProhibitBurstCount && !comp.HasDisabledBurst; } internal static bool CanBurstIsNotBomb(IMyTerminalBlock block) @@ -534,6 +534,15 @@ internal static bool IsNotBomb(IMyTerminalBlock block) return !comp.IsBomb && !comp.HasAlternateUi; } + internal static bool AllowShotDelay(IMyTerminalBlock block) + { + var comp = block?.Components?.Get() as Weapon.WeaponComponent; + var valid = comp != null && comp.Platform.State == CorePlatform.PlatformState.Ready && comp.Data?.Repo != null; + if (!valid || Session.I.PlayerId != comp.Data.Repo.Values.State.PlayerId && !comp.TakeOwnerShip()) + return false; + + return !comp.ProhibitShotDelay; + } internal static bool HasSupport(IMyTerminalBlock block) { var comp = block?.Components?.Get(); diff --git a/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponComp.cs b/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponComp.cs index 9cc31a04..2bad497e 100644 --- a/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponComp.cs +++ b/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponComp.cs @@ -65,6 +65,8 @@ public partial class WeaponComponent : CoreComponent internal bool HasDrone; internal bool ShootRequestDirty; internal bool DisableSupportingPD; + internal bool ProhibitShotDelay; + internal bool ProhibitBurstCount; internal WeaponComponent(MyEntity coreEntity, MyDefinitionId id) { diff --git a/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponController.cs b/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponController.cs index 39a910f9..28ef734c 100644 --- a/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponController.cs +++ b/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponController.cs @@ -259,10 +259,13 @@ internal void UpdateWeaponHeat(object o = null) { try { - var hsRateMod = HsRate + (float)Comp.HeatLoss; - Comp.CurrentHeat = Comp.CurrentHeat >= hsRateMod ? Comp.CurrentHeat - hsRateMod : 0; - PartState.Heat = PartState.Heat >= hsRateMod ? PartState.Heat - hsRateMod : 0; - Comp.HeatLoss = 0; + if (!System.ProhibitCoolingWhenOff || System.ProhibitCoolingWhenOff && Comp.Cube.IsWorking) + { + var hsRateMod = HsRate + (float)Comp.HeatLoss; + Comp.CurrentHeat = Comp.CurrentHeat >= hsRateMod ? Comp.CurrentHeat - hsRateMod : 0; + PartState.Heat = PartState.Heat >= hsRateMod ? PartState.Heat - hsRateMod : 0; + Comp.HeatLoss = 0; + } var set = PartState.Heat - LastHeat > 0.001 || PartState.Heat - LastHeat < 0.001; diff --git a/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponData.cs b/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponData.cs index 90f0d25d..0882f471 100644 --- a/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponData.cs +++ b/Data/Scripts/CoreSystems/EntityComp/Parts/Weapon/WeaponData.cs @@ -135,6 +135,8 @@ internal void Load() if (w.System.Values.HardPoint.HardWare.CriticalReaction.DefaultArmedTimer > Repo.Values.Set.Overrides.ArmedTimer) Repo.Values.Set.Overrides.ArmedTimer = w.System.Values.HardPoint.HardWare.CriticalReaction.DefaultArmedTimer; + if (Comp.HasDisabledBurst) + Repo.Values.Set.Overrides.BurstCount = w.System.Values.HardPoint.Loading.ShotsInBurst; } } diff --git a/Data/Scripts/CoreSystems/EntityComp/PlatformInit.cs b/Data/Scripts/CoreSystems/EntityComp/PlatformInit.cs index 02672688..4fdbe253 100644 --- a/Data/Scripts/CoreSystems/EntityComp/PlatformInit.cs +++ b/Data/Scripts/CoreSystems/EntityComp/PlatformInit.cs @@ -729,6 +729,8 @@ internal void SetupWeaponUi(Weapon w) w.Comp.HasAlternateUi = w.Comp.HasAlternateUi || w.System.AlternateUi; w.Comp.HasRofSlider = w.Comp.HasRofSlider || ui.RateOfFire; w.Comp.DisableSupportingPD = w.Comp.DisableSupportingPD || ui.DisableSupportingPD; + w.Comp.ProhibitShotDelay = w.Comp.ProhibitShotDelay || ui.ProhibitShotDelay; + w.Comp.ProhibitBurstCount = w.Comp.ProhibitBurstCount || ui.ProhibitBurstCount; w.Comp.HasDrone = w.Comp.HasDrone || w.System.HasDrone; w.BaseComp.CanOverload = w.BaseComp.CanOverload || ui.EnableOverload; w.BaseComp.HasTurret = w.BaseComp.HasTurret || w.TurretAttached; diff --git a/Data/Scripts/CoreSystems/Projectiles/Projectile.cs b/Data/Scripts/CoreSystems/Projectiles/Projectile.cs index 481e945d..78917224 100644 --- a/Data/Scripts/CoreSystems/Projectiles/Projectile.cs +++ b/Data/Scripts/CoreSystems/Projectiles/Projectile.cs @@ -159,7 +159,7 @@ internal void Start() ai.ProjectileTicker = Session.I.Tick; Info.ObjectsHit = 0; Info.BaseHealthPool = aConst.Health; - Info.BaseEwarPool = aConst.Health; + Info.BaseEwarPool = (float)(aConst.EwarType == AntiSmartv2 ? aConst.EwarStrength : aConst.Health); if (aConst.IsSmart || aConst.IsDrone) { @@ -3416,6 +3416,40 @@ internal void EwarEffects() } s.EwaredProjectiles.Clear(); return; + case AntiSmartv2: + if (Info.BaseEwarPool > 0) + { + var eWarSphere2 = new BoundingSphereD(Position, aConst.EwarRadius); + var s2 = Session.I; + DynTrees.GetAllProjectilesInSphere(Session.I, ref eWarSphere2, s2.EwaredProjectiles, false); + for (int j = 0; j < s2.EwaredProjectiles.Count; j++) + { + var netted = s2.EwaredProjectiles[j]; + + if (!netted.Info.Ai.MarkedForClose && eWarSphere2.Intersects(new BoundingSphereD(netted.Position, netted.Info.AmmoDef.Const.CollisionSize))) + { + if (netted.Info.Ai.TopEntityMap.GroupMap.Construct.ContainsKey(Info.Weapon.Comp.TopEntity) || netted.Info.Target.TargetState == Target.TargetStates.IsProjectile || netted.State != ProjectileState.Alive) continue; + + var nStorage = netted.Info.Storage; + var nAconst = netted.Info.AmmoDef.Const; + if (nStorage.RequestedStage >= 0 && nStorage.RequestedStage < nAconst.ApproachesCount && nAconst.Approaches[nStorage.RequestedStage].IgnoreAntiSmart) + continue; + if (Info.Random.NextDouble() * 100f < aConst.PulseChance || !aConst.EwarField) + { + if (Info.BaseEwarPool - netted.Info.AmmoDef.Const.Health >= 0) + { + Info.BaseEwarPool -= netted.Info.AmmoDef.Const.Health; + Info.EwarActive = true; + netted.Info.Target.TargetObject = this; + netted.Info.Target.TargetState = Target.TargetStates.IsProjectile; + Seekers.Add(netted); + } + } + } + } + s2.EwaredProjectiles.Clear(); + } + return; case Push: if (offensiveEwarReady && Info.Random.NextDouble() * 100f <= aConst.PulseChance || !aConst.EwarField) Info.EwarActive = true; diff --git a/Data/Scripts/CoreSystems/Projectiles/ProjectileGen.cs b/Data/Scripts/CoreSystems/Projectiles/ProjectileGen.cs index f887f8d5..892b907f 100644 --- a/Data/Scripts/CoreSystems/Projectiles/ProjectileGen.cs +++ b/Data/Scripts/CoreSystems/Projectiles/ProjectileGen.cs @@ -190,7 +190,7 @@ private void SpawnFragments() var dumbAdd = false; - var notSmart = ammoDef.Trajectory.Guidance == TrajectoryDef.GuidanceType.None || overrides.Override && p.HadTarget == Projectile.HadTargetState.None; + var notSmart = ammoDef.Trajectory.Guidance == TrajectoryDef.GuidanceType.None || overrides.Override && p.HadTarget == Projectile.HadTargetState.None || info.Weapon.Comp.TypeSpecific == CoreComponent.CompTypeSpecific.Rifle && p.HadTarget == Projectile.HadTargetState.None; if (notSmart) { if (Vector3.Dot(p.Direction, info.Origin - targetAi.TopEntity.PositionComp.WorldMatrixRef.Translation) < 0) diff --git a/Data/Scripts/CoreSystems/Projectiles/Projectiles.cs b/Data/Scripts/CoreSystems/Projectiles/Projectiles.cs index 83a42fb7..ce3f0918 100644 --- a/Data/Scripts/CoreSystems/Projectiles/Projectiles.cs +++ b/Data/Scripts/CoreSystems/Projectiles/Projectiles.cs @@ -339,7 +339,7 @@ private void CheckHits() ++_beamCount; var ewarTriggered = aConst.EwarFieldTrigger && info.ExpandingEwarField; - var useEwarFieldSphere = (ewarTriggered || info.EwarActive) && aConst.EwarField && aConst.EwarType != WeaponDefinition.AmmoDef.EwarDef.EwarType.AntiSmart; + var useEwarFieldSphere = (ewarTriggered || info.EwarActive) && aConst.EwarField && !(aConst.EwarType == WeaponDefinition.AmmoDef.EwarDef.EwarType.AntiSmart || aConst.EwarType == WeaponDefinition.AmmoDef.EwarDef.EwarType.AntiSmartv2); var ewarRadius = !info.ExpandingEwarField ? aConst.EwarRadius : info.TriggerGrowthSteps < aConst.FieldGrowTime ? info.TriggerMatrix.Scale.AbsMax() : aConst.EwarRadius; p.Beam = useEwarFieldSphere ? new LineD(p.Position + (-p.Direction * ewarRadius), p.Position + (p.Direction * ewarRadius)) : new LineD(p.LastPosition, p.Position); var checkBeam = aConst.CheckFutureIntersection ? new LineD(p.Beam.From, p.Beam.From + p.Beam.Direction * (p.Beam.Length + aConst.FutureIntersectionRange), p.Beam.Length + aConst.FutureIntersectionRange) : p.Beam; diff --git a/Data/Scripts/CoreSystems/Session/SessionDamageMgr.cs b/Data/Scripts/CoreSystems/Session/SessionDamageMgr.cs index 198999bb..a50055e3 100644 --- a/Data/Scripts/CoreSystems/Session/SessionDamageMgr.cs +++ b/Data/Scripts/CoreSystems/Session/SessionDamageMgr.cs @@ -444,6 +444,8 @@ private void DamageGrid(HitEntity hitEnt, ProInfo t) basePool = 0; break; } + else if(hasDet && objectsHit >= maxObjects && t.AmmoDef.ObjectsHit.SkipBlocksForAOE) + basePool = 0; var aoeAbsorb = 0d; var aoeDepth = 0d; @@ -685,8 +687,6 @@ private void DamageGrid(HitEntity hitEnt, ProInfo t) basePool = 0; t.BaseDamagePool = basePool; detRequested = hasDet; - if (countBlocksAsObjects) - objectsHit++; } else if (primaryDamage) { @@ -694,10 +694,13 @@ private void DamageGrid(HitEntity hitEnt, ProInfo t) deadBlock = true; var scale = baseScale == 0d ? 0.0000001 : baseScale; basePool -= (float)(blockHp / scale); - if (countBlocksAsObjects) - objectsHit++; } + if (countBlocksAsObjects && (primaryDamage || !primaryDamage && countBlocksAsObjects && !t.AmmoDef.ObjectsHit.SkipBlocksForAOE)) + objectsHit++; + if(objectsHit >= maxObjects && primaryDamage) + detRequested = hasDet; + //AOE damage logic applied to aoeDamageFall if (!rootStep && (hasAoe || hasDet) && aoeDamage >= 0 && aoeDamageFall >= 0 && !deadBlock) { @@ -735,7 +738,7 @@ private void DamageGrid(HitEntity hitEnt, ProInfo t) //Log.Line($"Aoedmgpool {aoeDamage} scaleddmg {aoeScaledDmg}"); } } - aoeDmgTally += aoeScaledDmg; + aoeDmgTally += aoeScaledDmg > (float)blockHp ? (float)blockHp : aoeScaledDmg; scaledDamage = aoeScaledDmg; if (!aoeIsPool && scaledDamage > blockHp) @@ -840,7 +843,8 @@ private void DamageGrid(HitEntity hitEnt, ProInfo t) } else if (block.Integrity - realDmg > 0) _slimHealthClient[block] = (float)(blockHp - realDmg); } - var endCycle = (!foundAoeBlocks && basePool <= 0) || (!rootStep && (aoeDmgTally >= aoeAbsorb && aoeAbsorb != 0 || aoeDamage <= 0.5d)) || objectsHit > maxObjects; + + var endCycle = (!foundAoeBlocks && basePool <= 0) || (!rootStep && (aoeDmgTally >= aoeAbsorb && aoeAbsorb != 0 && !aoeIsPool || aoeDamage <= 0.5d)) || (!t.AmmoDef.ObjectsHit.SkipBlocksForAOE && objectsHit >= maxObjects) || t.AmmoDef.ObjectsHit.SkipBlocksForAOE && rootStep; if (showHits && primaryDamage) Log.Line($"{t.AmmoDef.AmmoRound} Primary Dmg: RootBlock {rootBlock} hit for {scaledDamage} damage of {blockHp} block HP total"); //doneskies @@ -1005,15 +1009,26 @@ private void DamageProjectile(HitEntity hitEnt, ProInfo attacker) scaledDamage *= fallOffMultipler; } + //Rework of projectile on projectile damage calcs, as previously you could end up with a high primary damage projectile + //unintentionally surviving multiple hits and doing nearly infinite damage against other projectiles. This was more apparent + //with smarts that would select and chase a new target. Projectiles with EOL detonations could also pop multiple times without dying. + //If your attacking projectile has a health > 0, it will deduct the HealthHitModifier damage done to the target from its own health. It will die once health hits zero or less + //If your attacking projectile has a health = 0, the HealthHitModifier damage it does will be deducted from the primary damage field. It will die once damage hits zero or less + //In either case, a projectile with EOL will detonate on hitting another projectile and die + + var deductFromAttackerHealth = attacker.AmmoDef.Health > 0; if (scaledDamage >= objHp) { - - var safeObjHp = objHp <= 0 ? 0.0000001f : objHp; - var remaining = (scaledDamage / safeObjHp) / damageScale; + attacker.DamageDoneProj += (long)objHp; + if (deductFromAttackerHealth) + { + attacker.BaseHealthPool -= objHp; + if (attacker.BaseHealthPool <= 0) + attacker.BaseDamagePool = 0; + } + else + attacker.BaseDamagePool -= objHp; - attacker.DamageDoneProj += (long)remaining; - attacker.BaseDamagePool -= remaining; - pTarget.Info.BaseHealthPool = 0; var requiresPdSync = AdvSyncClient && pTarget.Info.AmmoDef.Const.PdDeathSync && pTarget.Info.SyncId != ulong.MaxValue; @@ -1025,17 +1040,17 @@ private void DamageProjectile(HitEntity hitEnt, ProInfo attacker) pTarget.Info.Storage.SyncId = ulong.MaxValue; } */ - - if (attacker.AmmoDef.Const.EndOfLifeDamage > 0 && attacker.AmmoDef.Const.EndOfLifeAoe && attacker.RelativeAge >= attacker.AmmoDef.Const.MinArmingTime) - DetonateProjectile(hitEnt, attacker); } else { attacker.BaseDamagePool = 0; attacker.DamageDoneProj += (long)scaledDamage; pTarget.Info.BaseHealthPool -= scaledDamage; - DetonateProjectile(hitEnt, attacker); } + + if (attacker.AmmoDef.Const.EndOfLifeDamage > 0 && attacker.AmmoDef.Const.EndOfLifeAoe && attacker.RelativeAge >= attacker.AmmoDef.Const.MinArmingTime) + DetonateProjectile(hitEnt, attacker); + if (GlobalDamageHandlerActive) { attacker.ProHits = attacker.ProHits != null && ProHitPool.Count > 0 ? ProHitPool.Pop() : new List>(); attacker.ProHits.Add(new MyTuple(hitEnt.Intersection.To, pTarget.Info.Id, scaledDamage)); @@ -1044,52 +1059,50 @@ private void DamageProjectile(HitEntity hitEnt, ProInfo attacker) private void DetonateProjectile(HitEntity hitEnt, ProInfo attacker) { - if (attacker.AmmoDef.Const.EndOfLifeDamage > 0 && attacker.AmmoDef.Const.EndOfLifeAoe && attacker.RelativeAge >= attacker.AmmoDef.Const.MinArmingTime) + var areaSphere = new BoundingSphereD(hitEnt.Projectile.Position, attacker.AmmoDef.Const.EndOfLifeRadius); + foreach (var sTarget in attacker.Ai.LiveProjectile.Keys) { - var areaSphere = new BoundingSphereD(hitEnt.Projectile.Position, attacker.AmmoDef.Const.EndOfLifeRadius); - foreach (var sTarget in attacker.Ai.LiveProjectile.Keys) + if (areaSphere.Contains(sTarget.Position) != ContainmentType.Disjoint && sTarget.State == Projectile.ProjectileState.Alive) { - if (areaSphere.Contains(sTarget.Position) != ContainmentType.Disjoint && sTarget.State == Projectile.ProjectileState.Alive) - { - var objHp = sTarget.Info.BaseHealthPool; - var integrityCheck = attacker.AmmoDef.DamageScales.MaxIntegrity > 0; - if (integrityCheck && objHp > attacker.AmmoDef.DamageScales.MaxIntegrity) continue; + var objHp = sTarget.Info.BaseHealthPool; + var integrityCheck = attacker.AmmoDef.DamageScales.MaxIntegrity > 0; + if (integrityCheck && objHp > attacker.AmmoDef.DamageScales.MaxIntegrity) continue; - if (sTarget.Info.AmmoDef.Const.ArmedWhenHit) - sTarget.Info.ObjectsHit++; + if (sTarget.Info.AmmoDef.Const.ArmedWhenHit) + sTarget.Info.ObjectsHit++; - var damageScale = (float)attacker.AmmoDef.Const.HealthHitModifier; - if (attacker.AmmoDef.Const.VirtualBeams) damageScale *= attacker.Weapon.WeaponCache.Hits; - var scaledDamage = 1 * damageScale; + var damageScale = (float)attacker.AmmoDef.Const.HealthHitModifier; + if (attacker.AmmoDef.Const.VirtualBeams) damageScale *= attacker.Weapon.WeaponCache.Hits; + var scaledDamage = 1 * damageScale; - if (scaledDamage >= objHp) - { - attacker.DamageDoneProj += (long)objHp; - sTarget.Info.BaseHealthPool = 0; - var requiresPdSync = AdvSyncClient && sTarget.Info.AmmoDef.Const.PdDeathSync && sTarget.Info.SyncId != ulong.MaxValue; - sTarget.State = !requiresPdSync ? Projectile.ProjectileState.Destroy : Projectile.ProjectileState.ClientPhantom; - /* - if (requiresPdSync && PdServer && PointDefenseSyncMonitor.ContainsKey(sTarget.Info.Storage.SyncId)) - { - ProtoPdSyncMonitor.Collection.Add(sTarget.Info.Storage.SyncId); - sTarget.Info.Storage.SyncId = ulong.MaxValue; - } - */ - } - else + if (scaledDamage >= objHp) + { + attacker.DamageDoneProj += (long)objHp; + sTarget.Info.BaseHealthPool = 0; + var requiresPdSync = AdvSyncClient && sTarget.Info.AmmoDef.Const.PdDeathSync && sTarget.Info.SyncId != ulong.MaxValue; + sTarget.State = !requiresPdSync ? Projectile.ProjectileState.Destroy : Projectile.ProjectileState.ClientPhantom; + /* + if (requiresPdSync && PdServer && PointDefenseSyncMonitor.ContainsKey(sTarget.Info.Storage.SyncId)) { - sTarget.Info.BaseHealthPool -= scaledDamage; - attacker.DamageDoneProj += (long)scaledDamage; + ProtoPdSyncMonitor.Collection.Add(sTarget.Info.Storage.SyncId); + sTarget.Info.Storage.SyncId = ulong.MaxValue; } + */ + } + else + { + sTarget.Info.BaseHealthPool -= scaledDamage; + attacker.DamageDoneProj += (long)scaledDamage; + } - if (GlobalDamageHandlerActive) { - attacker.ProHits = attacker.ProHits != null && ProHitPool.Count > 0 ? ProHitPool.Pop() : new List>(); - attacker.ProHits.Add(new MyTuple(hitEnt.Intersection.To, hitEnt.Projectile.Info.Id, scaledDamage)); - } + if (GlobalDamageHandlerActive) { + attacker.ProHits = attacker.ProHits != null && ProHitPool.Count > 0 ? ProHitPool.Pop() : new List>(); + attacker.ProHits.Add(new MyTuple(hitEnt.Intersection.To, hitEnt.Projectile.Info.Id, scaledDamage)); } } } + attacker.BaseDamagePool = 0; } private void DamageVoxel(HitEntity hitEnt, ProInfo info, HitEntity.Type type) diff --git a/Data/Scripts/CoreSystems/Session/SessionEvents.cs b/Data/Scripts/CoreSystems/Session/SessionEvents.cs index 3424bbb1..d714702e 100644 --- a/Data/Scripts/CoreSystems/Session/SessionEvents.cs +++ b/Data/Scripts/CoreSystems/Session/SessionEvents.cs @@ -621,8 +621,6 @@ private bool FindPlayer(IMyPlayer player, long id) SendPlayerConnectionUpdate(id, true); SendServerStartup(player.SteamUserId); } - else if (MpActive && MultiplayerId == player.SteamUserId && JokePlayerList.Contains(player.SteamUserId)) - PracticalJokes(player.SteamUserId); } return false; } @@ -636,7 +634,7 @@ private void BuildPlayerMap(IMyPlayer player, long id) player.Character.Components.TryGet(out targetLock); } - Players[id] = new PlayerMap { Player = player, PlayerId = id, TargetFocus = targetFocus, TargetLock = targetLock, Blessed = BlessedPlayers.Contains(player.SteamUserId)}; + Players[id] = new PlayerMap { Player = player, PlayerId = id, TargetFocus = targetFocus, TargetLock = targetLock}; } internal void OnPlayerControl(MyEntity exitEntity, MyEntity enterEntity) diff --git a/Data/Scripts/CoreSystems/Session/SessionFields.cs b/Data/Scripts/CoreSystems/Session/SessionFields.cs index 1b25f378..b1cc0649 100644 --- a/Data/Scripts/CoreSystems/Session/SessionFields.cs +++ b/Data/Scripts/CoreSystems/Session/SessionFields.cs @@ -182,7 +182,6 @@ public partial class Session internal readonly Dictionary ArmorCubes = new Dictionary(); internal readonly Dictionary PrunedPacketsToClient = new Dictionary(); internal readonly Dictionary IdToCompMap = new Dictionary(); - internal readonly Dictionary AmmoItems = new Dictionary(); internal readonly Dictionary KeyMap = new Dictionary(); internal readonly Dictionary MouseMap = new Dictionary(); internal readonly Dictionary AmmoValuesMap = new Dictionary(); @@ -501,16 +500,6 @@ public partial class Session internal bool DirtyGrid; internal bool AuthorConnected; - internal readonly HashSet BlessedPlayers = new HashSet() - { - //76561198339035377 -- Most cherished of humanity - }; - - internal readonly HashSet JokePlayerList = new HashSet() - { - }; - - internal readonly HashSet VanillaUpgradeModuleHashes = new HashSet() { "LargeProductivityModule", "LargeEffectivenessModule", "LargeEnergyModule", @@ -525,7 +514,9 @@ public partial class Session internal readonly HashSet VanillaWeaponCompatible = new HashSet() { - "Large_SC_LaserDrillTurret", + "Large_SC_LaserDrillTurret", + "LargeFlareLauncher", + "SmallFlareLauncher", }; internal readonly Dictionary VanillaLeadGroupMatch = new Dictionary() diff --git a/Data/Scripts/CoreSystems/Session/SessionSupport.cs b/Data/Scripts/CoreSystems/Session/SessionSupport.cs index 6a089722..ca9909d2 100644 --- a/Data/Scripts/CoreSystems/Session/SessionSupport.cs +++ b/Data/Scripts/CoreSystems/Session/SessionSupport.cs @@ -839,13 +839,9 @@ private void ChatMessageSet(string message, ref bool sendToOthers) Settings.VersionControl.UpdateClientCfgFile(); break; case "debug": - if (DebugVersion) - { - somethingUpdated = true; - DebugMod = !DebugMod; - MyAPIGateway.Utilities.ShowNotification($"Debug has been toggled: {DebugMod}", 10000); - } - + somethingUpdated = true; + DebugMod = !DebugMod; + MyAPIGateway.Utilities.ShowNotification($"Debug has been toggled: {DebugMod}", 10000); break; case "unsupportedmode": if (HandlesInput) @@ -868,7 +864,7 @@ private void ChatMessageSet(string message, ref bool sendToOthers) if (!somethingUpdated) { if (message.Length <= 3) - MyAPIGateway.Utilities.ShowNotification("HELPFUL TIPS: https://github.com/sstixrud/WeaponCore/wiki/Player-Tips\nValid WeaponCore Commands:\n'/wc advanced -- Toggle advanced UI features'\n'/wc remap -- Remap keys'\n'/wc avlimit 5' -- Hard limits visual effects (valid range: 0 - 20, 0 is unlimited)\n'/wc changehud' to enable moving/resizing of WC Hud\n'/wc setdefaults' -- Resets shield client configs to default values\n'/wc stickypainter' -- Disable Painter LoS checks\n", 10000); + MyAPIGateway.Utilities.ShowNotification("HELPFUL TIPS: https://github.com/Ash-LikeSnow/WeaponCore/wiki/Player-Tips\nValid WeaponCore Commands:\n'/wc advanced -- Toggle advanced UI features'\n'/wc remap -- Remap keys'\n'/wc avlimit 5' -- Hard limits visual effects (valid range: 0 - 20, 0 is unlimited)\n'/wc changehud' to enable moving/resizing of WC Hud\n'/wc setdefaults' -- Resets shield client configs to default values\n'/wc stickypainter' -- Disable Painter LoS checks\n", 10000); else if (message.StartsWith("/wc remap")) MyAPIGateway.Utilities.ShowNotification("'/wc remap keyboard' -- Remaps control key (default R)\n'/wc remap mouse' -- Remaps menu mouse key (default middle button)\n'/wc remap action' -- Remaps action key (default numpad0)\n'/wc remap info' -- Remaps info key (default decimal key, aka numpad period key)\n'/wc remap next' -- Remaps the Cycle Next Target key (default Page Down)\n'/wc remap prev' -- Remaps the Cycle Previous Target key (default Page Up)\n", 10000, "White"); } @@ -1102,20 +1098,6 @@ internal void ReallyStupidKeenShit() //aka block group removal of individual blo } } - private void PracticalJokes(ulong playerSteamUserId) - { - string[] jokeArray; - if (JokeCollection.TryGetValue(playerSteamUserId, out jokeArray)) - { - var messageIndex = MyUtils.GetRandomInt(0, jokeArray.Length); - MyAPIGateway.Utilities.ShowNotification(jokeArray[messageIndex], 10000, "Red"); - } - } - - internal Dictionary JokeCollection = new Dictionary - { - }; - internal void CheckToolbarForVanilla(MyCubeBlock cube) { string message = null; @@ -1194,7 +1176,7 @@ public void WeaponDebug(Weapon w) private void ModChecker() { - LocalVersion = ModContext.ModId == "CoreSystems"; + LocalVersion = ModContext.ModId == "CoreSystems" || ModContext.ModId == "WeaponCore"; if (LocalVersion) { diff --git a/Data/Scripts/CoreSystems/Session/SessionTypes.cs b/Data/Scripts/CoreSystems/Session/SessionTypes.cs index 8c42d3f6..bd9d00fe 100644 --- a/Data/Scripts/CoreSystems/Session/SessionTypes.cs +++ b/Data/Scripts/CoreSystems/Session/SessionTypes.cs @@ -960,7 +960,6 @@ public class PlayerMap public long PlayerId; public MyTargetFocusComponent TargetFocus; public MyTargetLockingComponent TargetLock; - public bool Blessed; } public class GridGroupMap diff --git a/Data/Scripts/CoreSystems/Support/Localization.cs b/Data/Scripts/CoreSystems/Support/Localization.cs index e6ae5542..31d5c05c 100644 --- a/Data/Scripts/CoreSystems/Support/Localization.cs +++ b/Data/Scripts/CoreSystems/Support/Localization.cs @@ -65,7 +65,7 @@ public static class Localization { "TerminalSubSystemsTitle", "Target SubSystems" }, { "TerminalSubSystemsTooltip", "Target specific SubSystems of a target" }, { "TerminalRepelTitle", "Repel Mode" }, - { "TerminalRepelTooltip", "Aggressively focus and repel small threats" }, + { "TerminalRepelTooltip", "Aggressively focus on and repel small threats (not projectiles)" }, { "TerminalPickAmmoTitle", "Pick Ammo" }, { "TerminalPickAmmoTooltip", "Select the ammo type to use" }, { "TerminalPickSubSystemTitle", "Pick SubSystem" }, @@ -177,7 +177,7 @@ public static class Localization { "WeaponTotalEffect", "Damage" }, { "WeaponTotalEffectAvgDps", "AvgDps" }, { "TerminalOverrideTitle", "Override" }, - { "TerminalOverrideTooltip", "Allow dumb firing weapons that otherwise require a target, for target practice only" }, + { "TerminalOverrideTooltip", "Turns off targeting and tracking so you can forcibly fire the weapon- for practice use only" }, { "TerminalAngularTitle", "Track Angular Motion" }, { "TerminalAngularTooltip", "Adjust aim to account for angular motion of the target" }, { "WeaponInfoHasTarget", "HasTarget" }, diff --git a/Data/Scripts/CoreSystems/Support/VersionControl.cs b/Data/Scripts/CoreSystems/Support/VersionControl.cs index ba682b54..4061f8bb 100644 --- a/Data/Scripts/CoreSystems/Support/VersionControl.cs +++ b/Data/Scripts/CoreSystems/Support/VersionControl.cs @@ -81,7 +81,7 @@ public void InitSettings() if (VersionChange) { Core.Session.PlayerStartMessage = true; - Core.Session.PlayerMessage = "You may access WeaponCore client settings with the /wc chat command\n- for helpful tips goto: https://github.com/sstixrud/WeaponCore/wiki/Player-Tips"; + Core.Session.PlayerMessage = "You may access WeaponCore client settings with the /wc chat command\n- for helpful tips goto: https://github.com/Ash-LikeSnow/WeaponCore/wiki/Player-Tips"; } }