void CCPropsItemChar::SetPropertyNum(int iPropIndex, PropertyValNum_t iVal, CObjBase* pLinkedObj, RESDISPLAY_VERSION iLimitToExpansion, bool fDeleteZero) { ADDTOCALLSTACK("CCPropsItemChar::SetPropertyNum"); ASSERT(!IsPropertyStr(iPropIndex)); ASSERT((iLimitToExpansion >= RDS_PRET2A) && (iLimitToExpansion < RDS_QTY)); if ((fDeleteZero && (iVal == 0)) || (_iPropertyExpansion[iPropIndex] > iLimitToExpansion)) { if (0 == _mPropsNum.erase(iPropIndex)) return; // I didn't have this property, so avoid further processing. } else _mPropsNum[iPropIndex] = iVal; if (!pLinkedObj) return; // Do stuff to the pLinkedObj switch (iPropIndex) { case PROPITCH_WEIGHTREDUCTION: { CItem *pItemLink = static_cast<CItem*>(pLinkedObj); int oldweight = pItemLink->GetWeight(); CContainer * pCont = dynamic_cast <CContainer*> (pItemLink->GetParent()); if (pCont) { ASSERT(pItemLink->IsItemEquipped() || pItemLink->IsItemInContainer()); pCont->OnWeightChange(pItemLink->GetWeight() - oldweight); pLinkedObj->UpdatePropertyFlag(); } break; } //default: // pLinkedObj->UpdatePropertyFlag(); // break; } }
void CImportFile::ImportFix() { ADDTOCALLSTACK("CImportFile::ImportFix"); // adjust all the containered items and eliminate duplicates. CheckLast(); int iRemoved = 0; CImportSer * pSerNext; m_pCurSer = static_cast <CImportSer*> ( m_ListSer.GetHead()); for ( ; m_pCurSer != NULL; m_pCurSer = pSerNext ) { pSerNext = static_cast <CImportSer*> ( m_pCurSer->GetNext()); if ( m_pCurSer->m_pObj == NULL ) // NEver created correctly { delete m_pCurSer; continue; } // Make sure this item is not a dupe ? CItem * pItemTest; if ( m_pCurSer->IsTopLevel()) // top level only { if ( m_pCurSer->m_pObj->IsItem()) { CItem * pItemCheck = dynamic_cast <CItem*>( m_pCurSer->m_pObj ); ASSERT(pItemCheck); pItemCheck->SetAttr(ATTR_MOVE_NEVER); CWorldSearch AreaItems( m_pCurSer->m_pObj->GetTopPoint()); for (;;) { CItem * pItem = AreaItems.GetItem(); if ( pItem == NULL ) break; if ( ! pItem->IsSameType( m_pCurSer->m_pObj )) continue; pItem->SetName( m_pCurSer->m_pObj->GetName()); if ( ! ( m_pCurSer->m_pObj->GetTopZ() == pItem->GetTopZ())) continue; goto item_delete; } } else { // dupe char ? } // Make sure the top level object is placed correctly. m_pCurSer->m_pObj->MoveTo( m_pCurSer->m_pObj->GetTopPoint()); m_pCurSer->m_pObj->Update(); if ( ! m_pCurSer->m_pObj->IsContainer()) delete m_pCurSer; continue; } pItemTest = dynamic_cast <CItem*> (m_pCurSer->m_pObj); if ( pItemTest == NULL ) { item_delete: delete m_pCurSer->m_pObj; delete m_pCurSer; iRemoved ++; continue; } // Find it's container. CImportSer* pSerCont = static_cast <CImportSer*> ( m_ListSer.GetHead()); CObjBase * pObjCont = NULL; for ( ; pSerCont != NULL; pSerCont = static_cast <CImportSer*> ( pSerCont->GetNext())) { if ( pSerCont->m_pObj == NULL ) continue; if ( pSerCont->m_dwSer == m_pCurSer->m_dwContSer ) { pObjCont = pSerCont->m_pObj; if ( ! pItemTest->LoadSetContainer( pObjCont->GetUID(), m_pCurSer->m_layer )) { goto item_delete; // not in a cont ? } m_pCurSer->m_dwContSer = UID_UNUSED; // found it. break; } } if ( ! m_pCurSer->IsTopLevel() || pObjCont == NULL) { goto item_delete; } // Is it a dupe in the container or equipped ? for ( CItem *pItem = dynamic_cast<CContainer*>(pObjCont)->GetContentHead(); pItem != NULL; pItem = pItem->GetNext() ) { if ( pItemTest == pItem ) continue; if ( pItemTest->IsItemEquipped()) { if ( pItemTest->GetEquipLayer() != pItem->GetEquipLayer()) continue; } else { if ( ! pItemTest->GetContainedPoint().IsSame2D( pItem->GetContainedPoint())) continue; } if ( ! pItemTest->IsSameType( pItem )) continue; goto item_delete; } // done with it if not a container. if ( ! pItemTest->IsContainer()) delete m_pCurSer; } if ( iRemoved ) { DEBUG_ERR(( "Import: removed %d bad items\n", iRemoved )); } m_ListSer.DeleteAll(); // done with the list now. }