internal void ReInit() { using (MyCube.Pin()) { if (!MyCube.MarkedForClose && Entity != null) { GridAi ai; if (!Session.GridTargetingAIs.TryGetValue(MyCube.CubeGrid, out ai)) { var newAi = Session.GridAiPool.Get(); newAi.Init(MyCube.CubeGrid, Session); Session.GridTargetingAIs[MyCube.CubeGrid] = newAi; Ai = newAi; } else { Ai = ai; } if (Ai != null) { Ai.FirstRun = true; if (Platform.State == MyWeaponPlatform.PlatformState.Inited) { Platform.ResetParts(this); } Entity.NeedsWorldMatrix = true; // ReInit Counters var blockDef = MyCube.BlockDefinition.Id.SubtypeId; if (!Ai.WeaponCounter.ContainsKey(blockDef)) // Need to account for reinit case { Ai.WeaponCounter[blockDef] = Session.WeaponCountPool.Get(); } var wCounter = Ai.WeaponCounter[blockDef]; wCounter.Max = Platform.Structure.GridWeaponCap; wCounter.Current++; Constructs.UpdateWeaponCounters(Ai); // end ReInit if (!Ai.GridInit || !Ai.Session.GridToInfoMap.ContainsKey(Ai.MyGrid)) { Session.CompReAdds.Add(new CompReAdd { Ai = Ai, AiVersion = Ai.Version, AddTick = Ai.Session.Tick, Comp = this }); } else { OnAddedToSceneTasks(); } } else { Log.Line($"Comp ReInit() failed stage2!"); } } else { Log.Line($"Comp ReInit() failed stage1! - marked:{MyCube.MarkedForClose} - Entity:{Entity != null} - hasAi:{Session.GridTargetingAIs.ContainsKey(MyCube.CubeGrid)}"); } } }
internal void RemoveComp() { try { if (Registered) { RegisterEvents(false); } if (Ai != null) { Ai.OptimalDps -= PeakDps; Ai.EffectiveDps -= EffectiveDps; WeaponCount wCount; if (Ai.WeaponCounter.TryGetValue(MyCube.BlockDefinition.Id.SubtypeId, out wCount)) { wCount.Current--; Constructs.UpdateWeaponCounters(Ai); if (wCount.Current == 0) { Ai.WeaponCounter.Remove(MyCube.BlockDefinition.Id.SubtypeId); Session.WeaponCountPool.Return(wCount); } } else if (Session.LocalVersion) { Log.Line($"didnt find counter for: {MyCube.BlockDefinition.Id.SubtypeId} - MarkedForClose:{Ai.MarkedForClose} - AiAge:{Ai.Session.Tick - Ai.AiSpawnTick} - CubeMarked:{MyCube.MarkedForClose} - GridMarked:{MyCube.CubeGrid.MarkedForClose}"); } if (Ai.Data.Repo.ActiveTerminal == MyCube.EntityId) { Ai.Data.Repo.ActiveTerminal = 0; } GridAi testAi; WeaponComponent comp; if (Ai.WeaponBase.TryRemove(MyCube, out comp)) { if (Platform.State == MyWeaponPlatform.PlatformState.Ready) { for (int i = 0; i < comp.Platform.Weapons.Length; i++) { var w = comp.Platform.Weapons[i]; w.StopShooting(); w.WeaponCache.HitEntity.Clean(); if (!Session.IsClient) { w.Target.Reset(Session.Tick, Target.States.AiLost); } if (w.DrawingPower) { w.StopPowerDraw(); } } } Ai.CompChange(false, this); } else { Log.Line($"RemoveComp Weaponbase didn't have my comp: {Ai.Session.CompsDelayed.Contains(this)} - FoundAi:{Ai.Session.GridTargetingAIs.TryGetValue(MyCube.CubeGrid, out testAi)} - sameAi:{testAi == Ai}"); } if (Ai.WeaponBase.Count == 0) { GridAi gridAi; Session.GridTargetingAIs.TryRemove(Ai.MyGrid, out gridAi); } Ai = null; } else if (Platform.State != MyWeaponPlatform.PlatformState.Delay) { Log.Line($"CompRemove: Ai already null - State:{Platform.State} - Status:{Status}"); } } catch (Exception ex) { Log.Line($"Exception in RemoveComp: {ex} - AiNull:{Ai == null} - SessionNull:{Session == null}"); } }