mirror of https://github.com/Minestom/Minestom.git
63 lines
2.6 KiB
Java
63 lines
2.6 KiB
Java
package net.minestom.demo.commands;
|
|
|
|
import net.kyori.adventure.text.Component;
|
|
import net.minestom.server.command.CommandSender;
|
|
import net.minestom.server.command.builder.Command;
|
|
import net.minestom.server.command.builder.CommandContext;
|
|
import net.minestom.server.command.builder.arguments.ArgumentType;
|
|
import net.minestom.server.command.builder.condition.Conditions;
|
|
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
|
|
import net.minestom.server.entity.EntityType;
|
|
import net.minestom.server.entity.Player;
|
|
import net.minestom.server.entity.metadata.arrow.ArrowMeta;
|
|
import net.minestom.server.entity.EntityProjectile;
|
|
|
|
import java.util.concurrent.ThreadLocalRandom;
|
|
|
|
public class ShootCommand extends Command {
|
|
|
|
public ShootCommand() {
|
|
super("shoot");
|
|
setCondition(Conditions::playerOnly);
|
|
setDefaultExecutor(this::defaultExecutor);
|
|
var typeArg = ArgumentType.Word("type").from("default", "spectral", "colored");
|
|
setArgumentCallback(this::onTypeError, typeArg);
|
|
addSyntax(this::onShootCommand, typeArg);
|
|
}
|
|
|
|
private void defaultExecutor(CommandSender sender, CommandContext context) {
|
|
sender.sendMessage(Component.text("Correct usage: shoot [default/spectral/colored]"));
|
|
}
|
|
|
|
private void onTypeError(CommandSender sender, ArgumentSyntaxException exception) {
|
|
sender.sendMessage(Component.text("SYNTAX ERROR: '" + exception.getInput() + "' should be replaced by 'default', 'spectral' or 'colored'"));
|
|
}
|
|
|
|
private void onShootCommand(CommandSender sender, CommandContext context) {
|
|
Player player = (Player) sender;
|
|
String mode = context.get("type");
|
|
EntityProjectile projectile;
|
|
switch (mode) {
|
|
case "default":
|
|
projectile = new EntityProjectile(player, EntityType.ARROW);
|
|
break;
|
|
case "spectral":
|
|
projectile = new EntityProjectile(player, EntityType.SPECTRAL_ARROW);
|
|
break;
|
|
case "colored":
|
|
projectile = new EntityProjectile(player, EntityType.ARROW);
|
|
var meta = (ArrowMeta) projectile.getEntityMeta();
|
|
meta.setColor(ThreadLocalRandom.current().nextInt());
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
var pos = player.getPosition().add(0D, player.getEyeHeight(), 0D);
|
|
//noinspection ConstantConditions - It should be impossible to execute a command without being in an instance
|
|
projectile.setInstance(player.getInstance(), pos);
|
|
var dir = pos.direction().mul(30D);
|
|
pos = pos.add(dir);
|
|
projectile.shoot(pos, 1D, 0D);
|
|
}
|
|
}
|