From e8474fc41a709ac769f9b9aeb14b27f25f38e8a0 Mon Sep 17 00:00:00 2001 From: Josh Taylor Date: Wed, 18 Oct 2023 03:39:37 +0100 Subject: [PATCH] feature: intial work on gui --- buildSrc/src/main/kotlin/Configurations.kt | 1 - bukkit/build.gradle.kts | 5 +- .../tags/bukkit/BukkitTagsPlatform.java | 11 ++- .../bukkit/commands/BukkitTagsCommand.java | 80 +++++++++++++++++++ .../context/BukkitPlayerCommandUser.java | 4 + .../tags/bukkit/menu/TagsMenuFactory.java | 59 ++++++++++++++ .../java/broccolai/tags/core/TagsPlugin.java | 4 +- .../tags/core/config/MainConfiguration.java | 15 +++- .../tags/core/config/TagConfiguration.java | 10 ++- .../tags/core/util/ArrayUtilities.java | 8 +- gradle/libs.versions.conf | 3 + 11 files changed, 189 insertions(+), 11 deletions(-) create mode 100644 bukkit/src/main/java/broccolai/tags/bukkit/commands/BukkitTagsCommand.java create mode 100644 bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java diff --git a/buildSrc/src/main/kotlin/Configurations.kt b/buildSrc/src/main/kotlin/Configurations.kt index 7811ce7..7721889 100644 --- a/buildSrc/src/main/kotlin/Configurations.kt +++ b/buildSrc/src/main/kotlin/Configurations.kt @@ -34,7 +34,6 @@ fun Project.setupShadowJar() { "net.kyori.event", "net.kyori.coffee", "org.objectweb.asm", - "org.flyway", "broccolai.corn" ) diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 51ec82b..8c28b62 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -13,12 +13,15 @@ dependencies { api(libs.cloud.paper) api(libs.cloud.extras) + api(libs.corn.minecraft.paper) + + api(libs.interfaces.paper) implementation(libs.h2) } tasks { runServer { - minecraftVersion("1.20") + minecraftVersion("1.20.2") } } diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java b/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java index e2f104d..903e27a 100644 --- a/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java +++ b/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java @@ -1,6 +1,7 @@ package broccolai.tags.bukkit; import broccolai.tags.api.service.MessageService; +import broccolai.tags.bukkit.commands.BukkitTagsCommand; import broccolai.tags.bukkit.commands.context.BukkitCommandUser; import broccolai.tags.bukkit.commands.context.BukkitConsoleCommandUser; import broccolai.tags.bukkit.commands.context.BukkitPlayerCommandUser; @@ -10,6 +11,7 @@ import broccolai.tags.bukkit.integrations.PapiIntegration; import broccolai.tags.bukkit.listeners.PlayerListener; import broccolai.tags.core.TagsPlugin; +import broccolai.tags.core.commands.PluginCommand; import broccolai.tags.core.commands.arguments.TagArgument; import broccolai.tags.core.commands.arguments.UserArgument; import broccolai.tags.core.commands.context.CommandUser; @@ -31,6 +33,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.NonNull; +import java.util.Collection; + public final class BukkitTagsPlatform extends JavaPlugin implements TagsPlatform { private static final @NonNull Class[] BUKKIT_LISTENERS = ArrayUtilities.create( @@ -38,6 +42,11 @@ public final class BukkitTagsPlatform extends JavaPlugin implements TagsPlatform BasicIntegration.class ); + private static final @NonNull Collection> BUKKIT_COMMANDS = ArrayUtilities.merge( + COMMANDS, + BukkitTagsCommand.class + ); + private @MonotonicNonNull TagsPlugin plugin; @Override @@ -69,7 +78,7 @@ public void onEnable() { } - this.plugin.commands(commandManager, COMMANDS); + this.plugin.commands(commandManager, BUKKIT_COMMANDS); } @Override diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/commands/BukkitTagsCommand.java b/bukkit/src/main/java/broccolai/tags/bukkit/commands/BukkitTagsCommand.java new file mode 100644 index 0000000..3b96df6 --- /dev/null +++ b/bukkit/src/main/java/broccolai/tags/bukkit/commands/BukkitTagsCommand.java @@ -0,0 +1,80 @@ +package broccolai.tags.bukkit.commands; + +import broccolai.corn.paper.item.PaperItemBuilder; +import broccolai.tags.api.model.tag.ConstructedTag; +import broccolai.tags.api.model.tag.TagDisplayInformation; +import broccolai.tags.api.model.user.TagsUser; +import broccolai.tags.api.service.UserService; +import broccolai.tags.bukkit.commands.context.BukkitPlayerCommandUser; +import broccolai.tags.bukkit.menu.TagsMenuFactory; +import broccolai.tags.core.commands.PluginCommand; +import broccolai.tags.core.commands.arguments.modes.TagParserMode; +import broccolai.tags.core.commands.context.CommandUser; +import broccolai.tags.core.factory.CloudArgumentFactory; +import cloud.commandframework.Command; +import cloud.commandframework.CommandManager; +import cloud.commandframework.context.CommandContext; +import com.google.inject.Inject; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.interfaces.paper.PlayerViewer; + +public final class BukkitTagsCommand implements PluginCommand { + + private final UserService userService; + private final CloudArgumentFactory argumentFactory; + private final TagsMenuFactory tagsMenuFactory; + + @Inject + public BukkitTagsCommand( + final @NonNull UserService userService, + final @NonNull CloudArgumentFactory argumentFactory, + final @NonNull TagsMenuFactory tagsMenuFactory + ) { + this.userService = userService; + this.argumentFactory = argumentFactory; + this.tagsMenuFactory = tagsMenuFactory; + } + + @Override + public void register(@NonNull final CommandManager<@NonNull CommandUser> commandManager) { + Command.Builder tagsCommand = commandManager.commandBuilder("tags"); + + commandManager.command(tagsCommand + .literal("test-item") + .permission("tags.command.admin.test-item") + .argument(this.argumentFactory.tag("tag", TagParserMode.SELF)) + .handler(this::handleTestItem) + ); + + commandManager.command(tagsCommand + .literal("menu") + .permission("tags.command.user.menu") + .handler(this::handleMenu) + ); + } + + private void handleTestItem(final @NonNull CommandContext context) { + ConstructedTag tag = context.get("tag"); + TagDisplayInformation displayInformation = tag.displayInformation(); + + Material material = Material.matchMaterial(displayInformation.material()); + + ItemStack item = PaperItemBuilder + .ofType(material) + .customModelData(displayInformation.customModelData()) + .build(); + + BukkitPlayerCommandUser user = context.getSender().cast(); + user.player().getInventory().addItem(item); + } + + private void handleMenu(final @NonNull CommandContext context) { + BukkitPlayerCommandUser sender = context.getSender().cast(); + TagsUser user = this.userService.get(sender.uuid()); + + this.tagsMenuFactory.create(user).open(PlayerViewer.of(sender.player())); + } + +} diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/commands/context/BukkitPlayerCommandUser.java b/bukkit/src/main/java/broccolai/tags/bukkit/commands/context/BukkitPlayerCommandUser.java index cd535ce..2367493 100644 --- a/bukkit/src/main/java/broccolai/tags/bukkit/commands/context/BukkitPlayerCommandUser.java +++ b/bukkit/src/main/java/broccolai/tags/bukkit/commands/context/BukkitPlayerCommandUser.java @@ -21,4 +21,8 @@ public UUID uuid() { return this.player.getUniqueId(); } + public @NonNull Player player() { + return this.player; + } + } diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java b/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java new file mode 100644 index 0000000..cf2eb74 --- /dev/null +++ b/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java @@ -0,0 +1,59 @@ +package broccolai.tags.bukkit.menu; + +import broccolai.corn.paper.item.PaperItemBuilder; +import broccolai.tags.api.model.tag.ConstructedTag; +import broccolai.tags.api.model.user.TagsUser; +import broccolai.tags.api.service.TagsService; +import com.google.inject.Inject; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.interfaces.core.transform.types.PaginatedTransform; +import org.incendo.interfaces.core.util.Vector2; +import org.incendo.interfaces.paper.PlayerViewer; +import org.incendo.interfaces.paper.element.ItemStackElement; +import org.incendo.interfaces.paper.pane.ChestPane; +import org.incendo.interfaces.paper.type.ChestInterface; + +import java.util.List; + +public final class TagsMenuFactory { + + private final TagsService tagsService; + + @Inject + public TagsMenuFactory(final @NonNull TagsService tagsService) { + this.tagsService = tagsService; + } + + public ChestInterface create(final @NonNull TagsUser user) { + return ChestInterface.builder() + .addReactiveTransform(this.createTagTransform(user)) + .build(); + } + + private PaginatedTransform, ChestPane, PlayerViewer> createTagTransform(final @NonNull TagsUser user) { + return new PaginatedTransform<>( + Vector2.at(0, 0), + Vector2.at(3, 8), + () -> this.createTagElements(user) + ); + } + + private List> createTagElements(final @NonNull TagsUser user) { + return this.tagsService.allTags(user) + .stream() + .map(this::createTagElement) + .toList(); + } + + private ItemStackElement createTagElement(final @NonNull ConstructedTag tag) { + Material material = Material.matchMaterial(tag.displayInformation().material()); + ItemStack item = PaperItemBuilder.ofType(material) + .name(tag.component()) + .build(); + + return ItemStackElement.of(item); + } + +} diff --git a/core/src/main/java/broccolai/tags/core/TagsPlugin.java b/core/src/main/java/broccolai/tags/core/TagsPlugin.java index a03a554..54180e6 100644 --- a/core/src/main/java/broccolai/tags/core/TagsPlugin.java +++ b/core/src/main/java/broccolai/tags/core/TagsPlugin.java @@ -17,6 +17,8 @@ import com.zaxxer.hikari.HikariDataSource; import org.checkerframework.checker.nullness.qual.NonNull; +import java.util.Collection; + @Singleton public final class TagsPlugin { @@ -43,7 +45,7 @@ public void start() { public void commands( final @NonNull CommandManager<@NonNull CommandUser> commandManager, - final @NonNull Class[] commands + final @NonNull Collection> commands ) { for (final @NonNull Class commandClass : commands) { this.injector.getInstance(commandClass).register(commandManager); diff --git a/core/src/main/java/broccolai/tags/core/config/MainConfiguration.java b/core/src/main/java/broccolai/tags/core/config/MainConfiguration.java index 8ff3a88..6c60992 100644 --- a/core/src/main/java/broccolai/tags/core/config/MainConfiguration.java +++ b/core/src/main/java/broccolai/tags/core/config/MainConfiguration.java @@ -1,5 +1,6 @@ package broccolai.tags.core.config; +import broccolai.tags.api.model.tag.TagDisplayInformation; import com.google.inject.Singleton; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.configurate.ConfigurationNode; @@ -32,8 +33,18 @@ public final class MainConfiguration implements Configuration { + "Permissions will use this id as it's reference. \n" + "The name attribute should be a simple one word phrase for selecting tags through commands." ) - public List tags = new ArrayList() {{ - this.add(new TagConfiguration(1, "example", false, "example", "Acquired by playing for an hour")); + public List tags = new ArrayList<>() {{ + this.add(new TagConfiguration( + 1, + "example", + false, + "example", + "Acquired by playing for an hour", + new TagDisplayInformation( + "stick", + 5 + ) + )); }}; //region Configurate diff --git a/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java b/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java index cd6a076..e1929b5 100644 --- a/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java +++ b/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java @@ -36,12 +36,20 @@ public final class TagConfiguration { public TagConfiguration() { } - public TagConfiguration(final int id, final String name, final boolean secret, final String component, final String reason) { + public TagConfiguration( + final int id, + final String name, + final boolean secret, + final String component, + final String reason, + final TagDisplayInformation displayInformation + ) { this.id = id; this.name = name; this.secret = secret; this.component = component; this.reason = reason; + this.displayInformation = displayInformation; } } diff --git a/core/src/main/java/broccolai/tags/core/util/ArrayUtilities.java b/core/src/main/java/broccolai/tags/core/util/ArrayUtilities.java index 214aeb7..d942f10 100644 --- a/core/src/main/java/broccolai/tags/core/util/ArrayUtilities.java +++ b/core/src/main/java/broccolai/tags/core/util/ArrayUtilities.java @@ -1,6 +1,5 @@ package broccolai.tags.core.util; -import com.google.inject.Module; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayDeque; @@ -19,10 +18,11 @@ private ArrayUtilities() { return entries; } - public static Collection merge(final @NonNull Module[] initial, final @NonNull Module... extra) { - Deque modules = new ArrayDeque<>(Arrays.asList(initial)); + @SafeVarargs + public static Collection merge(final @NonNull T[] initial, final @NonNull T... extra) { + Deque modules = new ArrayDeque<>(Arrays.asList(initial)); - for (final Module module : extra) { + for (final T module : extra) { modules.addFirst(module); } diff --git a/gradle/libs.versions.conf b/gradle/libs.versions.conf index b40f664..391fcd0 100644 --- a/gradle/libs.versions.conf +++ b/gradle/libs.versions.conf @@ -33,6 +33,7 @@ versions = { # Incendo http4j = "1.3" cloud = "1.8.4" + interfaces = "1.0.0-SNAPSHOT" # Kyori adventure = "4.14.0" @@ -82,6 +83,7 @@ dependencies = { cloud-paper = {group = "cloud.commandframework", name = "cloud-paper", version.ref = "cloud"} cloud-velocity = {group = "cloud.commandframework", name = "cloud-velocity", version.ref = "cloud"} cloud-extras = {group = "cloud.commandframework", name = "cloud-minecraft-extras", version.ref = "cloud"} + interfaces-paper = {group = "org.incendo.interfaces", name = "interfaces-paper", version.ref = "interfaces"} # Kyori adventure-api = {group = "net.kyori", name = "adventure-api", version.ref = "adventure"} @@ -104,6 +106,7 @@ dependencies = { # Misc corn-misc = {group = "broccolai.corn", name = "corn-misc", version.ref = "corn"} corn-context = {group = "broccolai.corn", name = "corn-context", version.ref = "corn"} + corn-minecraft-paper = {group = "broccolai.corn", name = "corn-minecraft-paper", version.ref = "corn"} slf4j = {group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j"} caffeine = {group = "com.github.ben-manes.caffeine", name = "caffeine", version.ref = "caffeine"}