Example #1
0
        public async Task RejuvenateDeadTest()
        {
            await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = true, ExtraPrototypes = Prototypes });

            var server           = pairTracker.Pair.Server;
            var entManager       = server.ResolveDependency <IEntityManager>();
            var mapManager       = server.ResolveDependency <IMapManager>();
            var prototypeManager = server.ResolveDependency <IPrototypeManager>();
            var mobStateSystem   = entManager.EntitySysManager.GetEntitySystem <Server.MobState.MobStateSystem>();
            var damSystem        = entManager.EntitySysManager.GetEntitySystem <DamageableSystem>();

            await server.WaitAssertion(() =>
            {
                mapManager.CreateNewMapEntity(MapId.Nullspace);

                var human = entManager.SpawnEntity("DamageableDummy", MapCoordinates.Nullspace);

                // Sanity check
                Assert.True(entManager.TryGetComponent(human, out DamageableComponent damageable));
                Assert.True(entManager.TryGetComponent(human, out MobStateComponent mobState));
                Assert.That(mobStateSystem.IsAlive(human, mobState), Is.True);
                Assert.That(mobStateSystem.IsCritical(human, mobState), Is.False);
                Assert.That(mobStateSystem.IsDead(human, mobState), Is.False);
                Assert.That(mobStateSystem.IsIncapacitated(human, mobState), Is.False);

                // Kill the entity
                DamageSpecifier damage = new(prototypeManager.Index <DamageGroupPrototype>("Toxin"),
                                             FixedPoint2.New(10000000));

                damSystem.TryChangeDamage(human, damage, true);

                // Check that it is dead
                Assert.That(mobStateSystem.IsAlive(human, mobState), Is.False);
                Assert.That(mobStateSystem.IsCritical(human, mobState), Is.False);
                Assert.That(mobStateSystem.IsDead(human, mobState), Is.True);
                Assert.That(mobStateSystem.IsIncapacitated(human, mobState), Is.True);

                // Rejuvenate them
                RejuvenateCommand.PerformRejuvenate(human);

                // Check that it is alive and with no damage
                Assert.That(mobStateSystem.IsAlive(human, mobState), Is.True);
                Assert.That(mobStateSystem.IsCritical(human, mobState), Is.False);
                Assert.That(mobStateSystem.IsDead(human, mobState), Is.False);
                Assert.That(mobStateSystem.IsIncapacitated(human, mobState), Is.False);

                Assert.That(damageable.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
            });

            await pairTracker.CleanReturnAsync();
        }
Example #2
0
        public async Task RejuvenateDeadTest()
        {
            var options = new ServerIntegrationOptions {
                ExtraPrototypes = Prototypes
            };
            var server = StartServer(options);

            await server.WaitAssertion(() =>
            {
                var mapManager = IoCManager.Resolve <IMapManager>();

                mapManager.CreateNewMapEntity(MapId.Nullspace);

                var entityManager    = IoCManager.Resolve <IEntityManager>();
                var prototypeManager = IoCManager.Resolve <IPrototypeManager>();

                var human = entityManager.SpawnEntity("DamageableDummy", MapCoordinates.Nullspace);

                // Sanity check
                Assert.True(IoCManager.Resolve <IEntityManager>().TryGetComponent(human, out DamageableComponent damageable));
                Assert.True(IoCManager.Resolve <IEntityManager>().TryGetComponent(human, out MobStateComponent mobState));
                mobState.UpdateState(0);
                Assert.That(mobState.IsAlive, Is.True);
                Assert.That(mobState.IsCritical, Is.False);
                Assert.That(mobState.IsDead, Is.False);
                Assert.That(mobState.IsIncapacitated, Is.False);

                // Kill the entity
                DamageSpecifier damage = new(prototypeManager.Index <DamageGroupPrototype>("Toxin"),
                                             FixedPoint2.New(10000000));
                EntitySystem.Get <DamageableSystem>().TryChangeDamage(human, damage, true);

                // Check that it is dead
                Assert.That(mobState.IsAlive, Is.False);
                Assert.That(mobState.IsCritical, Is.False);
                Assert.That(mobState.IsDead, Is.True);
                Assert.That(mobState.IsIncapacitated, Is.True);

                // Rejuvenate them
                RejuvenateCommand.PerformRejuvenate(human);

                // Check that it is alive and with no damage
                Assert.That(mobState.IsAlive, Is.True);
                Assert.That(mobState.IsCritical, Is.False);
                Assert.That(mobState.IsDead, Is.False);
                Assert.That(mobState.IsIncapacitated, Is.False);

                Assert.That(damageable.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
            });
        }
Example #3
0
    private void AddTricksVerbs(GetVerbsEvent <Verb> args)
    {
        if (!EntityManager.TryGetComponent <ActorComponent?>(args.User, out var actor))
        {
            return;
        }

        var player = actor.PlayerSession;

        if (!_adminManager.HasAdminFlag(player, AdminFlags.Admin))
        {
            return;
        }

        if (_adminManager.HasAdminFlag(player, AdminFlags.Admin))
        {
            if (TryComp <AirlockComponent>(args.Target, out var airlock))
            {
                Verb bolt = new()
                {
                    Text        = airlock.BoltsDown ? "Unbolt" : "Bolt",
                    Category    = VerbCategory.Tricks,
                    IconTexture = airlock.BoltsDown
                        ? "/Textures/Interface/AdminActions/unbolt.png"
                        : "/Textures/Interface/AdminActions/bolt.png",
                    Act = () =>
                    {
                        airlock.SetBoltsWithAudio(!airlock.BoltsDown);
                    },
                    Impact  = LogImpact.Medium,
                    Message = Loc.GetString(airlock.BoltsDown
                        ? "admin-trick-unbolt-description"
                        : "admin-trick-bolt-description"),
                    Priority = (int)(airlock.BoltsDown ? TricksVerbPriorities.Unbolt : TricksVerbPriorities.Bolt),
                };
                args.Verbs.Add(bolt);

                Verb emergencyAccess = new()
                {
                    Text        = airlock.EmergencyAccess ? "Emergency Access Off" : "Emergency Access On",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/AdminActions/emergency_access.png",
                    Act         = () =>
                    {
                        _airlockSystem.ToggleEmergencyAccess(airlock);
                    },
                    Impact  = LogImpact.Medium,
                    Message = Loc.GetString(airlock.EmergencyAccess
                        ? "admin-trick-emergency-access-off-description"
                        : "admin-trick-emergency-access-on-description"),
                    Priority = (int)(airlock.EmergencyAccess
                        ? TricksVerbPriorities.EmergencyAccessOff
                        : TricksVerbPriorities.EmergencyAccessOn),
                };
                args.Verbs.Add(emergencyAccess);
            }

            if (HasComp <DamageableComponent>(args.Target))
            {
                Verb rejuvenate = new()
                {
                    Text        = "Rejuvenate",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/AdminActions/rejuvenate.png",
                    Act         = () =>
                    {
                        RejuvenateCommand.PerformRejuvenate(args.Target);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-rejuvenate-description"),
                    Priority = (int)TricksVerbPriorities.Rejuvenate,
                };
                args.Verbs.Add(rejuvenate);
            }

            if (!_godmodeSystem.HasGodmode(args.Target))
            {
                Verb makeIndestructible = new()
                {
                    Text        = "Make Indestructible",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/VerbIcons/plus.svg.192dpi.png",
                    Act         = () =>
                    {
                        _godmodeSystem.EnableGodmode(args.Target);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-make-indestructible-description"),
                    Priority = (int)TricksVerbPriorities.MakeIndestructible,
                };
                args.Verbs.Add(makeIndestructible);
            }
            else
            {
                Verb makeVulnerable = new()
                {
                    Text        = "Make Vulnerable",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/VerbIcons/plus.svg.192dpi.png",
                    Act         = () =>
                    {
                        _godmodeSystem.DisableGodmode(args.Target);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-make-vulnerable-description"),
                    Priority = (int)TricksVerbPriorities.MakeVulnerable,
                };
                args.Verbs.Add(makeVulnerable);
            }

            if (TryComp <BatteryComponent>(args.Target, out var battery))
            {
                Verb refillBattery = new()
                {
                    Text        = "Refill Battery",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/AdminActions/fill_battery.png",
                    Act         = () =>
                    {
                        battery.CurrentCharge = battery.MaxCharge;
                        Dirty(battery);
                    },
                    Impact   = LogImpact.Medium,
                    Message  = Loc.GetString("admin-trick-refill-battery-description"),
                    Priority = (int)TricksVerbPriorities.RefillBattery,
                };
                args.Verbs.Add(refillBattery);

                Verb drainBattery = new()
                {
                    Text        = "Drain Battery",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/AdminActions/drain_battery.png",
                    Act         = () =>
                    {
                        battery.CurrentCharge = 0;
                        Dirty(battery);
                    },
                    Impact   = LogImpact.Medium,
                    Message  = Loc.GetString("admin-trick-drain-battery-description"),
                    Priority = (int)TricksVerbPriorities.DrainBattery,
                };
                args.Verbs.Add(drainBattery);

                Verb infiniteBattery = new()
                {
                    Text        = "Infinite Battery",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/AdminActions/infinite_battery.png",
                    Act         = () =>
                    {
                        var recharger = EnsureComp <BatterySelfRechargerComponent>(args.Target);
                        recharger.AutoRecharge     = true;
                        recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill.
                    },
                    Impact   = LogImpact.Medium,
                    Message  = Loc.GetString("admin-trick-infinite-battery-object-description"),
                    Priority = (int)TricksVerbPriorities.InfiniteBattery,
                };
                args.Verbs.Add(infiniteBattery);
            }

            if (TryComp <AnchorableComponent>(args.Target, out var anchor))
            {
                Verb blockUnanchor = new()
                {
                    Text        = "Block Unanchoring",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/VerbIcons/anchor.svg.192dpi.png",
                    Act         = () =>
                    {
                        RemComp(args.Target, anchor);
                    },
                    Impact   = LogImpact.Medium,
                    Message  = Loc.GetString("admin-trick-block-unanchoring-description"),
                    Priority = (int)TricksVerbPriorities.BlockUnanchoring,
                };
                args.Verbs.Add(blockUnanchor);
            }

            if (TryComp <GasTankComponent>(args.Target, out var tank))
            {
                Verb refillInternalsO2 = new()
                {
                    Text        = "Refill Internals Oxygen",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Tanks/oxygen.rsi/icon.png",
                    Act         = () =>
                    {
                        RefillGasTank(args.Target, Gas.Oxygen, tank);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-internals-refill-oxygen-description"),
                    Priority = (int)TricksVerbPriorities.RefillOxygen,
                };
                args.Verbs.Add(refillInternalsO2);

                Verb refillInternalsN2 = new()
                {
                    Text        = "Refill Internals Nitrogen",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Tanks/red.rsi/icon.png",
                    Act         = () =>
                    {
                        RefillGasTank(args.Target, Gas.Nitrogen, tank);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-internals-refill-nitrogen-description"),
                    Priority = (int)TricksVerbPriorities.RefillNitrogen,
                };
                args.Verbs.Add(refillInternalsN2);

                Verb refillInternalsPlasma = new()
                {
                    Text        = "Refill Internals Plasma",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Tanks/plasma.rsi/icon.png",
                    Act         = () =>
                    {
                        RefillGasTank(args.Target, Gas.Plasma, tank);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-internals-refill-plasma-description"),
                    Priority = (int)TricksVerbPriorities.RefillPlasma,
                };
                args.Verbs.Add(refillInternalsPlasma);
            }

            if (TryComp <InventoryComponent>(args.Target, out var inventory))
            {
                Verb refillInternalsO2 = new()
                {
                    Text        = "Refill Internals Oxygen",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Tanks/oxygen.rsi/icon.png",
                    Act         = () =>
                    {
                        foreach (var slot in _inventorySystem.GetSlots(args.Target))
                        {
                            if (!_inventorySystem.TryGetSlotEntity(args.Target, slot.Name, out var entity))
                            {
                                continue;
                            }

                            if (!TryComp <GasTankComponent>(entity, out var tank))
                            {
                                continue;
                            }

                            RefillGasTank(entity.Value, Gas.Oxygen, tank);
                        }

                        foreach (var held in _handsSystem.EnumerateHeld(args.Target))
                        {
                            if (!TryComp <GasTankComponent>(held, out var tank))
                            {
                                continue;
                            }

                            RefillGasTank(held, Gas.Oxygen, tank);
                        }
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-internals-refill-oxygen-description"),
                    Priority = (int)TricksVerbPriorities.RefillOxygen,
                };
                args.Verbs.Add(refillInternalsO2);

                Verb refillInternalsN2 = new()
                {
                    Text        = "Refill Internals Nitrogen",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Tanks/red.rsi/icon.png",
                    Act         = () =>
                    {
                        foreach (var slot in _inventorySystem.GetSlots(args.Target))
                        {
                            if (!_inventorySystem.TryGetSlotEntity(args.Target, slot.Name, out var entity))
                            {
                                continue;
                            }

                            if (!TryComp <GasTankComponent>(entity, out var tank))
                            {
                                continue;
                            }

                            RefillGasTank(entity.Value, Gas.Nitrogen, tank);
                        }

                        foreach (var held in _handsSystem.EnumerateHeld(args.Target))
                        {
                            if (!TryComp <GasTankComponent>(held, out var tank))
                            {
                                continue;
                            }

                            RefillGasTank(held, Gas.Nitrogen, tank);
                        }
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-internals-refill-nitrogen-description"),
                    Priority = (int)TricksVerbPriorities.RefillNitrogen,
                };
                args.Verbs.Add(refillInternalsN2);

                Verb refillInternalsPlasma = new()
                {
                    Text        = "Refill Internals Plasma",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Tanks/plasma.rsi/icon.png",
                    Act         = () =>
                    {
                        foreach (var slot in _inventorySystem.GetSlots(args.Target))
                        {
                            if (!_inventorySystem.TryGetSlotEntity(args.Target, slot.Name, out var entity))
                            {
                                continue;
                            }

                            if (!TryComp <GasTankComponent>(entity, out var tank))
                            {
                                continue;
                            }

                            RefillGasTank(entity.Value, Gas.Plasma, tank);
                        }

                        foreach (var held in _handsSystem.EnumerateHeld(args.Target))
                        {
                            if (!TryComp <GasTankComponent>(held, out var tank))
                            {
                                continue;
                            }

                            RefillGasTank(held, Gas.Plasma, tank);
                        }
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-internals-refill-plasma-description"),
                    Priority = (int)TricksVerbPriorities.RefillPlasma,
                };
                args.Verbs.Add(refillInternalsPlasma);
            }

            Verb sendToTestArena = new()
            {
                Text        = "Send to test arena",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/VerbIcons/eject.svg.192dpi.png",
                Act         = () =>
                {
                    var(_, arenaGrid) = _adminTestArenaSystem.AssertArenaLoaded(player);

                    Transform(args.Target).Coordinates = new EntityCoordinates(arenaGrid, Vector2.One);
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-send-to-test-arena-description"),
                Priority = (int)TricksVerbPriorities.SendToTestArena,
            };
            args.Verbs.Add(sendToTestArena);

            var activeId = FindActiveId(args.Target);

            if (activeId is not null)
            {
                Verb grantAllAccess = new()
                {
                    Text        = "Grant All Access",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Misc/id_cards.rsi/centcom.png",
                    Act         = () =>
                    {
                        GiveAllAccess(activeId.Value);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-grant-all-access-description"),
                    Priority = (int)TricksVerbPriorities.GrantAllAccess,
                };
                args.Verbs.Add(grantAllAccess);

                Verb revokeAllAccess = new()
                {
                    Text        = "Revoke All Access",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Misc/id_cards.rsi/default.png",
                    Act         = () =>
                    {
                        RevokeAllAccess(activeId.Value);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-revoke-all-access-description"),
                    Priority = (int)TricksVerbPriorities.RevokeAllAccess,
                };
                args.Verbs.Add(revokeAllAccess);
            }

            if (HasComp <AccessComponent>(args.Target))
            {
                Verb grantAllAccess = new()
                {
                    Text        = "Grant All Access",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Misc/id_cards.rsi/centcom.png",
                    Act         = () =>
                    {
                        GiveAllAccess(args.Target);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-grant-all-access-description"),
                    Priority = (int)TricksVerbPriorities.GrantAllAccess,
                };
                args.Verbs.Add(grantAllAccess);

                Verb revokeAllAccess = new()
                {
                    Text        = "Revoke All Access",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Objects/Misc/id_cards.rsi/default.png",
                    Act         = () =>
                    {
                        RevokeAllAccess(args.Target);
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-revoke-all-access-description"),
                    Priority = (int)TricksVerbPriorities.RevokeAllAccess,
                };
                args.Verbs.Add(revokeAllAccess);
            }
        }

        if (TryComp <StackComponent>(args.Target, out var stack))
        {
            Verb adjustStack = new()
            {
                Text        = "Adjust Stack",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/adjust-stack.png",
                Act         = () =>
                {
                    // Unbounded intentionally.
                    _quickDialog.OpenDialog(player, "Adjust stack", $"Amount (max {stack.MaxCount})", (int newAmount) =>
                    {
                        _stackSystem.SetCount(args.Target, newAmount, stack);
                    });
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-adjust-stack-description"),
                Priority = (int)TricksVerbPriorities.AdjustStack,
            };
            args.Verbs.Add(adjustStack);

            Verb fillStack = new()
            {
                Text        = "Fill Stack",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/fill-stack.png",
                Act         = () =>
                {
                    _stackSystem.SetCount(args.Target, stack.MaxCount, stack);
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-fill-stack-description"),
                Priority = (int)TricksVerbPriorities.FillStack,
            };
            args.Verbs.Add(fillStack);
        }

        Verb rename = new()
        {
            Text        = "Rename",
            Category    = VerbCategory.Tricks,
            IconTexture = "/Textures/Interface/AdminActions/rename.png",
            Act         = () =>
            {
                _quickDialog.OpenDialog(player, "Rename", "Name", (string newName) =>
                {
                    MetaData(args.Target).EntityName = newName;
                });
            },
            Impact   = LogImpact.Medium,
            Message  = Loc.GetString("admin-trick-rename-description"),
            Priority = (int)TricksVerbPriorities.Rename,
        };

        args.Verbs.Add(rename);

        Verb redescribe = new()
        {
            Text        = "Redescribe",
            Category    = VerbCategory.Tricks,
            IconTexture = "/Textures/Interface/AdminActions/redescribe.png",
            Act         = () =>
            {
                _quickDialog.OpenDialog(player, "Redescribe", "Description", (LongString newDescription) =>
                {
                    MetaData(args.Target).EntityDescription = newDescription.String;
                });
            },
            Impact   = LogImpact.Medium,
            Message  = Loc.GetString("admin-trick-redescribe-description"),
            Priority = (int)TricksVerbPriorities.Redescribe,
        };

        args.Verbs.Add(redescribe);

        Verb renameAndRedescribe = new()
        {
            Text        = "Redescribe",
            Category    = VerbCategory.Tricks,
            IconTexture = "/Textures/Interface/AdminActions/rename_and_redescribe.png",
            Act         = () =>
            {
                _quickDialog.OpenDialog(player, "Rename & Redescribe", "Name", "Description",
                                        (string newName, LongString newDescription) =>
                {
                    var meta               = MetaData(args.Target);
                    meta.EntityName        = newName;
                    meta.EntityDescription = newDescription.String;
                });
            },
            Impact   = LogImpact.Medium,
            Message  = Loc.GetString("admin-trick-rename-and-redescribe-description"),
            Priority = (int)TricksVerbPriorities.RenameAndRedescribe,
        };

        args.Verbs.Add(renameAndRedescribe);

        if (TryComp <StationDataComponent>(args.Target, out var stationData))
        {
            if (_adminManager.HasAdminFlag(player, AdminFlags.Round))
            {
                Verb barJobSlots = new()
                {
                    Text        = "Bar job slots",
                    Category    = VerbCategory.Tricks,
                    IconTexture = "/Textures/Interface/AdminActions/bar_jobslots.png",
                    Act         = () =>
                    {
                        foreach (var(job, _) in _stationJobsSystem.GetJobs(args.Target))
                        {
                            _stationJobsSystem.TrySetJobSlot(args.Target, job, 0, true);
                        }
                    },
                    Impact   = LogImpact.Extreme,
                    Message  = Loc.GetString("admin-trick-bar-job-slots-description"),
                    Priority = (int)TricksVerbPriorities.BarJobSlots,
                };
                args.Verbs.Add(barJobSlots);
            }

            Verb locateCargoShuttle = new()
            {
                Text        = "Locate Cargo Shuttle",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Clothing/Head/Soft/cargosoft.rsi/icon.png",
                Act         = () =>
                {
                    var shuttle = Comp <StationCargoOrderDatabaseComponent>(args.Target).Shuttle;

                    if (shuttle is null)
                    {
                        return;
                    }

                    Transform(args.User).Coordinates = new EntityCoordinates(shuttle.Value, Vector2.Zero);
                },
                Impact   = LogImpact.Low,
                Message  = Loc.GetString("admin-trick-locate-cargo-shuttle-description"),
                Priority = (int)TricksVerbPriorities.LocateCargoShuttle,
            };
            args.Verbs.Add(locateCargoShuttle);
        }

        if (TryGetGridChildren(args.Target, out var childEnum))
        {
            Verb refillBattery = new()
            {
                Text        = "Refill Battery",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/fill_battery.png",
                Act         = () =>
                {
                    foreach (var ent in childEnum)
                    {
                        if (!HasComp <StationInfiniteBatteryTargetComponent>(ent))
                        {
                            continue;
                        }
                        var battery = EnsureComp <BatteryComponent>(ent);
                        battery.CurrentCharge = battery.MaxCharge;
                        Dirty(battery);
                    }
                },
                Impact   = LogImpact.Extreme,
                Message  = Loc.GetString("admin-trick-refill-battery-description"),
                Priority = (int)TricksVerbPriorities.RefillBattery,
            };
            args.Verbs.Add(refillBattery);

            Verb drainBattery = new()
            {
                Text        = "Drain Battery",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/drain_battery.png",
                Act         = () =>
                {
                    foreach (var ent in childEnum)
                    {
                        if (!HasComp <StationInfiniteBatteryTargetComponent>(ent))
                        {
                            continue;
                        }
                        var battery = EnsureComp <BatteryComponent>(ent);
                        battery.CurrentCharge = 0;
                        Dirty(battery);
                    }
                },
                Impact   = LogImpact.Extreme,
                Message  = Loc.GetString("admin-trick-drain-battery-description"),
                Priority = (int)TricksVerbPriorities.DrainBattery,
            };
            args.Verbs.Add(drainBattery);

            Verb infiniteBattery = new()
            {
                Text        = "Infinite Battery",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/infinite_battery.png",
                Act         = () =>
                {
                    // this kills the sloth
                    foreach (var ent in childEnum)
                    {
                        if (!HasComp <StationInfiniteBatteryTargetComponent>(ent))
                        {
                            continue;
                        }

                        var recharger = EnsureComp <BatterySelfRechargerComponent>(ent);
                        var battery   = EnsureComp <BatteryComponent>(ent);

                        recharger.AutoRecharge     = true;
                        recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill.
                    }
                },
                Impact   = LogImpact.Extreme,
                Message  = Loc.GetString("admin-trick-infinite-battery-description"),
                Priority = (int)TricksVerbPriorities.InfiniteBattery,
            };
            args.Verbs.Add(infiniteBattery);
        }

        if (TryComp <PhysicsComponent>(args.Target, out var physics))
        {
            Verb haltMovement = new()
            {
                Text        = "Halt Movement",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/halt.png",
                Act         = () =>
                {
                    physics.LinearVelocity  = Vector2.Zero;
                    physics.AngularVelocity = 0.0f;
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-halt-movement-description"),
                Priority = (int)TricksVerbPriorities.HaltMovement,
            };
            args.Verbs.Add(haltMovement);
        }

        if (TryComp <IMapComponent>(args.Target, out var map))
        {
            if (_adminManager.HasAdminFlag(player, AdminFlags.Mapping))
            {
                if (_mapManager.IsMapPaused(map.WorldMap))
                {
                    Verb unpauseMap = new()
                    {
                        Text        = "Unpause Map",
                        Category    = VerbCategory.Tricks,
                        IconTexture = "/Textures/Interface/AdminActions/play.png",
                        Act         = () =>
                        {
                            _mapManager.SetMapPaused(map.WorldMap, false);
                        },
                        Impact   = LogImpact.Extreme,
                        Message  = Loc.GetString("admin-trick-unpause-map-description"),
                        Priority = (int)TricksVerbPriorities.Unpause,
                    };
                    args.Verbs.Add(unpauseMap);
                }
                else
                {
                    Verb pauseMap = new()
                    {
                        Text        = "Pause Map",
                        Category    = VerbCategory.Tricks,
                        IconTexture = "/Textures/Interface/AdminActions/pause.png",
                        Act         = () =>
                        {
                            _mapManager.SetMapPaused(map.WorldMap, true);
                        },
                        Impact   = LogImpact.Extreme,
                        Message  = Loc.GetString("admin-trick-pause-map-description"),
                        Priority = (int)TricksVerbPriorities.Pause,
                    };
                    args.Verbs.Add(pauseMap);
                }
            }
        }

        if (TryComp <JointComponent>(args.Target, out var joints))
        {
            Verb snapJoints = new()
            {
                Text        = "Snap Joints",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Interface/AdminActions/snap_joints.png",
                Act         = () =>
                {
                    _jointSystem.ClearJoints(joints);
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-snap-joints-description"),
                Priority = (int)TricksVerbPriorities.SnapJoints,
            };
            args.Verbs.Add(snapJoints);
        }

        if (TryComp <GunComponent>(args.Target, out var gun))
        {
            Verb minigunFire = new()
            {
                Text        = "Make Minigun",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Objects/Weapons/Guns/HMGs/minigun.rsi/icon.png",
                Act         = () =>
                {
                    gun.FireRate = 15;
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-minigun-fire-description"),
                Priority = (int)TricksVerbPriorities.MakeMinigun,
            };
            args.Verbs.Add(minigunFire);
        }

        if (TryComp <BallisticAmmoProviderComponent>(args.Target, out var ballisticAmmo))
        {
            Verb setCapacity = new()
            {
                Text        = "Set Bullet Amount",
                Category    = VerbCategory.Tricks,
                IconTexture = "/Textures/Objects/Fun/caps.rsi/mag-6.png",
                Act         = () =>
                {
                    _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (max {ballisticAmmo.Capacity}):", (int amount) =>
                    {
                        ballisticAmmo.UnspawnedCount = amount;
                    });
                },
                Impact   = LogImpact.Medium,
                Message  = Loc.GetString("admin-trick-set-bullet-amount-description"),
                Priority = (int)TricksVerbPriorities.SetBulletAmount,
            };
            args.Verbs.Add(setCapacity);
        }
    }
Example #4
0
        private void AddDebugVerbs(GetOtherVerbsEvent args)
        {
            if (!args.User.TryGetComponent <ActorComponent>(out var actor))
            {
                return;
            }

            var player = actor.PlayerSession;

            // Delete verb
            if (_groupController.CanCommand(player, "deleteentity"))
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("delete-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/delete.svg.192dpi.png";
                verb.Act         = () => args.Target.Delete();
                args.Verbs.Add(verb);
            }

            // Rejuvenate verb
            if (_groupController.CanCommand(player, "rejuvenate"))
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("rejuvenate-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/rejuvenate.svg.192dpi.png";
                verb.Act         = () => RejuvenateCommand.PerformRejuvenate(args.Target);
                args.Verbs.Add(verb);
            }

            // Control mob verb
            if (_groupController.CanCommand(player, "controlmob") &&
                args.User != args.Target &&
                args.User.HasComponent <MindComponent>() &&
                args.Target.TryGetComponent <MindComponent>(out var targetMind))
            {
                Verb verb = new();
                verb.Text     = Loc.GetString("control-mob-verb-get-data-text");
                verb.Category = VerbCategory.Debug;
                // TODO VERB ICON control mob icon
                verb.Act = () =>
                {
                    targetMind.Mind?.TransferTo(null);
                    player.ContentData()?.Mind?.TransferTo(args.Target, ghostCheckOverride: true);
                };
                args.Verbs.Add(verb);
            }

            // Make Sentient verb
            if (_groupController.CanCommand(player, "makesentient") &&
                args.User != args.Target &&
                !args.Target.HasComponent <MindComponent>())
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("make-sentient-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/sentient.svg.192dpi.png";
                verb.Act         = () => MakeSentientCommand.MakeSentient(args.Target);
                args.Verbs.Add(verb);
            }

            if (_adminManager.HasAdminFlag(player, AdminFlags.Fun))
            {
                Verb verb = new();
                verb.Text     = Loc.GetString("explode-verb-get-data-text");
                verb.Category = VerbCategory.Debug;
                verb.Act      = () =>
                {
                    var coords = args.Target.Transform.Coordinates;
                    Timer.Spawn(_gameTiming.TickPeriod, () => ExplosionHelper.SpawnExplosion(coords, 0, 1, 2, 1), CancellationToken.None);
                    if (args.Target.TryGetComponent(out SharedBodyComponent? body))
                    {
                        body.Gib();
                    }
                };
                args.Verbs.Add(verb);
            }

            // Set clothing verb
            if (_groupController.CanCommand(player, "setoutfit") &&
                args.Target.HasComponent <InventoryComponent>())
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("set-outfit-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/outfit.svg.192dpi.png";
                verb.Act         = () => _euiManager.OpenEui(new SetOutfitEui(args.Target), player);
                args.Verbs.Add(verb);
            }

            // In range unoccluded verb
            if (_groupController.CanCommand(player, "inrangeunoccluded"))
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("in-range-unoccluded-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/information.svg.192dpi.png";
                verb.Act         = () =>
                {
                    var message = args.User.InRangeUnOccluded(args.Target)
                    ? Loc.GetString("in-range-unoccluded-verb-on-activate-not-occluded")
                    : Loc.GetString("in-range-unoccluded-verb-on-activate-occluded");
                    args.Target.PopupMessage(args.User, message);
                };
                args.Verbs.Add(verb);
            }

            // Get Disposal tube direction verb
            if (_groupController.CanCommand(player, "tubeconnections") &&
                args.Target.TryGetComponent <IDisposalTubeComponent>(out var tube))
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("tube-direction-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/information.svg.192dpi.png";
                verb.Act         = () => tube.PopupDirections(args.User);
                args.Verbs.Add(verb);
            }

            // Make ghost role verb
            if (_groupController.CanCommand(player, "makeghostrole") &&
                !(args.Target.GetComponentOrNull <MindComponent>()?.HasMind ?? false))
            {
                Verb verb = new();
                verb.Text     = Loc.GetString("make-ghost-role-verb-get-data-text");
                verb.Category = VerbCategory.Debug;
                // TODO VERB ICON add ghost icon
                // Where is the national park service icon for haunted forests?
                verb.Act = () => _ghostRoleSystem.OpenMakeGhostRoleEui(player, args.Target.Uid);
                args.Verbs.Add(verb);
            }

            // Configuration verb. Is this even used for anything!?
            if (_groupController.CanAdminMenu(player) &&
                args.Target.TryGetComponent <ConfigurationComponent>(out var config))
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("configure-verb-get-data-text");
                verb.IconTexture = "/Textures/Interface/VerbIcons/settings.svg.192dpi.png";
                verb.Category    = VerbCategory.Debug;
                verb.Act         = () => config.OpenUserInterface(actor);
                args.Verbs.Add(verb);
            }

            // Add reagent verb
            if (_adminManager.HasAdminFlag(player, AdminFlags.Fun) &&
                args.Target.HasComponent <SolutionContainerManagerComponent>())
            {
                Verb verb = new();
                verb.Text        = Loc.GetString("admin-add-reagent-verb-get-data-text");
                verb.Category    = VerbCategory.Debug;
                verb.IconTexture = "/Textures/Interface/VerbIcons/spill.svg.192dpi.png";
                verb.Act         = () => _euiManager.OpenEui(new AdminAddReagentEui(args.Target), player);

                // TODO CHEMISTRY
                // Add reagent ui broke after solution refactor. Needs fixing
                verb.Disabled = true;
                verb.Tooltip  = "Currently non functional after solution refactor.";
                verb.Priority = -2;

                args.Verbs.Add(verb);
            }
        }
    }