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+}