void operator () (LPENTITY ent) { // 오브젝트가 아닌 것은 거리를 계산하여 거리가 멀면 추가하지 않는다. if (!ent->IsType(ENTITY_OBJECT)) if (DISTANCE_APPROX(ent->GetX() - m_me->GetX(), ent->GetY() - m_me->GetY()) > dwViewRange) return; // 나를 대상에 추가 m_me->ViewInsert(ent); // 둘다 캐릭터면 if (ent->IsType(ENTITY_CHARACTER) && m_me->IsType(ENTITY_CHARACTER)) { LPCHARACTER chMe = (LPCHARACTER) m_me; LPCHARACTER chEnt = (LPCHARACTER) ent; // 대상이 NPC면 StateMachine을 킨다. if (chMe->IsPC() && !chEnt->IsPC() && !chEnt->IsWarp() && !chEnt->IsGoto()) chEnt->StartStateMachine(); } }
bool SECTREE::InsertEntity(LPENTITY pkEnt) { LPSECTREE pkCurTree; if ((pkCurTree = pkEnt->GetSectree()) == this) return false; if (m_set_entity.find(pkEnt) != m_set_entity.end()) { sys_err("entity %p already exist in this sectree!", get_pointer(pkEnt)); return false; } if (pkCurTree) pkCurTree->m_set_entity.erase(pkEnt); pkEnt->SetSectree(this); //pkEnt->UpdateSectree(); m_set_entity.insert(pkEnt); if (pkEnt->IsType(ENTITY_CHARACTER)) { LPCHARACTER pkChr = (LPCHARACTER) pkEnt; if (pkChr->IsPC()) { IncreasePC(); if (pkCurTree) pkCurTree->DecreasePC(); } else if (m_iPCCount > 0 && !pkChr->IsWarp() && !pkChr->IsGoto()) // PC가 아니고 이 곳에 PC가 있다면 Idle event를 시작 시킨다. { pkChr->StartStateMachine(); } } return true; }