From 58d9f23431e673bdd94ea1ac9ae6e4b92e786013 Mon Sep 17 00:00:00 2001 From: IAFEnvoy Date: Thu, 9 Jan 2025 14:05:45 +0800 Subject: [PATCH] update ardoni name loading logic --- .../main/java/com/iafenvoy/sow/Constants.java | 5 +-- .../main/java/com/iafenvoy/sow/Proxies.java | 10 ++++++ .../java/com/iafenvoy/sow/SongsOfWar.java | 7 +--- .../com/iafenvoy/sow/SongsOfWarClient.java | 12 ++++--- .../com/iafenvoy/sow/data/ArdoniName.java | 33 +++++++++++-------- .../iafenvoy/sow/data/ArdoniNameProxy.java | 17 ++++++++++ .../com/iafenvoy/sow/data/ArdoniType.java | 7 ++-- .../entity/ardoni/random/ArdoniEntity.java | 18 +++++++--- .../sow/item/block/AbstractSongCubeBlock.java | 4 +-- .../entity/AbstractSongCubeBlockEntity.java | 4 +-- .../sow/render/util/GeneratorReloader.java | 7 +++- .../sound/ServerSongCubeSoundManager.java | 20 ----------- .../sow/world/sound/SongCubeSoundManager.java | 16 +++++++++ .../sow/ardoni_name/en_us.txt | 0 .../sow/ardoni_name/zh_cn.txt | 0 .../main/resources/assets/sow/lang/en_us.json | 5 +++ .../main/resources/assets/sow/lang/zh_cn.json | 5 +++ gradle.properties | 2 +- 18 files changed, 111 insertions(+), 61 deletions(-) create mode 100644 common/src/main/java/com/iafenvoy/sow/Proxies.java create mode 100644 common/src/main/java/com/iafenvoy/sow/data/ArdoniNameProxy.java delete mode 100644 common/src/main/java/com/iafenvoy/sow/world/sound/ServerSongCubeSoundManager.java rename common/src/main/resources/{data => assets}/sow/ardoni_name/en_us.txt (100%) rename common/src/main/resources/{data => assets}/sow/ardoni_name/zh_cn.txt (100%) diff --git a/common/src/main/java/com/iafenvoy/sow/Constants.java b/common/src/main/java/com/iafenvoy/sow/Constants.java index 3c3714c..64f3f83 100644 --- a/common/src/main/java/com/iafenvoy/sow/Constants.java +++ b/common/src/main/java/com/iafenvoy/sow/Constants.java @@ -1,16 +1,13 @@ package com.iafenvoy.sow; -import com.iafenvoy.sow.world.sound.ServerSongCubeSoundManager; -import com.iafenvoy.sow.world.sound.SongCubeSoundManager; import net.minecraft.util.Identifier; import java.util.UUID; -public class Constants { +public final class Constants { public static final Identifier BEACON_TELEPORT = Identifier.of(SongsOfWar.MOD_ID, "beacon_teleport"); public static final Identifier POWER_KEYBINDING_SYNC = Identifier.of(SongsOfWar.MOD_ID, "keybinding_sync"); public static final Identifier JUMP_PRESS = Identifier.of(SongsOfWar.MOD_ID, "jump_press"); public static final UUID PROTESPHERE_UUID = UUID.fromString("babda2da-13e9-4096-baba-933bb695e319"); public static final UUID MOBILIGLIDE_UUID = UUID.fromString("3db28b1d-3fec-4a31-9f50-6c04f30e33f1"); - public static SongCubeSoundManager songCubeSoundManager = ServerSongCubeSoundManager.INSTANCE; } diff --git a/common/src/main/java/com/iafenvoy/sow/Proxies.java b/common/src/main/java/com/iafenvoy/sow/Proxies.java new file mode 100644 index 0000000..be820cc --- /dev/null +++ b/common/src/main/java/com/iafenvoy/sow/Proxies.java @@ -0,0 +1,10 @@ +package com.iafenvoy.sow; + +import com.iafenvoy.sow.data.ArdoniNameProxy; +import com.iafenvoy.sow.world.sound.SongCubeSoundManager; + +public final class Proxies { + public static SongCubeSoundManager songCubeSoundManager = SongCubeSoundManager.Empty.INSTANCE; + public static ArdoniNameProxy ardoniNameProxy = ArdoniNameProxy.Empty.INSTANCE; + +} diff --git a/common/src/main/java/com/iafenvoy/sow/SongsOfWar.java b/common/src/main/java/com/iafenvoy/sow/SongsOfWar.java index 4b38dc5..932c7e1 100644 --- a/common/src/main/java/com/iafenvoy/sow/SongsOfWar.java +++ b/common/src/main/java/com/iafenvoy/sow/SongsOfWar.java @@ -3,7 +3,6 @@ import com.iafenvoy.jupiter.ConfigManager; import com.iafenvoy.jupiter.ServerConfigManager; import com.iafenvoy.sow.config.SowConfig; -import com.iafenvoy.sow.data.ArdoniName; import com.iafenvoy.sow.data.BeaconData; import com.iafenvoy.sow.item.block.entity.WallsOfTimeBlockEntity; import com.iafenvoy.sow.network.ServerNetworkHelper; @@ -12,15 +11,12 @@ import com.mojang.logging.LogUtils; import dev.architectury.event.EventResult; import dev.architectury.event.events.common.BlockEvent; -import dev.architectury.registry.ReloadListenerRegistry; import net.minecraft.block.Blocks; -import net.minecraft.resource.ResourceType; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; import org.slf4j.Logger; -public class SongsOfWar { +public final class SongsOfWar { public static final String MOD_ID = "sow"; public static final Logger LOGGER = LogUtils.getLogger(); @@ -58,7 +54,6 @@ else if (world.getBlockEntity(pos) instanceof WallsOfTimeBlockEntity blockEntity } return EventResult.pass(); }); - ReloadListenerRegistry.register(ResourceType.SERVER_DATA, new ArdoniName(), Identifier.of(MOD_ID, "ardoni_name")); ServerNetworkHelper.init(); } } diff --git a/common/src/main/java/com/iafenvoy/sow/SongsOfWarClient.java b/common/src/main/java/com/iafenvoy/sow/SongsOfWarClient.java index aad38ea..8690d5e 100644 --- a/common/src/main/java/com/iafenvoy/sow/SongsOfWarClient.java +++ b/common/src/main/java/com/iafenvoy/sow/SongsOfWarClient.java @@ -1,6 +1,7 @@ package com.iafenvoy.sow; import com.iafenvoy.sow.compat.LitematicaHelper; +import com.iafenvoy.sow.data.ArdoniName; import com.iafenvoy.sow.network.ClientNetworkHelper; import com.iafenvoy.sow.registry.SowKeybindings; import com.iafenvoy.sow.registry.SowRenderers; @@ -14,7 +15,7 @@ import net.minecraft.util.Identifier; @Environment(EnvType.CLIENT) -public class SongsOfWarClient { +public final class SongsOfWarClient { public static void init() { SowKeybindings.init(); SowRenderers.registerEntityRenderers(); @@ -22,13 +23,16 @@ public static void init() { } public static void process() { + Proxies.songCubeSoundManager = ClientSongCubeSoundManager.INSTANCE; + Proxies.ardoniNameProxy = ArdoniName.INSTANCE; + SowRenderers.registerSkull(); SowRenderers.registerBlockEntityRenderer(); SowRenderers.registerRenderType(); SowRenderers.registerModelPredicate(); - Constants.songCubeSoundManager = ClientSongCubeSoundManager.INSTANCE; - ClientTickEvent.CLIENT_POST.register(client -> Constants.songCubeSoundManager.tick()); - ReloadListenerRegistry.register(ResourceType.CLIENT_RESOURCES, new GeneratorReloader(), Identifier.of(SongsOfWar.MOD_ID, "ardoni_marker")); + ClientTickEvent.CLIENT_POST.register(client -> Proxies.songCubeSoundManager.tick()); + ReloadListenerRegistry.register(ResourceType.CLIENT_RESOURCES, GeneratorReloader.INSTANCE, Identifier.of(SongsOfWar.MOD_ID, "generator")); + ReloadListenerRegistry.register(ResourceType.CLIENT_RESOURCES, ArdoniName.INSTANCE, Identifier.of(SongsOfWar.MOD_ID, "ardoni_name")); LitematicaHelper.extractFile(); ClientNetworkHelper.init(); } diff --git a/common/src/main/java/com/iafenvoy/sow/data/ArdoniName.java b/common/src/main/java/com/iafenvoy/sow/data/ArdoniName.java index c38b94b..7c13696 100644 --- a/common/src/main/java/com/iafenvoy/sow/data/ArdoniName.java +++ b/common/src/main/java/com/iafenvoy/sow/data/ArdoniName.java @@ -1,33 +1,36 @@ package com.iafenvoy.sow.data; -import com.iafenvoy.neptune.util.RandomHelper; import com.iafenvoy.sow.SongsOfWar; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.SynchronousResourceReloader; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; -public class ArdoniName implements SynchronousResourceReloader { +@Environment(EnvType.CLIENT) +public enum ArdoniName implements SynchronousResourceReloader, ArdoniNameProxy { + INSTANCE; private static final List NAMES = new ArrayList<>(); - public static String randomName() throws UnsupportedOperationException { - try { - return RandomHelper.randomOne(NAMES); - } catch (Exception e) { - throw new UnsupportedOperationException("Cannot random an ardoni name.", e); - } - } - @Override public void reload(ResourceManager manager) { NAMES.clear(); -// String language = MinecraftClient.getInstance().options.language.toLowerCase(Locale.ROOT); - Identifier file = Identifier.of(SongsOfWar.MOD_ID, "ardoni_name/en_us.txt"); + load(manager, MinecraftClient.getInstance().options.language.toLowerCase(Locale.ROOT)); + if (NAMES.isEmpty()) load(manager, "en_us"); + SongsOfWar.LOGGER.info("Successfully loaded {} ardoni name(s),", NAMES.size()); + } + + private static void load(ResourceManager manager, String language) { + Identifier file = Identifier.of(SongsOfWar.MOD_ID, "ardoni_name/%s.txt".formatted(language)); for (Resource resource : manager.getAllResources(file)) try { BufferedReader reader = resource.getReader(); @@ -36,6 +39,10 @@ public void reload(ResourceManager manager) { } catch (IOException e) { throw new RuntimeException(e); } - SongsOfWar.LOGGER.info("Successfully loaded {} ardoni name(s),", NAMES.size()); + } + + @Override + public @NotNull String getNameBySeed(long seed) throws UnsupportedOperationException { + return NAMES.get((int) (seed % NAMES.size())); } } diff --git a/common/src/main/java/com/iafenvoy/sow/data/ArdoniNameProxy.java b/common/src/main/java/com/iafenvoy/sow/data/ArdoniNameProxy.java new file mode 100644 index 0000000..d7359d3 --- /dev/null +++ b/common/src/main/java/com/iafenvoy/sow/data/ArdoniNameProxy.java @@ -0,0 +1,17 @@ +package com.iafenvoy.sow.data; + +import org.jetbrains.annotations.NotNull; + +public interface ArdoniNameProxy { + @NotNull + String getNameBySeed(long seed) throws UnsupportedOperationException; + + enum Empty implements ArdoniNameProxy { + INSTANCE; + + @Override + public @NotNull String getNameBySeed(long seed) throws UnsupportedOperationException { + return ""; + } + } +} diff --git a/common/src/main/java/com/iafenvoy/sow/data/ArdoniType.java b/common/src/main/java/com/iafenvoy/sow/data/ArdoniType.java index 3159c31..021248c 100644 --- a/common/src/main/java/com/iafenvoy/sow/data/ArdoniType.java +++ b/common/src/main/java/com/iafenvoy/sow/data/ArdoniType.java @@ -6,6 +6,7 @@ import dev.architectury.registry.registries.RegistrySupplier; import net.minecraft.entity.EntityType; import net.minecraft.entity.mob.MobEntity; +import net.minecraft.text.Text; import java.util.*; @@ -41,9 +42,9 @@ public SowSpawnEggItem createSpawnEgg(RegistrySupplier getMarkerTextureId() { return Optional.empty(); } + @Override + protected Text getDefaultName() { + String random = Proxies.ardoniNameProxy.getNameBySeed(this.getMarkerSeed()); + if (!random.isBlank()) return this.getArdoniType().formatName(random); + return super.getDefaultName(); + } + + @Override + public boolean hasCustomName() { + return true; + } + @Override public Color4i getColor() { if (this.hasCustomName() && this.getName().getString().equals("jeb_")) @@ -86,9 +97,6 @@ public void readCustomDataFromNbt(NbtCompound nbt) { public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData, @Nullable NbtCompound entityNbt) { EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityNbt); this.setDefaultData(); - if (this.getArdoniType() == ArdoniType.NONE) this.setCustomName(Text.literal(ArdoniName.randomName())); - else - this.setCustomName(Text.literal(String.format("%s %s", ArdoniName.randomName(), this.getArdoniType().getFormattedName()))); return data; } diff --git a/common/src/main/java/com/iafenvoy/sow/item/block/AbstractSongCubeBlock.java b/common/src/main/java/com/iafenvoy/sow/item/block/AbstractSongCubeBlock.java index d03f7eb..5400339 100644 --- a/common/src/main/java/com/iafenvoy/sow/item/block/AbstractSongCubeBlock.java +++ b/common/src/main/java/com/iafenvoy/sow/item/block/AbstractSongCubeBlock.java @@ -1,6 +1,6 @@ package com.iafenvoy.sow.item.block; -import com.iafenvoy.sow.Constants; +import com.iafenvoy.sow.Proxies; import com.iafenvoy.sow.item.block.entity.AbstractSongCubeBlockEntity; import com.iafenvoy.sow.power.PowerCategory; import com.iafenvoy.sow.power.type.AbstractSongPower; @@ -92,7 +92,7 @@ public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { public @Nullable BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { return (world1, pos, state1, blockEntity) -> { if (blockEntity instanceof AbstractSongCubeBlockEntity songCubeBlockEntity) - Constants.songCubeSoundManager.startPlaying(pos, songCubeBlockEntity.getCategory()); + Proxies.songCubeSoundManager.startPlaying(pos, songCubeBlockEntity.getCategory()); }; } } diff --git a/common/src/main/java/com/iafenvoy/sow/item/block/entity/AbstractSongCubeBlockEntity.java b/common/src/main/java/com/iafenvoy/sow/item/block/entity/AbstractSongCubeBlockEntity.java index 07ec4a2..22601bf 100644 --- a/common/src/main/java/com/iafenvoy/sow/item/block/entity/AbstractSongCubeBlockEntity.java +++ b/common/src/main/java/com/iafenvoy/sow/item/block/entity/AbstractSongCubeBlockEntity.java @@ -1,6 +1,6 @@ package com.iafenvoy.sow.item.block.entity; -import com.iafenvoy.sow.Constants; +import com.iafenvoy.sow.Proxies; import com.iafenvoy.sow.power.PowerCategory; import com.iafenvoy.sow.power.type.AbstractSongPower; import com.iafenvoy.sow.power.type.DummySongPower; @@ -40,7 +40,7 @@ public AbstractSongPower getPower() { @Override public void markRemoved() { super.markRemoved(); - Constants.songCubeSoundManager.destroy(this.pos); + Proxies.songCubeSoundManager.destroy(this.pos); } public abstract PowerCategory getCategory(); diff --git a/common/src/main/java/com/iafenvoy/sow/render/util/GeneratorReloader.java b/common/src/main/java/com/iafenvoy/sow/render/util/GeneratorReloader.java index d57bdf5..2edc0e5 100644 --- a/common/src/main/java/com/iafenvoy/sow/render/util/GeneratorReloader.java +++ b/common/src/main/java/com/iafenvoy/sow/render/util/GeneratorReloader.java @@ -1,10 +1,15 @@ package com.iafenvoy.sow.render.util; import com.iafenvoy.sow.render.block.ArdoniGraveBlockEntityRenderer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.SynchronousResourceReloader; -public class GeneratorReloader implements SynchronousResourceReloader { +@Environment(EnvType.CLIENT) +public enum GeneratorReloader implements SynchronousResourceReloader { + INSTANCE; + @Override public void reload(ResourceManager manager) { ArdoniMarkerGenerator.resetAll(); diff --git a/common/src/main/java/com/iafenvoy/sow/world/sound/ServerSongCubeSoundManager.java b/common/src/main/java/com/iafenvoy/sow/world/sound/ServerSongCubeSoundManager.java deleted file mode 100644 index 3ef0821..0000000 --- a/common/src/main/java/com/iafenvoy/sow/world/sound/ServerSongCubeSoundManager.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iafenvoy.sow.world.sound; - -import com.iafenvoy.sow.power.PowerCategory; -import net.minecraft.util.math.BlockPos; - -public enum ServerSongCubeSoundManager implements SongCubeSoundManager { - INSTANCE; - - @Override - public void startPlaying(BlockPos pos, PowerCategory category) { - } - - @Override - public void destroy(BlockPos pos) { - } - - @Override - public void tick() { - } -} diff --git a/common/src/main/java/com/iafenvoy/sow/world/sound/SongCubeSoundManager.java b/common/src/main/java/com/iafenvoy/sow/world/sound/SongCubeSoundManager.java index 5af033b..e52f614 100644 --- a/common/src/main/java/com/iafenvoy/sow/world/sound/SongCubeSoundManager.java +++ b/common/src/main/java/com/iafenvoy/sow/world/sound/SongCubeSoundManager.java @@ -9,4 +9,20 @@ public interface SongCubeSoundManager { void destroy(BlockPos pos); void tick(); + + enum Empty implements SongCubeSoundManager { + INSTANCE; + + @Override + public void startPlaying(BlockPos pos, PowerCategory category) { + } + + @Override + public void destroy(BlockPos pos) { + } + + @Override + public void tick() { + } + } } diff --git a/common/src/main/resources/data/sow/ardoni_name/en_us.txt b/common/src/main/resources/assets/sow/ardoni_name/en_us.txt similarity index 100% rename from common/src/main/resources/data/sow/ardoni_name/en_us.txt rename to common/src/main/resources/assets/sow/ardoni_name/en_us.txt diff --git a/common/src/main/resources/data/sow/ardoni_name/zh_cn.txt b/common/src/main/resources/assets/sow/ardoni_name/zh_cn.txt similarity index 100% rename from common/src/main/resources/data/sow/ardoni_name/zh_cn.txt rename to common/src/main/resources/assets/sow/ardoni_name/zh_cn.txt diff --git a/common/src/main/resources/assets/sow/lang/en_us.json b/common/src/main/resources/assets/sow/lang/en_us.json index ada74ef..0a7b8f6 100644 --- a/common/src/main/resources/assets/sow/lang/en_us.json +++ b/common/src/main/resources/assets/sow/lang/en_us.json @@ -1,4 +1,9 @@ { + "ardoniType.sow.kaltaris": "%s Kaltaris", + "ardoniType.sow.mendoris": "%s Mendoris", + "ardoniType.sow.nestoris": "%s Nestoris", + "ardoniType.sow.sendaris": "%s Sendaris", + "ardoniType.sow.voltaris": "%s Voltaris", "banner.sow.conchord": "Conchord Banner", "banner.sow.conchord_simple": "Conchord Simple Banner", "banner.sow.crown_peak": "Crown Peak Banner", diff --git a/common/src/main/resources/assets/sow/lang/zh_cn.json b/common/src/main/resources/assets/sow/lang/zh_cn.json index 7e1e532..e4be2cb 100644 --- a/common/src/main/resources/assets/sow/lang/zh_cn.json +++ b/common/src/main/resources/assets/sow/lang/zh_cn.json @@ -1,4 +1,9 @@ { + "ardoniType.sow.kaltaris": "%s·卡尔塔里斯", + "ardoniType.sow.mendoris": "%s·门多里斯", + "ardoniType.sow.nestoris": "%s·内斯托里斯", + "ardoniType.sow.sendaris": "%s·森达里斯", + "ardoniType.sow.voltaris": "%s·伏尔塔里斯", "banner.sow.conchord": "康科德旗帜", "banner.sow.conchord_simple": "康科德简单版旗帜", "banner.sow.crown_peak": "君主峰旗帜", diff --git a/gradle.properties b/gradle.properties index 2854f73..34106cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ minecraft_version=1.20.1 enabled_platforms=fabric,forge yarn_mappings=1.20.1+build.10 archives_base_name=SongsOfWar -mod_version=0.8.2 +mod_version=0.8.3 maven_group=com.iafenvoy architectury_version=9.2.14 fabric_loader_version=0.15.11