forked from teamnwah/openmw-tes3coop
Fix NPC armor rating calculation and reduce redundant lookups
This commit is contained in:
parent
f73008546f
commit
1a40d01afa
1 changed files with 15 additions and 15 deletions
|
@ -739,18 +739,19 @@ namespace MWClass
|
|||
|
||||
float Npc::getArmorRating (const MWWorld::Ptr& ptr) const
|
||||
{
|
||||
MWWorld::InventoryStore& invStore = MWWorld::Class::get(ptr).getInventoryStore(ptr);
|
||||
const MWWorld::Store<ESM::GameSetting> &gmst =
|
||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
||||
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
const MWWorld::Store<ESM::GameSetting> &gmst = world->getStore().get<ESM::GameSetting>();
|
||||
|
||||
int ratings[MWWorld::InventoryStore::Slots];
|
||||
MWMechanics::NpcStats &stats = getNpcStats(ptr);
|
||||
MWWorld::InventoryStore &invStore = getInventoryStore(ptr);
|
||||
|
||||
int iBaseArmorSkill = gmst.find("iBaseArmorSkill")->getInt();
|
||||
float fUnarmoredBase1 = gmst.find("fUnarmoredBase1")->getFloat();
|
||||
float fUnarmoredBase2 = gmst.find("fUnarmoredBase2")->getFloat();
|
||||
int unarmoredSkill = MWWorld::Class::get(ptr).getNpcStats(ptr).getSkill(ESM::Skill::Unarmored).getModified();
|
||||
int unarmoredSkill = stats.getSkill(ESM::Skill::Unarmored).getModified();
|
||||
|
||||
for (int i = 0; i < MWWorld::InventoryStore::Slots; ++i)
|
||||
int ratings[MWWorld::InventoryStore::Slots];
|
||||
for(int i = 0;i < MWWorld::InventoryStore::Slots;i++)
|
||||
{
|
||||
MWWorld::ContainerStoreIterator it = invStore.getSlot(i);
|
||||
if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name())
|
||||
|
@ -760,28 +761,27 @@ namespace MWClass
|
|||
}
|
||||
else
|
||||
{
|
||||
MWWorld::LiveCellRef<ESM::Armor> *ref =
|
||||
it->get<ESM::Armor>();
|
||||
MWWorld::LiveCellRef<ESM::Armor> *ref = it->get<ESM::Armor>();
|
||||
|
||||
int armorSkillType = MWWorld::Class::get(*it).getEquipmentSkill(*it);
|
||||
int armorSkill = MWWorld::Class::get(ptr).getNpcStats(ptr).getSkill(armorSkillType).getModified();
|
||||
int armorSkill = stats.getSkill(armorSkillType).getModified();
|
||||
|
||||
if (ref->mBase->mData.mWeight == 0)
|
||||
if(ref->mBase->mData.mWeight == 0)
|
||||
ratings[i] = ref->mBase->mData.mArmor;
|
||||
else
|
||||
ratings[i] = ref->mBase->mData.mArmor * armorSkill / iBaseArmorSkill;
|
||||
}
|
||||
}
|
||||
|
||||
float shield = MWWorld::Class::get(ptr).getCreatureStats(ptr).getMagicEffects().get(ESM::MagicEffect::Shield).mMagnitude;
|
||||
float shield = getCreatureStats(ptr).getMagicEffects().get(ESM::MagicEffect::Shield).mMagnitude;
|
||||
|
||||
return ratings[MWWorld::InventoryStore::Slot_Cuirass] * 0.3
|
||||
return ratings[MWWorld::InventoryStore::Slot_Cuirass] * 0.3f
|
||||
+ (ratings[MWWorld::InventoryStore::Slot_CarriedLeft] + ratings[MWWorld::InventoryStore::Slot_Helmet]
|
||||
+ ratings[MWWorld::InventoryStore::Slot_Greaves] + ratings[MWWorld::InventoryStore::Slot_Boots]
|
||||
+ ratings[MWWorld::InventoryStore::Slot_LeftPauldron] + ratings[MWWorld::InventoryStore::Slot_RightPauldron]
|
||||
) * 0.1
|
||||
+ (ratings[MWWorld::InventoryStore::Slot_LeftGauntlet] + MWWorld::InventoryStore::Slot_RightGauntlet)
|
||||
* 0.05
|
||||
) * 0.1f
|
||||
+ (ratings[MWWorld::InventoryStore::Slot_LeftGauntlet] + ratings[MWWorld::InventoryStore::Slot_RightGauntlet])
|
||||
* 0.05f
|
||||
+ shield;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue