void CResource::Load ( CClientEntity *pRootEntity ) { m_pRootEntity = pRootEntity; if ( m_pRootEntity ) { // Set the GUI parent to the resource root entity m_pResourceCOLRoot->SetParent ( m_pResourceEntity ); m_pResourceDFFEntity->SetParent ( m_pResourceEntity ); m_pResourceGUIEntity->SetParent ( m_pResourceEntity ); m_pResourceTXDRoot->SetParent ( m_pResourceEntity ); } CLogger::LogPrintf ( "> Starting resource '%s'", m_szResourceName ); char szBuffer [ MAX_PATH ] = { 0 }; list < CResourceConfigItem* >::iterator iterc = m_ConfigFiles.begin (); for ( ; iterc != m_ConfigFiles.end (); iterc++ ) { if ( !(*iterc)->Start() ) { CLogger::LogPrintf ( "Failed to start resource item %s in %s\n", (*iterc)->GetName(), m_szResourceName ); } } // Load the files that are queued in the list "to be loaded" list < CResourceFile* > ::iterator iter = m_ResourceFiles.begin (); for ( ; iter != m_ResourceFiles.end (); iter++ ) { CResourceFile* pResourceFile = *iter; // Only load the resource file if it is a client script if ( pResourceFile->GetResourceType () == CDownloadableResource::RESOURCE_FILE_TYPE_CLIENT_SCRIPT ) { // Load the file std::vector < char > buffer; FileLoad ( pResourceFile->GetName (), buffer ); // Check the contents if ( buffer.size () > 0 && CChecksum::GenerateChecksumFromBuffer ( &buffer.at ( 0 ), buffer.size () ).CompareWithLegacy ( pResourceFile->GetServerChecksum () ) ) { // Load the resource text m_pLuaVM->LoadScriptFromBuffer ( &buffer.at ( 0 ), buffer.size (), pResourceFile->GetName () ); } else { SString strBuffer ( "ERROR: File '%s' in resource '%s' - CRC mismatch.", pResourceFile->GetShortName (), m_szResourceName ); g_pCore->ChatEchoColor ( strBuffer, 255, 0, 0 ); } } else if ( CheckFileForCorruption ( pResourceFile->GetName () ) ) { SString strBuffer ( "WARNING: File '%s' in resource '%s' is invalid.", pResourceFile->GetShortName (), m_szResourceName ); g_pCore->DebugEchoColor ( strBuffer, 255, 0, 0 ); } } // Set active flag m_bActive = true; // Did we get a resource root entity? if ( m_pResourceEntity ) { // Call the Lua "onClientResourceStart" event CLuaArguments Arguments; Arguments.PushUserData ( this ); m_pResourceEntity->CallEvent ( "onClientResourceStart", Arguments, true ); } else assert ( 0 ); }
/////////////////////////////////////////////////////////////// // // CResourceChecker::CheckResourceForIssues // // Check each file and do the appropriate action // /////////////////////////////////////////////////////////////// void CResourceChecker::CheckResourceForIssues( CResource* pResource, const string& strResourceZip ) { m_strMinClientReqFromMetaXml = pResource->GetMinClientReqFromMetaXml(); m_strMinServerReqFromMetaXml = pResource->GetMinServerReqFromMetaXml(); m_strReqClientVersion = ""; m_strReqServerVersion = ""; m_strReqClientReason = ""; m_strReqServerReason = ""; m_ulDeprecatedWarningCount = 0; m_upgradedFullPathList.clear (); // Check each file in the resource list < CResourceFile* > ::iterator iterf = pResource->IterBegin (); for ( ; iterf != pResource->IterEnd (); iterf++ ) { CResourceFile* pResourceFile = *iterf; // Skip this one if validate=false in the meta.xml if ( stricmp( pResourceFile->GetMetaFileAttribute ( "validate" ).c_str (), "false" ) ) { string strPath; if ( pResource->GetFilePath ( pResourceFile->GetName(), strPath ) ) { CResourceFile::eResourceType type = pResourceFile->GetType (); bool bScript; bool bClient; if ( type == CResourceFile::RESOURCE_FILE_TYPE_SCRIPT ) { bScript = true; bClient = false; } else if ( type == CResourceFile::RESOURCE_FILE_TYPE_CLIENT_SCRIPT ) { bScript = true; bClient = true; } else if ( type == CResourceFile::RESOURCE_FILE_TYPE_CLIENT_FILE ) { bScript = false; bClient = true; } else continue; CheckFileForIssues ( strPath, pResourceFile->GetName(), pResource->GetName (), bScript, bClient, false ); } } } // Also check meta.xml { SString strFilename = "meta.xml"; string strPath; if ( pResource->GetFilePath ( strFilename, strPath ) ) { CheckFileForIssues ( strPath, strFilename, pResource->GetName (), false, false, true ); } } // Output deprecated warning if required if ( m_ulDeprecatedWarningCount ) { CLogger::LogPrintf ( "Some files in '%s' use deprecated functions.\n", pResource->GetName ().c_str () ); CLogger::LogPrintf ( "Use the 'upgrade' command to perform a basic upgrade of resources.\n" ); } // Handle upgrading a zip file if required if ( m_upgradedFullPathList.size () ) { if ( pResource->IsResourceZip () ) { string strOrigZip = strResourceZip; string strTempZip = strResourceZip.substr ( 0, strResourceZip.length () - 4 ) + "_tmp.zip"; string strCacheDir = pResource->GetResourceCacheDirectoryPath (); vector < string > pathInArchiveList; for ( unsigned long i = 0 ; i < m_upgradedFullPathList.size () ; i++ ) { string strFullPath = m_upgradedFullPathList[i]; string strPathInArchive = strFullPath.substr ( strCacheDir.length () ); pathInArchiveList.push_back ( strPathInArchive ); } File::Delete( strTempZip.c_str () ); if ( !ReplaceFilesInZIP( strOrigZip, strTempZip, pathInArchiveList, m_upgradedFullPathList ) ) { CLogger::LogPrintf ( "Failed to upgrade (ReplaceFilesInZIP) '%s'\n", strOrigZip.c_str () ); } else { if ( !RenameBackupFile( strOrigZip, ".old" ) ) { CLogger::LogPrintf ( "Failed to upgrade (RenameBackupFile) '%s'\n", strOrigZip.c_str () ); } else { if ( File::Rename( strTempZip.c_str (), strOrigZip.c_str () ) ) { CLogger::LogPrintf ( "Failed to upgrade (rename) '%s'\n", strOrigZip.c_str () ); } } } File::Delete( strTempZip.c_str () ); } } // Check LC_COLLATE is correct if ( strcoll( "a", "B" ) < 0 ) { CLogger::LogPrintf ( "ERROR: LC_COLLATE is not set correctly\n" ); } }