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."); }
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."); }
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."); }