diff --git a/src/client/java/com/bawnorton/bettertrims/client/BetterTrimsClient.java b/src/client/java/com/bawnorton/bettertrims/client/BetterTrimsClient.java index fd5c600..84dbe1a 100644 --- a/src/client/java/com/bawnorton/bettertrims/client/BetterTrimsClient.java +++ b/src/client/java/com/bawnorton/bettertrims/client/BetterTrimsClient.java @@ -5,8 +5,8 @@ import com.bawnorton.bettertrims.client.impl.YACLImpl; import com.bawnorton.bettertrims.client.networking.ClientNetworking; import com.bawnorton.bettertrims.compat.Compat; +import com.bawnorton.bettertrims.config.Config; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ConfirmScreen; import net.minecraft.client.gui.screen.Screen; @@ -19,25 +19,30 @@ import java.net.URI; public class BetterTrimsClient implements ClientModInitializer { - public static final Logger LOGGER = LoggerFactory.getLogger(BetterTrims.MOD_ID); + public static final Logger LOGGER = LoggerFactory.getLogger(BetterTrims.MOD_ID); - public static Screen getConfigScreen(Screen parent) { - if (Compat.isYaclLoaded()) { - return YACLImpl.getScreen(parent); - } else { - return new ConfirmScreen((result) -> { - if (result) { - Util.getOperatingSystem().open(URI.create("https://modrinth.com/mod/yacl/versions")); - } - MinecraftClient.getInstance().setScreen(parent); - }, Text.of("Yet Another Config Lib not installed!"), Text.of("YACL 3 is required to edit the config in game, would you like to install YACL 3?"), ScreenTexts.YES, ScreenTexts.NO); - } - } + public static Screen getConfigScreen(Screen parent) { + if (Compat.isYaclLoaded()) { + return YACLImpl.getScreen(parent); + } else { + return new ConfirmScreen((result) -> { + if (result) { + Util.getOperatingSystem().open(URI.create("https://modrinth.com/mod/yacl/versions")); + } + MinecraftClient.getInstance().setScreen(parent); + }, Text.translatable("bettertrims.yacl.not_installed"), Text.of("bettertrims.yacl.not_installed.desc"), ScreenTexts.YES, ScreenTexts.NO); + } + } - @Override - public void onInitializeClient() { - LOGGER.debug("Initializing Better Trims Client"); - ClientNetworking.init(); - EventHandler.init(); - } + public static Config getConfig() { + if (ClientNetworking.isConnectedToDedicated()) return Config.getServerInstance(); + return Config.getLocalInstance(); + } + + @Override + public void onInitializeClient() { + LOGGER.debug("Initializing Better Trims Client"); + ClientNetworking.init(); + EventHandler.init(); + } } \ No newline at end of file diff --git a/src/client/java/com/bawnorton/bettertrims/client/impl/YACLImpl.java b/src/client/java/com/bawnorton/bettertrims/client/impl/YACLImpl.java index df52ed0..f73afe1 100644 --- a/src/client/java/com/bawnorton/bettertrims/client/impl/YACLImpl.java +++ b/src/client/java/com/bawnorton/bettertrims/client/impl/YACLImpl.java @@ -2,7 +2,6 @@ import com.bawnorton.bettertrims.BetterTrims; import com.bawnorton.bettertrims.client.networking.ClientNetworking; -import com.bawnorton.bettertrims.config.Config; import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.config.option.NestedConfigOption; import com.bawnorton.bettertrims.config.option.OptionType; @@ -26,33 +25,37 @@ public static Screen getScreen(Screen parent) { return YetAnotherConfigLib.createBuilder() .title(title("main")) .category(ConfigCategory.createBuilder() - .name(category("general")) - .tooltip(tooltip("general")) - .group(OptionGroup.createBuilder() - .name(group("game")) - .description(OptionDescription.of(description("game"))) - .options(generateOptionsForType(OptionType.GAME)) - .build()) - .group(OptionGroup.createBuilder() - .name(group("vanilla")) - .description(OptionDescription.of(description("vanilla"))) - .options(generateOptionsForType(OptionType.VANILLA)) - .build()) - .group(OptionGroup.createBuilder() - .name(group("added.vanilla")) - .description(OptionDescription.of(description("added.vanilla"))) - .options(generateOptionsForType(OptionType.ADDED_VANILLA)) - .build()) - .group(OptionGroup.createBuilder() - .name(group("modded")) - .description(OptionDescription.of(description("modded"))) - .options(generateOptionsForType(OptionType.MODDED)) - .build()) - .build()) + .name(category("general")) + .tooltip(tooltip("general")) + .group(OptionGroup.createBuilder() + .name(group("game")) + .description(OptionDescription.of(description("game"))) + .options(generateOptionsForType(OptionType.GAME)) + .build()) + .group(OptionGroup.createBuilder() + .name(group("vanilla")) + .description(OptionDescription.of(description("vanilla"))) + .options(generateOptionsForType(OptionType.VANILLA)) + .build()) + .group(OptionGroup.createBuilder() + .name(group("added.vanilla")) + .description(OptionDescription.of(description("added.vanilla"))) + .options(generateOptionsForType(OptionType.ADDED_VANILLA)) + .build()) + .group(OptionGroup.createBuilder() + .name(group("modded")) + .description(OptionDescription.of(description("modded"))) + .options(generateOptionsForType(OptionType.MODDED)) + .build()) + .build()) .save(() -> { - ConfigManager.saveConfig(); boolean inWorld = MinecraftClient.getInstance().world != null; - if(inWorld) ClientNetworking.trySendConfigToServer(); + if (inWorld && ClientNetworking.isConnectedToDedicated()) { + ClientNetworking.trySendConfigToServer(); + return; + } + + ConfigManager.saveLocalConfig(); }) .build() .generateScreen(parent); @@ -60,11 +63,11 @@ public static Screen getScreen(Screen parent) { private static Collection> generateOptionsForType(OptionType type) { Collection> options = new HashSet<>(); - Reflection.forEachAnnotatedField(Config.getInstance(), field -> { - ConfigOptionReference reference = ConfigOptionReference.of(Config.getInstance(), field); - if(reference.notOf(type)) return; + Reflection.forEachAnnotatedField(ConfigManager.getConfig(), field -> { + ConfigOptionReference reference = ConfigOptionReference.of(ConfigManager.getConfig(), field); + if (reference.notOf(type)) return; - if(reference.isNested()) { + if (reference.isNested()) { options.addAll(createNestedOptions(reference, type)); } else { options.add(createOption(reference)); @@ -74,15 +77,16 @@ private static Collection> generateOptionsForType(OptionType } private static Collection> createNestedOptions(ConfigOptionReference reference, OptionType type) { - if(!reference.isNested()) throw new IllegalArgumentException("Reference \"%s\" is not nested".formatted(reference.getFormattedName())); + if (!reference.isNested()) + throw new IllegalArgumentException("Reference \"%s\" is not nested".formatted(reference.getFormattedName())); Collection> options = new ArrayList<>(); NestedConfigOption instance = reference.nestedValue(); Reflection.forEachAnnotatedField(instance, nestedField -> { ParentedConfigOptionReference parentedReference = ParentedConfigOptionReference.of(reference, instance, nestedField); - if(parentedReference.notOf(type)) return; + if (parentedReference.notOf(type)) return; - if(parentedReference.isNested()) { + if (parentedReference.isNested()) { options.addAll(createNestedOptions(parentedReference, type)); } else { options.add(createOption(parentedReference)); @@ -96,7 +100,8 @@ private static Option createOption(ConfigOptionReference reference) { case BOOLEAN -> booleanOption(reference); case INTEGER -> integerOption(reference); case FLOAT -> floatOption(reference); - case NESTED -> throw new IllegalArgumentException("Attempted to of non-nested option for nested reference \"%s\"".formatted(reference.getFormattedName())); + case NESTED -> + throw new IllegalArgumentException("Attempted to of non-nested option for nested reference \"%s\"".formatted(reference.getFormattedName())); }; } @@ -106,8 +111,7 @@ private static Option floatOption(ConfigOptionReference reference) { .name(option(formattedName)) .description(OptionDescription.of(description(formattedName))) .binding(Binding.generic(reference.floatValue(), reference::floatValue, reference::floatValue)) - .controller(option -> FloatSliderControllerBuilder - .create(option) + .controller(option -> FloatSliderControllerBuilder.create(option) .range(reference.minFloatValue(), reference.maxFloatValue()) .step(reference.maxFloatValue() / 100f)) .listener((option, value) -> reference.floatValue(value)) @@ -131,8 +135,7 @@ private static Option integerOption(ConfigOptionReference reference) { .name(option(formattedName)) .description(OptionDescription.of(description(formattedName))) .binding(Binding.generic(reference.intValue(), reference::intValue, reference::intValue)) - .controller(option -> IntegerSliderControllerBuilder - .create(option) + .controller(option -> IntegerSliderControllerBuilder.create(option) .range(reference.minIntValue(), reference.maxIntValue()) .step(Math.max(1, reference.maxIntValue() / 100))) .listener((option, value) -> reference.intValue(value)) diff --git a/src/client/java/com/bawnorton/bettertrims/client/mixin/ArmorTrimMixin.java b/src/client/java/com/bawnorton/bettertrims/client/mixin/ArmorTrimMixin.java index 6181778..d8098d0 100644 --- a/src/client/java/com/bawnorton/bettertrims/client/mixin/ArmorTrimMixin.java +++ b/src/client/java/com/bawnorton/bettertrims/client/mixin/ArmorTrimMixin.java @@ -18,6 +18,12 @@ public abstract class ArmorTrimMixin { @Inject(method = "appendTooltip", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 2, shift = At.Shift.AFTER)) private static void addEffectTooltip(ItemStack stack, DynamicRegistryManager registryManager, List tooltip, CallbackInfo ci, @Local ArmorTrim trim) { - ArmorTrimEffects.forEachAppliedEffect(stack, effect -> tooltip.add(ScreenTexts.space().append(effect.getTooltip().copy().fillStyle(trim.getMaterial().value().description().getStyle())))); + ArmorTrimEffects.forEachAppliedEffect(stack, effect -> tooltip.add(ScreenTexts.space() + .append(effect.getTooltip() + .copy() + .fillStyle(trim.getMaterial() + .value() + .description() + .getStyle())))); } } diff --git a/src/client/java/com/bawnorton/bettertrims/client/mixin/BackgroundRendererMixin.java b/src/client/java/com/bawnorton/bettertrims/client/mixin/BackgroundRendererMixin.java index c925c87..52a9964 100644 --- a/src/client/java/com/bawnorton/bettertrims/client/mixin/BackgroundRendererMixin.java +++ b/src/client/java/com/bawnorton/bettertrims/client/mixin/BackgroundRendererMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.client.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.client.BetterTrimsClient; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -15,14 +15,11 @@ @Mixin(BackgroundRenderer.class) public abstract class BackgroundRendererMixin { - @ModifyConstant(method = "render", constant = @Constant(floatValue = 0.0F, ordinal = 0), slice = - @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F") - )) - private static float modifyLight(float original, @Local Entity entity) { + @ModifyConstant(method = "render", constant = @Constant(floatValue = 0.0F, ordinal = 0), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F"))) + private static float improveNightVisionWhenWearingSilver(float original, @Local Entity entity) { NumberWrapper increase = NumberWrapper.zero(); - if(entity instanceof EntityExtender extender && extender.betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(extender.betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.improveVision)); + if (entity instanceof EntityExtender extender && extender.betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(extender.betterTrims$getTrimmables(), () -> increase.increment(BetterTrimsClient.getConfig().silverNightBonus.improveVision)); } return original + increase.getFloat(); } diff --git a/src/client/java/com/bawnorton/bettertrims/client/mixin/LightmapTextureManagerMixin.java b/src/client/java/com/bawnorton/bettertrims/client/mixin/LightmapTextureManagerMixin.java index 1471afd..7f576a9 100644 --- a/src/client/java/com/bawnorton/bettertrims/client/mixin/LightmapTextureManagerMixin.java +++ b/src/client/java/com/bawnorton/bettertrims/client/mixin/LightmapTextureManagerMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.client.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.client.BetterTrimsClient; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -9,20 +9,22 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; +import org.spongepowered.asm.mixin.injection.Slice; @Mixin(LightmapTextureManager.class) public abstract class LightmapTextureManagerMixin { - @Shadow @Final private MinecraftClient client; + @Shadow + @Final + private MinecraftClient client; - @ModifyConstant(method = "update", constant = @Constant(floatValue = 0.0F, ordinal = 1), slice = - @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F") - )) - private float modifyLight(float original) { + @ModifyConstant(method = "update", constant = @Constant(floatValue = 0.0F, ordinal = 1), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F"))) + private float improveNightVisionWhenWearingSilver(float original) { NumberWrapper increase = NumberWrapper.zero(); - if(client.player instanceof EntityExtender extender && extender.betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(extender.betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.improveVision)); + if (client.player instanceof EntityExtender extender && extender.betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(extender.betterTrims$getTrimmables(), () -> increase.increment(BetterTrimsClient.getConfig().silverNightBonus.improveVision)); } return original + increase.getFloat(); } diff --git a/src/client/java/com/bawnorton/bettertrims/client/networking/ClientNetworking.java b/src/client/java/com/bawnorton/bettertrims/client/networking/ClientNetworking.java index 9c806a9..99a529c 100644 --- a/src/client/java/com/bawnorton/bettertrims/client/networking/ClientNetworking.java +++ b/src/client/java/com/bawnorton/bettertrims/client/networking/ClientNetworking.java @@ -4,16 +4,30 @@ import com.bawnorton.bettertrims.networking.Networking; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.minecraft.client.toast.SystemToast; +import net.minecraft.client.toast.ToastManager; +import net.minecraft.text.Text; public abstract class ClientNetworking { + private static boolean isConnectedToDedicated = false; + public static void init() { ClientPlayNetworking.registerGlobalReceiver(Networking.CONFIG_SYNC, (client, handler, buf, responseSender) -> { + isConnectedToDedicated = buf.readBoolean(); String serialized = buf.readString(); ConfigManager.deserializeConfig(serialized); }); + ClientPlayNetworking.registerGlobalReceiver(Networking.CONFIG_OP_CHECK, (client, handler, buf, responseSender) -> { boolean canSendConfig = buf.readBoolean(); - if (canSendConfig) sendConfigToServer(); + if (canSendConfig) { + sendConfigToServer(); + return; + } + + ToastManager toastManager = client.getToastManager(); + toastManager.add(SystemToast.create(client, SystemToast.Type.WORLD_ACCESS_FAILURE, Text.translatable("bettertrims.config_not_synced.title"), Text.translatable("bettertrims.config_not_synced.desc"))); + requestConfigFromServer(); }); } @@ -26,6 +40,15 @@ public static void trySendConfigToServer() { } public static void sendConfigToServer() { - ClientPlayNetworking.send(Networking.CONFIG_SYNC, PacketByteBufs.create().writeString(ConfigManager.serializeConfig())); + ClientPlayNetworking.send(Networking.CONFIG_SYNC, PacketByteBufs.create() + .writeString(ConfigManager.serializeConfig())); + } + + private static void requestConfigFromServer() { + sendHandshake(); + } + + public static boolean isConnectedToDedicated() { + return isConnectedToDedicated; } } diff --git a/src/client/resources/assets/bettertrims/lang/en_us.json b/src/client/resources/assets/bettertrims/lang/en_us.json new file mode 100644 index 0000000..5371c85 --- /dev/null +++ b/src/client/resources/assets/bettertrims/lang/en_us.json @@ -0,0 +1,31 @@ +{ + "bettertrims.yacl.not_installed": "Yet Another Config Lib not installed!", + "bettertrims.yacl.not_installed.desc": "Yet Another Config Lib 3 is required to use the in-game config GUI. Would you like to download it now?", + "bettertrims.config_not_synced.title": "§cConfig Not Synced", + "bettertrims.config_not_synced.desc": "You do not have permission to alter the server config. Resetting to server config.", + "bettertrims.effect.quartz.tooltip": "Gain More Experience", + "bettertrims.effect.iron.tooltip": "Mine Faster", + "bettertrims.effect.netherite.tooltip": "Fire Resistant", + "bettertrims.effect.redstone.tooltip": "Move Faster", + "bettertrims.effect.copper.tooltip": "Swim Faster", + "bettertrims.effect.gold.tooltip": "Piglins Ignore You", + "bettertrims.effect.emerald.tooltip": "Villagers Like You", + "bettertrims.effect.diamond.tooltip": "Harder to Kill", + "bettertrims.effect.lapis.tooltip": "More Enchantable", + "bettertrims.effect.amethyst.tooltip": "Stronger Potion Effects", + "bettertrims.effect.platinum.tooltip": "Illagers Ignore You", + "bettertrims.effect.silver.tooltip": "Stronger at Night", + "bettertrims.effect.coal.tooltip": "Faster Furnances", + "bettertrims.effect.dragons_breath.tooltip": "Share Potion Effects", + "bettertrims.effect.chorus_fruit.tooltip": "Dodge End Attacks", + "bettertrims.effect.echo_shard.tooltip": "Harder to Detect", + "bettertrims.effect.fire_charge.tooltip": "Hot to the Touch", + "bettertrims.effect.ender_pearl.tooltip": "Dodge Attacks", + "bettertrims.effect.glowstone_dust.tooltip": "Stronger Potion Effects", + "bettertrims.effect.leather.tooltip": "Bigger Strides", + "bettertrims.effect.nether_brick.tooltip": "One with the Fortress", + "bettertrims.effect.prismarine_shard.tooltip": "Guardians Ignore You", + "bettertrims.effect.rabbit_hide.tooltip": "Animals do not Fear You", + "bettertrims.effect.slime_ball.tooltip": "Kinetic Absorper", + "bettertrims.effect.enchanted_golden_apple.toolip": "Gain Absorption Over Time" +} \ No newline at end of file diff --git a/src/client/resources/bettertrims.client.mixins.json b/src/client/resources/bettertrims.client.mixins.json index 9e1915c..324de43 100644 --- a/src/client/resources/bettertrims.client.mixins.json +++ b/src/client/resources/bettertrims.client.mixins.json @@ -3,9 +3,9 @@ "package": "com.bawnorton.bettertrims.client.mixin", "compatibilityLevel": "JAVA_17", "client": [ + "ArmorTrimMixin", "BackgroundRendererMixin", - "LightmapTextureManagerMixin", - "ArmorTrimMixin" + "LightmapTextureManagerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/java/com/bawnorton/bettertrims/BetterTrims.java b/src/main/java/com/bawnorton/bettertrims/BetterTrims.java index e56b131..6b0fc2d 100644 --- a/src/main/java/com/bawnorton/bettertrims/BetterTrims.java +++ b/src/main/java/com/bawnorton/bettertrims/BetterTrims.java @@ -1,5 +1,6 @@ package com.bawnorton.bettertrims; +import com.bawnorton.bettertrims.event.EventHandler; import com.bawnorton.bettertrims.networking.Networking; import net.fabricmc.api.ModInitializer; import net.minecraft.util.Identifier; @@ -10,13 +11,14 @@ public class BetterTrims implements ModInitializer { public static final String MOD_ID = "bettertrims"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + public static Identifier id(String path) { + return new Identifier(MOD_ID, path); + } + @Override public void onInitialize() { LOGGER.debug("Initializing Better Trims"); Networking.init(); - } - - public static Identifier id(String path) { - return new Identifier(MOD_ID, path); + EventHandler.init(); } } \ No newline at end of file diff --git a/src/main/java/com/bawnorton/bettertrims/BetterTrimsMixinPlugin.java b/src/main/java/com/bawnorton/bettertrims/BetterTrimsMixinPlugin.java index c9acb87..e2925b6 100644 --- a/src/main/java/com/bawnorton/bettertrims/BetterTrimsMixinPlugin.java +++ b/src/main/java/com/bawnorton/bettertrims/BetterTrimsMixinPlugin.java @@ -16,30 +16,18 @@ import java.util.Set; public class BetterTrimsMixinPlugin implements IMixinConfigPlugin { - @Override - public void onLoad(String mixinPackage) { - } - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetName, String className) { - return testClass(className); - } - public static boolean testClass(String className) { try { - List annotationNodes = MixinService.getService().getBytecodeProvider().getClassNode(className).visibleAnnotations; - if(annotationNodes == null) return true; + List annotationNodes = MixinService.getService() + .getBytecodeProvider() + .getClassNode(className).visibleAnnotations; + if (annotationNodes == null) return true; - for(AnnotationNode node: annotationNodes) { - if(node.desc.equals(Type.getDescriptor(ConditionalMixin.class))) { + for (AnnotationNode node : annotationNodes) { + if (node.desc.equals(Type.getDescriptor(ConditionalMixin.class))) { String modid = Annotations.getValue(node, "modid"); boolean applyIfPresent = Annotations.getValue(node, "applyIfPresent", Boolean.TRUE); - if(isModLoaded(modid)) { + if (isModLoaded(modid)) { BetterTrims.LOGGER.debug("BetterTrimsMixinPlugin: " + className + " is" + (applyIfPresent ? " " : " not ") + "being applied because " + modid + " is loaded"); return applyIfPresent; } else { @@ -50,22 +38,22 @@ public static boolean testClass(String className) { List conditions = Annotations.getValue(node, "conditions"); boolean shouldApply = true; BetterTrims.LOGGER.debug("BetterTrimsMixinPlugin: " + className + " is being tested for multiple conditions"); - for(AnnotationNode condition: conditions) { + for (AnnotationNode condition : conditions) { String modid = Annotations.getValue(condition, "modid"); boolean applyIfPresent = Annotations.getValue(condition, "applyIfPresent", Boolean.TRUE); - if(isModLoaded(modid)) { - if(!applyIfPresent) { + if (isModLoaded(modid)) { + if (!applyIfPresent) { BetterTrims.LOGGER.debug("BetterTrimsMixinPlugin: " + className + " is not being applied because " + modid + " is loaded"); shouldApply = false; } } else { - if(applyIfPresent) { + if (applyIfPresent) { BetterTrims.LOGGER.debug("BetterTrimsMixinPlugin: " + className + " is not being applied because " + modid + " is not loaded"); shouldApply = false; } } } - if(shouldApply) { + if (shouldApply) { BetterTrims.LOGGER.debug("BetterTrimsMixinPlugin: " + className + " is being applied because all conditions are met"); return true; } else { @@ -81,6 +69,24 @@ public static boolean testClass(String className) { return true; } + public static boolean isModLoaded(String modid) { + return FabricLoader.getInstance().isModLoaded(modid); + } + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetName, String className) { + return testClass(className); + } + @Override public void acceptTargets(Set myTargets, Set otherTargets) { @@ -100,8 +106,4 @@ public void preApply(String targetClassName, ClassNode targetClass, String mixin public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { } - - public static boolean isModLoaded(String modid) { - return FabricLoader.getInstance().isModLoaded(modid); - } } diff --git a/src/main/java/com/bawnorton/bettertrims/BetterTrimsPreLaunch.java b/src/main/java/com/bawnorton/bettertrims/BetterTrimsPreLaunch.java index 4dc31a3..059b51c 100644 --- a/src/main/java/com/bawnorton/bettertrims/BetterTrimsPreLaunch.java +++ b/src/main/java/com/bawnorton/bettertrims/BetterTrimsPreLaunch.java @@ -8,6 +8,6 @@ public class BetterTrimsPreLaunch implements PreLaunchEntrypoint { @Override public void onPreLaunch() { BetterTrims.LOGGER.debug("PreLaunching Better Trims"); - ConfigManager.loadConfig(); + ConfigManager.loadConfigs(); } } diff --git a/src/main/java/com/bawnorton/bettertrims/annotation/ConditionalMixin.java b/src/main/java/com/bawnorton/bettertrims/annotation/ConditionalMixin.java index 61969fd..0e3faf1 100644 --- a/src/main/java/com/bawnorton/bettertrims/annotation/ConditionalMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/annotation/ConditionalMixin.java @@ -9,5 +9,6 @@ @Retention(RetentionPolicy.RUNTIME) public @interface ConditionalMixin { String modid(); + boolean applyIfPresent() default true; } diff --git a/src/main/java/com/bawnorton/bettertrims/annotation/MultiConditionMixin.java b/src/main/java/com/bawnorton/bettertrims/annotation/MultiConditionMixin.java new file mode 100644 index 0000000..c632960 --- /dev/null +++ b/src/main/java/com/bawnorton/bettertrims/annotation/MultiConditionMixin.java @@ -0,0 +1,12 @@ +package com.bawnorton.bettertrims.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface MultiConditionMixin { + ConditionalMixin[] conditions(); +} diff --git a/src/main/java/com/bawnorton/bettertrims/compat/Compat.java b/src/main/java/com/bawnorton/bettertrims/compat/Compat.java index 13f22b9..18ff597 100644 --- a/src/main/java/com/bawnorton/bettertrims/compat/Compat.java +++ b/src/main/java/com/bawnorton/bettertrims/compat/Compat.java @@ -4,7 +4,8 @@ public abstract class Compat { public static boolean isStackedTrimsLoaded() { - return FabricLoader.getInstance().isModLoaded("stacked_trims") || FabricLoader.getInstance().isModLoaded("stackable_trims"); + return FabricLoader.getInstance().isModLoaded("stacked_trims") || FabricLoader.getInstance() + .isModLoaded("stackable_trims"); } public static boolean isYaclLoaded() { diff --git a/src/main/java/com/bawnorton/bettertrims/compat/StackedTrimsCompat.java b/src/main/java/com/bawnorton/bettertrims/compat/StackedTrimsCompat.java index c6d4fe3..b2562ba 100644 --- a/src/main/java/com/bawnorton/bettertrims/compat/StackedTrimsCompat.java +++ b/src/main/java/com/bawnorton/bettertrims/compat/StackedTrimsCompat.java @@ -11,14 +11,17 @@ public class StackedTrimsCompat { public static List getTrimMaterials(ItemStack stack) { - if(!Compat.isStackedTrimsLoaded()) throw new IllegalStateException("Stacked Trims is not loaded"); + if (!Compat.isStackedTrimsLoaded()) throw new IllegalStateException("Stacked Trims is not loaded"); NbtCompound nbt = stack.getNbt(); if (nbt == null) return null; + NbtElement trimElement = nbt.get("Trim"); if (!(trimElement instanceof NbtList list)) return null; + List materials = new ArrayList<>(); for (NbtElement element : list) { if (!(element instanceof NbtCompound nbtCompound)) continue; + materials.add(new Identifier(nbtCompound.getString("material"))); } return materials; diff --git a/src/main/java/com/bawnorton/bettertrims/config/Config.java b/src/main/java/com/bawnorton/bettertrims/config/Config.java index d33a65c..33f064c 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/Config.java +++ b/src/main/java/com/bawnorton/bettertrims/config/Config.java @@ -1,120 +1,166 @@ package com.bawnorton.bettertrims.config; +import com.bawnorton.bettertrims.config.option.NestedConfigOption; +import com.bawnorton.bettertrims.config.option.OptionType; import com.bawnorton.bettertrims.config.option.annotation.BooleanOption; import com.bawnorton.bettertrims.config.option.annotation.FloatOption; import com.bawnorton.bettertrims.config.option.annotation.IntOption; import com.bawnorton.bettertrims.config.option.annotation.NestedOption; -import com.bawnorton.bettertrims.config.option.NestedConfigOption; -import com.bawnorton.bettertrims.config.option.OptionType; import com.google.gson.annotations.Expose; public class Config { - private static Config INSTANCE; + private static Config LOCAL_INSTANCE = new Config(); + private static Config SERVER_INSTANCE = new Config(); - @Expose @IntOption(type = OptionType.GAME, value = 1) + @Expose + @IntOption(type = OptionType.GAME, value = 1) public Integer trimDurability; - @Expose @FloatOption(value = 0.05f, max = 1) + @Expose + @FloatOption(value = 0.05f, max = 1) public Float quartzExperienceBonus; - @Expose @FloatOption(value = 8f, max = 80) + @Expose + @FloatOption(value = 8f, max = 80) public Float ironMiningSpeedIncrease; - @Expose @FloatOption(value = 0.25f, max = 1) + @Expose + @FloatOption(value = 0.25f, max = 1) public Float netheriteFireResistance; - @Expose @FloatOption(value = 0.1f, max = 1) + @Expose + @FloatOption(value = 0.1f, max = 1) public Float redstoneMovementSpeedIncrease; - @Expose @FloatOption(value = 0.05f, max = 0.5f) + @Expose + @FloatOption(value = 0.05f, max = 0.5f) public Float copperSwimSpeedIncrease; - @Expose @FloatOption(value = 0.125f, max = 1) + @Expose + @FloatOption(value = 0.125f, max = 1) public Float emeraldVillagerDiscount; - @Expose @FloatOption(value = 0.05f, max = 1) + @Expose + @FloatOption(value = 0.05f, max = 1) public Float diamondDamageReduction; - @Expose @IntOption(value = 30) + @Expose + @IntOption(value = 30) public Integer lapisEnchantability; - @Expose @FloatOption(value = 0.0625f, max = 1) + @Expose + @FloatOption(value = 0.0625f, max = 1) public Float amethystPotionDurationModifyChance; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) public Float glowstonePotionAmplifierIncreaseChance; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) public Float chorusFruitDodgeChance; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 1f, max = 10) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 1f, max = 10) public Float fireChargeFireDuration; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.4f, max = 4) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.4f, max = 4) public Float leatherStepHeightIncrease; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 1.25f, max = 5) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 1.25f, max = 5) public Float dragonBreathRadius; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 1.5f, max = 5) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 1.5f, max = 5) public Float echoShardVibrationDistanceReduction; - @Expose @NestedOption(type = OptionType.ADDED_VANILLA) + @Expose + @NestedOption(type = OptionType.ADDED_VANILLA) public EnchantedGoldenApple enchantedGoldenAppleEffects; - @Expose @NestedOption(type = OptionType.MODDED) + @Expose + @NestedOption(type = OptionType.MODDED) public Silver silverNightBonus; - @Expose @NestedOption(type = OptionType.ADDED_VANILLA) + @Expose + @NestedOption(type = OptionType.ADDED_VANILLA) public SlimeBall slimeBallEffects; - @Expose @NestedOption(type = OptionType.ADDED_VANILLA) + @Expose + @NestedOption(type = OptionType.ADDED_VANILLA) public Coal coalEffects; - @Expose @NestedOption(type = OptionType.ADDED_VANILLA) + @Expose + @NestedOption(type = OptionType.ADDED_VANILLA) public EnderPearl enderPearlEffects; private Config() { } - public static Config getInstance() { - if (INSTANCE == null) INSTANCE = new Config(); - return INSTANCE; + public static Config getLocalInstance() { + return LOCAL_INSTANCE; + } + + public static Config getServerInstance() { + return SERVER_INSTANCE; + } + + static void updateLocal(Config config) { + LOCAL_INSTANCE = config; } - public static void update(Config config) { - INSTANCE = config; + static void updateServer(Config config) { + SERVER_INSTANCE = config; } public static class EnchantedGoldenApple implements NestedConfigOption { - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 1200, max = 12000, min = 1) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 1200, max = 12000, min = 1) public Float absorptionDelay; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 250, max = 12000) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 250, max = 12000) public Float absorptionDelayReduction; - @Expose @IntOption(type = OptionType.ADDED_VANILLA, value = 2, max = 20) + @Expose + @IntOption(type = OptionType.ADDED_VANILLA, value = 2, max = 20) public Integer absorptionAmount; - @Expose @IntOption(type = OptionType.ADDED_VANILLA, value = 3, max = 30) + @Expose + @IntOption(type = OptionType.ADDED_VANILLA, value = 3, max = 30) public Integer maxAbsorption; } public static class Silver implements NestedConfigOption { - @Expose @FloatOption(type = OptionType.MODDED, value = 0.05f, max = 0.5f) + @Expose + @FloatOption(type = OptionType.MODDED, value = 0.05f, max = 0.5f) public Float movementSpeed; - @Expose @FloatOption(type = OptionType.MODDED, value = 0.05f, max = 0.5f) + @Expose + @FloatOption(type = OptionType.MODDED, value = 0.05f, max = 0.5f) public Float jumpHeight; - @Expose @FloatOption(type = OptionType.MODDED, value = 0.5f, max = 5) + @Expose + @FloatOption(type = OptionType.MODDED, value = 0.5f, max = 5) public Float attackDamage; - @Expose @FloatOption(type = OptionType.MODDED, value = 0.3f, max = 3) + @Expose + @FloatOption(type = OptionType.MODDED, value = 0.3f, max = 3) public Float attackSpeed; - @Expose @FloatOption(type = OptionType.MODDED, value = 0.03f, max = 0.3f) + @Expose + @FloatOption(type = OptionType.MODDED, value = 0.03f, max = 0.3f) public Float damageReduction; - @Expose @FloatOption(type = OptionType.MODDED, value = 0.25f, max = 1) + @Expose + @FloatOption(type = OptionType.MODDED, value = 0.25f, max = 1) public Float improveVision; } public static class SlimeBall implements NestedConfigOption { - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) public Float fallDamageReduction; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 2.5f) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 2.5f) public Float knockbackIncrease; } public static class Coal implements NestedConfigOption { - @Expose @BooleanOption(type = OptionType.ADDED_VANILLA, value = false) + @Expose + @BooleanOption(type = OptionType.ADDED_VANILLA, value = false) public Boolean disableEffectToReduceLag; - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 5f, max = 10f) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 5f, max = 10f) public Float playerDetectionRadius; - @Expose @IntOption(type = OptionType.ADDED_VANILLA, value = 1, max = 10) + @Expose + @IntOption(type = OptionType.ADDED_VANILLA, value = 1, max = 10) public Integer furnaceSpeedMultiplier; } public static class EnderPearl implements NestedConfigOption { - @Expose @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) + @Expose + @FloatOption(type = OptionType.ADDED_VANILLA, value = 0.25f, max = 1) public Float dodgeChance; - @Expose @BooleanOption(type = OptionType.ADDED_VANILLA, value = true) + @Expose + @BooleanOption(type = OptionType.ADDED_VANILLA, value = true) public Boolean waterDamagesUser; } } diff --git a/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java b/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java index 81b4f13..d4aab5f 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java +++ b/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java @@ -1,12 +1,13 @@ package com.bawnorton.bettertrims.config; import com.bawnorton.bettertrims.BetterTrims; -import com.bawnorton.bettertrims.config.option.reference.ConfigOptionReference; import com.bawnorton.bettertrims.config.option.NestedConfigOption; import com.bawnorton.bettertrims.config.option.annotation.BooleanOption; import com.bawnorton.bettertrims.config.option.annotation.FloatOption; import com.bawnorton.bettertrims.config.option.annotation.IntOption; import com.bawnorton.bettertrims.config.option.annotation.NestedOption; +import com.bawnorton.bettertrims.config.option.reference.ConfigOptionReference; +import com.bawnorton.bettertrims.networking.Networking; import com.bawnorton.bettertrims.util.Reflection; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; @@ -19,18 +20,41 @@ import java.nio.file.Files; import java.nio.file.Path; -public class ConfigManager { - private static final Gson GSON = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).setPrettyPrinting().create(); - private static final Path configPath = FabricLoader.getInstance().getConfigDir().resolve(BetterTrims.MOD_ID + ".json"); +public abstract class ConfigManager { + private static final Gson GSON = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .setPrettyPrinting() + .create(); + private static final Path localConfigPath = FabricLoader.getInstance() + .getConfigDir() + .resolve(BetterTrims.MOD_ID + ".json"); + private static final Path serverConfigPath = FabricLoader.getInstance() + .getConfigDir() + .resolve(BetterTrims.MOD_ID + "-server.json"); + + public static Config getConfig() { + if (Networking.isDedicated()) return Config.getServerInstance(); + return Config.getLocalInstance(); + } - public static void loadConfig() { - Config config = load(); + public static void loadConfigs() { + loadLocalConfig(); + loadServerConfig(); + } + private static void loadLocalConfig() { + Config config = loadLocal(); validateFields(config); + Config.updateLocal(config); + saveLocalConfig(); + BetterTrims.LOGGER.info("Loaded local config"); + } - Config.update(config); - save(); - BetterTrims.LOGGER.info("Loaded config"); + private static void loadServerConfig() { + Config config = loadServer(); + validateFields(config); + Config.updateServer(config); + saveServerConfig(); + BetterTrims.LOGGER.info("Loaded server config"); } private static void validateFields(Object instance) { @@ -44,8 +68,8 @@ private static void validateFloatFields(Object instance) { Reflection.forEachFieldByAnnotation(instance, FloatOption.class, (field, annotation) -> { validateFloatField(instance, field, annotation.value()); ConfigOptionReference reference = ConfigOptionReference.of(instance, field); - if(reference.floatValue() < annotation.min()) reference.floatValue(annotation.min()); - if(reference.floatValue() > annotation.max()) reference.floatValue(annotation.max()); + if (reference.floatValue() < annotation.min()) reference.floatValue(annotation.min()); + if (reference.floatValue() > annotation.max()) reference.floatValue(annotation.max()); }); } @@ -53,8 +77,8 @@ private static void validateIntFields(Object instance) { Reflection.forEachFieldByAnnotation(instance, IntOption.class, (field, annotation) -> { validateIntField(instance, field, annotation.value()); ConfigOptionReference reference = ConfigOptionReference.of(instance, field); - if(reference.intValue() < annotation.min()) reference.intValue(annotation.min()); - if(reference.intValue() > annotation.max()) reference.intValue(annotation.max()); + if (reference.intValue() < annotation.min()) reference.intValue(annotation.min()); + if (reference.intValue() > annotation.max()) reference.intValue(annotation.max()); }); } @@ -72,68 +96,84 @@ private static void validateNestedFields(Object instance) { } private static void validateFloatField(Object instance, Field field, Float fallback) { - if(Reflection.accessField(field, instance) != null) return; + if (Reflection.accessField(field, instance) != null) return; Reflection.setField(field, instance, fallback); } private static void validateIntField(Object instance, Field field, Integer fallback) { - if(Reflection.accessField(field, instance) != null) return; + if (Reflection.accessField(field, instance) != null) return; Reflection.setField(field, instance, fallback); } private static void validateBooleanField(Object instance, Field field, Boolean fallback) { - if(Reflection.accessField(field, instance) != null) return; + if (Reflection.accessField(field, instance) != null) return; Reflection.setField(field, instance, fallback); } private static void validateNestedField(Object instance, Field field) { - if(Reflection.accessField(field, instance) != null) return; + if (Reflection.accessField(field, instance) != null) return; Reflection.setField(field, instance, Reflection.newInstance(field.getType())); } public static String serializeConfig() { - return GSON.toJson(Config.getInstance()); + return GSON.toJson(Config.getServerInstance()); } public static void deserializeConfig(String serialized) { - Config.update(GSON.fromJson(serialized, Config.class)); - save(); + Config.updateServer(GSON.fromJson(serialized, Config.class)); + saveServerConfig(); + } + + private static Config loadLocal() { + Config loaded = load(Config.getLocalInstance(), localConfigPath); + if (loaded == null) return Config.getLocalInstance(); + + return loaded; } - private static Config load() { - Config config = Config.getInstance(); + private static Config loadServer() { + Config loaded = load(Config.getServerInstance(), serverConfigPath); + if (loaded == null) return Config.getServerInstance(); + + return loaded; + } + + private static Config load(Config config, Path path) { try { - if (!Files.exists(configPath)) { - Files.createDirectories(configPath.getParent()); - Files.createFile(configPath); + if (!Files.exists(path)) { + Files.createDirectories(path.getParent()); + Files.createFile(path); return config; } try { - config = GSON.fromJson(Files.newBufferedReader(configPath), Config.class); + config = GSON.fromJson(Files.newBufferedReader(path), Config.class); } catch (JsonSyntaxException e) { BetterTrims.LOGGER.error("Failed to parse config file, using default config"); - config = Config.getInstance(); + return null; } } catch (IOException e) { BetterTrims.LOGGER.error("Failed to load config", e); } - return config == null ? Config.getInstance() : config; + return config; + } + + public static void saveLocalConfig() { + save(Config.getLocalInstance(), localConfigPath); } - private static void save() { + public static void saveServerConfig() { + save(Config.getServerInstance(), serverConfigPath); + } + + private static void save(Config config, Path path) { try { - Files.write(configPath, GSON.toJson(Config.getInstance()).getBytes()); + Files.write(path, GSON.toJson(config).getBytes()); } catch (IOException e) { BetterTrims.LOGGER.error("Failed to save config", e); } } - - public static void saveConfig() { - save(); - BetterTrims.LOGGER.info("Saved config"); - } } diff --git a/src/main/java/com/bawnorton/bettertrims/config/option/OptionType.java b/src/main/java/com/bawnorton/bettertrims/config/option/OptionType.java index 7aeb2a3..95e2a85 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/option/OptionType.java +++ b/src/main/java/com/bawnorton/bettertrims/config/option/OptionType.java @@ -1,8 +1,5 @@ package com.bawnorton.bettertrims.config.option; public enum OptionType { - GAME, - VANILLA, - ADDED_VANILLA, - MODDED + GAME, VANILLA, ADDED_VANILLA, MODDED } diff --git a/src/main/java/com/bawnorton/bettertrims/config/option/annotation/BooleanOption.java b/src/main/java/com/bawnorton/bettertrims/config/option/annotation/BooleanOption.java index cfa7169..946d2d8 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/option/annotation/BooleanOption.java +++ b/src/main/java/com/bawnorton/bettertrims/config/option/annotation/BooleanOption.java @@ -11,5 +11,6 @@ @Target(ElementType.FIELD) public @interface BooleanOption { OptionType type() default OptionType.VANILLA; + boolean value(); } diff --git a/src/main/java/com/bawnorton/bettertrims/config/option/annotation/FloatOption.java b/src/main/java/com/bawnorton/bettertrims/config/option/annotation/FloatOption.java index 7f750a2..096b595 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/option/annotation/FloatOption.java +++ b/src/main/java/com/bawnorton/bettertrims/config/option/annotation/FloatOption.java @@ -2,13 +2,19 @@ import com.bawnorton.bettertrims.config.option.OptionType; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FloatOption { OptionType type() default OptionType.VANILLA; + float value(); + float min() default 0f; + float max() default 100f; } diff --git a/src/main/java/com/bawnorton/bettertrims/config/option/annotation/IntOption.java b/src/main/java/com/bawnorton/bettertrims/config/option/annotation/IntOption.java index c534350..71ce0a9 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/option/annotation/IntOption.java +++ b/src/main/java/com/bawnorton/bettertrims/config/option/annotation/IntOption.java @@ -11,7 +11,10 @@ @Target(ElementType.FIELD) public @interface IntOption { OptionType type() default OptionType.VANILLA; + int value(); + int min() default 0; + int max() default 100; } diff --git a/src/main/java/com/bawnorton/bettertrims/config/option/reference/ConfigOptionReference.java b/src/main/java/com/bawnorton/bettertrims/config/option/reference/ConfigOptionReference.java index bc1c023..dbae43d 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/option/reference/ConfigOptionReference.java +++ b/src/main/java/com/bawnorton/bettertrims/config/option/reference/ConfigOptionReference.java @@ -21,7 +21,7 @@ protected ConfigOptionReference(Object instance, Field field) { this.instance = instance; this.field = field; this.value = Reflection.accessField(field, instance); - if(value == null) throw new IllegalStateException("Value for " + field.getName() + " field is null."); + if (value == null) throw new IllegalStateException("Value for " + field.getName() + " field is null."); } public static ConfigOptionReference of(Object instance, Field field) { @@ -30,18 +30,19 @@ public static ConfigOptionReference of(Object instance, Field field) { private void validateType(Class clazz) { if (!clazz.isAssignableFrom(value.getClass())) { - throw new IllegalArgumentException("Invalid type " + clazz.getName() + " for " + value.getClass().getName()); + throw new IllegalArgumentException("Invalid type " + clazz.getName() + " for " + value.getClass() + .getName()); } } - private void setConfigValue(T value) { + private void setConfigValue(T value) { if (value == null) throw new IllegalArgumentException("Value cannot be null."); validateType(value.getClass()); Reflection.setField(field, instance, value); this.value = value; } - private T getValueAsType(Class clazz) { + private T getValueAsType(Class clazz) { validateType(clazz); return clazz.cast(value); } @@ -151,15 +152,11 @@ public int hashCode() { @Override public String toString() { - return "DirectConfigOptionReference[" + - "field=" + field + ']'; + return "DirectConfigOptionReference[" + "field=" + field + ']'; } public enum FieldType { - BOOLEAN, - INTEGER, - FLOAT, - NESTED; + BOOLEAN, INTEGER, FLOAT, NESTED; public static FieldType of(Class clazz) { if (Boolean.class.isAssignableFrom(clazz)) return BOOLEAN; diff --git a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java index b217475..ba0fee0 100644 --- a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java +++ b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java @@ -23,8 +23,10 @@ public ArmorTrimEffect(RegexIdentifier matieral, Text tooltip) { private Identifier getTrimMaterial(ItemStack stack) { NbtCompound nbt = stack.getNbt(); if (nbt == null) return null; + NbtElement trimElement = nbt.get("Trim"); if (!(trimElement instanceof NbtCompound nbtCompound)) return null; + return new Identifier(nbtCompound.getString("material")); } @@ -32,6 +34,7 @@ public boolean appliesTo(ItemStack stack) { if (Compat.isStackedTrimsLoaded()) { List materials = StackedTrimsCompat.getTrimMaterials(stack); if (materials == null) return false; + return material.matchesAny(materials); } return material.matches(getTrimMaterial(stack)); diff --git a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java index a18202b..0e1928c 100644 --- a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java +++ b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java @@ -63,12 +63,12 @@ private static ArmorTrimEffect of(RegexIdentifier material) { } private static Text getTooltip(String path) { - return Text.translatable("effect.bettertrims.%s.tooltip".formatted(path)); + return Text.translatable("bettertrims.effect.%s.tooltip".formatted(path)); } public static void forEachAppliedEffect(ItemStack stack, Consumer effectConsumer) { - for(ArmorTrimEffect effect : EFFECTS) { - if(effect.appliesTo(stack)) { + for (ArmorTrimEffect effect : EFFECTS) { + if (effect.appliesTo(stack)) { effectConsumer.accept(effect); } } diff --git a/src/main/java/com/bawnorton/bettertrims/event/EventHandler.java b/src/main/java/com/bawnorton/bettertrims/event/EventHandler.java new file mode 100644 index 0000000..ff80b4b --- /dev/null +++ b/src/main/java/com/bawnorton/bettertrims/event/EventHandler.java @@ -0,0 +1,10 @@ +package com.bawnorton.bettertrims.event; + +import com.bawnorton.bettertrims.networking.Networking; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; + +public abstract class EventHandler { + public static void init() { + ServerLifecycleEvents.SERVER_STARTED.register(Networking::setServer); + } +} diff --git a/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java b/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java index 1e951e6..ffa1ed1 100644 --- a/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java +++ b/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java @@ -4,5 +4,6 @@ public interface EntityExtender { Iterable betterTrims$getTrimmables(); + boolean betterTrims$shouldSilverApply(); } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/AbstractFurnaceBlockEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/AbstractFurnaceBlockEntityMixin.java index 8e62aaa..b1d4d2d 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/AbstractFurnaceBlockEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/AbstractFurnaceBlockEntityMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.mixin.accessor.AbstractFurnaceBlockEntityAccessor; @@ -23,18 +23,14 @@ @Mixin(AbstractFurnaceBlockEntity.class) public abstract class AbstractFurnaceBlockEntityMixin { @SuppressWarnings("MixinAnnotationTarget") // shut up mcdev, you're clueless - @ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, ordinal = 0), slice = - @Slice(from = @At(value = "INVOKE", target = "net/minecraft/block/entity/AbstractFurnaceBlockEntity.canAcceptRecipeOutput(Lnet/minecraft/registry/DynamicRegistryManager;Lnet/minecraft/recipe/Recipe;Lnet/minecraft/util/collection/DefaultedList;I)Z", ordinal = 1)) - ) + @ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, ordinal = 0), slice = @Slice(from = @At(value = "INVOKE", target = "net/minecraft/block/entity/AbstractFurnaceBlockEntity.canAcceptRecipeOutput(Lnet/minecraft/registry/DynamicRegistryManager;Lnet/minecraft/recipe/Recipe;Lnet/minecraft/util/collection/DefaultedList;I)Z", ordinal = 1))) private static int increaseCookTime(int original, World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity) { - if(Config.getInstance().coalEffects.disableEffectToReduceLag) return original; + if (ConfigManager.getConfig().coalEffects.disableEffectToReduceLag) return original; - boolean nearbyCoalTrim = world - .getEntitiesByClass(PlayerEntity.class, state - .getCollisionShape(world, pos) + boolean nearbyCoalTrim = world.getEntitiesByClass(PlayerEntity.class, state.getCollisionShape(world, pos) .getBoundingBox() .offset(pos) - .expand(Config.getInstance().coalEffects.playerDetectionRadius), player -> true) + .expand(ConfigManager.getConfig().coalEffects.playerDetectionRadius), player -> true) .stream() .map(player -> ((EntityExtender) player).betterTrims$getTrimmables()) .flatMap(iterable -> { @@ -48,7 +44,7 @@ private static int increaseCookTime(int original, World world, BlockPos pos, Blo .isPresent(); if (nearbyCoalTrim) { - return Math.min(original + Config.getInstance().coalEffects.furnaceSpeedMultiplier, ((AbstractFurnaceBlockEntityAccessor) blockEntity).getCookTimeTotal() - 1); + return Math.min(original + ConfigManager.getConfig().coalEffects.furnaceSpeedMultiplier, ((AbstractFurnaceBlockEntityAccessor) blockEntity).getCookTimeTotal() - 1); } return original; } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/ActiveTargetGoalMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/ActiveTargetGoalMixin.java index 9a927f4..55dfcd3 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/ActiveTargetGoalMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/ActiveTargetGoalMixin.java @@ -14,25 +14,23 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; +import java.util.Map; +import java.util.function.Function; import java.util.function.Predicate; @Mixin(ActiveTargetGoal.class) public abstract class ActiveTargetGoalMixin { + @Unique + private final Map, Function, Predicate>> trimPredicates = Map.ofEntries( + Map.entry(IllagerEntity.class, original -> getTrimPredicate(original, ArmorTrimEffects.PLATINUM)), + Map.entry(GuardianEntity.class, original -> getTrimPredicate(original, ArmorTrimEffects.PRISMARINE_SHARD)), + Map.entry(BlazeEntity.class, original -> getTrimPredicate(original, ArmorTrimEffects.NETHER_BRICK)), + Map.entry(WitherSkeletonEntity.class, original -> getTrimPredicate(original, ArmorTrimEffects.NETHER_BRICK, 2)) + ); + @ModifyArg(method = "(Lnet/minecraft/entity/mob/MobEntity;Ljava/lang/Class;IZZLjava/util/function/Predicate;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ai/TargetPredicate;setPredicate(Ljava/util/function/Predicate;)Lnet/minecraft/entity/ai/TargetPredicate;")) private Predicate checkPlayerTrims(@Nullable Predicate predicate, @Local MobEntity mob) { - if(mob instanceof IllagerEntity) { - return getTrimPredicate(predicate, ArmorTrimEffects.PLATINUM); - } - if(mob instanceof GuardianEntity) { - return getTrimPredicate(predicate, ArmorTrimEffects.PRISMARINE_SHARD); - } - if(mob instanceof BlazeEntity) { - return getTrimPredicate(predicate, ArmorTrimEffects.NETHER_BRICK); - } - if(mob instanceof WitherSkeletonEntity) { - return getTrimPredicate(predicate, ArmorTrimEffects.NETHER_BRICK, 2); - } - return predicate; + return trimPredicates.getOrDefault(mob.getClass(), Function.identity()).apply(predicate); } @Unique diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/ElderGuardianEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/ElderGuardianEntityMixin.java index b25dcf4..cd85b12 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/ElderGuardianEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/ElderGuardianEntityMixin.java @@ -15,10 +15,10 @@ public abstract class ElderGuardianEntityMixin { @Inject(method = "method_7011", at = @At("HEAD"), cancellable = true) private void cancelElderGuardianEffectOnTrimmedPlayers(ServerPlayerEntity player, CallbackInfo ci) { - if(player instanceof EntityExtender extender) { + if (player instanceof EntityExtender extender) { NumberWrapper count = NumberWrapper.zero(); ArmorTrimEffects.PRISMARINE_SHARD.apply(extender.betterTrims$getTrimmables(), () -> count.increment(1)); - if(count.getInt() >= 4) { + if (count.getInt() >= 4) { player.removeStatusEffect(StatusEffects.MINING_FATIGUE); ci.cancel(); } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/EndermanEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/EndermanEntityMixin.java index b3033bb..6820d71 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/EndermanEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/EndermanEntityMixin.java @@ -10,7 +10,7 @@ public abstract class EndermanEntityMixin extends MobEntityMixin { @Override protected boolean shouldHit(Entity instance, DamageSource source, float amount, Operation original) { - if(didDodgeAttack(instance)) return false; + if (didDodgeAttack(instance)) return false; return super.shouldHit(instance, source, amount, original); } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java index 2ababff..f2b41f6 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -17,6 +17,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.event.GameEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,46 +31,65 @@ @SuppressWarnings("unused") @Mixin(Entity.class) public abstract class EntityMixin implements EntityExtender { - @Shadow public abstract Iterable getArmorItems(); - @Shadow public abstract Iterable getHandItems(); - @Shadow public abstract World getWorld(); - @Shadow public abstract double getZ(); - @Shadow public abstract double getY(); - @Shadow public abstract double getX(); + @Shadow + public abstract Iterable getArmorItems(); + + @Shadow + public abstract Iterable getHandItems(); + + @Shadow + public abstract World getWorld(); + + @Shadow + public abstract double getZ(); + + @Shadow + public abstract double getY(); + + @Shadow + public abstract double getX(); + + @Shadow + public abstract float distanceTo(Entity entity); @ModifyReturnValue(method = "isFireImmune", at = @At("RETURN")) private boolean checkIfNetheriteTrimmed(boolean original) { NumberWrapper netheriteCount = NumberWrapper.zero(); - ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), () -> netheriteCount.increment(Config.getInstance().netheriteFireResistance)); + ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), () -> netheriteCount.increment(ConfigManager.getConfig().netheriteFireResistance)); return original || netheriteCount.getFloat() >= 0.99f; } @ModifyArg(method = "setOnFireFromLava", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z")) private float reduceNetheriteTrimDamage(float original) { NumberWrapper netheriteCount = NumberWrapper.zero(); - ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), () -> netheriteCount.increment(Config.getInstance().netheriteFireResistance)); + ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), () -> netheriteCount.increment(ConfigManager.getConfig().netheriteFireResistance)); return original * (1 - netheriteCount.getFloat()); } @ModifyReturnValue(method = "getStepHeight", at = @At("RETURN")) private float applyTrimStepHeightIncrease(float original) { NumberWrapper increase = NumberWrapper.zero(); - ArmorTrimEffects.LEATHER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().leatherStepHeightIncrease)); + ArmorTrimEffects.LEATHER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().leatherStepHeightIncrease)); return original + increase.getFloat(); } @Unique public List betterTrims$getTrimmables() { List equipped = new ArrayList<>(); - for(ItemStack stack: getHandItems()) equipped.add(stack); + for (ItemStack stack : getHandItems()) equipped.add(stack); equipped.removeIf(stack -> stack.getItem() instanceof ArmorItem); - for(ItemStack stack: getArmorItems()) equipped.add(stack); + for (ItemStack stack : getArmorItems()) equipped.add(stack); equipped.removeIf(ItemStack::isEmpty); return equipped; } @Unique public boolean betterTrims$shouldSilverApply() { + DimensionType dimension = getWorld().getDimension(); + if (dimension.hasFixedTime()) { + return dimension.ambientLight() <= 7f; + } + long time = getWorld().getTimeOfDay() % 24000; return time >= 13000 && time <= 23000; } @@ -77,8 +97,8 @@ private float applyTrimStepHeightIncrease(float original) { @Unique protected boolean didDodgeAttack(Entity entity) { NumberWrapper dodgeChance = NumberWrapper.zero(); - ArmorTrimEffects.CHORUS_FRUIT.apply(((EntityExtender) entity).betterTrims$getTrimmables(), () -> dodgeChance.increment(Config.getInstance().chorusFruitDodgeChance)); - if(Math.random() > dodgeChance.getFloat()) { + ArmorTrimEffects.CHORUS_FRUIT.apply(((EntityExtender) entity).betterTrims$getTrimmables(), () -> dodgeChance.increment(ConfigManager.getConfig().chorusFruitDodgeChance)); + if (Math.random() > dodgeChance.getFloat()) { return false; } else if (entity instanceof LivingEntity livingEntity) { betterTrims$randomTpEntity(livingEntity); @@ -98,9 +118,10 @@ protected boolean didDodgeAttack(Entity entity) { double y = entity.getY(); double z = entity.getZ(); - for(int i = 0; i < 16; ++i) { + for (int i = 0; i < 16; ++i) { double newX = entity.getX() + (entity.getRandom().nextDouble() - 0.5) * (float) 16; - double newY = MathHelper.clamp(entity.getY() + (double)(entity.getRandom().nextInt((int) (float) 16) - 8), world.getBottomY(), world.getBottomY() + ((ServerWorld)world).getLogicalHeight() - 1); + double newY = MathHelper.clamp(entity.getY() + (double) (entity.getRandom() + .nextInt((int) (float) 16) - 8), world.getBottomY(), world.getBottomY() + ((ServerWorld) world).getLogicalHeight() - 1); double newZ = entity.getZ() + (entity.getRandom().nextDouble() - 0.5) * (float) 16; if (entity.hasVehicle()) entity.stopRiding(); diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/EscapeDanagerGoalMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/EscapeDanagerGoalMixin.java index 3d9a1ef..c5b76b8 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/EscapeDanagerGoalMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/EscapeDanagerGoalMixin.java @@ -12,13 +12,15 @@ @Mixin(EscapeDangerGoal.class) public abstract class EscapeDanagerGoalMixin { - @Shadow @Final protected PathAwareEntity mob; + @Shadow + @Final + protected PathAwareEntity mob; @SuppressWarnings("unused") @ModifyReturnValue(method = "isInDanger", at = @At("RETURN")) private boolean checkPlayerTrims(boolean original) { if (!original) return false; - if(!(mob.getAttacker() instanceof EntityExtender extender)) return true; + if (!(mob.getAttacker() instanceof EntityExtender extender)) return true; return !ArmorTrimEffects.RABBIT_HIDE.appliesTo(extender.betterTrims$getTrimmables()); } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/FleeEntityGoalMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/FleeEntityGoalMixin.java index 64a6bd8..1168beb 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/FleeEntityGoalMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/FleeEntityGoalMixin.java @@ -21,7 +21,7 @@ public abstract class FleeEntityGoalMixin { @ModifyArg(method = "(Lnet/minecraft/entity/mob/PathAwareEntity;Ljava/lang/Class;Ljava/util/function/Predicate;FDDLjava/util/function/Predicate;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ai/TargetPredicate;setPredicate(Ljava/util/function/Predicate;)Lnet/minecraft/entity/ai/TargetPredicate;")) private Predicate checkPlayerTrims(@Nullable Predicate predicate, @Local Class classToFleeFrom, @Local PathAwareEntity mob) { - if(mob instanceof AnimalEntity && classToFleeFrom.isAssignableFrom(PlayerEntity.class)) { + if (mob instanceof AnimalEntity && classToFleeFrom.isAssignableFrom(PlayerEntity.class)) { return getTrimPredicate(predicate); } return predicate; diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/GameEventDispatchManagerMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/GameEventDispatchManagerMixin.java index 697f757..fc95d3e 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/GameEventDispatchManagerMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/GameEventDispatchManagerMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -20,10 +20,10 @@ public abstract class GameEventDispatchManagerMixin { @SuppressWarnings("unused") @WrapWithCondition(method = "method_45492", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/event/listener/GameEventListener;listen(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/world/event/GameEvent;Lnet/minecraft/world/event/GameEvent$Emitter;Lnet/minecraft/util/math/Vec3d;)Z")) private boolean checkEchoTrimDistance(GameEventListener instance, ServerWorld world, GameEvent gameEvent, GameEvent.Emitter emitter, Vec3d emitterPos, List list, GameEvent gameEvent2, Vec3d emitterPos2, GameEvent.Emitter emitter2, GameEventListener listener, Vec3d listenerPos) { - if(!(emitter.sourceEntity() instanceof EntityExtender extender)) return true; + if (!(emitter.sourceEntity() instanceof EntityExtender extender)) return true; NumberWrapper distanceReduction = NumberWrapper.zero(); - ArmorTrimEffects.ECHO_SHARD.apply(extender.betterTrims$getTrimmables(), () -> distanceReduction.increment(Config.getInstance().echoShardVibrationDistanceReduction)); + ArmorTrimEffects.ECHO_SHARD.apply(extender.betterTrims$getTrimmables(), () -> distanceReduction.increment(ConfigManager.getConfig().echoShardVibrationDistanceReduction)); double listenerDistance = (8 - listenerPos.distanceTo(emitterPos)) - distanceReduction.getFloat(); return listenerDistance > 0; } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/ItemEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/ItemEntityMixin.java index 8dc552d..2db30f0 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/ItemEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/ItemEntityMixin.java @@ -7,13 +7,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @SuppressWarnings("unused") @Mixin(ItemEntity.class) public abstract class ItemEntityMixin { - @Shadow public abstract ItemStack getStack(); + @Shadow + public abstract ItemStack getStack(); @ModifyReturnValue(method = "isFireImmune", at = @At("RETURN")) private boolean checkIfNetheriteTrimmed(boolean original) { diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java index 54acb7d..30793b6 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java @@ -1,28 +1,24 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.util.NumberWrapper; import com.bawnorton.bettertrims.util.RandomHelper; -import com.google.common.collect.ImmutableList; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import net.minecraft.block.BlockState; -import net.minecraft.entity.*; -import net.minecraft.entity.attribute.AttributeContainer; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.passive.AbstractHorseEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; import net.minecraft.registry.tag.DamageTypeTags; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -38,49 +34,51 @@ @SuppressWarnings("unused") @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends EntityMixin { - @Shadow @Final private Map activeStatusEffects; - @Shadow public abstract void setAbsorptionAmount(float amount); - @Shadow public abstract float getAbsorptionAmount(); - + @Shadow + @Final + private Map activeStatusEffects; @Unique private int stopwatch = 0; + @Shadow + public abstract float getAbsorptionAmount(); + + @Shadow + public abstract void setAbsorptionAmount(float amount); + @ModifyArg(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;updateVelocity(FLnet/minecraft/util/math/Vec3d;)V", ordinal = 0)) private float applyTrimSwimSpeedIncrease(float speed) { NumberWrapper increase = NumberWrapper.zero(); - ArmorTrimEffects.COPPER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().copperSwimSpeedIncrease)); + ArmorTrimEffects.COPPER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().copperSwimSpeedIncrease)); return speed + increase.getFloat(); } @ModifyReturnValue(method = "getMovementSpeed()F", at = @At("RETURN")) private float applyTrimSpeedIncrease(float original) { - if(((LivingEntity) (Object) this) instanceof AbstractHorseEntity horseEntity) { - if(horseEntity.getControllingPassenger() instanceof PlayerEntity player) { + if (((LivingEntity) (Object) this) instanceof AbstractHorseEntity horseEntity) { + if (horseEntity.getControllingPassenger() instanceof PlayerEntity player) { NumberWrapper increase = NumberWrapper.one(); - ArmorTrimEffects.REDSTONE.apply(((EntityExtender) player).betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); - if(betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(((EntityExtender) player).betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + ArmorTrimEffects.REDSTONE.apply(((EntityExtender) player).betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().redstoneMovementSpeedIncrease)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(((EntityExtender) player).betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.movementSpeed)); } return original * increase.getFloat(); } } NumberWrapper increase = NumberWrapper.one(); - ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); - if(betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().redstoneMovementSpeedIncrease)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.movementSpeed)); } return original * increase.getFloat(); } - @ModifyExpressionValue(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getVelocity()Lnet/minecraft/util/math/Vec3d;", ordinal = 2), slice = - @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isFallFlying()Z") - )) + @ModifyExpressionValue(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getVelocity()Lnet/minecraft/util/math/Vec3d;", ordinal = 2), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isFallFlying()Z"))) private Vec3d applyTrimSpeedIncrease(Vec3d original) { NumberWrapper increase = NumberWrapper.one(); - ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); - if(betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().redstoneMovementSpeedIncrease)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.movementSpeed)); } return original.multiply(increase.getFloat(), 1, increase.getFloat()); } @@ -89,18 +87,18 @@ private Vec3d applyTrimSpeedIncrease(Vec3d original) { private float applyTrimDamageReduction(float damage, float armor, float armorToughness, Operation original) { float orignal = original.call(damage, armor, armorToughness); NumberWrapper decrease = NumberWrapper.one(); - ArmorTrimEffects.DIAMOND.apply(betterTrims$getTrimmables(), () -> decrease.decrement(Config.getInstance().diamondDamageReduction)); - if(betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> decrease.decrement(Config.getInstance().silverNightBonus.damageReduction)); + ArmorTrimEffects.DIAMOND.apply(betterTrims$getTrimmables(), () -> decrease.decrement(ConfigManager.getConfig().diamondDamageReduction)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> decrease.decrement(ConfigManager.getConfig().silverNightBonus.damageReduction)); } return decrease.getFloat() * orignal; } @ModifyReturnValue(method = "getJumpVelocity", at = @At("RETURN")) private float applyTrimJumpHeight(float original) { - if(betterTrims$shouldSilverApply()) { + if (betterTrims$shouldSilverApply()) { NumberWrapper increase = NumberWrapper.zero(); - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.jumpHeight)); + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.jumpHeight)); return original + increase.getFloat(); } return original; @@ -108,11 +106,11 @@ private float applyTrimJumpHeight(float original) { @ModifyExpressionValue(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/damage/DamageSource;getAttacker()Lnet/minecraft/entity/Entity;")) private Entity applyFireChargeTrim(Entity original) { - if(!ArmorTrimEffects.FIRE_CHARGE.appliesTo(betterTrims$getTrimmables())) return original; + if (!ArmorTrimEffects.FIRE_CHARGE.appliesTo(betterTrims$getTrimmables())) return original; NumberWrapper duration = NumberWrapper.zero(); - ArmorTrimEffects.FIRE_CHARGE.apply(betterTrims$getTrimmables(), () -> duration.increment(Config.getInstance().fireChargeFireDuration)); - if(duration.getInt() > 0) { + ArmorTrimEffects.FIRE_CHARGE.apply(betterTrims$getTrimmables(), () -> duration.increment(ConfigManager.getConfig().fireChargeFireDuration)); + if (duration.getInt() > 0) { original.setOnFireFor(duration.getInt()); } return original; @@ -121,22 +119,22 @@ private Entity applyFireChargeTrim(Entity original) { @ModifyReturnValue(method = "computeFallDamage", at = @At("RETURN")) private int applyTrimFallDamageReduction(int original) { NumberWrapper decrease = NumberWrapper.one(); - ArmorTrimEffects.SLIME_BALL.apply(betterTrims$getTrimmables(), () -> decrease.decrement(Config.getInstance().slimeBallEffects.fallDamageReduction)); + ArmorTrimEffects.SLIME_BALL.apply(betterTrims$getTrimmables(), () -> decrease.decrement(ConfigManager.getConfig().slimeBallEffects.fallDamageReduction)); return (int) (original * decrease.getFloat()); } @ModifyExpressionValue(method = "takeKnockback", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getAttributeValue(Lnet/minecraft/entity/attribute/EntityAttribute;)D")) private double applyTrimKnockbackDecrease(double original) { NumberWrapper decrease = NumberWrapper.one(); - ArmorTrimEffects.SLIME_BALL.apply(betterTrims$getTrimmables(), () -> decrease.decrement(Config.getInstance().slimeBallEffects.knockbackIncrease)); + ArmorTrimEffects.SLIME_BALL.apply(betterTrims$getTrimmables(), () -> decrease.decrement(ConfigManager.getConfig().slimeBallEffects.knockbackIncrease)); return original * decrease.getFloat(); } @Inject(method = "tickStatusEffects", at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;", remap = false)) private void manageAreaEffectCloud(CallbackInfo ci) { - if(!ArmorTrimEffects.DRAGONS_BREATH.appliesTo(betterTrims$getTrimmables())) return; + if (!ArmorTrimEffects.DRAGONS_BREATH.appliesTo(betterTrims$getTrimmables())) return; NumberWrapper radius = NumberWrapper.zero(); - ArmorTrimEffects.DRAGONS_BREATH.apply(betterTrims$getTrimmables(), () -> radius.increment(Config.getInstance().dragonBreathRadius)); + ArmorTrimEffects.DRAGONS_BREATH.apply(betterTrims$getTrimmables(), () -> radius.increment(ConfigManager.getConfig().dragonBreathRadius)); AreaEffectCloudEntity areaEffectCloud = new AreaEffectCloudEntity(getWorld(), getX(), getY(), getZ()); areaEffectCloud.setOwner((LivingEntity) (Object) this); @@ -151,32 +149,32 @@ private void addAbsorptionHearts(CallbackInfo ci) { stopwatch++; if (!ArmorTrimEffects.ENCHANTED_GOLDEN_APPLE.appliesTo(betterTrims$getTrimmables())) return; - NumberWrapper ticksUntilHeal = NumberWrapper.of(Config.getInstance().enchantedGoldenAppleEffects.absorptionDelay); + NumberWrapper ticksUntilHeal = NumberWrapper.of(ConfigManager.getConfig().enchantedGoldenAppleEffects.absorptionDelay); NumberWrapper absorptionAmount = NumberWrapper.zero(); ArmorTrimEffects.ENCHANTED_GOLDEN_APPLE.apply(betterTrims$getTrimmables(), () -> { - ticksUntilHeal.decrement(Config.getInstance().enchantedGoldenAppleEffects.absorptionDelayReduction); - absorptionAmount.increment(Config.getInstance().enchantedGoldenAppleEffects.absorptionAmount); + ticksUntilHeal.decrement(ConfigManager.getConfig().enchantedGoldenAppleEffects.absorptionDelayReduction); + absorptionAmount.increment(ConfigManager.getConfig().enchantedGoldenAppleEffects.absorptionAmount); }); - if(absorptionAmount.getFloat() > Config.getInstance().enchantedGoldenAppleEffects.maxAbsorption) { - absorptionAmount.set(Config.getInstance().enchantedGoldenAppleEffects.maxAbsorption); + if (absorptionAmount.getFloat() > ConfigManager.getConfig().enchantedGoldenAppleEffects.maxAbsorption) { + absorptionAmount.set(ConfigManager.getConfig().enchantedGoldenAppleEffects.maxAbsorption); } ticksUntilHeal.decrement(stopwatch); if (ticksUntilHeal.getInt() > 0) return; stopwatch = 0; - if(getAbsorptionAmount() < absorptionAmount.getFloat()) { + if (getAbsorptionAmount() < absorptionAmount.getFloat()) { setAbsorptionAmount(absorptionAmount.getFloat()); } } @ModifyExpressionValue(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isDead()Z", ordinal = 0)) private boolean shouldDodge(boolean original, DamageSource source, float amount) { - if(original) return true; - if(!ArmorTrimEffects.ENDER_PEARL.appliesTo(betterTrims$getTrimmables())) return false; + if (original) return true; + if (!ArmorTrimEffects.ENDER_PEARL.appliesTo(betterTrims$getTrimmables())) return false; NumberWrapper chance = NumberWrapper.zero(); - ArmorTrimEffects.ENDER_PEARL.apply(betterTrims$getTrimmables(), () -> chance.increment(Config.getInstance().enderPearlEffects.dodgeChance)); - if(chance.getFloat() > RandomHelper.nextFloat() || source.isIn(DamageTypeTags.IS_DROWNING)) { + ArmorTrimEffects.ENDER_PEARL.apply(betterTrims$getTrimmables(), () -> chance.increment(ConfigManager.getConfig().enderPearlEffects.dodgeChance)); + if (chance.getFloat() > RandomHelper.nextFloat() || source.isIn(DamageTypeTags.IS_DROWNING)) { betterTrims$randomTpEntity((LivingEntity) (Object) this); } return false; @@ -184,7 +182,7 @@ private boolean shouldDodge(boolean original, DamageSource source, float amount) @ModifyReturnValue(method = "hurtByWater", at = @At("RETURN")) private boolean checkTrims(boolean original) { - if(original) return true; - return Config.getInstance().enderPearlEffects.waterDamagesUser && ArmorTrimEffects.ENDER_PEARL.appliesTo(betterTrims$getTrimmables()); + if (original) return true; + return ConfigManager.getConfig().enderPearlEffects.waterDamagesUser && ArmorTrimEffects.ENDER_PEARL.appliesTo(betterTrims$getTrimmables()); } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/MobEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/MobEntityMixin.java index 4f7e978..327e261 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/MobEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/MobEntityMixin.java @@ -22,7 +22,7 @@ protected boolean shouldHit(Entity instance, DamageSource source, float amount, @SuppressWarnings("unused") @ModifyExpressionValue(method = "tryAttack", at = @At(value = "INVOKE", target = "Lnet/minecraft/enchantment/EnchantmentHelper;getFireAspect(Lnet/minecraft/entity/LivingEntity;)I")) private int addFireFromTrim(int original) { - if(!ArmorTrimEffects.FIRE_CHARGE.appliesTo(betterTrims$getTrimmables())) return original; + if (!ArmorTrimEffects.FIRE_CHARGE.appliesTo(betterTrims$getTrimmables())) return original; NumberWrapper duration = NumberWrapper.of(original); ArmorTrimEffects.FIRE_CHARGE.apply(betterTrims$getTrimmables(), () -> duration.increment(1)); diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java index 3eb1c7e..a996c2b 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java @@ -1,15 +1,12 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.util.NumberWrapper; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.entity.player.PlayerEntity; -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyVariable; @@ -21,16 +18,16 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin { private int applyTrimExperienceIncrease(int experience) { if (experience <= 0) return experience; NumberWrapper increase = NumberWrapper.one(); - ArmorTrimEffects.QUARTZ.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().quartzExperienceBonus)); + ArmorTrimEffects.QUARTZ.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().quartzExperienceBonus)); return (int) (experience * increase.getFloat()); } @ModifyReturnValue(method = "getMovementSpeed", at = @At("RETURN")) private float applyTrimSpeedIncrease(float original) { NumberWrapper increase = NumberWrapper.one(); - ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); + ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().redstoneMovementSpeedIncrease)); if (betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.movementSpeed)); } return original * increase.getFloat(); } @@ -38,8 +35,8 @@ private float applyTrimSpeedIncrease(float original) { @ModifyArg(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z")) private float applyTrimDamageIncrease(float original) { NumberWrapper increase = NumberWrapper.of(original); - if(betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.attackDamage)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.attackDamage)); } return increase.getFloat(); } @@ -47,8 +44,8 @@ private float applyTrimDamageIncrease(float original) { @ModifyExpressionValue(method = "getAttackCooldownProgressPerTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getAttributeValue(Lnet/minecraft/entity/attribute/EntityAttribute;)D")) private double applyTrimAttackSpeedIncrease(double original) { NumberWrapper increase = NumberWrapper.of(original); - if(betterTrims$shouldSilverApply()) { - ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(Config.getInstance().silverNightBonus.attackSpeed)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), () -> increase.increment(ConfigManager.getConfig().silverNightBonus.attackSpeed)); } return increase.getFloat(); } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/ShulkerBulletEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/ShulkerBulletEntityMixin.java index b7cfce3..2400bec 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/ShulkerBulletEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/ShulkerBulletEntityMixin.java @@ -13,7 +13,8 @@ public abstract class ShulkerBulletEntityMixin extends EntityMixin { @SuppressWarnings("unused") @WrapOperation(method = "onEntityHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z")) private boolean shouldHit(Entity instance, DamageSource source, float amount, Operation orginal) { - if(didDodgeAttack(instance)) return false; + if (didDodgeAttack(instance)) return false; + return orginal.call(instance, source, amount); } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/SmithingScreenHandlerMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/SmithingScreenHandlerMixin.java index 70fd899..a82d2c9 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/SmithingScreenHandlerMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/SmithingScreenHandlerMixin.java @@ -22,7 +22,8 @@ protected SmithingScreenHandlerMixin(@Nullable ScreenHandlerType type, int sy @WrapWithCondition(method = "onTakeOutput", at = @At(value = "INVOKE", target = "Lnet/minecraft/screen/SmithingScreenHandler;decrementStack(I)V", ordinal = 0)) private boolean shouldDecrementElseDamage(SmithingScreenHandler instance, int slot) { ItemStack stack = input.getStack(slot); - if(stack.getItem() == Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE) return true; + if (stack.getItem() == Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE) return true; + stack.setDamage(stack.getDamage() + 1); return stack.getDamage() >= stack.getMaxDamage(); } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/SmithingTemplateItemMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/SmithingTemplateItemMixin.java index 415b2b8..d17f28a 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/SmithingTemplateItemMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/SmithingTemplateItemMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import net.minecraft.item.Item; import net.minecraft.item.SmithingTemplateItem; import org.spongepowered.asm.mixin.Mixin; @@ -11,7 +11,8 @@ public abstract class SmithingTemplateItemMixin { @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/Item;(Lnet/minecraft/item/Item$Settings;)V")) private static Item.Settings grantIncreasedDurability(Item.Settings settings) { - if (Config.getInstance().trimDurability == 1) return settings; - return settings.maxDamage(Config.getInstance().trimDurability); + if (ConfigManager.getConfig().trimDurability == 1) return settings; + + return settings.maxDamage(ConfigManager.getConfig().trimDurability); } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java index 9abe3dd..991704d 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.extend.StatusEffectInstanceExtender; @@ -23,12 +23,22 @@ @Mixin(StatusEffectInstance.class) public abstract class StatusEffectInstanceMixin implements StatusEffectInstanceExtender { - @Shadow @Final private StatusEffect type; - @Shadow private int duration; - @Shadow private int amplifier; + @Unique + private static final ThreadLocal firstUpdateThreadLocal = ThreadLocal.withInitial(() -> false); + @Shadow + @Final + private StatusEffect type; + @Shadow + private int duration; + @Shadow + private int amplifier; + @Unique + private boolean hadFirstUpdate; - @Unique private boolean hadFirstUpdate; - @Unique private static final ThreadLocal firstUpdateThreadLocal = ThreadLocal.withInitial(() -> false); + @Inject(method = "fromNbt(Lnet/minecraft/entity/effect/StatusEffect;Lnet/minecraft/nbt/NbtCompound;)Lnet/minecraft/entity/effect/StatusEffectInstance;", at = @At("HEAD")) + private static void readAdditionalNbt(StatusEffect type, NbtCompound nbt, CallbackInfoReturnable cir) { + firstUpdateThreadLocal.set(nbt.getBoolean("HadFirstUpdate")); + } @Inject(method = "(Lnet/minecraft/entity/effect/StatusEffect;IIZZZLnet/minecraft/entity/effect/StatusEffectInstance;Ljava/util/Optional;)V", at = @At("RETURN")) private void init(StatusEffect type, int duration, int amplifier, boolean ambient, boolean showParticles, boolean showIcon, StatusEffectInstance hiddenEffect, Optional factorCalculationData, CallbackInfo ci) { @@ -48,18 +58,18 @@ private void copyFirstUpgradeBoolean(StatusEffectInstance that, CallbackInfoRetu @Inject(method = "update", at = @At("HEAD")) private void applyGlowstoneUpgrade(LivingEntity entity, Runnable overwriteCallback, CallbackInfoReturnable cir) { - if (!hadFirstUpdate) { - hadFirstUpdate = true; - NumberWrapper chance = NumberWrapper.zero(); - ArmorTrimEffects.GLOWSTONE_DUST.apply(((EntityExtender) entity).betterTrims$getTrimmables(), () -> chance.increment(Config.getInstance().glowstonePotionAmplifierIncreaseChance)); - if (RandomHelper.nextFloat() < chance.getFloat()) this.amplifier += type.isBeneficial() ? 1 : 0; - } + if (hadFirstUpdate) return; + + hadFirstUpdate = true; + NumberWrapper chance = NumberWrapper.zero(); + ArmorTrimEffects.GLOWSTONE_DUST.apply(((EntityExtender) entity).betterTrims$getTrimmables(), () -> chance.increment(ConfigManager.getConfig().glowstonePotionAmplifierIncreaseChance)); + if (RandomHelper.nextFloat() < chance.getFloat()) this.amplifier += type.isBeneficial() ? 1 : 0; } @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/effect/StatusEffectInstance;updateDuration()I", shift = At.Shift.AFTER)) private void applyTrimDurationBuff(LivingEntity entity, Runnable overwriteCallback, CallbackInfoReturnable cir) { NumberWrapper chance = NumberWrapper.zero(); - ArmorTrimEffects.AMETHYST.apply(((EntityExtender) entity).betterTrims$getTrimmables(), () -> chance.increment(Config.getInstance().amethystPotionDurationModifyChance)); + ArmorTrimEffects.AMETHYST.apply(((EntityExtender) entity).betterTrims$getTrimmables(), () -> chance.increment(ConfigManager.getConfig().amethystPotionDurationModifyChance)); if (RandomHelper.nextFloat() < chance.getFloat()) duration += type.isBeneficial() ? 1 : -1; } @@ -68,11 +78,6 @@ private void writeAdditionalNbt(NbtCompound nbt, CallbackInfo ci) { nbt.putBoolean("HadFirstUpdate", hadFirstUpdate); } - @Inject(method = "fromNbt(Lnet/minecraft/entity/effect/StatusEffect;Lnet/minecraft/nbt/NbtCompound;)Lnet/minecraft/entity/effect/StatusEffectInstance;", at = @At("HEAD")) - private static void readAdditionalNbt(StatusEffect type, NbtCompound nbt, CallbackInfoReturnable cir) { - firstUpdateThreadLocal.set(nbt.getBoolean("HadFirstUpdate")); - } - @Override public boolean betterTrims$hadFirstUpdate() { return hadFirstUpdate; diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java index 77bdd25..fe455f5 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java @@ -1,6 +1,6 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -18,10 +18,11 @@ public abstract class VillagerEntityMixin { @Inject(method = "prepareOffersFor", at = @At("TAIL")) private void applyEmeraldTrimDiscount(PlayerEntity player, CallbackInfo ci) { NumberWrapper discount = NumberWrapper.zero(); - ArmorTrimEffects.EMERALD.apply(((EntityExtender) player).betterTrims$getTrimmables(), () -> discount.increment(Config.getInstance().emeraldVillagerDiscount)); + ArmorTrimEffects.EMERALD.apply(((EntityExtender) player).betterTrims$getTrimmables(), () -> discount.increment(ConfigManager.getConfig().emeraldVillagerDiscount)); if (discount.getFloat() > 0) { for (TradeOffer offer : ((VillagerEntity) (Object) this).getOffers()) { - offer.increaseSpecialPrice(-MathHelper.ceil(discount.getFloat() * offer.getOriginalFirstBuyItem().getCount())); + offer.increaseSpecialPrice(-MathHelper.ceil(discount.getFloat() * offer.getOriginalFirstBuyItem() + .getCount())); } } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/EnchantmentHelperMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/EnchantmentHelperMixin.java index 9d290ad..4d5ca1f 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/EnchantmentHelperMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/EnchantmentHelperMixin.java @@ -1,8 +1,8 @@ package com.bawnorton.bettertrims.mixin.compat.connector.fabric; import com.bawnorton.bettertrims.annotation.ConditionalMixin; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; -import com.bawnorton.bettertrims.config.Config; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.ItemStack; @@ -16,7 +16,7 @@ public abstract class EnchantmentHelperMixin { @ModifyExpressionValue(method = "generateEnchantments", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/Item;getEnchantability()I")) private static int getTrimEnchantability(int original, Random random, ItemStack stack, int level, boolean treasureAllowed) { - if (ArmorTrimEffects.LAPIS.appliesTo(stack)) return original + Config.getInstance().lapisEnchantability; + if (ArmorTrimEffects.LAPIS.appliesTo(stack)) return original + ConfigManager.getConfig().lapisEnchantability; return original; } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/PlayerEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/PlayerEntityMixin.java index 0722ead..5b32949 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/PlayerEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/fabric/PlayerEntityMixin.java @@ -1,7 +1,7 @@ package com.bawnorton.bettertrims.mixin.compat.connector.fabric; import com.bawnorton.bettertrims.annotation.ConditionalMixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.mixin.LivingEntityMixin; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -21,8 +21,8 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin { private float applyTrimMiningSpeedIncrease(PlayerInventory instance, BlockState block, Operation original) { NumberWrapper increase = NumberWrapper.of(original.call(instance, block)); ArmorTrimEffects.IRON.apply(betterTrims$getTrimmables(), () -> { - if(instance.getMainHandStack().isSuitableFor(block)) { - increase.increment(Config.getInstance().ironMiningSpeedIncrease); + if (instance.getMainHandStack().isSuitableFor(block)) { + increase.increment(ConfigManager.getConfig().ironMiningSpeedIncrease); } }); return increase.getFloat(); diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/EnchantmentHelperMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/EnchantmentHelperMixin.java index 0b8ecca..3fe633d 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/EnchantmentHelperMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/EnchantmentHelperMixin.java @@ -1,7 +1,7 @@ package com.bawnorton.bettertrims.mixin.compat.connector.forge; import com.bawnorton.bettertrims.annotation.ConditionalMixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.enchantment.EnchantmentHelper; @@ -17,7 +17,7 @@ public abstract class EnchantmentHelperMixin { @SuppressWarnings("MixinAnnotationTarget") // forge renames the method @ModifyExpressionValue(method = "generateEnchantments", at = @At(value = "INVOKE", target = "net/minecraft/item/ItemStack.getEnchantmentValue()I")) private static int getTrimEnchantability(int original, Random random, ItemStack stack, int level, boolean treasureAllowed) { - if (ArmorTrimEffects.LAPIS.appliesTo(stack)) return original + Config.getInstance().lapisEnchantability; + if (ArmorTrimEffects.LAPIS.appliesTo(stack)) return original + ConfigManager.getConfig().lapisEnchantability; return original; } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/PlayerEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/PlayerEntityMixin.java index 0fa2ff3..67d47b6 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/PlayerEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/compat/connector/forge/PlayerEntityMixin.java @@ -1,7 +1,7 @@ package com.bawnorton.bettertrims.mixin.compat.connector.forge; import com.bawnorton.bettertrims.annotation.ConditionalMixin; -import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.config.ConfigManager; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.mixin.LivingEntityMixin; import com.bawnorton.bettertrims.util.NumberWrapper; @@ -22,8 +22,8 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin { private float applyTrimMiningSpeedIncrease(PlayerInventory instance, BlockState block, Operation original) { NumberWrapper increase = NumberWrapper.of(original.call(instance, block)); ArmorTrimEffects.IRON.apply(betterTrims$getTrimmables(), () -> { - if(instance.getMainHandStack().isSuitableFor(block)) { - increase.increment(Config.getInstance().ironMiningSpeedIncrease); + if (instance.getMainHandStack().isSuitableFor(block)) { + increase.increment(ConfigManager.getConfig().ironMiningSpeedIncrease); } }); return increase.getFloat(); diff --git a/src/main/java/com/bawnorton/bettertrims/networking/Networking.java b/src/main/java/com/bawnorton/bettertrims/networking/Networking.java index 20b3d5c..59c2a74 100644 --- a/src/main/java/com/bawnorton/bettertrims/networking/Networking.java +++ b/src/main/java/com/bawnorton/bettertrims/networking/Networking.java @@ -13,6 +13,7 @@ public abstract class Networking { public static final Identifier CONFIG_OP_CHECK = BetterTrims.id("config_op_check"); public static final Identifier CONFIG_SYNC = BetterTrims.id("config_sync"); public static final Identifier HANDSHAKE = BetterTrims.id("handshake"); + private static MinecraftServer server; public static void init() { ServerPlayNetworking.registerGlobalReceiver(HANDSHAKE, (server, player, handler, buf, responseSender) -> sendConfigToPlayer(player)); @@ -34,7 +35,17 @@ private static void sendConfigToAllPlayers(MinecraftServer server) { private static void sendConfigToPlayer(ServerPlayerEntity player) { String serialized = ConfigManager.serializeConfig(); PacketByteBuf buf = PacketByteBufs.create(); + buf.writeBoolean(Networking.isDedicated()); buf.writeString(serialized); ServerPlayNetworking.send(player, CONFIG_SYNC, buf); } + + public static void setServer(MinecraftServer server) { + Networking.server = server; + } + + public static boolean isDedicated() { + if (server == null) return false; + return server.isDedicated(); + } } diff --git a/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java b/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java index db42df6..b355ae2 100644 --- a/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java +++ b/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java @@ -1,6 +1,10 @@ package com.bawnorton.bettertrims.util; public class NumberWrapper extends Wrapper { + protected NumberWrapper(Number value) { + super(value); + } + public static NumberWrapper zero() { return of(0); } @@ -9,10 +13,6 @@ public static NumberWrapper one() { return of(1); } - protected NumberWrapper(Number value) { - super(value); - } - public static NumberWrapper of(Number value) { return new NumberWrapper(value); } diff --git a/src/main/java/com/bawnorton/bettertrims/util/Reflection.java b/src/main/java/com/bawnorton/bettertrims/util/Reflection.java index ab1ba1d..0df4044 100644 --- a/src/main/java/com/bawnorton/bettertrims/util/Reflection.java +++ b/src/main/java/com/bawnorton/bettertrims/util/Reflection.java @@ -36,10 +36,9 @@ private static void forEachAnnotatedField(Class clazz, Consumer fieldC public static Object accessField(Field field, Object instance) { Object value; try { - if(field.canAccess(instance)) { + if (field.canAccess(instance)) { value = field.get(instance); - } - else { + } else { BetterTrims.LOGGER.warn("Field " + field.getName() + " was inaccessible, forcing access. This is unexpected."); field.setAccessible(true); value = field.get(instance); @@ -57,10 +56,9 @@ public static T accessField(Field field, Object instance, Class fieldClas public static void setField(Field field, Object instance, Object value) { try { - if(field.canAccess(instance)) { + if (field.canAccess(instance)) { field.set(instance, value); - } - else { + } else { BetterTrims.LOGGER.warn("Field " + field.getName() + " was inaccessible, forcing access. This is unexpected."); field.setAccessible(true); field.set(instance, value); diff --git a/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java b/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java index 62266a9..e3361e1 100644 --- a/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java +++ b/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java @@ -12,6 +12,7 @@ public record RegexIdentifier(String namespace, String path) { public boolean matches(@Nullable Identifier other) { if (other == null) return false; + return matches(other.getNamespace(), other.getPath()); } @@ -27,14 +28,12 @@ private boolean matches(String namespace, String path) { } private boolean matchesNamespace(String namespace) { - compiledPatterns.putIfAbsent(this.namespace(), Pattern.compile(this.namespace())); - Pattern pattern = compiledPatterns.get(this.namespace()); + Pattern pattern = compiledPatterns.computeIfAbsent(this.namespace(), Pattern::compile); return pattern.matcher(namespace).matches(); } private boolean matchesPath(String path) { - compiledPatterns.putIfAbsent(this.path(), Pattern.compile(this.path())); - Pattern pattern = compiledPatterns.get(this.path()); + Pattern pattern = compiledPatterns.computeIfAbsent(this.path(), Pattern::compile); return pattern.matcher(path).matches(); } } diff --git a/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java b/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java index cff4bb0..8bc201f 100644 --- a/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java +++ b/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java @@ -22,8 +22,7 @@ public void set(T value) { @Override public String toString() { if (value == null) return "null"; - return "Wrapper{" + - "type=" + value + - '}'; + + return "Wrapper{" + "type=" + value + '}'; } } diff --git a/src/main/resources/assets/bettertrims/lang/en_us.json b/src/main/resources/assets/bettertrims/lang/en_us.json deleted file mode 100644 index 294b4ea..0000000 --- a/src/main/resources/assets/bettertrims/lang/en_us.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "effect.bettertrims.quartz.tooltip": "Gain More Experience", - "effect.bettertrims.iron.tooltip": "Mine Faster", - "effect.bettertrims.netherite.tooltip": "Fire Resistant", - "effect.bettertrims.redstone.tooltip": "Move Faster", - "effect.bettertrims.copper.tooltip": "Swim Faster", - "effect.bettertrims.gold.tooltip": "Piglins Ignore You", - "effect.bettertrims.emerald.tooltip": "Villagers Like You", - "effect.bettertrims.diamond.tooltip": "Harder to Kill", - "effect.bettertrims.lapis.tooltip": "More Enchantable", - "effect.bettertrims.amethyst.tooltip": "Stronger Potion Effects", - "effect.bettertrims.platinum.tooltip": "Illagers Ignore You", - "effect.bettertrims.silver.tooltip": "Stronger at Night", - "effect.bettertrims.coal.tooltip": "Faster Furnances", - "effect.bettertrims.dragons_breath.tooltip": "Share Potion Effects", - "effect.bettertrims.chorus_fruit.tooltip": "Dodge End Attacks", - "effect.bettertrims.echo_shard.tooltip": "Harder to Detect", - "effect.bettertrims.fire_charge.tooltip": "Hot to the Touch", - "effect.bettertrims.ender_pearl.tooltip": "Dodge Attacks", - "effect.bettertrims.glowstone_dust.tooltip": "Stronger Potion Effects", - "effect.bettertrims.leather.tooltip": "Bigger Strides", - "effect.bettertrims.nether_brick.tooltip": "One with the Fortress", - "effect.bettertrims.prismarine_shard.tooltip": "Guardians Ignore You", - "effect.bettertrims.rabbit_hide.tooltip": "Animals do not Fear You", - "effect.bettertrims.slime_ball.tooltip": "Kinetic Absorper", - "effect.bettertrims.enchanted_golden_apple.toolip": "Gain Absorption Over Time" -} \ No newline at end of file diff --git a/src/main/resources/bettertrims.mixins.json b/src/main/resources/bettertrims.mixins.json index 3874405..ee5aa5a 100644 --- a/src/main/resources/bettertrims.mixins.json +++ b/src/main/resources/bettertrims.mixins.json @@ -31,5 +31,5 @@ ], "injectors": { "defaultRequire": 1 - } + } } \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b750b58..975b06e 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,44 +1,44 @@ { - "schemaVersion": 1, - "id": "bettertrims", - "version": "${version}", - "name": "bettertrims", - "description": "Gives each armour trim material a unique effect when worn.", - "authors": [ - "Bawnorton" - ], - "contact": { - "homepage": "https://bawnorton.com", - "sources": "https://github.com/Benjamin-Norton/BetterTrims" - }, - "license": "CC0-1.0", - "icon": "assets/bettertrims/icon.png", - "environment": "*", - "entrypoints": { - "main": [ - "com.bawnorton.bettertrims.BetterTrims" - ], - "client": [ - "com.bawnorton.bettertrims.client.BetterTrimsClient" - ], - "preLaunch": [ - "com.bawnorton.bettertrims.BetterTrimsPreLaunch" - ], - "modmenu": [ - "com.bawnorton.bettertrims.client.impl.ModMenuApiImpl" - ] - }, - "mixins": [ - "bettertrims.mixins.json", - { - "config": "bettertrims.client.mixins.json", - "environment": "client" - } - ], - "depends": { - "fabricloader": ">=0.14.21", - "minecraft": "~1.20", - "java": ">=17", - "fabric-api": ">=0.83.0" - } + "schemaVersion": 1, + "id": "bettertrims", + "version": "${version}", + "name": "bettertrims", + "description": "Gives each armour trim material a unique effect when worn.", + "authors": [ + "Bawnorton" + ], + "contact": { + "homepage": "https://bawnorton.com", + "sources": "https://github.com/Benjamin-Norton/BetterTrims" + }, + "license": "CC0-1.0", + "icon": "assets/bettertrims/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "com.bawnorton.bettertrims.BetterTrims" + ], + "client": [ + "com.bawnorton.bettertrims.client.BetterTrimsClient" + ], + "preLaunch": [ + "com.bawnorton.bettertrims.BetterTrimsPreLaunch" + ], + "modmenu": [ + "com.bawnorton.bettertrims.client.impl.ModMenuApiImpl" + ] + }, + "mixins": [ + "bettertrims.mixins.json", + { + "config": "bettertrims.client.mixins.json", + "environment": "client" + } + ], + "depends": { + "fabricloader": ">=0.14.21", + "minecraft": "~1.20", + "java": ">=17", + "fabric-api": ">=0.83.0" + } } \ No newline at end of file