void CNpc::NpcInOut(BYTE Type, float fx, float fz, float fy) { int send_index = 0; char buff[1024]; memset( buff, 0x00, 1024 ); C3DMap *pMap = m_pMain->GetZoneByID(getZoneID()); if (pMap == NULL) return; m_pMap = pMap; if( Type == NPC_OUT ) { pMap->RegionNpcRemove( m_sRegion_X, m_sRegion_Z, m_sNid ); } else { pMap->RegionNpcAdd( m_sRegion_X, m_sRegion_Z, m_sNid ); m_fCurX = fx; m_fCurZ = fz; m_fCurY = fy; } SetByte( buff, WIZ_NPC_INOUT, send_index ); SetByte( buff, Type, send_index ); SetShort( buff, m_sNid, send_index ); if( Type == NPC_OUT ) { m_pMain->Send_Region(buff, send_index, GetMap(), m_sRegion_X, m_sRegion_Z); return; } GetNpcInfo(buff, send_index); m_pMain->Send_Region(buff, send_index, GetMap(), m_sRegion_X, m_sRegion_Z); }
void CAISocket::RecvNpcDead(Packet & pkt) { uint16 nid = pkt.read<uint16>(); CNpc* pNpc = g_pMain->m_arNpcArray.GetData(nid); if (pNpc == NULL) return; C3DMap* pMap = pNpc->GetMap(); if (pMap == NULL) return; if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT *pEvent = pMap->GetObjectEvent(pNpc->m_sSid); if (pEvent) pEvent->byLife = 0; } pMap->RegionNpcRemove(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, nid); Packet result(WIZ_DEAD); result << nid; g_pMain->Send_Region(&result, pNpc->GetMap(), pNpc->m_sRegion_X, pNpc->m_sRegion_Z); pNpc->m_sRegion_X = pNpc->m_sRegion_Z = 0; }
void CNpc::RegisterRegion() { int iRegX = 0, iRegZ = 0, old_region_x = 0, old_region_z = 0; iRegX = (int)(m_fCurX / VIEW_DISTANCE); iRegZ = (int)(m_fCurZ / VIEW_DISTANCE); if (m_sRegion_X != iRegX || m_sRegion_Z != iRegZ) { C3DMap* pMap = GetMap(); if (pMap == NULL) return; old_region_x = m_sRegion_X; old_region_z = m_sRegion_Z; pMap->RegionNpcRemove(m_sRegion_X, m_sRegion_Z, m_sNid); m_sRegion_X = iRegX; m_sRegion_Z = iRegZ; pMap->RegionNpcAdd(m_sRegion_X, m_sRegion_Z, m_sNid); RemoveRegion( old_region_x - m_sRegion_X, old_region_z - m_sRegion_Z ); // delete npc 는 계산 방향이 진행방향의 반대... InsertRegion( m_sRegion_X - old_region_x, m_sRegion_Z - old_region_z ); // add npc 는 계산 방향이 진행방향... } }
void CAISocket::RecvNpcDead(char* pBuf) { int index = 0, send_index = 0; int nid = 0; char send_buff[256]; _OBJECT_EVENT* pEvent = NULL; nid = GetShort(pBuf,index); if(nid >= NPC_BAND) { CNpc* pNpc = m_pMain->m_arNpcArray.GetData(nid); if(!pNpc) return; C3DMap* pMap = pNpc->GetMap(); if (pMap == NULL) return; if( pNpc->m_byObjectType == SPECIAL_OBJECT ) { pEvent = pMap->GetObjectEvent( pNpc->m_sSid ); if( pEvent ) pEvent->byLife = 0; } //pNpc->NpcInOut( NPC_OUT ); //TRACE("RecvNpcDead - (%d,%s)\n", pNpc->m_sNid, pNpc->m_strName); pMap->RegionNpcRemove(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, nid); //TRACE("--- RecvNpcDead : Npc를 Region에서 삭제처리.. ,, zone=%d, region_x=%d, y=%d\n", pNpc->m_sZoneIndex, pNpc->m_sRegion_X, pNpc->m_sRegion_Z); SetByte( send_buff, WIZ_DEAD, send_index ); SetShort( send_buff, nid, send_index ); m_pMain->Send_Region(send_buff, send_index, pNpc->GetMap(), pNpc->m_sRegion_X, pNpc->m_sRegion_Z, NULL, false); pNpc->m_sRegion_X = 0; pNpc->m_sRegion_Z = 0; } }