chore(history): squash 100 commit(s) from 2026-09-24
- fix(backend): case-insensitive unique email, revoke PUBLIC schema access, pin Argon2id params - test(backend): assert password length cap boundary (256 ok, 257 rejected) - docs(backend): plan — typed JWT token kinds so refresh/device tokens cannot pass as access tokens - feat(backend): JWT access/refresh token issue and verify - feat(backend): accounts repository (create/find_by_email/find_by_id) - refactor(gui): LoVisualAddonManagerScreen 989→10 файлов addon/ (8.5.2) - docs(backend): plan — fix sqlx::migrate! path in integration tests - feat(backend): POST /auth/register and /auth/login - refactor(settings): SettingsPanelComponent 715→81 + 6 helpers (8.5.2) - docs(backend): plan — harden device flow (single-use codes, bounded store, 404/429) - feat(backend): OAuth device authorization grant for mod login - fix(backend): first confirm wins for device codes - docs(backend): plan — split Task 8 (refactor) and Task 9 (avatars), harden avatar handling - refactor(mixins): LocalPlayerMixin 691→111 + 4 handlers (8.5.2) - refactor(visuals): Trails 687→130 (8.5.2) - refactor(render): ItemBatchRenderer 677->100 (8.5.2) - refactor(visuals): ReimaginedVisual 674→118 + 5 helpers (8.5.2) - refactor(config): ConfigSerializer 668→91 + 4 helpers (8.5.2) - refactor(hud): DynamicIsland 661→158 + 4 helpers (8.5.2) - refactor(render): GlStencilFramebufferSupport 666→169 (8.5.2) - refactor(gui): MenuScreen 669→128 + 4 helpers (8.5.2) - refactor(render): UiStyle 644→170 + 3 helpers (8.5.2) - refactor(gui): ModuleComponent 613→98 + 4 helpers (8.5.2) - refactor(media): MediaSessionService 616→200 + 4 helpers (8.5.2) - refactor(gui): RelationsComponent 661→59 + 4 helpers (8.5.2) - chore(license): strip GPL file headers from all Java sources - refactor(aiming): PointTracker 583→168 + 2 helpers (8.5.2) - refactor(gui): LoVisualProxyManagerScreen 591→132 + 2 helpers (8.5.2) - refactor(visuals): KillEffect 588→96 + 4 helpers (8.5.2) - refactor(render): MeshBuilder +4 helpers (8.5.2) - refactor(visuals): extract WorldParticlesRender helper (8.5.2) - refactor(world): ExplosionDamageUtil 551→116 + 2 helpers (8.5.2) - refactor(visuals): TazikHat 596->179 + Model + Palette in hats/tazik (8.5.2) - chore(license): strip GPL header from remaining 30 files and make strip script variant-aware - refactor(gui): ThemeComponent 561->166 + CardRenderer + ScrollState (8.5.2) - refactor(hud): CustomHotbar 556→178 + Renderer + Selection + SelectionGradient (8.5.2) - refactor(gui): ThemeCardRenderer perf + readability polish - refactor(clickgui): CooldownRulesSetting 596->198 + Editor + DetailRenderer (8.5.2) - refactor(hud): HudNotifier 561->200 + Painter + runtime/HudNotifierRuntime (8.5.2) - refactor(theme): Themes 555->168 + impl/Transition + impl/Blending + impl/ProfileCodec (8.5.2) - refactor(theme): EditableClickGuiTheme 205->185 + JavaDoc (8.5.2) - refactor(theme): ThemeStore 491->128 + store/ThemeStoreJson + store/ThemeStoreIO (8.5.2) - refactor(clickgui): ClickGuiRenderer 604->200 compacted one-line delegators + JavaDoc (8.5.2) - refactor(mainmenu): LoVisualMainMenuScreen 551->161 + impl/Painter + impl/Renderer + impl/TextUtil (8.5.2) - refactor(clickgui): ClickGuiTextEditorState 531->187 + impl/EditorCaret + impl/EditorPainter (8.5.2) - refactor(tab): TabListModel 525->139 + model/Collector + model/Reader + model/Signature + model/TextSplitter (8.5.2) - refactor(backend): shared bearer helper and test helpers, build_app takes Config, validate JWT secret strength - refactor(module): ModuleManager 521->198 + impl/Registrar + impl/Dispatcher (8.5.2) - feat(backend): avatar upload with decode, square crop, PNG re-encode and S3 storage - refactor(clip): ClipFunction 512->146 + impl/Geometry + impl/Debug (8.5.2) - docs(backend): implementation plans for gateway (auth hardening, gRPC, rate limits) and configs-service - refactor(iris-patch): ShaderPatchEngine 499->146 + impl/Repo (8.5.2) - chore(frontend): add router, react-query, fonts and vitest; dev proxy to gateway - refactor(hud): ScriptedListHudPanel 499->158 + panel/Props + panel/Signature (8.5.2) - refactor(hud): BaseHudElement 499->199 + impl/Registry + impl/Namer + impl/Prewarm (8.5.2) - refactor(clickgui): Setting 498->170 + impl/Localization + impl/I18n (8.5.2) - refact(viewmodel): split swing animations into camera/swing package - refact(kineticlyrics): split module into stage, playback and modes - rename(holeesp): module HoleESP -> CrystalHoles - refact(crystalholes): split module into crystal scanner, renderer and safety - refact(addonmanager): split manager into lifecycle, runtime, descriptors and profiles - refact(accountconfig): split config into store, session and value helpers - refactor(render): CustomTextRenderer 229->195, extract glyph-pass into GradientTexts helper - docs(TODO): mark AddonManager split done; close 9.2 refactor gate - refactor(media): LinuxMediaSession 441->148, split reader + track/seek state - refactor(nametags): split NameTags into facade + impl helpers - refactor(clickgui): split MainSettingsComponent into facade + scroll + model - refactor(hud): split CustomBar into facade, model and BarSettings - docs(frontend): implementation plan with design system from the mod theme - feat(frontend): design tokens from the mod theme, fonts and shared UI kit - fix(accounts): run migrations on startup, offload Argon2, validate register input, JSON error shape - docs(gateway): plan note on splitting auth handlers before refresh endpoints - feat(frontend): API client with silent refresh, error descriptions and test helpers - style(mod): group compact one-line bulk query methods in ModuleManager - feat(frontend): session restore, login and registration with client-side validation - refactor(hud): split CustomHealthBar into facade + painter + script renderer - docs(mod): record the 2026-09-24 HUD/settings split wave in TODO phase 8.5 - refactor(rhi): split GlStencilShapeClipBackend into facade + native-state + pass-lifecycle helpers - refactor(rhi): split VulkanRenderStateBridge into facade + MSAA and stencil state helpers - refactor(backtrack): split BacktrackController into facade + model + impl helpers - refactor(svg): split SvgPathParser into facade + arc geometry + command/curve helpers - refactor(mixin): split ClientPacketListenerMixin into hook-only mixin + handlers - refactor(renderer3d): un-nest batch bindings + culling into sibling impl types - refactor(renderwarp): extract static factories + geometry into impl helpers - feat(backend): add common crate with shared JWT, internal gateway contract and accounts proto - refactor(guimixin): move hook bodies into handlers, keep mixin as hooks + shadows - feat(accounts): accept only gateway traffic, read identity from gateway header - refactor(cacheduiscriptruntime): extract engine, hashing and frame stats into impl - refactor(customskyboxrenderer): extract projection, shader passes and sun into impl - refactor(betterchatstoremanager): extract persistence, key/path and hover helpers into impl - feat(accounts): rotating opaque refresh tokens in httpOnly cookie, /auth/refresh and /auth/logout - refactor(targetesp): extract crystal rendering subsystem into impl/TargetEspCrystalRenderer - refactor(betterchathovercache): extract disk codec and lookup indexing into impl/ChatHoverCacheCodec - refactor(microsoftauth): split HTTP transport, device-code and Xbox flows into impl/ - refactor(pvpcooldowns): extract local item-rule engine and defaults into impl/PvpCooldownRules - refactor(lovisual): extract HUD/world render orchestration into HudRender helper - refactor(statuseffectheuristics): extract palette/inference into ParticlePalette and color utils into ParticleColors - refactor(dropesp): extract overlay/label render subsystem into impl/DropEspOverlayRenderer - refactor(proxy): extract SOCKS handshake message builders into ProxyProtocolMessages - refactor(eagleutil): promote EdgeRecovery controller and RecoveryMode to top-level class
This commit is contained in:
parent
9d08fa910a
commit
72bc4c7148
1897 changed files with 36199 additions and 39289 deletions
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 loki5512344.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.util.entity;
|
||||
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
|
|
@ -21,8 +14,6 @@ public enum EagleUtil {
|
|||
private static final double MIN_AXIS_COMPONENT = 0.18;
|
||||
private static final double MAX_RESCUE_LOOKAHEAD = 0.42;
|
||||
private static final double MIN_TICK_DELTA_LEAD = 0.25;
|
||||
private static final double CENTER_DEAD_ANGLE_COS = 0.34;
|
||||
private static final int DIAGONAL_RESCUE_TICKS = 2;
|
||||
|
||||
public static EdgeCheck checkEdge(LocalPlayer player, MovementInputEvent event, double edgeDistance) {
|
||||
return checkEdge(player, event, edgeDistance, TickDelta.get());
|
||||
|
|
@ -173,196 +164,6 @@ public enum EagleUtil {
|
|||
return Math.max(0.0, Math.min(1.0, value));
|
||||
}
|
||||
|
||||
public enum RecoveryMode {
|
||||
STOP,
|
||||
INVERT,
|
||||
CENTER
|
||||
}
|
||||
|
||||
public static final class EdgeRecovery {
|
||||
private Vec3 center;
|
||||
private int overwriteTicks;
|
||||
private int sneakTicks;
|
||||
|
||||
private static Vec3 blockBottomCenter(LocalPlayer player) {
|
||||
return new Vec3(
|
||||
player.blockPosition().getX() + 0.5,
|
||||
player.blockPosition().getY(),
|
||||
player.blockPosition().getZ() + 0.5
|
||||
);
|
||||
}
|
||||
|
||||
private static double horizontalDistanceSquared(Vec3 a, Vec3 b) {
|
||||
double x = a.x - b.x;
|
||||
double z = a.z - b.z;
|
||||
return x * x + z * z;
|
||||
}
|
||||
|
||||
public boolean handleDiagonalRescue(LocalPlayer player, MovementInputEvent event, double edgeDistance) {
|
||||
if (player == null || event == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
updateSafeCenter(player);
|
||||
|
||||
EdgeCheck edgeCheck = checkEdge(player, event, edgeDistance);
|
||||
if (edgeCheck.diagonalRescue() && shouldOverwriteInput(player)) {
|
||||
overwriteTicks = Math.max(overwriteTicks, DIAGONAL_RESCUE_TICKS);
|
||||
}
|
||||
|
||||
if (overwriteTicks <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
overwriteTicks--;
|
||||
applyInputTowardsCenter(player, event);
|
||||
event.setJump(false);
|
||||
event.setSneak(true);
|
||||
event.setSprint(false);
|
||||
|
||||
updateSafeCenter(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean handleOnEdge(
|
||||
LocalPlayer player,
|
||||
MovementInputEvent event,
|
||||
double edgeDistance,
|
||||
RecoveryMode mode,
|
||||
int keepTicks,
|
||||
int requestedSneakTicks,
|
||||
boolean jump
|
||||
) {
|
||||
if (player == null || event == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
updateSafeCenter(player);
|
||||
|
||||
double distance = Math.min(horizontalSpeed(player), Math.max(0.0, edgeDistance));
|
||||
EdgeCheck edgeCheck = checkEdge(player, event, distance);
|
||||
if (edgeCheck.closeToEdge() && shouldOverwriteInput(player)) {
|
||||
overwriteTicks = Math.max(overwriteTicks, Math.max(1, keepTicks));
|
||||
sneakTicks = Math.max(sneakTicks, Math.max(0, requestedSneakTicks));
|
||||
}
|
||||
|
||||
boolean applied = false;
|
||||
if (overwriteTicks > 0) {
|
||||
overwriteTicks--;
|
||||
applyRecoveryInput(player, event, mode);
|
||||
event.setJump(jump);
|
||||
event.setSprint(false);
|
||||
applied = true;
|
||||
}
|
||||
|
||||
if (sneakTicks > 0) {
|
||||
sneakTicks--;
|
||||
event.setSneak(true);
|
||||
applied = true;
|
||||
}
|
||||
|
||||
updateSafeCenter(player);
|
||||
return applied;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
center = null;
|
||||
overwriteTicks = 0;
|
||||
sneakTicks = 0;
|
||||
}
|
||||
|
||||
private boolean shouldOverwriteInput(LocalPlayer player) {
|
||||
Vec3 center = this.center;
|
||||
if (center == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Vec3 horizontalVelocity = new Vec3(player.getDeltaMovement().x, 0.0, player.getDeltaMovement().z);
|
||||
if (horizontalVelocity.horizontalDistanceSqr() <= 0.02 * 0.02) {
|
||||
return true;
|
||||
}
|
||||
|
||||
double currentDistance = horizontalDistanceSquared(center, player.position());
|
||||
double nextDistance = horizontalDistanceSquared(center, player.position().add(horizontalVelocity));
|
||||
return nextDistance > currentDistance;
|
||||
}
|
||||
|
||||
private void applyRecoveryInput(LocalPlayer player, MovementInputEvent event, RecoveryMode mode) {
|
||||
RecoveryMode resolvedMode = mode != null ? mode : RecoveryMode.CENTER;
|
||||
if (resolvedMode == RecoveryMode.INVERT) {
|
||||
boolean forward = event.isForward();
|
||||
boolean backward = event.isBackward();
|
||||
boolean left = event.isLeft();
|
||||
boolean right = event.isRight();
|
||||
event.setForward(backward);
|
||||
event.setBackward(forward);
|
||||
event.setLeft(right);
|
||||
event.setRight(left);
|
||||
event.setJump(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (resolvedMode == RecoveryMode.STOP && horizontalSpeed(player) <= 0.05) {
|
||||
event.setForward(false);
|
||||
event.setBackward(false);
|
||||
event.setLeft(false);
|
||||
event.setRight(false);
|
||||
event.setJump(false);
|
||||
return;
|
||||
}
|
||||
|
||||
applyInputTowardsCenter(player, event);
|
||||
}
|
||||
|
||||
private void applyInputTowardsCenter(LocalPlayer player, MovementInputEvent event) {
|
||||
Vec3 center = this.center != null ? this.center : blockBottomCenter(player);
|
||||
Vec3 toCenter = center.subtract(player.position());
|
||||
Vec3 horizontal = new Vec3(toCenter.x, 0.0, toCenter.z);
|
||||
|
||||
if (horizontal.lengthSqr() < 0.015 * 0.015) {
|
||||
event.setForward(false);
|
||||
event.setBackward(false);
|
||||
event.setLeft(false);
|
||||
event.setRight(false);
|
||||
return;
|
||||
}
|
||||
|
||||
Vec3 direction = horizontal.normalize();
|
||||
double rad = Math.toRadians(player.getYRot());
|
||||
double sin = Math.sin(rad);
|
||||
double cos = Math.cos(rad);
|
||||
double localForward = direction.z * cos - direction.x * sin;
|
||||
double localSideways = direction.x * cos + direction.z * sin;
|
||||
|
||||
boolean forward = localForward > CENTER_DEAD_ANGLE_COS;
|
||||
boolean backward = localForward < -CENTER_DEAD_ANGLE_COS;
|
||||
boolean left = localSideways < -CENTER_DEAD_ANGLE_COS;
|
||||
boolean right = localSideways > CENTER_DEAD_ANGLE_COS;
|
||||
|
||||
if (!forward && !backward && !left && !right) {
|
||||
if (Math.abs(localForward) >= Math.abs(localSideways)) {
|
||||
forward = localForward > 0.0;
|
||||
backward = localForward < 0.0;
|
||||
} else {
|
||||
left = localSideways < 0.0;
|
||||
right = localSideways > 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
event.setForward(forward);
|
||||
event.setBackward(backward);
|
||||
event.setLeft(left);
|
||||
event.setRight(right);
|
||||
}
|
||||
|
||||
private void updateSafeCenter(LocalPlayer player) {
|
||||
Vec3 blockCenter = blockBottomCenter(player);
|
||||
if (!wouldBeCloseToFallOff(player, blockCenter)) {
|
||||
center = blockCenter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public record EdgeCheck(boolean closeToEdge, boolean diagonalRescue, Vec3 movementDirection) {
|
||||
private static EdgeCheck empty() {
|
||||
return new EdgeCheck(false, false, Vec3.ZERO);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,204 @@
|
|||
package dev.loki.lovisual.util.entity;
|
||||
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import dev.loki.lovisual.events.impl.movement.MovementInputEvent;
|
||||
|
||||
/**
|
||||
* Stateful edge-recovery controller extracted from {@link EagleUtil}. Tracks a safe block center and
|
||||
* the remaining overwrite/sneak ticks, and rewrites {@link MovementInputEvent} input to rescue the
|
||||
* player from walking off an edge. The pure geometry detection it consumes still lives in
|
||||
* {@link EagleUtil}; behaviour is identical to the original nested implementation.
|
||||
*/
|
||||
public final class EdgeRecovery {
|
||||
private static final double CENTER_DEAD_ANGLE_COS = 0.34;
|
||||
private static final int DIAGONAL_RESCUE_TICKS = 2;
|
||||
|
||||
public enum RecoveryMode {
|
||||
STOP,
|
||||
INVERT,
|
||||
CENTER
|
||||
}
|
||||
|
||||
private Vec3 center;
|
||||
private int overwriteTicks;
|
||||
private int sneakTicks;
|
||||
|
||||
private static Vec3 blockBottomCenter(LocalPlayer player) {
|
||||
return new Vec3(
|
||||
player.blockPosition().getX() + 0.5,
|
||||
player.blockPosition().getY(),
|
||||
player.blockPosition().getZ() + 0.5
|
||||
);
|
||||
}
|
||||
|
||||
private static double horizontalDistanceSquared(Vec3 a, Vec3 b) {
|
||||
double x = a.x - b.x;
|
||||
double z = a.z - b.z;
|
||||
return x * x + z * z;
|
||||
}
|
||||
|
||||
public boolean handleDiagonalRescue(LocalPlayer player, MovementInputEvent event, double edgeDistance) {
|
||||
if (player == null || event == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
updateSafeCenter(player);
|
||||
|
||||
EagleUtil.EdgeCheck edgeCheck = EagleUtil.checkEdge(player, event, edgeDistance);
|
||||
if (edgeCheck.diagonalRescue() && shouldOverwriteInput(player)) {
|
||||
overwriteTicks = Math.max(overwriteTicks, DIAGONAL_RESCUE_TICKS);
|
||||
}
|
||||
|
||||
if (overwriteTicks <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
overwriteTicks--;
|
||||
applyInputTowardsCenter(player, event);
|
||||
event.setJump(false);
|
||||
event.setSneak(true);
|
||||
event.setSprint(false);
|
||||
|
||||
updateSafeCenter(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean handleOnEdge(
|
||||
LocalPlayer player,
|
||||
MovementInputEvent event,
|
||||
double edgeDistance,
|
||||
RecoveryMode mode,
|
||||
int keepTicks,
|
||||
int requestedSneakTicks,
|
||||
boolean jump
|
||||
) {
|
||||
if (player == null || event == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
updateSafeCenter(player);
|
||||
|
||||
double distance = Math.min(EagleUtil.horizontalSpeed(player), Math.max(0.0, edgeDistance));
|
||||
EagleUtil.EdgeCheck edgeCheck = EagleUtil.checkEdge(player, event, distance);
|
||||
if (edgeCheck.closeToEdge() && shouldOverwriteInput(player)) {
|
||||
overwriteTicks = Math.max(overwriteTicks, Math.max(1, keepTicks));
|
||||
sneakTicks = Math.max(sneakTicks, Math.max(0, requestedSneakTicks));
|
||||
}
|
||||
|
||||
boolean applied = false;
|
||||
if (overwriteTicks > 0) {
|
||||
overwriteTicks--;
|
||||
applyRecoveryInput(player, event, mode);
|
||||
event.setJump(jump);
|
||||
event.setSprint(false);
|
||||
applied = true;
|
||||
}
|
||||
|
||||
if (sneakTicks > 0) {
|
||||
sneakTicks--;
|
||||
event.setSneak(true);
|
||||
applied = true;
|
||||
}
|
||||
|
||||
updateSafeCenter(player);
|
||||
return applied;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
center = null;
|
||||
overwriteTicks = 0;
|
||||
sneakTicks = 0;
|
||||
}
|
||||
|
||||
private boolean shouldOverwriteInput(LocalPlayer player) {
|
||||
Vec3 center = this.center;
|
||||
if (center == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Vec3 horizontalVelocity = new Vec3(player.getDeltaMovement().x, 0.0, player.getDeltaMovement().z);
|
||||
if (horizontalVelocity.horizontalDistanceSqr() <= 0.02 * 0.02) {
|
||||
return true;
|
||||
}
|
||||
|
||||
double currentDistance = horizontalDistanceSquared(center, player.position());
|
||||
double nextDistance = horizontalDistanceSquared(center, player.position().add(horizontalVelocity));
|
||||
return nextDistance > currentDistance;
|
||||
}
|
||||
|
||||
private void applyRecoveryInput(LocalPlayer player, MovementInputEvent event, RecoveryMode mode) {
|
||||
RecoveryMode resolvedMode = mode != null ? mode : RecoveryMode.CENTER;
|
||||
if (resolvedMode == RecoveryMode.INVERT) {
|
||||
boolean forward = event.isForward();
|
||||
boolean backward = event.isBackward();
|
||||
boolean left = event.isLeft();
|
||||
boolean right = event.isRight();
|
||||
event.setForward(backward);
|
||||
event.setBackward(forward);
|
||||
event.setLeft(right);
|
||||
event.setRight(left);
|
||||
event.setJump(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (resolvedMode == RecoveryMode.STOP && EagleUtil.horizontalSpeed(player) <= 0.05) {
|
||||
event.setForward(false);
|
||||
event.setBackward(false);
|
||||
event.setLeft(false);
|
||||
event.setRight(false);
|
||||
event.setJump(false);
|
||||
return;
|
||||
}
|
||||
|
||||
applyInputTowardsCenter(player, event);
|
||||
}
|
||||
|
||||
private void applyInputTowardsCenter(LocalPlayer player, MovementInputEvent event) {
|
||||
Vec3 center = this.center != null ? this.center : blockBottomCenter(player);
|
||||
Vec3 toCenter = center.subtract(player.position());
|
||||
Vec3 horizontal = new Vec3(toCenter.x, 0.0, toCenter.z);
|
||||
|
||||
if (horizontal.lengthSqr() < 0.015 * 0.015) {
|
||||
event.setForward(false);
|
||||
event.setBackward(false);
|
||||
event.setLeft(false);
|
||||
event.setRight(false);
|
||||
return;
|
||||
}
|
||||
|
||||
Vec3 direction = horizontal.normalize();
|
||||
double rad = Math.toRadians(player.getYRot());
|
||||
double sin = Math.sin(rad);
|
||||
double cos = Math.cos(rad);
|
||||
double localForward = direction.z * cos - direction.x * sin;
|
||||
double localSideways = direction.x * cos + direction.z * sin;
|
||||
|
||||
boolean forward = localForward > CENTER_DEAD_ANGLE_COS;
|
||||
boolean backward = localForward < -CENTER_DEAD_ANGLE_COS;
|
||||
boolean left = localSideways < -CENTER_DEAD_ANGLE_COS;
|
||||
boolean right = localSideways > CENTER_DEAD_ANGLE_COS;
|
||||
|
||||
if (!forward && !backward && !left && !right) {
|
||||
if (Math.abs(localForward) >= Math.abs(localSideways)) {
|
||||
forward = localForward > 0.0;
|
||||
backward = localForward < 0.0;
|
||||
} else {
|
||||
left = localSideways < 0.0;
|
||||
right = localSideways > 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
event.setForward(forward);
|
||||
event.setBackward(backward);
|
||||
event.setLeft(left);
|
||||
event.setRight(right);
|
||||
}
|
||||
|
||||
private void updateSafeCenter(LocalPlayer player) {
|
||||
Vec3 blockCenter = blockBottomCenter(player);
|
||||
if (!EagleUtil.wouldBeCloseToFallOff(player, blockCenter)) {
|
||||
center = blockCenter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 loki5512344.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.util.entity;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 loki5512344.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.util.entity.simulation;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 loki5512344.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.util.entity.simulation;
|
||||
|
||||
import net.minecraft.util.Mth;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 loki5512344.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.util.entity.simulation;
|
||||
|
||||
import net.minecraft.world.entity.Entity;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* This file is part of the LoVisual Client distribution.
|
||||
* Copyright (c) 2026 loki5512344.
|
||||
*
|
||||
* Licensed under the GNU General Public License v3.0.
|
||||
*/
|
||||
|
||||
package dev.loki.lovisual.util.entity.simulation;
|
||||
|
||||
import net.minecraft.world.entity.Entity;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue