forked from mirror/openmw-tes3mp
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
|
float Npc::getArmorRating (const MWWorld::Ptr& ptr) const
|
||||||
{
|
{
|
||||||
MWWorld::InventoryStore& invStore = MWWorld::Class::get(ptr).getInventoryStore(ptr);
|
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
const MWWorld::Store<ESM::GameSetting> &gmst =
|
const MWWorld::Store<ESM::GameSetting> &gmst = world->getStore().get<ESM::GameSetting>();
|
||||||
MWBase::Environment::get().getWorld()->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();
|
int iBaseArmorSkill = gmst.find("iBaseArmorSkill")->getInt();
|
||||||
float fUnarmoredBase1 = gmst.find("fUnarmoredBase1")->getFloat();
|
float fUnarmoredBase1 = gmst.find("fUnarmoredBase1")->getFloat();
|
||||||
float fUnarmoredBase2 = gmst.find("fUnarmoredBase2")->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);
|
MWWorld::ContainerStoreIterator it = invStore.getSlot(i);
|
||||||
if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name())
|
if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name())
|
||||||
|
@ -760,11 +761,10 @@ namespace MWClass
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MWWorld::LiveCellRef<ESM::Armor> *ref =
|
MWWorld::LiveCellRef<ESM::Armor> *ref = it->get<ESM::Armor>();
|
||||||
it->get<ESM::Armor>();
|
|
||||||
|
|
||||||
int armorSkillType = MWWorld::Class::get(*it).getEquipmentSkill(*it);
|
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;
|
ratings[i] = ref->mBase->mData.mArmor;
|
||||||
|
@ -773,15 +773,15 @@ namespace MWClass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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_CarriedLeft] + ratings[MWWorld::InventoryStore::Slot_Helmet]
|
||||||
+ ratings[MWWorld::InventoryStore::Slot_Greaves] + ratings[MWWorld::InventoryStore::Slot_Boots]
|
+ ratings[MWWorld::InventoryStore::Slot_Greaves] + ratings[MWWorld::InventoryStore::Slot_Boots]
|
||||||
+ ratings[MWWorld::InventoryStore::Slot_LeftPauldron] + ratings[MWWorld::InventoryStore::Slot_RightPauldron]
|
+ ratings[MWWorld::InventoryStore::Slot_LeftPauldron] + ratings[MWWorld::InventoryStore::Slot_RightPauldron]
|
||||||
) * 0.1
|
) * 0.1f
|
||||||
+ (ratings[MWWorld::InventoryStore::Slot_LeftGauntlet] + MWWorld::InventoryStore::Slot_RightGauntlet)
|
+ (ratings[MWWorld::InventoryStore::Slot_LeftGauntlet] + ratings[MWWorld::InventoryStore::Slot_RightGauntlet])
|
||||||
* 0.05
|
* 0.05f
|
||||||
+ shield;
|
+ shield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue