feather icon indicating copy to clipboard operation
feather copied to clipboard

Tracking issue: complete command support

Open caelunshun opened this issue 4 years ago • 6 comments

#209 added initial support for commands using lieutenant and implemented /tp and /gamemode. What's left to do:

For newcomers to the project, implementing a command is a good way to start. The basic process is:

  • Locate the Minecraft Wiki page for the command and read through it, so you understand the command well (skip any Bedrock-specific sections).
  • Go into server/commands/src/impls.rs and implement the command.
    • The tp implementation is a good example of how a command could be implemented.
    • If you need a new argument type (for example, a parsed gamemode or a UUID), implement it in server/commands/src/arguments.rs. EntitySelector and ParsedGamemode are useful examples to see how this is done.

If you need any help, you are welcome to ask as many questions as you need on our Discord server :)

caelunshun avatar May 18 '20 20:05 caelunshun

I'm currently working on the tell command.

ambeeeeee avatar May 18 '20 21:05 ambeeeeee

Java Edition vanilla commands list:

onbjerg avatar May 22 '20 13:05 onbjerg

I think I will start working on the /weather command.

BuggStream avatar Jul 01 '20 19:07 BuggStream

I have written some python code to parse the commands.json file that you can generate from the server jar. Using this i have generated (almost) all the functions one would need to implement to reach 99% vanilla command support.

The included file commands.txt contains (almost) all the functions that one would eventually need to implement. As an example here is one of the xp commands. For now i have them returning a "not implemented msg", but we would have to implement their functionality here.

#[command(usage="xp add <targets> <amount> points")]
pub fn xp2(
    targets : MultiplePlayers, amount : IntegerArgument
) -> anyhow::Result<()>{
    if let Some(mut sender_message_receiver) = ctx.world.try_get_mut::<MessageReceiver>(ctx.sender)
    {
        let return_text = Text::from("This command \"xp add <targets> <amount> points\" is not implemented in this version of feather.").gray().italic();
        sender_message_receiver.send(return_text);
    }
    return Ok(())
}

The included file parsers.txt has a list of the 50 to 60 ish parsers that the commands in commands.rs assume we have implemented. As an example here is the parser for BlockPos.

#[derive(Debug, Error)]
pub enum BlockPosParseError {}

#[derive(Clone, Debug)]
pub struct BlockPos(pub String);

impl ArgumentKind<CommandCtx> for BlockPos {
    type ParseError = BlockPosParseError;

    fn satisfies<'a>(_ctx: &CommandCtx, input: &mut Input<'a>) -> bool {
        input.advance_until(" ");
        //TODO 
        true
    }

    fn parse<'a>(_ctx: &CommandCtx, input: &mut Input<'a>) -> Result<Self, Self::ParseError> {
        let text = input.advance_until(" ");
        //TODO
        Ok(BlockPos(text.to_owned()))
    }
}

With my scripts i am able to load two different versions of minecrafts commands.json file and see what changes have been made. This would make it possible to track changes in vanilla commands, and get a "diff" for every release, stating what rust code needs to be added/removed. I want to know if the maintainers would be interested in including the generated files. I am not suggesting we add python as part of the build process, just the generated code. If you want to include the generated code, then i am going to spend some time improving the script and release it, and also spend the time creating a pull request.

parsers.txt

commands.txt

Miro-Andrin avatar Jul 30 '20 12:07 Miro-Andrin

@Miro-Andrin Wow, that's impressive, thanks for this! I'd be happy to include these generated files as part of the commands crate. Including the generator script in this repo seems like a good idea, in case we want to regenerate the code for some reason, but it doesn't have to be a mandatory build dependency.

caelunshun avatar Jul 31 '20 07:07 caelunshun

stop command is already implemented (https://github.com/feather-rs/feather/pull/260), mark it as done please :) Same with clear.

CDFN avatar Sep 19 '20 21:09 CDFN