package net.minestom.demo.commands; 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.Argument; import net.minestom.server.command.builder.arguments.ArgumentEnum; import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.command.builder.arguments.minecraft.registry.ArgumentEntityType; import net.minestom.server.command.builder.condition.Conditions; import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.*; import net.minestom.server.utils.location.RelativeVec; import org.jetbrains.annotations.NotNull; public class SummonCommand extends Command { private final ArgumentEntityType entity; private final Argument pos; private final Argument entityClass; public SummonCommand() { super("summon"); setCondition(Conditions::playerOnly); entity = ArgumentType.EntityType("entity type"); pos = ArgumentType.RelativeVec3("pos").setDefaultValue(() -> new RelativeVec( new Vec(0, 0, 0), RelativeVec.CoordinateType.RELATIVE, true, true, true )); entityClass = ArgumentType.Enum("class", EntityClass.class) .setFormat(ArgumentEnum.Format.LOWER_CASED) .setDefaultValue(EntityClass.CREATURE); addSyntax(this::execute, entity, pos, entityClass); setDefaultExecutor((sender, context) -> sender.sendMessage("Usage: /summon ")); } private void execute(@NotNull CommandSender commandSender, @NotNull CommandContext commandContext) { final Entity entity = commandContext.get(entityClass).instantiate(commandContext.get(this.entity)); //noinspection ConstantConditions - One couldn't possibly execute a command without being in an instance entity.setInstance(((Player) commandSender).getInstance(), commandContext.get(pos).fromSender(commandSender)); } @SuppressWarnings("unused") enum EntityClass { BASE(Entity::new), LIVING(LivingEntity::new), CREATURE(EntityCreature::new); private final EntityFactory factory; EntityClass(EntityFactory factory) { this.factory = factory; } public Entity instantiate(EntityType type) { return factory.newInstance(type); } } interface EntityFactory { Entity newInstance(EntityType type); } }