// Can't use bitStream.Version() here as it is sometimes not set bool CLuaArgument::ReadFromBitStream(NetBitStreamInterface& bitStream, std::vector<CLuaArguments*>* pKnownTables) { DeleteTableData(); SLuaTypeSync type; // Read out the type if (bitStream.Read(&type)) { // Depending on what type... switch (type.data.ucType) { // Nil type case LUA_TNIL: { m_iType = LUA_TNIL; break; } // Boolean type case LUA_TBOOLEAN: { bool bValue; if (bitStream.ReadBit(bValue)) ReadBool(bValue); break; } // Number type case LUA_TNUMBER: { if (bitStream.ReadBit()) { if (bitStream.ReadBit()) { double dNum; if (bitStream.Read(dNum)) ReadNumber(dNum); } else { float fNum; if (bitStream.Read(fNum)) ReadNumber(RoundFromFloatSource(fNum)); } } else { int iNum; if (bitStream.ReadCompressed(iNum)) ReadNumber(iNum); } break; } // Table type case LUA_TTABLE: { m_pTableData = new CLuaArguments(bitStream, pKnownTables); m_bWeakTableRef = false; m_iType = LUA_TTABLE; m_pTableData->ValidateTableKeys(); break; } // Table reference case LUA_TTABLEREF: { unsigned long ulTableRef; if (bitStream.ReadCompressed(ulTableRef)) { if (pKnownTables && ulTableRef < pKnownTables->size()) { m_pTableData = pKnownTables->at(ulTableRef); m_bWeakTableRef = true; m_iType = LUA_TTABLE; } } break; } // String type case LUA_TSTRING: { // Read out the string length unsigned short usLength; if (bitStream.ReadCompressed(usLength) && usLength) { // Allocate a buffer and read the string into it char* szValue = new char[usLength + 1]; if (bitStream.Read(szValue, usLength)) { // Put it into us ReadString(std::string(szValue, usLength)); } // Delete the buffer delete[] szValue; } else ReadString(""); break; } // Long string type case LUA_TSTRING_LONG: { // Read out the string length uint uiLength; if (bitStream.ReadCompressed(uiLength) && uiLength) { bitStream.AlignReadToByteBoundary(); // Allocate a buffer and read the string into it char* szValue = new char[uiLength + 1]; assert(szValue); if (bitStream.Read(szValue, uiLength)) { // Put it into us ReadString(std::string(szValue, uiLength)); } // Delete the buffer delete[] szValue; } else ReadString(""); break; } // Element type? case LUA_TLIGHTUSERDATA: case LUA_TUSERDATA: { ElementID ElementID; if (bitStream.Read(ElementID)) { ReadElementID(ElementID); } break; } } } return true; }
bool CLuaArgument::ReadFromBitStream ( NetBitStreamInterface& bitStream, std::vector < CLuaArguments* > * pKnownTables ) { DeleteTableData (); SLuaTypeSync type; // Read out the type if ( bitStream.Read ( &type ) ) { // Depending on what type... switch ( type.data.ucType ) { // Nil type case LUA_TNIL: { m_iType = LUA_TNIL; break; } // Boolean type case LUA_TBOOLEAN: { bool bValue; if ( bitStream.ReadBit ( bValue ) ) ReadBool ( bValue ); break; } // Number type case LUA_TNUMBER: { bool bIsFloatingPoint; if ( bitStream.ReadBit ( bIsFloatingPoint ) && bIsFloatingPoint ) { float fNum; if ( bitStream.Read ( fNum ) ) ReadNumber ( fNum ); } else { long lNum; if ( bitStream.ReadCompressed ( lNum ) ) ReadNumber ( lNum ); } break; } // Table type case LUA_TTABLE: { m_pTableData = new CLuaArguments ( bitStream, pKnownTables ); m_bWeakTableRef = false; m_iType = LUA_TTABLE; m_pTableData->ValidateTableKeys (); break; } // Table reference case LUA_TTABLEREF: { unsigned long ulTableRef; if ( bitStream.ReadCompressed ( ulTableRef ) ) { if ( pKnownTables && ulTableRef < pKnownTables->size () ) { m_pTableData = pKnownTables->at ( ulTableRef ); m_bWeakTableRef = true; m_iType = LUA_TTABLE; } } break; } // String type case LUA_TSTRING: { // Read out the string length unsigned short usLength; if ( bitStream.ReadCompressed ( usLength ) && usLength ) { // Allocate a buffer and read the string into it char* szValue = new char [ usLength + 1 ]; if ( bitStream.Read ( szValue, usLength ) ) { // Put it into us ReadString ( std::string ( szValue, usLength ) ); } // Delete the buffer delete [] szValue; } else ReadString ( "" ); break; } // Long string type case LUA_TSTRING_LONG: { // Read out the string length uint uiLength; if ( bitStream.ReadCompressed ( uiLength ) && uiLength ) { bitStream.AlignReadToByteBoundary (); // Allocate a buffer and read the string into it char* szValue = new char [ uiLength + 1 ]; assert ( szValue ); if ( bitStream.Read ( szValue, uiLength ) ) { // Put it into us ReadString ( std::string ( szValue, uiLength ) ); } // Delete the buffer delete [] szValue; } else ReadString ( "" ); // Enforce min_mta_version version rule if ( uiLength > 65535 && g_pGame->CalculateMinClientRequirement () < LONG_STRING_MIN_VERSION ) { LogUnableToPacketize ( "#### Couldn't packetize argument list. Invalid string specified, limit is 65535 characters." " To use longer strings, set script <min_mta_version> to " LONG_STRING_MIN_VERSION " or higher." ); m_iType = LUA_TNIL; } break; } // Element type? case LUA_TLIGHTUSERDATA: { ElementID ElementID; if ( bitStream.Read ( ElementID ) ) { CElement * element = CElementIDs::GetElement ( ElementID ); ReadElement ( element ); } break; } } } return true; }