feat: bukkit support, x-plat sub-commands

Also changes how the fabric modules are published
dependabot/gradle/org.projectlombok-lombok-1.18.34
William 5 months ago
parent d78847550c
commit 331f54407b
No known key found for this signature in database

@ -17,23 +17,17 @@
Uniform _currently_ targets the following platforms: Uniform _currently_ targets the following platforms:
Please note Uniform on Fabric requires [adventure-platform-fabric](https://docs.advntr.dev/platform/fabric.html) and the [Fabric API](https://fabricmc.net/) as dependencies. | Platform | Artifact | Minecraft | Java |
|---------------|--------------------|:----------:|:------:|
| Platform | Artifact | Minecraft | Java | | Common | `uniform-common` | - | \>`17` |
|---------------|-------------------------|:----------:|:------:| | Paper | `uniform-paper` | \>`1.20.6` | \>`21` |
| Common | `uniform-common` | - | \>`17` | | Velocity | `uniform-velocity` | \>`3.3.0` | \>`17` |
| Paper | `uniform-paper` | \>`1.20.6` | \>`21` | | Fabric 1.20.1 | `uniform-fabric` | =`1.20.1` | \>`17` |
| Velocity | `uniform-velocity` | \>`3.3.0` | \>`17` | | Fabric 1.20.6 | `uniform-fabric` | =`1.20.6` | \>`21` |
| Fabric 1.20.1 | `uniform-fabric-1_20_1` | =`1.20.1` | \>`17` | | Bukkit | `uniform-bukkit` | \>`1.17.1` | \>`17` |
| Fabric 1.20.6 | `uniform-fabric-1_20_6` | =`1.20.6` | \>`21` |
* **Fabric:** Please note Uniform on Fabric requires [adventure-platform-fabric](https://docs.advntr.dev/platform/fabric.html) and the [Fabric API](https://fabricmc.net/) as dependencies. To target Fabric, use `uniform-fabric` as the artifact and `<uniform_version>+<minecraft_version>` as the version (e.g. `net.william278.uniform:uniform-fabric:1.0+1.20.1`).
Uniform _plans_ to support the following platforms in the future: * **Sponge**: Support for Sponge 8 is also planned in a future version.
| Platform | Version | Java |
|----------|------------|:------:|
| Spigot | \>`1.17.1` | \>`17` |
| Sponge 8 | =`1.19.4` | \>`17` |
## Setup ## Setup
Uniform is available [on Maven](https://repo.william278.net/#/releases/net/william278/uniform/). You can browse the Javadocs [here](https://repo.william278.net/javadoc/releases/net/william278/uniform/latest). Uniform is available [on Maven](https://repo.william278.net/#/releases/net/william278/uniform/). You can browse the Javadocs [here](https://repo.william278.net/javadoc/releases/net/william278/uniform/latest).

@ -60,6 +60,7 @@ allprojects {
maven { url 'https://repo.papermc.io/repository/maven-public/' } maven { url 'https://repo.papermc.io/repository/maven-public/' }
maven { url 'https://libraries.minecraft.net/' } maven { url 'https://libraries.minecraft.net/' }
maven { url 'https://maven.fabricmc.net/' } maven { url 'https://maven.fabricmc.net/' }
maven { url 'https://mvn-repo.arim.space/lesser-gpl3/' }
} }
dependencies { dependencies {
@ -146,6 +147,19 @@ subprojects {
} }
} }
if (['bukkit'].contains(project.name)) {
publications {
mavenJavaBukkit(MavenPublication) {
groupId = 'net.william278.uniform'
artifactId = 'uniform-bukkit'
version = "$rootProject.version"
artifact shadowJar
artifact sourcesJar
artifact javadocJar
}
}
}
if (['velocity'].contains(project.name)) { if (['velocity'].contains(project.name)) {
publications { publications {
mavenJavaVelocity(MavenPublication) { mavenJavaVelocity(MavenPublication) {
@ -158,24 +172,26 @@ subprojects {
} }
} }
} }
if (['fabric-1.20.1'].contains(project.name)) { if (['fabric-1.20.1'].contains(project.name)) {
publications { publications {
mavenJavaFabric1_20_1(MavenPublication) { mavenJavaFabric1_20_1(MavenPublication) {
groupId = 'net.william278.uniform' groupId = 'net.william278.uniform'
artifactId = 'uniform-fabric-1_20_1' artifactId = 'uniform-fabric'
version = "$rootProject.version" version = "${rootProject.version}+1.20.1"
artifact shadowJar artifact shadowJar
artifact sourcesJar artifact sourcesJar
artifact javadocJar artifact javadocJar
} }
} }
} }
if (['fabric-1.20.6'].contains(project.name)) { if (['fabric-1.20.6'].contains(project.name)) {
publications { publications {
mavenJavaFabric1_20_6(MavenPublication) { mavenJavaFabric1_20_6(MavenPublication) {
groupId = 'net.william278.uniform' groupId = 'net.william278.uniform'
artifactId = 'uniform-fabric-1_20_6' artifactId = 'uniform-fabric'
version = "$rootProject.version" version = "${rootProject.version}+1.20.6"
artifact shadowJar artifact shadowJar
artifact sourcesJar artifact sourcesJar
artifact javadocJar artifact javadocJar

@ -0,0 +1,16 @@
plugins {
id 'java-library'
id 'maven-publish'
}
dependencies {
api project(path: ':common')
implementation 'net.kyori:adventure-platform-bukkit:4.3.3'
implementation 'space.arim.morepaperlib:morepaperlib:0.4.3'
compileOnlyApi 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
}

@ -0,0 +1,153 @@
/*
* This file is part of Uniform, licensed under the GNU General Public License v3.0.
*
* Copyright (c) Tofaa2
* Copyright (c) William278 <will27528@gmail.com>
* Copyright (c) contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.william278.uniform.bukkit;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestion;
import com.mojang.brigadier.tree.LiteralCommandNode;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.william278.uniform.BaseCommand;
import net.william278.uniform.Command;
import net.william278.uniform.CommandUser;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List;
@SuppressWarnings("unused")
public class BukkitCommand extends BaseCommand<CommandSender> {
private final JavaPlugin plugin;
private BukkitAudiences audiences;
public BukkitCommand(@NotNull Command command, @NotNull JavaPlugin plugin) {
super(command);
this.plugin = plugin;
}
public BukkitCommand(@NotNull JavaPlugin plugin, @NotNull String name, @NotNull String description,
@NotNull List<String> aliases) {
super(name, description, aliases);
this.plugin = plugin;
}
public BukkitCommand(@NotNull JavaPlugin plugin, @NotNull String name, @NotNull List<String> aliases) {
super(name, aliases);
this.plugin = plugin;
}
@NotNull
Impl getImpl() {
return new Impl(this);
}
static final class Impl extends org.bukkit.command.Command {
private static final int COMMAND_SUCCESS = com.mojang.brigadier.Command.SINGLE_SUCCESS;
private final LiteralCommandNode<CommandSender> commandNode;
private final CommandDispatcher<CommandSender> dispatcher;
private final JavaPlugin plugin;
private BukkitAudiences audiences;
public Impl(@NotNull BukkitCommand command) {
super(command.getName());
this.audiences = command.audiences;
this.plugin = command.plugin;
// Register command, setup description and aliases
this.dispatcher = new CommandDispatcher<>();
this.commandNode = this.dispatcher.register(command.build().createBuilder());
this.setDescription(command.getDescription());
this.setAliases(command.getAliases());
}
@Override
public boolean execute(@NotNull CommandSender commandSender, @NotNull String alias, @NotNull String[] args) {
try {
final String string = getInput(alias, args);
System.out.println("Usage: \"" + Arrays.toString(dispatcher.getAllUsage(commandNode, commandSender, false)) + "\"");
return dispatcher.execute(string, commandSender) == COMMAND_SUCCESS;
} catch (CommandSyntaxException e) {
getAudience(commandSender).sendMessage(Component
.translatable("command.context.parse_error", NamedTextColor.RED)
.arguments(
Component.text(e.getRawMessage().getString()),
Component.text(e.getCursor()),
Component.text(e.getContext())
));
return false;
} catch (CommandException e) {
getAudience(commandSender).sendMessage(Component.text(e.getMessage(), NamedTextColor.RED));
return true;
}
}
@NotNull
@Override
public List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args)
throws IllegalArgumentException {
final String passed = getInput(alias, args);
return dispatcher.getCompletionSuggestions(
dispatcher.parse(passed, sender),
passed.length() // Spigot API limitation - we can only TAB complete the full text length :(
)
.thenApply(suggestions -> suggestions.getList().stream().map(Suggestion::getText).toList())
.join();
}
@NotNull
private Audience getAudience(@NotNull CommandSender sender) {
if (audiences == null) {
audiences = BukkitAudiences.create(plugin);
}
return audiences.sender(sender);
}
@NotNull
private String getInput(@NotNull String alias, @NotNull String[] args) {
return args.length == 0 ? alias : "%s %s".formatted(alias, String.join(" ", args));
}
}
@Override
@NotNull
protected CommandUser getUser(@NotNull Object user) {
if (audiences == null) {
audiences = BukkitAudiences.create(plugin);
}
return new BukkitCommandUser((CommandSender) user, audiences);
}
@Override
public void addSubCommand(@NotNull Command command) {
addSubCommand(new BukkitCommand(command, plugin));
}
}

@ -19,33 +19,35 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.william278.uniform; package net.william278.uniform.bukkit;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.william278.uniform.CommandUser;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ExampleCrossPlatCommand implements Command { import java.util.UUID;
public record BukkitCommandUser(@NotNull CommandSender sender, @NotNull BukkitAudiences adv) implements CommandUser {
@Override @Override
@NotNull @NotNull
public String getName() { public Audience getAudience() {
return "example-crossplat"; return adv.sender(sender);
} }
@Override @Override
@NotNull public String getName() {
public String getDescription() { return sender.getName();
return "An example cross-platform command";
} }
@Override @Override
public <S> void provide(@NotNull BaseCommand<S> command) { @Nullable
command.setCondition(source -> true); public UUID getUuid() {
command.setDefaultExecutor((ctx) -> { return sender instanceof Player player ? player.getUniqueId() : null;
final Audience user = command.getUser(ctx.getSource()).getAudience();
user.sendMessage(Component.text("Hello, world!"));
});
} }
} }

@ -0,0 +1,110 @@
/*
* This file is part of Uniform, licensed under the GNU General Public License v3.0.
*
* Copyright (c) Tofaa2
* Copyright (c) William278 <will27528@gmail.com>
* Copyright (c) contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.william278.uniform.bukkit;/*
* This file is part of Uniform, licensed under the GNU General Public License v3.0.
*
* Copyright (c) Tofaa2
* Copyright (c) William278 <will27528@gmail.com>
* Copyright (c) contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import net.william278.uniform.Command;
import net.william278.uniform.Uniform;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import space.arim.morepaperlib.MorePaperLib;
import space.arim.morepaperlib.commands.CommandRegistration;
import java.util.Arrays;
import java.util.Locale;
/**
* A class for registering commands with the Bukkit server's CommandMap
*
* @since 1.0
*/
public final class BukkitUniform implements Uniform<CommandSender, BukkitCommand> {
private static BukkitUniform INSTANCE;
private final JavaPlugin plugin;
private final CommandRegistration registrar;
private BukkitUniform(@NotNull JavaPlugin plugin) {
this.plugin = plugin;
this.registrar = new MorePaperLib(plugin).commandRegistration();
}
/**
* Get the BukkitUniform instance for registering commands
*
* @param plugin The plugin instance
* @return BukkitUniform instance
* @since 1.0
*/
@NotNull
public static BukkitUniform getInstance(@NotNull JavaPlugin plugin) {
return INSTANCE != null ? INSTANCE : (INSTANCE = new BukkitUniform(plugin));
}
/**
* Register a command to be added to the server's command map
*
* @param commands The commands to register
* @since 1.0
*/
@Override
public void register(@NotNull BukkitCommand... commands) {
registrar.getServerCommandMap().registerAll(
plugin.getName().toLowerCase(Locale.ENGLISH),
Arrays.stream(commands).map(c -> (org.bukkit.command.Command) c.getImpl()).toList()
);
}
/**
* Register command(s) to be added to the server's command map
*
* @param commands The commands to register
* @since 1.0
*/
@Override
public void register(@NotNull Command... commands) {
register(Arrays.stream(commands)
.map(command -> new BukkitCommand(command, plugin))
.toArray(BukkitCommand[]::new));
}
}

@ -75,91 +75,112 @@ public abstract class BaseCommand<S> {
private final List<BaseCommand<S>> subCommands = new ArrayList<>(); private final List<BaseCommand<S>> subCommands = new ArrayList<>();
@NotNull @NotNull
protected abstract CommandUser getUser(@NotNull S user); protected abstract CommandUser getUser(@NotNull Object user);
protected final void setCondition(@NotNull Predicate<S> condition) { public final void setCondition(@NotNull Predicate<S> condition) {
this.condition = condition; this.condition = condition;
} }
protected final void setDefaultExecutor(@NotNull CommandExecutor<S> executor) { public final void setDefaultExecutor(@NotNull CommandExecutor<S> executor) {
this.defaultExecutor = executor; this.defaultExecutor = executor;
} }
@SafeVarargs @SafeVarargs
protected final void addConditionalSyntax(@Nullable Predicate<S> condition, @NotNull CommandExecutor<S> executor, public final void addConditionalSyntax(@Nullable Predicate<S> condition, @NotNull CommandExecutor<S> executor,
@NotNull CommandElement<S>... elements) { @NotNull CommandElement<S>... elements) {
var syntax = new CommandSyntax<>(condition, executor, List.of(elements)); var syntax = new CommandSyntax<>(condition, executor, List.of(elements));
this.syntaxes.add(syntax); this.syntaxes.add(syntax);
} }
@SafeVarargs @SafeVarargs
protected final void addSyntax(@NotNull CommandExecutor<S> executor, @NotNull CommandElement<S>... elements) { public final void addSyntax(@NotNull CommandExecutor<S> executor, @NotNull CommandElement<S>... elements) {
this.addConditionalSyntax(null, executor, elements); this.addConditionalSyntax(null, executor, elements);
} }
protected final void addSubCommand(@NotNull BaseCommand<S> command) { public final void addSubCommand(@NotNull BaseCommand<S> command) {
this.subCommands.add(command); this.subCommands.add(command);
} }
public final void addSubCommand(@NotNull String name, @NotNull CommandProvider provider) {
this.addSubCommand(new Command.SubCommand(name, provider).command());
}
public final void addSubCommand(@NotNull String name, @NotNull List<String> aliases,
@NotNull CommandProvider provider) {
this.addSubCommand(new Command.SubCommand(name, provider, aliases).command());
}
public abstract void addSubCommand(@NotNull Command command);
@NotNull @NotNull
public final LiteralCommandNode<S> build() { public final LiteralCommandNode<S> build() {
return Graph.create(this).build(); return Graph.create(this).build();
} }
@NotNull @NotNull
protected static <S> LiteralElement<S> literalArg(@NotNull String name) { public static <S> LiteralElement<S> literal(@NotNull String name) {
return new LiteralElement<>(name); return new LiteralElement<>(name);
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, String> stringArg(@NotNull String name) { public static <S> ArgumentElement<S, String> greedyString(@NotNull String name) {
return argument(name, StringArgumentType.string()); return arg(name, StringArgumentType.greedyString());
}
@NotNull
public static <S> ArgumentElement<S, String> string(@NotNull String name) {
return arg(name, StringArgumentType.string());
}
@NotNull
public static <S> ArgumentElement<S, String> word(@NotNull String name) {
return arg(name, StringArgumentType.word());
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Integer> integerArg(@NotNull String name) { public static <S> ArgumentElement<S, Integer> intNum(@NotNull String name) {
return argument(name, IntegerArgumentType.integer()); return arg(name, IntegerArgumentType.integer());
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Integer> integerArg(@NotNull String name, int min) { public static <S> ArgumentElement<S, Integer> intNum(@NotNull String name, int min) {
return argument(name, IntegerArgumentType.integer(min)); return arg(name, IntegerArgumentType.integer(min));
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Integer> integerArg(@NotNull String name, int min, int max) { public static <S> ArgumentElement<S, Integer> intNum(@NotNull String name, int min, int max) {
return argument(name, IntegerArgumentType.integer(min, max)); return arg(name, IntegerArgumentType.integer(min, max));
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Float> floatArg(@NotNull String name) { public static <S> ArgumentElement<S, Float> floatNum(@NotNull String name) {
return argument(name, FloatArgumentType.floatArg()); return arg(name, FloatArgumentType.floatArg());
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Float> floatArg(@NotNull String name, float min) { public static <S> ArgumentElement<S, Float> floatNum(@NotNull String name, float min) {
return argument(name, FloatArgumentType.floatArg(min)); return arg(name, FloatArgumentType.floatArg(min));
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Float> floatArg(@NotNull String name, float min, float max) { public static <S> ArgumentElement<S, Float> floatNum(@NotNull String name, float min, float max) {
return argument(name, FloatArgumentType.floatArg(min, max)); return arg(name, FloatArgumentType.floatArg(min, max));
} }
@NotNull @NotNull
protected static <S> ArgumentElement<S, Boolean> booleanArg(@NotNull String name) { public static <S> ArgumentElement<S, Boolean> bool(@NotNull String name) {
return argument(name, BoolArgumentType.bool()); return arg(name, BoolArgumentType.bool());
} }
@NotNull @NotNull
protected static <S, T> ArgumentElement<S, T> argument(@NotNull String name, @NotNull ArgumentType<T> type, public static <S, T> ArgumentElement<S, T> arg(@NotNull String name, @NotNull ArgumentType<T> type,
@Nullable SuggestionProvider<S> suggestionProvider) { @Nullable SuggestionProvider<S> suggestionProvider) {
return new ArgumentElement<>(name, type, suggestionProvider); return new ArgumentElement<>(name, type, suggestionProvider);
} }
@NotNull @NotNull
protected static <S, T> ArgumentElement<S, T> argument(@NotNull String name, @NotNull ArgumentType<T> type) { public static <S, T> ArgumentElement<S, T> arg(@NotNull String name, @NotNull ArgumentType<T> type) {
return argument(name, type, null); return arg(name, type, null);
} }
} }

@ -21,25 +21,38 @@
package net.william278.uniform; package net.william278.uniform;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public interface Command { @Getter
@Setter
@NotNull @RequiredArgsConstructor
String getName(); @AllArgsConstructor
public abstract class Command implements CommandProvider {
@NotNull
default String getDescription() { private final String name;
return ""; private String description = "";
private List<String> aliases = List.of();
record SubCommand(@NotNull String name, @NotNull CommandProvider provider, @NotNull List<String> aliases) {
SubCommand(@NotNull String name, @NotNull CommandProvider provider) {
this(name, provider, List.of());
}
@NotNull
Command command() {
return new Command(name, "", aliases) {
@Override
public void provide(@NotNull BaseCommand<?> command) {
provider.provide(command);
}
};
}
} }
@NotNull
default List<String> getAliases() {
return List.of();
}
<S> void provide(@NotNull BaseCommand<S> command);
} }

@ -0,0 +1,10 @@
package net.william278.uniform;
import org.jetbrains.annotations.NotNull;
@FunctionalInterface
public interface CommandProvider {
void provide(@NotNull BaseCommand<?> command);
}

@ -0,0 +1,31 @@
/*
* This file is part of Uniform, licensed under the GNU General Public License v3.0.
*
* Copyright (c) Tofaa2
* Copyright (c) William278 <will27528@gmail.com>
* Copyright (c) contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.william278.uniform;
public interface Uniform<S, T extends BaseCommand<S>> {
void register(Command... commands);
@SuppressWarnings("unchecked")
void register(T... commands);
}

@ -4,7 +4,8 @@ plugins {
} }
dependencies { dependencies {
implementation(project(":paper")) implementation(project(":paper"))
// implementation(project(":bukkit"))
compileOnly 'io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT' compileOnly 'io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT'
} }

@ -21,21 +21,28 @@
package net.william278.uniform; package net.william278.uniform;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.Component;
import net.william278.uniform.paper.PaperCommand; import org.jetbrains.annotations.NotNull;
import java.util.List; import static net.william278.uniform.BaseCommand.greedyString;
@SuppressWarnings("UnstableApiUsage") public class ExampleCommand extends Command {
public class ExampleCommand extends PaperCommand {
public ExampleCommand() { public ExampleCommand() {
super("example", "An example command", List.of("silly-command")); super("example");
addSyntax((context) -> { setDescription("An example command for Uniform");
context.getSource().getSender().sendMessage("Woah!!!!"); }
String arg = context.getArgument("message", String.class);
context.getSource().getSender().sendMessage(MiniMessage.miniMessage().deserialize(arg)); @Override
}, stringArg("message")); public void provide(@NotNull BaseCommand<?> command) {
command.setDefaultExecutor((ctx) -> {
final CommandUser user = command.getUser(ctx.getSource());
user.getAudience().sendMessage(Component.text("Hello, World!"));
});
command.addSubCommand("message", (sub) -> sub.addSyntax((ctx) -> {
final CommandUser user = sub.getUser(ctx.getSource());
user.getAudience().sendMessage(Component.text(ctx.getArgument("message", String.class)));
}, greedyString("message")));
} }
} }

@ -31,7 +31,6 @@ public class UniformExample extends JavaPlugin {
public void onLoad() { public void onLoad() {
PaperUniform uniform = PaperUniform.getInstance(this); PaperUniform uniform = PaperUniform.getInstance(this);
uniform.register(new ExampleCommand()); uniform.register(new ExampleCommand());
uniform.register(new ExampleCrossPlatCommand());
} }
} }

@ -81,7 +81,13 @@ public class FabricCommand extends BaseCommand<ServerCommandSource> {
@Override @Override
@NotNull @NotNull
protected CommandUser getUser(@NotNull ServerCommandSource user) { protected CommandUser getUser(@NotNull Object user) {
return new FabricCommandUser(user); return new FabricCommandUser((ServerCommandSource) user);
} }
@Override
public void addSubCommand(@NotNull Command command) {
addSubCommand(new FabricCommand(command));
}
} }

@ -24,7 +24,9 @@ package net.william278.uniform.fabric;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.server.command.ServerCommandSource;
import net.william278.uniform.Command; import net.william278.uniform.Command;
import net.william278.uniform.Uniform;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
@ -36,7 +38,7 @@ import java.util.Set;
* *
* @since 1.0 * @since 1.0
*/ */
public final class FabricUniform { public final class FabricUniform implements Uniform<ServerCommandSource, FabricCommand> {
private static FabricUniform INSTANCE; private static FabricUniform INSTANCE;
@ -65,6 +67,7 @@ public final class FabricUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull FabricCommand... commands) { public void register(@NotNull FabricCommand... commands) {
Collections.addAll(this.commands, commands); Collections.addAll(this.commands, commands);
} }
@ -75,6 +78,7 @@ public final class FabricUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull Command... commands) { public void register(@NotNull Command... commands) {
register(Arrays.stream(commands).map(FabricCommand::new).toArray(FabricCommand[]::new)); register(Arrays.stream(commands).map(FabricCommand::new).toArray(FabricCommand[]::new));
} }

@ -81,8 +81,12 @@ public class FabricCommand extends BaseCommand<ServerCommandSource> {
@Override @Override
@NotNull @NotNull
protected CommandUser getUser(@NotNull ServerCommandSource user) { protected CommandUser getUser(@NotNull Object user) {
return new FabricCommandUser(user); return new FabricCommandUser((ServerCommandSource) user);
} }
@Override
public void addSubCommand(@NotNull Command command) {
addSubCommand(new FabricCommand(command));
}
} }

@ -24,7 +24,9 @@ package net.william278.uniform.fabric;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.server.command.ServerCommandSource;
import net.william278.uniform.Command; import net.william278.uniform.Command;
import net.william278.uniform.Uniform;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
@ -36,7 +38,7 @@ import java.util.Set;
* *
* @since 1.0 * @since 1.0
*/ */
public final class FabricUniform { public final class FabricUniform implements Uniform<ServerCommandSource, FabricCommand> {
private static FabricUniform INSTANCE; private static FabricUniform INSTANCE;
@ -65,6 +67,7 @@ public final class FabricUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull FabricCommand... commands) { public void register(@NotNull FabricCommand... commands) {
Collections.addAll(this.commands, commands); Collections.addAll(this.commands, commands);
} }
@ -75,6 +78,7 @@ public final class FabricUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull Command... commands) { public void register(@NotNull Command... commands) {
register(Arrays.stream(commands).map(FabricCommand::new).toArray(FabricCommand[]::new)); register(Arrays.stream(commands).map(FabricCommand::new).toArray(FabricCommand[]::new));
} }

@ -88,8 +88,13 @@ public class PaperCommand extends BaseCommand<CommandSourceStack> {
@Override @Override
@NotNull @NotNull
protected CommandUser getUser(@NotNull CommandSourceStack user) { protected CommandUser getUser(@NotNull Object user) {
return new PaperCommandUser(user); return new PaperCommandUser((CommandSourceStack) user);
}
@Override
public void addSubCommand(@NotNull Command command) {
addSubCommand(new PaperCommand(command));
} }
} }

@ -22,14 +22,15 @@
package net.william278.uniform.paper; package net.william278.uniform.paper;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
import net.william278.uniform.Command; import net.william278.uniform.Command;
import net.william278.uniform.Uniform;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@ -38,7 +39,7 @@ import java.util.Set;
* @since 1.0 * @since 1.0
*/ */
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
public final class PaperUniform { public final class PaperUniform implements Uniform<CommandSourceStack, PaperCommand> {
private static PaperUniform INSTANCE; private static PaperUniform INSTANCE;
@ -74,6 +75,7 @@ public final class PaperUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull PaperCommand... commands) { public void register(@NotNull PaperCommand... commands) {
Collections.addAll(this.commands, commands); Collections.addAll(this.commands, commands);
} }
@ -84,6 +86,7 @@ public final class PaperUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull Command... commands) { public void register(@NotNull Command... commands) {
register(Arrays.stream(commands).map(PaperCommand::new).toArray(PaperCommand[]::new)); register(Arrays.stream(commands).map(PaperCommand::new).toArray(PaperCommand[]::new));
} }

@ -11,6 +11,7 @@ include(
// Server Plugins // Server Plugins
'paper', 'paper',
'bukkit',
// Proxy Plugins // Proxy Plugins
'velocity', 'velocity',

@ -97,7 +97,13 @@ public class VelocityCommand extends BaseCommand<CommandSource> {
@Override @Override
@NotNull @NotNull
protected CommandUser getUser(@NotNull CommandSource user) { protected CommandUser getUser(@NotNull Object user) {
return new VelocityCommandUser(user); return new VelocityCommandUser((CommandSource) user);
} }
@Override
public void addSubCommand(@NotNull Command command) {
addSubCommand(new VelocityCommand(command));
}
} }

@ -22,8 +22,10 @@
package net.william278.uniform.velocity; package net.william278.uniform.velocity;
import com.velocitypowered.api.command.BrigadierCommand; import com.velocitypowered.api.command.BrigadierCommand;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import net.william278.uniform.Command; import net.william278.uniform.Command;
import net.william278.uniform.Uniform;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
@ -34,7 +36,7 @@ import java.util.Arrays;
* @since 1.0 * @since 1.0
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class VelocityUniform { public final class VelocityUniform implements Uniform<CommandSource, VelocityCommand> {
private static VelocityUniform INSTANCE; private static VelocityUniform INSTANCE;
@ -62,6 +64,7 @@ public final class VelocityUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull VelocityCommand... commands) { public void register(@NotNull VelocityCommand... commands) {
Arrays.stream(commands).forEach(cmd -> server.getCommandManager().register(new BrigadierCommand(cmd.build()))); Arrays.stream(commands).forEach(cmd -> server.getCommandManager().register(new BrigadierCommand(cmd.build())));
} }
@ -72,6 +75,7 @@ public final class VelocityUniform {
* @param commands The commands to register * @param commands The commands to register
* @since 1.0 * @since 1.0
*/ */
@Override
public void register(@NotNull Command... commands) { public void register(@NotNull Command... commands) {
register(Arrays.stream(commands).map(VelocityCommand::new).toArray(VelocityCommand[]::new)); register(Arrays.stream(commands).map(VelocityCommand::new).toArray(VelocityCommand[]::new));
} }

Loading…
Cancel
Save