@@ -592,7 +592,7 @@ void GameLogic::HandlePlayerPositionUpdate(uint64_t sessionId, const nlohmann::j
592592 positionWriter.WriteVector3 (glm::vec3 (0 , 0 , 0 ));
593593 positionWriter.WriteUInt64 (GetCurrentTimestamp ());
594594
595- BroadcastBinaryToNearbyPlayers (position, BinaryProtocol::MESSAGE_TYPE_PLAYER_POSITION,
595+ BroadcastToNearbyPlayers (position, BinaryProtocol::MESSAGE_TYPE_PLAYER_POSITION,
596596 positionWriter.GetBuffer (), 100 .0f );
597597
598598 FirePythonEvent (" player_move_3d" , {
@@ -862,55 +862,52 @@ void GameLogic::HandleEntitySpawnRequest(uint64_t sessionId, const nlohmann::jso
862862}
863863
864864// =============== Broadcasting ===============
865- void GameLogic::BroadcastEntitySpawn (uint64_t entityId, EntityType type, const glm::vec3& position,
866- float yaw, const std::string& name) {
867- BinaryProtocol::BinaryWriter writer;
868- writer.WriteUInt64 (entityId);
869- writer.WriteUInt8 (static_cast <uint8_t >(type));
870- writer.WriteString (name);
871- writer.WriteVector3 (position);
872- writer.WriteFloat (yaw);
873- writer.WriteUInt64 (GetCurrentTimestamp ());
874-
875- BroadcastToNearbyPlayers (position, BinaryProtocol::MESSAGE_TYPE_ENTITY_SPAWN, writer.GetBuffer (), 100 .0f );
876- }
877-
878- void GameLogic::BroadcastBinaryToNearbyPlayers (const glm::vec3& position, uint16_t messageType,
879- const std::vector<uint8_t >& data, float radius) {
865+ void GameLogic::BroadcastToNearbyPlayers (const glm::vec3& position, uint16_t messageType,
866+ const std::vector<uint8_t >& data, float radius) {
880867 if (!connectionManager_) return ;
881868 auto & pm = PlayerManager::GetInstance ();
882- auto onlinePlayers = pm.GetOnlinePlayers (); // returns vector of shared_ptr<Player>
883- for (const auto & player : onlinePlayers) {
884- if (glm::distance (player->GetPosition (), position) <= radius) {
885- uint64_t sessionId = GetSessionIdByPlayer (player->GetId ());
886- if (sessionId != 0 ) {
887- auto session = connectionManager_->GetSession (sessionId);
888- if (session && session->IsConnected ()) {
889- session->SendBinary (messageType, data);
890- }
869+ auto nearby = pm.GetPlayersInRadius (position, radius);
870+ for (auto & player : nearby) {
871+ uint64_t sessionId = pm.GetSessionIdByPlayerId (player->GetId ());
872+ if (sessionId != 0 ) {
873+ auto session = connectionManager_->GetSession (sessionId);
874+ if (session && session->IsConnected ()) {
875+ session->SendBinary (messageType, data);
891876 }
892877 }
893878 }
894879}
895880
896- void GameLogic::BroadcastToNearbyPlayers (const glm::vec3& position, const nlohmann::json& message, float radius) {
881+ void GameLogic::BroadcastToNearbyOnlinePlayers (const glm::vec3& position, uint16_t messageType,
882+ const std::vector<uint8_t >& data, float radius) {
897883 if (!connectionManager_) return ;
898884 auto & pm = PlayerManager::GetInstance ();
899885 auto onlinePlayers = pm.GetOnlinePlayers ();
900- std::string serialized = message.dump ();
901886 for (const auto & player : onlinePlayers) {
902887 if (glm::distance (player->GetPosition (), position) <= radius) {
903888 uint64_t sessionId = GetSessionIdByPlayer (player->GetId ());
904889 if (sessionId != 0 ) {
905890 auto session = connectionManager_->GetSession (sessionId);
906891 if (session && session->IsConnected ()) {
907- session->SendRaw (serialized );
892+ session->SendBinary (messageType, data );
908893 }
909894 }
910895 }
911896 }
912897}
913898
899+ void GameLogic::BroadcastEntitySpawn (uint64_t entityId, EntityType type, const glm::vec3& position,
900+ float yaw, const std::string& name) {
901+ BinaryProtocol::BinaryWriter writer;
902+ writer.WriteUInt64 (entityId);
903+ writer.WriteUInt8 (static_cast <uint8_t >(type));
904+ writer.WriteString (name);
905+ writer.WriteVector3 (position);
906+ writer.WriteFloat (yaw);
907+ writer.WriteUInt64 (GetCurrentTimestamp ());
908+ BroadcastToNearbyPlayers (position, BinaryProtocol::MESSAGE_TYPE_ENTITY_SPAWN, writer.GetBuffer (), 100 .0f );
909+ }
910+
914911void GameLogic::SyncNearbyEntitiesToPlayer (uint64_t sessionId, const glm::vec3& position) {
915912 // Send a batch of entity data (positions, types, etc.) to the player
916913 auto nearbyEntities = EntityManager::GetInstance ().GetEntitiesInRadius (position, 100 .0f );
0 commit comments