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}