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