commit d3fd2b7
uint
·
2026-08-02 19:42:48 +0000 UTC
parent 6546eeb
add player position sending, recieving
3 files changed,
+110,
-0
+24,
-0
1@@ -0,0 +1,24 @@
2+#ifndef PLAYER_H
3+#define PLAYER_H
4+
5+#include "types.h"
6+#include "client/camera.h"
7+#include "mcproto/mcproto.h"
8+
9+typedef struct {
10+ double x;
11+ double y;
12+ double z;
13+
14+ float yaw;
15+ float pitch;
16+
17+ i8 positioned;
18+} Player;
19+
20+void player_server_send_position(Player* player, MGCamera* cam, MCClient* client);
21+void player_server_handle_position(Player* player, MGCamera* cam, const MCPacket* packet);
22+
23+#endif /* PLAYER_H */
24+
25+
+1,
-0
1@@ -23,6 +23,7 @@ sources = [
2 'source/util.c',
3 'source/world/chunk.c',
4 'source/client/camera.c',
5+ 'source/client/player.c',
6 'source/mcproto/auth.c',
7 'source/mcproto/buffer.c',
8 'source/mcproto/client.c',
+85,
-0
1@@ -0,0 +1,85 @@
2+#include <SDL2/SDL.h>
3+
4+#include "mgmath.h"
5+#include "util.h"
6+#include "client/player.h"
7+#include "mcproto/mcproto.h"
8+#include "mcproto/packet.h"
9+
10+void player_server_handle_position(Player* player, MGCamera* cam, const MCPacket* packet)
11+{
12+ PacketReader reader = packet_reader_init(packet->data, packet->size);
13+ double x;
14+ double y;
15+ double z;
16+ float yaw;
17+ float pitch;
18+ u8 flags;
19+
20+ if (!packet_read_f64(&reader, &x) ||
21+ !packet_read_f64(&reader, &y) ||
22+ !packet_read_f64(&reader, &z) ||
23+ !packet_read_f32(&reader, &yaw) ||
24+ !packet_read_f32(&reader, &pitch) ||
25+ !packet_read_u8(&reader, &flags)) {
26+ mg_log(LOG_ERR, "Malformed position packet");
27+ return;
28+ }
29+
30+ if (flags & 0x01)
31+ player->x += x;
32+ else
33+ player->x = x;
34+
35+ if (flags & 0x02)
36+ player->y += y;
37+ else
38+ player->y = y;
39+
40+ if (flags & 0x04)
41+ player->z += z;
42+ else
43+ player->z = z;
44+
45+ if (flags & 0x08)
46+ player->yaw += yaw;
47+ else
48+ player->yaw = yaw;
49+
50+ if (flags & 0x10)
51+ player->pitch += pitch;
52+ else
53+ player->pitch = pitch;
54+
55+ player->positioned = 1;
56+
57+ cam->pos = MG_V3(player->x, player->y + 1.62f, player->z);
58+ cam->yaw = MG_AngleDeg( player->yaw - 180.0f);
59+ cam->pitch = MG_AngleDeg(-player->pitch);
60+}
61+
62+void player_server_send_position(Player* player, MGCamera* cam, MCClient* client)
63+{
64+ static u32 last_send;
65+ u64 now;
66+
67+ if (!client || !player->positioned)
68+ return;
69+
70+ now = SDL_GetTicks64(); /* TODO shim */
71+
72+ if (now - last_send < 50)
73+ return;
74+
75+ last_send = now;
76+
77+ player->x = cam->pos.x;
78+ player->y = cam->pos.y - 1.62f;
79+ player->z = cam->pos.z;
80+
81+ player->yaw = cam->yaw / MG_DEG_TO_RAD + 180.0f;
82+ player->pitch = -cam->pitch / MG_DEG_TO_RAD;
83+
84+ if (!mc_client_send_position_look(client, player->x, player->y, player->z, player->yaw, player->pitch, 0))
85+ mg_log(LOG_ERR, "Failed to send player position");
86+}