void CAISocket::RecvNpcGiveItem(Packet & pkt) { Packet result(WIZ_ITEM_DROP); short sUid, sNid, regionx, regionz; float fX, fZ, fY; BYTE byCount, bZone; int nItemNumber[NPC_HAVE_ITEM_LIST]; short sCount[NPC_HAVE_ITEM_LIST]; CUser* pUser = NULL; pkt >> sUid >> sNid >> bZone >> regionx >> regionz >> fX >> fZ >> fY >> byCount; for (int i = 0; i < byCount; i++) pkt >> nItemNumber[i] >> sCount[i]; if (sUid < 0 || sUid >= MAX_USER) return; C3DMap *pMap = g_pMain->GetZoneByID(bZone); if (pMap == NULL) return; _ZONE_ITEM *pItem = new _ZONE_ITEM; for(int i=0; i<6; i++) { pItem->itemid[i] = 0; pItem->count[i] = 0; } pItem->time = TimeGet(); pItem->x = fX; pItem->z = fZ; pItem->y = fY; for(int i=0; i<byCount; i++) { if( g_pMain->GetItemPtr(nItemNumber[i]) ) { pItem->itemid[i] = nItemNumber[i]; pItem->count[i] = sCount[i]; } } if (!pMap->RegionItemAdd(regionx, regionz, pItem )) { delete pItem; return; } pUser = g_pMain->GetUserPtr(sUid); if (pUser == NULL) return; result << sNid << uint32(pItem->bundle_index); if (!pUser->isInParty()) pUser->Send(&result); else g_pMain->Send_PartyMember(pUser->m_sPartyIndex, &result); }
void CAISocket::RecvNpcGiveItem(Packet & pkt) { Packet result(WIZ_ITEM_DROP); short sUid, sNid, regionx, regionz; float fX, fZ, fY; uint8 byCount, bZone; int nItemNumber[NPC_HAVE_ITEM_LIST]; short sCount[NPC_HAVE_ITEM_LIST]; CUser* pUser = nullptr; pkt >> sUid >> sNid >> bZone >> regionx >> regionz >> fX >> fZ >> fY >> byCount; for (int i = 0; i < byCount; i++) pkt >> nItemNumber[i] >> sCount[i]; if (sUid < 0 || sUid >= MAX_USER) return; C3DMap *pMap = g_pMain->GetZoneByID(bZone); if (pMap == nullptr) return; _LOOT_BUNDLE * pBundle = new _LOOT_BUNDLE; pBundle->tDropTime = UNIXTIME; pBundle->x = fX; pBundle->z = fZ; pBundle->y = fY; for (int i = 0; i < byCount; i++) { if (g_pMain->GetItemPtr(nItemNumber[i])) { _LOOT_ITEM pItem(nItemNumber[i], sCount[i]); if (nItemNumber[i] == ITEM_GOLD) { // Add on any additional coins earned because of a global coin event. // NOTE: Officially it caps at SHRT_MAX, but that's really only for technical reasons. // Using the unsigned range gives us a little bit of wiggle room. uint32 coinAmount = sCount[i] * (100 + g_pMain->m_byCoinEventAmount) / 100; if (sCount[i] + coinAmount > USHRT_MAX) coinAmount = USHRT_MAX; pUser = g_pMain->GetUserPtr(sUid); if (pUser != nullptr) if (pUser->m_bPremiumType != 0) coinAmount = coinAmount * (100 + g_pMain->m_PremiumItemArray.GetData(pUser->m_bPremiumType)->NoahPercent) / 100; pItem.sCount = coinAmount; } pBundle->Items.push_back(pItem); // emplace_back() would be so much more useful here, but requires C++11. } } if (!pMap->RegionItemAdd(regionx, regionz, pBundle)) { delete pBundle; return; } if (pUser == nullptr) return; result << sNid << pBundle->nBundleID; if (!pUser->isInParty()) pUser->Send(&result); else g_pMain->Send_PartyMember(pUser->GetPartyID(), &result); }
void CAISocket::RecvNpcGiveItem(char* pBuf) { int index = 0, send_index = 0; char send_buff[1024]; short sUid, sNid, sZone, regionx, regionz; float fX, fZ, fY; BYTE byCount; int nItemNumber[NPC_HAVE_ITEM_LIST]; short sCount[NPC_HAVE_ITEM_LIST]; _ZONE_ITEM* pItem = NULL; C3DMap* pMap = NULL; CUser* pUser = NULL; sUid = GetShort(pBuf,index); // Item을 가져갈 사람의 아이디... (이것을 참조해서 작업하셈~) sNid = GetShort(pBuf,index); sZone = GetShort(pBuf, index); regionx = GetShort( pBuf, index ); regionz = GetShort( pBuf, index ); fX = Getfloat(pBuf,index); fZ = Getfloat(pBuf,index); fY = Getfloat(pBuf,index); byCount = GetByte(pBuf,index); for(int i=0; i<byCount; i++) { nItemNumber[i] = GetDWORD(pBuf, index); sCount[i] = GetShort(pBuf,index); } if( sUid < 0 || sUid >= MAX_USER ) return; pMap = m_pMain->GetZoneByID(sZone); if (pMap == NULL) return; pItem = new _ZONE_ITEM; for(int i=0; i<6; i++) { pItem->itemid[i] = 0; pItem->count[i] = 0; } pItem->bundle_index = pMap->m_wBundle; pItem->time = TimeGet(); pItem->x = fX; pItem->z = fZ; pItem->y = fY; for(int i=0; i<byCount; i++) { if( m_pMain->m_ItemtableArray.GetData(nItemNumber[i]) ) { pItem->itemid[i] = nItemNumber[i]; pItem->count[i] = sCount[i]; } } if (!pMap->RegionItemAdd(regionx, regionz, pItem )) { delete pItem; return; } pUser = m_pMain->GetUserPtr(sUid); if (pUser == NULL) return; send_index = 0; SetByte( send_buff, WIZ_ITEM_DROP, send_index ); SetShort( send_buff, sNid, send_index ); SetDWORD( send_buff, pItem->bundle_index, send_index ); if( pUser->m_sPartyIndex == -1 ) pUser->Send( send_buff, send_index ); else m_pMain->Send_PartyMember( pUser->m_sPartyIndex, send_buff, send_index ); }