From 0d7537becf75e4335db464516b09a103b53981df Mon Sep 17 00:00:00 2001 From: YuKun Liu Date: Wed, 28 Jan 2026 18:14:15 -0800 Subject: [PATCH] feat: code --- .../common/request/CurrencyRequest.java | 3 + .../common/request/ManagementRequest.java | 179 ++++++++++++++++++ .../mineroo/common/request/RequestClient.java | 22 +++ .../mineroo/common/request/Serializable.java | 0 .../UserRequest.java} | 174 +---------------- paper/build.gradle.kts | 2 + .../online/mineroo/paper/MinerooCore.java | 15 +- .../mineroo/paper/commands/BindCommand.java | 51 ++--- .../paper/commands/PlayerBindStatusEnum.java | 0 .../expansions/MinerooUserExpansion.java | 51 +++++ .../paper/listeners/PlayerBindListener.java | 18 +- .../mineroo/paper/structure/PlayerInfo.java | 13 ++ paper/src/main/resources/plugin.yml | 1 + velocity/.factorypath | 22 +-- 14 files changed, 336 insertions(+), 215 deletions(-) create mode 100644 common/src/main/java/online/mineroo/common/request/CurrencyRequest.java create mode 100644 common/src/main/java/online/mineroo/common/request/ManagementRequest.java create mode 100644 common/src/main/java/online/mineroo/common/request/RequestClient.java create mode 100644 common/src/main/java/online/mineroo/common/request/Serializable.java rename common/src/main/java/online/mineroo/common/{BindRequest.java => request/UserRequest.java} (55%) create mode 100644 paper/src/main/java/online/mineroo/paper/commands/PlayerBindStatusEnum.java create mode 100644 paper/src/main/java/online/mineroo/paper/expansions/MinerooUserExpansion.java create mode 100644 paper/src/main/java/online/mineroo/paper/structure/PlayerInfo.java diff --git a/common/src/main/java/online/mineroo/common/request/CurrencyRequest.java b/common/src/main/java/online/mineroo/common/request/CurrencyRequest.java new file mode 100644 index 0000000..bb65db2 --- /dev/null +++ b/common/src/main/java/online/mineroo/common/request/CurrencyRequest.java @@ -0,0 +1,3 @@ +package online.mineroo.common.request; + +public class CurrencyRequest {} diff --git a/common/src/main/java/online/mineroo/common/request/ManagementRequest.java b/common/src/main/java/online/mineroo/common/request/ManagementRequest.java new file mode 100644 index 0000000..9db59ff --- /dev/null +++ b/common/src/main/java/online/mineroo/common/request/ManagementRequest.java @@ -0,0 +1,179 @@ +package online.mineroo.common.request; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import online.mineroo.common.NetworkServiceInterface; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; + +public class ManagementRequest { + private final Logger logger; + private final NetworkServiceInterface networkService; + + // State cache + private String motdToken = ""; + private String sessionToken = ""; + + /** + * Constructs a ManagementRequest instance. + * + * @param logger Logger for logging errors and information + * @param networkService The network service instance (Local or Proxy) that + * handles transport and auth + */ + public ManagementRequest(Logger logger, NetworkServiceInterface networkService) { + this.logger = logger; + this.networkService = networkService; + } + + /** + * Checks the bind status asynchronously. + * + * @return A future that completes with true if status is 'bound', false + * otherwise + */ + public CompletableFuture checkBindStatus(String hostname, String port) { + // NetworkService is already configured with BaseURL, only need the path here + String path = "/server/management/status"; + + Map params = new HashMap<>(); + + params.put("address", hostname); + params.put("port", port); + + return networkService.getData(path, params) + .thenApply(response -> { + if (response.getStatusCode() != 200) { + return false; + } + + String responseBody = response.getBody(); + try { + JsonObject responseData = JsonParser.parseString(responseBody).getAsJsonObject(); + boolean bound = responseData.has("bound") && responseData.get("bound").getAsBoolean(); + + if (bound) { + logger.warn("Mineroo Bind: Server already bound."); + } + return bound; + } catch (Exception e) { + logger.error("Mineroo Bind: Failed to parse bind status response", e); + return false; + } + }) + .exceptionally(e -> { + logger.error("Mineroo Bind: Network error while checking status", e); + return false; + }); + } + + /** + * Initiates a MOTD verification request asynchronously. + * + * @param hostname The server hostname + * @param port The server port + * @return A future that completes with true if tokens are received + */ + public CompletableFuture initialMotdVerifyRequest(String hostname, String port) { + String path = "/server/management/motd-verify"; + + Integer num_port = -1; + if (!"$port".equals(port)) { + try { + num_port = Integer.valueOf(port); + } catch (NumberFormatException ignored) { + num_port = 25565; + } + } + + JsonObject json = new JsonObject(); + json.addProperty("server_address", hostname); + + if (num_port == -1) { + json.addProperty("server_port", port); + } else { + json.addProperty("server_port", num_port); + } + + return networkService.postData(path, json) + .thenApply(response -> { + String responseBody = response.getBody(); + + if (response.getStatusCode() != 200) { + logger.error("Mineroo Bind: Api fetch failed."); + return false; + } + + try { + JsonObject responseData = JsonParser.parseString(responseBody).getAsJsonObject(); + + if (responseData.has("motd_token")) { + this.motdToken = responseData.get("motd_token").getAsString(); + } else { + logger.error("Mineroo Bind: MOTD Token not received."); + return false; + } + + if (responseData.has("session_token")) { + this.sessionToken = responseData.get("session_token").getAsString(); + } else { + logger.error("Mineroo Bind: Session Token not received."); + return false; + } + + return true; + + } catch (Exception e) { + logger.error("Mineroo Bind: Failed to parse MOTD verify response: " + responseBody, e); + return false; + } + }) + .exceptionally(e -> { + logger.error("Mineroo Bind: Network error during MOTD verify", e); + return false; + }); + } + + /** + * Finalizes the server binding asynchronously. + * + * @param name The server name (nullable) + * @param description The server description (nullable) + * @return A future that completes with true if the binding is successful + */ + public CompletableFuture finalizeServerBinding( + @Nullable String name, @Nullable String description + ) { + String path = "/server/management/bind"; + + JsonObject json = new JsonObject(); + json.addProperty("session_token", this.sessionToken); + json.addProperty("name", name); + json.addProperty("description", description); + + return networkService.postData(path, json) + .thenApply(response -> { + // Assume as long as the request returns successfully and no exception is + // thrown, it is considered successful (HTTP 200) + // If the API returns a specific {"success": false}, you need to parse the JSON + // and check here + return true; + }) + .exceptionally(e -> { + logger.error("Mineroo Bind: Failed to finalize binding", e); + return false; + }); + } + + /** + * Gets the MOTD token received from the API. + * + * @return the motdToken string + */ + public String getMotdToken() { + return motdToken; + } +} diff --git a/common/src/main/java/online/mineroo/common/request/RequestClient.java b/common/src/main/java/online/mineroo/common/request/RequestClient.java new file mode 100644 index 0000000..6218c5b --- /dev/null +++ b/common/src/main/java/online/mineroo/common/request/RequestClient.java @@ -0,0 +1,22 @@ +package online.mineroo.common.request; + +import online.mineroo.common.NetworkServiceInterface; +import org.slf4j.Logger; + +public class RequestClient { + private final ManagementRequest managementRequest; + private final UserRequest userRequest; + + public RequestClient(Logger logger, NetworkServiceInterface networkService) { + this.managementRequest = new ManagementRequest(logger, networkService); + this.userRequest = new UserRequest(logger, networkService); + } + + public ManagementRequest management() { + return this.managementRequest; + } + + public UserRequest user() { + return this.userRequest; + } +} diff --git a/common/src/main/java/online/mineroo/common/request/Serializable.java b/common/src/main/java/online/mineroo/common/request/Serializable.java new file mode 100644 index 0000000..e69de29 diff --git a/common/src/main/java/online/mineroo/common/BindRequest.java b/common/src/main/java/online/mineroo/common/request/UserRequest.java similarity index 55% rename from common/src/main/java/online/mineroo/common/BindRequest.java rename to common/src/main/java/online/mineroo/common/request/UserRequest.java index 781ae88..2f725a1 100644 --- a/common/src/main/java/online/mineroo/common/BindRequest.java +++ b/common/src/main/java/online/mineroo/common/request/UserRequest.java @@ -1,183 +1,32 @@ -package online.mineroo.common; +package online.mineroo.common.request; import com.google.gson.Gson; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.annotations.SerializedName; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import org.jetbrains.annotations.Nullable; +import online.mineroo.common.NetworkServiceInterface; import org.slf4j.Logger; -/** - * BindRequest handles server binding and verification with the Mineroo API. - *

- * This class operates asynchronously and relies on the injected - * {@link NetworkService} - * to handle the actual HTTP transport and authentication. - */ -public class BindRequest { +public class UserRequest { private final Logger logger; private final NetworkServiceInterface networkService; - // State cache - private String motdToken = ""; - private String sessionToken = ""; - /** - * Constructs a BindRequest instance. + * Constructs a UserRequest instance. * * @param logger Logger for logging errors and information * @param networkService The network service instance (Local or Proxy) that * handles transport and auth */ - public BindRequest(Logger logger, NetworkServiceInterface networkService) { + public UserRequest(Logger logger, NetworkServiceInterface networkService) { this.logger = logger; this.networkService = networkService; } - /** - * Checks the bind status asynchronously. - * - * @return A future that completes with true if status is 'bound', false - * otherwise - */ - public CompletableFuture checkBindStatus(String hostname, String port) { - // NetworkService is already configured with BaseURL, only need the path here - String path = "/server/server-bind-status"; - - Map params = new HashMap<>(); - - params.put("address", hostname); - params.put("port", port); - - return networkService.getData(path, params) - .thenApply(response -> { - if (response.getStatusCode() != 200) { - return false; - } - - String responseBody = response.getBody(); - try { - JsonObject responseData = JsonParser.parseString(responseBody).getAsJsonObject(); - boolean bound = responseData.has("bound") && responseData.get("bound").getAsBoolean(); - - if (bound) { - logger.warn("Mineroo Bind: Server already bound."); - } - return bound; - } catch (Exception e) { - logger.error("Mineroo Bind: Failed to parse bind status response", e); - return false; - } - }) - .exceptionally(e -> { - logger.error("Mineroo Bind: Network error while checking status", e); - return false; - }); - } - - /** - * Initiates a MOTD verification request asynchronously. - * - * @param hostname The server hostname - * @param port The server port - * @return A future that completes with true if tokens are received - */ - public CompletableFuture initialMotdVerifyRequest(String hostname, String port) { - String path = "/server/motd-verify"; - - Integer num_port = -1; - if (!"$port".equals(port)) { - try { - num_port = Integer.valueOf(port); - } catch (NumberFormatException ignored) { - num_port = 25565; - } - } - - JsonObject json = new JsonObject(); - json.addProperty("server_address", hostname); - - if (num_port == -1) { - json.addProperty("server_port", port); - } else { - json.addProperty("server_port", num_port); - } - - return networkService.postData(path, json) - .thenApply(response -> { - String responseBody = response.getBody(); - - if (response.getStatusCode() != 200) { - logger.error("Mineroo Bind: Api fetch failed."); - return false; - } - - try { - JsonObject responseData = JsonParser.parseString(responseBody).getAsJsonObject(); - - if (responseData.has("motd_token")) { - this.motdToken = responseData.get("motd_token").getAsString(); - } else { - logger.error("Mineroo Bind: MOTD Token not received."); - return false; - } - - if (responseData.has("session_token")) { - this.sessionToken = responseData.get("session_token").getAsString(); - } else { - logger.error("Mineroo Bind: Session Token not received."); - return false; - } - - return true; - - } catch (Exception e) { - logger.error("Mineroo Bind: Failed to parse MOTD verify response: " + responseBody, e); - return false; - } - }) - .exceptionally(e -> { - logger.error("Mineroo Bind: Network error during MOTD verify", e); - return false; - }); - } - - /** - * Finalizes the server binding asynchronously. - * - * @param name The server name (nullable) - * @param description The server description (nullable) - * @return A future that completes with true if the binding is successful - */ - public CompletableFuture finalizeServerBinding( - @Nullable String name, @Nullable String description - ) { - String path = "/server/server-bind"; - - JsonObject json = new JsonObject(); - json.addProperty("session_token", this.sessionToken); - json.addProperty("name", name); - json.addProperty("description", description); - - return networkService.postData(path, json) - .thenApply(response -> { - // Assume as long as the request returns successfully and no exception is - // thrown, it is considered successful (HTTP 200) - // If the API returns a specific {"success": false}, you need to parse the JSON - // and check here - return true; - }) - .exceptionally(e -> { - logger.error("Mineroo Bind: Failed to finalize binding", e); - return false; - }); - } - public class PlayerBindStatusResponse implements Serializable { @SerializedName("status") private PlayerBindStatusEnum status; @@ -278,7 +127,7 @@ public class BindRequest { public CompletableFuture checkPlayerBindStatus( UUID playerUuid, String userEmail ) { - String path = "/server/user-bind-status"; + String path = "/server/user/status"; Map params = new HashMap<>(); @@ -360,7 +209,7 @@ public class BindRequest { public CompletableFuture PlayerBindRequest( String webEmail, UUID playerUuid, String playerUsername ) { - String path = "/server/user-bind"; + String path = "/server/user/bind"; JsonObject json = new JsonObject(); @@ -395,13 +244,4 @@ public class BindRequest { return createPlayerBindErrorResponse("Network Error: " + e.getMessage()); }); } - - /** - * Gets the MOTD token received from the API. - * - * @return the motdToken string - */ - public String getMotdToken() { - return motdToken; - } } diff --git a/paper/build.gradle.kts b/paper/build.gradle.kts index bcaf195..4d8d13f 100644 --- a/paper/build.gradle.kts +++ b/paper/build.gradle.kts @@ -8,6 +8,7 @@ plugins { repositories { mavenCentral() maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.extendedclip.com/releases/") } dependencies { @@ -15,6 +16,7 @@ dependencies { implementation(project(":common")) compileOnly("io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + compileOnly("me.clip:placeholderapi:2.11.7") } java { diff --git a/paper/src/main/java/online/mineroo/paper/MinerooCore.java b/paper/src/main/java/online/mineroo/paper/MinerooCore.java index f2cb4dd..d96390b 100644 --- a/paper/src/main/java/online/mineroo/paper/MinerooCore.java +++ b/paper/src/main/java/online/mineroo/paper/MinerooCore.java @@ -1,22 +1,27 @@ package online.mineroo.paper; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; -import online.mineroo.common.BindRequest; +import java.util.HashMap; +import java.util.UUID; import online.mineroo.common.HttpNetworkService; import online.mineroo.common.MessageManager; import online.mineroo.common.NetworkServiceInterface; +import online.mineroo.common.request.RequestClient; import online.mineroo.paper.commands.MainCommand; import online.mineroo.paper.listeners.BindListener; import online.mineroo.paper.listeners.PlayerBindListener; +import online.mineroo.paper.structure.PlayerInfo; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; public class MinerooCore extends JavaPlugin implements Listener { private MessageManager messageManager; private NetworkServiceInterface networkService; - private BindRequest bindRequest; + private RequestClient requestClient; private Config config; + private HashMap playerCache = new HashMap<>(); + private BindListener bindListener; @Override @@ -57,7 +62,7 @@ public class MinerooCore extends JavaPlugin implements Listener { getLogger().info("Using direct HTTP network [ " + hostname + " ]"); } - bindRequest = new BindRequest(this.getSLF4JLogger(), this.getNetworkService()); + requestClient = new RequestClient(this.getSLF4JLogger(), this.getNetworkService()); if (this.messageManager == null) { this.messageManager = new MessageManager(); @@ -82,7 +87,7 @@ public class MinerooCore extends JavaPlugin implements Listener { return this.bindListener; } - public BindRequest getBindRequest() { - return bindRequest; + public RequestClient getRequestClient() { + return requestClient; } } diff --git a/paper/src/main/java/online/mineroo/paper/commands/BindCommand.java b/paper/src/main/java/online/mineroo/paper/commands/BindCommand.java index 7451d7a..5768583 100644 --- a/paper/src/main/java/online/mineroo/paper/commands/BindCommand.java +++ b/paper/src/main/java/online/mineroo/paper/commands/BindCommand.java @@ -12,9 +12,9 @@ import io.papermc.paper.registry.RegistryAccess; import io.papermc.paper.registry.RegistryKey; import java.util.UUID; import net.kyori.adventure.key.Key; -import online.mineroo.common.BindRequest; -import online.mineroo.common.BindRequest.PlayerBindStatusEnum; import online.mineroo.common.MessageManager; +import online.mineroo.common.request.RequestClient; +import online.mineroo.common.request.UserRequest.PlayerBindStatusEnum; import online.mineroo.paper.MinerooCore; import online.mineroo.paper.ProxyNetworkService; import org.bukkit.entity.Player; @@ -59,26 +59,29 @@ public class BindCommand { } try { - this.plugin.getBindRequest().checkPlayerBindStatus(uuid, null).thenAccept(response -> { - PlayerBindStatusEnum status = response.getStatus(); + this.plugin.getRequestClient() + .user() + .checkPlayerBindStatus(uuid, null) + .thenAccept(response -> { + PlayerBindStatusEnum status = response.getStatus(); - plugin.getSLF4JLogger().debug(status.toString()); + plugin.getSLF4JLogger().debug(status.toString()); - if (status == PlayerBindStatusEnum.BOUND) { - player.sendMessage(messageManager.get("info.bind.player.already-bound")); - } else if (status == PlayerBindStatusEnum.NOT_BOUND) { - Dialog dialog = RegistryAccess.registryAccess() - .getRegistry(RegistryKey.DIALOG) - .get(Key.key("mineroo:bind_user")); - if (dialog == null) { - logger.error("load user bind dialog failed."); - player.sendMessage(messageManager.get("info.bind.player.dialog-undefined")); - } + if (status == PlayerBindStatusEnum.BOUND) { + player.sendMessage(messageManager.get("info.bind.player.already-bound")); + } else if (status == PlayerBindStatusEnum.NOT_BOUND) { + Dialog dialog = RegistryAccess.registryAccess() + .getRegistry(RegistryKey.DIALOG) + .get(Key.key("mineroo:bind_user")); + if (dialog == null) { + logger.error("load user bind dialog failed."); + player.sendMessage(messageManager.get("info.bind.player.dialog-undefined")); + } - // TODO: Need a timeout check - player.showDialog(dialog); - } - }); + // TODO: Need a timeout check + player.showDialog(dialog); + } + }); } finally { } @@ -112,7 +115,7 @@ public class BindCommand { // Run the binding process asynchronously to avoid blocking the main thread org.bukkit.Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { Logger logger = plugin.getSLF4JLogger(); - BindRequest bindRequest = plugin.getBindRequest(); + RequestClient requestClient = plugin.getRequestClient(); try { String address = plugin.getConfigObject().getServer().getServerBind().getAddress(); String port = @@ -123,7 +126,7 @@ public class BindCommand { } // 1. Check binding status - if (bindRequest.checkBindStatus(address, port).join()) { + if (requestClient.management().checkBindStatus(address, port).join()) { plugin.getMessageManager().get("command.bind.server.already-bound"); context.getSource().getSender().sendMessage( plugin.getMessageManager().get("command.bind.server.already-bound") @@ -131,9 +134,9 @@ public class BindCommand { return; } // 2. Initiate MOTD verification - boolean motdOk = bindRequest.initialMotdVerifyRequest(address, port).join(); + boolean motdOk = requestClient.management().initialMotdVerifyRequest(address, port).join(); if (motdOk) { - String motdToken = bindRequest.getMotdToken(); + String motdToken = requestClient.management().getMotdToken(); // Send MOTD token to Velocity applyMotdToken(motdToken); context.getSource().getSender().sendMessage( @@ -149,7 +152,7 @@ public class BindCommand { boolean success = false; int maxRetries = 3; for (int i = 1; i <= maxRetries; i++) { - if (bindRequest + if (requestClient.management() .finalizeServerBinding( plugin.getConfigObject().getServer().getServerName(), plugin.getConfigObject().getServer().getDescription() diff --git a/paper/src/main/java/online/mineroo/paper/commands/PlayerBindStatusEnum.java b/paper/src/main/java/online/mineroo/paper/commands/PlayerBindStatusEnum.java new file mode 100644 index 0000000..e69de29 diff --git a/paper/src/main/java/online/mineroo/paper/expansions/MinerooUserExpansion.java b/paper/src/main/java/online/mineroo/paper/expansions/MinerooUserExpansion.java new file mode 100644 index 0000000..431bef8 --- /dev/null +++ b/paper/src/main/java/online/mineroo/paper/expansions/MinerooUserExpansion.java @@ -0,0 +1,51 @@ +package online.mineroo.paper.expansions; + +import java.util.UUID; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import online.mineroo.paper.MinerooCore; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class MinerooUserExpansion extends PlaceholderExpansion { + private final MinerooCore plugin; + + public MinerooUserExpansion(MinerooCore plugin) { + this.plugin = plugin; + } + + @Override + @NotNull + public String getAuthor() { + return String.join(", ", plugin.getPluginMeta().getAuthors()); + } + + @Override + @NotNull + public String getIdentifier() { + return "example"; + } + + @Override + @NotNull + public String getVersion() { + return plugin.getPluginMeta().getVersion(); + } + + @Override + public boolean persist() { + return true; + } + + @Override + public String onPlaceholderRequest(Player player, @NotNull String params) { + if (player == null) + return ""; + + UUID uuid = player.getUniqueId(); + + if (params.equals("name")) { + } + + return null; + } +} diff --git a/paper/src/main/java/online/mineroo/paper/listeners/PlayerBindListener.java b/paper/src/main/java/online/mineroo/paper/listeners/PlayerBindListener.java index 3740746..2b09ef0 100644 --- a/paper/src/main/java/online/mineroo/paper/listeners/PlayerBindListener.java +++ b/paper/src/main/java/online/mineroo/paper/listeners/PlayerBindListener.java @@ -16,11 +16,11 @@ import java.util.concurrent.TimeUnit; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; -import online.mineroo.common.BindRequest; -import online.mineroo.common.BindRequest.PlayerBindEnum; -import online.mineroo.common.BindRequest.PlayerBindResponse; -import online.mineroo.common.BindRequest.PlayerBindStatusEnum; import online.mineroo.common.MessageManager; +import online.mineroo.common.request.UserRequest; +import online.mineroo.common.request.UserRequest.PlayerBindEnum; +import online.mineroo.common.request.UserRequest.PlayerBindResponse; +import online.mineroo.common.request.UserRequest.PlayerBindStatusEnum; import online.mineroo.paper.Config; import online.mineroo.paper.MinerooCore; import org.bukkit.Bukkit; @@ -72,7 +72,8 @@ public class PlayerBindListener implements Listener { return; } - this.plugin.getBindRequest() + this.plugin.getRequestClient() + .user() .checkPlayerBindStatus(uuid, null) .thenAccept(response -> { Bukkit.getScheduler().runTask(plugin, () -> { @@ -175,20 +176,21 @@ public class PlayerBindListener implements Listener { final UUID targetUuid = playerUuid; - plugin.getBindRequest() + plugin.getRequestClient() + .user() .PlayerBindRequest(userEmail, targetUuid, playerName) .thenAccept(response -> setConnectionJoinResult(targetUuid, response)) .exceptionally(ex -> { setConnectionJoinResult( targetUuid, - BindRequest.createPlayerBindErrorResponse("Network Error: " + ex.getMessage()) + UserRequest.createPlayerBindErrorResponse("Network Error: " + ex.getMessage()) ); return null; }); } else if (key.equals(Key.key("mineroo:bind_user/cancel"))) { setConnectionJoinResult( playerUuid, - BindRequest.createPlayerBindErrorResponse( + UserRequest.createPlayerBindErrorResponse( messageManager.getString("info.bind.player.canceled") ) ); diff --git a/paper/src/main/java/online/mineroo/paper/structure/PlayerInfo.java b/paper/src/main/java/online/mineroo/paper/structure/PlayerInfo.java new file mode 100644 index 0000000..f479c76 --- /dev/null +++ b/paper/src/main/java/online/mineroo/paper/structure/PlayerInfo.java @@ -0,0 +1,13 @@ +package online.mineroo.paper.structure; + +public class PlayerInfo { + private String minerooUsername; + + public PlayerInfo(String minerooUsername) { + this.minerooUsername = minerooUsername; + } + + public String getMinerooUsername() { + return this.minerooUsername; + } +} diff --git a/paper/src/main/resources/plugin.yml b/paper/src/main/resources/plugin.yml index 45df806..40171b9 100644 --- a/paper/src/main/resources/plugin.yml +++ b/paper/src/main/resources/plugin.yml @@ -6,6 +6,7 @@ author: YuKun Liu website: https://mineroo.online description: Mineroo Base Plugin api-version: "1.21.10" +softdepend: ["PlaceholderAPI"] permissions: mineroo.admin.reload: description: "Reload plugin config files." diff --git a/velocity/.factorypath b/velocity/.factorypath index 3352a76..b73dd30 100644 --- a/velocity/.factorypath +++ b/velocity/.factorypath @@ -1,36 +1,36 @@ + - - + + - + - - - - + + - + + + + - - - +