void Spawn::checkSpawn()
{
checkSpawnEvent = 0;
cleanup();
uint32_t spawnCount = 0;
uint32_t playerCount = g_game.getPlayersOnline(); // Get number of online players
// Dynamic scaling factors
uint32_t baseSpawnRate = g_config.getNumber(ConfigManager::RATE_SPAWN);; // Minimum spawn rate from config
uint32_t maxSpawnRate = 3; // Maximum spawn rate
uint32_t maxPlayers = 100; // Number of players needed for max spawn rate (adjustable)
uint32_t dynamicSpawnLimit = baseSpawnRate + ((playerCount * (maxSpawnRate - baseSpawnRate)) / maxPlayers);
dynamicSpawnLimit = std::max(baseSpawnRate, std::min(dynamicSpawnLimit, maxSpawnRate));
for (auto& it : spawnMap) {
uint32_t spawnId = it.first;
if (spawnedMap.find(spawnId) != spawnedMap.end()) {
continue;
}
spawnBlock_t& sb = it.second;
if (OTSYS_TIME() >= sb.lastSpawn + sb.interval) {
if (!spawnMonster(spawnId, sb)) {
sb.lastSpawn = OTSYS_TIME();
continue;
}
if (++spawnCount >= dynamicSpawnLimit) {
break;
}
}
}
if (spawnedMap.size() < spawnMap.size()) {
checkSpawnEvent = g_scheduler.addEvent(createSchedulerTask(getInterval(), std::bind(&Spawn::checkSpawn, this)));
}
std::cout << "[DynamicSpawn] Online Players: " << playerCount
<< ", Adjusted Spawn Rate: " << dynamicSpawnLimit
<< " (Max: " << maxSpawnRate << ")" << std::endl;
}