From e2b6dc32fa72586a078c90d387f3b772a430fdb7 Mon Sep 17 00:00:00 2001 From: IceTank <61137113+IceTank@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:21:28 +0100 Subject: [PATCH 1/2] feat(AutoMount): Add AutoMount module to automatically mount or remount entities --- .../module/modules/movement/AutoMount.kt | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt diff --git a/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt b/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt new file mode 100644 index 000000000..e06d0cd54 --- /dev/null +++ b/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt @@ -0,0 +1,87 @@ +/* + * Copyright 2026 Lambda + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lambda.module.modules.movement + +import com.lambda.context.SafeContext +import com.lambda.event.events.TickEvent +import com.lambda.event.listener.SafeListener.Companion.listen +import com.lambda.module.Module +import com.lambda.module.tag.ModuleTag +import com.lambda.util.Timer +import com.lambda.util.world.fastEntitySearch +import net.minecraft.entity.Entity +import net.minecraft.entity.EntityType +import net.minecraft.registry.Registries +import kotlin.time.Duration.Companion.milliseconds + +class AutoMount : Module( + name = "AutoMount", + description = "Automatically mounts entities", + tag = ModuleTag.MOVEMENT +) { + var autoRemount by setting("Auto Remount", false, description = "Automatically remounts if you get off") + var autoMountEntities by setting("Auto Mount Entities", true, description = "Automatically mounts nearby entities in range") + var autoMountEntityList by setting("Auto Mount Entity List", mutableListOf>(), mutableListOf(Registries.ENTITY_TYPE.toList())) { autoMountEntities } + + var interval by setting("Interval", 50, 1..200, 1, unit = "ms", description = "Interact interval") + var range by setting("Range", 5.0, 1.0..10.0, 0.1, description = "Mount range") + + val intervalTimer = Timer() + var lastEntity: Entity? = null + + init { + listen { + if (!intervalTimer.timePassed(interval.milliseconds)) { + return@listen + } + if (autoMountEntities && !player.isRiding) { + val entity = fastEntitySearch(range) { + autoMountEntityList.contains(it.type) && canRide(it) && it.distanceTo(player) <= range + } + entity.firstOrNull()?.let { + intervalTimer.reset() + player.startRiding(it) + } + } + if (autoRemount) { + if (player.isRiding) { + lastEntity = player.vehicle + } else { + lastEntity?.let { + if (it.isRemoved || it.distanceTo(player) > range) { + lastEntity = null + } else { + if (canRide(it)) { + intervalTimer.reset() + player.startRiding(it) + } + } + } + } + } + } + } + + private fun SafeContext.canRide(entity: Entity): Boolean { + return entity.canAddPassenger(player) + } + + private fun Entity.canAddPassenger(other: Entity): Boolean { + return this.canAddPassenger(other) + } +} \ No newline at end of file From f23c538218814cc3b3dbafddedf9223b099bae1d Mon Sep 17 00:00:00 2001 From: Ic3Tank <61137113+IceTank@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:01:59 +0100 Subject: [PATCH 2/2] fix(AutoMount): Fix AutoMount module --- .../module/modules/movement/AutoMount.kt | 57 ++++++++++++++----- src/main/resources/lambda.accesswidener | 3 + 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt b/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt index e06d0cd54..bde70bb7a 100644 --- a/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt +++ b/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt @@ -17,16 +17,27 @@ package com.lambda.module.modules.movement +import com.lambda.config.AutomationConfig import com.lambda.context.SafeContext import com.lambda.event.events.TickEvent import com.lambda.event.listener.SafeListener.Companion.listen +import com.lambda.interaction.managers.rotating.visibilty.VisibilityChecker +import com.lambda.interaction.managers.rotating.visibilty.VisibilityChecker.findRotation import com.lambda.module.Module import com.lambda.module.tag.ModuleTag +import com.lambda.threading.runSafeAutomated +import com.lambda.util.Communication.debug +import com.lambda.util.Communication.info +import com.lambda.util.EntityUtils import com.lambda.util.Timer +import com.lambda.util.math.dist import com.lambda.util.world.fastEntitySearch import net.minecraft.entity.Entity import net.minecraft.entity.EntityType +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket import net.minecraft.registry.Registries +import net.minecraft.util.Hand +import net.minecraft.util.math.Vec3d import kotlin.time.Duration.Companion.milliseconds class AutoMount : Module( @@ -36,30 +47,45 @@ class AutoMount : Module( ) { var autoRemount by setting("Auto Remount", false, description = "Automatically remounts if you get off") var autoMountEntities by setting("Auto Mount Entities", true, description = "Automatically mounts nearby entities in range") - var autoMountEntityList by setting("Auto Mount Entity List", mutableListOf>(), mutableListOf(Registries.ENTITY_TYPE.toList())) { autoMountEntities } + var autoMountEntityList by setting("Auto Mount Entity List", + mutableListOf(), + Registries.ENTITY_TYPE.toList() + ) { autoMountEntities } var interval by setting("Interval", 50, 1..200, 1, unit = "ms", description = "Interact interval") - var range by setting("Range", 5.0, 1.0..10.0, 0.1, description = "Mount range") + var range by setting("Range", 4.0, 1.0..20.0, 0.1, description = "Mount range") + + override var automationConfig = AutomationConfig( + name = "AutoMount" + ) val intervalTimer = Timer() var lastEntity: Entity? = null init { + onEnable { + intervalTimer.reset() + lastEntity = null + } + listen { if (!intervalTimer.timePassed(interval.milliseconds)) { return@listen } - if (autoMountEntities && !player.isRiding) { - val entity = fastEntitySearch(range) { - autoMountEntityList.contains(it.type) && canRide(it) && it.distanceTo(player) <= range - } - entity.firstOrNull()?.let { - intervalTimer.reset() - player.startRiding(it) + if (autoMountEntities && player.vehicle == null) { + runSafeAutomated { + val entity = fastEntitySearch(10.0) { + autoMountEntityList.contains(it.type) && canRide(it) && it.findRotation(range, player.eyePos) != null + }.sortedBy { it.squaredDistanceTo(player.pos) } + entity.firstOrNull()?.let { + intervalTimer.reset() + interactEntity(it) + debug("Mounting ${it.name}") + } } } if (autoRemount) { - if (player.isRiding) { + if (player.vehicle != null) { lastEntity = player.vehicle } else { lastEntity?.let { @@ -68,7 +94,7 @@ class AutoMount : Module( } else { if (canRide(it)) { intervalTimer.reset() - player.startRiding(it) + interactEntity(it) } } } @@ -77,11 +103,12 @@ class AutoMount : Module( } } - private fun SafeContext.canRide(entity: Entity): Boolean { - return entity.canAddPassenger(player) + private fun SafeContext.interactEntity(entity: Entity) { + mc.networkHandler?.sendPacket(PlayerInteractEntityC2SPacket.interactAt(entity, false, Hand.MAIN_HAND, Vec3d(0.5, 0.5, 0.5))) + mc.networkHandler?.sendPacket(PlayerInteractEntityC2SPacket.interact(entity, false, Hand.MAIN_HAND)) } - private fun Entity.canAddPassenger(other: Entity): Boolean { - return this.canAddPassenger(other) + private fun SafeContext.canRide(entity: Entity): Boolean { + return entity.canAddPassenger(player) } } \ No newline at end of file diff --git a/src/main/resources/lambda.accesswidener b/src/main/resources/lambda.accesswidener index 484d80718..beb068759 100644 --- a/src/main/resources/lambda.accesswidener +++ b/src/main/resources/lambda.accesswidener @@ -123,3 +123,6 @@ transitive-accessible method net/minecraft/item/BlockItem getPlacementState (Lne transitive-accessible method net/minecraft/block/AbstractBlock getPickStack (Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Z)Lnet/minecraft/item/ItemStack; transitive-accessible field net/minecraft/client/gui/screen/ingame/HandledScreen focusedSlot Lnet/minecraft/screen/slot/Slot; transitive-accessible field net/minecraft/registry/SimpleRegistry frozen Z + +# AutoMount +accessible method net/minecraft/entity/Entity canAddPassenger (Lnet/minecraft/entity/Entity;)Z