void CZone::SpawnMOBs(CCharEntity* PChar) { for (EntityList_t::const_iterator it = m_mobList.begin() ; it != m_mobList.end() ; ++it) { CMobEntity* PCurrentMob = (CMobEntity*)it->second; SpawnIDList_t::iterator MOB = PChar->SpawnMOBList.lower_bound(PCurrentMob->id); float CurrentDistance = distance(PChar->loc.p, PCurrentMob->loc.p); if (PCurrentMob->status == STATUS_UPDATE && CurrentDistance < 50) { if( MOB == PChar->SpawnMOBList.end() || PChar->SpawnMOBList.key_comp()(PCurrentMob->id, MOB->first)) { PChar->SpawnMOBList.insert(MOB, SpawnIDList_t::value_type(PCurrentMob->id, PCurrentMob)); PChar->pushPacket(new CEntityUpdatePacket(PCurrentMob, ENTITY_SPAWN)); } if (PChar->isDead() || PChar->nameflags.flags & FLAG_GM || PCurrentMob->PMaster != NULL) continue; // проверка ночного/дневного сна монстров уже учтена в проверке CurrentAction, т.к. во сне монстры не ходят ^^ uint16 expGain = (uint16)charutils::GetRealExp(PChar->GetMLevel(),PCurrentMob->GetMLevel()); CAIMobDummy* PAIMob = (CAIMobDummy*)PCurrentMob->PBattleAI; bool validAggro = expGain > 50 || PChar->animation == ANIMATION_HEALING || PCurrentMob->getMobMod(MOBMOD_ALWAYS_AGGRO); if(validAggro && PAIMob->CanAggroTarget(PChar)) { PCurrentMob->PEnmityContainer->AddBaseEnmity(PChar); } } else { if( MOB != PChar->SpawnMOBList.end() && !(PChar->SpawnMOBList.key_comp()(PCurrentMob->id, MOB->first))) { PChar->SpawnMOBList.erase(MOB); PChar->pushPacket(new CEntityUpdatePacket(PCurrentMob,ENTITY_DESPAWN)); } } } }
void CZoneEntities::SpawnMOBs(CCharEntity* PChar) { for (EntityList_t::const_iterator it = m_mobList.begin(); it != m_mobList.end(); ++it) { CMobEntity* PCurrentMob = (CMobEntity*)it->second; SpawnIDList_t::iterator MOB = PChar->SpawnMOBList.lower_bound(PCurrentMob->id); float CurrentDistance = distance(PChar->loc.p, PCurrentMob->loc.p); if (PCurrentMob->status != STATUS_DISAPPEAR && CurrentDistance < 50) { if (MOB == PChar->SpawnMOBList.end() || PChar->SpawnMOBList.key_comp()(PCurrentMob->id, MOB->first)) { PChar->SpawnMOBList.insert(MOB, SpawnIDList_t::value_type(PCurrentMob->id, PCurrentMob)); PChar->pushPacket(new CEntityUpdatePacket(PCurrentMob, ENTITY_SPAWN, UPDATE_ALL_MOB)); } if (PChar->isDead() || PChar->nameflags.flags & FLAG_GM || PCurrentMob->PMaster != nullptr) continue; // проверка ночного/дневного сна монстров уже учтена в проверке CurrentAction, т.к. во сне монстры не ходят ^^ uint16 expGain = (uint16)charutils::GetRealExp(PChar->GetMLevel(), PCurrentMob->GetMLevel()); CMobController* PController = static_cast<CMobController*>(PCurrentMob->PAI->GetController()); bool validAggro = expGain > 50 || PChar->isSitting() || PCurrentMob->getMobMod(MOBMOD_ALWAYS_AGGRO); if (validAggro && PController->CanAggroTarget(PChar)) { PCurrentMob->PEnmityContainer->AddBaseEnmity(PChar); } } else { if (MOB != PChar->SpawnMOBList.end() && !(PChar->SpawnMOBList.key_comp()(PCurrentMob->id, MOB->first))) { PChar->SpawnMOBList.erase(MOB); PChar->pushPacket(new CEntityUpdatePacket(PCurrentMob, ENTITY_DESPAWN, UPDATE_NONE)); } } } }