From 3b9ca68a5786f9eca56c21992b33dc1512222cde Mon Sep 17 00:00:00 2001 From: p2r3 Date: Tue, 12 Aug 2025 13:07:42 +0300 Subject: [PATCH] spawn players at terrain height level --- main.c | 15 ++++++++++++++- src/tools.c | 5 ++--- src/worldgen.c | 3 +-- src/worldgen.h | 5 ++++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/main.c b/main.c index 1d2095b..a730e6f 100644 --- a/main.c +++ b/main.c @@ -14,6 +14,7 @@ #include "src/tools.h" #include "src/varnum.h" #include "src/packets.h" +#include "src/worldgen.h" void handlePacket (int client_fd, int length, int packet_id) { @@ -59,7 +60,19 @@ void handlePacket (int client_fd, int length, int packet_id) { PlayerData *player; if (getPlayerData(client_fd, &player)) break; - sc_synchronizePlayerPosition(client_fd, player->x, player->y, player->z, player->yaw * 180 / 127, player->pitch * 90 / 127); + if (player->y == -32767) { // is this a new player? + + int _x = 8 / chunk_size; + int _z = 8 / chunk_size; + int rx = 8 % chunk_size; + int rz = 8 % chunk_size; + + uint32_t chunk_hash = getChunkHash(_x, _z); + sc_synchronizePlayerPosition(client_fd, 8.5, getHeightAt(rx, rz, _x, _z, chunk_hash) + 1, 8.5, 0, 0); + + } else { + sc_synchronizePlayerPosition(client_fd, player->x, player->y, player->z, player->yaw * 180 / 127, player->pitch * 90 / 127); + } for (uint8_t i = 0; i < 41; i ++) { sc_setContainerSlot(client_fd, 0, serverSlotToClientSlot(i), player->inventory_count[i], player->inventory_items[i]); diff --git a/src/tools.c b/src/tools.c index 6cfdcad..fea00fe 100644 --- a/src/tools.c +++ b/src/tools.c @@ -7,6 +7,7 @@ #include "globals.h" #include "varnum.h" #include "packets.h" +#include "tools.h" static uint64_t htonll (uint64_t value) { #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ @@ -144,9 +145,7 @@ int reservePlayerData (int client_fd, char *uuid) { if (empty) { player_data[i].client_fd = client_fd; memcpy(player_data[i].uuid, uuid, 16); - player_data[i].x = 8; - player_data[i].y = 80; - player_data[i].z = 8; + player_data[i].y = -32767; return 0; } } diff --git a/src/worldgen.c b/src/worldgen.c index 3249636..b85cb68 100644 --- a/src/worldgen.c +++ b/src/worldgen.c @@ -7,6 +7,7 @@ #include "globals.h" #include "tools.h" #include "registries.h" +#include "worldgen.h" uint32_t getHash (const void *data, size_t len) { const uint8_t *bytes = data; @@ -50,8 +51,6 @@ int getCornerHeight (uint32_t hash) { } -#define chunk_size 8 - int interpolate (int a, int b, int c, int d, int x, int z) { int top = a * (chunk_size - x) + b * x; int bottom = c * (chunk_size - x) + d * x; diff --git a/src/worldgen.h b/src/worldgen.h index bbf374f..fe0e99d 100644 --- a/src/worldgen.h +++ b/src/worldgen.h @@ -3,7 +3,10 @@ #include +#define chunk_size 8 + +uint32_t getChunkHash (short x, short z); +int getHeightAt (int rx, int rz, int _x, int _z, uint32_t chunk_hash); uint8_t getBlockAt (int x, int y, int z); -void writeChunkSection (int client_fd, int _x, int _z, int i); #endif