From 50754b52d69416cd72d02e68fd33ad83e271d13f Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 20 Nov 2025 15:40:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=8A=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E9=9F=B3=E4=B9=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behavior/ConcretePowderBlockBehavior.java | 5 +- .../bukkit/sound/BukkitSoundManager.java | 71 +++++++++++++++++-- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java index 91168a0fc..91e96fda6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java @@ -8,7 +8,10 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MFluids; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.EventUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; -import net.momirealms.craftengine.core.block.*; +import net.momirealms.craftengine.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.parser.BlockStateParser; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java index a2981f6be..ad53f6d70 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.bukkit.sound; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; @@ -9,13 +11,15 @@ import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.sound.AbstractSoundManager; import net.momirealms.craftengine.core.sound.JukeboxSong; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; public class BukkitSoundManager extends AbstractSoundManager { @@ -25,6 +29,65 @@ public class BukkitSoundManager extends AbstractSoundManager { Object resourceLocation = FastNMS.INSTANCE.field$SoundEvent$location(soundEvent); VANILLA_SOUND_EVENTS.add(KeyUtils.resourceLocationToKey(resourceLocation)); } + this.registerSongs(this.loadLastRegisteredSongs()); + } + + @Override + public void disable() { + this.saveLastRegisteredSongs(super.songs); + super.disable(); + } + + private void saveLastRegisteredSongs(Map songs) { + if (songs == null || songs.isEmpty()) return; + Path persistSongPath = this.plugin.dataFolderPath() + .resolve("cache") + .resolve("jukebox-songs.json"); + try { + Files.createDirectories(persistSongPath.getParent()); + JsonObject cache = new JsonObject(); + for (Map.Entry entry : songs.entrySet()) { + JsonObject songJson = new JsonObject(); + JukeboxSong song = entry.getValue(); + songJson.addProperty("sound_event", song.sound().asString()); + songJson.add("description", AdventureHelper.componentToJsonElement(song.description())); + songJson.addProperty("length_in_seconds", song.lengthInSeconds()); + songJson.addProperty("comparator_output", song.comparatorOutput()); + songJson.addProperty("range", song.range()); + cache.add(entry.getKey().asString(), songJson); + } + GsonHelper.writeJsonFile(cache, persistSongPath); + } catch (IOException e) { + this.plugin.logger().warn("Failed to save registered songs.", e); + } + } + + private Map loadLastRegisteredSongs() { + Path persistSongPath = this.plugin.dataFolderPath() + .resolve("cache") + .resolve("jukebox-songs.json"); + if (Files.exists(persistSongPath) && Files.isRegularFile(persistSongPath)) { + try { + Map songs = new HashMap<>(); + JsonObject cache = GsonHelper.readJsonFile(persistSongPath).getAsJsonObject(); + for (Map.Entry songEntry : cache.entrySet()) { + Key id = Key.of(songEntry.getKey()); + if (songEntry.getValue() instanceof JsonObject jo) { + songs.put(id, new JukeboxSong( + Key.of(jo.get("sound_event").getAsString()), + AdventureHelper.jsonElementToComponent(jo.get("description")), + jo.get("length_in_seconds").getAsFloat(), + jo.get("comparator_output").getAsInt(), + jo.get("range").getAsFloat() + )); + } + } + return songs; + } catch (IOException e) { + this.plugin.logger().warn("Failed to load registered songs.", e); + } + } + return Map.of(); } @Override