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_bZone >> strName >> pNpc->m_bNation >> pNpc->m_bLevel >> pNpc->m_curx >> pNpc->m_curz >> pNpc->m_cury >> byDirection >> pNpc->m_NpcState >> 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 >> pNpc->m_byTrapNumber; if (strName.empty() || strName.length() > MAX_NPC_SIZE) { pNpc->DecRef(); return; } pNpc->m_byDirection = byDirection; strcpy(pNpc->m_strName, strName.c_str()); if (pNpc->GetMap() == NULL) return; pNpc->InsertRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); pNpc->SetRegion(pNpc->GetNewRegionX(), pNpc->GetNewRegionZ()); 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->GetID(), pNpc->m_strName); return; } pNpc->SendInOut(INOUT_IN, pNpc->GetX(), pNpc->GetZ(), pNpc->GetY()); }
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 = new CNpc(); 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()); pNpc->DecRef(); } } count = g_pMain->m_arNpcArray.GetSize(); TRACE("TotalMonster = %d\n", count); }
void CAISocket::RecvNpcInfo(Packet & pkt) { std::string strName; uint8 Mode, byDirection; uint16 sNid; bool bCreated = false; pkt.SByte(); pkt >> Mode >> sNid; CNpc *pNpc = g_pMain->GetNpcPtr(sNid); if (pNpc == nullptr) { pNpc = new CNpc(); pNpc->m_sNid = sNid; bCreated = true; } pkt >> 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 >> byDirection >> 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.length() > MAX_NPC_SIZE) { pNpc->DecRef(); return; } pNpc->m_NpcState = Mode; pNpc->m_byDirection = byDirection; pNpc->m_strName = strName; pNpc->m_pMap = g_pMain->GetZoneByID(pNpc->GetZoneID()); if (pNpc->GetMap() == nullptr) { pNpc->DecRef(); return; } pNpc->RegisterRegion(); if (pNpc->m_byObjectType == SPECIAL_OBJECT) { _OBJECT_EVENT *pEvent = pNpc->GetMap()->GetObjectEvent( pNpc->m_sSid ); if (pEvent != nullptr) pEvent->byLife = 1; } if (bCreated) g_pMain->m_arNpcArray.PutData(pNpc->GetID(), pNpc); if (pNpc->m_NpcState == NPC_DEAD) { TRACE("RecvNpcInfo - dead monster nid=%d, name=%s\n", pNpc->GetID(), pNpc->GetName().c_str()); return; } 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 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()); } }