From 96867ea31497c357814122ed457cc2a4f996bbf2 Mon Sep 17 00:00:00 2001 From: Kamigen <46357922+Edouard127@users.noreply.github.com> Date: Sat, 29 Jun 2024 14:31:18 -0400 Subject: [PATCH 1/2] Fix: Settings (don't touch it bites) --- .../kotlin/com/lambda/config/Configurable.kt | 19 ++++++++++++++----- .../kotlin/com/lambda/config/Configuration.kt | 9 +++------ .../settings/collections/ListSetting.kt | 12 ++++-------- .../config/settings/collections/MapSetting.kt | 13 ++++++++++--- .../config/settings/collections/SetSetting.kt | 11 +++++++++-- .../com/lambda/friend/FriendRegistry.kt | 2 +- .../main/kotlin/com/lambda/module/Module.kt | 5 ++--- .../module/modules/network/PacketLogger.kt | 7 ++----- .../lambda/module/modules/render/BlockESP.kt | 5 +---- .../main/kotlin/com/lambda/util/BlockUtils.kt | 1 - 10 files changed, 46 insertions(+), 38 deletions(-) diff --git a/common/src/main/kotlin/com/lambda/config/Configurable.kt b/common/src/main/kotlin/com/lambda/config/Configurable.kt index 9d6cb47d3..9f67f4ca3 100644 --- a/common/src/main/kotlin/com/lambda/config/Configurable.kt +++ b/common/src/main/kotlin/com/lambda/config/Configurable.kt @@ -159,8 +159,9 @@ abstract class Configurable( * The type parameter [T] must either be a primitive type or a type with a registered type adapter in [Lambda.gson]. * * @param name The unique identifier for the setting. - * @param defaultValue The default [ArrayList] value of type [T] for the setting. + * @param defaultValue The default [List] value of type [T] for the setting. * @param description A brief explanation of the setting's purpose and behavior. + * @param hackDelegates A flag that determines whether the setting should be serialized with the default value. * @param visibility A lambda expression that determines the visibility status of the setting. * * ```kotlin @@ -175,12 +176,14 @@ abstract class Configurable( defaultValue: List, description: String = "", noinline visibility: () -> Boolean = { true }, + hackDelegates: Boolean = false, ) = ListSetting( name, defaultValue.toMutableList(), TypeToken.getParameterized(MutableList::class.java, T::class.java).type, description, - visibility + hackDelegates, + visibility, ).also { settings.add(it) } @@ -193,6 +196,7 @@ abstract class Configurable( * @param name The unique identifier for the setting. * @param defaultValue The default [Map] value of type [K] and [V] for the setting. * @param description A brief explanation of the setting's purpose and behavior. + * @param hackDelegates A flag that determines whether the setting should be serialized with the default value. * @param visibility A lambda expression that determines the visibility status of the setting. * * ```kotlin @@ -206,12 +210,14 @@ abstract class Configurable( name: String, defaultValue: Map, description: String = "", + hackDelegates: Boolean, noinline visibility: () -> Boolean = { true }, ) = MapSetting( name, defaultValue.toMutableMap(), - TypeToken.getParameterized(Map::class.java, K::class.java, V::class.java).type, + TypeToken.getParameterized(MutableMap::class.java, K::class.java, V::class.java).type, description, + hackDelegates, visibility ).also { settings.add(it) @@ -225,6 +231,7 @@ abstract class Configurable( * @param name The unique identifier for the setting. * @param defaultValue The default [Set] value of type [T] for the setting. * @param description A brief explanation of the setting's purpose and behavior. + * @param hackDelegates A flag that determines whether the setting should be serialized with the default value. * @param visibility A lambda expression that determines the visibility status of the setting. * * ```kotlin @@ -238,13 +245,15 @@ abstract class Configurable( name: String, defaultValue: Set, description: String = "", + hackDelegates: Boolean = false, noinline visibility: () -> Boolean = { true }, ) = SetSetting( name, defaultValue.toMutableSet(), - TypeToken.getParameterized(Set::class.java, T::class.java).type, + TypeToken.getParameterized(MutableSet::class.java, T::class.java).type, description, - visibility + hackDelegates, + visibility, ).also { settings.add(it) } diff --git a/common/src/main/kotlin/com/lambda/config/Configuration.kt b/common/src/main/kotlin/com/lambda/config/Configuration.kt index eaa64b2c3..4560a8597 100644 --- a/common/src/main/kotlin/com/lambda/config/Configuration.kt +++ b/common/src/main/kotlin/com/lambda/config/Configuration.kt @@ -79,18 +79,15 @@ abstract class Configuration : Jsonable { private fun save() { with(primary) { - if (exists()) { - copyTo(backup, true) - } + if (exists()) copyTo(backup, true) + parentFile.mkdirs() writeText(gson.toJson(toJson())) } } private fun load(file: File) { - check(file.exists()) { - "No configuration file found for ${configName.capitalize()}" - } + check(file.exists()) { "No configuration file found for ${configName.capitalize()}" } loadFromJson(JsonParser.parseReader(file.reader()).asJsonObject) } diff --git a/common/src/main/kotlin/com/lambda/config/settings/collections/ListSetting.kt b/common/src/main/kotlin/com/lambda/config/settings/collections/ListSetting.kt index 1c002df86..1ee3e436a 100644 --- a/common/src/main/kotlin/com/lambda/config/settings/collections/ListSetting.kt +++ b/common/src/main/kotlin/com/lambda/config/settings/collections/ListSetting.kt @@ -1,16 +1,15 @@ package com.lambda.config.settings.collections import com.google.gson.JsonElement -import com.google.gson.reflect.TypeToken -import com.lambda.Lambda.gson import com.lambda.config.AbstractSetting import java.lang.reflect.Type class ListSetting( override val name: String, private val defaultValue: MutableList, - private val type: Type, + type: Type, description: String, + private val hackDelegates: Boolean, visibility: () -> Boolean, ) : AbstractSetting>( defaultValue, @@ -18,11 +17,8 @@ class ListSetting( description, visibility ) { - override fun loadFromJson(serialized: JsonElement) { - value = gson.fromJson(serialized, type) - } - override fun toJson(): JsonElement { - return gson.toJsonTree(value) + if (hackDelegates) value = defaultValue + return super.toJson() } } diff --git a/common/src/main/kotlin/com/lambda/config/settings/collections/MapSetting.kt b/common/src/main/kotlin/com/lambda/config/settings/collections/MapSetting.kt index b8c36c63f..c4e23be05 100644 --- a/common/src/main/kotlin/com/lambda/config/settings/collections/MapSetting.kt +++ b/common/src/main/kotlin/com/lambda/config/settings/collections/MapSetting.kt @@ -1,17 +1,24 @@ package com.lambda.config.settings.collections +import com.google.gson.JsonElement import com.lambda.config.AbstractSetting import java.lang.reflect.Type class MapSetting( override val name: String, - defaultValue: MutableMap, + private val defaultValue: Map, type: Type, description: String, + private val hackDelegates: Boolean, visibility: () -> Boolean, -) : AbstractSetting>( +) : AbstractSetting>( defaultValue, type, description, visibility -) +) { + override fun toJson(): JsonElement { + if (hackDelegates) value = defaultValue + return super.toJson() + } +} diff --git a/common/src/main/kotlin/com/lambda/config/settings/collections/SetSetting.kt b/common/src/main/kotlin/com/lambda/config/settings/collections/SetSetting.kt index d4da0afd8..ca1494281 100644 --- a/common/src/main/kotlin/com/lambda/config/settings/collections/SetSetting.kt +++ b/common/src/main/kotlin/com/lambda/config/settings/collections/SetSetting.kt @@ -1,17 +1,24 @@ package com.lambda.config.settings.collections +import com.google.gson.JsonElement import com.lambda.config.AbstractSetting import java.lang.reflect.Type class SetSetting( override val name: String, - defaultValue: MutableSet, + private val defaultValue: MutableSet, type: Type, description: String, + private val hackDelegates: Boolean, visibility: () -> Boolean, ) : AbstractSetting>( defaultValue, type, description, visibility -) +) { + override fun toJson(): JsonElement { + if (hackDelegates) value = defaultValue + return super.toJson() + } +} diff --git a/common/src/main/kotlin/com/lambda/friend/FriendRegistry.kt b/common/src/main/kotlin/com/lambda/friend/FriendRegistry.kt index aefeaac44..553535964 100644 --- a/common/src/main/kotlin/com/lambda/friend/FriendRegistry.kt +++ b/common/src/main/kotlin/com/lambda/friend/FriendRegistry.kt @@ -8,7 +8,7 @@ import com.mojang.authlib.GameProfile object FriendRegistry : Configurable(FriendConfig), Loadable { override val name = "friends" - val friends by setting("friends", listOf()) // Todo: Fix the fucking delegates + val friends by setting("friends", listOf(), hackDelegates = true) override fun load(): String { return "Loaded ${friends.size} friends" diff --git a/common/src/main/kotlin/com/lambda/module/Module.kt b/common/src/main/kotlin/com/lambda/module/Module.kt index c77ab47ee..dd575ba1f 100644 --- a/common/src/main/kotlin/com/lambda/module/Module.kt +++ b/common/src/main/kotlin/com/lambda/module/Module.kt @@ -15,7 +15,6 @@ import com.lambda.event.listener.SafeListener.Companion.listener import com.lambda.event.listener.UnsafeListener import com.lambda.gui.impl.clickgui.LambdaClickGui import com.lambda.module.tag.ModuleTag -import com.lambda.task.Task import com.lambda.util.KeyCode import com.lambda.util.Nameable @@ -99,7 +98,7 @@ abstract class Module( private val isEnabledSetting = setting("Enabled", enabledByDefault, visibility = { false }) private val keybindSetting = setting("Keybind", defaultKeybind) private val isVisible = setting("Visible", true) - val customTags = setting("Tags", emptySet(), visibility = { false }) + val customTags = setting("Tags", setOf(), visibility = { false }) var isEnabled by isEnabledSetting val isDisabled get() = !isEnabled @@ -167,4 +166,4 @@ abstract class Module( if (from != to) block(to) } } -} \ No newline at end of file +} diff --git a/common/src/main/kotlin/com/lambda/module/modules/network/PacketLogger.kt b/common/src/main/kotlin/com/lambda/module/modules/network/PacketLogger.kt index 5c3667cb0..724de4fa7 100644 --- a/common/src/main/kotlin/com/lambda/module/modules/network/PacketLogger.kt +++ b/common/src/main/kotlin/com/lambda/module/modules/network/PacketLogger.kt @@ -2,7 +2,6 @@ package com.lambda.module.modules.network import com.lambda.Lambda import com.lambda.Lambda.mc -import com.lambda.event.EventFlow.lambdaScope import com.lambda.event.events.PacketEvent import com.lambda.event.events.TickEvent import com.lambda.event.listener.UnsafeListener.Companion.unsafeConcurrentListener @@ -16,10 +15,8 @@ import com.lambda.util.DynamicReflectionSerializer.dynamicString import com.lambda.util.FolderRegister import com.lambda.util.Formatting.getTime import com.lambda.util.text.* -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.launch import net.minecraft.network.packet.Packet import java.awt.Color import java.io.File @@ -38,8 +35,8 @@ object PacketLogger : Module( private val networkSide by setting("Network Side", NetworkSide.ANY, "Side of the network to log packets from") private val logTicks by setting("Log Ticks", true, "Show game ticks in the log") private val scope by setting("Scope", Scope.ANY, "Scope of packets to log") - private val whitelist by setting("Whitelist Packets", arrayListOf(), "Packets to whitelist") { scope == Scope.WHITELIST } - private val blacklist by setting("Blacklist Packets", arrayListOf(), "Packets to blacklist") { scope == Scope.BLACKLIST } + private val whitelist by setting("Whitelist Packets", emptyList(), "Packets to whitelist", visibility = { scope == Scope.WHITELIST }) + private val blacklist by setting("Blacklist Packets", emptyList(), "Packets to blacklist", visibility = { scope == Scope.BLACKLIST }) private val maxRecursionDepth by setting("Max Recursion Depth", 6, 1..10, 1, "Maximum recursion depth for packet serialization") private val logConcurrent by setting("Build Data Concurrent", false, "Whether to serialize packets concurrently. Will not save packets in chronological order but wont lag the game.") diff --git a/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt b/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt index 2413139ae..9a1139126 100644 --- a/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt +++ b/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt @@ -4,8 +4,6 @@ import com.lambda.Lambda.mc import com.lambda.graphics.renderer.esp.ChunkedESP.Companion.newChunkedESP import com.lambda.graphics.renderer.esp.DirectionMask import com.lambda.graphics.renderer.esp.DirectionMask.buildSideMesh -import com.lambda.graphics.renderer.esp.DirectionMask.exclude -import com.lambda.graphics.renderer.esp.DirectionMask.mask import com.lambda.graphics.renderer.esp.ESPRenderer import com.lambda.graphics.renderer.esp.global.buildFilled import com.lambda.graphics.renderer.esp.global.buildOutline @@ -17,7 +15,6 @@ import net.minecraft.block.Blocks import net.minecraft.client.render.model.BakedModel import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Box -import net.minecraft.util.math.Direction import java.awt.Color object BlockESP : Module( @@ -98,4 +95,4 @@ object BlockESP : Module( buildOutline(box, outlineColor, sides, outlineMode) } } -} \ No newline at end of file +} diff --git a/common/src/main/kotlin/com/lambda/util/BlockUtils.kt b/common/src/main/kotlin/com/lambda/util/BlockUtils.kt index f81bfdfa0..b60bbd435 100644 --- a/common/src/main/kotlin/com/lambda/util/BlockUtils.kt +++ b/common/src/main/kotlin/com/lambda/util/BlockUtils.kt @@ -6,7 +6,6 @@ import com.lambda.util.item.ItemUtils.shulkerBoxes import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.block.Blocks -import net.minecraft.client.world.ClientWorld import net.minecraft.fluid.FluidState import net.minecraft.fluid.Fluids import net.minecraft.item.Item From 38727ea118344546def5db9a35cacab48a42558f Mon Sep 17 00:00:00 2001 From: Kamigen <46357922+Edouard127@users.noreply.github.com> Date: Wed, 3 Jul 2024 19:41:47 -0400 Subject: [PATCH 2/2] Fix: Optional serializer --- common/src/main/kotlin/com/lambda/Lambda.kt | 3 ++- .../config/serializer/OptionalSerializer.kt | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 common/src/main/kotlin/com/lambda/config/serializer/OptionalSerializer.kt diff --git a/common/src/main/kotlin/com/lambda/Lambda.kt b/common/src/main/kotlin/com/lambda/Lambda.kt index d3ac11d6a..37b326f25 100644 --- a/common/src/main/kotlin/com/lambda/Lambda.kt +++ b/common/src/main/kotlin/com/lambda/Lambda.kt @@ -10,7 +10,6 @@ import com.lambda.core.Loader import com.lambda.gui.impl.clickgui.windows.tag.CustomModuleWindow import com.lambda.gui.impl.clickgui.windows.tag.TagWindow import com.lambda.module.tag.ModuleTag -import com.lambda.threading.runGameScheduled import com.lambda.util.KeyCode import com.mojang.authlib.GameProfile import com.mojang.blaze3d.systems.RenderSystem.recordRenderCall @@ -20,6 +19,7 @@ import net.minecraft.util.math.BlockPos import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger import java.awt.Color +import java.util.* object Lambda { const val MOD_NAME = "Lambda" @@ -40,6 +40,7 @@ object Lambda { .registerTypeAdapter(BlockPos::class.java, BlockPosSerializer) .registerTypeAdapter(Block::class.java, BlockSerializer) .registerTypeAdapter(GameProfile::class.java, GameProfileSerializer) + .registerTypeAdapter(Optional::class.java, OptionalSerializer) .create() fun initialize() { diff --git a/common/src/main/kotlin/com/lambda/config/serializer/OptionalSerializer.kt b/common/src/main/kotlin/com/lambda/config/serializer/OptionalSerializer.kt new file mode 100644 index 000000000..bac24c352 --- /dev/null +++ b/common/src/main/kotlin/com/lambda/config/serializer/OptionalSerializer.kt @@ -0,0 +1,17 @@ +package com.lambda.config.serializer + +import com.google.gson.* +import java.lang.reflect.Type +import java.util.* + +object OptionalSerializer : JsonSerializer>, JsonDeserializer> { + override fun serialize(src: Optional?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement = + src?.map { context?.serialize(it) }?.orElse(JsonNull.INSTANCE) ?: JsonNull.INSTANCE + + override fun deserialize( + json: JsonElement?, + typeOfT: Type?, + context: JsonDeserializationContext? + ): Optional = + Optional.ofNullable(json?.let { context?.deserialize(it, typeOfT) ?: Optional.empty() }) +}