diff options
author | Foghrye4 <foghrye4@gmail.com> | 2016-10-09 20:40:29 +0300 |
---|---|---|
committer | Ner'zhul <nerzhul@users.noreply.github.com> | 2016-10-19 08:40:43 +0200 |
commit | 91250c1078dc5dc5f48bba2b309920edd6cdfe68 (patch) | |
tree | 38faa3bffe7816dac077ef2917f4ce1b73562972 | |
parent | 0d740c5d829bceda8500fc505f4a65b967a1c151 (diff) | |
download | minetest-91250c1078dc5dc5f48bba2b309920edd6cdfe68.tar.gz minetest-91250c1078dc5dc5f48bba2b309920edd6cdfe68.tar.bz2 minetest-91250c1078dc5dc5f48bba2b309920edd6cdfe68.zip |
Fix crash on attaching player to entity
Rename "refresh" to "processInitData"
-rw-r--r-- | src/content_cao.cpp | 43 | ||||
-rw-r--r-- | src/content_cao.h | 2 |
2 files changed, 23 insertions, 22 deletions
diff --git a/src/content_cao.cpp b/src/content_cao.cpp index a8e03d670..88ed43a8c 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -613,13 +613,28 @@ bool GenericCAO::collideWithObjects() void GenericCAO::initialize(const std::string &data) { infostream<<"GenericCAO: Got init data"<<std::endl; + processInitData(data); + + if (m_is_player) { + // Check if it's the current player + LocalPlayer *player = m_env->getLocalPlayer(); + if (player && strcmp(player->getName(), m_name.c_str()) == 0) { + m_is_local_player = true; + m_is_visible = false; + player->setCAO(this); + } + m_env->addPlayerName(m_name.c_str()); + } +} + +void GenericCAO::processInitData(const std::string &data) +{ std::istringstream is(data, std::ios::binary); int num_messages = 0; // version u8 version = readU8(is); // check version - if(version == 1) // In PROTOCOL_VERSION 14 - { + if (version == 1) { // In PROTOCOL_VERSION 14 m_name = deSerializeString(is); m_is_player = readU8(is); m_id = readS16(is); @@ -627,42 +642,26 @@ void GenericCAO::initialize(const std::string &data) m_yaw = readF1000(is); m_hp = readS16(is); num_messages = readU8(is); - } - else if(version == 0) // In PROTOCOL_VERSION 13 - { + } else if (version == 0) { // In PROTOCOL_VERSION 13 m_name = deSerializeString(is); m_is_player = readU8(is); m_position = readV3F1000(is); m_yaw = readF1000(is); m_hp = readS16(is); num_messages = readU8(is); - } - else - { + } else { errorstream<<"GenericCAO: Unsupported init data version" <<std::endl; return; } - for(int i=0; i<num_messages; i++) - { + for (int i = 0; i < num_messages; i++) { std::string message = deSerializeLongString(is); processMessage(message); } pos_translator.init(m_position); updateNodePos(); - - if (m_is_player) { - // Check if it's the current player - LocalPlayer *player = m_env->getLocalPlayer(); - if (player && strcmp(player->getName(), m_name.c_str()) == 0) { - m_is_local_player = true; - m_is_visible = false; - player->setCAO(this); - } - m_env->addPlayerName(m_name.c_str()); - } } GenericCAO::~GenericCAO() @@ -1761,7 +1760,7 @@ void GenericCAO::processMessage(const std::string &data) u8 type = readU8(is); if (GenericCAO *childobj = m_env->getGenericCAO(child_id)) { - childobj->initialize(deSerializeLongString(is)); + childobj->processInitData(deSerializeLongString(is)); } else { m_env->addActiveObject(child_id, type, deSerializeLongString(is)); } diff --git a/src/content_cao.h b/src/content_cao.h index cf14a1e18..5b3471814 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -125,6 +125,8 @@ public: void initialize(const std::string &data); + void processInitData(const std::string &data); + ClientActiveObject *getParent(); bool getCollisionBox(aabb3f *toset); |