diff --git a/src/main/java/com/lambda/mixin/network/ClientPlayNetworkHandlerMixin.java b/src/main/java/com/lambda/mixin/network/ClientPlayNetworkHandlerMixin.java index a449c4380..0f1a3be9d 100644 --- a/src/main/java/com/lambda/mixin/network/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/com/lambda/mixin/network/ClientPlayNetworkHandlerMixin.java @@ -20,6 +20,7 @@ import com.lambda.event.EventFlow; import com.lambda.event.events.ChatEvent; import com.lambda.event.events.InventoryEvent; +import com.lambda.event.events.PlayerEvent; import com.lambda.event.events.WorldEvent; import com.lambda.interaction.managers.inventory.InventoryManager; import com.lambda.module.modules.movement.Velocity; @@ -27,13 +28,19 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityPosition; import net.minecraft.network.packet.s2c.play.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Set; @Mixin(ClientPlayNetworkHandler.class) public class ClientPlayNetworkHandlerMixin { @@ -125,4 +132,25 @@ void onSendMessage(String content, Operation original) { if (!EventFlow.post(event).isCanceled()) original.call(event.getMessage()); } + + @Inject(method = "onPlayerRespawn", at = @At("TAIL")) + void onPlayerRespawn(PlayerRespawnS2CPacket packet, CallbackInfo ci) { + EventFlow.post(new PlayerEvent.World.Respawn(packet)); + } + + @Inject(method = "onPlayerPositionLook", at = @At("TAIL")) + void onPlayerPositionLook(PlayerPositionLookS2CPacket packet, CallbackInfo ci) { + EventFlow.post(new PlayerEvent.World.PositionLook(packet)); + } + + @Inject(method = "setPosition", at = @At("TAIL")) + private static void onSetPosition(EntityPosition pos, Set flags, Entity entity, boolean bl, + CallbackInfoReturnable cir) { + if (cir.getReturnValue() == false) { + var player = MinecraftClient.getInstance().player; + assert player != null; + var event = new PlayerEvent.World.SetPosition(player.getEntityPos(), player.getVelocity(), player.getYaw(), player.getPitch()); + EventFlow.post(event); + } + } } \ No newline at end of file diff --git a/src/main/java/com/lambda/mixin/render/WorldRendererMixin.java b/src/main/java/com/lambda/mixin/render/WorldRendererMixin.java index c5a3686a1..f04516887 100644 --- a/src/main/java/com/lambda/mixin/render/WorldRendererMixin.java +++ b/src/main/java/com/lambda/mixin/render/WorldRendererMixin.java @@ -100,4 +100,12 @@ boolean modHasBlindnessOrDarkness(boolean original) { return original; } + + @ModifyReturnValue(method = "isRenderingReady", at = @At("RETURN")) + boolean modIsRenderingReady(boolean original) { + if (Freecam.INSTANCE.isEnabled()) { + return true; + } + return original; + } } diff --git a/src/main/kotlin/com/lambda/event/events/PlayerEvent.kt b/src/main/kotlin/com/lambda/event/events/PlayerEvent.kt index bb7be5edd..d6f1c8e43 100644 --- a/src/main/kotlin/com/lambda/event/events/PlayerEvent.kt +++ b/src/main/kotlin/com/lambda/event/events/PlayerEvent.kt @@ -20,6 +20,8 @@ package com.lambda.event.events import com.lambda.event.Event import com.lambda.event.callback.Cancellable import com.lambda.event.callback.ICancellable +import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket +import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket import net.minecraft.screen.ScreenHandler import net.minecraft.screen.slot.SlotActionType import net.minecraft.util.Hand @@ -27,6 +29,7 @@ import net.minecraft.util.hit.BlockHitResult import net.minecraft.util.hit.EntityHitResult import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Direction +import net.minecraft.util.math.Vec3d /** * Represents various events that can be triggered by the player during gameplay. @@ -138,4 +141,21 @@ sealed class PlayerEvent { val action: SlotActionType, val screenHandler: ScreenHandler, ) : ICancellable by Cancellable() + + sealed class World { + data class Respawn( + val packet: PlayerRespawnS2CPacket + ) : Event + + data class PositionLook( + val packet: PlayerPositionLookS2CPacket + ) : Event + + data class SetPosition( + val position: Vec3d, + val velocity: Vec3d, + val yaw: Float, + val pitch: Float + ) : Event + } } diff --git a/src/main/kotlin/com/lambda/module/modules/player/Freecam.kt b/src/main/kotlin/com/lambda/module/modules/player/Freecam.kt index 5e14e4cfb..747e37309 100644 --- a/src/main/kotlin/com/lambda/module/modules/player/Freecam.kt +++ b/src/main/kotlin/com/lambda/module/modules/player/Freecam.kt @@ -31,6 +31,7 @@ import com.lambda.interaction.managers.rotating.visibilty.lookAt import com.lambda.module.Module import com.lambda.module.tag.ModuleTag import com.lambda.threading.runSafeAutomated +import com.lambda.util.Communication.info import com.lambda.util.Describable import com.lambda.util.NamedEnum import com.lambda.util.extension.rotation @@ -57,8 +58,7 @@ import net.minecraft.util.math.Vec3d object Freecam : Module( name = "Freecam", description = "Move your camera freely", - tag = ModuleTag.RENDER, - autoDisable = true, + tag = ModuleTag.RENDER ) { private val speed by setting("Speed", 0.5, 0.1..1.0, 0.1, "Freecam movement speed", unit = "m/s") private val sprint by setting("Sprint Multiplier", 3.0, 0.1..10.0, 0.1, description = "Set below 1.0 to fly slower on sprint.") @@ -83,6 +83,7 @@ object Freecam : Module( private var rotation: Rotation = Rotation.ZERO private var velocity: Vec3d = Vec3d.ZERO + private var loading = false @JvmStatic fun updateCam() { @@ -123,6 +124,19 @@ object Freecam : Module( } } + listen { + loading = true + } + + listen { + if (loading) { + loading = false + position = it.position + player.standingEyeHeight + rotation = Rotation(it.yaw, it.pitch) + updateCam() + } + } + listen { rotation = rotation.withDelta( it.deltaYaw * SENSITIVITY_FACTOR,