void Monster::diePermCrt() { std::map<int, crlasttime>::iterator it; crlasttime* crtm=0; Monster *temp_mob=0; UniqueRoom *room=0; char perm[80]; long t = time(0); int i=0; strcpy(perm,getCName()); if(!inUniqueRoom()) return; room = getUniqueRoomParent(); for(it = room->permMonsters.begin(); it != room->permMonsters.end() ; it++) { crtm = &(*it).second; if(!crtm->cr.id) continue; if(crtm->ltime + crtm->interval > t) continue; if(!loadMonster(crtm->cr, &temp_mob)) continue; if(temp_mob->getName() == getName()) { crtm->ltime = t; free_crt(temp_mob); break; } free_crt(temp_mob); } if(flagIsSet(M_DEATH_SCENE) && !flagIsSet(M_FOLLOW_ATTACKER)) { int fd,n; char tmp[2048], file[80],pName[80]; strcpy(pName, getCName()); for(i=0; pName[i]; i++) if(pName[i] == ' ') pName[i] = '_'; sprintf(file,"%s/%s_%d", Path::Desc, pName, level); fd = open(file,O_RDONLY,0); if(fd) { n = read(fd,tmp,2048); tmp[n] = 0; broadcast(nullptr, getRoomParent(), "\n%s", tmp); } close(fd); } }
bool Monsters::loadFromXml(bool reloading /*= false*/) { loaded = false; xmlDocPtr doc = xmlParseFile(getFilePath(FILE_TYPE_OTHER, "monster/monsters.xml").c_str()); if(!doc) { std::clog << "[Warning - Monsters::loadFromXml] Cannot load monsters file." << std::endl; std::clog << getLastXMLError() << std::endl; return false; } xmlNodePtr root = xmlDocGetRootElement(doc); if(xmlStrcmp(root->name,(const xmlChar*)"monsters")) { std::clog << "[Error - Monsters::loadFromXml] Malformed monsters file." << std::endl; xmlFreeDoc(doc); return false; } for(xmlNodePtr p = root->children; p; p = p->next) { if(p->type != XML_ELEMENT_NODE) continue; if(xmlStrcmp(p->name, (const xmlChar*)"monster")) { std::clog << "[Warning - Monsters::loadFromXml] Unknown node name (" << p->name << ")." << std::endl; continue; } std::string file, name; if(!readXMLString(p, "file", file) || !readXMLString(p, "name", name)) continue; file = getFilePath(FILE_TYPE_OTHER, "monster/" + file); loadMonster(file, name, reloading); } xmlFreeDoc(doc); loaded = true; return loaded; }
bool Monsters::loadFromXml(bool reloading /*= false*/) { pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("data/monster/monsters.xml"); if (!result) { printXMLError("Error - Monsters::loadFromXml", "data/monster/monsters.xml", result); return false; } loaded = true; std::list<std::pair<MonsterType*, std::string>> monsterScriptList; for (auto monsterNode : doc.child("monsters").children()) { loadMonster("data/monster/" + std::string(monsterNode.attribute("file").as_string()), monsterNode.attribute("name").as_string(), monsterScriptList, reloading); } if (!monsterScriptList.empty()) { if (!scriptInterface) { scriptInterface.reset(new LuaScriptInterface("Monster Interface")); scriptInterface->initState(); } for (const auto& scriptEntry : monsterScriptList) { MonsterType* mType = scriptEntry.first; if (scriptInterface->loadFile("data/monster/scripts/" + scriptEntry.second) == 0) { mType->scriptInterface = scriptInterface.get(); mType->creatureAppearEvent = scriptInterface->getEvent("onCreatureAppear"); mType->creatureDisappearEvent = scriptInterface->getEvent("onCreatureDisappear"); mType->creatureMoveEvent = scriptInterface->getEvent("onCreatureMove"); mType->creatureSayEvent = scriptInterface->getEvent("onCreatureSay"); mType->thinkEvent = scriptInterface->getEvent("onThink"); } else { std::cout << "[Warning - Monsters::loadMonster] Can not load script: " << scriptEntry.second << std::endl; std::cout << scriptInterface->getLastLuaError() << std::endl; } } } return true; }
bool Monsters::loadFromXml(bool reloading /*= false*/) { pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("data/monster/monsters.xml"); if (!result) { std::cout << "[Error - Monsters::loadFromXml] Failed to load data/monster/monsters.xml: " << result.description() << std::endl; return false; } loaded = true; for (pugi::xml_node monsterNode = doc.child("monsters").first_child(); monsterNode; monsterNode = monsterNode.next_sibling()) { loadMonster("data/monster/" + std::string(monsterNode.attribute("file").as_string()), monsterNode.attribute("name").as_string(), reloading); } if (!monsterScriptList.empty()) { if (!scriptInterface) { scriptInterface = new LuaScriptInterface("Monster Interface"); scriptInterface->initState(); } for (const auto& scriptEntry : monsterScriptList) { MonsterType* mType = scriptEntry.first; if (scriptInterface->loadFile("data/monster/scripts/" + scriptEntry.second) == 0) { mType->scriptInterface = scriptInterface; mType->creatureAppearEvent = scriptInterface->getEvent("onCreatureAppear"); mType->creatureDisappearEvent = scriptInterface->getEvent("onCreatureDisappear"); mType->creatureMoveEvent = scriptInterface->getEvent("onCreatureMove"); mType->creatureSayEvent = scriptInterface->getEvent("onCreatureSay"); mType->thinkEvent = scriptInterface->getEvent("onThink"); } else { std::cout << "[Warning - Monsters::loadMonster] Can not load script: " << scriptEntry.second << std::endl; std::cout << scriptInterface->getLastLuaError() << std::endl; } } } return true; }