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] );
}
Beispiel #2
0
// 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;
		}
	}
}