diff options
Diffstat (limited to 'src/client/clientenvironment.cpp')
-rw-r--r-- | src/client/clientenvironment.cpp | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index a788c93c2..5eb033302 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -47,8 +47,6 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, m_texturesource(texturesource), m_client(client) { - char zero = 0; - memset(attachement_parent_ids, zero, sizeof(attachement_parent_ids)); } ClientEnvironment::~ClientEnvironment() @@ -220,7 +218,7 @@ void ClientEnvironment::step(float dtime) f32 post_factor = 1; // 1 hp per node/s if (info.type == COLLISION_NODE) { const ContentFeatures &f = m_client->ndef()-> - get(m_map->getNodeNoEx(info.node_p)); + get(m_map->getNode(info.node_p)); // Determine fall damage multiplier int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); pre_factor = 1.0f + (float)addp / 100.0f; @@ -250,7 +248,7 @@ void ClientEnvironment::step(float dtime) MapNode node_at_lplayer(CONTENT_AIR, 0x0f, 0); v3s16 p = lplayer->getLightPosition(); - node_at_lplayer = m_map->getNodeNoEx(p); + node_at_lplayer = m_map->getNode(p); u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); final_color_blend(&lplayer->light_color, light, day_night_ratio); @@ -272,7 +270,7 @@ void ClientEnvironment::step(float dtime) // Get node at head v3s16 p = cao->getLightPosition(); - MapNode n = this->m_map->getNodeNoEx(p, &pos_ok); + MapNode n = this->m_map->getNode(p, &pos_ok); if (pos_ok) light = n.getLightBlend(day_night_ratio, m_client->ndef()); else @@ -287,15 +285,14 @@ void ClientEnvironment::step(float dtime) /* Step and handle simple objects */ - g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size()); + g_profiler->avg("ClientEnv: CSO count [#]", m_simple_objects.size()); for (auto i = m_simple_objects.begin(); i != m_simple_objects.end();) { - auto cur = i; - ClientSimpleObject *simple = *cur; + ClientSimpleObject *simple = *i; simple->step(dtime); if(simple->m_to_be_removed) { delete simple; - i = m_simple_objects.erase(cur); + i = m_simple_objects.erase(i); } else { ++i; @@ -353,7 +350,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) // Get node at head v3s16 p = object->getLightPosition(); - MapNode n = m_map->getNodeNoEx(p, &pos_ok); + MapNode n = m_map->getNode(p, &pos_ok); if (pos_ok) light = n.getLightBlend(getDayNightRatio(), m_client->ndef()); else @@ -392,7 +389,34 @@ void ClientEnvironment::addActiveObject(u16 id, u8 type, <<std::endl; } - addActiveObject(obj); + u16 new_id = addActiveObject(obj); + // Object initialized: + if ((obj = getActiveObject(new_id))) { + // Final step is to update all children which are already known + // Data provided by GENERIC_CMD_SPAWN_INFANT + const auto &children = obj->getAttachmentChildIds(); + for (auto c_id : children) { + if (auto *o = getActiveObject(c_id)) + o->updateAttachments(); + } + } +} + + +void ClientEnvironment::removeActiveObject(u16 id) +{ + // Get current attachment childs to detach them visually + std::unordered_set<int> attachment_childs; + if (auto *obj = getActiveObject(id)) + attachment_childs = obj->getAttachmentChildIds(); + + m_ao_manager.removeObject(id); + + // Perform a proper detach in Irrlicht + for (auto c_id : attachment_childs) { + if (ClientActiveObject *child = getActiveObject(c_id)) + child->updateAttachments(); + } } void ClientEnvironment::processActiveObjectMessage(u16 id, const std::string &data) |