Skip to content

Commit 20e03c7

Browse files
added MESSAGE_TYPE_CHUNK_PARAMS protocol request
for web-socket "chunk_params"
1 parent 313b93d commit 20e03c7

7 files changed

Lines changed: 84 additions & 21 deletions

File tree

include/game/GameData.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ struct PortalData {
145145
bool active = false;
146146
};
147147

148+
struct ChunkParams {
149+
uint64_t timestamp;
150+
uint64_t session_id;
151+
int size;
152+
float spacing;
153+
};
154+
148155
struct ChunkData {
149156
uint64_t timestamp;
150157
uint64_t session_id;

include/game/GameLogic.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
6666
void SendAuthenticationFailure(uint64_t sessionId, const std::string& message);
6767

6868
void SetSendAuthenticationResponseCallback(std::function<void(uint64_t sessionId, const std::string& message, uint64_t playerId)> cb);
69+
void SetSendChunkParamsCallback(std::function<void(uint64_t sessionId, const ChunkParams&)> cb);
6970
void SetSendChunkCallback(std::function<void(uint64_t sessionId, const ChunkData&)> cb);
7071
void SetSendCollisionResponseCallback(std::function<void(uint64_t session_id, const CollisionResult& result)> cb);
7172

@@ -81,7 +82,8 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
8182
void SetSendInventoryResponseCallback(std::function<void(uint64_t session_id, const InventoryData& response)> cb);
8283

8384
void OnAuthentication(const AuthenticationData& data);
84-
void OnChunkRequest(const ChunkData& data);
85+
void OnChunkParams(const ChunkParams& req);
86+
void OnChunkData(const ChunkData& data);
8587
void OnCollisionCheck(const CollisionData& data);
8688
void OnPlayerPosition(const PlayerPositionData& data);
8789
void OnPlayerState(const PlayerStateData& data);
@@ -131,6 +133,7 @@ class GameLogic : public LogicCore, public std::enable_shared_from_this<GameLogi
131133
DatabaseService* dbService_ = nullptr;
132134

133135
std::function<void(uint64_t, const std::string&, uint64_t)> sendAuthResponseCb_;
136+
std::function<void(uint64_t, const ChunkParams&)> sendChunkParamsCb_;
134137
std::function<void(uint64_t, const ChunkData&)> sendChunkCb_;
135138
std::function<void(uint64_t, const CollisionResult&)> sendCollisionResponseCb_;
136139

include/network/BinaryProtocol.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@ namespace BinaryProtocol {
2626
MESSAGE_TYPE_COLLISION_CHECK = 50,
2727

2828
// World messages
29-
MESSAGE_TYPE_CHUNK_DATA = 100,
30-
MESSAGE_TYPE_CHUNK_REQUEST = 101,
31-
MESSAGE_TYPE_TERRAIN_HEIGHT = 102,
32-
MESSAGE_TYPE_BIOME_DATA = 103,
29+
MESSAGE_TYPE_CHUNK_PARAMS = 100,
30+
MESSAGE_TYPE_CHUNK_DATA = 101,
31+
MESSAGE_TYPE_BIOME_DATA = 102,
3332

3433
// Player messages
3534
MESSAGE_TYPE_PLAYER_POSITION = 200,

src/game/GameLogic.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,10 @@ void GameLogic::SetSendAuthenticationResponseCallback(std::function<void(uint64_
424424
sendAuthResponseCb_ = std::move(cb);
425425
}
426426

427+
void GameLogic::SetSendChunkParamsCallback(std::function<void(uint64_t, const ChunkParams&)> cb) {
428+
sendChunkParamsCb_ = std::move(cb);
429+
}
430+
427431
void GameLogic::SetSendChunkCallback(std::function<void(uint64_t, const ChunkData&)> cb) {
428432
sendChunkCb_ = std::move(cb);
429433
}
@@ -505,7 +509,19 @@ void GameLogic::OnAuthentication(const AuthenticationData& data) {
505509
}
506510
}
507511

508-
void GameLogic::OnChunkRequest(const ChunkData& req) {
512+
void GameLogic::OnChunkParams(const ChunkParams& req) {
513+
ChunkParams resp;
514+
resp.size = WorldChunk::DEFAULT_SIZE;
515+
resp.spacing = WorldChunk::DEFAULT_SPACING;
516+
resp.timestamp = GetCurrentTimestamp();
517+
if (sendChunkParamsCb_) {
518+
sendChunkParamsCb_(req.session_id, resp);
519+
} else {
520+
Logger::Error("No sendChunkParamsCb_ set in GameLogic");
521+
}
522+
}
523+
524+
void GameLogic::OnChunkData(const ChunkData& req) {
509525
auto chunk = GetOrCreateChunk(req.x, req.z);
510526
if (!chunk) {
511527
Logger::Error("Failed to get chunk ({},{}) for session {}", req.x, req.z, req.session_id);

src/game/WorldGenerator.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,21 @@ std::unique_ptr<WorldChunk> WorldGenerator::GenerateChunk(int chunkX, int chunkZ
7979
return chunk;
8080
}
8181

82+
// float WorldGenerator::GetTerrainHeight(float x, float z) {
83+
// float baseHeight = FractalNoise(x / config_.terrainScale, z / config_.terrainScale);
84+
// float detail = Noise(x / (config_.terrainScale * 0.5f), z / (config_.terrainScale * 0.5f)) * 0.2f;
85+
// float normalizedHeight = (baseHeight + detail + 1.0f) * 0.5f;
86+
// normalizedHeight = std::pow(normalizedHeight, 1.5f);
87+
// float result = normalizedHeight * config_.terrainHeight;
88+
// return result;
89+
// }
90+
91+
//TODO: replace all constants to parameters from config and also send to client with MESSAGE_TYPE_CHUNK_PARAMS
8292
float WorldGenerator::GetTerrainHeight(float x, float z) {
83-
float baseHeight = FractalNoise(x / config_.terrainScale, z / config_.terrainScale);
84-
float detail = Noise(x / (config_.terrainScale * 0.5f), z / (config_.terrainScale * 0.5f)) * 0.2f;
85-
float normalizedHeight = (baseHeight + detail + 1.0f) * 0.5f;
86-
normalizedHeight = std::pow(normalizedHeight, 1.5f);
87-
float result = normalizedHeight * config_.terrainHeight;
88-
// if (std::abs(x) < 1.0f && std::abs(z) < 1.0f) {
89-
// Logger::Trace("GetTerrainHeight({:.2f}, {:.2f}) = {:.4f} (base={:.4f}, norm={:.4f})",
90-
// x, z, result, baseHeight, normalizedHeight);
91-
// }
92-
return result;
93+
return (sin(x * 0.1) * cos(z * 0.1) +
94+
0.3f * sin(x * 0.3f + 1.2f) +
95+
0.3f * cos(z * 0.3f + 2.4f) +
96+
0.2f * sin((x * 0.6f + z * 0.4f) * 0.8f)) * 2.0f + 0.5f;
9397
}
9498

9599
BiomeType WorldGenerator::GetBiomeAt(float x, float z) {

src/network/BinarySession.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ void BinarySession::HandleBinaryMessage(const BinaryProtocol::BinaryMessage& mes
323323
case BinaryProtocol::MESSAGE_TYPE_PROTOCOL_NEGOTIATION:
324324
HandleProtocolNegotiation(message.data);
325325
return;
326-
case BinaryProtocol::MESSAGE_TYPE_CHUNK_REQUEST: {
326+
case BinaryProtocol::MESSAGE_TYPE_CHUNK_DATA: {
327327
BinaryProtocol::BinaryReader reader(message.data.data(), message.data.size());
328328
ChunkData req;
329329
req.x = reader.ReadInt32();
@@ -333,7 +333,7 @@ void BinarySession::HandleBinaryMessage(const BinaryProtocol::BinaryMessage& mes
333333
req.player_y = reader.ReadFloat();
334334
req.player_z = reader.ReadFloat();
335335
req.session_id = sessionId_;
336-
GameLogic::GetInstance().OnChunkRequest(req);
336+
GameLogic::GetInstance().OnChunkData(req);
337337
break;
338338
}
339339
case BinaryProtocol::MESSAGE_TYPE_ERROR:

src/network/GameServer.cpp

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,14 @@ void GameServer::InitSessionFactory(int workerId, ProcessPool* processPool, Game
170170
game_logic.OnAuthentication(authData);
171171
break;
172172
}
173-
case BinaryProtocol::MESSAGE_TYPE_CHUNK_REQUEST: {
173+
case BinaryProtocol::MESSAGE_TYPE_CHUNK_PARAMS: {
174+
BinaryProtocol::BinaryReader reader(data.data(), data.size());
175+
ChunkParams req;
176+
req.session_id = session->GetSessionId();
177+
game_logic.OnChunkParams(req);
178+
break;
179+
}
180+
case BinaryProtocol::MESSAGE_TYPE_CHUNK_DATA: {
174181
BinaryProtocol::BinaryReader reader(data.data(), data.size());
175182
ChunkData req;
176183
req.x = reader.ReadInt32();
@@ -180,7 +187,7 @@ void GameServer::InitSessionFactory(int workerId, ProcessPool* processPool, Game
180187
req.player_y = reader.ReadFloat();
181188
req.player_z = reader.ReadFloat();
182189
req.session_id = session->GetSessionId();
183-
game_logic.OnChunkRequest(req);
190+
game_logic.OnChunkData(req);
184191
break;
185192
}
186193
case BinaryProtocol::MESSAGE_TYPE_COLLISION_CHECK: {
@@ -302,6 +309,11 @@ void GameServer::InitSessionFactory(int workerId, ProcessPool* processPool, Game
302309
authData.session_id = session->GetSessionId();
303310
game_logic.OnAuthentication(authData);
304311
}
312+
else if (msgType == "chunk_params") {
313+
ChunkParams req;
314+
req.session_id = session->GetSessionId();
315+
game_logic.OnChunkParams(req);
316+
}
305317
else if (msgType == "get_chunk") {
306318
ChunkData req;
307319
req.x = msg.value("x", 0);
@@ -311,7 +323,7 @@ void GameServer::InitSessionFactory(int workerId, ProcessPool* processPool, Game
311323
req.player_y = msg.value("player_y", 0.0f);
312324
req.player_z = msg.value("player_z", 0.0f);
313325
req.session_id = session->GetSessionId();
314-
game_logic.OnChunkRequest(req);
326+
game_logic.OnChunkData(req);
315327
}
316328
else if (msgType == "collision") {
317329
CollisionData req;
@@ -507,11 +519,21 @@ void GameServer::RegisterCallbacks(const std::string& protocol, GameLogic& game_
507519
session->Send(BinaryProtocol::MESSAGE_TYPE_AUTHENTICATION, writer.GetBuffer());
508520
}
509521
});
522+
game_logic.SetSendChunkParamsCallback([&](uint64_t session_id, const ChunkParams& data) {
523+
BinaryProtocol::BinaryWriter writer;
524+
writer.WriteUInt32(static_cast<uint32_t>(data.size));
525+
writer.WriteFloat(data.spacing);
526+
auto session = ConnectionManager::GetInstance().GetSession(session_id);
527+
if (session) {
528+
session->Send(BinaryProtocol::MESSAGE_TYPE_CHUNK_PARAMS, writer.GetBuffer());
529+
}
530+
});
510531
game_logic.SetSendChunkCallback([&](uint64_t session_id, const ChunkData& data) {
511532
BinaryProtocol::BinaryWriter writer;
512533
writer.WriteInt32(data.x);
513534
writer.WriteInt32(data.z);
514535
writer.WriteInt32(data.size);
536+
writer.WriteFloat(data.spacing);
515537
uint32_t vertexDataSize = static_cast<uint32_t>(data.vertices.size() * sizeof(float));
516538
writer.WriteUInt32(vertexDataSize);
517539
writer.WriteBytes(reinterpret_cast<const uint8_t*>(data.vertices.data()), vertexDataSize);
@@ -671,6 +693,18 @@ void GameServer::RegisterCallbacks(const std::string& protocol, GameLogic& game_
671693
session->SendJson(response);
672694
}
673695
});
696+
game_logic.SetSendChunkParamsCallback([&](uint64_t session_id, const ChunkParams& data) {
697+
nlohmann::json msg = {
698+
{"msg", "chunk_params"},
699+
{"size", data.size},
700+
{"spacing", data.spacing},
701+
{"timestamp", data.timestamp}
702+
};
703+
auto session = ConnectionManager::GetInstance().GetSession(session_id);
704+
if (session) {
705+
session->SendJson(msg);
706+
}
707+
});
674708
game_logic.SetSendChunkCallback([&](uint64_t session_id, const ChunkData& data) {
675709
nlohmann::json msg = {
676710
{"msg", "get_chunk"},

0 commit comments

Comments
 (0)