private void OnEntityRemove(MyEntity myEntity) { var warhead = myEntity as IMyWarhead; if (warhead != null) { if (!warhead.IsFunctional && (warhead.IsArmed || (warhead.DetonationTime <= 0 && warhead.IsCountingDown)) && warhead.CustomData.Length != 0) { var blastRatio = warhead.CubeGrid.GridSizeEnum == MyCubeSize.Small ? 1 : 5; var epicCenter = warhead.PositionComp.WorldAABB.Center; if (Enforced.Debug >= 2 && EmpStore.Count == 0) { Log.Line($"====================================================================== [WarHead EventStart]"); } EmpStore.Enqueue(new WarHeadBlast(blastRatio, epicCenter, warhead.CustomData)); } } }
private void PrepEmpBlast() { var stackCount = 0; var warHeadSize = 0; var warHeadYield = 0d; var epiCenter = Vector3D.Zero; WarHeadBlast empChild; while (EmpStore.TryDequeue(out empChild)) { if (empChild.CustomData.Contains("@EMP")) { stackCount++; warHeadSize = empChild.WarSize; warHeadYield = empChild.Yield; epiCenter += empChild.Position; } } if (stackCount == 0) { EmpWork.EventComplete(); return; } epiCenter /= stackCount; var rangeCap = MathHelper.Clamp(stackCount * warHeadYield, warHeadYield, SyncDist); _warHeadGridHits.Clear(); _pruneWarGrids.Clear(); var sphere = new BoundingSphereD(epiCenter, rangeCap); MyGamePruningStructure.GetAllTopMostEntitiesInSphere(ref sphere, _pruneWarGrids); foreach (var ent in _pruneWarGrids) { var grid = ent as MyCubeGrid; if (grid != null) { ShieldGridComponent sComp; grid.Components.TryGet(out sComp); if (sComp?.DefenseShields != null && sComp.DefenseShields.NotFailed) { continue; } var gridCenter = grid.PositionComp.WorldVolume.Center; var testDir = Vector3D.Normalize(gridCenter - epiCenter); var impactPos = gridCenter + (testDir * -grid.PositionComp.WorldVolume.Radius); IHitInfo hitInfo; MyAPIGateway.Physics.CastRay(epiCenter, impactPos, out hitInfo, CollisionLayers.DefaultCollisionLayer); if (hitInfo?.HitEntity == null) { _warHeadGridHits.Add(grid); } } } EmpWork.StoreEmpBlast(epiCenter, warHeadSize, warHeadYield, stackCount, rangeCap); }