void CAISocket::InitEventMonster(int index) { int count = index; if( count < 0 || count > NPC_BAND ) { TRACE("### InitEventMonster index Fail = %d ###\n", index); return; } int max_eventmop = count+EVENT_MONSTER; for( int i=count; i<max_eventmop; i++ ) { CNpc* pNpc = NULL; pNpc = new CNpc; if(pNpc == NULL) return; pNpc->Initialize(); pNpc->m_sNid = i+NPC_BAND; //TRACE("InitEventMonster : uid = %d\n", pNpc->m_sNid); if( !g_pMain->m_arNpcArray.PutData( pNpc->GetID(), pNpc) ) { TRACE("Npc PutData Fail - %d\n", pNpc->GetID()); delete pNpc; pNpc = NULL; } } count = g_pMain->m_arNpcArray.GetSize(); TRACE("TotalMonster = %d\n", count); }
CNpc* CNpc::Create(LPDIRECT3DDEVICE9 pGraphicDev) { CNpc* pGameObject = new CNpc(pGraphicDev); if (FAILED(pGameObject->Initialize())) { MSG_BOX("CMonster Create Faild"); ::Safe_Release(pGameObject); } return pGameObject; }
void CAISocket::RecvNpcInfoAll(Packet & pkt) { uint8 bCount = pkt.read<uint8>(); // max of 20 pkt.SByte(); for (int i = 0; i < bCount; i++) { uint8 bDirection; std::string strName; CNpc* pNpc = new CNpc(); pNpc->Initialize(); pkt >> pNpc->m_NpcState >> pNpc->m_sNid >> pNpc->m_sSid >> pNpc->m_sPid >> pNpc->m_sSize >> pNpc->m_iWeapon_1 >> pNpc->m_iWeapon_2 >> pNpc->m_bZone >> strName >> pNpc->m_bNation >> pNpc->m_bLevel >> pNpc->m_curx >> pNpc->m_curz >> pNpc->m_cury >> bDirection >> pNpc->m_tNpcType >> pNpc->m_iSellingGroup >> pNpc->m_iMaxHP >> pNpc->m_iHP >> pNpc->m_byGateOpen >> pNpc->m_fTotalHitrate >> pNpc->m_fTotalEvasionrate >> pNpc->m_sTotalAc >> pNpc->m_sTotalHit >> pNpc->m_byObjectType >> pNpc->m_byTrapNumber >> pNpc->m_bMonster >> pNpc->m_sFireR >> pNpc->m_sColdR >> pNpc->m_sLightningR >> pNpc->m_sMagicR >> pNpc->m_sDiseaseR >> pNpc->m_sPoisonR; if (strName.empty()) strName = "<the spawn with no name>"; if (strName.length() > MAX_NPC_SIZE) { pNpc->DecRef(); continue; } pNpc->m_pMap = g_pMain->GetZoneByID(pNpc->GetZoneID()); if (pNpc->GetMap() == nullptr) { pNpc->DecRef(); continue; } //TRACE("Recv --> NpcUserInfo : uid = %d, x=%f, z=%f.. \n", nid, fPosX, fPosZ); pNpc->m_strName = strName; pNpc->m_byDirection = bDirection; pNpc->SetRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT* pEvent = pNpc->GetMap()->GetObjectEvent(pNpc->m_sSid); if (pEvent != nullptr) 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->GetID(), pNpc)) { TRACE("Npc PutData Fail - %d\n", pNpc->GetID()); pNpc->DecRef(); continue; } if (pNpc->m_NpcState == NPC_DEAD) { TRACE("Recv --> NpcUserInfoAll : nid=%d, sid=%d, name=%s\n", pNpc->GetID(), pNpc->m_sSid, strName.c_str()); continue; } pNpc->SendInOut(INOUT_IN, pNpc->GetX(), pNpc->GetZ(), pNpc->GetY()); } }
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_bZoneID >> 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_sTotalHitrate >> pNpc->m_sTotalEvasionrate >> pNpc->m_sTotalAc >> 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->SetRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); 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->GetID(), pNpc)) { TRACE("Npc PutData Fail - %d\n", pNpc->GetID()); delete pNpc; continue; } if (bType == 0) { TRACE("Recv --> NpcUserInfoAll : nid=%d, sid=%d, name=%s\n", pNpc->GetID(), pNpc->m_sSid, strName.c_str()); continue; } // RegionNpcAdd() pNpc->SendInOut(INOUT_IN, pNpc->GetX(), pNpc->GetZ(), pNpc->GetY()); } }
// ai server에 처음 접속시 npc의 모든 정보를 받아온다.. void CAISocket::RecvNpcInfoAll(char* pBuf) { int index = 0; BYTE byCount = 0; // 마리수 BYTE byType; // 0:처음에 등장하지 않는 몬스터, 1:등장 short nid; // NPC index short sid; // NPC index BYTE bZone; // Current zone number short sPid; // NPC Picture Number short sSize = 100; // NPC Size int iweapon_1; int iweapon_2; 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 tNpcType; // 00 : Monster // 01 : NPC int iSellingGroup; int nMaxHP; // 최대 HP int nHP; // 현재 HP BYTE byGateOpen; // 성문일경우 열림과 닫힘 정보 short sHitRate; BYTE byObjectType; // 보통 : 0, 특수 : 1 byCount = GetByte(pBuf, index); for(int i=0; i<byCount; i++) { byType = 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); byGroup = GetByte(pBuf, index); byLevel = GetByte(pBuf, index); fPosX = Getfloat(pBuf, index); fPosZ = Getfloat(pBuf, index); fPosY = Getfloat(pBuf, index); byDirection = GetByte(pBuf, index); tNpcType = 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); //TRACE("RecvNpcInfoAll : nid=%d, szName=%s, count=%d\n", nid, szName, byCount); if(nLength < 0 || nLength > MAX_NPC_SIZE) { TRACE("#### RecvNpcInfoAll Fail : szName=%s\n", szName); continue; // 잘못된 monster 아이디 } //TRACE("Recv --> NpcUserInfo : uid = %d, x=%f, z=%f.. \n", nid, fPosX, fPosZ); CNpc* pNpc = NULL; pNpc = new CNpc; if(pNpc == NULL) { TRACE("#### Recv --> NpcUserInfoAll POINT Fail: uid=%d, sid=%d, name=%s, zone=%d, x=%f, z=%f.. \n", nid, sPid, szName, bZone, fPosX, fPosZ); continue; } pNpc->Initialize(); 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 = NPC_LIVE; pNpc->m_tNpcType = tNpcType; pNpc->m_iSellingGroup = iSellingGroup; pNpc->m_iMaxHP = nMaxHP; pNpc->m_iHP = nHP; pNpc->m_byGateOpen = byGateOpen; pNpc->m_sHitRate = sHitRate; pNpc->m_byObjectType = byObjectType; pNpc->m_NpcState = NPC_LIVE; int nRegX = (int)fPosX / VIEW_DISTANCE; int nRegZ = (int)fPosZ / VIEW_DISTANCE; pNpc->m_sRegion_X = nRegX; pNpc->m_sRegion_Z = nRegZ; if (pNpc->GetMap() == NULL) { delete pNpc; pNpc = NULL; continue; } _OBJECT_EVENT* pEvent = NULL; if (pNpc->m_byObjectType == SPECIAL_OBJECT) { pEvent = pNpc->GetMap()->GetObjectEvent(pNpc->m_sSid); if( pEvent ) 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( !m_pMain->m_arNpcArray.PutData( pNpc->m_sNid, pNpc) ) { TRACE("Npc PutData Fail - %d\n", pNpc->m_sNid); delete pNpc; pNpc = NULL; continue; } if( byType == 0 ) { TRACE("Recv --> NpcUserInfoAll : 등록하면 안돼여,, uid=%d, sid=%d, name=%s\n", nid, sPid, szName); continue; // region에 등록하지 말기... } pNpc->GetMap()->RegionNpcAdd(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, pNpc->m_sNid); } }