Exemplo n.º 1
0
        internal async Task SendDeclareCommandsAsync()
        {
            var packet = new DeclareCommands();
            var index  = 0;

            var node = new CommandNode()
            {
                Type = CommandNodeType.Root
            };

            // TODO overloads
            foreach (Obsidian.CommandFramework.Entities.Command command in this.Server.Commands.GetAllCommands())
            {
                foreach (var overload in command.Overloads)
                {
                    var commandNode = new CommandNode()
                    {
                        Name  = command.Name,
                        Type  = CommandNodeType.Literal,
                        Index = ++index
                    };

                    foreach (var parameter in command.Overloads.First().GetParameters().Skip(1))
                    {
                        var parameterNode = new CommandNode()
                        {
                            Name  = parameter.Name,
                            Type  = CommandNodeType.Argument,
                            Index = ++index
                        };
                        Type type = parameter.ParameterType;

                        if (type == typeof(string))
                        {
                            parameterNode.Parser = new StringCommandParser(parameter.CustomAttributes.Any(x => x.AttributeType == typeof(RemainingAttribute)) ? StringType.GreedyPhrase : StringType.SingleWord);
                        }
                        else if (type == typeof(double))
                        {
                            parameterNode.Parser = new CommandParser("brigadier:double");
                        }
                        else if (type == typeof(float))
                        {
                            parameterNode.Parser = new CommandParser("brigadier:float");
                        }
                        else if (type == typeof(int))
                        {
                            parameterNode.Parser = new CommandParser("brigadier:integer");
                        }
                        else if (type == typeof(bool))
                        {
                            parameterNode.Parser = new CommandParser("brigadier:bool");
                        }
                        else if (type == typeof(Position))
                        {
                            parameterNode.Parser = new CommandParser("minecraft:vec3");
                        }
                        else if (type == typeof(Player))
                        {
                            parameterNode.Parser = new EntityCommandParser(EntityCommadBitMask.OnlyPlayers);
                        }
                        else
                        {
                            continue;
                        }

                        commandNode.AddChild(parameterNode);
                    }

                    commandNode.Type |= CommandNodeType.IsExecutabe;

                    node.AddChild(commandNode);
                }
            }

            packet.AddNode(node);
            await this.QueuePacketAsync(packet);

            this.Logger.LogDebug("Sent Declare Commands packet.");
        }
Exemplo n.º 2
0
        internal async Task SendDeclareCommandsAsync()
        {
            var packet = new DeclareCommands();
            var index  = 0;

            var node = new CommandNode()
            {
                Type = CommandNodeType.Root
            };

            foreach (Qmmands.Command command in this.Server.Commands.GetAllCommands())
            {
                var commandNode = new CommandNode()
                {
                    Name  = command.Name,
                    Type  = CommandNodeType.Literal,
                    Index = ++index
                };

                foreach (Qmmands.Parameter parameter in command.Parameters)
                {
                    var parameterNode = new CommandNode()
                    {
                        Name  = parameter.Name,
                        Type  = CommandNodeType.Argument,
                        Index = ++index
                    };
                    Type type = parameter.Type;

                    if (type == typeof(string))
                    {
                        parameterNode.Parser = new StringCommandParser(parameter.IsRemainder ? StringType.GreedyPhrase : StringType.SingleWord);
                    }
                    else if (type == typeof(double))
                    {
                        parameterNode.Parser = new CommandParser("brigadier:double");
                    }
                    else if (type == typeof(float))
                    {
                        parameterNode.Parser = new CommandParser("brigadier:float");
                    }
                    else if (type == typeof(int))
                    {
                        parameterNode.Parser = new CommandParser("brigadier:integer");
                    }
                    else if (type == typeof(bool))
                    {
                        parameterNode.Parser = new CommandParser("brigadier:bool");
                    }
                    else if (type == typeof(Position))
                    {
                        parameterNode.Parser = new CommandParser("minecraft:vec3");
                    }
                    else if (type == typeof(Player))
                    {
                        parameterNode.Parser = new EntityCommandParser(EntityCommadBitMask.OnlyPlayers);
                    }
                    else
                    {
                        continue;
                    }

                    commandNode.AddChild(parameterNode);
                }

                commandNode.Type |= CommandNodeType.IsExecutabe;

                node.AddChild(commandNode);
            }

            packet.AddNode(node);
            await this.QueuePacketAsync(packet);

            this.Logger.LogDebug("Sent Declare Commands packet.");
        }
Exemplo n.º 3
0
        internal async Task SendDeclareCommandsAsync()
        {
            // TODO only build packet for first player, or prebuild packet. Very unlikely to add commands after server start??
            var packet = new DeclareCommands();
            var index  = 0;

            var node = new CommandNode()
            {
                Type  = CommandNodeType.Root,
                Index = index
            };

            foreach (var cmd in this.Server.Commands.GetAllCommands())
            {
                var cmdnode = new CommandNode()
                {
                    Index = ++index,
                    Name  = cmd.Name,
                    Type  = CommandNodeType.Literal
                };
                node.AddChild(cmdnode);

                foreach (var overload in cmd.Overloads.Take(1))
                {
                    var args = overload.GetParameters().Skip(1); // skipping obsidian context
                    if (args.Count() < 1)
                    {
                        cmdnode.Type |= CommandNodeType.IsExecutabe;
                    }

                    var prev = cmdnode;

                    foreach (var arg in args)
                    {
                        var argnode = new CommandNode()
                        {
                            Index = ++index,
                            Name  = arg.Name,
                            Type  = CommandNodeType.Argument | CommandNodeType.IsExecutabe
                        };

                        prev.AddChild(argnode);
                        prev = argnode;

                        Type type = arg.ParameterType;

                        var mctype = this.Server.Commands.FindMinecraftType(type);

                        switch (mctype)
                        {
                        case "brigadier:string":
                            argnode.Parser = new StringCommandParser(arg.CustomAttributes.Any(x => x.AttributeType == typeof(RemainingAttribute)) ? StringType.GreedyPhrase : StringType.QuotablePhrase);
                            break;

                        case "obsidian:player":
                            // this is a custom type used by obsidian meaning "only player entities".
                            argnode.Parser = new EntityCommandParser(EntityCommadBitMask.OnlyPlayers);
                            break;

                        default:
                            argnode.Parser = new CommandParser(mctype);
                            break;
                        }
                    }
                }
            }

            packet.AddNode(node);
            await this.QueuePacketAsync(packet);

            this.Logger.LogDebug("Sent Declare Commands packet.");
        }
Exemplo n.º 4
0
        internal async Task SendDeclareCommandsAsync()
        {
            var packet = new DeclareCommands();

            var node = new CommandNode()
            {
                Type = CommandNodeType.Root
            };

            foreach (Qmmands.Command command in this.OriginServer.Commands.GetAllCommands())
            {
                var commandNode = new CommandNode()
                {
                    Name = command.Name,
                    Type = CommandNodeType.Literal
                };

                foreach (Qmmands.Parameter parameter in command.Parameters)
                {
                    var parameterNode = new CommandNode()
                    {
                        Name = parameter.Name,
                        Type = CommandNodeType.Argument,
                    };

                    Type type = parameter.Type;

                    if (type == typeof(string))
                    {
                        parameterNode.Parser = new StringCommandParser(parameter.IsRemainder ? StringType.GreedyPhrase : StringType.QuotablePhrase);
                    }
                    else if (type == typeof(double))
                    {
                        parameterNode.Parser = new EmptyFlagsCommandParser("brigadier:double");
                    }
                    else if (type == typeof(float))
                    {
                        parameterNode.Parser = new EmptyFlagsCommandParser("brigadier:float");
                    }
                    else if (type == typeof(int))
                    {
                        parameterNode.Parser = new EmptyFlagsCommandParser("brigadier:integer");
                    }
                    else if (type == typeof(bool))
                    {
                        parameterNode.Parser = new CommandParser("brigadier:bool");
                    }
                    else
                    {
                        continue;
                    }

                    commandNode.Children.Add(parameterNode);
                }

                if (commandNode.Children.Count > 0)
                {
                    commandNode.Children[0].Type |= CommandNodeType.IsExecutabe;
                }
                else
                {
                    commandNode.Type |= CommandNodeType.IsExecutabe;
                }

                node.Children.Add(commandNode);

                packet.AddNode(node);
            }

            await PacketHandler.CreateAsync(packet, this.MinecraftStream);

            this.Logger.LogDebug("Sent Declare Commands packet.");
        }