From f96a9b26c1301bb9c610eb7e865fd4151fba17ba Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sun, 9 Nov 2025 23:05:24 -0500 Subject: [PATCH] feat: implement sendAvatarQuery to request all avatars from Avatar Mixer --- src/OverteClient.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/OverteClient.cpp b/src/OverteClient.cpp index ab77c10..1ec5c85 100644 --- a/src/OverteClient.cpp +++ b/src/OverteClient.cpp @@ -1788,6 +1788,36 @@ void OverteClient::sendAvatarData() { } } +void OverteClient::sendAvatarQuery() { + if (!m_avatarMixerConnected) return; + + // Create AvatarQuery packet - tells Avatar Mixer which avatars we want to receive + // Based on Overte's Application::queryAvatars() in interface/src/Application.cpp + PacketVersion version = NLPacket::versionForPacketType(PacketType::AvatarQuery); + NLPacket packet(PacketType::AvatarQuery, version, true); + packet.setSequenceNumber(m_sequenceNumber++); + + // Include our local ID (sourced packet) + if (m_localID != 0) { + packet.setSourceID(m_localID); + } + + // AvatarQuery payload: number of frustums (uint8) + frustum data + // For simplicity, send numFrustums=0 which means "send all avatars in the domain" + uint8_t numFrustums = 0; + packet.writeUInt8(numFrustums); + + const auto& data = packet.getData(); + ssize_t s = ::sendto(m_udpFd, data.data(), data.size(), 0, + reinterpret_cast(&m_avatarMixerAddr), m_avatarMixerAddrLen); + + if (s > 0) { + std::cout << "[OverteClient] Sent AvatarQuery (" << s << " bytes, numFrustums=0 = request all avatars)" << std::endl; + } else { + std::cerr << "[OverteClient] Failed to send AvatarQuery: " << strerror(errno) << std::endl; + } +} + void OverteClient::handleAvatarMixerPacket(const char* data, size_t len, uint8_t packetType) { std::cout << "[OverteClient] Processing Avatar Mixer packet type " << (int)packetType << " (" << len << " bytes)" << std::endl; @@ -1795,3 +1825,4 @@ void OverteClient::handleAvatarMixerPacket(const char* data, size_t len, uint8_t // The entity data should come through this connection! // TODO: Parse BulkAvatarData and look for entity updates within it } +