From 91250c1078dc5dc5f48bba2b309920edd6cdfe68 Mon Sep 17 00:00:00 2001
From: Foghrye4 <foghrye4@gmail.com>
Date: Sun, 9 Oct 2016 20:40:29 +0300
Subject: [PATCH] Fix crash on attaching player to entity

Rename "refresh" to "processInitData"
---
 src/content_cao.cpp | 43 +++++++++++++++++++++----------------------
 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 @@ class GenericCAO : public ClientActiveObject
 
 	void initialize(const std::string &data);
 
+	void processInitData(const std::string &data);
+
 	ClientActiveObject *getParent();
 
 	bool getCollisionBox(aabb3f *toset);
-- 
GitLab