aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsavilli <78875209+savilli@users.noreply.github.com>2021-02-26 23:21:20 +0300
committersfan5 <sfan5@live.de>2021-04-09 22:05:22 +0200
commitae1d82c3256e25de97bf93b4fd87033bc9012159 (patch)
tree63617f2df6b9d4f8d332407081d4bf1d096b7bf8
parent1c89a07226d069817ffd8ad4034e00b8fc1b96d5 (diff)
downloadminetest-ae1d82c3256e25de97bf93b4fd87033bc9012159.tar.gz
minetest-ae1d82c3256e25de97bf93b4fd87033bc9012159.tar.bz2
minetest-ae1d82c3256e25de97bf93b4fd87033bc9012159.zip
Fix hud_change and hud_remove after hud_add (#10997)
-rw-r--r--src/client/client.h8
-rw-r--r--src/client/game.cpp30
-rw-r--r--src/network/clientpackethandler.cpp37
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<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 @@ private:
// 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;
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<u32, u32> 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;
+
+ 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;
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<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)