diff --git a/bukkit/loader/src/main/resources/commands.yml b/bukkit/loader/src/main/resources/commands.yml index 81f4a1076..72705d3b8 100644 --- a/bukkit/loader/src/main/resources/commands.yml +++ b/bukkit/loader/src/main/resources/commands.yml @@ -16,6 +16,13 @@ reload: - /craftengine reload - /ce reload +upload: + enable: true + permission: ce.command.admin.upload + usage: + - /craftengine upload + - /ce upload + get_item: enable: true permission: ce.command.admin.get_item diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index eee50f283..e0f2a5355 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -59,6 +59,8 @@ command.resource.enable.failure.unknown: "Unknown resource " command.resource.disable.success: "Disabled resource . Run /ce reload all to apply changes" command.resource.disable.failure.unknown: "Unknown resource " command.resource.list: "Enabled resources(): Disabled resources(): " +command.upload.failure.not_supported: "Current hosting method '' doesn't support uploading resource packs." +command.upload.on_progress: "Started uploading progress. Check the console for more information." warning.config.image.duplicated: "Issue found in file - Duplicated image ''." warning.config.image.lack_height: "Issue found in file - The image '' is missing the required 'height' argument." warning.config.image.height_smaller_than_ascent: "Issue found in file - The image '' violates the bitmap image rule: 'height' should be no lower than 'ascent'." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index 0f03c5226..b6db4cf15 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -59,6 +59,8 @@ command.resource.enable.failure.unknown: "未知资源 " command.resource.disable.success: "已禁用 . 执行 /ce reload all 以应用更改" command.resource.disable.failure.unknown: "未知资源 " command.resource.list: "启用的资源(): 禁用的资源(): " +command.upload.failure.not_supported: "当前托管模式 '' 不支持上传资源包." +command.upload.on_progress: "已开始上传进程. 检查控制台以获取详细信息." warning.config.image.duplicated: "在文件 中发现问题 - 图片 '' 重复定义" warning.config.image.lack_height: "在文件 中发现问题 - 图片 '' 缺少必要的 'height' 高度参数" warning.config.image.height_smaller_than_ascent: "在文件 中发现问题 - 图片 '' 违反位图规则:'height' 高度值不应小于 'ascent' 基准线高度" diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java index 556ceaf64..322d0985a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -49,7 +49,8 @@ public class BukkitCommandManager extends AbstractCommandManager new TotemAnimationCommand(this, plugin), new EnableResourceCommand(this, plugin), new DisableResourceCommand(this, plugin), - new ListResourceCommand(this, plugin) + new ListResourceCommand(this, plugin), + new UploadPackCommand(this, plugin) )); final LegacyPaperCommandManager manager = (LegacyPaperCommandManager) getCommandManager(); manager.settings().set(ManagerSetting.ALLOW_UNSAFE_REGISTRATION, true); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java index 07f41414b..00056ba91 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java @@ -61,7 +61,6 @@ public class ReloadCommand extends BukkitCommandFeature { plugin().logger().warn("Failed to reload config", e); } } else if (argument == ReloadArgument.PACK) { - RELOAD_PACK_FLAG = true; plugin().scheduler().executeAsync(() -> { try { long time1 = System.currentTimeMillis(); @@ -73,8 +72,6 @@ public class ReloadCommand extends BukkitCommandFeature { } catch (Exception e) { handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); plugin().logger().warn("Failed to generate resource pack", e); - } finally { - RELOAD_PACK_FLAG = false; } }); } else if (argument == ReloadArgument.ALL) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UploadPackCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UploadPackCommand.java new file mode 100644 index 000000000..b7294437d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UploadPackCommand.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.pack.host.ResourcePackHost; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.Command; + +public class UploadPackCommand extends BukkitCommandFeature { + + public UploadPackCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .handler(context -> { + ResourcePackHost host = plugin().packManager().resourcePackHost(); + if (host.canUpload()) { + handleFeedback(context, MessageConstants.COMMAND_UPLOAD_ON_PROGRESS); + host.upload(Config.fileToUpload()); + } else { + handleFeedback(context, MessageConstants.COMMAND_UPLOAD_FAILURE_NOT_SUPPORTED, Component.text(host.type().value())); + } + }); + } + + @Override + public String getFeatureID() { + return "upload"; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java index 1da990f1d..0b42f0bd3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.pack.host; +import net.momirealms.craftengine.core.util.Key; + import java.nio.file.Path; import java.util.List; import java.util.UUID; @@ -10,4 +12,8 @@ public interface ResourcePackHost { CompletableFuture> requestResourcePackDownloadLink(UUID player); CompletableFuture upload(Path resourcePackPath); + + boolean canUpload(); + + Key type(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java index 7ad890871..19ebe3055 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java @@ -6,11 +6,9 @@ import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.GsonHelper; -import net.momirealms.craftengine.core.util.HashUtils; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.Pair; +import net.momirealms.craftengine.core.util.*; import javax.annotation.Nullable; import java.io.IOException; @@ -26,8 +24,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.time.Duration; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -40,8 +36,7 @@ public class AlistHost implements ResourcePackHost { private final String filePassword; private final String otpCode; private final Duration jwtTokenExpiration; - private final String filePath; - private final boolean disabledUpload; + private final String uploadPath; private final ProxySelector proxy; private Pair jwtToken; private String cachedSha1; @@ -52,8 +47,7 @@ public class AlistHost implements ResourcePackHost { String filePassword, String otpCode, Duration jwtTokenExpiration, - String filePath, - boolean disabledUpload, + String uploadPath, ProxySelector proxy) { this.apiUrl = apiUrl; this.userName = userName; @@ -61,12 +55,21 @@ public class AlistHost implements ResourcePackHost { this.filePassword = filePassword; this.otpCode = otpCode; this.jwtTokenExpiration = jwtTokenExpiration; - this.filePath = filePath; - this.disabledUpload = disabledUpload; + this.uploadPath = uploadPath; this.proxy = proxy; this.readCacheFromDisk(); } + @Override + public boolean canUpload() { + return true; + } + + @Override + public Key type() { + return ResourcePackHosts.ALIST; + } + private void readCacheFromDisk() { Path cachePath = CraftEngine.instance().dataFolderPath().resolve("alist.cache"); if (!Files.exists(cachePath)) return; @@ -129,18 +132,13 @@ public class AlistHost implements ResourcePackHost { @Override public CompletableFuture upload(Path resourcePackPath) { - if (this.disabledUpload) { - this.cachedSha1 = ""; - saveCacheToDisk(); - return CompletableFuture.completedFuture(null); - } CompletableFuture future = new CompletableFuture<>(); CraftEngine.instance().scheduler().executeAsync(() -> { try (HttpClient client = HttpClient.newBuilder().proxy(this.proxy).build()) { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(this.apiUrl + "/api/fs/put")) .header("Authorization", getOrRefreshJwtToken()) - .header("File-Path", URLEncoder.encode(this.filePath, StandardCharsets.UTF_8) + .header("File-Path", URLEncoder.encode(this.uploadPath, StandardCharsets.UTF_8) .replace("/", "%2F")) .header("overwrite", "true") .header("password", this.filePassword) @@ -225,7 +223,7 @@ public class AlistHost implements ResourcePackHost { } private HttpRequest.BodyPublisher getRequestResourcePackDownloadLinkPost() { - String body = "{\"path\":\"" + this.filePath + "\",\"password\":\"" + this.filePassword + "\"}"; + String body = "{\"path\":\"" + this.uploadPath + "\",\"password\":\"" + this.filePassword + "\"}"; return HttpRequest.BodyPublishers.ofString(body); } @@ -241,32 +239,6 @@ public class AlistHost implements ResourcePackHost { boolean isDir = dataObj.getAsJsonPrimitive("is_dir").getAsBoolean(); if (!isDir) { String url = dataObj.getAsJsonPrimitive("raw_url").getAsString(); - if ((this.cachedSha1 == null || this.cachedSha1.isEmpty()) && this.disabledUpload) { - try (HttpClient client = HttpClient.newBuilder().proxy(this.proxy).build()) { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - HttpResponse responseHash = client.send(request, HttpResponse.BodyHandlers.ofInputStream()); - try (InputStream inputStream = responseHash.body()) { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] buffer = new byte[8192]; - int len; - while ((len = inputStream.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - byte[] digest = md.digest(); - this.cachedSha1 = HexFormat.of().formatHex(digest); - saveCacheToDisk(); - } catch (NoSuchAlgorithmException e) { - future.completeExceptionally(new RuntimeException("Failed to calculate SHA-1 hash algorithm", e)); - return; - } - } catch (IOException | InterruptedException e) { - future.completeExceptionally(new RuntimeException("Failed to retrieve remote resource pack for hashing", e)); - return; - } - } UUID uuid = UUID.nameUUIDFromBytes(Objects.requireNonNull(this.cachedSha1).getBytes(StandardCharsets.UTF_8)); future.complete(List.of(new ResourcePackDownloadData(url, uuid, this.cachedSha1))); return; @@ -297,13 +269,12 @@ public class AlistHost implements ResourcePackHost { String filePassword = (String) arguments.getOrDefault("file-password", ""); String otpCode = (String) arguments.get("otp-code"); Duration jwtTokenExpiration = Duration.ofHours((int) arguments.getOrDefault("jwt-token-expiration", 48)); - String filePath = (String) arguments.get("file-path"); - if (filePath == null || filePath.isEmpty()) { - throw new IllegalArgumentException("'file-path' cannot be empty for Alist host"); + String uploadPath = (String) arguments.get("upload-path"); + if (uploadPath == null || uploadPath.isEmpty()) { + throw new IllegalArgumentException("'upload-path' cannot be empty for Alist host"); } - boolean disabledUpload = (boolean) arguments.getOrDefault("disabled-upload", false); ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy")); - return new AlistHost(apiUrl, userName, password, filePassword, otpCode, jwtTokenExpiration, filePath, disabledUpload, proxy); + return new AlistHost(apiUrl, userName, password, filePassword, otpCode, jwtTokenExpiration, uploadPath, proxy); } } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java index 167cc503d..a3f3edafe 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java @@ -6,9 +6,11 @@ import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.HashUtils; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import java.io.FileNotFoundException; @@ -89,6 +91,16 @@ public class DropboxHost implements ResourcePackHost { } } + @Override + public boolean canUpload() { + return true; + } + + @Override + public Key type() { + return ResourcePackHosts.DROPBOX; + } + @Override public CompletableFuture> requestResourcePackDownloadLink(UUID player) { if (this.url == null) return CompletableFuture.completedFuture(Collections.emptyList()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/ExternalHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/ExternalHost.java index 990f6e9fe..563bc1ca9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/ExternalHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/ExternalHost.java @@ -3,6 +3,8 @@ package net.momirealms.craftengine.core.pack.host.impl; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; +import net.momirealms.craftengine.core.util.Key; import java.nio.file.Path; import java.util.List; @@ -28,6 +30,16 @@ public class ExternalHost implements ResourcePackHost { return CompletableFuture.completedFuture(null); } + @Override + public boolean canUpload() { + return false; + } + + @Override + public Key type() { + return ResourcePackHosts.EXTERNAL; + } + public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java index 889e83889..00c0d49df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java @@ -4,8 +4,10 @@ import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.GsonHelper; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import java.io.IOException; @@ -41,6 +43,16 @@ public class LobFileHost implements ResourcePackHost { this.readCacheFromDisk(); } + @Override + public boolean canUpload() { + return true; + } + + @Override + public Key type() { + return ResourcePackHosts.LOBFILE; + } + public void readCacheFromDisk() { Path cachePath = CraftEngine.instance().dataFolderPath().resolve("lobfile.cache"); if (!Files.exists(cachePath)) return; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/NoneHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/NoneHost.java index 6a8d4325b..3802756b5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/NoneHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/NoneHost.java @@ -3,6 +3,8 @@ package net.momirealms.craftengine.core.pack.host.impl; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; +import net.momirealms.craftengine.core.util.Key; import java.nio.file.Path; import java.util.List; @@ -24,6 +26,16 @@ public class NoneHost implements ResourcePackHost { return CompletableFuture.completedFuture(null); } + @Override + public boolean canUpload() { + return false; + } + + @Override + public Key type() { + return ResourcePackHosts.NONE; + } + public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java index 78ef114d1..9943c3df6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java @@ -5,11 +5,9 @@ import com.google.gson.reflect.TypeToken; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.GsonHelper; -import net.momirealms.craftengine.core.util.HashUtils; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.Tuple; +import net.momirealms.craftengine.core.util.*; import java.io.FileNotFoundException; import java.io.IOException; @@ -51,6 +49,16 @@ public class OneDriveHost implements ResourcePackHost { readCacheFromDisk(); } + @Override + public boolean canUpload() { + return true; + } + + @Override + public Key type() { + return ResourcePackHosts.ONEDRIVE; + } + public void readCacheFromDisk() { Path cachePath = CraftEngine.instance().dataFolderPath().resolve("onedrive.cache"); if (!Files.exists(cachePath)) return; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java index 5005bf2a5..c5f586fe4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java @@ -3,8 +3,10 @@ package net.momirealms.craftengine.core.pack.host.impl; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.HashUtils; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; @@ -63,6 +65,16 @@ public class S3Host implements ResourcePackHost { this.validity = validity; } + @Override + public boolean canUpload() { + return true; + } + + @Override + public Key type() { + return ResourcePackHosts.S3; + } + @Override public CompletableFuture> requestResourcePackDownloadLink(UUID player) { return this.s3AsyncClient.headObject(HeadObjectRequest.builder() diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java index ce881c3bb..fb0a1223c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java @@ -3,8 +3,10 @@ package net.momirealms.craftengine.core.pack.host.impl; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; +import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import java.nio.file.Path; @@ -42,6 +44,16 @@ public class SelfHost implements ResourcePackHost { return future; } + @Override + public boolean canUpload() { + return true; + } + + @Override + public Key type() { + return ResourcePackHosts.SELF; + } + public static class Factory implements ResourcePackHostFactory { @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java index 3d61517ab..29d202578 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java @@ -26,4 +26,6 @@ public interface MessageConstants { TranslatableComponent.Builder COMMAND_RESOURCE_DISABLE_SUCCESS = Component.translatable().key("command.resource.disable.success"); TranslatableComponent.Builder COMMAND_RESOURCE_DISABLE_FAILURE = Component.translatable().key("command.resource.disable.failure.unknown"); TranslatableComponent.Builder COMMAND_RESOURCE_LIST = Component.translatable().key("command.resource.list"); + TranslatableComponent.Builder COMMAND_UPLOAD_FAILURE_NOT_SUPPORTED = Component.translatable().key("command.upload.failure.not_supported"); + TranslatableComponent.Builder COMMAND_UPLOAD_ON_PROGRESS = Component.translatable().key("command.upload.on_progress"); } diff --git a/gradle.properties b/gradle.properties index 270503e76..65fb4f3fa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.49-beta.1 +project_version=0.0.49-beta.2 config_version=28 -lang_version=4 +lang_version=5 project_group=net.momirealms latest_supported_version=1.21.5 latest_minecraft_version=1.21.5