]> git.lizzy.rs Git - minetest.git/commitdiff
Fix hud_change and hud_remove after hud_add (#10997)
authorsavilli <78875209+savilli@users.noreply.github.com>
Fri, 26 Feb 2021 20:21:20 +0000 (23:21 +0300)
committerGitHub <noreply@github.com>
Fri, 26 Feb 2021 20:21:20 +0000 (21:21 +0100)
src/client/client.h
src/client/game.cpp
src/network/clientpackethandler.cpp

index 25a1b97ba1346b5f9cffa15642382e01a127f1d2..2dba1506ed1f45faec522b902f3367ce2ea42e25 100644 (file)
@@ -415,11 +415,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
                return m_csm_restriction_flags & flag;
        }
 
-       inline std::unordered_map<u32, u32> &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 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        // Relation of client id to object id
        std::unordered_map<int, u16> m_sounds_to_objects;
 
-       // Map server hud ids to client hud ids
-       std::unordered_map<u32, u32> m_hud_server_to_client;
-
        // Privileges
        std::unordered_set<std::string> m_privileges;
 
index d4e2fe7c3c4af4d0c6cf1978f7b7aa0f43835709..15fa2af23fa321250c50ef55615d960a6a0b8496 100644 (file)
@@ -856,6 +856,9 @@ class Game {
        Hud *hud = nullptr;
        Minimap *mapper = nullptr;
 
+       // Map server hud ids to client hud ids
+       std::unordered_map<u32, u32> m_hud_server_to_client;
+
        GameRunData runData;
        Flags m_flags;
 
@@ -2602,12 +2605,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;
@@ -2635,7 +2637,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;
@@ -2651,18 +2653,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;
+
+       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 == NULL) {
+       if (e == nullptr) {
                delete event->hudchange.v3fdata;
                delete event->hudchange.v2fdata;
                delete event->hudchange.sdata;
index 65db02300d82939796ec7c6a23a19ce4bd11dd33..44bd81dac7205c2610f229c3f7d4a58f0da54df3 100644 (file)
@@ -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<u32, u32>::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)