From bdb051276426da2a28868c8c3443a4a659f043ce Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 17 Apr 2025 03:05:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/pack/BukkitPackManager.java | 119 +++++++++++------- .../core/pack/host/ResourcePackHost.java | 2 - .../core/pack/host/impl/SelfHost.java | 5 - .../pack/host/impl/SelfHostHttpServer.java | 16 --- 4 files changed, 77 insertions(+), 65 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index 896db1452..c11ff497d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -2,7 +2,9 @@ package net.momirealms.craftengine.bukkit.pack; import net.momirealms.craftengine.bukkit.api.event.AsyncResourcePackGenerateEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.VersionHelper; @@ -14,57 +16,90 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerResourcePackStatusEvent; +import java.util.Optional; +import java.util.UUID; + public class BukkitPackManager extends AbstractPackManager implements Listener { - private final BukkitCraftEngine plugin; + private final BukkitCraftEngine plugin; - public BukkitPackManager(BukkitCraftEngine plugin) { + public BukkitPackManager(BukkitCraftEngine plugin) { super(plugin, (rf, zp) -> { - AsyncResourcePackGenerateEvent endEvent = new AsyncResourcePackGenerateEvent(rf, zp); - EventUtils.fireAndForget(endEvent); - }); + AsyncResourcePackGenerateEvent endEvent = new AsyncResourcePackGenerateEvent(rf, zp); + EventUtils.fireAndForget(endEvent); + }); this.plugin = plugin; - } + } - @Override - public void delayedInit() { - super.delayedInit(); - Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); - } + @Override + public void delayedInit() { + super.delayedInit(); + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + } - @EventHandler(priority = EventPriority.LOW) - public void onPlayerJoin(PlayerJoinEvent event) { - // todo 1.20.1 资源包发送 - } + @EventHandler(priority = EventPriority.LOW) + public void onPlayerJoin(PlayerJoinEvent event) { + // todo 1.20.1 资源包发送 + } - @EventHandler(priority = EventPriority.LOW) - public void onResourcePackStatus(PlayerResourcePackStatusEvent event) { - // for 1.20.1 servers, not recommended to use - if (Config.sendPackOnJoin() && Config.kickOnDeclined() && !VersionHelper.isVersionNewerThan1_20_2()) { - if (event.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || event.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) { - event.getPlayer().kick(); - } - } - } + @EventHandler(priority = EventPriority.LOW) + public void onResourcePackStatus(PlayerResourcePackStatusEvent event) { + // for 1.20.1 servers, not recommended to use + if (Config.sendPackOnJoin() && Config.kickOnDeclined() && !VersionHelper.isVersionNewerThan1_20_2()) { + if (event.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || event.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) { + event.getPlayer().kick(); + } + } + } - @Override - public void load() { - super.load(); - } + @Override + public void load() { + if (Config.sendPackOnJoin()) { + this.modifyServerSettings(); + } + } - @Override - public void unload() { - super.unload(); - } + public void modifyServerSettings() { + try { + Object settings = Reflections.field$DedicatedServer$settings.get(Reflections.method$MinecraftServer$getServer.invoke(null)); + Object properties = Reflections.field$DedicatedServerSettings$properties.get(settings); + Object info; + if (VersionHelper.isVersionNewerThan1_20_3()) { + info = Reflections.constructor$ServerResourcePackInfo.newInstance(new UUID(0, 0), "", "", Config.kickOnDeclined(), ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt())); + } else { + info = Reflections.constructor$ServerResourcePackInfo.newInstance(new UUID(0, 0), "", Config.kickOnDeclined(), ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt())); + } + Reflections.field$DedicatedServerProperties$serverResourcePackInfo.set(properties, Optional.of(info)); + } catch (Exception e) { + this.plugin.logger().warn("Failed to update resource pack settings", e); + } + } - @Override - public void disable() { - super.disable(); - HandlerList.unregisterAll(this); - } + @Override + public void unload() { + super.unload(); + this.resetServerSettings(); + } - @Override - public void generateResourcePack() { - // generate pack - super.generateResourcePack(); - } + @Override + public void disable() { + super.disable(); + HandlerList.unregisterAll(this); + this.resetServerSettings(); + } + + public void resetServerSettings() { + try { + Object settings = Reflections.field$DedicatedServer$settings.get(Reflections.method$MinecraftServer$getServer.invoke(null)); + Object properties = Reflections.field$DedicatedServerSettings$properties.get(settings); + Reflections.field$DedicatedServerProperties$serverResourcePackInfo.set(properties, Optional.empty()); + } catch (Exception e) { + this.plugin.logger().warn("Failed to reset resource pack settings", e); + } + } + + @Override + public void generateResourcePack() { + // generate pack + super.generateResourcePack(); + } } 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 709381e51..884e7d972 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 @@ -8,7 +8,5 @@ public interface ResourcePackHost { CompletableFuture requestResourcePackDownloadLink(UUID player); - ResourcePackDownloadData getResourcePackDownloadLink(UUID player); - CompletableFuture upload(Path resourcePackPath); } 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 32f117c07..091c06185 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 @@ -19,11 +19,6 @@ public class SelfHost implements ResourcePackHost { return CompletableFuture.completedFuture(SelfHostHttpServer.instance().generateOneTimeUrl(player)); } - @Override - public ResourcePackDownloadData getResourcePackDownloadLink(UUID player) { - return SelfHostHttpServer.instance().getCachedOneTimeUrl(player); - } - @Override public CompletableFuture upload(Path resourcePackPath) { SelfHostHttpServer.instance().setResourcePackPath(resourcePackPath); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java index 4426f1e3f..6ca5466af 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java @@ -32,10 +32,6 @@ public class SelfHostHttpServer { .maximumSize(256) .expireAfterAccess(1, TimeUnit.MINUTES) .build(); - private final Cache playerTokens = Caffeine.newBuilder() - .maximumSize(256) - .expireAfterAccess(1, TimeUnit.MINUTES) - .build(); private final Cache ipAccessCache = Caffeine.newBuilder() .maximumSize(256) .expireAfterAccess(10, TimeUnit.MINUTES) @@ -64,18 +60,6 @@ public class SelfHostHttpServer { public ResourcePackDownloadData generateOneTimeUrl(UUID player) { String token = UUID.randomUUID().toString(); this.oneTimePackUrls.put(token, true); - this.playerTokens.put(player, token); - return new ResourcePackDownloadData( - url() + "download?token=" + URLEncoder.encode(token, StandardCharsets.UTF_8), - packUUID, - packHash - ); - } - - @Nullable - public ResourcePackDownloadData getCachedOneTimeUrl(UUID player) { - String token = this.playerTokens.getIfPresent(player); - if (token == null) return null; return new ResourcePackDownloadData( url() + "download?token=" + URLEncoder.encode(token, StandardCharsets.UTF_8), packUUID,