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/5] 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/5] 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
From 6c977120861eb1fae6913f6ffc75a55374fd3b44 Mon Sep 17 00:00:00 2001
From: Ic3Tank <61137113+IceTank@users.noreply.github.com>
Date: Fri, 27 Feb 2026 21:10:18 +0100
Subject: [PATCH 3/5] Fix pr code comments
---
.../module/modules/movement/AutoMount.kt | 55 ++++++++-----------
1 file changed, 23 insertions(+), 32 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 bde70bb7a..9adcb8638 100644
--- a/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt
+++ b/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt
@@ -17,23 +17,18 @@
package com.lambda.module.modules.movement
-import com.lambda.config.AutomationConfig
+import com.lambda.config.AutomationConfig.Companion.setDefaultAutomationConfig
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
@@ -47,22 +42,17 @@ 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(),
- 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", 4.0, 1.0..20.0, 0.1, description = "Mount range")
-
- override var automationConfig = AutomationConfig(
- name = "AutoMount"
- )
+ var debug by setting("Debug", false, description = "Print debug messages")
val intervalTimer = Timer()
var lastEntity: Entity? = null
init {
+ setDefaultAutomationConfig("AutoMount")
onEnable {
intervalTimer.reset()
lastEntity = null
@@ -80,24 +70,27 @@ class AutoMount : Module(
entity.firstOrNull()?.let {
intervalTimer.reset()
interactEntity(it)
- debug("Mounting ${it.name}")
+ if (debug) info("Mounting ${it.name}")
}
}
}
- if (autoRemount) {
- if (player.vehicle != null) {
- lastEntity = player.vehicle
- } else {
- lastEntity?.let {
- if (it.isRemoved || it.distanceTo(player) > range) {
- lastEntity = null
- } else {
- if (canRide(it)) {
- intervalTimer.reset()
- interactEntity(it)
- }
- }
- }
+ if (!autoRemount) {
+ return@listen
+ }
+ if (player.vehicle != null) {
+ lastEntity = player.vehicle
+ }
+ if (lastEntity == null) {
+ return@listen
+ }
+ lastEntity?.let {
+ if (it.isRemoved || it.distanceTo(player) > range) {
+ lastEntity = null
+ return@let
+ }
+ if (canRide(it)) {
+ intervalTimer.reset()
+ interactEntity(it)
}
}
}
@@ -108,7 +101,5 @@ class AutoMount : Module(
mc.networkHandler?.sendPacket(PlayerInteractEntityC2SPacket.interact(entity, false, Hand.MAIN_HAND))
}
- private fun SafeContext.canRide(entity: Entity): Boolean {
- return entity.canAddPassenger(player)
- }
+ private fun SafeContext.canRide(entity: Entity) = entity.canAddPassenger(player)
}
\ No newline at end of file
From dcb3d6ff385811185aae62b6b5ec708df56914bb Mon Sep 17 00:00:00 2001
From: Ic3Tank <61137113+IceTank@users.noreply.github.com>
Date: Mon, 2 Mar 2026 21:42:37 +0100
Subject: [PATCH 4/5] fix(lambda.accesswidener): Move canAddPassenger method
accessibility location
---
src/main/resources/lambda.accesswidener | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/main/resources/lambda.accesswidener b/src/main/resources/lambda.accesswidener
index beb068759..d57fe81a2 100644
--- a/src/main/resources/lambda.accesswidener
+++ b/src/main/resources/lambda.accesswidener
@@ -60,6 +60,7 @@ transitive-accessible field net/minecraft/entity/Entity world Lnet/minecraft/wor
transitive-accessible class net/minecraft/screen/slot/ArmorSlot
transitive-accessible field net/minecraft/screen/slot/ArmorSlot equipmentSlot Lnet/minecraft/entity/EquipmentSlot;
transitive-accessible field net/minecraft/entity/Entity FLAGS Lnet/minecraft/entity/data/TrackedData;
+accessible method net/minecraft/entity/Entity canAddPassenger (Lnet/minecraft/entity/Entity;)Z
# Camera
transitive-accessible method net/minecraft/client/render/Camera setPos (DDD)V
@@ -123,6 +124,3 @@ 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
From f6bc7d94970600ca18abc2019b0ad63c4d8125fa Mon Sep 17 00:00:00 2001
From: IceTank <61137113+IceTank@users.noreply.github.com>
Date: Sat, 7 Mar 2026 16:29:21 +0100
Subject: [PATCH 5/5] Add rotation mode to AutoMount
---
.../module/modules/movement/AutoMount.kt | 33 +++++++++++++++----
1 file changed, 27 insertions(+), 6 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 9adcb8638..3d41957e0 100644
--- a/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt
+++ b/src/main/kotlin/com/lambda/module/modules/movement/AutoMount.kt
@@ -21,10 +21,14 @@ import com.lambda.config.AutomationConfig.Companion.setDefaultAutomationConfig
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.IRotationRequest.Companion.rotationRequest
+import com.lambda.interaction.managers.rotating.visibilty.VisibilityChecker
import com.lambda.interaction.managers.rotating.visibilty.VisibilityChecker.findRotation
+import com.lambda.interaction.managers.rotating.visibilty.lookAtEntity
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.Timer
import com.lambda.util.world.fastEntitySearch
@@ -32,6 +36,7 @@ import net.minecraft.entity.Entity
import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket
import net.minecraft.registry.Registries
import net.minecraft.util.Hand
+import net.minecraft.util.hit.EntityHitResult
import net.minecraft.util.math.Vec3d
import kotlin.time.Duration.Companion.milliseconds
@@ -46,6 +51,7 @@ class AutoMount : Module(
var interval by setting("Interval", 50, 1..200, 1, unit = "ms", description = "Interact interval")
var range by setting("Range", 4.0, 1.0..20.0, 0.1, description = "Mount range")
+ var rotate by setting("Rotate", false, description = "Rotate to the entity when mounting")
var debug by setting("Debug", false, description = "Print debug messages")
val intervalTimer = Timer()
@@ -77,12 +83,9 @@ class AutoMount : Module(
if (!autoRemount) {
return@listen
}
- if (player.vehicle != null) {
+ if (player.vehicle?.isRemoved == false) {
lastEntity = player.vehicle
}
- if (lastEntity == null) {
- return@listen
- }
lastEntity?.let {
if (it.isRemoved || it.distanceTo(player) > range) {
lastEntity = null
@@ -97,8 +100,26 @@ class AutoMount : Module(
}
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))
+ if (rotate) {
+ runSafeAutomated {
+ var hit: VisibilityChecker.CheckedHit? = null
+ rotationRequest {
+ hit = lookAtEntity(entity)
+ }.submit()
+ hit?.let {
+ val hitResult = it.hit as? EntityHitResult ?: return@let
+ interaction.interactEntityAtLocation(player, entity, hitResult, Hand.MAIN_HAND)
+ return@runSafeAutomated
+ } ?: run {
+ if (debug) debug("Not rotation found to mount entity")
+ return@runSafeAutomated
+ }
+ if (debug) debug("Invalid entity rotation")
+ }
+ } else {
+ connection.sendPacket(PlayerInteractEntityC2SPacket.interactAt(entity, false, Hand.MAIN_HAND, Vec3d(0.5, 0.5, 0.5)))
+ connection.sendPacket(PlayerInteractEntityC2SPacket.interact(entity, false, Hand.MAIN_HAND))
+ }
}
private fun SafeContext.canRide(entity: Entity) = entity.canAddPassenger(player)