aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFoghrye4 <foghrye4@gmail.com>2016-10-09 20:40:29 +0300
committerNer'zhul <nerzhul@users.noreply.github.com>2016-10-19 08:40:43 +0200
commit91250c1078dc5dc5f48bba2b309920edd6cdfe68 (patch)
tree38faa3bffe7816dac077ef2917f4ce1b73562972 /src
parent0d740c5d829bceda8500fc505f4a65b967a1c151 (diff)
downloadminetest-91250c1078dc5dc5f48bba2b309920edd6cdfe68.tar.gz
minetest-91250c1078dc5dc5f48bba2b309920edd6cdfe68.tar.bz2
minetest-91250c1078dc5dc5f48bba2b309920edd6cdfe68.zip
Fix crash on attaching player to entity
Rename "refresh" to "processInitData"
Diffstat (limited to 'src')
-rw-r--r--src/content_cao.cpp43
-rw-r--r--src/content_cao.h2
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);