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(); }
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)); }); }
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); } }
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); } } }