Example #1
0
        public bool TryGetEntity(
            IConsoleShell shell,
            IPlayerSession?player,
            string[] args,
            bool adding,
            [NotNullWhen(true)] out IEntity?entity,
            out DamageFlag flag,
            [NotNullWhen(true)] out IDamageableComponent?damageable)
        {
            entity     = null;
            flag       = DamageFlag.None;
            damageable = null;

            IEntity?             parsedEntity;
            DamageFlag           parsedFlag;
            IDamageableComponent?parsedDamageable;

            switch (args.Length)
            {
            case 1:
            {
                if (player == null)
                {
                    shell.SendText(player, "An entity needs to be specified when the command isn't used by a player.");
                    return(false);
                }

                if (player.AttachedEntity == null)
                {
                    shell.SendText(player, "An entity needs to be specified when you aren't attached to an entity.");
                    return(false);
                }

                if (!Enum.TryParse(args[0], true, out parsedFlag))
                {
                    shell.SendText(player, $"{args[0]} is not a valid damage flag.");
                    return(false);
                }

                parsedEntity = player.AttachedEntity;
                flag         = parsedFlag;
                break;
            }

            case 2:
            {
                if (!EntityUid.TryParse(args[0], out var id))
                {
                    shell.SendText(player, $"{args[0]} isn't a valid entity id.");
                    return(false);
                }

                var entityManager = IoCManager.Resolve <IEntityManager>();
                if (!entityManager.TryGetEntity(id, out parsedEntity))
                {
                    shell.SendText(player, $"No entity found with id {id}.");
                    return(false);
                }

                if (!Enum.TryParse(args[1], true, out parsedFlag))
                {
                    shell.SendText(player, $"{args[1]} is not a valid damage flag.");
                    return(false);
                }

                break;
            }

            default:
                shell.SendText(player, Help);
                return(false);
            }

            if (!parsedEntity.TryGetComponent(out parsedDamageable))
            {
                shell.SendText(player, $"Entity {parsedEntity.Name} doesn't have a {nameof(IDamageableComponent)}");
                return(false);
            }

            if (parsedDamageable.HasFlag(parsedFlag) && adding)
            {
                shell.SendText(player, $"Entity {parsedEntity.Name} already has damage flag {parsedFlag}.");
                return(false);
            }
            else if (!parsedDamageable.HasFlag(parsedFlag) && !adding)
            {
                shell.SendText(player, $"Entity {parsedEntity.Name} doesn't have damage flag {parsedFlag}.");
                return(false);
            }

            entity     = parsedEntity;
            flag       = parsedFlag;
            damageable = parsedDamageable;

            return(true);
        }
Example #2
0
        public void Execute(IConsoleShell shell, IPlayerSession?player, string[] args)
        {
            // Check if we have enough for the dmg types to show
            if (args.Length > 0 && args[0] == "?")
            {
                SendDamageTypes(shell, player);
                return;
            }

            // Not enough args
            if (args.Length < 2)
            {
                shell.SendText(player, Help);
                return;
            }

            var ignoreResistance = false;
            var entityUid        = player != null && player.AttachedEntityUid.HasValue ? player.AttachedEntityUid.Value : EntityUid.Invalid;

            if (!int.TryParse(args[1], out var amount) ||
                args.Length >= 3 && args[2] != "_" && !EntityUid.TryParse(args[2], out entityUid) ||
                args.Length >= 4 && !bool.TryParse(args[3], out ignoreResistance))
            {
                shell.SendText(player, Help);
                return;
            }

            if (entityUid == EntityUid.Invalid)
            {
                shell.SendText(player, "Not a valid entity.");
                return;
            }

            if (!IoCManager.Resolve <IEntityManager>().TryGetEntity(entityUid, out var ent))
            {
                shell.SendText(player, "Entity couldn't be found.");
                return;
            }

            if (!ent.TryGetComponent(out IDamageableComponent? damageable))
            {
                shell.SendText(player, "Entity can't be damaged.");
                return;
            }

            if (Enum.TryParse <DamageClass>(args[0], true, out var dmgClass))
            {
                if (!damageable.ChangeDamage(dmgClass, amount, ignoreResistance))
                {
                    shell.SendText(player, "Something went wrong!");
                }
                return;
            }
            // Fall back to DamageType
            else if (Enum.TryParse <DamageType>(args[0], true, out var dmgType))
            {
                if (!damageable.ChangeDamage(dmgType, amount, ignoreResistance))
                {
                    shell.SendText(player, "Something went wrong!");
                }
                return;
            }
            else
            {
                SendDamageTypes(shell, player);
            }
        }
Example #3
0
        public void Execute(IConsoleShell shell, string argStr, string[] args)
        {
            var player        = shell.Player as IPlayerSession;
            var entityManager = IoCManager.Resolve <IEntityManager>();

            IEntity   entity;
            EntityUid partUid;

            switch (args.Length)
            {
            case 1:
                if (player == null)
                {
                    shell.WriteLine($"You need to specify an entity to attach the part to if you aren't a player.\n{Help}");
                    return;
                }

                if (player.AttachedEntity == null)
                {
                    shell.WriteLine($"You need to specify an entity to attach the part to if you aren't attached to an entity.\n{Help}");
                    return;
                }

                if (!EntityUid.TryParse(args[0], out partUid))
                {
                    shell.WriteLine($"{args[0]} is not a valid entity uid.");
                    return;
                }

                entity = player.AttachedEntity;

                break;

            case 2:
                if (!EntityUid.TryParse(args[0], out var entityUid))
                {
                    shell.WriteLine($"{args[0]} is not a valid entity uid.");
                    return;
                }

                if (!EntityUid.TryParse(args[1], out partUid))
                {
                    shell.WriteLine($"{args[1]} is not a valid entity uid.");
                    return;
                }

                if (!entityManager.TryGetEntity(entityUid, out var tempEntity))
                {
                    shell.WriteLine($"{entityUid} is not a valid entity.");
                    return;
                }

                entity = tempEntity;
                break;

            default:
                shell.WriteLine(Help);
                return;
            }

            if (!entity.TryGetComponent(out SharedBodyComponent? body))
            {
                shell.WriteLine($"Entity {entity.Name} with uid {entity.Uid} does not have a {nameof(SharedBodyComponent)} component.");
                return;
            }

            if (!entityManager.TryGetEntity(partUid, out var partEntity))
            {
                shell.WriteLine($"{partUid} is not a valid entity.");
                return;
            }

            if (!partEntity.TryGetComponent(out SharedBodyPartComponent? part))
            {
                shell.WriteLine($"Entity {partEntity.Name} with uid {args[0]} does not have a {nameof(SharedBodyPartComponent)} component.");
                return;
            }

            if (body.HasPart(part))
            {
                shell.WriteLine($"Body part {partEntity.Name} with uid {partEntity.Uid} is already attached to entity {entity.Name} with uid {entity.Uid}");
                return;
            }

            body.SetPart($"{nameof(AttachBodyPartVerb)}-{partEntity.Uid}", part);
        }
Example #4
0
        public void Execute(IConsoleShell shell, IPlayerSession?player, string[] args)
        {
            if (args.Length > 1)
            {
                shell.SendText(player, Help);
                return;
            }

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

            IEntity entity;
            IEntity hand;

            switch (args.Length)
            {
            case 0:
            {
                if (player == null)
                {
                    shell.SendText(player, "Only a player can run this command without arguments.");
                    return;
                }

                if (player.AttachedEntity == null)
                {
                    shell.SendText(player, "You don't have an entity to add a hand to.");
                    return;
                }

                entity = player.AttachedEntity;
                hand   = entityManager.SpawnEntity(DefaultHandPrototype, entity.Transform.Coordinates);
                break;
            }

            case 1:
            {
                if (EntityUid.TryParse(args[0], out var uid))
                {
                    if (!entityManager.TryGetEntity(uid, out var parsedEntity))
                    {
                        shell.SendText(player, $"No entity found with uid {uid}");
                        return;
                    }

                    entity = parsedEntity;
                    hand   = entityManager.SpawnEntity(DefaultHandPrototype, entity.Transform.Coordinates);
                }
                else
                {
                    if (player == null)
                    {
                        shell.SendText(player,
                                       "You must specify an entity to add a hand to when using this command from the server terminal.");
                        return;
                    }

                    if (player.AttachedEntity == null)
                    {
                        shell.SendText(player, "You don't have an entity to add a hand to.");
                        return;
                    }

                    entity = player.AttachedEntity;
                    hand   = entityManager.SpawnEntity(args[0], entity.Transform.Coordinates);
                }

                break;
            }

            case 2:
            {
                if (!EntityUid.TryParse(args[0], out var uid))
                {
                    shell.SendText(player, $"{args[0]} is not a valid entity uid.");
                    return;
                }

                if (!entityManager.TryGetEntity(uid, out var parsedEntity))
                {
                    shell.SendText(player, $"No entity exists with uid {uid}.");
                    return;
                }

                entity = parsedEntity;

                if (!prototypeManager.HasIndex <EntityPrototype>(args[1]))
                {
                    shell.SendText(player, $"No hand entity exists with id {args[1]}.");
                    return;
                }

                hand = entityManager.SpawnEntity(args[1], entity.Transform.Coordinates);

                break;
            }

            default:
            {
                shell.SendText(player, Help);
                return;
            }
            }

            if (!entity.TryGetComponent(out IBody? body))
            {
                var random = IoCManager.Resolve <IRobustRandom>();
                var text   = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}";

                shell.SendText(player, text);
                return;
            }

            if (!hand.TryGetComponent(out IBodyPart? part))
            {
                shell.SendText(player, $"Hand entity {hand} does not have a {nameof(IBodyPart)} component.");
                return;
            }

            var slot     = part.GetHashCode().ToString();
            var response = body.TryAddPart(slot, part, true)
                ? $"Added hand to entity {entity.Name}"
                : $"Error occurred trying to add a hand to entity {entity.Name}";

            shell.SendText(player, response);
        }
Example #5
0
        public void Execute(IConsoleShell shell, string argStr, string[] args)
        {
            var       player = shell.Player as IPlayerSession;
            EntityUid?gridId;
            Gas?      gas = null;

            var entMan = IoCManager.Resolve <IEntityManager>();

            switch (args.Length)
            {
            case 0:
            {
                if (player == null)
                {
                    shell.WriteLine("A grid must be specified when the command isn't used by a player.");
                    return;
                }

                if (player.AttachedEntity is not {
                        Valid : true
                    } playerEntity)
                {
                    shell.WriteLine("You have no entity to get a grid from.");
                    return;
                }

                gridId = entMan.GetComponent <TransformComponent>(playerEntity).GridUid;

                if (gridId == null)
                {
                    shell.WriteLine("You aren't on a grid to delete gas from.");
                    return;
                }

                break;
            }

            case 1:
            {
                if (!EntityUid.TryParse(args[0], out var number))
                {
                    // Argument is a gas
                    if (player == null)
                    {
                        shell.WriteLine("A grid id must be specified if not using this command as a player.");
                        return;
                    }

                    if (player.AttachedEntity is not {
                            Valid : true
                        } playerEntity)
                    {
                        shell.WriteLine("You have no entity from which to get a grid id.");
                        return;
                    }

                    gridId = entMan.GetComponent <TransformComponent>(playerEntity).GridUid;

                    if (gridId == null)
                    {
                        shell.WriteLine("You aren't on a grid to delete gas from.");
                        return;
                    }

                    if (!Enum.TryParse <Gas>(args[0], true, out var parsedGas))
                    {
                        shell.WriteLine($"{args[0]} is not a valid gas name.");
                        return;
                    }

                    gas = parsedGas;
                    break;
                }

                // Argument is a grid
                gridId = number;
                break;
            }

            case 2:
            {
                if (!EntityUid.TryParse(args[0], out var first))
                {
                    shell.WriteLine($"{args[0]} is not a valid integer for a grid id.");
                    return;
                }

                gridId = first;

                if (gridId.Value.IsValid())
                {
                    shell.WriteLine($"{gridId} is not a valid grid id.");
                    return;
                }

                if (!Enum.TryParse <Gas>(args[1], true, out var parsedGas))
                {
                    shell.WriteLine($"{args[1]} is not a valid gas.");
                    return;
                }

                gas = parsedGas;

                break;
            }

            default:
                shell.WriteLine(Help);
                return;
            }

            var mapManager = IoCManager.Resolve <IMapManager>();

            if (!mapManager.TryGetGrid(gridId, out _))
            {
                shell.WriteLine($"No grid exists with id {gridId}");
                return;
            }

            var atmosphereSystem = EntitySystem.Get <AtmosphereSystem>();

            var tiles = 0;
            var moles = 0f;

            if (gas == null)
            {
                foreach (var tile in atmosphereSystem.GetAllMixtures(gridId.Value, true))
                {
                    if (tile.Immutable)
                    {
                        continue;
                    }

                    tiles++;
                    moles += tile.TotalMoles;

                    tile.Clear();
                }
            }
            else
            {
                foreach (var tile in atmosphereSystem.GetAllMixtures(gridId.Value, true))
                {
                    if (tile.Immutable)
                    {
                        continue;
                    }

                    tiles++;
                    moles += tile.TotalMoles;

                    tile.SetMoles(gas.Value, 0);
                }
            }

            if (gas == null)
            {
                shell.WriteLine($"Removed {moles} moles from {tiles} tiles.");
                return;
            }

            shell.WriteLine($"Removed {moles} moles of gas {gas} from {tiles} tiles.");
        }
        public void Execute(IConsoleShell shell, string argStr, string[] args)
        {
            var player = shell.Player as IPlayerSession;

            if (args.Length > 1)
            {
                shell.WriteLine(Help);
                return;
            }

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

            EntityUid entity;
            EntityUid hand;

            switch (args.Length)
            {
            case 0:
            {
                if (player == null)
                {
                    shell.WriteLine("Only a player can run this command without arguments.");
                    return;
                }

                if (player.AttachedEntity == null)
                {
                    shell.WriteLine("You don't have an entity to add a hand to.");
                    return;
                }

                entity = player.AttachedEntity.Value;
                hand   = entityManager.SpawnEntity(DefaultHandPrototype, entityManager.GetComponent <TransformComponent>(entity).Coordinates);
                break;
            }

            case 1:
            {
                if (EntityUid.TryParse(args[0], out var uid))
                {
                    if (!entityManager.EntityExists(uid))
                    {
                        shell.WriteLine($"No entity found with uid {uid}");
                        return;
                    }

                    entity = uid;
                    hand   = entityManager.SpawnEntity(DefaultHandPrototype, entityManager.GetComponent <TransformComponent>(entity).Coordinates);
                }
                else
                {
                    if (player == null)
                    {
                        shell.WriteLine("You must specify an entity to add a hand to when using this command from the server terminal.");
                        return;
                    }

                    if (player.AttachedEntity == null)
                    {
                        shell.WriteLine("You don't have an entity to add a hand to.");
                        return;
                    }

                    entity = player.AttachedEntity.Value;
                    hand   = entityManager.SpawnEntity(args[0], entityManager.GetComponent <TransformComponent>(entity).Coordinates);
                }

                break;
            }

            case 2:
            {
                if (!EntityUid.TryParse(args[0], out var uid))
                {
                    shell.WriteLine($"{args[0]} is not a valid entity uid.");
                    return;
                }

                if (!entityManager.EntityExists(uid))
                {
                    shell.WriteLine($"No entity exists with uid {uid}.");
                    return;
                }

                entity = uid;

                if (!prototypeManager.HasIndex <EntityPrototype>(args[1]))
                {
                    shell.WriteLine($"No hand entity exists with id {args[1]}.");
                    return;
                }

                hand = entityManager.SpawnEntity(args[1], entityManager.GetComponent <TransformComponent>(entity).Coordinates);

                break;
            }

            default:
            {
                shell.WriteLine(Help);
                return;
            }
            }

            if (!entityManager.TryGetComponent(entity, out SharedBodyComponent? body))
            {
                var random = IoCManager.Resolve <IRobustRandom>();
                var text   = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}";

                shell.WriteLine(text);
                return;
            }

            if (!entityManager.TryGetComponent(hand, out SharedBodyPartComponent? part))
            {
                shell.WriteLine($"Hand entity {hand} does not have a {nameof(SharedBodyPartComponent)} component.");
                return;
            }

            var slot = part.GetHashCode().ToString();

            body.SetPart(slot, part);

            shell.WriteLine($"Added hand to entity {entityManager.GetComponent<MetaDataComponent>(entity).EntityName}");
        }
Example #7
0
        public bool Execute(IDebugConsole console, params string[] args)
        {
            var vvm = IoCManager.Resolve <IViewVariablesManager>();

            // If you don't provide an entity ID, it opens the test class.
            // Spooky huh.
            if (args.Length == 0)
            {
                vvm.OpenVV(new VVTest());
                return(false);
            }

            var valArg = args[0];

            if (valArg.StartsWith("SI"))
            {
                // Server-side IoC selector.
                var selector = new ViewVariablesIoCSelector(valArg.Substring(1));
                vvm.OpenVV(selector);
                return(false);
            }

            if (valArg.StartsWith("I"))
            {
                // Client-side IoC selector.
                var reflection = IoCManager.Resolve <IReflectionManager>();
                if (!reflection.TryLooseGetType(valArg, out var type))
                {
                    console.AddLine("Unable to find that type.");
                    return(false);
                }

                object obj;
                try
                {
                    obj = IoCManager.ResolveType(type);
                }
                catch (UnregisteredTypeException)
                {
                    console.AddLine("Unable to find that type.");
                    return(false);
                }
                vvm.OpenVV(obj);
                return(false);
            }

            if (valArg.StartsWith("guihover"))
            {
                // UI element.
                var obj = IoCManager.Resolve <IUserInterfaceManager>().CurrentlyHovered;
                if (obj == null)
                {
                    console.AddLine("Not currently hovering any control.");
                    return(false);
                }
                vvm.OpenVV(obj);
                return(false);
            }

            // Entity.
            if (!EntityUid.TryParse(args[0], out var uid))
            {
                console.AddLine("Invalid specifier format.");
                return(false);
            }

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

            if (!entityManager.TryGetEntity(uid, out var entity))
            {
                console.AddLine("That entity does not exist.");
                return(false);
            }

            vvm.OpenVV(entity);

            return(false);
        }
Example #8
0
        public void Execute(IConsoleShell shell, string argsOther, string[] args)
        {
            var       player        = shell.Player as IPlayerSession;
            var       entityManager = IoCManager.Resolve <IEntityManager>();
            EntityUid?gridId;
            var       xformQuery = entityManager.GetEntityQuery <TransformComponent>();

            switch (args.Length)
            {
            case 0:
                if (player?.AttachedEntity is not {
                    Valid : true
                } playerEntity)
                {
                    shell.WriteError("Only a player can run this command.");
                    return;
                }

                gridId = xformQuery.GetComponent(playerEntity).GridUid;
                break;

            case 1:
                if (!EntityUid.TryParse(args[0], out var id))
                {
                    shell.WriteError($"{args[0]} is not a valid entity.");
                    return;
                }

                gridId = id;
                break;

            default:
                shell.WriteLine(Help);
                return;
            }

            var mapManager = IoCManager.Resolve <IMapManager>();

            if (!mapManager.TryGetGrid(gridId, out var grid))
            {
                shell.WriteError($"No grid exists with id {gridId}");
                return;
            }

            if (!entityManager.EntityExists(grid.GridEntityId))
            {
                shell.WriteError($"Grid {gridId} doesn't have an associated grid entity.");
                return;
            }

            var changed   = 0;
            var tagSystem = EntitySystem.Get <TagSystem>();

            foreach (var child in xformQuery.GetComponent(grid.GridEntityId).ChildEntities)
            {
                if (!entityManager.EntityExists(child))
                {
                    continue;
                }

                var valid = false;

                // Occluders should only count if the state of it right now is enabled.
                // This prevents issues with edge firelocks.
                if (entityManager.TryGetComponent <OccluderComponent>(child, out var occluder))
                {
                    valid |= occluder.Enabled;
                }
                // low walls & grilles
                valid |= entityManager.HasComponent <SharedCanBuildWindowOnTopComponent>(child);
                // cables
                valid |= entityManager.HasComponent <CableComponent>(child);
                // anything else that might need this forced
                valid |= tagSystem.HasTag(child, "ForceFixRotations");
                // override
                valid &= !tagSystem.HasTag(child, "ForceNoFixRotations");

                if (!valid)
                {
                    continue;
                }

                var childXform = xformQuery.GetComponent(child);

                if (childXform.LocalRotation != Angle.Zero)
                {
                    childXform.LocalRotation = Angle.Zero;
                    changed++;
                }
            }

            shell.WriteLine($"Changed {changed} entities. If things seem wrong, reconnect.");
        }
    public void Execute(IConsoleShell shell, string argStr, string[] args)
    {
        if (args.Length < 4)
        {
            shell.WriteError("Expected at least 5 arguments.");
            return;
        }

        if (!EntityUid.TryParse(args[0], out var gridId))
        {
            shell.WriteError($"Failed parsing gridId '{args[3]}'.");
            return;
        }

        if (!uint.TryParse(args[1], out var uid))
        {
            shell.WriteError($"Failed parsing uid '{args[1]}'.");
            return;
        }

        if (!IoCManager.Resolve <IMapManager>().GridExists(gridId))
        {
            shell.WriteError($"No grid with gridId {gridId} exists.");
            return;
        }

        var decalSystem = EntitySystem.Get <DecalSystem>();

        switch (args[2].ToLower())
        {
        case "position":
            if (args.Length != 5)
            {
                shell.WriteError("Expected 6 arguments.");
                return;
            }

            if (!float.TryParse(args[3], out var x) || !float.TryParse(args[4], out var y))
            {
                shell.WriteError("Failed parsing position.");
                return;
            }

            if (!decalSystem.SetDecalPosition(gridId, uid, gridId, new Vector2(x, y)))
            {
                shell.WriteError("Failed changing decalposition.");
            }
            break;

        case "color":
            if (args.Length != 4)
            {
                shell.WriteError("Expected 5 arguments.");
                return;
            }

            if (!Color.TryFromName(args[3], out var color))
            {
                shell.WriteError("Failed parsing color.");
                return;
            }

            if (!decalSystem.SetDecalColor(gridId, uid, color))
            {
                shell.WriteError("Failed changing decal color.");
            }
            break;

        case "id":
            if (args.Length != 4)
            {
                shell.WriteError("Expected 5 arguments.");
                return;
            }

            if (!decalSystem.SetDecalId(gridId, uid, args[3]))
            {
                shell.WriteError("Failed changing decal id.");
            }
            break;

        case "rotation":
            if (args.Length != 4)
            {
                shell.WriteError("Expected 5 arguments.");
                return;
            }

            if (!double.TryParse(args[3], out var degrees))
            {
                shell.WriteError("Failed parsing degrees.");
                return;
            }

            if (!decalSystem.SetDecalRotation(gridId, uid, Angle.FromDegrees(degrees)))
            {
                shell.WriteError("Failed changing decal rotation.");
            }
            break;

        case "zindex":
            if (args.Length != 4)
            {
                shell.WriteError("Expected 5 arguments.");
                return;
            }

            if (!int.TryParse(args[3], out var zIndex))
            {
                shell.WriteError("Failed parsing zIndex.");
                return;
            }

            if (!decalSystem.SetDecalZIndex(gridId, uid, zIndex))
            {
                shell.WriteError("Failed changing decal zIndex.");
            }
            break;

        case "clean":
            if (args.Length != 4)
            {
                shell.WriteError("Expected 5 arguments.");
                return;
            }

            if (!bool.TryParse(args[3], out var cleanable))
            {
                shell.WriteError("Failed parsing cleanable.");
                return;
            }

            if (!decalSystem.SetDecalCleanable(gridId, uid, cleanable))
            {
                shell.WriteError("Failed changing decal cleanable flag.");
            }
            break;

        default:
            shell.WriteError("Invalid mode.");
            return;
        }
    }
        public void Execute(IConsoleShell shell, string argStr, string[] args)
        {
            var       player        = shell.Player as IPlayerSession;
            var       entityManager = IoCManager.Resolve <IEntityManager>();
            EntityUid?gridId;

            switch (args.Length)
            {
            case 0:
                if (player?.AttachedEntity is not {
                    Valid : true
                } playerEntity)
                {
                    shell.WriteLine("Only a player can run this command.");
                    return;
                }

                gridId = entityManager.GetComponent <TransformComponent>(playerEntity).GridUid;
                break;

            case 1:
                if (!EntityUid.TryParse(args[0], out var id))
                {
                    shell.WriteLine($"{args[0]} is not a valid entity.");
                    return;
                }

                gridId = id;
                break;

            default:
                shell.WriteLine(Help);
                return;
            }

            var mapManager = IoCManager.Resolve <IMapManager>();

            if (!mapManager.TryGetGrid(gridId, out var grid))
            {
                shell.WriteLine($"No grid exists with id {gridId}");
                return;
            }

            if (!entityManager.EntityExists(grid.GridEntityId))
            {
                shell.WriteLine($"Grid {gridId} doesn't have an associated grid entity.");
                return;
            }

            var tileDefinitionManager = IoCManager.Resolve <ITileDefinitionManager>();
            var tagSystem             = EntitySystem.Get <TagSystem>();
            var underplating          = tileDefinitionManager[TilePrototypeID];
            var underplatingTile      = new Tile(underplating.TileId);
            var changed = 0;

            foreach (var child in entityManager.GetComponent <TransformComponent>(grid.GridEntityId).ChildEntities)
            {
                if (!entityManager.EntityExists(child))
                {
                    continue;
                }

                if (!tagSystem.HasTag(child, WallTag))
                {
                    continue;
                }

                var childTransform = entityManager.GetComponent <TransformComponent>(child);

                if (!childTransform.Anchored)
                {
                    continue;
                }

                var tile    = grid.GetTileRef(childTransform.Coordinates);
                var tileDef = (ContentTileDefinition)tileDefinitionManager[tile.Tile.TypeId];

                if (tileDef.ID == TilePrototypeID)
                {
                    continue;
                }

                grid.SetTile(childTransform.Coordinates, underplatingTile);
                changed++;
            }

            shell.WriteLine($"Changed {changed} tiles.");
        }
    public void Execute(IConsoleShell shell, string argStr, string[] args)
    {
        var       player        = shell.Player as IPlayerSession;
        var       entityManager = IoCManager.Resolve <IEntityManager>();
        EntityUid?gridId;
        string    tileIdA = "";
        string    tileIdB = "";

        switch (args.Length)
        {
        case 2:
            if (player?.AttachedEntity is not {
                Valid : true
            } playerEntity)
            {
                shell.WriteLine("Only a player can run this command without a grid ID.");
                return;
            }

            gridId  = entityManager.GetComponent <TransformComponent>(playerEntity).GridUid;
            tileIdA = args[0];
            tileIdB = args[1];
            break;

        case 3:
            if (!EntityUid.TryParse(args[0], out var id))
            {
                shell.WriteLine($"{args[0]} is not a valid entity.");
                return;
            }

            gridId  = id;
            tileIdA = args[1];
            tileIdB = args[2];
            break;

        default:
            shell.WriteLine(Help);
            return;
        }

        var tileDefinitionManager = IoCManager.Resolve <ITileDefinitionManager>();
        var tileA = tileDefinitionManager[tileIdA];
        var tileB = tileDefinitionManager[tileIdB];

        var mapManager = IoCManager.Resolve <IMapManager>();

        if (!mapManager.TryGetGrid(gridId, out var grid))
        {
            shell.WriteLine($"No grid exists with id {gridId}");
            return;
        }

        if (!entityManager.EntityExists(grid.GridEntityId))
        {
            shell.WriteLine($"Grid {gridId} doesn't have an associated grid entity.");
            return;
        }

        var changed = 0;

        foreach (var tile in grid.GetAllTiles())
        {
            var tileContent = tile.Tile;
            if (tileContent.TypeId == tileA.TileId)
            {
                grid.SetTile(tile.GridIndices, new Tile(tileB.TileId));
                changed++;
            }
        }

        shell.WriteLine($"Changed {changed} tiles.");
    }
Example #12
0
    private void FixGridAtmosCommand(IConsoleShell shell, string argstr, string[] args)
    {
        if (args.Length == 0)
        {
            shell.WriteError("Not enough arguments.");
            return;
        }

        var mixtures = new GasMixture[6];

        for (var i = 0; i < mixtures.Length; i++)
        {
            mixtures[i] = new GasMixture(Atmospherics.CellVolume)
            {
                Temperature = Atmospherics.T20C
            }
        }
        ;

        // 0: Air
        mixtures[0].AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard);
        mixtures[0].AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard);

        // 1: Vaccum

        // 2: Oxygen (GM)
        mixtures[2].AdjustMoles(Gas.Oxygen, Atmospherics.MolesCellGasMiner);

        // 3: Nitrogen (GM)
        mixtures[3].AdjustMoles(Gas.Nitrogen, Atmospherics.MolesCellGasMiner);

        // 4: Plasma (GM)
        mixtures[4].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);

        // 5: Instant Plasmafire (r)
        mixtures[5].AdjustMoles(Gas.Oxygen, Atmospherics.MolesCellGasMiner);
        mixtures[5].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);
        mixtures[5].Temperature = 5000f;

        foreach (var gid in args)
        {
            if (!EntityUid.TryParse(gid, out var euid))
            {
                shell.WriteError($"Failed to parse euid '{gid}'.");
                return;
            }

            if (!TryComp(euid, out IMapGridComponent? gridComp))
            {
                shell.WriteError($"Euid '{euid}' does not exist or is not a grid.");
                return;
            }

            if (!TryComp(euid, out GridAtmosphereComponent? gridAtmosphere))
            {
                shell.WriteError($"Grid \"{euid}\" has no atmosphere component, try addatmos.");
                continue;
            }

            foreach (var(indices, tileMain) in gridAtmosphere.Tiles)
            {
                var tile = tileMain.Air;
                if (tile == null)
                {
                    continue;
                }

                tile.Clear();
                var mixtureId = 0;
                foreach (var entUid in gridComp.Grid.GetAnchoredEntities(indices))
                {
                    if (!TryComp(entUid, out AtmosFixMarkerComponent? afm))
                    {
                        continue;
                    }
                    mixtureId = afm.Mode;
                    break;
                }
                var mixture = mixtures[mixtureId];
                Merge(tile, mixture);
                tile.Temperature = mixture.Temperature;

                InvalidateTile(gridAtmosphere, indices);
            }
        }
    }
}
Example #13
0
    private void FixGridAtmosCommand(IConsoleShell shell, string argstr, string[] args)
    {
        if (args.Length == 0)
        {
            shell.WriteError("Not enough arguments.");
            return;
        }

        var mixtures = new GasMixture[7];

        for (var i = 0; i < mixtures.Length; i++)
        {
            mixtures[i] = new GasMixture(Atmospherics.CellVolume)
            {
                Temperature = Atmospherics.T20C
            }
        }
        ;

        // 0: Air
        mixtures[0].AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard);
        mixtures[0].AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard);

        // 1: Vaccum

        // 2: Oxygen (GM)
        mixtures[2].AdjustMoles(Gas.Oxygen, Atmospherics.MolesCellGasMiner);

        // 3: Nitrogen (GM)
        mixtures[3].AdjustMoles(Gas.Nitrogen, Atmospherics.MolesCellGasMiner);

        // 4: Plasma (GM)
        mixtures[4].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);

        // 5: Instant Plasmafire (r)
        mixtures[5].AdjustMoles(Gas.Oxygen, Atmospherics.MolesCellGasMiner);
        mixtures[5].AdjustMoles(Gas.Plasma, Atmospherics.MolesCellGasMiner);
        mixtures[5].Temperature = 5000f;

        // 6: (Walk-In) Freezer
        mixtures[6].AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard);
        mixtures[6].AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard);
        mixtures[6].Temperature = 235f; // Little colder than an actual freezer but gives a grace period to get e.g. themomachines set up, should keep warm for a few door openings

        foreach (var arg in args)
        {
            if (!EntityUid.TryParse(arg, out var euid))
            {
                shell.WriteError($"Failed to parse euid '{arg}'.");
                return;
            }

            if (!TryComp(euid, out IMapGridComponent? gridComp))
            {
                shell.WriteError($"Euid '{euid}' does not exist or is not a grid.");
                return;
            }

            if (!TryComp(euid, out GridAtmosphereComponent? gridAtmosphere))
            {
                shell.WriteError($"Grid \"{euid}\" has no atmosphere component, try addatmos.");
                continue;
            }

            var transform = Transform(euid);

            foreach (var(indices, tileMain) in gridAtmosphere.Tiles)
            {
                var tile = tileMain.Air;
                if (tile == null)
                {
                    continue;
                }

                if (tile.Immutable && !IsTileSpace(euid, transform.MapUid, indices, gridComp))
                {
                    tile = new GasMixture(tile.Volume)
                    {
                        Temperature = tile.Temperature
                    };
                    tileMain.Air = tile;
                }

                tile.Clear();
                var mixtureId = 0;
                foreach (var entUid in gridComp.Grid.GetAnchoredEntities(indices))
                {
                    if (!TryComp(entUid, out AtmosFixMarkerComponent? afm))
                    {
                        continue;
                    }
                    mixtureId = afm.Mode;
                    break;
                }
                var mixture = mixtures[mixtureId];
                Merge(tile, mixture);
                tile.Temperature = mixture.Temperature;

                gridAtmosphere.InvalidatedCoords.Add(indices);
            }
        }
    }
Example #14
0
        public void Execute(IConsoleShell shell, string argStr, string[] args)
        {
            var vvm = IoCManager.Resolve <IViewVariablesManager>();

            // If you don't provide an entity ID, it opens the test class.
            // Spooky huh.
            if (args.Length == 0)
            {
                vvm.OpenVV(new VVTest());
                return;
            }

            var valArg = args[0];

            if (valArg.StartsWith("SI"))
            {
                if (valArg.StartsWith("SIoC"))
                {
                    valArg = valArg.Substring(4);
                }

                // Server-side IoC selector.
                var selector = new ViewVariablesIoCSelector(valArg.Substring(1));
                vvm.OpenVV(selector);
                return;
            }

            if (valArg.StartsWith("I"))
            {
                if (valArg.StartsWith("IoC"))
                {
                    valArg = valArg.Substring(3);
                }

                // Client-side IoC selector.
                var reflection = IoCManager.Resolve <IReflectionManager>();
                if (!reflection.TryLooseGetType(valArg, out var type))
                {
                    shell.WriteLine("Unable to find that type.");
                    return;
                }

                object obj;
                try
                {
                    obj = IoCManager.ResolveType(type);
                }
                catch (UnregisteredTypeException)
                {
                    shell.WriteLine("Unable to find that type.");
                    return;
                }
                vvm.OpenVV(obj);
                return;
            }

            // Client side entity system.
            if (valArg.StartsWith("CE"))
            {
                valArg = valArg.Substring(2);
                var reflection = IoCManager.Resolve <IReflectionManager>();

                if (!reflection.TryLooseGetType(valArg, out var type))
                {
                    shell.WriteLine("Unable to find that type.");
                    return;
                }

                vvm.OpenVV(IoCManager.Resolve <IEntitySystemManager>().GetEntitySystem(type));
            }

            if (valArg.StartsWith("SE"))
            {
                // Server-side Entity system selector.
                var selector = new ViewVariablesEntitySystemSelector(valArg.Substring(2));
                vvm.OpenVV(selector);
                return;
            }

            if (valArg.StartsWith("guihover"))
            {
                // UI element.
                var obj = IoCManager.Resolve <IUserInterfaceManager>().CurrentlyHovered;
                if (obj == null)
                {
                    shell.WriteLine("Not currently hovering any control.");
                    return;
                }
                vvm.OpenVV(obj);
                return;
            }

            // Entity.
            if (!EntityUid.TryParse(args[0], out var entity))
            {
                shell.WriteLine("Invalid specifier format.");
                return;
            }

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

            if (!entityManager.EntityExists(entity))
            {
                shell.WriteLine("That entity does not exist locally. Attempting to open remote view...");
                vvm.OpenVV(new ViewVariablesEntitySelector(entity));
                return;
            }

            vvm.OpenVV(entity);
        }
Example #15
0
        public void Execute(IConsoleShell shell, string argStr, string[] args)
        {
            if (args.Length < 4 || args.Length > 7)
            {
                shell.WriteError($"Received invalid amount of arguments arguments. Expected 4 to 7, got {args.Length}.\nUsage: {Help}");
                return;
            }

            if (!IoCManager.Resolve <IPrototypeManager>().HasIndex <DecalPrototype>(args[0]))
            {
                shell.WriteError($"Cannot find decalprototype '{args[0]}'.");
            }

            if (!float.TryParse(args[1], out var x))
            {
                shell.WriteError($"Failed parsing x-coordinate '{args[1]}'.");
                return;
            }

            if (!float.TryParse(args[2], out var y))
            {
                shell.WriteError($"Failed parsing y-coordinate'{args[2]}'.");
                return;
            }

            var mapManager = IoCManager.Resolve <IMapManager>();

            if (!EntityUid.TryParse(args[3], out var gridIdRaw) || !mapManager.TryGetGrid(gridIdRaw, out var grid))
            {
                shell.WriteError($"Failed parsing gridId '{args[3]}'.");
                return;
            }

            var coordinates = new EntityCoordinates(grid.GridEntityId, new Vector2(x, y));

            if (grid.GetTileRef(coordinates).IsSpace())
            {
                shell.WriteError($"Cannot create decal on space tile at {coordinates}.");
                return;
            }

            Color?color    = null;
            var   zIndex   = 0;
            Angle?rotation = null;

            if (args.Length > 4)
            {
                for (int i = 4; i < args.Length; i++)
                {
                    var rawValue = args[i].Split('=');
                    if (rawValue.Length != 2)
                    {
                        shell.WriteError($"Failed parsing parameter: '{args[i]}'");
                        return;
                    }

                    switch (rawValue[0])
                    {
                    case "angle":
                        if (!double.TryParse(rawValue[1], out var degrees))
                        {
                            shell.WriteError($"Failed parsing angle '{rawValue[1]}'.");
                            return;
                        }
                        rotation = Angle.FromDegrees(degrees);
                        break;

                    case "zIndex":
                        if (!int.TryParse(rawValue[1], out zIndex))
                        {
                            shell.WriteError($"Failed parsing zIndex '{rawValue[1]}'.");
                            return;
                        }
                        break;

                    case "color":
                        if (!Color.TryFromName(rawValue[1], out var colorRaw))
                        {
                            shell.WriteError($"Failed parsing color '{rawValue[1]}'.");
                            return;
                        }

                        color = colorRaw;
                        break;

                    default:
                        shell.WriteError($"Unknown parameter key '{rawValue[0]}'.");
                        return;
                    }
                }
            }

            if (EntitySystem.Get <DecalSystem>().TryAddDecal(args[0], coordinates, out var uid, color, rotation, zIndex))
            {
                shell.WriteLine($"Successfully created decal {uid}.");
            }
Example #16
0
    public void Execute(IConsoleShell shell, string argStr, string[] args)
    {
        if (args.Length != 2)
        {
            shell.WriteError($"Insufficient number of args supplied: expected 2 and received {args.Length}");
            return;
        }

        if (!EntityUid.TryParse(args[0], out var uid))
        {
            shell.WriteError($"Unable to find entity {args[0]}");
            return;
        }

        if (!float.TryParse(args[1], out var scale))
        {
            shell.WriteError($"Invalid scale supplied of {args[0]}");
            return;
        }

        if (scale < 0f)
        {
            shell.WriteError($"Invalid scale supplied that is negative!");
            return;
        }

        // Event for content to use
        // We'll just set engine stuff here
        var @event     = new ScaleEntityEvent();
        var entManager = IoCManager.Resolve <IEntityManager>();

        entManager.EventBus.RaiseLocalEvent(uid, ref @event);

        if (entManager.TryGetComponent(uid, out SpriteComponent? spriteComponent))
        {
            spriteComponent.Scale *= scale;
        }

        if (entManager.TryGetComponent(uid, out FixturesComponent? manager))
        {
            foreach (var(_, fixture) in manager.Fixtures)
            {
                // TODO: May be worthwhile to swap to density like box2d? Either way mass is unchanged for now.
                switch (fixture.Shape)
                {
                case EdgeShape edge:
                    edge.Vertex0 *= scale;
                    edge.Vertex1 *= scale;
                    edge.Vertex2 *= scale;
                    edge.Vertex3 *= scale;
                    break;

                case PhysShapeCircle circle:
                    circle.Position *= scale;
                    circle.Radius   *= scale;
                    break;

                case PolygonShape poly:
                    var verts = poly.Vertices;

                    for (var i = 0; i < verts.Length; i++)
                    {
                        verts[i] *= scale;
                    }

                    poly.SetVertices(verts);
                    break;

                default:
                    throw new NotImplementedException();
                }
            }

            EntitySystem.Get <FixtureSystem>().FixtureUpdate(manager);
        }
    }