From: red-001 Date: Fri, 26 Jan 2018 15:05:47 +0000 (+0000) Subject: Fix issues with earlier CSM HUD commit (#6940) X-Git-Tag: 5.0.0~608 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4f688d5;p=oweals%2Fminetest.git Fix issues with earlier CSM HUD commit (#6940) The CSM HUD PR caused some strange behavior including aborts due to parts of it using some slightly hacky code, the event refactor changing how events are processed and a minor oversight. --- diff --git a/src/client.h b/src/client.h index f438416aa..00ae4c7c3 100644 --- a/src/client.h +++ b/src/client.h @@ -422,6 +422,11 @@ public: return m_csm_noderange_limit; } + inline std::unordered_map &getHUDTranslationMap() + { + return m_hud_server_to_client; + } + bool joinModChannel(const std::string &channel); bool leaveModChannel(const std::string &channel); bool sendModChannelMessage(const std::string &channel, const std::string &message); diff --git a/src/client/clientevent.h b/src/client/clientevent.h index e70937a9e..f0f1dc9e0 100644 --- a/src/client/clientevent.h +++ b/src/client/clientevent.h @@ -116,7 +116,7 @@ struct ClientEvent } delete_particlespawner; struct { - u32 id; + u32 server_id; u8 type; v2f *pos; std::string *name; diff --git a/src/game.cpp b/src/game.cpp index 55b2f5204..b8d86be47 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2562,12 +2562,12 @@ 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 id = event->hudadd.id; - - HudElement *e = player->getHud(id); - - if (e != NULL) { + 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()) { delete event->hudadd.pos; delete event->hudadd.name; delete event->hudadd.scale; @@ -2579,7 +2579,7 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam) return; } - e = new HudElement; + HudElement *e = new HudElement; e->type = (HudElementType)event->hudadd.type; e->pos = *event->hudadd.pos; e->name = *event->hudadd.name; @@ -2592,10 +2592,7 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam) e->offset = *event->hudadd.offset; e->world_pos = *event->hudadd.world_pos; e->size = *event->hudadd.size; - - u32 new_id = player->addHud(e); - //if this isn't true our huds aren't consistent - sanity_check(new_id == id); + hud_server_to_client[server_id] = player->addHud(e); delete event->hudadd.pos; delete event->hudadd.name; diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index db3655875..aa4d8c244 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -1062,12 +1062,10 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt) try { *pkt >> size; } catch(SerializationError &e) {}; - u32 client_id = getEnv().getLocalPlayer()->getFreeHudID(); - m_hud_server_to_client[server_id] = client_id; ClientEvent *event = new ClientEvent(); event->type = CE_HUDADD; - event->hudadd.id = client_id; + event->hudadd.server_id = server_id; event->hudadd.type = type; event->hudadd.pos = new v2f(pos); event->hudadd.name = new std::string(name); @@ -1089,7 +1087,7 @@ void Client::handleCommand_HudRemove(NetworkPacket* pkt) *pkt >> server_id; - std::unordered_map::const_iterator i = m_hud_server_to_client.find(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);