From ae1d82c3256e25de97bf93b4fd87033bc9012159 Mon Sep 17 00:00:00 2001 From: savilli <78875209+savilli@users.noreply.github.com> Date: Fri, 26 Feb 2021 23:21:20 +0300 Subject: [PATCH] Fix hud_change and hud_remove after hud_add (#10997) --- src/client/client.h | 8 ------- src/client/game.cpp | 30 ++++++++++++++++------- src/network/clientpackethandler.cpp | 37 +++++++++++------------------ 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/client/client.h b/src/client/client.h index 25a1b97ba..2dba1506e 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -415,11 +415,6 @@ public: return m_csm_restriction_flags & flag; } - inline std::unordered_map &getHUDTranslationMap() - { - return m_hud_server_to_client; - } - bool joinModChannel(const std::string &channel) override; bool leaveModChannel(const std::string &channel) override; bool sendModChannelMessage(const std::string &channel, @@ -556,9 +551,6 @@ private: // Relation of client id to object id std::unordered_map m_sounds_to_objects; - // Map server hud ids to client hud ids - std::unordered_map m_hud_server_to_client; - // Privileges std::unordered_set m_privileges; diff --git a/src/client/game.cpp b/src/client/game.cpp index fbdbc4f5f..a88972d53 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -859,6 +859,9 @@ private: Hud *hud = nullptr; Minimap *mapper = nullptr; + // Map server hud ids to client hud ids + std::unordered_map m_hud_server_to_client; + GameRunData runData; Flags m_flags; @@ -2605,12 +2608,11 @@ void Game::handleClientEvent_HandleParticleEvent(ClientEvent *event, void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); - auto &hud_server_to_client = client->getHUDTranslationMap(); u32 server_id = event->hudadd.server_id; // ignore if we already have a HUD with that ID - auto i = hud_server_to_client.find(server_id); - if (i != hud_server_to_client.end()) { + auto i = m_hud_server_to_client.find(server_id); + if (i != m_hud_server_to_client.end()) { delete event->hudadd.pos; delete event->hudadd.name; delete event->hudadd.scale; @@ -2638,7 +2640,7 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam) e->size = *event->hudadd.size; e->z_index = event->hudadd.z_index; e->text2 = *event->hudadd.text2; - hud_server_to_client[server_id] = player->addHud(e); + m_hud_server_to_client[server_id] = player->addHud(e); delete event->hudadd.pos; delete event->hudadd.name; @@ -2654,18 +2656,28 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam) void Game::handleClientEvent_HudRemove(ClientEvent *event, CameraOrientation *cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); - HudElement *e = player->removeHud(event->hudrm.id); - delete e; + + auto i = m_hud_server_to_client.find(event->hudrm.id); + if (i != m_hud_server_to_client.end()) { + HudElement *e = player->removeHud(i->second); + delete e; + m_hud_server_to_client.erase(i); + } + } void Game::handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); - u32 id = event->hudchange.id; - HudElement *e = player->getHud(id); + HudElement *e = nullptr; - if (e == NULL) { + auto i = m_hud_server_to_client.find(event->hudchange.id); + if (i != m_hud_server_to_client.end()) { + e = player->getHud(i->second); + } + + if (e == nullptr) { delete event->hudchange.v3fdata; delete event->hudchange.v2fdata; delete event->hudchange.sdata; diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 65db02300..44bd81dac 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -1095,16 +1095,10 @@ void Client::handleCommand_HudRemove(NetworkPacket* pkt) *pkt >> server_id; - auto i = m_hud_server_to_client.find(server_id); - if (i != m_hud_server_to_client.end()) { - int client_id = i->second; - m_hud_server_to_client.erase(i); - - ClientEvent *event = new ClientEvent(); - event->type = CE_HUDRM; - event->hudrm.id = client_id; - m_client_event_queue.push(event); - } + ClientEvent *event = new ClientEvent(); + event->type = CE_HUDRM; + event->hudrm.id = server_id; + m_client_event_queue.push(event); } void Client::handleCommand_HudChange(NetworkPacket* pkt) @@ -1131,19 +1125,16 @@ void Client::handleCommand_HudChange(NetworkPacket* pkt) else *pkt >> intdata; - std::unordered_map::const_iterator i = m_hud_server_to_client.find(server_id); - if (i != m_hud_server_to_client.end()) { - ClientEvent *event = new ClientEvent(); - event->type = CE_HUDCHANGE; - event->hudchange.id = i->second; - event->hudchange.stat = (HudElementStat)stat; - event->hudchange.v2fdata = new v2f(v2fdata); - event->hudchange.v3fdata = new v3f(v3fdata); - event->hudchange.sdata = new std::string(sdata); - event->hudchange.data = intdata; - event->hudchange.v2s32data = new v2s32(v2s32data); - m_client_event_queue.push(event); - } + ClientEvent *event = new ClientEvent(); + event->type = CE_HUDCHANGE; + event->hudchange.id = server_id; + event->hudchange.stat = (HudElementStat)stat; + event->hudchange.v2fdata = new v2f(v2fdata); + event->hudchange.v3fdata = new v3f(v3fdata); + event->hudchange.sdata = new std::string(sdata); + event->hudchange.data = intdata; + event->hudchange.v2s32data = new v2s32(v2s32data); + m_client_event_queue.push(event); } void Client::handleCommand_HudSetFlags(NetworkPacket* pkt)