void CSoundAnimation::load() { CIFile file; // Open the file if (!file.open(_Filename.c_str())) { throw NLMISC::Exception("Can't open the file for reading"); } // Create the XML stream CIXml input; // Init if (input.init (file)) { xmlNodePtr animNode = input.getRootNode (); xmlNodePtr markerNode = input.getFirstChildNode(animNode, "MARKER"); while (markerNode != 0) { CSoundAnimMarker* marker = new CSoundAnimMarker(); const char *time = (const char*) xmlGetProp(markerNode, (xmlChar*) "time"); if (time == 0) { throw NLMISC::Exception("Invalid sound animation marker"); } marker->setTime((float) atof(time)); xmlFree ((void*)time); xmlNodePtr soundNode = input.getFirstChildNode(markerNode, "SOUND"); while (soundNode != 0) { char *name = (char*) xmlGetProp(soundNode, (xmlChar*) "name"); if (name == 0) { throw NLMISC::Exception("Invalid sound animation marker"); } marker->addSound(NLMISC::CSheetId(string(name), "sound")); xmlFree ((void*)name); soundNode = input.getNextChildNode(soundNode, "SOUND"); } addMarker(marker); markerNode = input.getNextChildNode(markerNode, "MARKER"); } } // Close the file file.close (); _Dirty = false; }
void CRingAccess::init() { if (_Initialised ) { return; } // no double initialisation _CustomNpcSheetId.clear(); //CSheetId::init() must be called first _CustomNpcSheetId.insert(CSheetId("basic_matis_male.creature")); _CustomNpcSheetId.insert(CSheetId("basic_fyros_male.creature")); _CustomNpcSheetId.insert(CSheetId("basic_tryker_male.creature")); _CustomNpcSheetId.insert(CSheetId("basic_zorai_male.creature")); _CustomNpcSheetId.insert(CSheetId("basic_matis_female.creature")); _CustomNpcSheetId.insert(CSheetId("basic_fyros_female.creature")); _CustomNpcSheetId.insert(CSheetId("basic_tryker_female.creature")); _CustomNpcSheetId.insert(CSheetId("basic_zorai_female.creature")); for (uint32 i = 0 ; i <= 184 ; ++i) { _R2PlotItemSheetId.insert( CSheetId( NLMISC::toString("r2_plot_item_%d.sitem", i))); } _SheetIdToAccess.clear();//only usefull when manualy re init file // File stream CIFile file; std::string pathFileName = CPath::lookup(RingAccessFilename, false, false, false); // Open the file if (pathFileName.empty() || !file.open(pathFileName.c_str())) { nlinfo("Can't open the file for reading : %s", RingAccessFilename.c_str()); return; } // Create the XML stream CIXml input; // Init if(input.init(file)) { xmlNodePtr entitiesAccess = input.getRootNode(); xmlNodePtr entityAccess = input.getFirstChildNode(entitiesAccess, "entityAccess"); while (entityAccess != 0) { // island name CXMLAutoPtr namePtr( (const char*) xmlGetProp(entityAccess, (xmlChar*) "name") ); CXMLAutoPtr packagePtr( (const char*) xmlGetProp(entityAccess, (xmlChar*) "package") ); CXMLAutoPtr sheetClientPtr( (const char*) xmlGetProp(entityAccess, (xmlChar*) "sheetClient") ); CXMLAutoPtr sheetPtr( (const char*) xmlGetProp(entityAccess, (xmlChar*) "sheetServer") ); if (!namePtr.getDatas()|| !packagePtr.getDatas() || !sheetPtr.getDatas() || !sheetPtr.getDatas()) { nlerror( "Syntax error in %s", pathFileName.c_str()); return; } std::string sheet( sheetPtr.getDatas() ); std::string package( packagePtr.getDatas() ); std::string sheetClient(sheetClientPtr.getDatas()); CSheetId sheetClientId(sheetClient); CSheetId sheetId; // no sheet server if (sheet.empty()) { bool ok = _SheetIdToAccess.insert( std::make_pair(std::make_pair(sheetClientId, sheetId), package)).second; if (!ok) { std::string previousPackage = _SheetIdToAccess[std::make_pair(sheetClientId, sheetId)]; // only display warning if one key has multiple package if ( previousPackage != package ) { nlwarning("%s: Entity %s sheet(%s) is defined more than once with different package definition. Previous definition is '%s', current definition is '%s'", RingAccessFilename.c_str(), namePtr.getDatas(), sheetClientPtr.getDatas(), previousPackage.c_str(), package.c_str()); } } } else { sheetId = CSheetId(sheet); if (_CustomNpcSheetId.find(sheetClientId) != _CustomNpcSheetId.end()) { bool ok = _SheetIdToAccess.insert( std::make_pair(std::make_pair(sheetClientId, sheetId), package)).second; if (!ok) { std::string previousPackage = _SheetIdToAccess[std::make_pair(sheetClientId, sheetId)]; // only display warning if one key has multiple package if ( previousPackage != package ) { nlwarning("%s: Entity %s sheet(%s) is defined more than once. Previous definition is '%s', current definition is '%s'", RingAccessFilename.c_str(), namePtr.getDatas(), sheetPtr.getDatas(), previousPackage.c_str(), package.c_str()); } } } else { nlwarning("%s: Entity %s has invalid sheets %s %s", RingAccessFilename.c_str(), namePtr.getDatas(), sheetClientPtr.getDatas(), sheetPtr.getDatas()); } } entityAccess = input.getNextChildNode(entityAccess, "entityAccess"); } } // Close the file file.close (); _Initialised = true; }