aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred-001 <red-001@outlook.ie>2018-01-26 15:05:47 +0000
committerLoïc Blot <nerzhul@users.noreply.github.com>2018-01-26 16:05:47 +0100
commit4f688d5616268f0d077b7e925933f54920120da4 (patch)
tree43a80603fb03623f1a51fcce42b7904203cad113
parent3a5959ae6b268087709dd64b8e723c42defd5463 (diff)
downloadminetest-4f688d5616268f0d077b7e925933f54920120da4.tar.gz
minetest-4f688d5616268f0d077b7e925933f54920120da4.tar.bz2
minetest-4f688d5616268f0d077b7e925933f54920120da4.zip
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.
-rw-r--r--src/client.h5
-rw-r--r--src/client/clientevent.h2
-rw-r--r--src/game.cpp17
-rw-r--r--src/network/clientpackethandler.cpp6
4 files changed, 15 insertions, 15 deletions
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<u32, u32> &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<u32, u32>::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);