feat: implemented resource pack local repository

This commit is contained in:
Andrey Terentev 2024-09-28 01:52:16 +07:00
parent e32b047d47
commit fadc170c62
2 changed files with 79 additions and 1 deletions

View File

@ -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);
}
}

View File

@ -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();
}
}