internal void RemoveComp() { try { RegisterEvents(false); if (Ai != null) { Ai.CompChange(false, this); Ai.OptimalDps -= PeakDps; Ai.EffectiveDps -= EffectiveDps; WeaponComponent comp; if (Ai.WeaponBase.TryRemove(MyCube, out comp)) { if (Platform.State == MyWeaponPlatform.PlatformState.Ready) { WeaponCount wCount; if (Ai.WeaponCounter.TryGetValue(MyCube.BlockDefinition.Id.SubtypeId, out wCount)) { wCount.Current--; WeaponCount cntRemoved; if (wCount.Current == 0) { Ai.WeaponCounter.TryRemove(MyCube.BlockDefinition.Id.SubtypeId, out cntRemoved); } } for (int i = 0; i < comp.Platform.Weapons.Length; i++) { var w = comp.Platform.Weapons[i]; w.StopShooting(); w.WeaponCache.HitEntity.Clean(); if (w.DrawingPower) { w.StopPowerDraw(); } } } } else { Log.Line($"RemoveComp Weaponbase didn't have my comp"); } if (Ai.WeaponBase.Count == 0) { WeaponCount wCount; if (Ai.WeaponCounter.TryGetValue(MyCube.BlockDefinition.Id.SubtypeId, out wCount)) { Session.WeaponCountPool.Return(wCount); } GridAi gridAi; Session.GridTargetingAIs.TryRemove(Ai.MyGrid, out gridAi); } Ai = null; } } catch (Exception ex) { Log.Line($"Exception in RemoveComp: {ex} - AiNull:{Ai == null} - SessionNull:{Session == null}"); } }
internal void OnAddedToSceneTasks() { try { if (Ai.MarkedForClose) { Log.Line($"OnAddedToSceneTasks and AI MarkedForClose - Subtype:{MyCube.BlockDefinition.Id.SubtypeName} - grid:{MyCube.CubeGrid.DebugName} - CubeMarked:{MyCube.MarkedForClose}({Entity?.MarkedForClose}) - GridMarked:{MyCube.CubeGrid.MarkedForClose}({Entity?.GetTopMostParent()?.MarkedForClose}) - GridMatch:{MyCube.CubeGrid == Ai.MyGrid} - AiContainsMe:{Ai.WeaponBase.ContainsKey(MyCube)} - MyGridInAi:{Ai.Session.GridToMasterAi.ContainsKey(MyCube.CubeGrid)}[{Ai.Session.GridTargetingAIs.ContainsKey(MyCube.CubeGrid)}]"); } Ai.UpdatePowerSources = true; RegisterEvents(); if (!Ai.GridInit) { Ai.GridInit = true; var fatList = Session.GridToInfoMap[MyCube.CubeGrid].MyCubeBocks; for (int i = 0; i < fatList.Count; i++) { var cubeBlock = fatList[i]; if (cubeBlock is MyBatteryBlock || cubeBlock.HasInventory) { Ai.FatBlockAdded(cubeBlock); } } SubGridInit(); } var maxTrajectory = 0d; for (int i = 0; i < Platform.Weapons.Length; i++) { var weapon = Platform.Weapons[i]; weapon.InitTracking(); double weaponMaxRange; DpsAndHeatInit(weapon, out weaponMaxRange); if (maxTrajectory < weaponMaxRange) { maxTrajectory = weaponMaxRange; } if (weapon.Ammo.CurrentAmmo > weapon.ActiveAmmoDef.AmmoDef.Const.MagazineSize) { weapon.Ammo.CurrentAmmo = weapon.ActiveAmmoDef.AmmoDef.Const.MagazineSize; } if (Session.IsServer && weapon.TrackTarget) { Session.AcqManager.Monitor(weapon.Acquire); } } if (maxTrajectory + Ai.MyGrid.PositionComp.LocalVolume.Radius > Ai.MaxTargetingRange) { Ai.MaxTargetingRange = maxTrajectory + Ai.MyGrid.PositionComp.LocalVolume.Radius; Ai.MaxTargetingRangeSqr = Ai.MaxTargetingRange * Ai.MaxTargetingRange; } Ai.OptimalDps += PeakDps; Ai.EffectiveDps += EffectiveDps; if (!Ai.WeaponBase.TryAdd(MyCube, this)) { Log.Line($"failed to add cube to gridAi"); } Ai.CompChange(true, this); Ai.IsStatic = Ai.MyGrid.Physics?.IsStatic ?? false; Ai.Construct.Refresh(Ai, Constructs.RefreshCaller.Init); if (!FunctionalBlock.Enabled) { for (int i = 0; i < Platform.Weapons.Length; i++) { Session.FutureEvents.Schedule(Platform.Weapons[i].DelayedStart, null, 1); } } TurretBase?.SetTarget(Vector3D.MaxValue); Status = !IsWorking ? Start.Starting : Start.ReInit; } catch (Exception ex) { Log.Line($"Exception in OnAddedToSceneTasks: {ex} AiNull:{Ai == null} - SessionNull:{Session == null} EntNull{Entity == null} MyCubeNull:{MyCube?.CubeGrid == null}"); } }
internal void Init() { using (MyCube.Pin()) { if (!MyCube.MarkedForClose && Entity != null) { Entity.NeedsUpdate = ~MyEntityUpdateEnum.EACH_10TH_FRAME; Ai.FirstRun = true; StorageSetup(); InventoryInit(); PowerInit(); Ai.CompChange(true, this); RegisterEvents(); if (Platform.State == MyWeaponPlatform.PlatformState.Inited) { Platform.ResetParts(this); } Entity.NeedsWorldMatrix = true; for (int i = 0; i < Platform.Weapons.Length; i++) { var weapon = Platform.Weapons[i]; weapon.UpdatePivotPos(); if (Session.IsClient) { var target = WeaponValues.Targets[weapon.WeaponId]; if (target.State != TransferTarget.TargetInfo.Expired) { target.SyncTarget(weapon.Target, false); } if (!weapon.Target.IsProjectile && !weapon.Target.IsFakeTarget && weapon.Target.Entity == null) { weapon.Target.StateChange(true, Target.States.Invalid); weapon.Target.TargetChanged = false; } else if (weapon.Target.IsProjectile) { TargetType targetType; AcquireProjectile(weapon, out targetType); if (targetType == TargetType.None) { if (weapon.NewTarget.CurrentState != Target.States.NoTargetsSeen) { weapon.NewTarget.Reset(weapon.Comp.Session.Tick, Target.States.NoTargetsSeen); } if (weapon.Target.CurrentState != Target.States.NoTargetsSeen) { weapon.Target.Reset(weapon.Comp.Session.Tick, Target.States.NoTargetsSeen, !weapon.Comp.TrackReticle); } } } } } if (!Ai.GridInit) { Session.CompReAdds.Add(new CompReAdd { Ai = Ai, Comp = this }); } else { OnAddedToSceneTasks(); } Platform.State = MyWeaponPlatform.PlatformState.Ready; } else { Log.Line($"Comp Init() failed"); } } }
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.TryAdd(MyCube.CubeGrid, newAi); Ai = newAi; } else { Ai = ai; } if (Ai != null && Ai.WeaponBase.TryAdd(MyCube, this)) { Ai.FirstRun = true; var blockDef = MyCube.BlockDefinition.Id.SubtypeId; if (!Ai.WeaponCounter.ContainsKey(blockDef)) { Ai.WeaponCounter.TryAdd(blockDef, Session.WeaponCountPool.Get()); } Ai.WeaponCounter[blockDef].Current++; Ai.CompChange(true, this); RegisterEvents(); if (Platform.State == MyWeaponPlatform.PlatformState.Inited) { Platform.ResetParts(this); } Entity.NeedsWorldMatrix = true; if (!Ai.GridInit || !Ai.Session.GridToFatMap.ContainsKey(Ai.MyGrid)) { Session.CompReAdds.Add(new CompReAdd { Ai = Ai, 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}"); } }
internal void Init() { using (MyCube.Pin()) { if (!MyCube.MarkedForClose && Entity != null) { Entity.NeedsUpdate = ~MyEntityUpdateEnum.EACH_10TH_FRAME; Ai.FirstRun = true; StorageSetup(); InventoryInit(); PowerInit(); Ai.CompChange(true, this); RegisterEvents(); if (Platform.State == MyWeaponPlatform.PlatformState.Inited) { Platform.ResetParts(this); } Entity.NeedsWorldMatrix = true; if (!Ai.GridInit) { Session.CompReAdds.Add(new CompReAdd { Ai = Ai, Comp = this }); } else { OnAddedToSceneTasks(); } Platform.State = MyWeaponPlatform.PlatformState.Ready; for (int i = 0; i < Platform.Weapons.Length; i++) { var weapon = Platform.Weapons[i]; weapon.UpdatePivotPos(); if (Session.IsClient) { var target = WeaponValues.Targets[weapon.WeaponId]; if (target.State != TransferTarget.TargetInfo.Expired) { target.SyncTarget(weapon.Target, false); } if (!weapon.Target.IsProjectile && !weapon.Target.IsFakeTarget && weapon.Target.Entity == null) { weapon.Target.StateChange(true, Target.States.Invalid); weapon.Target.TargetChanged = false; } else if (weapon.Target.IsProjectile) { TargetType targetType; AcquireProjectile(weapon, out targetType); if (targetType == TargetType.None) { if (weapon.NewTarget.CurrentState != Target.States.NoTargetsSeen) { weapon.NewTarget.Reset(weapon.Comp.Session.Tick, Target.States.NoTargetsSeen); } if (weapon.Target.CurrentState != Target.States.NoTargetsSeen) { weapon.Target.Reset(weapon.Comp.Session.Tick, Target.States.NoTargetsSeen, !weapon.Comp.TrackReticle); } } } } if (weapon.State.Sync.CurrentAmmo == 0 && !weapon.State.Sync.Reloading) { weapon.EventTriggerStateChanged(EventTriggers.EmptyOnGameLoad, true); } if (weapon.AnimationsSet.ContainsKey(EventTriggers.TurnOn)) { //Log.Line($"On exists"); for (int j = 0; j < weapon.AnimationsSet[EventTriggers.TurnOn].Length; j++) { var animation = weapon.AnimationsSet[EventTriggers.TurnOn][j]; MyAPIGateway.Utilities.InvokeOnGameThread(() => weapon.PlayEmissives(animation, weapon.System)); } } } } else { Log.Line($"Comp Init() failed"); } } }