void CUser::WarehouseProcess(char *pBuf) { int index = 0, send_index = 0, itemid = 0, srcpos = -1, destpos = -1, page = -1, reference_pos = -1, npcid = 0; DWORD count = 0; char send_buff[2048]; _ITEM_TABLE* pTable = NULL; BYTE command = 0; command = GetByte( pBuf, index ); // â?? ??j?... if (isDead()) { TRACE("### WarehouseProcess Fail : name=%s(%d), m_bResHpType=%d, hp=%d, x=%d, z=%d ###\n", m_pUserData->m_id, m_Sid, m_bResHpType, m_pUserData->m_sHp, (int)m_pUserData->m_curx, (int)m_pUserData->m_curz); return; } if( m_sExchangeUser != -1 ) goto fail_return; if( command == WAREHOUSE_OPEN ) { Packet result(WIZ_WAREHOUSE); result << uint8(WAREHOUSE_OPEN) << uint8(WAREHOUSE_OPEN) << uint32(m_pUserData->m_iBank); for(int i=0; i<WAREHOUSE_MAX; i++ ) { result << m_pUserData->m_sWarehouseArray[i].nNum << m_pUserData->m_sWarehouseArray[i].sDuration << m_pUserData->m_sWarehouseArray[i].sCount << uint8(0) << uint16(0) << uint16(0) << uint16(0) << uint16(0); } Send(&result); return; } npcid = GetShort(pBuf,index); itemid = GetDWORD( pBuf, index ); page = GetByte( pBuf, index ); srcpos = GetByte( pBuf, index ); destpos = GetByte( pBuf, index ); pTable = m_pMain->m_ItemtableArray.GetData( itemid ); if( !pTable ) goto fail_return; reference_pos = 24 * page; switch( command ) { case WAREHOUSE_INPUT: count = GetDWORD( pBuf, index ); if( itemid == ITEM_GOLD ) { if( m_pUserData->m_iBank+count > 2100000000 ) goto fail_return; if( m_pUserData->m_iGold-count < 0 ) goto fail_return; m_pUserData->m_iBank += count; m_pUserData->m_iGold -= count; break; } if( m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nNum != itemid ) goto fail_return; if( reference_pos+destpos > WAREHOUSE_MAX ) goto fail_return; if( m_pUserData->m_sWarehouseArray[reference_pos+destpos].nNum && !pTable->m_bCountable ) goto fail_return; if( m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount < count ) goto fail_return; m_pUserData->m_sWarehouseArray[reference_pos+destpos].nNum = itemid; m_pUserData->m_sWarehouseArray[reference_pos+destpos].sDuration = m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sDuration; m_pUserData->m_sWarehouseArray[reference_pos+destpos].nSerialNum = m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nSerialNum; if( pTable->m_bCountable == 0 && m_pUserData->m_sWarehouseArray[reference_pos+destpos].nSerialNum == 0 ) m_pUserData->m_sWarehouseArray[reference_pos+destpos].nSerialNum = m_pMain->GenerateItemSerial(); if( pTable->m_bCountable ) { m_pUserData->m_sWarehouseArray[reference_pos+destpos].sCount += (unsigned short)count; } else { m_pUserData->m_sWarehouseArray[reference_pos+destpos].sCount = m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount; } if( !pTable->m_bCountable ) { m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nNum = 0; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sDuration = 0; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount = 0; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nSerialNum = 0; } else { m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount -= (unsigned short)count; if( m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount <= 0 ) { m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nNum = 0; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sDuration = 0; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount = 0; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nSerialNum = 0; } } SendItemWeight(); ItemLogToAgent( m_pUserData->m_Accountid, m_pUserData->m_id, ITEM_WAREHOUSE_PUT, 0, itemid, count, m_pUserData->m_sWarehouseArray[reference_pos+destpos].sDuration ); break; case WAREHOUSE_OUTPUT: count = GetDWORD( pBuf, index ); if( itemid == ITEM_GOLD ) { if( m_pUserData->m_iGold+count > 2100000000 ) goto fail_return; if( m_pUserData->m_iBank-count < 0 ) goto fail_return; m_pUserData->m_iGold += count; m_pUserData->m_iBank -= count; break; } // if (pTable->m_bCountable) { // Check weight of countable item. if (((pTable->m_sWeight * count) + m_sItemWeight) > m_sMaxWeight) { goto fail_return; } } else { // Check weight of non-countable item. if ((pTable->m_sWeight + m_sItemWeight) > m_sMaxWeight) { goto fail_return; } } // if( reference_pos+srcpos > WAREHOUSE_MAX ) goto fail_return; if( m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nNum != itemid ) goto fail_return; if( m_pUserData->m_sItemArray[SLOT_MAX+destpos].nNum && !pTable->m_bCountable ) goto fail_return; if( m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount < count ) goto fail_return; m_pUserData->m_sItemArray[SLOT_MAX+destpos].nNum = itemid; m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration = m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sDuration; m_pUserData->m_sItemArray[SLOT_MAX+destpos].nSerialNum = m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nSerialNum; if( pTable->m_bCountable ) m_pUserData->m_sItemArray[SLOT_MAX+destpos].sCount += (unsigned short)count; else { if( m_pUserData->m_sItemArray[SLOT_MAX+destpos].nSerialNum == 0 ) m_pUserData->m_sItemArray[SLOT_MAX+destpos].nSerialNum = m_pMain->GenerateItemSerial(); m_pUserData->m_sItemArray[SLOT_MAX+destpos].sCount = m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount; } if( !pTable->m_bCountable ) { m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nNum = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sDuration = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nSerialNum = 0; } else { m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount -= (unsigned short)count; if( m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount <= 0 ) { m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nNum = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sDuration = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nSerialNum = 0; } } SendItemWeight(); ItemLogToAgent( m_pUserData->m_id, m_pUserData->m_Accountid, ITEM_WAREHOUSE_GET, 0, itemid, count, m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration ); //TRACE("WARE OUTPUT : %s %s %d %d %d %d %d", m_pUserData->m_id, m_pUserData->m_Accountid, ITEM_WAREHOUSE_GET, 0, itemid, count, m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration ); break; case WAREHOUSE_MOVE: if( reference_pos+srcpos > WAREHOUSE_MAX ) goto fail_return; if( m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nNum != itemid ) goto fail_return; if( m_pUserData->m_sWarehouseArray[reference_pos+destpos].nNum ) goto fail_return; m_pUserData->m_sWarehouseArray[reference_pos+destpos].nNum = itemid; m_pUserData->m_sWarehouseArray[reference_pos+destpos].sDuration = m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sDuration; m_pUserData->m_sWarehouseArray[reference_pos+destpos].sCount = m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount; m_pUserData->m_sWarehouseArray[reference_pos+destpos].nSerialNum = m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nSerialNum; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nNum = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sDuration = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].sCount = 0; m_pUserData->m_sWarehouseArray[reference_pos+srcpos].nSerialNum = 0; break; case WAREHOUSE_INVENMOVE: if( itemid != m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nNum ) goto fail_return; { short duration = m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sDuration; short itemcount = m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount; __int64 serial = m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nSerialNum; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nNum = m_pUserData->m_sItemArray[SLOT_MAX+destpos].nNum; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sDuration = m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].sCount = m_pUserData->m_sItemArray[SLOT_MAX+destpos].sCount; m_pUserData->m_sItemArray[SLOT_MAX+srcpos].nSerialNum = m_pUserData->m_sItemArray[SLOT_MAX+destpos].nSerialNum; m_pUserData->m_sItemArray[SLOT_MAX+destpos].nNum = itemid; m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration = duration; m_pUserData->m_sItemArray[SLOT_MAX+destpos].sCount = itemcount; m_pUserData->m_sItemArray[SLOT_MAX+destpos].nSerialNum = serial; } break; } m_pUserData->m_bWarehouse = 1; SetByte( send_buff, WIZ_WAREHOUSE, send_index ); SetByte( send_buff, command, send_index ); SetByte( send_buff, 0x01, send_index ); Send( send_buff, send_index ); return; fail_return: SetByte( send_buff, WIZ_WAREHOUSE, send_index ); SetByte( send_buff, command, send_index ); SetByte( send_buff, 0x00, send_index ); Send( send_buff, send_index ); }
// NPC shops void CUser::ItemTrade(char *pBuf) { int index = 0, send_index = 0, itemid = 0, money = 0, count = 0, group = 0, npcid = 0; _ITEM_TABLE* pTable = NULL; char send_buf[128]; CNpc* pNpc = NULL; memset( send_buf, NULL, 128); BYTE type, pos, destpos, result; if (isDead()) { TRACE("### ItemTrade Fail : name=%s(%d), m_bResHpType=%d, hp=%d, x=%d, z=%d ###\n", m_pUserData->m_id, m_Sid, m_bResHpType, m_pUserData->m_sHp, (int)m_pUserData->m_curx, (int)m_pUserData->m_curz); result = 0x01; goto fail_return; } type = GetByte( pBuf, index ); if( type == 0x01 ) {// item buy group = GetDWORD( pBuf, index ); npcid = GetShort( pBuf, index ); } itemid = GetDWORD( pBuf, index ); pos = GetByte( pBuf, index ); if( type == 0x03 ) // item move only destpos = GetByte( pBuf, index ); else count = GetShort( pBuf, index ); if (itemid >= ITEM_NO_TRADE) goto fail_return; if( type == 0x03 ) { // item inven to inven move if( pos >= HAVE_MAX || destpos >= HAVE_MAX ) { SetByte( send_buf, WIZ_ITEM_TRADE, send_index ); SetByte( send_buf, 0x04, send_index ); Send( send_buf, send_index ); return; } if( itemid != m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum ) { SetByte( send_buf, WIZ_ITEM_TRADE, send_index ); SetByte( send_buf, 0x04, send_index ); Send( send_buf, send_index ); return; } short duration = m_pUserData->m_sItemArray[SLOT_MAX+pos].sDuration; short itemcount = m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount; m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum = m_pUserData->m_sItemArray[SLOT_MAX+destpos].nNum; m_pUserData->m_sItemArray[SLOT_MAX+pos].sDuration = m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration; m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount = m_pUserData->m_sItemArray[SLOT_MAX+destpos].sCount; m_pUserData->m_sItemArray[SLOT_MAX+destpos].nNum = itemid; m_pUserData->m_sItemArray[SLOT_MAX+destpos].sDuration = duration; m_pUserData->m_sItemArray[SLOT_MAX+destpos].sCount = itemcount; SetByte( send_buf, WIZ_ITEM_TRADE, send_index ); SetByte( send_buf, 0x03, send_index ); Send( send_buf, send_index ); return; } if( m_sExchangeUser != -1 ) goto fail_return; pTable = m_pMain->m_ItemtableArray.GetData( itemid ); if( !pTable ) { result = 0x01; goto fail_return; } if( pos >= HAVE_MAX ) { result = 0x02; goto fail_return; } if( count <= 0 || count > MAX_ITEM_COUNT) { result = 0x02; goto fail_return; } if( type == 0x01 ) { // buy sequence if( m_pMain->m_bPointCheckFlag == FALSE) { result = 0x01; goto fail_return; } pNpc = m_pMain->m_arNpcArray.GetData(npcid); if( !pNpc ) { result = 0x01; goto fail_return; } if( pNpc->m_iSellingGroup != group ) { result = 0x01; goto fail_return; } if( m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum != 0 ) { if( m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum == itemid ) { if( !pTable->m_bCountable || count <= 0 ) { result = 0x02; goto fail_return; } if( pTable->m_bCountable && (count+m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount) > MAX_ITEM_COUNT ) { result = 0x04; goto fail_return; } } else { result = 0x02; goto fail_return; } } if( m_pUserData->m_iGold < (pTable->m_iBuyPrice*count) ) { result = 0x03; goto fail_return; } // if (pTable->m_bCountable) { // Check weight of countable item. if (((pTable->m_sWeight * count) + m_sItemWeight) > m_sMaxWeight) { result = 0x04; goto fail_return; } } else { // Check weight of non-countable item. if ((pTable->m_sWeight + m_sItemWeight) > m_sMaxWeight) { result = 0x04; goto fail_return; } } // m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum = itemid; m_pUserData->m_sItemArray[SLOT_MAX+pos].sDuration = pTable->m_sDuration; if( pTable->m_bCountable && count > 0 ) { // count ?????? ??? ?????? m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount += count; m_pUserData->m_iGold -= (pTable->m_iBuyPrice * count); } else { m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount = 1; m_pUserData->m_iGold -= pTable->m_iBuyPrice; m_pUserData->m_sItemArray[SLOT_MAX+pos].nSerialNum = m_pMain->GenerateItemSerial(); } SendItemWeight(); ItemLogToAgent( m_pUserData->m_id, pNpc->m_strName, ITEM_MERCHANT_BUY, m_pUserData->m_sItemArray[SLOT_MAX+pos].nSerialNum, itemid, count, pTable->m_sDuration ); } else { // sell sequence if( m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum != itemid ) { result = 0x02; goto fail_return; } if( m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount < count ) { result = 0x03; goto fail_return; } int durability = m_pUserData->m_sItemArray[SLOT_MAX+pos].sDuration; if( pTable->m_bCountable && count > 0 ) { m_pUserData->m_iGold += (pTable->m_iSellPrice * count); m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount -= count; if( m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount <= 0 ) { m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum = 0; m_pUserData->m_sItemArray[SLOT_MAX+pos].sDuration = 0; m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount = 0; } } else { m_pUserData->m_iGold += pTable->m_iSellPrice; m_pUserData->m_sItemArray[SLOT_MAX+pos].nNum = 0; m_pUserData->m_sItemArray[SLOT_MAX+pos].sDuration = 0; m_pUserData->m_sItemArray[SLOT_MAX+pos].sCount = 0; } SendItemWeight(); ItemLogToAgent( m_pUserData->m_id, "MERCHANT SELL", ITEM_MERCHANT_SELL, 0, itemid, count, durability ); } SetByte( send_buf, WIZ_ITEM_TRADE, send_index ); SetByte( send_buf, 0x01, send_index ); SetDWORD( send_buf, m_pUserData->m_iGold, send_index ); Send( send_buf, send_index ); return; fail_return: send_index = 0; SetByte( send_buf, WIZ_ITEM_TRADE, send_index ); SetByte( send_buf, 0x00, send_index ); SetByte( send_buf, result, send_index ); Send( send_buf, send_index ); }