помогите мувмент пофиксить чтобы скорость игрока соотвестовало его fakeYaw, у меня он тупо идёт туда куда смотрит fakeYaw, помогите исправить:
код movementInputToVelocity:
Java:
package com.client.mixin.entity;
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 com.client.Client;
import com.client.event.player.UpdateVelocityEvent;
import com.client.mixin.accessor.EntityAccessor;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.Vec3d;
import static com.client.util.IMinecraft.mc;
@Mixin(Entity.class)
public class EntityMixin {
@Inject(method = "updateVelocity", at = @At("HEAD"), cancellable = true)
private void onUpdateVelocity(float speed, Vec3d movementInput, CallbackInfo ci) {
if ((Object) this == mc.player) {
ci.cancel();
Vec3d vec3d = EntityAccessor.movementInputToVelocity(
movementInput,
speed,
mc.player.getYaw()
);
UpdateVelocityEvent updateVelocityEvent = new UpdateVelocityEvent(
movementInput,
speed,
mc.player.getYaw(),
vec3d
);
Client.getEventBus().post(updateVelocityEvent);
mc.player.setVelocity(mc.player.getVelocity().add(updateVelocityEvent.getVelocity()));
}
}
}
код movementInputToVelocity:
Java:
protected static Vec3d movementInputToVelocity(Vec3d movementInput, float speed, float yaw) {
double d = movementInput.lengthSquared();
if (d < 1.0E-7) {
return Vec3d.ZERO;
} else {
Vec3d vec3d = (d > 1.0 ? movementInput.normalize() : movementInput).multiply(speed);
float f = MathHelper.sin(yaw * (float) (Math.PI / 180.0));
float g = MathHelper.cos(yaw * (float) (Math.PI / 180.0));
return new Vec3d(vec3d.x * g - vec3d.z * f, vec3d.y, vec3d.z * g + vec3d.x * f);
}
}
Java:
package com.client.module.combat;
import org.lwjgl.glfw.GLFW;
import com.client.event.EventStage;
import com.client.event.player.KeyboardInputEvent;
import com.client.event.player.SendMovementEvent;
import com.client.event.player.UpdateVelocityEvent;
import com.client.module.AbstractModule;
import com.client.module.EnumCategory;
import com.client.module.ModuleInfo;
import static com.client.util.IMinecraft.mc;
import com.google.common.eventbus.Subscribe;
import lombok.Getter;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
@ModuleInfo(
name = "test",
description = "",
category = EnumCategory.Combat
)
public class Test extends AbstractModule {
@Getter
private float fakeYaw = 90.0f, fakePitch = 0.0f;
@Getter
private float prevYaw, prevPitch;
public Test() {
setKey(GLFW.GLFW_KEY_R);
}
@Subscribe
public void onSendMovement(SendMovementEvent event) {
if (event.getStage() == EventStage.PRE) {
prevYaw = mc.player.getYaw();
prevPitch = mc.player.getPitch();
mc.player.setYaw(fakeYaw);
mc.player.setPitch(fakePitch);
mc.player.setHeadYaw(fakeYaw);
}
if (event.getStage() == EventStage.POST) {
mc.player.setYaw(prevYaw);
mc.player.setPitch(prevPitch);
}
}
@Subscribe
public void onUpdateVelocity(UpdateVelocityEvent event) {
event.setVelocity(fix(fakeYaw, event.getMovementInput(), event.getSpeed()));
}
@Subscribe
public void onKeyboardInput(KeyboardInputEvent event) {
if (Float.isNaN(fakeYaw)) return;
float mF = mc.player.input.movementForward;
float mS = mc.player.input.movementSideways;
float delta = (prevYaw - fakeYaw) * MathHelper.RADIANS_PER_DEGREE;
float cos = MathHelper.cos(delta);
float sin = MathHelper.sin(delta);
mc.player.input.movementSideways = Math.round(mS * cos - mF * sin);
mc.player.input.movementForward = Math.round(mF * cos + mS * sin);
}
private Vec3d fix(float yaw, Vec3d movementInput, float speed) {
double d = movementInput.lengthSquared();
if (d < 1.0E-7)
return Vec3d.ZERO;
Vec3d vec3d = (d > 1.0 ? movementInput.normalize() : movementInput).multiply(speed);
float f = MathHelper.sin(yaw * MathHelper.RADIANS_PER_DEGREE);
float g = MathHelper.cos(yaw * MathHelper.RADIANS_PER_DEGREE);
return new Vec3d(
vec3d.x * (double) g - vec3d.z * (double) f,
vec3d.y,
vec3d.z * (double) g + vec3d.x * (double) f
);
}
}