Skip to content

Commit ff286cf

Browse files
authored
Merge pull request #12 from Avanatiker/feature/friends
Feature: Friends
2 parents 0006241 + 5674bb3 commit ff286cf

File tree

22 files changed

+345
-47
lines changed

22 files changed

+345
-47
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.lambda.mixin.items;
2+
3+
import com.lambda.module.modules.movement.TridentBoost;
4+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
5+
import net.minecraft.item.TridentItem;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.ModifyArg;
9+
10+
@Mixin(TridentItem.class)
11+
public class TridentMixin {
12+
// Forge doesn't support the @ModityArgs annotation, so we have to chain multiple @ModifyArg
13+
@ModifyArg(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;addVelocity(DDD)V"), index = 0)
14+
private double modifyVelocity0(double velocity) { return TridentBoost.INSTANCE.isEnabled() ? velocity * TridentBoost.INSTANCE.getTridentSpeed() : velocity; }
15+
16+
@ModifyArg(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;addVelocity(DDD)V"), index = 1)
17+
private double modifyVelocity1(double velocity) { return TridentBoost.INSTANCE.isEnabled() ? velocity * TridentBoost.INSTANCE.getTridentSpeed() : velocity; }
18+
19+
@ModifyArg(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;addVelocity(DDD)V"), index = 2)
20+
private double modifyVelocity2(double velocity) { return TridentBoost.INSTANCE.isEnabled() ? velocity * TridentBoost.INSTANCE.getTridentSpeed() : velocity; }
21+
22+
@ModifyExpressionValue(method = {"onStoppedUsing", "use"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z"))
23+
private boolean modifyIsTouchingWaterOrRain(boolean original) { return TridentBoost.INSTANCE.isEnabled() ? TridentBoost.INSTANCE.getForceUse() : original; }
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.lambda.mixin.world;
2+
3+
import com.lambda.module.modules.movement.TridentFlight;
4+
import net.minecraft.util.math.BlockPos;
5+
import net.minecraft.world.World;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
10+
11+
@Mixin(World.class)
12+
public class WorldMixin {
13+
@Inject(method = "hasRain", at = @At("HEAD"), cancellable = true)
14+
private void hasRain(BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
15+
if (TridentFlight.INSTANCE.isEnabled()) cir.setReturnValue(TridentFlight.INSTANCE.getRain());
16+
}
17+
}

common/src/main/kotlin/com/lambda/Lambda.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.lambda.core.Loader
99
import com.lambda.gui.impl.clickgui.windows.TagWindow
1010
import com.lambda.module.tag.ModuleTag
1111
import com.lambda.util.KeyCode
12+
import com.mojang.authlib.GameProfile
1213
import net.minecraft.block.Block
1314
import net.minecraft.client.MinecraftClient
1415
import net.minecraft.util.math.BlockPos
@@ -32,6 +33,7 @@ object Lambda {
3233
.registerTypeAdapter(Color::class.java, ColorSerializer)
3334
.registerTypeAdapter(BlockPos::class.java, BlockPosSerializer)
3435
.registerTypeAdapter(Block::class.java, BlockSerializer)
36+
.registerTypeAdapter(GameProfile::class.java, GameProfileSerializer)
3537
.create()
3638

3739
fun initialize() = Loader.initialize()

common/src/main/kotlin/com/lambda/config/Configurable.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,13 @@ abstract class Configurable(configuration: Configuration) : Jsonable, Nameable {
151151
* The type parameter [T] must either be a primitive type or a type with a registered type adapter in [Lambda.gson].
152152
*
153153
* @param name The unique identifier for the setting.
154-
* @param defaultValue The default [List] value of type [T] for the setting.
154+
* @param defaultValue The default [ArrayList] value of type [T] for the setting.
155155
* @param description A brief explanation of the setting's purpose and behavior.
156156
* @param visibility A lambda expression that determines the visibility status of the setting.
157157
*
158158
* ```kotlin
159159
* // the parameter type is inferred from the defaultValue
160-
* private val foo by setting("Foo", listOf("bar", "baz"))
160+
* private val foo by setting("Foo", arrayListOf("bar", "baz"))
161161
* ```
162162
*
163163
* @return The created [ListSetting].
@@ -167,7 +167,7 @@ abstract class Configurable(configuration: Configuration) : Jsonable, Nameable {
167167
defaultValue: List<T>,
168168
description: String = "",
169169
noinline visibility: () -> Boolean = { true },
170-
) = ListSetting(name, defaultValue, object : TypeToken<List<T>>() {}.type, description, visibility).also {
170+
) = ListSetting(name, defaultValue.toMutableList(), TypeToken.getParameterized(MutableList::class.java, T::class.java).type, description, visibility).also {
171171
settings.add(it)
172172
}
173173

@@ -188,12 +188,12 @@ abstract class Configurable(configuration: Configuration) : Jsonable, Nameable {
188188
*
189189
* @return The created [MapSetting].
190190
*/
191-
inline fun <reified K : Any, V : Any> setting(
191+
inline fun <reified K : Any, reified V : Any> setting(
192192
name: String,
193193
defaultValue: Map<K, V>,
194194
description: String = "",
195195
noinline visibility: () -> Boolean = { true },
196-
) = MapSetting(name, defaultValue, object : TypeToken<Map<K, V>>() {}.type, description, visibility).also {
196+
) = MapSetting(name, defaultValue.toMutableMap(), TypeToken.getParameterized(Map::class.java, K::class.java, V::class.java).type, description, visibility).also {
197197
settings.add(it)
198198
}
199199

@@ -219,7 +219,7 @@ abstract class Configurable(configuration: Configuration) : Jsonable, Nameable {
219219
defaultValue: Set<T>,
220220
description: String = "",
221221
noinline visibility: () -> Boolean = { true },
222-
) = SetSetting(name, defaultValue, object : TypeToken<Set<T>>() {}.type, description, visibility).also {
222+
) = SetSetting(name, defaultValue.toMutableSet(), TypeToken.getParameterized(Set::class.java, T::class.java).type, description, visibility).also {
223223
settings.add(it)
224224
}
225225

@@ -448,4 +448,4 @@ abstract class Configurable(configuration: Configuration) : Jsonable, Nameable {
448448
) = BlockSetting(name, defaultValue, description, visibility).also {
449449
settings.add(it)
450450
}
451-
}
451+
}

common/src/main/kotlin/com/lambda/config/Configuration.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ abstract class Configuration : Jsonable {
9999
this@Configuration.info(message)
100100
}
101101
.onFailure {
102-
val message = "Failed to load ${configName.capitalize()} config from backup, unrecoverable error"
102+
val message =
103+
"Failed to load ${configName.capitalize()} config from backup, unrecoverable error"
103104
LOG.error(message, it)
104105
this@Configuration.logError(message)
105106
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.lambda.config.configurations
2+
3+
import com.lambda.config.Configuration
4+
import com.lambda.util.FolderRegister
5+
6+
object FriendConfig : Configuration() {
7+
override val configName = "friends"
8+
override val primary = FolderRegister.config.resolve("$configName.json")
9+
}

common/src/main/kotlin/com/lambda/config/configurations/ModuleConfig.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.lambda.config.Configuration
44
import com.lambda.config.configurations.ModuleConfig.configName
55
import com.lambda.config.configurations.ModuleConfig.primary
66
import com.lambda.util.FolderRegister
7-
import java.io.File
87

98

109
/**
@@ -18,4 +17,4 @@ import java.io.File
1817
object ModuleConfig : Configuration() {
1918
override val configName = "modules"
2019
override val primary = FolderRegister.config.resolve("$configName.json")
21-
}
20+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.lambda.config.serializer
2+
3+
import com.google.gson.*
4+
import com.mojang.authlib.GameProfile
5+
import java.lang.reflect.Type
6+
import java.util.*
7+
8+
// Yeah yeah I know, there's already a serializer for GameProfile in the Minecraft codebase.
9+
// But who cares, I'm doing it again.
10+
// What you gon' do bout it, huh?
11+
// That's what I thought.
12+
object GameProfileSerializer : JsonSerializer<GameProfile>, JsonDeserializer<GameProfile> {
13+
override fun serialize(
14+
src: GameProfile?,
15+
typeOfSrc: Type?,
16+
context: JsonSerializationContext?,
17+
): JsonElement =
18+
src?.let {
19+
JsonObject().apply {
20+
addProperty("name", it.name)
21+
addProperty("uuid", it.id.toString())
22+
}
23+
} ?: JsonNull.INSTANCE
24+
25+
override fun deserialize(
26+
json: JsonElement?,
27+
typeOfT: Type?,
28+
context: JsonDeserializationContext?,
29+
): GameProfile =
30+
GameProfile(
31+
UUID.fromString(json?.asJsonObject?.get("uuid")?.asString),
32+
json?.asJsonObject?.get("name")?.asString
33+
)
34+
}

common/src/main/kotlin/com/lambda/config/settings/collections/ListSetting.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import java.lang.reflect.Type
77

88
class ListSetting<T : Any>(
99
override val name: String,
10-
defaultValue: List<T>,
10+
private val defaultValue: MutableList<T>,
1111
private val type: Type,
1212
description: String,
1313
visibility: () -> Boolean,
14-
) : AbstractSetting<List<T>>(
14+
) : AbstractSetting<MutableList<T>>(
1515
defaultValue,
1616
description,
1717
visibility
1818
) {
1919
override fun loadFromJson(serialized: JsonElement) {
2020
value = gson.fromJson(serialized, type)
2121
}
22-
}
22+
23+
override fun toJson(): JsonElement {
24+
value = defaultValue.toMutableList() // Hack the Delegates.observable
25+
return gson.toJsonTree(value)
26+
}
27+
}

common/src/main/kotlin/com/lambda/config/settings/collections/MapSetting.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import java.lang.reflect.Type
77

88
class MapSetting<K, V>(
99
override val name: String,
10-
defaultValue: Map<K, V>,
10+
private val defaultValue: MutableMap<K, V>,
1111
private val type: Type,
1212
description: String,
1313
visibility: () -> Boolean,
14-
) : AbstractSetting<Map<K, V>>(
14+
) : AbstractSetting<MutableMap<K, V>>(
1515
defaultValue,
1616
description,
1717
visibility
1818
) {
1919
override fun loadFromJson(serialized: JsonElement) {
2020
value = gson.fromJson(serialized, type)
2121
}
22-
}
22+
23+
override fun toJson(): JsonElement {
24+
value = defaultValue.toMutableMap() // Hack the Delegates.observable
25+
return gson.toJsonTree(value)
26+
}
27+
}

0 commit comments

Comments
 (0)