master uint/magnolia / source / client / player.c
 1#include "mgmath.h"
 2#include "util.h"
 3#include "client/player.h"
 4#include "net/mc_proto.h"
 5#include "net/packet.h"
 6#include "platform/platform.h"
 7
 8void player_server_handle_position(Player* player, MGCamera* cam, const MCPacket* packet)
 9{
10	PacketReader reader = packet_reader_init(packet->data, packet->size);
11	double       x;
12	double       y;
13	double       z;
14	float        yaw;
15	float        pitch;
16	u8           flags;
17
18	if (!packet_read_f64(&reader, &x) || !packet_read_f64(&reader, &y) || !packet_read_f64(&reader, &z) ||
19	    !packet_read_f32(&reader, &yaw) || !packet_read_f32(&reader, &pitch) || !packet_read_u8(&reader, &flags)) {
20		mg_log(LOG_ERR, "Malformed position packet");
21		return;
22	}
23
24	if (flags & 0x01)
25		player->x += x;
26	else
27		player->x = x;
28
29	if (flags & 0x02)
30		player->y += y;
31	else
32		player->y = y;
33
34	if (flags & 0x04)
35		player->z += z;
36	else
37		player->z = z;
38
39	if (flags & 0x08)
40		player->yaw += yaw;
41	else
42		player->yaw = yaw;
43
44	if (flags & 0x10)
45		player->pitch += pitch;
46	else
47		player->pitch = pitch;
48
49	player->positioned = 1;
50
51	cam->pos = MG_V3(player->x, player->y + 1.62f, player->z);
52	cam->yaw = MG_AngleDeg(player->yaw - 180.0f);
53	cam->pitch = MG_AngleDeg(-player->pitch);
54}
55
56void player_server_send_position(Player* player, MGCamera* cam, MCClient* client)
57{
58	static u32 last_send;
59	u64        now;
60
61	if (!client || !player->positioned)
62		return;
63
64	now = platform_get_ticks();
65
66	if (now - last_send < 50)
67		return;
68
69	last_send = now;
70
71	player->x = cam->pos.x;
72	player->y = cam->pos.y - 1.62f;
73	player->z = cam->pos.z;
74
75	player->yaw = cam->yaw / MG_DEG_TO_RAD + 180.0f;
76	player->pitch = -cam->pitch / MG_DEG_TO_RAD;
77
78	if (!mc_client_send_position_look(client, player->x, player->y, player->z, player->yaw, player->pitch, 0))
79		mg_log(LOG_ERR, "Failed to send player position");
80}