Skip to content

Commit

Permalink
Rework config and networking and cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Bawnorton committed Sep 20, 2023
1 parent c269c3a commit 5dbd957
Show file tree
Hide file tree
Showing 55 changed files with 645 additions and 453 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
}
}
79 changes: 41 additions & 38 deletions src/client/java/com/bawnorton/bettertrims/client/impl/YACLImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -26,45 +25,49 @@ 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);
}

private static Collection<? extends Option<?>> generateOptionsForType(OptionType type) {
Collection<Option<?>> 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));
Expand All @@ -74,15 +77,16 @@ private static Collection<? extends Option<?>> generateOptionsForType(OptionType
}

private static Collection<? extends Option<?>> 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<Option<?>> 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));
Expand All @@ -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()));
};
}

Expand All @@ -106,8 +111,7 @@ private static Option<Float> 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))
Expand All @@ -131,8 +135,7 @@ private static Option<Integer> 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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Text> 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()))));
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});
}

Expand All @@ -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;
}
}
Loading

0 comments on commit 5dbd957

Please sign in to comment.