Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Fix crash on attaching player to entity
Rename "refresh" to "processInitData"
- Loading branch information
Showing
with
23 additions
and
22 deletions.
-
+21
−22
src/content_cao.cpp
-
+2
−0
src/content_cao.h
|
@@ -613,56 +613,55 @@ 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); |
|
|
m_position = readV3F1000(is); |
|
|
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)); |
|
|
} |
|
|
|
@@ -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); |
|
|