Skip to content

Commit 81fd2b8

Browse files
committed
1x2 tunnel bounce efly using the Fake Lag setting, and fake fly
1 parent 605c098 commit 81fd2b8

15 files changed

Lines changed: 130 additions & 96 deletions

File tree

src/main/java/com/lambda/mixin/entity/LivingEntityMixin.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
import org.spongepowered.asm.mixin.injection.Slice;
4545
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4646

47+
import static com.lambda.threading.ThreadingKt.runSafe;
48+
4749
@Mixin(LivingEntity.class)
4850
public abstract class LivingEntityMixin extends EntityMixin {
4951

@@ -186,8 +188,8 @@ private void wrapPushAwayFrom(Entity entity, Operation<Void> original) {
186188
private boolean injectIsGliding(boolean original) {
187189
if (lambda$instance != Lambda.getMc().player) return original;
188190

189-
return ElytraFly.getBounceMode().isEnabled()
190-
? ElytraFly.getBounceMode().isGliding()
191+
return ElytraFly.INSTANCE.isEnabled()
192+
? ElytraFly.getMode().getElytraFly().isGliding()
191193
: original;
192194
}
193195

@@ -200,4 +202,15 @@ private void injectTravelGliding(Vec3d movementInput, CallbackInfo ci) {
200202
!grimMode.getMoving()
201203
) ci.cancel();
202204
}
205+
206+
@ModifyExpressionValue(method = "canGlide", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;canGlideWith(Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/EquipmentSlot;)Z"))
207+
private boolean injectCanGlide(boolean original) {
208+
if (lambda$instance != Lambda.getMc().player) return original;
209+
if (original) return true;
210+
if (!ElytraFly.INSTANCE.getFakeFly()) return false;
211+
return Boolean.TRUE.equals(runSafe(safeContext -> {
212+
final var mode = ElytraFly.getMode().getElytraFly();
213+
return mode.isEnabled() && mode.findElytra(safeContext) != null;
214+
}));
215+
}
203216
}

src/main/java/com/lambda/mixin/entity/PlayerEntityMixin.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,20 @@
2222
import com.lambda.event.events.MovementEvent;
2323
import com.lambda.interaction.BaritoneHandler;
2424
import com.lambda.interaction.managers.rotating.RotationManager;
25+
import com.lambda.module.modules.movement.elytrafly.ElytraFly;
2526
import com.lambda.module.modules.player.Reach;
2627
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
2728
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
2829
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
30+
import kotlin.Unit;
2931
import net.minecraft.entity.player.PlayerEntity;
3032
import org.spongepowered.asm.mixin.Mixin;
3133
import org.spongepowered.asm.mixin.injection.At;
3234
import org.spongepowered.asm.mixin.injection.Inject;
3335
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
3436

37+
import static com.lambda.threading.ThreadingKt.runSafe;
38+
3539
@Mixin(PlayerEntity.class)
3640
public class PlayerEntityMixin {
3741
@Inject(method = "clipAtLedge", at = @At(value = "HEAD"), cancellable = true)
@@ -65,4 +69,17 @@ private double wrapGetEntityInteractionRange(Operation<Double> original) {
6569
if ((PlayerEntity) (Object) this == Lambda.getMc().player && Reach.INSTANCE.isEnabled()) return Reach.getEntityReach();
6670
return original.call();
6771
}
72+
73+
@WrapOperation(method = "checkGliding", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;startGliding()V"))
74+
private void injectCheckGliding(PlayerEntity instance, Operation<Void> original) {
75+
final var elytraFly = ElytraFly.getMode().getElytraFly();
76+
if (!elytraFly.isEnabled() || !ElytraFly.INSTANCE.getFakeFly()) {
77+
original.call(instance);
78+
return;
79+
}
80+
runSafe(safeContext -> {
81+
elytraFly.flyOrFakeFly(safeContext, null);
82+
return Unit.INSTANCE;
83+
});
84+
}
6885
}

src/main/kotlin/com/lambda/config/automation/AutomationConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ package com.lambda.config.automation
2020
import com.lambda.config.Config
2121
import com.lambda.config.ConfigCategory
2222
import com.lambda.config.Tab
23-
import com.lambda.config.categories.AutomationCategory
2423
import com.lambda.config.blocks.BreakSettings
2524
import com.lambda.config.blocks.BuildSettings
2625
import com.lambda.config.blocks.EatSettings
2726
import com.lambda.config.blocks.HotbarSettings
2827
import com.lambda.config.blocks.InteractSettings
2928
import com.lambda.config.blocks.InventorySettings
3029
import com.lambda.config.blocks.RotationSettings
30+
import com.lambda.config.categories.AutomationCategory
3131
import com.lambda.context.Automated
3232
import com.lambda.module.Module
3333

src/main/kotlin/com/lambda/config/automation/IMutableAutomationConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ package com.lambda.config.automation
1919

2020
import com.lambda.config.EntryCore
2121
import com.lambda.config.EntryLayer
22-
import com.lambda.config.entries.Setting
2322
import com.lambda.config.blocks.BreakConfig
2423
import com.lambda.config.blocks.BuildConfig
2524
import com.lambda.config.blocks.EatConfig
2625
import com.lambda.config.blocks.HotbarConfig
2726
import com.lambda.config.blocks.InteractConfig
2827
import com.lambda.config.blocks.InventoryConfig
2928
import com.lambda.config.blocks.RotationConfig
29+
import com.lambda.config.entries.Setting
3030
import com.lambda.context.Automated
3131

3232
interface IMutableAutomationConfig : Automated {

src/main/kotlin/com/lambda/config/settings/complex/KeybindSetting.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.lambda.config.settings.complex
1919

2020
import com.fasterxml.jackson.annotation.JsonIncludeProperties
21+
import com.lambda.Lambda.mc
2122
import com.lambda.brigadier.CommandResult.Companion.failure
2223
import com.lambda.brigadier.CommandResult.Companion.success
2324
import com.lambda.brigadier.argument.boolean
@@ -26,7 +27,6 @@ import com.lambda.brigadier.argument.word
2627
import com.lambda.brigadier.executeWithResult
2728
import com.lambda.brigadier.optional
2829
import com.lambda.brigadier.required
29-
import com.lambda.Lambda.mc
3030
import com.lambda.config.Config
3131
import com.lambda.config.entries.ConfigEntryDsl
3232
import com.lambda.config.entries.Setting
@@ -35,12 +35,12 @@ import com.lambda.context.SafeContext
3535
import com.lambda.event.Muteable
3636
import com.lambda.event.events.ButtonEvent
3737
import com.lambda.event.listener.UnsafeListener.Companion.listenUnsafe
38-
import com.lambda.threading.runSafe
3938
import com.lambda.gui.dsl.ImGuiBuilder
4039
import com.lambda.imgui.ImGui.isMouseClicked
4140
import com.lambda.imgui.flag.ImGuiCol
4241
import com.lambda.imgui.flag.ImGuiHoveredFlags
4342
import com.lambda.imgui.flag.ImGuiMouseButton
43+
import com.lambda.threading.runSafe
4444
import com.lambda.util.InputUtils
4545
import com.lambda.util.KeyCode
4646
import com.lambda.util.Mouse

src/main/kotlin/com/lambda/gui/components/ClickGuiLayout.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ import com.lambda.event.events.GuiEvent
2828
import com.lambda.event.listener.UnsafeListener.Companion.listenUnsafe
2929
import com.lambda.gui.DearImGui
3030
import com.lambda.gui.LambdaScreen
31-
import com.lambda.gui.OverlayBackgroundScreen
3231
import com.lambda.gui.MenuBar
3332
import com.lambda.gui.MenuBar.buildMenuBar
33+
import com.lambda.gui.OverlayBackgroundScreen
3434
import com.lambda.gui.components.QuickSearch.renderQuickSearch
3535
import com.lambda.gui.dsl.ImGuiBuilder.buildLayout
3636
import com.lambda.gui.snap.RectF

src/main/kotlin/com/lambda/interaction/managers/Manager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ abstract class Manager<R : Request>(
105105
fun request(request: R, queueIfMismatchedStage: Boolean = true): R {
106106
val canOverrideQueued = queuedRequest?.let { it as Automated === request as Automated } != false
107107
if (!canOverrideQueued) return request
108-
if ((!acceptingRequests || tickStage !in request.tickStageMask)) {
108+
if (!acceptingRequests || tickStage !in request.tickStageMask) {
109109
if (!queueIfMismatchedStage || request.nowOrNothing) return request
110110
val currentStageIndex = ALL_STAGES.indexOf(tickStage)
111111
if (openStages.none { ALL_STAGES.indexOf(it) > currentStageIndex && it in request.tickStageMask })

src/main/kotlin/com/lambda/module/modules/combat/autodisconnect/AutoDisconnect.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package com.lambda.module.modules.combat.autodisconnect
1919

2020
import com.lambda.Lambda
21+
import com.lambda.config.Group
22+
import com.lambda.config.Tab
2123
import com.lambda.context.SafeContext
2224
import com.lambda.event.events.PlayerEvent
2325
import com.lambda.event.events.TickEvent
@@ -61,9 +63,7 @@ import net.minecraft.util.Identifier
6163
import net.minecraft.world.GameMode
6264
import java.awt.Color
6365
import java.time.Instant
64-
import java.util.BitSet
65-
import com.lambda.config.Group
66-
import com.lambda.config.Tab
66+
import java.util.*
6767

6868
@Suppress("unused")
6969
object AutoDisconnect : Module(

src/main/kotlin/com/lambda/module/modules/movement/elytrafly/ElytraFly.kt

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ import com.lambda.event.events.PacketEvent
2828
import com.lambda.event.listener.SafeListener.Companion.listen
2929
import com.lambda.module.Module
3030
import com.lambda.module.modules.movement.elytrafly.modes.BounceElytraFly
31-
import com.lambda.module.modules.movement.elytrafly.modes.ControlElytraFly
31+
import com.lambda.module.modules.movement.elytrafly.modes.GeneralElytraFly
3232
import com.lambda.module.modules.movement.elytrafly.modes.GrimControlElytraFly
33-
import com.lambda.module.modules.movement.elytrafly.modes.PacketElytraFly
3433
import com.lambda.module.tag.ModuleTag
3534
import com.lambda.threading.runSafe
3635
import com.lambda.util.extension.isElytraFlying
@@ -40,42 +39,44 @@ import net.minecraft.sound.SoundEvents
4039

4140
object ElytraFly : Module(
4241
name = "ElytraFly",
43-
description = "Allows you to fly with an elytra",
42+
description = "Modifies elytra functionality to allow for more control",
4443
tag = ModuleTag.MOVEMENT,
4544
) {
4645
@JvmStatic val mode by setting("Fly Mode", FlyMode.Bounce)
4746
.onValueChange { from, to ->
48-
from.elytraFly?.onDisableListeners?.forEach { it() }
49-
to.elytraFly?.onEnableListeners?.forEach { it() }
47+
from.elytraFly.onDisableListeners.forEach { it() }
48+
to.elytraFly.onEnableListeners.forEach { it() }
5049
}
5150

5251
private val boostSpeed by setting("Boost", 0.00, 0.0..0.5, 0.005, description = "Speed to add when flying")
5352
private val rocketSpeed by setting("Rocket Speed", 1.0, 0.0..2.0, 0.01, description = "Speed multiplier that the rocket gives you")
54-
val fakeFly by setting("Fake Fly", false, "Rapidly swaps the chestplate and elytra to give the appearance the player is flying without an elytra. May also reduce durability loss")
5553
private val mute by setting("Mute Elytra", false, "Mutes the elytra sound when gliding")
54+
val fakeFly by setting("Fake Fly", false, "Rapidly swaps the chestplate and elytra to give the appearance the player is flying without an elytra. May also reduce durability loss")
5655

5756
private const val BOUNCE_TAB = "Bounce"
5857
private const val CONTROL_TAB = "Control"
5958
private const val GRIM_CONTROL_TAB = "Grim Control"
6059
private const val PACKET_TAB = "Packet"
60+
private const val GENERAL_TAB = "None"
6161

62+
@Tab(GENERAL_TAB) @JvmStatic val generalMode by configBlock(GeneralElytraFly(this))
6263
@Tab(BOUNCE_TAB) @JvmStatic val bounceMode by configBlock(BounceElytraFly(this))
6364
@Tab(GRIM_CONTROL_TAB) @JvmStatic val grimControlMode by configBlock(GrimControlElytraFly(this))
64-
@Tab(CONTROL_TAB) @JvmStatic val controlMode by configBlock(ControlElytraFly(this))
65-
@Tab(PACKET_TAB) @JvmStatic val packetMode by configBlock(PacketElytraFly(this))
65+
// @Tab(CONTROL_TAB) @JvmStatic val controlMode by configBlock(ControlElytraFly(this))
66+
// @Tab(PACKET_TAB) @JvmStatic val packetMode by configBlock(PacketElytraFly(this))
6667

6768
init {
6869
setDefaultAutomationConfig()
6970
.withEdits {
7071
hideAllExcept(::inventoryConfig, ::rotationConfig)
7172
}
7273

73-
onEnable { mode.elytraFly?.onEnableListeners?.forEach { it() } }
74-
onDisable { mode.elytraFly?.onDisableListeners?.forEach { it() } }
74+
onEnable { mode.elytraFly.onEnableListeners.forEach { it() } }
75+
onDisable { mode.elytraFly.onDisableListeners.forEach { it() } }
7576

7677
listen<PacketEvent.Receive.Pre> { event ->
7778
if (event.packet !is PlayerPositionLookS2CPacket) return@listen
78-
mode.elytraFly?.onFlagListeners?.forEach { it() }
79+
mode.elytraFly.onFlagListeners.forEach { it() }
7980
}
8081

8182
listen<MovementEvent.Player.Pre> {
@@ -106,12 +107,12 @@ object ElytraFly : Module(
106107
)
107108
}
108109

109-
enum class FlyMode(private val elytraFlyGetter: () -> ElytraFlyMode?) {
110+
enum class FlyMode(private val elytraFlyGetter: () -> ElytraFlyMode) {
110111
Bounce({ bounceMode }),
111-
Control({ controlMode }),
112+
// Control({ controlMode }),
112113
GrimControl({ grimControlMode }),
113-
Packet({ packetMode }),
114-
None({ null });
114+
// Packet({ packetMode }),
115+
General({ generalMode });
115116

116117
val elytraFly get() = elytraFlyGetter()
117118
}

src/main/kotlin/com/lambda/module/modules/movement/elytrafly/ElytraFlyMode.kt

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import com.lambda.config.ConfigBlock
2121
import com.lambda.context.Automated
2222
import com.lambda.context.SafeContext
2323
import com.lambda.event.Muteable
24+
import com.lambda.event.events.TickEvent
25+
import com.lambda.event.listener.SafeListener.Companion.listen
2426
import com.lambda.interaction.managers.inventory.InventoryRequest
2527
import com.lambda.interaction.managers.inventory.InventoryRequest.Companion.inventoryRequest
2628
import com.lambda.interaction.material.StackSelection.Companion.selectStack
@@ -47,16 +49,23 @@ abstract class ElytraFlyMode(
4749
val onDisableListeners = mutableListOf<SafeContext.() -> Unit>()
4850
val onFlagListeners = mutableListOf<SafeContext.() -> Unit>()
4951

50-
fun onEnable(callback: SafeContext.() -> Unit) { onEnableListeners.add(callback) }
51-
fun onDisable(callback: SafeContext.() -> Unit) { onDisableListeners.add(callback) }
52+
var fakeGliding = false
5253

53-
fun onFlag(callback: SafeContext.() -> Unit) { onFlagListeners.add(callback) }
54+
init{
55+
listen<TickEvent.Pre>({ 100 }) {
56+
fakeGliding = fakeFly && fakeGliding && player.canGlide()
57+
}
58+
}
5459

55-
open fun isGliding(): Boolean? = runSafe { player.getFlag(Entity.GLIDING_FLAG_INDEX) }
60+
protected fun onEnable(callback: SafeContext.() -> Unit) { onEnableListeners.add(callback) }
61+
protected fun onDisable(callback: SafeContext.() -> Unit) { onDisableListeners.add(callback) }
5662

57-
fun SafeContext.flyOrFakeFly() {
63+
protected fun onFlag(callback: SafeContext.() -> Unit) { onFlagListeners.add(callback) }
64+
65+
fun SafeContext.flyOrFakeFly(onFly: (SafeContext.() -> Unit)? = null) {
5866
if (!fakeFly) {
5967
startFly()
68+
onFly?.invoke(this)
6069
return
6170
}
6271

@@ -76,21 +85,20 @@ abstract class ElytraFlyMode(
7685
val elytraInHotbar = elytraSlot.index in 0..8
7786

7887
val chestSlot = player.armorSlots[1]
79-
val chestSlotEmpty = chestSlot.stack.isEmpty
8088

8189
fun InventoryRequest.InvRequestBuilder.swapChest() {
8290
if (elytraInHotbar) swap(chestSlot.id, elytraSlot.index)
8391
else {
8492
moveSlot(elytraSlot.id, chestSlot.id)
85-
if (!chestSlotEmpty) pickup(elytraSlot.id)
93+
if (!chestSlot.stack.isEmpty) pickup(elytraSlot.id)
8694
}
8795
}
8896

8997
inventoryRequest {
9098
swapChest()
91-
action { startFly() }
99+
action { startFly(); onFly?.invoke(this) }
92100
swapChest()
93-
}.submit(false)
101+
}.submit()
94102
}
95103

96104
fun SafeContext.findElytra(): Slot? =
@@ -104,11 +112,14 @@ abstract class ElytraFlyMode(
104112
.firstOrNull()
105113
}
106114

107-
fun SafeContext.startFly() {
115+
protected fun SafeContext.startFly() {
108116
player.setFlag(Entity.GLIDING_FLAG_INDEX, true)
109117
startFlyPacket()
118+
fakeGliding = true
110119
}
111120

112121
protected fun SafeContext.startFlyPacket() =
113122
connection.sendPacket(ClientCommandC2SPacket(player, ClientCommandC2SPacket.Mode.START_FALL_FLYING))
123+
124+
open fun isGliding() = runSafe { player.getFlag(Entity.GLIDING_FLAG_INDEX) || (fakeFly && fakeGliding) } == true
114125
}

0 commit comments

Comments
 (0)