bool Spawn::spawnMonster(uint32_t spawnId, MonsterType* mType, const Position& pos, Direction dir, bool startup /*= false*/) { int32_t nHealth = mType->health,nMaxHealth = mType->healthMax, nExp = mType->experience, nDef = mType->defense, nArm = mType->armor; int32_t monsterLevel = random_range(mType->minLevel, mType->maxLevel); if (monsterLevel != 0) { monsterLevel = monsterLevel; } else { monsterLevel = random_range(5,15); } mType->health = (uint64_t)std::ceil(mType->health * monsterLevel / 8); mType->healthMax = (uint64_t)std::ceil(mType->healthMax * monsterLevel / 8); mType->experience = (uint64_t)std::ceil(mType->experience * monsterLevel / 8); mType->defense = (uint64_t)std::ceil(mType->defense * monsterLevel / 8); mType->armor = (uint64_t)std::ceil(mType->armor * monsterLevel / 8); Monster* monster = Monster::createMonster(mType); monster->doMonsterSetCombatValues(monsterLevel); monster->doMonsterSetLevel(monsterLevel); mType->health = nHealth; mType->healthMax = nMaxHealth; mType->experience = nExp; mType->defense = nDef; mType->armor = nArm; if(!monster) return false; if(startup) { //No need to send out events to the surrounding since there is no one out there to listen! if(!g_game.internalPlaceCreature(monster, pos, false, true)) { delete monster; return false; } } else if(!g_game.placeCreature(monster, pos, false, true)) { delete monster; return false; } monster->setSpawn(this); monster->setMasterPosition(pos, radius); monster->setDirection(dir); monster->addRef(); spawnedMap.insert(SpawnedPair(spawnId, monster)); spawnMap[spawnId].lastSpawn = OTSYS_TIME(); return true; }