void Spawn::cleanup() { for (SpawnedMap::iterator it = spawnedMap.begin(); it != spawnedMap.end();) { uint32_t spawnId = it->first; Monster* monster = it->second; if (monster->isRemoved()) { if (spawnId != 0) { spawnMap[spawnId].lastSpawn = OTSYS_TIME(); } monster->releaseThing2(); spawnedMap.erase(it++); } else if (!isInSpawnZone(monster->getPosition()) && spawnId != 0) { spawnedMap.insert(spawned_pair(0, monster)); spawnedMap.erase(it++); } else { ++it; } } }
void Spawn::cleanup() { auto it = spawnedMap.begin(); while (it != spawnedMap.end()) { uint32_t spawnId = it->first; Monster* monster = it->second; if (monster->isRemoved()) { if (spawnId != 0) { spawnMap[spawnId].lastSpawn = OTSYS_TIME(); } monster->decrementReferenceCounter(); it = spawnedMap.erase(it); } else if (!isInSpawnZone(monster->getPosition()) && spawnId != 0) { spawnedMap.insert(spawned_pair(0, monster)); it = spawnedMap.erase(it); } else { ++it; } } }
void Spawn::checkSpawn() { #ifdef __DEBUG_SPAWN__ std::cout << "[Notice] Spawn::checkSpawn " << this << std::endl; #endif checkSpawnEvent = 0; Monster* monster; uint32_t spawnId; for(SpawnedMap::iterator it = spawnedMap.begin(); it != spawnedMap.end();) { spawnId = it->first; monster = it->second; if(monster->isRemoved()) { if(spawnId != 0) spawnMap[spawnId].lastSpawn = OTSYS_TIME(); monster->releaseThing2(); spawnedMap.erase(it++); } else if(!isInSpawnZone(monster->getPosition()) && spawnId != 0) { spawnedMap.insert(SpawnedPair(0, monster)); spawnedMap.erase(it++); } else ++it; } uint32_t spawnCount = 0; for(SpawnMap::iterator it = spawnMap.begin(); it != spawnMap.end(); ++it) { spawnId = it->first; spawnBlock_t& sb = it->second; if(spawnedMap.count(spawnId) == 0) { if(OTSYS_TIME() >= sb.lastSpawn + sb.interval) { if(findPlayer(sb.pos)) { sb.lastSpawn = OTSYS_TIME(); continue; } spawnMonster(spawnId, sb.mType, sb.pos, sb.direction); ++spawnCount; if(spawnCount >= (uint32_t)g_config.getNumber(ConfigManager::RATE_SPAWN)) break; } } } if(spawnedMap.size() < spawnMap.size()) checkSpawnEvent = Scheduler::getScheduler().addEvent(createSchedulerTask(getInterval(), boost::bind(&Spawn::checkSpawn, this))); #ifdef __DEBUG_SPAWN__ else std::cout << "[Notice] Spawn::checkSpawn stopped " << this << std::endl; #endif }