From fadc170c62bd6d6b5c0fdac741256b23e9444bc1 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Sat, 28 Sep 2024 01:52:16 +0700 Subject: [PATCH] feat: implemented resource pack local repository --- .../ru/dragonestia/msb3/api/Bootstrap.java | 4 +- .../module/ResourcePackRepositoryModule.java | 76 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/module/ResourcePackRepositoryModule.java diff --git a/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java b/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java index fd7518d..af54373 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java @@ -3,6 +3,7 @@ package ru.dragonestia.msb3.api; import lombok.extern.log4j.Log4j2; import net.minestom.server.entity.GameMode; import ru.dragonestia.msb3.api.module.FlatWorldModule; +import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule; @Log4j2 public class Bootstrap { @@ -12,7 +13,8 @@ public class Bootstrap { FlatWorldModule.init(GameMode.ADVENTURE); - boot.getResourcePackManager().compile(); + ResourcePackRepositoryModule.init(boot, "0.0.0.0", 7270); + boot.start("0.0.0.0", 25565); } } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/module/ResourcePackRepositoryModule.java b/api/src/main/java/ru/dragonestia/msb3/api/module/ResourcePackRepositoryModule.java new file mode 100644 index 0000000..43559c5 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/module/ResourcePackRepositoryModule.java @@ -0,0 +1,76 @@ +package ru.dragonestia.msb3.api.module; + +import lombok.SneakyThrows; +import net.kyori.adventure.resource.ResourcePackCallback; +import net.kyori.adventure.resource.ResourcePackInfo; +import net.kyori.adventure.resource.ResourcePackRequest; +import net.kyori.adventure.text.Component; +import net.minestom.server.MinecraftServer; +import net.minestom.server.event.player.PlayerSpawnEvent; +import ru.dragonestia.msb3.api.ServerBootstrap; +import team.unnamed.creative.BuiltResourcePack; +import team.unnamed.creative.base.Writable; +import team.unnamed.creative.server.ResourcePackServer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URI; +import java.security.MessageDigest; +import java.util.Formatter; +import java.util.UUID; + +import static net.kyori.adventure.text.format.NamedTextColor.RED; + +public class ResourcePackRepositoryModule { + + private static boolean used = false; + + private ResourcePackRepositoryModule() {} + + @SneakyThrows + public static synchronized void init(ServerBootstrap bootstrap, String address, int port) { + if (used) return; + used = true; + + bootstrap.getResourcePackManager().compile(); + + var file = new File("./resource-pack.zip"); + var hash = calculateHash(file); + var uuid = UUID.randomUUID(); + var server = ResourcePackServer.server() + .address(address, port) + .pack(BuiltResourcePack.of(Writable.file(file), hash)) + .build(); + + server.start(); + + MinecraftServer.getGlobalEventHandler().addListener(PlayerSpawnEvent.class, event -> { + var player = event.getPlayer(); + + player.sendResourcePacks(ResourcePackRequest.resourcePackRequest() + .packs(ResourcePackInfo.resourcePackInfo(uuid, URI.create("http://" + address + ":" + port), hash)) + .replace(false) + .prompt(Component.text("Пакет ресурсов необходим для продолжения игры.", RED)) + .required(true) + .callback(ResourcePackCallback.noOp()) + .build()); + }); + } + + @SneakyThrows + private static String calculateHash(File file) { + MessageDigest digest = MessageDigest.getInstance("SHA-1"); + + try (InputStream fis = new FileInputStream(file)) { + byte[] bytes = fis.readAllBytes(); + return byteArray2Hex(digest.digest(bytes)); + } + } + + private static String byteArray2Hex(final byte[] hash) { + Formatter formatter = new Formatter(); + for (byte b: hash) formatter.format("%02x", b); + return formatter.toString(); + } +}