public void ProcessTrigger(TriggerProfile trigger, long attackerEntityId = 0, bool skipOnComplete = false) { if (this.RemoteControl?.SlimBlock?.CubeGrid == null) { return; } if (trigger.Triggered == false || trigger.Actions == null) { return; } long detectedEntity = attackerEntityId; if (trigger.DetectedEntityId != 0 && detectedEntity == 0) { detectedEntity = trigger.DetectedEntityId; } trigger.DetectedEntityId = 0; trigger.Triggered = false; trigger.CooldownTime = trigger.Rnd.Next((int)trigger.MinCooldownMs, (int)trigger.MaxCooldownMs); trigger.LastTriggerTime = MyAPIGateway.Session.GameDateTime; trigger.TriggerCount++; Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Performing Eligible Actions", DebugTypeEnum.Action); //ChatBroadcast if (trigger.Actions.UseChatBroadcast == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Chat Broadcast", DebugTypeEnum.Action); _broadcast.BroadcastRequest(trigger.Actions.ChatData); } //BarrellRoll - Implement Post Release if (trigger.Actions.BarrelRoll == true) { //_autopilot.ChangeAutoPilotMode(AutoPilotMode.BarrelRoll); } //Strafe - Implement Post Release if (trigger.Actions.Strafe == true) { //_autopilot.ChangeAutoPilotMode(AutoPilotMode.Strafe); } //ChangeAutopilotSpeed if (trigger.Actions.ChangeAutopilotSpeed == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Changing AutoPilot Speed To: " + trigger.Actions.NewAutopilotSpeed.ToString(), DebugTypeEnum.Action); _autopilot.IdealMaxSpeed = trigger.Actions.NewAutopilotSpeed; var blockList = TargetHelper.GetAllBlocks(RemoteControl.SlimBlock.CubeGrid); foreach (var block in blockList.Where(x => x.FatBlock != null)) { var tBlock = block.FatBlock as IMyRemoteControl; if (tBlock != null) { tBlock.SpeedLimit = trigger.Actions.NewAutopilotSpeed; } } } //SpawnReinforcements if (trigger.Actions.SpawnEncounter == true && trigger.Actions.Spawner.UseSpawn) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Spawn", DebugTypeEnum.Spawn); if (trigger.Actions.Spawner.IsReadyToSpawn()) { //Logger.AddMsg("Do Spawn", true); trigger.Actions.Spawner.CurrentPositionMatrix = this.RemoteControl.WorldMatrix; trigger.Actions.Spawner.CurrentFactionTag = (trigger.Actions.Spawner.ForceSameFactionOwnership && !string.IsNullOrWhiteSpace(_owner.Faction?.Tag)) ? _owner.Faction.Tag : ""; SpawnHelper.SpawnRequest(trigger.Actions.Spawner); } } else { } //SelfDestruct if (trigger.Actions.SelfDestruct == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting SelfDestruct", DebugTypeEnum.Action); var blockList = TargetHelper.GetAllBlocks(RemoteControl.SlimBlock.CubeGrid); int totalWarheads = 0; foreach (var block in blockList.Where(x => x.FatBlock != null)) { var tBlock = block.FatBlock as IMyWarhead; if (tBlock != null) { if (!trigger.Actions.StaggerWarheadDetonation) { tBlock.IsArmed = true; tBlock.DetonationTime = 0; tBlock.Detonate(); totalWarheads++; } else { tBlock.DetonationTime = totalWarheads + 1; tBlock.StartCountdown(); totalWarheads++; } } } //Logger.AddMsg("TotalBlocks: " + blockList.Count.ToString(), true); //Logger.AddMsg("TotalWarheads: " + totalWarheads.ToString(), true); //TODO: Shield EMP } //Retreat if (trigger.Actions.Retreat) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Retreat", DebugTypeEnum.Action); _despawn.Retreat(); } //ForceDespawn if (trigger.Actions.ForceDespawn) { _despawn.DespawnGrid(); } //TerminateBehavior if (trigger.Actions.TerminateBehavior) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Termination Of Behavior", DebugTypeEnum.Action); _autopilot.ActivateAutoPilot(AutoPilotType.None, NewAutoPilotMode.None, Vector3D.Zero); _behavior.BehaviorTerminated = true; } //BroadcastGenericCommand if (trigger.Actions.BroadcastGenericCommand == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Broadcast of Generic Command", DebugTypeEnum.Action); var antenna = BlockHelper.GetAntennaWithHighestRange(this.AntennaList); if (antenna != null) { CommandHelper.CommandTrigger?.Invoke(trigger.Actions.BroadcastSendCode, this.RemoteControl, (double)antenna.Radius, 0); } } //BroadcastCurrentTarget if (trigger.Actions.BroadcastCurrentTarget == true && detectedEntity != 0) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Broadcast of Current Target", DebugTypeEnum.Action); var antenna = BlockHelper.GetAntennaWithHighestRange(this.AntennaList); if (antenna != null) { CommandHelper.CommandTrigger?.Invoke(trigger.Actions.BroadcastSendCode, this.RemoteControl, (double)antenna.Radius, detectedEntity); } } //SwitchToReceivedTarget if (trigger.Actions.SwitchToReceivedTarget == true && detectedEntity != 0) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Switch to Received Target Data", DebugTypeEnum.Action); _autopilot.Targeting.ForceTargetEntity = detectedEntity; _autopilot.Targeting.ForceRefresh = true; } //SwitchToBehavior if (trigger.Actions.SwitchToBehavior == true) { _behavior.ChangeBehavior(trigger.Actions.NewBehavior, trigger.Actions.PreserveSettingsOnBehaviorSwitch, trigger.Actions.PreserveTriggersOnBehaviorSwitch, trigger.Actions.PreserveTargetDataOnBehaviorSwitch); } //RefreshTarget if (trigger.Actions.RefreshTarget == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Target Refresh", DebugTypeEnum.Action); _autopilot.Targeting.ForceRefresh = true; } //ChangeTargetProfile if (trigger.Actions.ChangeTargetProfile == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Target Change", DebugTypeEnum.Action); _autopilot.Targeting.UseNewTargetProfile = true; _autopilot.Targeting.NewTargetProfileName = trigger.Actions.NewTargetProfileId; } //ChangeReputationWithPlayers if (trigger.Actions.ChangeReputationWithPlayers == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Reputation Change With Players In Radius", DebugTypeEnum.Action); OwnershipHelper.ChangeReputationWithPlayersInRadius(this.RemoteControl, trigger.Actions.ReputationChangeRadius, trigger.Actions.ReputationChangeAmount, trigger.Actions.ReputationChangeFactions, trigger.Actions.ReputationChangesForAllRadiusPlayerFactionMembers); } //ChangeAttackerReputation if (trigger.Actions.ChangeAttackerReputation == true && detectedEntity != 0) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Reputation Change for Attacker", DebugTypeEnum.Action); OwnershipHelper.ChangeDamageOwnerReputation(trigger.Actions.ChangeAttackerReputationFaction, detectedEntity, trigger.Actions.ChangeAttackerReputationAmount, trigger.Actions.ReputationChangesForAllAttackPlayerFactionMembers); } //TriggerTimerBlock if (trigger.Actions.TriggerTimerBlocks == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Trigger of Timer Blocks", DebugTypeEnum.Action); var blockList = BlockHelper.GetBlocksWithNames(RemoteControl.SlimBlock.CubeGrid, trigger.Actions.TimerBlockNames); foreach (var block in blockList) { var tBlock = block as IMyTimerBlock; if (tBlock != null) { tBlock.Trigger(); } } } //ChangeBlockNames if (trigger.Actions.ChangeBlockNames) { BlockHelper.RenameBlocks(RemoteControl.CubeGrid, trigger.Actions.ChangeBlockNamesFrom, trigger.Actions.ChangeBlockNamesTo, trigger.Actions.ProfileSubtypeId); } //ChangeAntennaRanges if (trigger.Actions.ChangeAntennaRanges) { BlockHelper.SetGridAntennaRanges(AntennaList, trigger.Actions.AntennaNamesForRangeChange, trigger.Actions.AntennaRangeChangeType, trigger.Actions.AntennaRangeChangeAmount); } //ChangeAntennaOwnership if (trigger.Actions.ChangeAntennaOwnership == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Antenna Ownership Change", DebugTypeEnum.Action); OwnershipHelper.ChangeAntennaBlockOwnership(AntennaList, trigger.Actions.AntennaFactionOwner); } //CreateKnownPlayerArea if (trigger.Actions.CreateKnownPlayerArea == true) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Creation of Known Player Area in MES", DebugTypeEnum.Action); MESApi.AddKnownPlayerLocation(this.RemoteControl.GetPosition(), _owner.Faction?.Tag, trigger.Actions.KnownPlayerAreaRadius, trigger.Actions.KnownPlayerAreaTimer, trigger.Actions.KnownPlayerAreaMaxSpawns); } //DamageAttacker if (trigger.Actions.DamageToolAttacker == true && detectedEntity != 0) { Logger.MsgDebug(trigger.Actions.ProfileSubtypeId + ": Attempting Damage to Tool User", DebugTypeEnum.Action); DamageHelper.ApplyDamageToTarget(attackerEntityId, trigger.Actions.DamageToolAttackerAmount, trigger.Actions.DamageToolAttackerParticle, trigger.Actions.DamageToolAttackerSound); } //PlayParticleEffectAtRemote if (trigger.Actions.PlayParticleEffectAtRemote == true) { EffectManager.SendParticleEffectRequest(trigger.Actions.ParticleEffectId, this.RemoteControl.WorldMatrix, trigger.Actions.ParticleEffectOffset, trigger.Actions.ParticleEffectScale, trigger.Actions.ParticleEffectMaxTime, trigger.Actions.ParticleEffectColor); } //ResetCooldownTimeOfTriggers if (trigger.Actions.ResetCooldownTimeOfTriggers) { foreach (var resetTrigger in Triggers) { if (trigger.Actions.ResetTriggerCooldownNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.LastTriggerTime = MyAPIGateway.Session.GameDateTime; } } foreach (var resetTrigger in DamageTriggers) { if (trigger.Actions.ResetTriggerCooldownNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.LastTriggerTime = MyAPIGateway.Session.GameDateTime; } } foreach (var resetTrigger in CommandTriggers) { if (trigger.Actions.ResetTriggerCooldownNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.LastTriggerTime = MyAPIGateway.Session.GameDateTime; } } } if (trigger.Actions.EnableTriggers) { foreach (var resetTrigger in Triggers) { if (trigger.Actions.EnableTriggerNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.UseTrigger = true; } } foreach (var resetTrigger in DamageTriggers) { if (trigger.Actions.EnableTriggerNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.UseTrigger = true; } } foreach (var resetTrigger in CommandTriggers) { if (trigger.Actions.EnableTriggerNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.UseTrigger = true; } } } if (trigger.Actions.DisableTriggers) { foreach (var resetTrigger in Triggers) { if (trigger.Actions.DisableTriggerNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.UseTrigger = false; } } foreach (var resetTrigger in DamageTriggers) { if (trigger.Actions.DisableTriggerNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.UseTrigger = false; } } foreach (var resetTrigger in CommandTriggers) { if (trigger.Actions.DisableTriggerNames.Contains(resetTrigger.ProfileSubtypeId)) { resetTrigger.UseTrigger = false; } } } //ChangeInertiaDampeners if (trigger.Actions.ChangeInertiaDampeners) { RemoteControl.DampenersOverride = trigger.Actions.InertiaDampenersEnable; } //ChangeRotationDirection if (trigger.Actions.ChangeRotationDirection) { _behavior.Settings.SetRotation(trigger.Actions.RotationDirection); } //GenerateExplosion if (trigger.Actions.GenerateExplosion) { var coords = Vector3D.Transform(trigger.Actions.ExplosionOffsetFromRemote, RemoteControl.WorldMatrix); MyVisualScriptLogicProvider.CreateExplosion(coords, trigger.Actions.ExplosionRange, trigger.Actions.ExplosionDamage); } //SetBooleansTrue foreach (var variable in trigger.Actions.SetBooleansTrue) { _settings.SetCustomBool(variable, true); } //SetBooleansFalse foreach (var variable in trigger.Actions.SetBooleansFalse) { _settings.SetCustomBool(variable, false); } //IncreaseCounters foreach (var variable in trigger.Actions.IncreaseCounters) { _settings.SetCustomCounter(variable, 1); } //DecreaseCounters foreach (var variable in trigger.Actions.DecreaseCounters) { _settings.SetCustomCounter(variable, -1); } //ResetCounters foreach (var variable in trigger.Actions.ResetCounters) { _settings.SetCustomCounter(variable, 0, true); } //SetSandboxBooleansTrue foreach (var variable in trigger.Actions.SetSandboxBooleansTrue) { SetSandboxBool(variable, true); } //SetSandboxBooleansFalse foreach (var variable in trigger.Actions.SetSandboxBooleansFalse) { SetSandboxBool(variable, false); } //IncreaseSandboxCounters foreach (var variable in trigger.Actions.IncreaseSandboxCounters) { SetSandboxCounter(variable, 1); } //DecreaseSandboxCounters foreach (var variable in trigger.Actions.DecreaseSandboxCounters) { SetSandboxCounter(variable, -1); } //ResetSandboxCounters foreach (var variable in trigger.Actions.ResetSandboxCounters) { SetSandboxCounter(variable, 0); } //BehaviorSpecificEventA if (trigger.Actions.BehaviorSpecificEventA) { BehaviorEventA?.Invoke(); } //BehaviorSpecificEventB if (trigger.Actions.BehaviorSpecificEventB) { BehaviorEventB?.Invoke(); } //BehaviorSpecificEventC if (trigger.Actions.BehaviorSpecificEventC) { BehaviorEventC?.Invoke(); } //BehaviorSpecificEventD if (trigger.Actions.BehaviorSpecificEventD) { BehaviorEventD?.Invoke(); } //BehaviorSpecificEventE if (trigger.Actions.BehaviorSpecificEventE) { BehaviorEventE?.Invoke(); } //BehaviorSpecificEventF if (trigger.Actions.BehaviorSpecificEventF) { BehaviorEventF?.Invoke(); } //BehaviorSpecificEventG if (trigger.Actions.BehaviorSpecificEventG) { BehaviorEventG?.Invoke(); } //BehaviorSpecificEventH if (trigger.Actions.BehaviorSpecificEventH) { BehaviorEventH?.Invoke(); } }
public static void EmergencyStop() { List <IMySlimBlock> _termBlocks = new List <IMySlimBlock>(); HyperDriveLogic.hyperDriveBlock.CubeGrid.GetBlocks(_termBlocks); var termBlocks = _termBlocks.Where(x => x.FatBlock is IMyTerminalBlock).ToList(); var _diceRoll = diceRoll.Next(1, 6); HyperDriveLogic.hyper = false; foreach (var _termB in termBlocks) { if (_diceRoll > 4) { MySoundPair _electricAudio = new MySoundPair("ParticleElectricalDischarge"); HyperDriveLogic.emitter.PlaySound(_electricAudio); double _dmgDiceChance = diceRoll.Next(0, 100); if (_termB.FatBlock is IMyReactor) { if ((_termB.FatBlock as IMyFunctionalBlock).Enabled) { var _termBDisable = _termB.FatBlock as IMyFunctionalBlock; _termBDisable.Enabled = false; } } if (_termB.FatBlock is IMyBatteryBlock && _dmgDiceChance > 17) { if ((_termB.FatBlock as IMyFunctionalBlock).Enabled) { var _termBDisable = _termB.FatBlock as IMyFunctionalBlock; _termBDisable.Enabled = false; } } if (_termB.FatBlock is IMyLightingBlock && _dmgDiceChance > 17) { if ((_termB.FatBlock as IMyFunctionalBlock).Enabled) { var _termBDisable = _termB.FatBlock as IMyFunctionalBlock; _termBDisable.Enabled = false; } } if (_dmgDiceChance > 70) { double _dmgDice = diceRoll.Next(0, 50); var _dmgDiceF = (float)_dmgDice * 0.01f; if (float.IsPositiveInfinity(_dmgDiceF)) { _dmgDiceF = float.MaxValue; } else if (float.IsNegativeInfinity(_dmgDiceF)) { _dmgDiceF = float.MinValue; } if (_dmgDiceChance > 90 && _termB.FatBlock is IMyGasTank) { int explosionPower = (int)0; var myGasTank = _termB.FatBlock as IMyGasTank; if (myGasTank != null) { explosionPower = (int)(myGasTank.Capacity * 0.05f); } if (explosionPower < 500) { explosionPower = 500; } float explosionRadius = (explosionPower / 50000) * 5; MyVisualScriptLogicProvider.CreateExplosion(_termB.FatBlock.GetPosition(), explosionRadius, explosionPower); var _termBDamage = _termB.MaxIntegrity * 1.1f; try { _termB.DoDamage(_termBDamage, MyDamageType.Destruction, true); } catch { Logging.Logging.Instance.WriteLine("GasTank Explosion System Failure"); return; } } else { var _termBDamage = _termB.MaxIntegrity * _dmgDiceF; try { _termB.DoDamage(_termBDamage, MyDamageType.Fire, true); //Use Destruction to damage even with shields, Fire for persistent effects } catch { Logging.Logging.Instance.WriteLine("EmergencyStop Damage System Failure"); return; } } } } } }
private void SyncThreadedEnts(bool clear = false, bool client = false) { try { if (clear) { Eject.Clear(); DestroyedBlocks.Clear(); MissileDmg.Clear(); MeteorDmg.Clear(); VoxelDmg.Clear(); CharacterDmg.Clear(); FewDmgBlocks.Clear(); CollidingBlocks.Clear(); ForceData.Clear(); ImpulseData.Clear(); return; } try { if (!Eject.IsEmpty) { MyCubeGrid myGrid; while (Eject.TryDequeue(out myGrid)) { if (myGrid == null || myGrid.MarkedForClose) { continue; } myGrid.Physics.LinearVelocity *= -0.25f; } } } catch (Exception ex) { Log.Line($"Exception in Eject: {ex}"); } try { if (!ForceData.IsEmpty) { MyAddForceData data; while (ForceData.TryDequeue(out data)) { var myGrid = data.MyGrid; if (myGrid == null || myGrid.MarkedForClose) { continue; } myGrid.Physics.AddForce(MyPhysicsForceType.APPLY_WORLD_FORCE, data.Force, null, Vector3D.Zero, data.MaxSpeed, data.Immediate); } } } catch (Exception ex) { Log.Line($"Exception in forceData: {ex}"); } try { if (!ImpulseData.IsEmpty) { MyImpulseData data; while (ImpulseData.TryDequeue(out data)) { var myGrid = data.MyGrid; if (myGrid == null || myGrid.MarkedForClose) { continue; } myGrid.Physics.ApplyImpulse(data.Direction, data.Position); } } } catch (Exception ex) { Log.Line($"Exception in impulseData: {ex}"); } if (client) { return; } try { if (!DestroyedBlocks.IsEmpty) { IMySlimBlock block; var nullCount = 0; while (DestroyedBlocks.TryDequeue(out block)) { var myGrid = block.CubeGrid as MyCubeGrid; if (myGrid == null) { continue; } EntIntersectInfo entInfo; WebEnts.TryGetValue(myGrid, out entInfo); if (entInfo == null) { nullCount++; myGrid.EnqueueDestroyedBlock(block.Position); continue; } EntIntersectInfo entRemoved; if (nullCount > 0) { WebEnts.TryRemove(myGrid, out entRemoved); } entInfo.CacheBlockList.Remove(block); myGrid.EnqueueDestroyedBlock(block.Position); } } } catch (Exception ex) { Log.Line($"Exception in destroyedBlocks: {ex}"); } try { if (!MissileDmg.IsEmpty) { MyEntity ent; while (MissileDmg.TryDequeue(out ent)) { if (ent == null || !ent.InScene || ent.MarkedForClose) { continue; } var computedDamage = ComputeAmmoDamage(ent); var damage = computedDamage * DsState.State.ModulateKinetic; if (computedDamage < 0) { damage = computedDamage; } var rayDir = Vector3D.Normalize(ent.Physics.LinearVelocity); var ray = new RayD(ent.PositionComp.WorldVolume.Center, rayDir); var intersect = CustomCollision.IntersectEllipsoid(DetectMatrixOutsideInv, DetectionMatrix, ray); var hitDist = intersect ?? 0; var hitPos = ray.Position + (ray.Direction * -hitDist); if (_mpActive) { AddShieldHit(ent.EntityId, damage, Session.Instance.MPExplosion, null, false, hitPos); ent.Close(); ent.InScene = false; } else { EnergyHit = true; WorldImpactPosition = hitPos; Absorb += damage; ImpactSize = damage; UtilsStatic.CreateFakeSmallExplosion(hitPos); ent.Close(); ent.InScene = false; } } } } catch (Exception ex) { Log.Line($"Exception in missileDmg: {ex}"); } try { if (!MeteorDmg.IsEmpty) { IMyMeteor meteor; while (MeteorDmg.TryDequeue(out meteor)) { if (meteor == null || meteor.MarkedForClose || meteor.Closed) { continue; } var damage = 5000 * DsState.State.ModulateEnergy; if (_mpActive) { AddShieldHit(meteor.EntityId, damage, Session.Instance.MPKinetic, null, false, meteor.PositionComp.WorldVolume.Center); meteor.DoDamage(10000f, Session.Instance.MpIgnoreDamage, true, null, MyCube.EntityId); } else { WorldImpactPosition = meteor.PositionComp.WorldVolume.Center; Absorb += damage; ImpactSize = damage; meteor.DoDamage(10000f, Session.Instance.MpIgnoreDamage, true, null, MyCube.EntityId); } } } } catch (Exception ex) { Log.Line($"Exception in missileDmg: {ex}"); } try { if (!VoxelDmg.IsEmpty) { MyVoxelBase voxel; while (VoxelDmg.TryDequeue(out voxel)) { if (voxel == null || voxel.RootVoxel.MarkedForClose || voxel.RootVoxel.Closed) { continue; } voxel.RootVoxel.RequestVoxelOperationElipsoid(Vector3.One * 1.0f, DetectMatrixOutside, 0, MyVoxelBase.OperationType.Cut); } } } catch (Exception ex) { Log.Line($"Exception in missileDmg: {ex}"); } try { if (!CharacterDmg.IsEmpty) { IMyCharacter character; while (CharacterDmg.TryDequeue(out character)) { var npcname = character.ToString(); if (npcname.Equals("Space_Wolf")) { character.Delete(); continue; } var hId = MyCharacterOxygenComponent.HydrogenId; var playerGasLevel = character.GetSuitGasFillLevel(hId); character.Components.Get <MyCharacterOxygenComponent>().UpdateStoredGasLevel(ref hId, (playerGasLevel * -0.0001f) + .002f); MyVisualScriptLogicProvider.CreateExplosion(character.GetPosition(), 0, 0); character.DoDamage(50f, Session.Instance.MpIgnoreDamage, true, null, MyCube.EntityId); var vel = character.Physics.LinearVelocity; if (vel == new Vector3D(0, 0, 0)) { vel = MyUtils.GetRandomVector3Normalized(); } var speedDir = Vector3D.Normalize(vel); var rnd = new Random(); var randomSpeed = rnd.Next(10, 20); var additionalSpeed = vel + (speedDir * randomSpeed); character.Physics.LinearVelocity = additionalSpeed; } } } catch (Exception ex) { Log.Line($"Exception in missileDmg: {ex}"); } try { if (!CollidingBlocks.IsEmpty) { IMySlimBlock block; var damageMulti = 350; if (ShieldMode == ShieldType.Station && DsState.State.Enhancer) { damageMulti = 10000; } while (CollidingBlocks.TryDequeue(out block)) { if (block == null) { continue; } var myGrid = block.CubeGrid as MyCubeGrid; if (block.IsDestroyed) { myGrid.EnqueueDestroyedBlock(block.Position); continue; } block.DoDamage(damageMulti, Session.Instance.MpIgnoreDamage, true, null, MyCube.EntityId); if (myGrid.BlocksCount == 0) { myGrid.SendGridCloseRequest(); } } } } catch (Exception ex) { Log.Line($"Exception in dmgBlocks: {ex}"); } try { if (!FewDmgBlocks.IsEmpty) { IMySlimBlock block; while (FewDmgBlocks.TryDequeue(out block)) { if (block == null) { continue; } var myGrid = block.CubeGrid as MyCubeGrid; if (block.IsDestroyed) { myGrid.EnqueueDestroyedBlock(block.Position); myGrid.Close(); continue; } block.DoDamage(block.MaxIntegrity * 0.9f, Session.Instance.MpIgnoreDamage, true, null, MyCube.EntityId); if (myGrid.BlocksCount == 0) { myGrid.SendGridCloseRequest(); } } } } catch (Exception ex) { Log.Line($"Exception in fewBlocks: {ex}"); } try { if (Session.Instance.EmpWork.EventRunning && Vector3D.DistanceSquared(DetectionCenter, Session.Instance.EmpWork.EpiCenter) <= Session.Instance.EmpWork.RangeCapSqr) { var empResistenceRatio = 1f; const long AttackerId = 0L; var energyResistenceRatio = DsState.State.ModulateKinetic; var epiCenter = Session.Instance.EmpWork.EpiCenter; var rangeCap = Session.Instance.EmpWork.RangeCap; var empDirYield = Session.Instance.EmpWork.DirYield; if (DsState.State.EmpProtection) { if (energyResistenceRatio < 0.4) { energyResistenceRatio = 0.4f; } empResistenceRatio = 0.1f; } //if (Session.Enforced.Debug >= 2) Log.Line($"[EmpBlastShield - Start] ShieldOwner:{MyGrid.DebugName} - Yield:{warHeadYield} - StackCount:{stackCount} - ProtectionRatio:{energyResistenceRatio * empResistenceRatio} - epiCenter:{epiCenter}"); var line = new LineD(epiCenter, SOriBBoxD.Center); var testDir = Vector3D.Normalize(line.From - line.To); var ray = new RayD(line.From, -testDir); var ellipsoid = CustomCollision.IntersectEllipsoid(DetectMatrixOutsideInv, DetectionMatrix, ray); if (!ellipsoid.HasValue) { //if (Session.Enforced.Debug >= 2) Log.Line($"[EmpBlastShield - Ellipsoid null hit] ShieldOwner:{MyGrid.DebugName} - Yield:{warHeadYield} - StackCount:{stackCount} - ProtectionRatio:{energyResistenceRatio * empResistenceRatio} - epiCenter:{epiCenter}"); return; } var impactPos = line.From + (testDir * -ellipsoid.Value); IHitInfo hitInfo; MyAPIGateway.Physics.CastRay(epiCenter, impactPos, out hitInfo, CollisionLayers.DefaultCollisionLayer); if (hitInfo != null) { //if (Session.Enforced.Debug >= 2) Log.Line($"[EmpBlastShield - occluded] ShieldOwner:{MyGrid.DebugName} - by {((MyEntity)hitInfo.HitEntity).DebugName}"); return; } var gridLocalMatrix = MyGrid.PositionComp.LocalMatrix; var worldDirection = impactPos - gridLocalMatrix.Translation; var localPosition = Vector3D.TransformNormal(worldDirection, MatrixD.Transpose(gridLocalMatrix)); var hitFaceSurfaceArea = UtilsStatic.GetIntersectingSurfaceArea(ShieldShapeMatrix, localPosition); var invSqrDist = UtilsStatic.InverseSqrDist(epiCenter, impactPos, rangeCap); var damageScaler = invSqrDist * hitFaceSurfaceArea; if (invSqrDist <= 0) { //if (Session.Enforced.Debug >= 2) Log.Line($"[EmpBlastShield - Range] ShieldOwner:{MyGrid.DebugName} - insqrDist was 0"); return; } var targetDamage = (float)(((empDirYield * damageScaler) * energyResistenceRatio) * empResistenceRatio); if (targetDamage >= DsState.State.Charge * ConvToHp) { _empOverLoad = true; } //if (Session.Enforced.Debug >= 2) Log.Line($"-----------------------] epiDist:{Vector3D.Distance(epiCenter, impactPos)} - iSqrDist:{invSqrDist} - RangeCap:{rangeCap} - SurfaceA:{hitFaceSurfaceArea}({_ellipsoidSurfaceArea * 0.5}) - dirYield:{empDirYield} - damageScaler:{damageScaler} - Damage:{targetDamage}(toOver:{(targetDamage / (DsState.State.Charge * ConvToHp))})"); if (_isServer && _mpActive) { AddEmpBlastHit(AttackerId, targetDamage, Session.Instance.MPEMP, impactPos); } EnergyHit = true; WorldImpactPosition = epiCenter; Absorb += targetDamage; } } catch (Exception ex) { Log.Line($"Exception in EmpBlast: {ex}"); } } catch (Exception ex) { Log.Line($"Exception in DamageGrids: {ex}"); } }