feat: implemented resource pack local repository
This commit is contained in:
parent
e32b047d47
commit
fadc170c62
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user