antizona

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 0587a7dce380a0b53b057b3b4ceda7a1e66406ac
parent 699c6de2cacb555259244389e72d2baa57e69108
Author: averagecoder <averagecoder@noreply.codeberg.org>
Date:   Mon, 24 Aug 2026 17:20:01 +0300

fix: player freeze in chat/menu

Diffstat:
Msrc/render.c | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 56 insertions(+), 24 deletions(-)

diff --git a/src/render.c b/src/render.c @@ -40,6 +40,11 @@ #define TAR_INDEX_SIZE 32768 #define CHAT_LINES 6 +#define GRAVITY 9.81f +#define TERMINAL_VEL 50.0f +#define JUMP_FORCE 6.2f +#define STEP_SNAP_DOWN 0.40f + #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) @@ -2500,7 +2505,9 @@ main(int argc, char *argv[]) struct timespec ts, t_start, t_end; XEvent sa_event; float player_x = 2490.0f, player_y = 13.5f, player_z = -1660.0f; + float player_vy = 0.0f; float player_yaw = 0.0f; + int is_grounded = 0; float cam_x, cam_y, cam_z; float cam_yaw = -1.57f, cam_pitch = 0.2f, cam_dist = 3.5f; float move_forward, move_strafe, move_x, move_z, move_len; @@ -2754,6 +2761,9 @@ main(int argc, char *argv[]) net_timer = 0.0f; } + move_forward = 0.0f; + move_strafe = 0.0f; + if (!g.in_chat && !g.menu_open) { m_dx = last_mx - WIDTH / 2; m_dy = last_my - HEIGHT / 2; @@ -2771,45 +2781,67 @@ main(int argc, char *argv[]) cam_pitch = -1.2f; } - move_forward = 0.0f; - move_strafe = 0.0f; if (g.keys['w']) move_forward += 1.0f; if (g.keys['s']) move_forward -= 1.0f; if (g.keys['d']) move_strafe += 1.0f; if (g.keys['a']) move_strafe -= 1.0f; - move_x = sinf(cam_yaw) * move_forward + cosf(cam_yaw) * move_strafe; - move_z = cosf(cam_yaw) * move_forward - sinf(cam_yaw) * move_strafe; - move_len = sqrtf(move_x * move_x + move_z * move_z); - - if (move_len > 0.001f) { - move_x /= move_len; - move_z /= move_len; - player_yaw = atan2f(move_x, move_z); - speed = 6.0f; - move_and_slide(&player_x, &player_y, &player_z, - move_x * speed, move_z * speed, dt); + if (g.keys[' '] && is_grounded) { + player_vy = JUMP_FORCE; + is_grounded = 0; } + } + + move_x = sinf(cam_yaw) * move_forward + cosf(cam_yaw) * move_strafe; + move_z = cosf(cam_yaw) * move_forward - sinf(cam_yaw) * move_strafe; + move_len = sqrtf(move_x * move_x + move_z * move_z); - ground_y = get_ground_height(player_x, player_z, player_y); + if (move_len > 0.001f) { + move_x /= move_len; + move_z /= move_len; + player_yaw = atan2f(move_x, move_z); + speed = 6.0f; + move_and_slide(&player_x, &player_y, &player_z, + move_x * speed, move_z * speed, dt); + } + + ground_y = get_ground_height(player_x, player_z, player_y); + + if (is_grounded) { if (ground_y > -900.0f) { - if (player_y > ground_y) { - player_y -= 15.0f * dt; - if (player_y < ground_y) { - player_y = ground_y; - } - } else if (player_y < ground_y) { + float diff = player_y - ground_y; + + if (diff <= STEP_SNAP_DOWN && diff >= -0.5f) { player_y = ground_y; + player_vy = 0.0f; + } else if (diff > STEP_SNAP_DOWN) { + is_grounded = 0; } + } else { + is_grounded = 0; + } + } else { + player_vy -= GRAVITY * dt; + if (player_vy < -TERMINAL_VEL) { + player_vy = -TERMINAL_VEL; } - cam_x = player_x - sinf(cam_yaw) * cosf(cam_pitch) * cam_dist; - cam_y = player_y + 1.2f - sinf(cam_pitch) * cam_dist; - cam_z = player_z - cosf(cam_yaw) * cosf(cam_pitch) * cam_dist; + player_y += player_vy * dt; + + if (player_vy <= 0.0f && ground_y > -900.0f && player_y <= ground_y) { + player_y = ground_y; + player_vy = 0.0f; + is_grounded = 1; + } } + cam_x = player_x - sinf(cam_yaw) * cosf(cam_pitch) * cam_dist; + cam_y = player_y + 1.2f - sinf(cam_pitch) * cam_dist; + cam_z = player_z - cosf(cam_yaw) * cosf(cam_pitch) * cam_dist; + update_weather(&g); - mat_projection(&g.proj, 60.0f, (float)WIDTH / HEIGHT, 0.1f, g.cur_weather.far_clp); + mat_projection(&g.proj, 60.0f, (float)WIDTH / HEIGHT, 0.1f, + g.cur_weather.far_clp); memset(g.zbuffer, 0, WIDTH * HEIGHT * sizeof(float)); mat_view(&view, cam_x, cam_y, cam_z, cam_yaw, cam_pitch);