Void CharStatPackage::_ComputePersistentStatModifiers() { // Modifiers from passives for( UInt i = 0; i < CHARSTAT_COUNT; ++i ) m_arrPassiveStatModifier[i] = 0.0f; m_pOwner->EnumSkills(); SkillInstance * pSkillInstance = m_pOwner->EnumNextSkill(); while( pSkillInstance != NULL ) { if ( pSkillInstance->IsPassive() ) { const Scalar * arrBonus = ( (PassiveSkill*)(pSkillInstance->GetSkill()) )->GetStatBonus(); for( UInt i = 0; i < CHARSTAT_COUNT; ++i ) m_arrPassiveStatModifier[i] += arrBonus[i]; } pSkillInstance = m_pOwner->EnumNextSkill(); } // Modifiers from items for( UInt i = 0; i < CHARSTAT_COUNT; ++i ) m_arrItemStatModifier[i] = 0.0f; for( UInt i = 0; i < EQUIPSLOTID_COUNT; ++i ) { ItemInstance * pItemInstance = m_pOwner->GetItem( (EquipmentSoltID)i ); if ( pItemInstance->IsEmpty() ) continue; Assert( pItemInstance->GetItem()->GetType() == ITEMTYPE_EQUIPMENT ); EquipmentItem * pItem = (EquipmentItem*)( pItemInstance->GetItem() ); const Scalar * arrBonus = pItem->GetStatBonus(); for( UInt j = 0; j < CHARSTAT_COUNT; ++j ) m_arrItemStatModifier[j] += arrBonus[j]; } // Final stats for( UInt i = 0; i < CHARSTAT_COUNT; ++i ) m_arrFinalStat[i] = ( m_arrModdedStat[i] + m_arrPassiveStatModifier[i] + m_arrItemStatModifier[i] ); }
// Remove all items from container void EQEmu::ItemInstance::ClearByFlags(byFlagSetting is_nodrop, byFlagSetting is_norent) { // TODO: This needs work... // Destroy container contents std::map<uint8, ItemInstance*>::const_iterator cur, end, del; cur = m_contents.begin(); end = m_contents.end(); for (; cur != end;) { ItemInstance* inst = cur->second; if (inst == nullptr) { cur = m_contents.erase(cur); continue; } const ItemData* item = inst->GetItem(); if (item == nullptr) { cur = m_contents.erase(cur); continue; } del = cur; ++cur; switch (is_nodrop) { case byFlagSet: if (item->NoDrop == 0) { safe_delete(inst); m_contents.erase(del->first); continue; } // no 'break;' deletes 'byFlagNotSet' type - can't add at the moment because it really *breaks* the process somewhere case byFlagNotSet: if (item->NoDrop != 0) { safe_delete(inst); m_contents.erase(del->first); continue; } default: break; } switch (is_norent) { case byFlagSet: if (item->NoRent == 0) { safe_delete(inst); m_contents.erase(del->first); continue; } // no 'break;' deletes 'byFlagNotSet' type - can't add at the moment because it really *breaks* the process somewhere case byFlagNotSet: if (item->NoRent != 0) { safe_delete(inst); m_contents.erase(del->first); continue; } default: break; } } }