From 74d532025118d4db0b87c38408f47824bac371c7 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 4 Apr 2025 04:06:44 +0800 Subject: [PATCH] refactor sounds --- .../src/main/resources/translations/en.yml | 4 +- .../bukkit/loot/BukkitVanillaLootManager.java | 7 +- .../sound/BukkitJukeboxSongManager.java | 58 -------- .../bukkit/sound/BukkitSoundManager.java | 47 ++++++- .../core/loot/AbstractVanillaLootManager.java | 4 +- .../craftengine/core/plugin/CraftEngine.java | 3 +- .../config/template/TemplateManagerImpl.java | 2 - .../gui/category/ItemBrowserManager.java | 1 - .../core/sound/AbstractSoundManager.java | 127 ++++++++++++------ .../core/sound/{song => }/JukeboxSong.java | 2 +- .../craftengine/core/sound/SoundManager.java | 19 +-- .../song/AbstractJukeboxSongManager.java | 53 -------- .../core/sound/song/JukeboxSongManager.java | 19 --- 13 files changed, 146 insertions(+), 200 deletions(-) delete mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java rename core/src/main/java/net/momirealms/craftengine/core/sound/{song => }/JukeboxSong.java (80%) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index b926499ff..66632d11f 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -67,4 +67,6 @@ warning.config.recipe.duplicated: "Issue found in file - Duplica warning.config.i18n.unknown_locale: "Issue found in file - Unknown locale ''." warning.config.template.duplicated: "Issue found in file - Duplicated template ''." warning.config.vanilla_loot.type_not_exist: "Issue found in file - 'type' not set for vanilla loot ''." -warning.config.vanilla_loot.block.invalid_target: "Issue found in file - Invalid block target [] in vanilla loot ''." \ No newline at end of file +warning.config.vanilla_loot.block.invalid_target: "Issue found in file - Invalid block target [] in vanilla loot ''." +warning.config.sound.duplicated: "Issue found in file - Duplicated sound ''." +warning.config.jukebox_song.duplicated: "Issue found in file - Duplicated jukebox song ''." \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index 93dd5d2d8..6a36cca25 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -11,7 +11,6 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.AbstractVanillaLootManager; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.loot.VanillaLoot; -import net.momirealms.craftengine.core.loot.VanillaLootManager; import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; @@ -19,7 +18,6 @@ import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.PreConditions; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; @@ -34,7 +32,10 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDeathEvent; import java.nio.file.Path; -import java.util.*; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; // note: block listeners are in BlockEventListener to reduce performance cost public class BukkitVanillaLootManager extends AbstractVanillaLootManager implements Listener { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java deleted file mode 100644 index c1279b3fd..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.momirealms.craftengine.bukkit.sound; - -import net.momirealms.craftengine.bukkit.util.ComponentUtils; -import net.momirealms.craftengine.bukkit.util.Reflections; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.sound.song.AbstractJukeboxSongManager; -import net.momirealms.craftengine.core.sound.song.JukeboxSong; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.VersionHelper; - -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -public class BukkitJukeboxSongManager extends AbstractJukeboxSongManager { - - public BukkitJukeboxSongManager(CraftEngine plugin) { - super(plugin); - } - - @Override - protected void registerSongs(Map songs) { - if (songs.isEmpty()) return; - try { - unfreezeRegistry(); - for (Map.Entry entry : songs.entrySet()) { - Key id = entry.getKey(); - JukeboxSong jukeboxSong = entry.getValue(); - Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value()); - Object soundId = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, jukeboxSong.sound().namespace(), jukeboxSong.sound().value()); - Object song = Reflections.method$Registry$get.invoke(Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation); - - Object soundEvent = VersionHelper.isVersionNewerThan1_21_2() ? - Reflections.constructor$SoundEvent.newInstance(soundId, Optional.of(jukeboxSong.range())) : - Reflections.constructor$SoundEvent.newInstance(soundId, jukeboxSong.range(), false); - Object soundHolder = Reflections.method$Holder$direct.invoke(null, soundEvent); - - if (song == null) { - song = Reflections.constructor$JukeboxSong.newInstance(soundHolder, ComponentUtils.adventureToMinecraft(jukeboxSong.description()), jukeboxSong.lengthInSeconds(), jukeboxSong.comparatorOutput()); - Object holder = Reflections.method$Registry$registerForHolder.invoke(null, Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation, song); - Reflections.method$Holder$Reference$bindValue.invoke(holder, song); - Reflections.field$Holder$Reference$tags.set(holder, Set.of()); - } - } - freezeRegistry(); - } catch (Exception e) { - plugin.logger().warn("Failed to register jukebox songs.", e); - } - } - - private void unfreezeRegistry() throws IllegalAccessException { - Reflections.field$MappedRegistry$frozen.set(Reflections.instance$InternalRegistries$JUKEBOX_SONG, false); - } - - private void freezeRegistry() throws IllegalAccessException { - Reflections.field$MappedRegistry$frozen.set(Reflections.instance$InternalRegistries$JUKEBOX_SONG, true); - } -} 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 e3f4d769f..e17dd3702 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,8 +1,16 @@ package net.momirealms.craftengine.bukkit.sound; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.sound.AbstractSoundManager; -import net.momirealms.craftengine.core.sound.song.JukeboxSongManager; +import net.momirealms.craftengine.core.sound.JukeboxSong; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.Map; +import java.util.Optional; +import java.util.Set; public class BukkitSoundManager extends AbstractSoundManager { @@ -11,7 +19,40 @@ public class BukkitSoundManager extends AbstractSoundManager { } @Override - protected JukeboxSongManager createJukeboxSongManager() { - return new BukkitJukeboxSongManager(super.plugin); + protected void registerSongs(Map songs) { + if (songs.isEmpty()) return; + try { + unfreezeRegistry(); + for (Map.Entry entry : songs.entrySet()) { + Key id = entry.getKey(); + JukeboxSong jukeboxSong = entry.getValue(); + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value()); + Object soundId = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, jukeboxSong.sound().namespace(), jukeboxSong.sound().value()); + Object song = Reflections.method$Registry$get.invoke(Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation); + + Object soundEvent = VersionHelper.isVersionNewerThan1_21_2() ? + Reflections.constructor$SoundEvent.newInstance(soundId, Optional.of(jukeboxSong.range())) : + Reflections.constructor$SoundEvent.newInstance(soundId, jukeboxSong.range(), false); + Object soundHolder = Reflections.method$Holder$direct.invoke(null, soundEvent); + + if (song == null) { + song = Reflections.constructor$JukeboxSong.newInstance(soundHolder, ComponentUtils.adventureToMinecraft(jukeboxSong.description()), jukeboxSong.lengthInSeconds(), jukeboxSong.comparatorOutput()); + Object holder = Reflections.method$Registry$registerForHolder.invoke(null, Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation, song); + Reflections.method$Holder$Reference$bindValue.invoke(holder, song); + Reflections.field$Holder$Reference$tags.set(holder, Set.of()); + } + } + freezeRegistry(); + } catch (Exception e) { + plugin.logger().warn("Failed to register jukebox songs.", e); + } + } + + private void unfreezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$InternalRegistries$JUKEBOX_SONG, false); + } + + private void freezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$InternalRegistries$JUKEBOX_SONG, true); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/AbstractVanillaLootManager.java b/core/src/main/java/net/momirealms/craftengine/core/loot/AbstractVanillaLootManager.java index ae9b199d9..fbacf55cb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/AbstractVanillaLootManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/AbstractVanillaLootManager.java @@ -2,7 +2,9 @@ package net.momirealms.craftengine.core.loot; import net.momirealms.craftengine.core.util.Key; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; public abstract class AbstractVanillaLootManager implements VanillaLootManager { protected final Map blockLoots = new HashMap<>(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 020145b62..db7667305 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -202,8 +202,7 @@ public abstract class CraftEngine implements Plugin { // register translation parser this.packManager.registerConfigSectionParsers(this.translationManager.parsers()); // register sound parser - this.packManager.registerConfigSectionParser(this.soundManager); - this.packManager.registerConfigSectionParser(this.soundManager.jukeboxSongManager()); + this.packManager.registerConfigSectionParsers(this.soundManager.parsers()); // register vanilla loot parser this.packManager.registerConfigSectionParser(this.vanillaLootManager.parser()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java index 5b7560860..29f0d36da 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java @@ -2,13 +2,11 @@ package net.momirealms.craftengine.core.plugin.config.template; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; -import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.PreConditions; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java index 6e28cbc74..112abbb25 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.plugin.gui.category; import dev.dejvokep.boostedyaml.block.implementation.Section; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.recipe.Recipe; -import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.plugin.Reloadable; import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java index 26a55876f..88621064b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java @@ -1,66 +1,48 @@ package net.momirealms.craftengine.core.sound; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.sound.song.JukeboxSongManager; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; import java.nio.file.Path; import java.util.*; public abstract class AbstractSoundManager implements SoundManager { protected final CraftEngine plugin; - protected final Map byId; - protected final Map> byNamespace; - protected final JukeboxSongManager jukeboxSongManager; + protected final Map byId = new HashMap<>(); + protected final Map> byNamespace = new HashMap<>(); + protected final Map songs = new HashMap<>(); + protected final SoundParser soundParser; + protected final SongParser songParser; public AbstractSoundManager(CraftEngine plugin) { this.plugin = plugin; - this.jukeboxSongManager = createJukeboxSongManager(); - this.byId = new HashMap<>(); - this.byNamespace = new HashMap<>(); + this.soundParser = new SoundParser(); + this.songParser = new SongParser(); } - protected abstract JukeboxSongManager createJukeboxSongManager(); + @Override + public ConfigSectionParser[] parsers() { + return new ConfigSectionParser[] { this.soundParser, this.songParser }; + } @Override public void unload() { this.byId.clear(); this.byNamespace.clear(); - this.jukeboxSongManager.unload(); - } - - @Override - public void load() { - this.jukeboxSongManager.load(); } @Override public void delayedLoad() { - this.jukeboxSongManager.delayedLoad(); - } - - @Override - public void parseSection(Pack pack, Path path, Key id, Map section) { - if (this.byId.containsKey(id)) { - this.plugin.logger().warn(path, "Sound " + id + " already exists"); - return; - } - boolean replace = (boolean) section.getOrDefault("replace", false); - String subtitle = (String) section.get("subtitle"); - List soundList = (List) section.get("sounds"); - List sounds = new ArrayList<>(); - for (Object sound : soundList) { - if (sound instanceof String soundPath) { - sounds.add(Sound.path(soundPath)); - } else if (sound instanceof Map map) { - sounds.add(Sound.SoundFile.fromMap(MiscUtils.castToMap(map, false))); - } - } - SoundEvent event = new SoundEvent(id, replace, subtitle, sounds); - this.byId.put(id, event); - this.byNamespace.computeIfAbsent(id.namespace(), k -> new ArrayList<>()).add(event); + if (!VersionHelper.isVersionNewerThan1_21()) return; + this.registerSongs(this.songs); } @Override @@ -72,8 +54,73 @@ public abstract class AbstractSoundManager implements SoundManager { return Collections.unmodifiableMap(this.byNamespace); } - @Override - public JukeboxSongManager jukeboxSongManager() { - return this.jukeboxSongManager; + protected abstract void registerSongs(Map songs); + + public class SongParser implements ConfigSectionParser { + public static final String[] CONFIG_SECTION_NAME = new String[] {"jukebox_songs", "song", "songs", "jukebox", "jukebox_song"}; + + @Override + public int loadingSequence() { + return LoadingSequence.JUKEBOX_SONG; + } + + @Override + public String[] sectionId() { + return CONFIG_SECTION_NAME; + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + if (AbstractSoundManager.this.songs.containsKey(id)) { + TranslationManager.instance().log("warning.config.jukebox_song.duplicated", path.toString(), id.toString()); + return; + } + String sound = (String) section.get("sound"); + if (sound == null) { + AbstractSoundManager.this.plugin.logger().warn(path, "No sound specified"); + return; + } + Component description = AdventureHelper.miniMessage(section.getOrDefault("description", "").toString()); + float length = MiscUtils.getAsFloat(section.get("length")); + int comparatorOutput = MiscUtils.getAsInt(section.getOrDefault("comparator-output", 15)); + JukeboxSong song = new JukeboxSong(Key.of(sound), description, length, comparatorOutput, MiscUtils.getAsFloat(section.getOrDefault("range", 32f))); + AbstractSoundManager.this.songs.put(id, song); + } + } + + public class SoundParser implements ConfigSectionParser { + public static final String[] CONFIG_SECTION_NAME = new String[] {"sounds", "sound"}; + + @Override + public int loadingSequence() { + return LoadingSequence.SOUND; + } + + @Override + public String[] sectionId() { + return CONFIG_SECTION_NAME; + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + if (AbstractSoundManager.this.byId.containsKey(id)) { + TranslationManager.instance().log("warning.config.sound.duplicated", path.toString(), id.toString()); + return; + } + boolean replace = (boolean) section.getOrDefault("replace", false); + String subtitle = (String) section.get("subtitle"); + List soundList = (List) section.get("sounds"); + List sounds = new ArrayList<>(); + for (Object sound : soundList) { + if (sound instanceof String soundPath) { + sounds.add(Sound.path(soundPath)); + } else if (sound instanceof Map map) { + sounds.add(Sound.SoundFile.fromMap(MiscUtils.castToMap(map, false))); + } + } + SoundEvent event = new SoundEvent(id, replace, subtitle, sounds); + AbstractSoundManager.this.byId.put(id, event); + AbstractSoundManager.this.byNamespace.computeIfAbsent(id.namespace(), k -> new ArrayList<>()).add(event); + } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSong.java b/core/src/main/java/net/momirealms/craftengine/core/sound/JukeboxSong.java similarity index 80% rename from core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSong.java rename to core/src/main/java/net/momirealms/craftengine/core/sound/JukeboxSong.java index b9ff3a313..48c0b1816 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSong.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/JukeboxSong.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.sound.song; +package net.momirealms.craftengine.core.sound; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java index 56aceec51..97c81ff31 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java @@ -1,27 +1,14 @@ package net.momirealms.craftengine.core.sound; -import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.plugin.Reloadable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; -import net.momirealms.craftengine.core.sound.song.JukeboxSongManager; import net.momirealms.craftengine.core.util.Key; import java.util.Map; -public interface SoundManager extends Reloadable, ConfigSectionParser { - String[] CONFIG_SECTION_NAME = new String[] {"sounds", "sound"}; +public interface SoundManager extends Reloadable { + + ConfigSectionParser[] parsers(); Map sounds(); - - JukeboxSongManager jukeboxSongManager(); - - @Override - default int loadingSequence() { - return LoadingSequence.SOUND; - } - - @Override - default String[] sectionId() { - return CONFIG_SECTION_NAME; - } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java deleted file mode 100644 index c78682f3d..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.momirealms.craftengine.core.sound.song; - -import net.kyori.adventure.text.Component; -import net.momirealms.craftengine.core.pack.Pack; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.AdventureHelper; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.VersionHelper; - -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - -public abstract class AbstractJukeboxSongManager implements JukeboxSongManager { - protected final Map songs = new HashMap<>(); - protected CraftEngine plugin; - - public AbstractJukeboxSongManager(CraftEngine plugin) { - this.plugin = plugin; - } - - @Override - public void unload() { - this.songs.clear(); - } - - @Override - public void delayedLoad() { - if (!VersionHelper.isVersionNewerThan1_21()) return; - this.registerSongs(this.songs); - } - - @Override - public void parseSection(Pack pack, Path path, Key id, Map section) { - if (this.songs.containsKey(id)) { - this.plugin.logger().warn("Duplicate song id: " + id); - return; - } - String sound = (String) section.get("sound"); - if (sound == null) { - this.plugin.logger().warn(path, "No sound specified"); - return; - } - Component description = AdventureHelper.miniMessage(section.getOrDefault("description", "").toString()); - float length = MiscUtils.getAsFloat(section.get("length")); - int comparatorOutput = MiscUtils.getAsInt(section.getOrDefault("comparator-output", 15)); - JukeboxSong song = new JukeboxSong(Key.of(sound), description, length, comparatorOutput, MiscUtils.getAsFloat(section.getOrDefault("range", 32f))); - this.songs.put(id, song); - } - - protected abstract void registerSongs(Map songs); -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java deleted file mode 100644 index 25d6ca26b..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.momirealms.craftengine.core.sound.song; - -import net.momirealms.craftengine.core.pack.LoadingSequence; -import net.momirealms.craftengine.core.plugin.Reloadable; -import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; - -public interface JukeboxSongManager extends Reloadable, ConfigSectionParser { - String[] CONFIG_SECTION_NAME = new String[] {"jukebox_songs", "song", "songs", "jukebox", "jukebox_song"}; - - @Override - default int loadingSequence() { - return LoadingSequence.JUKEBOX_SONG; - } - - @Override - default String[] sectionId() { - return CONFIG_SECTION_NAME; - } -}