/// <summary>
    /// Retrieves a shuttle for delivery.
    /// </summary>
    public void CallShuttle(StationCargoOrderDatabaseComponent orderDatabase)
    {
        if (!TryComp <CargoShuttleComponent>(orderDatabase.Shuttle, out var shuttle) ||
            !TryComp <TransformComponent>(orderDatabase.Owner, out var xform))
        {
            return;
        }

        // Already called / not available
        if (shuttle.NextCall == null || _timing.CurTime < shuttle.NextCall)
        {
            return;
        }

        shuttle.NextCall = null;

        // Find a valid free area nearby to spawn in on
        // TODO: Make this use hyperspace now.
        var  center    = new Vector2();
        var  minRadius = 0f;
        Box2?aabb      = null;

        foreach (var grid in _mapManager.GetAllMapGrids(xform.MapID))
        {
            aabb = aabb?.Union(grid.WorldAABB) ?? grid.WorldAABB;
        }

        if (aabb != null)
        {
            center    = aabb.Value.Center;
            minRadius = MathF.Max(aabb.Value.Width, aabb.Value.Height);
        }

        var offset = 0f;

        if (TryComp <IMapGridComponent>(orderDatabase.Shuttle, out var shuttleGrid))
        {
            var bounds = shuttleGrid.Grid.LocalAABB;
            offset = MathF.Max(bounds.Width, bounds.Height) / 2f;
        }

        Transform(shuttle.Owner).Coordinates = new EntityCoordinates(xform.ParentUid,
                                                                     center + _random.NextVector2(minRadius + offset, minRadius + CallOffset + offset));
        DebugTools.Assert(!MetaData(shuttle.Owner).EntityPaused);

        AddCargoContents(shuttle, orderDatabase);
        UpdateOrders(orderDatabase);
        UpdateShuttleCargoConsoles(shuttle);
        _console.RefreshShuttleConsoles();

        _sawmill.Info($"Retrieved cargo shuttle {ToPrettyString(shuttle.Owner)} from {ToPrettyString(orderDatabase.Owner)}");
    }
예제 #2
0
    private void OnComponentInit(EntityUid uid, ImmovableRodComponent component, ComponentInit args)
    {
        if (EntityManager.TryGetComponent(uid, out PhysicsComponent? phys))
        {
            phys.LinearDamping = 0f;
            phys.Friction      = 0f;
            phys.BodyStatus    = BodyStatus.InAir;

            if (!component.RandomizeVelocity)
            {
                return;
            }

            var xform = Transform(uid);
            var vel   = component.DirectionOverride.Degrees switch
            {
                0f => _random.NextVector2(component.MinSpeed, component.MaxSpeed),
                _ => xform.WorldRotation.RotateVec(component.DirectionOverride.ToVec()) * _random.NextFloat(component.MinSpeed, component.MaxSpeed)
            };

            phys.ApplyLinearImpulse(vel);
            xform.LocalRotation = (vel - xform.WorldPosition).ToWorldAngle() + MathHelper.PiOver2;
        }
    }
    // All smite verbs have names so invokeverb works.
    private void AddSmiteVerbs(GetVerbsEvent <Verb> args)
    {
        if (!EntityManager.TryGetComponent <ActorComponent?>(args.User, out var actor))
        {
            return;
        }

        var player = actor.PlayerSession;

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

        Verb explode = new()
        {
            Text        = "Explode",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/VerbIcons/smite.svg.192dpi.png",
            Act         = () =>
            {
                var coords = Transform(args.Target).MapPosition;
                Timer.Spawn(_gameTiming.TickPeriod,
                            () => _explosionSystem.QueueExplosion(coords, ExplosionSystem.DefaultExplosionPrototypeId,
                                                                  4, 1, 2, maxTileBreak: 0), // it gibs, damage doesn't need to be high.
                            CancellationToken.None);

                if (TryComp(args.Target, out SharedBodyComponent? body))
                {
                    body.Gib();
                }
            },
            Impact  = LogImpact.Extreme,
            Message = "Explode them.",
        };

        args.Verbs.Add(explode);

        Verb chess = new()
        {
            Text        = "Chess Dimension",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Fun/Tabletop/chessboard.rsi/chessboard.png",
            Act         = () =>
            {
                _godmodeSystem.EnableGodmode(args.Target); // So they don't suffocate.
                EnsureComp <TabletopDraggableComponent>(args.Target);
                RemComp <PhysicsComponent>(args.Target);   // So they can be dragged around.
                var xform = Transform(args.Target);
                _popupSystem.PopupEntity(Loc.GetString("admin-smite-chess-self"), args.Target, Filter.Entities(args.Target));
                _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-chess-others", ("name", args.Target)), xform.Coordinates, Filter.Pvs(args.Target).RemoveWhereAttachedEntity(x => x == args.Target));
                var board   = Spawn("ChessBoard", xform.Coordinates);
                var session = _tabletopSystem.EnsureSession(Comp <TabletopGameComponent>(board));
                xform.Coordinates   = EntityCoordinates.FromMap(_mapManager, session.Position);
                xform.WorldRotation = Angle.Zero;
            },
            Impact  = LogImpact.Extreme,
            Message = "Banishment to the Chess Dimension.",
        };

        args.Verbs.Add(chess);

        if (TryComp <FlammableComponent>(args.Target, out var flammable))
        {
            Verb flames = new()
            {
                Text        = "Set Alight",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/Alerts/Fire/fire.png",
                Act         = () =>
                {
                    // F**k you. Burn Forever.
                    flammable.FireStacks = 99999.9f;
                    _flammableSystem.Ignite(args.Target);
                    var xform = Transform(args.Target);
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-set-alight-self"), args.Target, Filter.Entities(args.Target));
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-set-alight-others", ("name", args.Target)), xform.Coordinates, Filter.Pvs(args.Target).RemoveWhereAttachedEntity(x => x == args.Target));
                },
                Impact  = LogImpact.Extreme,
                Message = "Makes them burn.",
            };
            args.Verbs.Add(flames);
        }

        Verb monkey = new()
        {
            Text        = "Monkeyify",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Mobs/Animals/monkey.rsi/dead.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminMonkeySmite");
            },
            Impact  = LogImpact.Extreme,
            Message = "Monkey mode.",
        };

        args.Verbs.Add(monkey);

        if (TryComp <DiseaseCarrierComponent>(args.Target, out var carrier))
        {
            Verb lungCancer = new()
            {
                Text        = "Lung Cancer",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Mobs/Species/Human/organs.rsi/lung-l.png",
                Act         = () =>
                {
                    _diseaseSystem.TryInfect(carrier, _prototypeManager.Index <DiseasePrototype>("StageIIIALungCancer"),
                                             1.0f, true);
                },
                Impact  = LogImpact.Extreme,
                Message = "Stage IIIA Lung Cancer, for when they really like the hit show Breaking Bad.",
            };
            args.Verbs.Add(lungCancer);
        }

        if (TryComp <DamageableComponent>(args.Target, out var damageable) &&
            TryComp <MobStateComponent>(args.Target, out var mobState))
        {
            Verb hardElectrocute = new()
            {
                Text        = "Electrocute",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/icon.png",
                Act         = () =>
                {
                    int damageToDeal;
                    var critState = mobState._highestToLowestStates.Where(x => x.Value.IsCritical()).FirstOrNull();
                    if (critState is null)
                    {
                        // We can't crit them so try killing them.
                        var deadState = mobState._highestToLowestStates.Where(x => x.Value.IsDead()).FirstOrNull();
                        if (deadState is null)
                        {
                            return; // whelp.
                        }
                        damageToDeal = deadState.Value.Key - (int)damageable.TotalDamage;
                    }
                    else
                    {
                        damageToDeal = critState.Value.Key - (int)damageable.TotalDamage;
                    }

                    if (damageToDeal <= 0)
                    {
                        damageToDeal = 100; // murder time.
                    }
                    if (_inventorySystem.TryGetSlots(args.Target, out var slotDefinitions))
                    {
                        foreach (var slot in slotDefinitions)
                        {
                            if (!_inventorySystem.TryGetSlotEntity(args.Target, slot.Name, out var slotEnt))
                            {
                                continue;
                            }

                            RemComp <InsulatedComponent>(slotEnt.Value); // Fry the gloves.
                        }
                    }

                    _electrocutionSystem.TryDoElectrocution(args.Target, null, damageToDeal,
                                                            TimeSpan.FromSeconds(30), true);
                },
                Impact  = LogImpact.Extreme,
                Message = "Electrocutes them, rendering anything they were wearing useless.",
            };
            args.Verbs.Add(hardElectrocute);
        }

        if (TryComp <CreamPiedComponent>(args.Target, out var creamPied))
        {
            Verb creamPie = new()
            {
                Text        = "Creampie",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Consumable/Food/Baked/pie.rsi/plain-slice.png",
                Act         = () =>
                {
                    _creamPieSystem.SetCreamPied(args.Target, creamPied, true);
                },
                Impact  = LogImpact.Extreme,
                Message = "A cream pie, condensed into a button.",
            };
            args.Verbs.Add(creamPie);
        }

        if (TryComp <BloodstreamComponent>(args.Target, out var bloodstream))
        {
            Verb bloodRemoval = new()
            {
                Text        = "Remove blood",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Fluids/tomato_splat.rsi/puddle-1.png",
                Act         = () =>
                {
                    _bloodstreamSystem.SpillAllSolutions(args.Target, bloodstream);
                    var xform = Transform(args.Target);
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-remove-blood-self"), args.Target, Filter.Entities(args.Target));
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-remove-blood-others", ("name", args.Target)), xform.Coordinates, Filter.Pvs(args.Target).RemoveWhereAttachedEntity(x => x == args.Target));
                },
                Impact  = LogImpact.Extreme,
                Message = "Removes their blood. All of it.",
            };
            args.Verbs.Add(bloodRemoval);
        }

        // bobby...
        if (TryComp <BodyComponent>(args.Target, out var body))
        {
            Verb vomitOrgans = new()
            {
                Text        = "Vomit organs",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-1.png",
                Act         = () =>
                {
                    _vomitSystem.Vomit(args.Target, -1000, -1000); // You feel hollow!
                    var organs    = _bodySystem.GetComponentsOnMechanisms <TransformComponent>(args.Target, body);
                    var baseXform = Transform(args.Target);
                    foreach (var(xform, mechanism) in organs)
                    {
                        if (HasComp <BrainComponent>(xform.Owner) || HasComp <EyeComponent>(xform.Owner))
                        {
                            continue;
                        }

                        mechanism.Part?.RemoveMechanism(mechanism);
                        xform.Coordinates = baseXform.Coordinates.Offset(_random.NextVector2(0.5f, 0.75f));
                    }

                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-vomit-organs-self"), args.Target, Filter.Entities(args.Target));
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-vomit-organs-others", ("name", args.Target)), baseXform.Coordinates, Filter.Pvs(args.Target).RemoveWhereAttachedEntity(x => x == args.Target));
                },
                Impact  = LogImpact.Extreme,
                Message = "Causes them to vomit, including their internal organs.",
            };
            args.Verbs.Add(vomitOrgans);

            Verb handRemoval = new()
            {
                Text        = "Remove hands",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/fist.svg.192dpi.png",
                Act         = () =>
                {
                    var baseXform = Transform(args.Target);
                    foreach (var part in body.GetPartsOfType(BodyPartType.Hand))
                    {
                        body.RemovePart(part);
                        Transform(part.Owner).Coordinates = baseXform.Coordinates;
                    }
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-remove-hands-self"), args.Target, Filter.Entities(args.Target));
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-remove-hands-others", ("name", args.Target)), baseXform.Coordinates, Filter.Pvs(args.Target).RemoveWhereAttachedEntity(x => x == args.Target));
                },
                Impact  = LogImpact.Extreme,
                Message = "Removes the target's hands.",
            };
            args.Verbs.Add(handRemoval);
        }

        if (TryComp <PhysicsComponent>(args.Target, out var physics))
        {
            Verb pinball = new()
            {
                Text        = "Pinball",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Fun/toys.rsi/basketball.png",
                Act         = () =>
                {
                    var xform    = Transform(args.Target);
                    var fixtures = Comp <FixturesComponent>(args.Target);
                    xform.Anchored     = false; // Just in case.
                    physics.BodyType   = BodyType.Dynamic;
                    physics.BodyStatus = BodyStatus.InAir;
                    physics.WakeBody();
                    foreach (var(_, fixture) in fixtures.Fixtures)
                    {
                        if (!fixture.Hard)
                        {
                            continue;
                        }
                        fixture.Restitution = 1.1f;
                    }

                    physics.LinearVelocity  = _random.NextVector2(1.5f, 1.5f);
                    physics.AngularVelocity = MathF.PI * 12;
                    physics.LinearDamping   = 0.0f;
                    physics.AngularDamping  = 0.0f;
                },
                Impact  = LogImpact.Extreme,
                Message =
                    "Turns them into a super bouncy ball, flinging them around until they clip through the station into the abyss.",
            };
            args.Verbs.Add(pinball);

            Verb yeet = new()
            {
                Text        = "Yeet",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/VerbIcons/eject.svg.192dpi.png",
                Act         = () =>
                {
                    var xform    = Transform(args.Target);
                    var fixtures = Comp <FixturesComponent>(args.Target);
                    xform.Anchored     = false; // Just in case.
                    physics.BodyType   = BodyType.Dynamic;
                    physics.BodyStatus = BodyStatus.InAir;
                    physics.WakeBody();
                    foreach (var(_, fixture) in fixtures.Fixtures)
                    {
                        fixture.Hard = false;
                    }

                    physics.LinearVelocity  = _random.NextVector2(8.0f, 8.0f);
                    physics.AngularVelocity = MathF.PI * 12;
                    physics.LinearDamping   = 0.0f;
                    physics.AngularDamping  = 0.0f;
                },
                Impact  = LogImpact.Extreme,
                Message = "Banishes them into the depths of space by turning on no-clip and tossing them.",
            };
            args.Verbs.Add(yeet);
        }

        Verb bread = new()
        {
            Text        = "Become Bread",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Consumable/Food/Baked/bread.rsi/plain.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminBreadSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = "It turns them into bread. Really. That's all it does.",
        };

        args.Verbs.Add(bread);

        if (TryComp <ActorComponent>(args.Target, out var actorComponent))
        {
            Verb ghostKick = new()
            {
                Text        = "Ghostkick",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/gavel.svg.192dpi.png",
                Act         = () =>
                {
                    _ghostKickManager.DoDisconnect(actorComponent.PlayerSession.ConnectedClient, "Smitten.");
                },
                Impact  = LogImpact.Extreme,
                Message = "Silently kicks the user, dropping their connection.",
            };
            args.Verbs.Add(ghostKick);
        }

        if (TryComp <InventoryComponent>(args.Target, out var inventory))
        {
            Verb nyanify = new()
            {
                Text        = "Nyanify",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Clothing/Head/Hats/catears.rsi/icon.png",
                Act         = () =>
                {
                    var ears = Spawn("ClothingHeadHatCatEars", Transform(args.Target).Coordinates);
                    EnsureComp <UnremoveableComponent>(ears);
                    _inventorySystem.TryUnequip(args.Target, "head", true, true, false, inventory);
                    _inventorySystem.TryEquip(args.Target, ears, "head", true, true, false, inventory);
                },
                Impact  = LogImpact.Extreme,
                Message = "Forcibly adds cat ears. There is no escape.",
            };
            args.Verbs.Add(nyanify);

            Verb killSign = new()
            {
                Text        = "Kill sign",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Misc/killsign.rsi/icon.png",
                Act         = () =>
                {
                    EnsureComp <KillSignComponent>(args.Target);
                },
                Impact  = LogImpact.Extreme,
                Message = "Marks a player for death by their fellows.",
            };
            args.Verbs.Add(killSign);

            // TODO: Port cluwne outfit.
            Verb clown = new()
            {
                Text        = "Clown",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Fun/bikehorn.rsi/icon.png",
                Act         = () =>
                {
                    SetOutfitCommand.SetOutfit(args.Target, "ClownGear", EntityManager, (_, clothing) =>
                    {
                        if (HasComp <ClothingComponent>(clothing))
                        {
                            EnsureComp <UnremoveableComponent>(clothing);
                        }
                        EnsureComp <ClumsyComponent>(args.Target);
                    });
                },
                Impact  = LogImpact.Extreme,
                Message = "Clowns them. The suit cannot be removed.",
            };
            args.Verbs.Add(clown);
        }

        Verb angerPointingArrows = new()
        {
            Text        = "Anger Pointing Arrows",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/Misc/pointing.rsi/pointing.png",
            Act         = () =>
            {
                EnsureComp <PointingArrowAngeringComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = "Angers the pointing arrows, causing them to assault this entity.",
        };

        args.Verbs.Add(angerPointingArrows);

        Verb dust = new()
        {
            Text        = "Dust",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Materials/materials.rsi/ash.png",
            Act         = () =>
            {
                EntityManager.QueueDeleteEntity(args.Target);
                Spawn("Ash", Transform(args.Target).Coordinates);
                _popupSystem.PopupEntity(Loc.GetString("admin-smite-turned-ash-other", ("name", args.Target)), args.Target, Filter.Pvs(args.Target));
            },
            Impact  = LogImpact.Extreme,
            Message = "Reduces the target to a small pile of ash.",
        };

        args.Verbs.Add(dust);

        Verb youtubeVideoSimulation = new()
        {
            Text        = "Buffering",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/Misc/buffering_smite_icon.png",
            Act         = () =>
            {
                EnsureComp <BufferingComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = "Causes the target to randomly start buffering, freezing them in place for a short timespan while they load.",
        };

        args.Verbs.Add(youtubeVideoSimulation);

        Verb instrumentation = new()
        {
            Text        = "Become Instrument",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Fun/Instruments/h_synthesizer.rsi/icon.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminInstrumentSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = "It turns them into a supersynth. Really. That's all it does.",
        };

        args.Verbs.Add(instrumentation);

        Verb noGravity = new()
        {
            Text        = "Remove gravity",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Structures/Machines/gravity_generator.rsi/off.png",
            Act         = () =>
            {
                var grav = EnsureComp <MovementIgnoreGravityComponent>(args.Target);
                grav.Weightless = true;
            },
            Impact  = LogImpact.Extreme,
            Message = "Grants them anti-gravity.",
        };

        args.Verbs.Add(noGravity);
    }
예제 #4
0
    // All smite verbs have names so invokeverb works.
    private void AddSmiteVerbs(GetVerbsEvent <Verb> args)
    {
        if (!EntityManager.TryGetComponent <ActorComponent?>(args.User, out var actor))
        {
            return;
        }

        var player = actor.PlayerSession;

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

        // 1984.
        if (HasComp <IMapComponent>(args.Target) || HasComp <IMapGridComponent>(args.Target))
        {
            return;
        }

        Verb explode = new()
        {
            Text        = "Explode",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/VerbIcons/smite.svg.192dpi.png",
            Act         = () =>
            {
                var coords = Transform(args.Target).MapPosition;
                Timer.Spawn(_gameTiming.TickPeriod,
                            () => _explosionSystem.QueueExplosion(coords, ExplosionSystem.DefaultExplosionPrototypeId,
                                                                  4, 1, 2, maxTileBreak: 0), // it gibs, damage doesn't need to be high.
                            CancellationToken.None);

                if (TryComp(args.Target, out SharedBodyComponent? body))
                {
                    body.Gib();
                }
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-explode-description")
        };

        args.Verbs.Add(explode);

        Verb chess = new()
        {
            Text        = "Chess Dimension",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Fun/Tabletop/chessboard.rsi/chessboard.png",
            Act         = () =>
            {
                _godmodeSystem.EnableGodmode(args.Target); // So they don't suffocate.
                EnsureComp <TabletopDraggableComponent>(args.Target);
                RemComp <PhysicsComponent>(args.Target);   // So they can be dragged around.
                var xform = Transform(args.Target);
                _popupSystem.PopupEntity(Loc.GetString("admin-smite-chess-self"), args.Target,
                                         Filter.Entities(args.Target), PopupType.LargeCaution);
                _popupSystem.PopupCoordinates(
                    Loc.GetString("admin-smite-chess-others", ("name", args.Target)), xform.Coordinates,
                    Filter.PvsExcept(args.Target), PopupType.MediumCaution);
                var board   = Spawn("ChessBoard", xform.Coordinates);
                var session = _tabletopSystem.EnsureSession(Comp <TabletopGameComponent>(board));
                xform.Coordinates   = EntityCoordinates.FromMap(_mapManager, session.Position);
                xform.WorldRotation = Angle.Zero;
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-chess-dimension-description")
        };

        args.Verbs.Add(chess);

        if (TryComp <FlammableComponent>(args.Target, out var flammable))
        {
            Verb flames = new()
            {
                Text        = "Set Alight",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/Alerts/Fire/fire.png",
                Act         = () =>
                {
                    // F**k you. Burn Forever.
                    flammable.FireStacks = 99999.9f;
                    _flammableSystem.Ignite(args.Target);
                    var xform = Transform(args.Target);
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-set-alight-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-set-alight-others", ("name", args.Target)), xform.Coordinates,
                                                  Filter.PvsExcept(args.Target), PopupType.MediumCaution);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-set-alight-description")
            };
            args.Verbs.Add(flames);
        }

        Verb monkey = new()
        {
            Text        = "Monkeyify",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Mobs/Animals/monkey.rsi/dead.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminMonkeySmite");
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-monkeyify-description")
        };

        args.Verbs.Add(monkey);

        Verb disposalBin = new()
        {
            Text        = "Garbage Can",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Structures/Piping/disposal.rsi/disposal.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminDisposalsSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-garbage-can-description")
        };

        args.Verbs.Add(disposalBin);

        if (TryComp <DiseaseCarrierComponent>(args.Target, out var carrier))
        {
            Verb lungCancer = new()
            {
                Text        = "Lung Cancer",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Mobs/Species/Human/organs.rsi/lung-l.png",
                Act         = () =>
                {
                    _diseaseSystem.TryInfect(carrier, _prototypeManager.Index <DiseasePrototype>("StageIIIALungCancer"),
                                             1.0f, true);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-lung-cancer-description")
            };
            args.Verbs.Add(lungCancer);
        }

        if (TryComp <DamageableComponent>(args.Target, out var damageable) &&
            TryComp <MobStateComponent>(args.Target, out var mobState))
        {
            Verb hardElectrocute = new()
            {
                Text        = "Electrocute",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/icon.png",
                Act         = () =>
                {
                    int damageToDeal;
                    var critState = mobState._highestToLowestStates.Where(x => x.Value == DamageState.Critical).FirstOrNull();
                    if (critState is null)
                    {
                        // We can't crit them so try killing them.
                        var deadState = mobState._highestToLowestStates.Where(x => x.Value == DamageState.Dead).FirstOrNull();
                        if (deadState is null)
                        {
                            return; // whelp.
                        }
                        damageToDeal = deadState.Value.Key - (int)damageable.TotalDamage;
                    }
                    else
                    {
                        damageToDeal = critState.Value.Key - (int)damageable.TotalDamage;
                    }

                    if (damageToDeal <= 0)
                    {
                        damageToDeal = 100; // murder time.
                    }
                    if (_inventorySystem.TryGetSlots(args.Target, out var slotDefinitions))
                    {
                        foreach (var slot in slotDefinitions)
                        {
                            if (!_inventorySystem.TryGetSlotEntity(args.Target, slot.Name, out var slotEnt))
                            {
                                continue;
                            }

                            RemComp <InsulatedComponent>(slotEnt.Value); // Fry the gloves.
                        }
                    }

                    _electrocutionSystem.TryDoElectrocution(args.Target, null, damageToDeal,
                                                            TimeSpan.FromSeconds(30), true);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-electrocute-description")
            };
            args.Verbs.Add(hardElectrocute);
        }

        if (TryComp <CreamPiedComponent>(args.Target, out var creamPied))
        {
            Verb creamPie = new()
            {
                Text        = "Creampie",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Consumable/Food/Baked/pie.rsi/plain-slice.png",
                Act         = () =>
                {
                    _creamPieSystem.SetCreamPied(args.Target, creamPied, true);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-creampie-description")
            };
            args.Verbs.Add(creamPie);
        }

        if (TryComp <BloodstreamComponent>(args.Target, out var bloodstream))
        {
            Verb bloodRemoval = new()
            {
                Text        = "Remove blood",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Fluids/tomato_splat.rsi/puddle-1.png",
                Act         = () =>
                {
                    _bloodstreamSystem.SpillAllSolutions(args.Target, bloodstream);
                    var xform = Transform(args.Target);
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-remove-blood-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-remove-blood-others", ("name", args.Target)), xform.Coordinates,
                                                  Filter.PvsExcept(args.Target), PopupType.MediumCaution);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-remove-blood-description")
            };
            args.Verbs.Add(bloodRemoval);
        }

        // bobby...
        if (TryComp <BodyComponent>(args.Target, out var body))
        {
            Verb vomitOrgans = new()
            {
                Text        = "Vomit organs",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-1.png",
                Act         = () =>
                {
                    _vomitSystem.Vomit(args.Target, -1000, -1000); // You feel hollow!
                    var organs    = _bodySystem.GetComponentsOnMechanisms <TransformComponent>(args.Target, body);
                    var baseXform = Transform(args.Target);
                    foreach (var(xform, mechanism) in organs)
                    {
                        if (HasComp <BrainComponent>(xform.Owner) || HasComp <EyeComponent>(xform.Owner))
                        {
                            continue;
                        }

                        mechanism.Part?.RemoveMechanism(mechanism);
                        xform.Coordinates = baseXform.Coordinates.Offset(_random.NextVector2(0.5f, 0.75f));
                    }

                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-vomit-organs-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-vomit-organs-others", ("name", args.Target)), baseXform.Coordinates,
                                                  Filter.PvsExcept(args.Target), PopupType.MediumCaution);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-vomit-organs-description")
            };
            args.Verbs.Add(vomitOrgans);

            Verb handsRemoval = new()
            {
                Text        = "Remove hands",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/AdminActions/remove-hands.png",
                Act         = () =>
                {
                    var baseXform = Transform(args.Target);
                    foreach (var part in body.GetPartsOfType(BodyPartType.Hand))
                    {
                        body.RemovePart(part);
                        Transform(part.Owner).Coordinates = baseXform.Coordinates;
                    }
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-remove-hands-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-remove-hands-others", ("name", args.Target)), baseXform.Coordinates,
                                                  Filter.PvsExcept(args.Target), PopupType.Medium);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-remove-hands-description")
            };
            args.Verbs.Add(handsRemoval);

            Verb handRemoval = new()
            {
                Text        = "Remove hands",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/AdminActions/remove-hand.png",
                Act         = () =>
                {
                    var baseXform = Transform(args.Target);
                    foreach (var part in body.GetPartsOfType(BodyPartType.Hand))
                    {
                        body.RemovePart(part);
                        Transform(part.Owner).Coordinates = baseXform.Coordinates;
                        break;
                    }
                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-remove-hands-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                    _popupSystem.PopupCoordinates(Loc.GetString("admin-smite-remove-hands-others", ("name", args.Target)), baseXform.Coordinates,
                                                  Filter.PvsExcept(args.Target), PopupType.Medium);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-remove-hand-description")
            };
            args.Verbs.Add(handRemoval);

            Verb stomachRemoval = new()
            {
                Text        = "Stomach Removal",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Mobs/Species/Human/organs.rsi/stomach.png",
                Act         = () =>
                {
                    foreach (var part in body.Parts)
                    {
                        foreach (var mechanism in part.Key.Mechanisms)
                        {
                            if (HasComp <StomachComponent>(mechanism.Owner))
                            {
                                QueueDel(mechanism.Owner);
                            }
                        }
                    }

                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-stomach-removal-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-stomach-removal-description"),
            };
            args.Verbs.Add(stomachRemoval);

            Verb lungRemoval = new()
            {
                Text        = "Lungs Removal",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Mobs/Species/Human/organs.rsi/lung-r.png",
                Act         = () =>
                {
                    foreach (var part in body.Parts)
                    {
                        foreach (var mechanism in part.Key.Mechanisms)
                        {
                            if (HasComp <LungComponent>(mechanism.Owner))
                            {
                                QueueDel(mechanism.Owner);
                            }
                        }
                    }

                    _popupSystem.PopupEntity(Loc.GetString("admin-smite-lung-removal-self"), args.Target,
                                             Filter.Entities(args.Target), PopupType.LargeCaution);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-lung-removal-description"),
            };
            args.Verbs.Add(lungRemoval);
        }

        if (TryComp <PhysicsComponent>(args.Target, out var physics))
        {
            Verb pinball = new()
            {
                Text        = "Pinball",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Fun/toys.rsi/basketball.png",
                Act         = () =>
                {
                    var xform    = Transform(args.Target);
                    var fixtures = Comp <FixturesComponent>(args.Target);
                    xform.Anchored     = false; // Just in case.
                    physics.BodyType   = BodyType.Dynamic;
                    physics.BodyStatus = BodyStatus.InAir;
                    physics.WakeBody();
                    foreach (var(_, fixture) in fixtures.Fixtures)
                    {
                        if (!fixture.Hard)
                        {
                            continue;
                        }
                        fixture.Restitution = 1.1f;
                    }

                    physics.LinearVelocity  = _random.NextVector2(1.5f, 1.5f);
                    physics.AngularVelocity = MathF.PI * 12;
                    physics.LinearDamping   = 0.0f;
                    physics.AngularDamping  = 0.0f;
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-pinball-description")
            };
            args.Verbs.Add(pinball);

            Verb yeet = new()
            {
                Text        = "Yeet",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/VerbIcons/eject.svg.192dpi.png",
                Act         = () =>
                {
                    var xform    = Transform(args.Target);
                    var fixtures = Comp <FixturesComponent>(args.Target);
                    xform.Anchored     = false; // Just in case.
                    physics.BodyType   = BodyType.Dynamic;
                    physics.BodyStatus = BodyStatus.InAir;
                    physics.WakeBody();
                    foreach (var(_, fixture) in fixtures.Fixtures)
                    {
                        fixture.Hard = false;
                    }

                    physics.LinearVelocity  = _random.NextVector2(8.0f, 8.0f);
                    physics.AngularVelocity = MathF.PI * 12;
                    physics.LinearDamping   = 0.0f;
                    physics.AngularDamping  = 0.0f;
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-yeet-description")
            };
            args.Verbs.Add(yeet);
        }

        Verb bread = new()
        {
            Text        = "Become Bread",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Consumable/Food/Baked/bread.rsi/plain.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminBreadSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-become-bread-description")
        };

        args.Verbs.Add(bread);

        Verb mouse = new()
        {
            Text        = "Become Mouse",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Mobs/Animals/mouse.rsi/icon-0.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminMouseSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-become-mouse-description")
        };

        args.Verbs.Add(mouse);

        if (TryComp <ActorComponent>(args.Target, out var actorComponent))
        {
            Verb ghostKick = new()
            {
                Text        = "Ghostkick",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Interface/gavel.svg.192dpi.png",
                Act         = () =>
                {
                    _ghostKickManager.DoDisconnect(actorComponent.PlayerSession.ConnectedClient, "Smitten.");
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-ghostkick-description")
            };
            args.Verbs.Add(ghostKick);
        }

        if (TryComp <InventoryComponent>(args.Target, out var inventory))
        {
            Verb nyanify = new()
            {
                Text        = "Nyanify",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Clothing/Head/Hats/catears.rsi/icon.png",
                Act         = () =>
                {
                    var ears = Spawn("ClothingHeadHatCatEars", Transform(args.Target).Coordinates);
                    EnsureComp <UnremoveableComponent>(ears);
                    _inventorySystem.TryUnequip(args.Target, "head", true, true, false, inventory);
                    _inventorySystem.TryEquip(args.Target, ears, "head", true, true, false, inventory);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-nyanify-description")
            };
            args.Verbs.Add(nyanify);

            Verb killSign = new()
            {
                Text        = "Kill sign",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Misc/killsign.rsi/icon.png",
                Act         = () =>
                {
                    EnsureComp <KillSignComponent>(args.Target);
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-kill-sign-description")
            };
            args.Verbs.Add(killSign);

            // TODO: Port cluwne outfit.
            Verb clown = new()
            {
                Text        = "Clown",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Objects/Fun/bikehorn.rsi/icon.png",
                Act         = () =>
                {
                    SetOutfitCommand.SetOutfit(args.Target, "ClownGear", EntityManager, (_, clothing) =>
                    {
                        if (HasComp <ClothingComponent>(clothing))
                        {
                            EnsureComp <UnremoveableComponent>(clothing);
                        }
                        EnsureComp <ClumsyComponent>(args.Target);
                    });
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-clown-description")
            };
            args.Verbs.Add(clown);

            Verb maiden = new()
            {
                Text        = "Maid",
                Category    = VerbCategory.Smite,
                IconTexture = "/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi/icon.png",
                Act         = () =>
                {
                    SetOutfitCommand.SetOutfit(args.Target, "JanitorMaidGear", EntityManager, (_, clothing) =>
                    {
                        if (HasComp <ClothingComponent>(clothing))
                        {
                            EnsureComp <UnremoveableComponent>(clothing);
                        }
                        EnsureComp <ClumsyComponent>(args.Target);
                    });
                },
                Impact  = LogImpact.Extreme,
                Message = Loc.GetString("admin-smite-maid-description")
            };
            args.Verbs.Add(maiden);
        }

        Verb angerPointingArrows = new()
        {
            Text        = "Anger Pointing Arrows",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/Misc/pointing.rsi/pointing.png",
            Act         = () =>
            {
                EnsureComp <PointingArrowAngeringComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-anger-pointing-arrows-description")
        };

        args.Verbs.Add(angerPointingArrows);

        Verb dust = new()
        {
            Text        = "Dust",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Materials/materials.rsi/ash.png",
            Act         = () =>
            {
                EntityManager.QueueDeleteEntity(args.Target);
                Spawn("Ash", Transform(args.Target).Coordinates);
                _popupSystem.PopupEntity(Loc.GetString("admin-smite-turned-ash-other", ("name", args.Target)), args.Target,
                                         Filter.Pvs(args.Target), PopupType.LargeCaution);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-dust-description"),
        };

        args.Verbs.Add(dust);

        Verb youtubeVideoSimulation = new()
        {
            Text        = "Buffering",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/Misc/buffering_smite_icon.png",
            Act         = () =>
            {
                EnsureComp <BufferingComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-buffering-description"),
        };

        args.Verbs.Add(youtubeVideoSimulation);

        Verb instrumentation = new()
        {
            Text        = "Become Instrument",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Fun/Instruments/h_synthesizer.rsi/icon.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminInstrumentSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-become-instrument-description"),
        };

        args.Verbs.Add(instrumentation);

        Verb noGravity = new()
        {
            Text        = "Remove gravity",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Structures/Machines/gravity_generator.rsi/off.png",
            Act         = () =>
            {
                var grav = EnsureComp <MovementIgnoreGravityComponent>(args.Target);
                grav.Weightless = true;

                Dirty(grav);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-remove-gravity-description"),
        };

        args.Verbs.Add(noGravity);

        Verb reptilian = new()
        {
            Text        = "Reptilian Species Swap",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Objects/Fun/toys.rsi/plushie_lizard.png",
            Act         = () =>
            {
                _polymorphableSystem.PolymorphEntity(args.Target, "AdminLizardSmite");
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-reptilian-species-swap-description"),
        };

        args.Verbs.Add(reptilian);

        Verb locker = new()
        {
            Text        = "Locker stuff",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Structures/Storage/closet.rsi/generic.png",
            Act         = () =>
            {
                var xform  = Transform(args.Target);
                var locker = Spawn("ClosetMaintenance", xform.Coordinates);
                if (TryComp <EntityStorageComponent>(locker, out var storage))
                {
                    _entityStorageSystem.ToggleOpen(args.Target, locker, storage);
                    _entityStorageSystem.Insert(args.Target, locker, storage);
                    _entityStorageSystem.ToggleOpen(args.Target, locker, storage);
                }
                _weldableSystem.ForceWeldedState(locker, true);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-locker-stuff-description"),
        };

        args.Verbs.Add(locker);

        Verb headstand = new()
        {
            Text        = "Headstand",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/VerbIcons/refresh.svg.192dpi.png",
            Act         = () =>
            {
                EnsureComp <HeadstandComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-headstand-description"),
        };

        args.Verbs.Add(headstand);

        Verb zoomIn = new()
        {
            Text        = "Zoom in",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/AdminActions/zoom.png",
            Act         = () =>
            {
                var eye = EnsureComp <EyeComponent>(args.Target);

                eye.Zoom *= Vector2.One * 0.2f;

                Dirty(eye);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-zoom-in-description"),
        };

        args.Verbs.Add(zoomIn);

        Verb flipEye = new()
        {
            Text        = "Flip eye",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/AdminActions/flip.png",
            Act         = () =>
            {
                var eye = EnsureComp <EyeComponent>(args.Target);

                eye.Zoom *= -1;

                Dirty(eye);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-flip-eye-description"),
        };

        args.Verbs.Add(flipEye);

        Verb runWalkSwap = new()
        {
            Text        = "Run Walk Swap",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/AdminActions/run-walk-swap.png",
            Act         = () =>
            {
                var movementSpeed = EnsureComp <MovementSpeedModifierComponent>(args.Target);
                (movementSpeed.BaseSprintSpeed, movementSpeed.BaseWalkSpeed) = (movementSpeed.BaseWalkSpeed, movementSpeed.BaseSprintSpeed);

                Dirty(movementSpeed);

                _popupSystem.PopupEntity(Loc.GetString("admin-smite-run-walk-swap-prompt"), args.Target,
                                         Filter.Entities(args.Target), PopupType.LargeCaution);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-run-walk-swap-description"),
        };

        args.Verbs.Add(runWalkSwap);

        Verb backwardsAccent = new()
        {
            Text        = "Speak Backwards",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/AdminActions/help-backwards.png",
            Act         = () =>
            {
                EnsureComp <BackwardsAccentComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-speak-backwards-description"),
        };

        args.Verbs.Add(backwardsAccent);

        Verb disarmProne = new()
        {
            Text        = "Disarm Prone",
            Category    = VerbCategory.Smite,
            IconTexture = "/Textures/Interface/Actions/disarm.png",
            Act         = () =>
            {
                EnsureComp <DisarmProneComponent>(args.Target);
            },
            Impact  = LogImpact.Extreme,
            Message = Loc.GetString("admin-smite-disarm-prone-description"),
        };

        args.Verbs.Add(disarmProne);
    }
}