void CAISocket::RecvNpcInOut(Packet & pkt) { uint8 bType; uint16 sNid; float fX, fZ, fY; pkt >> bType >> sNid >> fX >> fZ >> fY; CNpc * pNpc = g_pMain->m_arNpcArray.GetData(sNid); if (pNpc) pNpc->NpcInOut(bType, fX, fZ, fY); }
void CAISocket::RecvNpcInOut(char* pBuf) { int index = 0, nid = 0, nType = 0; float fx = 0.0f, fz=0.0f, fy=0.0f; nType = GetByte( pBuf, index ); nid = GetShort(pBuf, index); fx = Getfloat( pBuf, index ); fz = Getfloat( pBuf, index ); fy = Getfloat( pBuf, index ); if(nid >= NPC_BAND) { CNpc* pNpc = m_pMain->m_arNpcArray.GetData(nid); if(!pNpc) return; pNpc->NpcInOut( nType, fx, fz, fy ); } }
void CAISocket::RecvNpcInfo(Packet & pkt) { std::string strName; uint8 Mode, byDirection; uint16 sNid; pkt.SByte(); pkt >> Mode >> sNid; CNpc *pNpc = g_pMain->m_arNpcArray.GetData(sNid); if (pNpc == NULL) return; pkt >> pNpc->m_sSid >> pNpc->m_sPid >> pNpc->m_sSize >> pNpc->m_iWeapon_1 >> pNpc->m_iWeapon_2 >> pNpc->m_bCurZone >> strName >> pNpc->m_byGroup >> pNpc->m_byLevel >> pNpc->m_fCurX >> pNpc->m_fCurZ >> pNpc->m_fCurY >> byDirection >> pNpc->m_NpcState >> pNpc->m_tNpcType >> pNpc->m_iSellingGroup >> pNpc->m_iMaxHP >> pNpc->m_iHP >> pNpc->m_byGateOpen >> pNpc->m_sHitRate >> pNpc->m_byObjectType; if (strName.empty() || strName.length() > MAX_NPC_SIZE) { delete pNpc; return; } pNpc->m_byDirection = byDirection; strcpy(pNpc->m_strName, strName.c_str()); // Bug? Test? // pNpc->m_NpcState = NPC_DEAD; if (pNpc->m_NpcState == NPC_LIVE) { char strLog[256]; CTime t = CTime::GetCurrentTime(); sprintf_s(strLog, sizeof(strLog), "## time(%d:%d-%d) npc regen check(%d) : nid=%d, name=%s, x=%d, z=%d, rx=%d, rz=%d ## \r\n", t.GetHour(), t.GetMinute(), t.GetSecond(), pNpc->m_NpcState, pNpc->m_sNid, pNpc->m_strName, (int)pNpc->m_fCurX, (int)pNpc->m_fCurZ, pNpc->m_sRegion_X, pNpc->m_sRegion_Z); EnterCriticalSection( &g_LogFile_critical ); g_pMain->m_RegionLogFile.Write( strLog, strlen(strLog) ); LeaveCriticalSection( &g_LogFile_critical ); TRACE(strLog); // to-do: replace with g_pMain->WriteRegionLog(...); } if (pNpc->GetMap() == NULL) return; pNpc->m_sRegion_X = (int)pNpc->m_fCurX / VIEW_DISTANCE; pNpc->m_sRegion_Z = (int)pNpc->m_fCurZ / VIEW_DISTANCE; if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT *pEvent = pNpc->GetMap()->GetObjectEvent( pNpc->m_sSid ); if (pEvent != NULL) pEvent->byLife = 1; } if (Mode == 0) { TRACE("RecvNpcInfo - dead monster nid=%d, name=%s\n", pNpc->m_sNid, pNpc->m_strName); return; } pNpc->NpcInOut(NPC_IN, pNpc->m_fCurX, pNpc->m_fCurZ, pNpc->m_fCurY); }
void CAISocket::RecvNpcInfoAll(Packet & pkt) { uint8 bCount = pkt.read<uint8>(); // max of 20 pkt.SByte(); for (int i = 0; i < bCount; i++) { uint8 bType, bDirection; std::string strName; CNpc* pNpc = new CNpc(); pNpc->Initialize(); pkt >> bType >> pNpc->m_sNid >> pNpc->m_sSid >> pNpc->m_sPid >> pNpc->m_sSize >> pNpc->m_iWeapon_1 >> pNpc->m_iWeapon_2 >> pNpc->m_bCurZone >> strName >> pNpc->m_byGroup >> pNpc->m_byLevel >> pNpc->m_fCurX >> pNpc->m_fCurZ >> pNpc->m_fCurY >> bDirection >> pNpc->m_tNpcType >> pNpc->m_iSellingGroup >> pNpc->m_iMaxHP >> pNpc->m_iHP >> pNpc->m_byGateOpen >> pNpc->m_sHitRate >> pNpc->m_byObjectType; if (strName.empty() || strName.length() > MAX_NPC_SIZE) { delete pNpc; continue; } //TRACE("Recv --> NpcUserInfo : uid = %d, x=%f, z=%f.. \n", nid, fPosX, fPosZ); strcpy(pNpc->m_strName, strName.c_str()); pNpc->m_pMap = g_pMain->GetZoneByID(pNpc->getZoneID()); pNpc->m_NpcState = NPC_LIVE; pNpc->m_byDirection = bDirection; pNpc->m_sRegion_X = (int)pNpc->m_fCurX / VIEW_DISTANCE; pNpc->m_sRegion_Z = (int)pNpc->m_fCurZ / VIEW_DISTANCE; if (pNpc->GetMap() == NULL) { delete pNpc; pNpc = NULL; continue; } if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT* pEvent = pNpc->GetMap()->GetObjectEvent(pNpc->m_sSid); if (pEvent != NULL) pEvent->byLife = 1; } // TRACE("Recv --> NpcUserInfoAll : uid=%d, sid=%d, name=%s, x=%f, z=%f. gate=%d, objecttype=%d \n", nid, sPid, szName, fPosX, fPosZ, byGateOpen, byObjectType); if (!g_pMain->m_arNpcArray.PutData(pNpc->m_sNid, pNpc)) { TRACE("Npc PutData Fail - %d\n", pNpc->m_sNid); delete pNpc; continue; } if (bType == 0) { TRACE("Recv --> NpcUserInfoAll : nid=%d, sid=%d, name=%s\n", pNpc->m_sNid, pNpc->m_sSid, strName.c_str()); continue; } pNpc->GetMap()->RegionNpcAdd(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, pNpc->m_sNid); pNpc->NpcInOut(NPC_IN, pNpc->m_fCurX, pNpc->m_fCurZ,pNpc->m_fCurY); } }
void CAISocket::RecvNpcInfo(char* pBuf) { int index = 0; BYTE Mode; // 01(INFO_MODIFY) : NPC 정보 변경 // 02(INFO_DELETE) : NPC 정보 삭제 short nid; // NPC index short sid; // NPC index short sPid; // NPC Picture Number short sSize = 100; // NPC Size int iWeapon_1; // 오른손 무기 int iWeapon_2; // 왼손 무기 BYTE bZone; // Current zone number char szName[MAX_NPC_SIZE+1]; // NPC Name BYTE byGroup; // 소속 집단 BYTE byLevel; // level float fPosX; // X Position float fPosZ; // Z Position float fPosY; // Y Position BYTE byDirection; // 방향 BYTE tState; // NPC 상태 // 00 : NPC Dead // 01 : NPC Live BYTE tNpcKind; // 00 : Monster // 01 : NPC int iSellingGroup; int nMaxHP; // 최대 HP int nHP; // 현재 HP BYTE byGateOpen; short sHitRate; // 공격 성공률 BYTE byObjectType; // 보통 : 0, 특수 : 1 Mode = GetByte(pBuf, index); nid = GetShort(pBuf, index); sid = GetShort(pBuf, index); sPid = GetShort(pBuf, index); sSize = GetShort(pBuf, index); iWeapon_1 = GetDWORD(pBuf, index); iWeapon_2 = GetDWORD(pBuf, index); bZone = GetByte(pBuf, index); int nLength = GetVarString(szName, pBuf, sizeof(BYTE), index); if(nLength < 0 || nLength > MAX_NPC_SIZE) return; // 잘못된 monster 아이디 byGroup = GetByte(pBuf, index); byLevel = GetByte(pBuf, index); fPosX = Getfloat(pBuf, index); fPosZ = Getfloat(pBuf, index); fPosY = Getfloat(pBuf, index); byDirection = GetByte(pBuf, index); tState = GetByte(pBuf, index); tNpcKind = GetByte(pBuf, index); iSellingGroup = GetDWORD(pBuf, index); nMaxHP = GetDWORD(pBuf, index); nHP = GetDWORD(pBuf, index); byGateOpen = GetByte(pBuf, index); sHitRate = GetShort(pBuf, index); byObjectType = GetByte(pBuf, index); CNpc* pNpc = NULL; pNpc = m_pMain->m_arNpcArray.GetData(nid); if(!pNpc) return; pNpc->m_NpcState = NPC_DEAD; if( pNpc->m_NpcState == NPC_LIVE ) { // 살아 있는데 또 정보를 받는 경우 char strLog[256]; CTime t = CTime::GetCurrentTime(); sprintf_s(strLog, sizeof(strLog), "## time(%d:%d-%d) npc regen check(%d) : nid=%d, name=%s, x=%d, z=%d, rx=%d, rz=%d ## \r\n", t.GetHour(), t.GetMinute(), t.GetSecond(), pNpc->m_NpcState, nid, szName, (int)pNpc->m_fCurX, (int)pNpc->m_fCurZ, pNpc->m_sRegion_X, pNpc->m_sRegion_Z); EnterCriticalSection( &g_LogFile_critical ); m_pMain->m_RegionLogFile.Write( strLog, strlen(strLog) ); LeaveCriticalSection( &g_LogFile_critical ); TRACE(strLog); // to-do: replace with m_pMain->WriteRegionLog(...); } pNpc->m_NpcState = NPC_LIVE; pNpc->m_sNid = nid; pNpc->m_sSid = sid; pNpc->m_sPid = sPid; pNpc->m_sSize = sSize; pNpc->m_iWeapon_1 = iWeapon_1; pNpc->m_iWeapon_2 = iWeapon_2; strcpy(pNpc->m_strName, szName); pNpc->m_byGroup = byGroup; pNpc->m_byLevel = byLevel; pNpc->m_bCurZone = bZone; pNpc->m_pMap = m_pMain->GetZoneByID(bZone); pNpc->m_fCurX = fPosX; pNpc->m_fCurZ = fPosZ; pNpc->m_fCurY = fPosY; pNpc->m_byDirection = byDirection; pNpc->m_NpcState = tState; pNpc->m_tNpcType = tNpcKind; pNpc->m_iSellingGroup = iSellingGroup; pNpc->m_iMaxHP = nMaxHP; pNpc->m_iHP = nHP; pNpc->m_byGateOpen = byGateOpen; pNpc->m_sHitRate = sHitRate; pNpc->m_byObjectType = byObjectType; if (pNpc->GetMap() == NULL) return; int nRegX = (int)fPosX / VIEW_DISTANCE; int nRegZ = (int)fPosZ / VIEW_DISTANCE; pNpc->m_sRegion_X = nRegX; pNpc->m_sRegion_Z = nRegZ; _OBJECT_EVENT* pEvent = NULL; if( pNpc->m_byObjectType == SPECIAL_OBJECT ) { pEvent = pNpc->GetMap()->GetObjectEvent( pNpc->m_sSid ); if( pEvent ) pEvent->byLife = 1; } if(Mode == 0) { TRACE("RecvNpcInfo - dead monster nid=%d, name=%s\n", pNpc->m_sNid, pNpc->m_strName); return; } pNpc->NpcInOut(NPC_IN, fPosX, fPosZ, fPosY); }