CItem * CContainer::ContentFind( RESOURCE_ID_BASE rid, DWORD dwArg, int iDecendLevels ) const { ADDTOCALLSTACK("CContainer::ContentFind"); // send all the items in the container. if ( rid.GetResIndex() == 0 ) return( NULL ); CItem* pItem=GetContentHead(); for ( ; pItem!=NULL; pItem=pItem->GetNext()) { if ( pItem->IsResourceMatch( rid, dwArg )) break; if ( iDecendLevels <= 0 ) continue; CItemContainer * pCont = dynamic_cast <CItemContainer*>(pItem); if ( pCont != NULL ) { if ( ! pCont->IsSearchable()) continue; CItem * pItemInCont = pCont->ContentFind( rid, dwArg, iDecendLevels-1 ); if ( pItemInCont ) return( pItemInCont ); } } return( pItem ); }
TRIGRET_TYPE CContainer::OnContTriggerForLoop( CScript &s, CTextConsole * pSrc, CScriptTriggerArgs * pArgs, CGString * pResult, CScriptLineContext & StartContext, CScriptLineContext & EndContext, RESOURCE_ID_BASE rid, DWORD dwArg, int iDecendLevels ) { ADDTOCALLSTACK("CContainer::OnContTriggerForLoop"); if ( rid.GetResIndex() != 0 ) { CItem* pItem = GetContentHead(); CItem * pItemNext; for ( ; pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); if ( pItem->IsResourceMatch( rid, dwArg )) { s.SeekContext( StartContext ); TRIGRET_TYPE iRet = pItem->OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet == TRIGRET_BREAK ) { EndContext = StartContext; break; } if (( iRet != TRIGRET_ENDIF ) && ( iRet != TRIGRET_CONTINUE )) return( iRet ); if ( iRet == TRIGRET_CONTINUE ) EndContext = StartContext; else EndContext = s.GetContext(); } if ( iDecendLevels <= 0 ) continue; CItemContainer * pCont = dynamic_cast <CItemContainer*>(pItem); if ( pCont != NULL ) { if ( pCont->IsSearchable()) { CContainer * pContBase = dynamic_cast <CContainer *> (pCont); TRIGRET_TYPE iRet = pContBase->OnContTriggerForLoop( s, pSrc, pArgs, pResult, StartContext, EndContext, rid, dwArg, iDecendLevels-1 ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } // Since the previous call has already found the EndContext, set it. EndContext = s.GetContext(); } } } } if ( EndContext.m_lOffset <= StartContext.m_lOffset ) { CScriptObj * pScript = dynamic_cast <CScriptObj *> (this); TRIGRET_TYPE iRet = pScript->OnTriggerRun( s, TRIGRUN_SECTION_FALSE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) return( iRet ); } else s.SeekContext( EndContext ); return( TRIGRET_ENDIF ); }
bool CContainer::r_WriteValContainer(LPCTSTR pszKey, CGString & sVal, CTextConsole *pSrc) { ADDTOCALLSTACK("CContainer::r_WriteValContainer"); EXC_TRY("WriteVal"); static LPCTSTR const sm_szParams[] = { "count", "fcount", "rescount", "restest" }; int i = FindTableHeadSorted(pszKey, sm_szParams, COUNTOF(sm_szParams)); if ( i < 0 ) return false; LPCTSTR pKey = pszKey + strlen(sm_szParams[i]); SKIP_SEPARATORS(pKey); switch ( i ) { case 0: // count { int iTotal = 0; for ( CItem* pItem = GetContentHead(); pItem != NULL; pItem = pItem->GetNext() ) iTotal++; sVal.FormatVal(iTotal); } break; case 1: // fcount sVal.FormatVal(ContentCountAll()); break; case 2: // rescount sVal.FormatVal(*pKey ? ContentCount(g_Cfg.ResourceGetID(RES_ITEMDEF, pKey)) : GetCount()); break; case 3: // restest { CResourceQtyArray Resources; sVal.FormatVal(Resources.Load(pKey) ? ResourceConsume(&Resources, 1, true) : 0); } break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
void CContainer::r_WriteContent( CScript & s ) const { ADDTOCALLSTACK("CContainer::r_WriteContent"); ASSERT(dynamic_cast<const CGObList *>(this) != NULL); // Write out all the items in me. CItem* pItemNext; for ( CItem* pItem = GetContentHead(); pItem != NULL; pItem = pItemNext) { pItemNext = pItem->GetNext(); ASSERT( pItem->GetParent() == this ); pItem->r_WriteSafe(s); } }
void CContainer::ContentsDump( const CPointMap & pt, DWORD dwAttrLeave ) { ADDTOCALLSTACK("CContainer::ContentsDump"); // Just dump the contents onto the ground. dwAttrLeave |= ATTR_NEWBIE|ATTR_MOVE_NEVER|ATTR_CURSED2|ATTR_BLESSED2; CItem * pItemNext; for ( CItem* pItem=GetContentHead(); pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); if ( pItem->IsAttr(dwAttrLeave)) continue; // hair and newbie stuff. // ??? scatter a little ? pItem->MoveToCheck( pt ); } }
void CContainer::ContentsTransfer( CItemContainer * pCont, bool fNoNewbie ) { ADDTOCALLSTACK("CContainer::ContentsTransfer"); // Move all contents to another container. (pCont) if ( pCont == NULL ) return; CItem* pItemNext; for ( CItem* pItem=GetContentHead(); pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); if ( fNoNewbie && pItem->IsAttr( ATTR_NEWBIE|ATTR_MOVE_NEVER|ATTR_CURSED2|ATTR_BLESSED2 )) // keep newbie stuff. continue; pCont->ContentAdd( pItem ); // add content } }
void CItemContainer::Trade_Delete() { ADDTOCALLSTACK("CItemContainer::Trade_Delete"); // Called when object deleted. ASSERT( IsType(IT_EQ_TRADE_WINDOW) ); CChar * pChar = dynamic_cast <CChar*> (GetParent()); if ( pChar == NULL ) return; if ( pChar->IsClient()) { // Send the cancel trade message. PacketTradeAction cmd(SECURE_TRADE_CLOSE); cmd.prepareClose(this); cmd.send(pChar->GetClient()); } // Drop items back in my pack. CItem * pItemNext; for ( CItem* pItem = GetContentHead(); pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); pChar->ItemBounce( pItem ); } // Kill my trading partner. CItemContainer * pPartner = dynamic_cast <CItemContainer *> ( m_uidLink.ItemFind()); if ( pPartner == NULL ) return; if ( IsTrigUsed(TRIGGER_TRADECLOSE) ) { CChar * pChar2 = dynamic_cast <CChar*> (pPartner->GetParent()); CScriptTriggerArgs Args( pChar2 ); pChar->OnTrigger( CTRIG_TradeClose, pChar , &Args ); CScriptTriggerArgs Args2( pChar ); pChar2->OnTrigger( CTRIG_TradeClose, pChar, &Args2); } m_uidLink.InitUID(); // unlink. pPartner->m_uidLink.InitUID(); pPartner->Delete(); }
int CContainer::ContentCountAll() const { ADDTOCALLSTACK("CContainer::ContentCountAll"); // RETURN: // A count of all the items in this container and sub contianers. int iTotal = 0; for ( CItem* pItem=GetContentHead(); pItem!=NULL; pItem=pItem->GetNext()) { iTotal++; const CItemContainer * pCont = dynamic_cast <const CItemContainer*>(pItem); if ( pCont == NULL ) continue; // if ( ! pCont->IsSearchable()) continue; // found a sub iTotal += pCont->ContentCountAll(); } return( iTotal ); }
int CContainer::ContentConsume( RESOURCE_ID_BASE rid, int amount, bool fTest, DWORD dwArg ) { ADDTOCALLSTACK("CContainer::ContentConsume"); // ARGS: // dwArg = a hack for ores. // RETURN: // 0 = all consumed ok. // # = number left to be consumed. (still required) if ( rid.GetResIndex() == 0 ) return( amount ); // from skills menus. CItem * pItemNext; for ( CItem* pItem=GetContentHead(); pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); if ( pItem->IsResourceMatch( rid, dwArg )) { amount -= pItem->ConsumeAmount( amount, fTest ); if ( amount <= 0 ) break; } CItemContainer * pCont = dynamic_cast <CItemContainer*> (pItem); if ( pCont != NULL ) // this is a sub-container. { if ( rid == RESOURCE_ID(RES_TYPEDEF,IT_GOLD)) { if ( pCont->IsType(IT_CONTAINER_LOCKED)) continue; } else { if ( ! pCont->IsSearchable()) continue; } amount = pCont->ContentConsume( rid, amount, fTest, dwArg ); if ( amount <= 0 ) break; } } return( amount ); }
int CContainer::FixWeight() { ADDTOCALLSTACK("CContainer::FixWeight"); // If there is some sort of ASSERT during item add then this is used to fix it. m_totalweight = 0; CItem* pItem=GetContentHead(); for ( ; pItem!=NULL; pItem=pItem->GetNext()) { CItemContainer * pCont = dynamic_cast <CItemContainer *> (pItem); if ( pCont ) { pCont->FixWeight(); if ( ! pCont->IsWeighed()) continue; // Bank box doesn't count for wieght. } m_totalweight += pItem->GetWeight(); } return( m_totalweight ); }
void CContainer::ContentNotifyDelete() { ADDTOCALLSTACK("CContainer::ContentNotifyDelete"); if ( IsTrigUsed(TRIGGER_DESTROY) ) // no point entering this loop if the trigger is disabled return; // trigger @Destroy on contained items CItem *pItemNext = NULL; for (CItem *pItem = GetContentHead(); pItem != NULL; pItem = pItemNext) { pItemNext = pItem->GetNext(); if ( pItem->NotifyDelete() == false ) { // item shouldn't be destroyed and so cannot remain in this container, // drop it to the ground if it hasn't been moved already if (pItem->GetParent() == this) pItem->MoveToCheck( pItem->GetTopLevelObj()->GetTopPoint() ); } } }
void CContainer::ContentAttrMod( DWORD dwAttr, bool fSet ) { ADDTOCALLSTACK("CContainer::ContentAttrMod"); // Mark the attr for ( CItem* pItem=GetContentHead(); pItem!=NULL; pItem=pItem->GetNext()) { if ( fSet ) { pItem->SetAttr( dwAttr ); } else { pItem->ClrAttr( dwAttr ); } CItemContainer * pCont = dynamic_cast <CItemContainer*> (pItem); if ( pCont != NULL ) // this is a sub-container. { pCont->ContentAttrMod( dwAttr, fSet ); } } }
void CContainer::ContentAddPrivate( CItem * pItem ) { ADDTOCALLSTACK("CContainer::ContentAddPrivate"); // We are adding to a CChar or a CItemContainer ASSERT( pItem != NULL ); ASSERT( pItem->IsValidUID()); // it should be valid at this point. if ( pItem->GetParent() == this ) return; if (!CGObList::GetCount()) CGObList::InsertHead( pItem ); else { CItem* pTest = GetContentHead(); CItem *prevItem = pTest; for (; pTest != NULL; pTest = pTest->GetNext()) { if (pTest->GetUID() < prevItem->GetUID()) prevItem = pTest; } CGObList::InsertAfter(pItem,prevItem); } //CGObList::InsertTail( pItem );//Reversing the order in which things are added into a container OnWeightChange( pItem->GetWeight()); }
BOOL CHttpUploadFileProc::UseHttpSendReqEx(HINTERNET hRequest, CFile &file) { // 生成form-data协议信息 <begin> CStringA straHeader; CStringA straContentHead; CStringA straContentTail; straHeader = GetHttpAppendHeader(); straContentHead = GetContentHead(file.GetFileName()); straContentTail = GetContentTail(); // 生成form-data协议信息 <end> ULONGLONG ullFileLength = file.GetLength(); DWORD dwContentLength = straContentHead.GetLength() + (DWORD) ullFileLength + straContentTail.GetLength(); INTERNET_BUFFERS BufferIn = {0}; BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur BufferIn.Next = NULL; //BufferIn.lpcszHeader = NULL; //BufferIn.dwHeadersLength = 0; BufferIn.lpcszHeader = straHeader.LockBuffer(); straHeader.UnlockBuffer(); BufferIn.dwHeadersLength = (DWORD)straHeader.GetLength(); BufferIn.dwHeadersTotal = 0; BufferIn.lpvBuffer = NULL; BufferIn.dwBufferLength = 0; BufferIn.dwBufferTotal = dwContentLength; BufferIn.dwOffsetLow = 0; BufferIn.dwOffsetHigh = 0; if (IsTerminated()) return FALSE; NotifyReceiver(P_HUF_SENDING_FILE, 0); if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0)) return FALSE; UINT uProgressBegin = 10; UINT uProgressEnd = 90; UINT uProgressCur = 0; UINT uReadCountSum = 0; const UINT uBufSize = 1024; BYTE pBuffer[uBufSize]; UINT uReadCount; DWORD dwBytesWritten; BOOL bRet; float fSendPercent; UINT uProgressScale; // Write Head bRet = InternetWriteFile( hRequest, straContentHead.LockBuffer(), straContentHead.GetLength(), &dwBytesWritten); straContentHead.UnlockBuffer(); if(!bRet) { NotifyReceiver(E_HUF_SEND_FILE_FAILED, 0); return FALSE; } if (IsTerminated()) return FALSE; // Write file contents uReadCountSum = 0; bRet = TRUE; file.SeekToBegin(); do { if (IsTerminated()) return FALSE; uReadCount = file.Read(pBuffer, uBufSize); if (0 == uReadCount) break; if(! InternetWriteFile( hRequest, pBuffer, uReadCount, &dwBytesWritten)) { NotifyReceiver(E_HUF_SEND_FILE_FAILED, 0); return FALSE; } uReadCountSum += uReadCount; fSendPercent = (float)uReadCountSum / BufferIn.dwBufferTotal; uProgressScale = (UINT) ((uProgressEnd - uProgressBegin) * fSendPercent); uProgressCur = uProgressBegin + uProgressScale; NotifyReceiver(P_HUF_PROGRESS, uProgressCur); } while (uReadCount == uBufSize); if (IsTerminated()) return FALSE; // Write Tail bRet = InternetWriteFile( hRequest, straContentTail.LockBuffer(), straContentTail.GetLength(), &dwBytesWritten); straContentTail.UnlockBuffer(); if(!bRet) { NotifyReceiver(E_HUF_SEND_FILE_FAILED, 0); return FALSE; } NotifyReceiver(P_HUF_PROGRESS, uProgressEnd); if (IsTerminated()) return FALSE; NotifyReceiver(P_HUF_WAIT_RESPONSE, 0); if (!HttpEndRequest(hRequest, NULL, 0, 0)) { NotifyReceiver(E_HUF_WAIT_RESPONSE_FAILD, 0); bRet = FALSE; } return bRet; }
void CItemContainer::Trade_Status( bool bCheck ) { ADDTOCALLSTACK("CItemContainer::Trade_Status"); // Update trade status check boxes to both sides. CItemContainer *pPartner = dynamic_cast<CItemContainer*>(m_uidLink.ItemFind()); if ( !pPartner ) return; CChar *pChar1 = dynamic_cast<CChar*>(GetParent()); if ( !pChar1 ) return; CChar *pChar2 = dynamic_cast<CChar*>(pPartner->GetParent()); if ( !pChar2 ) return; m_itEqTradeWindow.m_bCheck = bCheck ? 1 : 0; if ( !bCheck ) pPartner->m_itEqTradeWindow.m_bCheck = 0; PacketTradeAction cmd(SECURE_TRADE_CHANGE); if ( pChar1->IsClient() ) { cmd.prepareReadyChange(this, pPartner); cmd.send(pChar1->GetClient()); } if ( pChar2->IsClient() ) { cmd.prepareReadyChange(pPartner, this); cmd.send(pChar2->GetClient()); } // Check if both clients had pressed the 'accept' buttom if ( pPartner->m_itEqTradeWindow.m_bCheck == 0 || m_itEqTradeWindow.m_bCheck == 0 ) return; CItem *pItem, *pItemNext; int iCont1, iCont2; unsigned short i; CScriptTriggerArgs Args1(pChar1); pItem = pPartner->GetContentHead(); for ( i = 1; pItem != NULL; pItem = pItemNext, ++i ) { pItemNext = pItem->GetNext(); Args1.m_VarObjs.Insert(i, pItem, true); } Args1.m_iN1 = iCont1 = --i; pItemNext = NULL; CScriptTriggerArgs Args2(pChar2); pItem = GetContentHead(); for ( i = 1; pItem != NULL; pItem = pItemNext, ++i ) { pItemNext = pItem->GetNext(); Args2.m_VarObjs.Insert(i, pItem, true); } Args2.m_iN1 = iCont2 = --i; pItemNext = NULL; if ( (IsTrigUsed(TRIGGER_TRADEACCEPTED)) || (IsTrigUsed(TRIGGER_CHARTRADEACCEPTED)) ) { Args1.m_iN2 = iCont2; Args2.m_iN2 = iCont1; if ( (pChar1->OnTrigger(CTRIG_TradeAccepted, pChar2, &Args1) == TRIGRET_RET_TRUE) || (pChar2->OnTrigger(CTRIG_TradeAccepted, pChar1, &Args2) == TRIGRET_RET_TRUE) ) Delete(); } // Transfer items pItem = GetContentHead(); for ( ; pItem != NULL; pItem = pItemNext ) { pItemNext = pItem->GetNext(); pChar2->ItemBounce(pItem); } pItemNext = NULL; pItem = pPartner->GetContentHead(); for ( ; pItem != NULL; pItem = pItemNext ) { pItemNext = pItem->GetNext(); pChar1->ItemBounce(pItem); } // Transfer gold/platinum if ( g_Cfg.m_iFeatureTOL & FEATURE_TOL_VIRTUALGOLD ) { INT64 iGold1 = m_itEqTradeWindow.m_iGold + (m_itEqTradeWindow.m_iPlatinum * 1000000000); INT64 iGold2 = pPartner->m_itEqTradeWindow.m_iGold + (pPartner->m_itEqTradeWindow.m_iPlatinum * 1000000000); pChar1->m_virtualGold += iGold2 - iGold1; pChar2->m_virtualGold += iGold1 - iGold2; pChar1->UpdateStatsFlag(); pChar2->UpdateStatsFlag(); } // done with trade. Delete(); }