コード例 #1
0
ファイル: CompRun.cs プロジェクト: sstixrud/WeaponCore
        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)}");
                }
            }
        }
コード例 #2
0
        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}"); }
        }