From 8b50a729b8dd7b491dd4eeac2424205c20e620a4 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sat, 12 Apr 2025 03:01:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E6=A4=8Dcloth=20config=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +- .../java/com/atsuishio/superbwarfare/Mod.java | 9 ++- .../superbwarfare/client/ClickHandler.java | 19 ++++-- .../superbwarfare/compat/CompatHolder.java | 18 +++--- .../compat/clothconfig/ClothConfigHelper.java | 42 +++++++++++++ .../client/DisplayClothConfig.java | 62 +++++++++++++++++++ .../client/KillMessageClothConfig.java | 32 ++++++++++ .../clothconfig/client/ReloadClothConfig.java | 21 +++++++ .../client/VehicleControlClothConfig.java | 24 +++++++ .../common/GameplayClothConfig.java | 38 ++++++++++++ 10 files changed, 252 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/ClothConfigHelper.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/DisplayClothConfig.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/KillMessageClothConfig.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/ReloadClothConfig.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/VehicleControlClothConfig.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/common/GameplayClothConfig.java diff --git a/build.gradle b/build.gradle index 9e57eb177..0b4da38d2 100644 --- a/build.gradle +++ b/build.gradle @@ -133,9 +133,9 @@ dependencies { runtimeOnly "mezz.jei:jei-${minecraft_version}-neoforge:${jei_version}" implementation "curse.maven:jade-324717:6291517" -// // Cloth Config相关 -// implementation fg.deobf("me.shedaniel.cloth:cloth-config-forge:${cloth_config_version}") -// + // Cloth Config相关 + implementation "me.shedaniel.cloth:cloth-config-neoforge:15.0.140" + // // 测试用mod // implementation fg.deobf("curse.maven:oculus-581495:6020952") // implementation fg.deobf("curse.maven:embeddium-908741:5681725") diff --git a/src/main/java/com/atsuishio/superbwarfare/Mod.java b/src/main/java/com/atsuishio/superbwarfare/Mod.java index 71cbb21fe..11f9709c4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/Mod.java +++ b/src/main/java/com/atsuishio/superbwarfare/Mod.java @@ -1,6 +1,8 @@ package com.atsuishio.superbwarfare; import com.atsuishio.superbwarfare.client.MouseMovementHandler; +import com.atsuishio.superbwarfare.compat.CompatHolder; +import com.atsuishio.superbwarfare.compat.clothconfig.ClothConfigHelper; import com.atsuishio.superbwarfare.component.ModDataComponents; import com.atsuishio.superbwarfare.config.ClientConfig; import com.atsuishio.superbwarfare.config.CommonConfig; @@ -8,11 +10,13 @@ import com.atsuishio.superbwarfare.config.ServerConfig; import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.network.NetworkRegistry; import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.tick.ServerTickEvent; @@ -58,12 +62,15 @@ public class Mod { ModCriteriaTriggers.REGISTRY.register(bus); ModAttachments.ATTACHMENT_TYPES.register(bus); -// bus.addListener(this::onCommonSetup); bus.addListener(this::onClientSetup); bus.addListener(ModItems::registerDispenserBehavior); bus.addListener(NetworkRegistry::register); + if (FMLEnvironment.dist == Dist.CLIENT) { + CompatHolder.hasMod(CompatHolder.CLOTH_CONFIG, ClothConfigHelper::registerScreen); + } + NeoForge.EVENT_BUS.register(this); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index ac211ce8e..3f626b6a9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -1,5 +1,7 @@ package com.atsuishio.superbwarfare.client; +import com.atsuishio.superbwarfare.compat.CompatHolder; +import com.atsuishio.superbwarfare.compat.clothconfig.ClothConfigHelper; import com.atsuishio.superbwarfare.config.client.ReloadConfig; import com.atsuishio.superbwarfare.entity.MortarEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; @@ -15,6 +17,7 @@ import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.SeekTool; import com.atsuishio.superbwarfare.tools.TraceTool; import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.component.DataComponents; @@ -29,6 +32,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModList; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.InputEvent; import net.neoforged.neoforge.client.settings.KeyConflictContext; @@ -204,10 +208,9 @@ public class ClickHandler { } } - // TODO do we need cloth config? -// if (key == ModKeyMappings.CONFIG.getKey().getValue() && ModKeyMappings.CONFIG.getKeyModifier().isActive(KeyConflictContext.IN_GAME)) { -// handleConfigScreen(player); -// } + if (key == ModKeyMappings.CONFIG.getKey().getValue() && ModKeyMappings.CONFIG.getKeyModifier().isActive(KeyConflictContext.IN_GAME)) { + handleConfigScreen(player); + } if (key == ModKeyMappings.RELOAD.getKey().getValue()) { ClientEventHandler.burstFireAmount = 0; @@ -423,6 +426,14 @@ public class ClickHandler { } } + private static void handleConfigScreen(Player player) { + if (ModList.get().isLoaded(CompatHolder.CLOTH_CONFIG)) { + CompatHolder.hasMod(CompatHolder.CLOTH_CONFIG, () -> Minecraft.getInstance().setScreen(ClothConfigHelper.getConfigScreen(null))); + } else { + player.displayClientMessage(Component.translatable("tips.superbwarfare.no_cloth_config").withStyle(ChatFormatting.RED), true); + } + } + private static void handleDismountPress(Player player) { var vehicle = player.getVehicle(); if (!(vehicle instanceof VehicleEntity)) return; diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/CompatHolder.java b/src/main/java/com/atsuishio/superbwarfare/compat/CompatHolder.java index 6a9f45c27..f65dfc5fc 100644 --- a/src/main/java/com/atsuishio/superbwarfare/compat/CompatHolder.java +++ b/src/main/java/com/atsuishio/superbwarfare/compat/CompatHolder.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.compat; -//@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) +import net.neoforged.fml.ModList; + public class CompatHolder { public static final String DMV = "dreamaticvoyage"; @@ -16,14 +17,9 @@ public class CompatHolder { // @ObjectHolder(registryName = "minecraft:entity_type", value = VRC + ":rain_shower_butterfly") // public static final EntityType VRC_RAIN_SHOWER_BUTTERFLY = null; -// @SubscribeEvent -// public static void onInterModEnqueue(final InterModEnqueueEvent event) { -// event.enqueueWork(() -> hasMod(CLOTH_CONFIG, () -> DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> ClothConfigHelper::registerScreen))); -// } - -// public static void hasMod(String modid, Runnable runnable) { -// if (ModList.get().isLoaded(modid)) { -// runnable.run(); -// } -// } + public static void hasMod(String modid, Runnable runnable) { + if (ModList.get().isLoaded(modid)) { + runnable.run(); + } + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/ClothConfigHelper.java b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/ClothConfigHelper.java new file mode 100644 index 000000000..00b0a61d2 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/ClothConfigHelper.java @@ -0,0 +1,42 @@ +package com.atsuishio.superbwarfare.compat.clothconfig; + +import com.atsuishio.superbwarfare.compat.clothconfig.client.DisplayClothConfig; +import com.atsuishio.superbwarfare.compat.clothconfig.client.KillMessageClothConfig; +import com.atsuishio.superbwarfare.compat.clothconfig.client.ReloadClothConfig; +import com.atsuishio.superbwarfare.compat.clothconfig.client.VehicleControlClothConfig; +import com.atsuishio.superbwarfare.compat.clothconfig.common.GameplayClothConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import org.jetbrains.annotations.Nullable; + +public class ClothConfigHelper { + + public static ConfigBuilder getConfigBuilder() { + ConfigBuilder root = ConfigBuilder.create().setTitle(Component.translatable("config.superbwarfare.title")); + root.setGlobalized(true); + root.setGlobalizedExpanded(false); + ConfigEntryBuilder entryBuilder = root.entryBuilder(); + + ReloadClothConfig.init(root, entryBuilder); + KillMessageClothConfig.init(root, entryBuilder); + DisplayClothConfig.init(root, entryBuilder); + VehicleControlClothConfig.init(root, entryBuilder); + + GameplayClothConfig.init(root, entryBuilder); + + return root; + } + + public static void registerScreen() { + ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory.class, () -> + (client, parent) -> getConfigScreen(parent)); + } + + public static Screen getConfigScreen(@Nullable Screen parent) { + return ClothConfigHelper.getConfigBuilder().setParentScreen(parent).build(); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/DisplayClothConfig.java b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/DisplayClothConfig.java new file mode 100644 index 000000000..7ab83abb2 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/DisplayClothConfig.java @@ -0,0 +1,62 @@ +package com.atsuishio.superbwarfare.compat.clothconfig.client; + +import com.atsuishio.superbwarfare.config.client.DisplayConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.network.chat.Component; + +public class DisplayClothConfig { + + public static void init(ConfigBuilder root, ConfigEntryBuilder entryBuilder) { + ConfigCategory category = root.getOrCreateCategory(Component.translatable("config.superbwarfare.client.display")); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.display.kill_indication"), DisplayConfig.KILL_INDICATION.get()) + .setDefaultValue(true) + .setSaveConsumer(DisplayConfig.KILL_INDICATION::set) + .setTooltip(Component.translatable("config.superbwarfare.client.display.kill_indication.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.display.ammo_hud"), DisplayConfig.AMMO_HUD.get()) + .setDefaultValue(true) + .setSaveConsumer(DisplayConfig.AMMO_HUD::set) + .setTooltip(Component.translatable("config.superbwarfare.client.display.ammo_hud.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.display.float_cross_hair"), DisplayConfig.FLOAT_CROSS_HAIR.get()) + .setDefaultValue(true) + .setSaveConsumer(DisplayConfig.FLOAT_CROSS_HAIR::set) + .setTooltip(Component.translatable("config.superbwarfare.client.display.float_cross_hair.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.display.camera_rotate"), DisplayConfig.CAMERA_ROTATE.get()) + .setDefaultValue(true) + .setSaveConsumer(DisplayConfig.CAMERA_ROTATE::set) + .setTooltip(Component.translatable("config.superbwarfare.client.display.camera_rotate.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.display.armor_plate_hud"), DisplayConfig.ARMOR_PLATE_HUD.get()) + .setDefaultValue(true) + .setSaveConsumer(DisplayConfig.ARMOR_PLATE_HUD::set) + .setTooltip(Component.translatable("config.superbwarfare.client.display.armor_plate_hud.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.display.stamina_hud"), DisplayConfig.STAMINA_HUD.get()) + .setDefaultValue(true) + .setSaveConsumer(DisplayConfig.STAMINA_HUD::set) + .setTooltip(Component.translatable("config.superbwarfare.client.display.stamina_hud.des")) + .build() + ); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/KillMessageClothConfig.java b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/KillMessageClothConfig.java new file mode 100644 index 000000000..5503eddcf --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/KillMessageClothConfig.java @@ -0,0 +1,32 @@ +package com.atsuishio.superbwarfare.compat.clothconfig.client; + +import com.atsuishio.superbwarfare.config.client.KillMessageConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.network.chat.Component; + +public class KillMessageClothConfig { + + public static void init(ConfigBuilder root, ConfigEntryBuilder entryBuilder) { + ConfigCategory category = root.getOrCreateCategory(Component.translatable("config.superbwarfare.client.kill_message")); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.kill_message.show_kill_message"), KillMessageConfig.SHOW_KILL_MESSAGE.get()) + .setDefaultValue(false) + .setSaveConsumer(KillMessageConfig.SHOW_KILL_MESSAGE::set) + .setTooltip(Component.translatable("config.superbwarfare.client.kill_message.show_kill_message.des")) + .build() + ); + + category.addEntry(entryBuilder + .startIntField(Component.translatable("config.superbwarfare.client.kill_message.kill_message_count"), KillMessageConfig.KILL_MESSAGE_COUNT.get()) + .setDefaultValue(5) + .setMin(1) + .setMax(20) + .setSaveConsumer(KillMessageConfig.KILL_MESSAGE_COUNT::set) + .setTooltip(Component.translatable("config.superbwarfare.client.kill_message.kill_message_count.des")) + .build() + ); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/ReloadClothConfig.java b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/ReloadClothConfig.java new file mode 100644 index 000000000..3f309d2ee --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/ReloadClothConfig.java @@ -0,0 +1,21 @@ +package com.atsuishio.superbwarfare.compat.clothconfig.client; + +import com.atsuishio.superbwarfare.config.client.ReloadConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.network.chat.Component; + +public class ReloadClothConfig { + + public static void init(ConfigBuilder root, ConfigEntryBuilder entryBuilder) { + ConfigCategory category = root.getOrCreateCategory(Component.translatable("config.superbwarfare.client.reload")); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.reload.left_click_reload"), ReloadConfig.LEFT_CLICK_RELOAD.get()) + .setDefaultValue(true) + .setSaveConsumer(ReloadConfig.LEFT_CLICK_RELOAD::set) + .setTooltip(Component.translatable("config.superbwarfare.client.reload.left_click_reload.des")).build() + ); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/VehicleControlClothConfig.java b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/VehicleControlClothConfig.java new file mode 100644 index 000000000..e6238b380 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/client/VehicleControlClothConfig.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.compat.clothconfig.client; + +import com.atsuishio.superbwarfare.config.client.VehicleControlConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.network.chat.Component; + +public class VehicleControlClothConfig { + + + public static void init(ConfigBuilder root, ConfigEntryBuilder entryBuilder) { + ConfigCategory category = root.getOrCreateCategory(Component.translatable("config.superbwarfare.client.vehicle")); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.client.vehicle.invert_aircraft_control"), VehicleControlConfig.INVERT_AIRCRAFT_CONTROL.get()) + .setDefaultValue(true) + .setSaveConsumer(VehicleControlConfig.INVERT_AIRCRAFT_CONTROL::set) + .setTooltip(Component.translatable("config.superbwarfare.client.vehicle.left_click_reload.des")).build() + ); + } + + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/common/GameplayClothConfig.java b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/common/GameplayClothConfig.java new file mode 100644 index 000000000..a342ce01b --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/compat/clothconfig/common/GameplayClothConfig.java @@ -0,0 +1,38 @@ +package com.atsuishio.superbwarfare.compat.clothconfig.common; + +import com.atsuishio.superbwarfare.config.common.GameplayConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.network.chat.Component; + +public class GameplayClothConfig { + + public static void init(ConfigBuilder root, ConfigEntryBuilder entryBuilder) { + ConfigCategory category = root.getOrCreateCategory(Component.translatable("config.superbwarfare.common.gameplay")); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.common.gameplay.respawn_reload"), GameplayConfig.RESPAWN_RELOAD.get()) + .setDefaultValue(true) + .setSaveConsumer(GameplayConfig.RESPAWN_RELOAD::set) + .setTooltip(Component.translatable("config.superbwarfare.common.gameplay.respawn_reload.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.common.gameplay.global_indication"), GameplayConfig.GLOBAL_INDICATION.get()) + .setDefaultValue(false) + .setSaveConsumer(GameplayConfig.GLOBAL_INDICATION::set) + .setTooltip(Component.translatable("config.superbwarfare.common.gameplay.global_indication.des")) + .build() + ); + + category.addEntry(entryBuilder + .startBooleanToggle(Component.translatable("config.superbwarfare.common.gameplay.respawn_auto_armor"), GameplayConfig.RESPAWN_AUTO_ARMOR.get()) + .setDefaultValue(true) + .setSaveConsumer(GameplayConfig.RESPAWN_AUTO_ARMOR::set) + .setTooltip(Component.translatable("config.superbwarfare.common.gameplay.respawn_auto_armor.des")) + .build() + ); + } +}