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:
| M | src/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);