1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-25 20:11:34 +00:00

improves MWClass mapping (#3166)

Currently, we use a peculiar mapping of ESM classes by their std::type_info::name. This mapping is an undefined behaviour because std::type_info::name is strictly implementation defined. It could return a non-unique value on some platforms. With this PR we use the unsigned int sRecordId of the ESM class as a more efficient lookup type that does not build on undefined behaviour. We can expect marginally faster save-game loading with these changes as well.
This commit is contained in:
Bo Svensson 2021-10-11 11:46:21 +00:00 committed by GitHub
parent 98f8295765
commit ef906cbfa8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
64 changed files with 265 additions and 258 deletions

View file

@ -89,7 +89,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Activator); std::shared_ptr<Class> instance (new Activator);
registerClass (typeid (ESM::Activator).name(), instance); registerClass (ESM::Activator::sRecordId, instance);
} }
bool Activator::hasToolTip (const MWWorld::ConstPtr& ptr) const bool Activator::hasToolTip (const MWWorld::ConstPtr& ptr) const

View file

@ -69,7 +69,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Apparatus); std::shared_ptr<Class> instance (new Apparatus);
registerClass (typeid (ESM::Apparatus).name(), instance); registerClass (ESM::Apparatus::sRecordId, instance);
} }
std::string Apparatus::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Apparatus::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -163,7 +163,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Armor); std::shared_ptr<Class> instance (new Armor);
registerClass (typeid (ESM::Armor).name(), instance); registerClass (ESM::Armor::sRecordId, instance);
} }
std::string Armor::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Armor::getUpSoundId (const MWWorld::ConstPtr& ptr) const
@ -322,7 +322,7 @@ namespace MWClass
if(*slot == MWWorld::InventoryStore::Slot_CarriedLeft) if(*slot == MWWorld::InventoryStore::Slot_CarriedLeft)
{ {
MWWorld::ConstContainerStoreIterator weapon = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon != invStore.end() && weapon->getTypeName() == typeid(ESM::Weapon).name()) if(weapon != invStore.end() && weapon->getType() == ESM::Weapon::sRecordId)
{ {
const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>(); const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>();
if (MWMechanics::getWeaponType(ref->mBase->mData.mType)->mFlags & ESM::WeaponType::TwoHanded) if (MWMechanics::getWeaponType(ref->mBase->mData.mType)->mFlags & ESM::WeaponType::TwoHanded)

View file

@ -36,7 +36,7 @@ namespace MWClass
{ {
std::shared_ptr<MWWorld::Class> instance (new BodyPart); std::shared_ptr<MWWorld::Class> instance (new BodyPart);
registerClass (typeid (ESM::BodyPart).name(), instance); registerClass (ESM::BodyPart::sRecordId, instance);
} }
std::string BodyPart::getModel(const MWWorld::ConstPtr &ptr) const std::string BodyPart::getModel(const MWWorld::ConstPtr &ptr) const

View file

@ -85,7 +85,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Book); std::shared_ptr<Class> instance (new Book);
registerClass (typeid (ESM::Book).name(), instance); registerClass (ESM::Book::sRecordId, instance);
} }
std::string Book::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Book::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -121,7 +121,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Clothing); std::shared_ptr<Class> instance (new Clothing);
registerClass (typeid (ESM::Clothing).name(), instance); registerClass (ESM::Clothing::sRecordId, instance);
} }
std::string Clothing::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Clothing::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -242,7 +242,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Container); std::shared_ptr<Class> instance (new Container);
registerClass (typeid (ESM::Container).name(), instance); registerClass (ESM::Container::sRecordId, instance);
} }
bool Container::hasToolTip (const MWWorld::ConstPtr& ptr) const bool Container::hasToolTip (const MWWorld::ConstPtr& ptr) const

View file

@ -238,7 +238,7 @@ namespace MWClass
{ {
MWWorld::InventoryStore &inv = getInventoryStore(ptr); MWWorld::InventoryStore &inv = getInventoryStore(ptr);
MWWorld::ContainerStoreIterator weaponslot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ContainerStoreIterator weaponslot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if (weaponslot != inv.end() && weaponslot->getTypeName() == typeid(ESM::Weapon).name()) if (weaponslot != inv.end() && weaponslot->getType() == ESM::Weapon::sRecordId)
weapon = *weaponslot; weapon = *weaponslot;
} }
@ -497,7 +497,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Creature); std::shared_ptr<Class> instance (new Creature);
registerClass (typeid (ESM::Creature).name(), instance); registerClass (ESM::Creature::sRecordId, instance);
} }
float Creature::getMaxSpeed(const MWWorld::Ptr &ptr) const float Creature::getMaxSpeed(const MWWorld::Ptr &ptr) const

View file

@ -70,7 +70,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new CreatureLevList); std::shared_ptr<Class> instance (new CreatureLevList);
registerClass (typeid (ESM::CreatureLevList).name(), instance); registerClass (ESM::CreatureLevList::sRecordId, instance);
} }
void CreatureLevList::getModelsToPreload(const MWWorld::Ptr &ptr, std::vector<std::string> &models) const void CreatureLevList::getModelsToPreload(const MWWorld::Ptr &ptr, std::vector<std::string> &models) const

View file

@ -264,7 +264,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Door); std::shared_ptr<Class> instance (new Door);
registerClass (typeid (ESM::Door).name(), instance); registerClass (ESM::Door::sRecordId, instance);
} }
MWGui::ToolTipInfo Door::getToolTipInfo (const MWWorld::ConstPtr& ptr, int count) const MWGui::ToolTipInfo Door::getToolTipInfo (const MWWorld::ConstPtr& ptr, int count) const

View file

@ -81,7 +81,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Ingredient); std::shared_ptr<Class> instance (new Ingredient);
registerClass (typeid (ESM::Ingredient).name(), instance); registerClass (ESM::Ingredient::sRecordId, instance);
} }
std::string Ingredient::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Ingredient::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -19,6 +19,6 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new ItemLevList); std::shared_ptr<Class> instance (new ItemLevList);
registerClass (typeid (ESM::ItemLevList).name(), instance); registerClass (ESM::ItemLevList::sRecordId, instance);
} }
} }

View file

@ -124,7 +124,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Light); std::shared_ptr<Class> instance (new Light);
registerClass (typeid (ESM::Light).name(), instance); registerClass (ESM::Light::sRecordId, instance);
} }
std::string Light::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Light::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -80,7 +80,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Lockpick); std::shared_ptr<Class> instance (new Lockpick);
registerClass (typeid (ESM::Lockpick).name(), instance); registerClass (ESM::Lockpick::sRecordId, instance);
} }
std::string Lockpick::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Lockpick::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -106,7 +106,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Miscellaneous); std::shared_ptr<Class> instance (new Miscellaneous);
registerClass (typeid (ESM::Miscellaneous).name(), instance); registerClass (ESM::Miscellaneous::sRecordId, instance);
} }
std::string Miscellaneous::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Miscellaneous::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -459,12 +459,12 @@ namespace MWClass
if (equipped != invStore.end()) if (equipped != invStore.end())
{ {
std::vector<ESM::PartReference> parts; std::vector<ESM::PartReference> parts;
if(equipped->getTypeName() == typeid(ESM::Clothing).name()) if(equipped->getType() == ESM::Clothing::sRecordId)
{ {
const ESM::Clothing *clothes = equipped->get<ESM::Clothing>()->mBase; const ESM::Clothing *clothes = equipped->get<ESM::Clothing>()->mBase;
parts = clothes->mParts.mParts; parts = clothes->mParts.mParts;
} }
else if(equipped->getTypeName() == typeid(ESM::Armor).name()) else if(equipped->getType() == ESM::Armor::sRecordId)
{ {
const ESM::Armor *armor = equipped->get<ESM::Armor>()->mBase; const ESM::Armor *armor = equipped->get<ESM::Armor>()->mBase;
parts = armor->mParts.mParts; parts = armor->mParts.mParts;
@ -543,7 +543,7 @@ namespace MWClass
MWWorld::InventoryStore &inv = getInventoryStore(ptr); MWWorld::InventoryStore &inv = getInventoryStore(ptr);
MWWorld::ContainerStoreIterator weaponslot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ContainerStoreIterator weaponslot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
MWWorld::Ptr weapon = ((weaponslot != inv.end()) ? *weaponslot : MWWorld::Ptr()); MWWorld::Ptr weapon = ((weaponslot != inv.end()) ? *weaponslot : MWWorld::Ptr());
if(!weapon.isEmpty() && weapon.getTypeName() != typeid(ESM::Weapon).name()) if(!weapon.isEmpty() && weapon.getType() != ESM::Weapon::sRecordId)
weapon = MWWorld::Ptr(); weapon = MWWorld::Ptr();
MWMechanics::applyFatigueLoss(ptr, weapon, attackStrength); MWMechanics::applyFatigueLoss(ptr, weapon, attackStrength);
@ -766,7 +766,7 @@ namespace MWClass
MWWorld::InventoryStore &inv = getInventoryStore(ptr); MWWorld::InventoryStore &inv = getInventoryStore(ptr);
MWWorld::ContainerStoreIterator armorslot = inv.getSlot(hitslot); MWWorld::ContainerStoreIterator armorslot = inv.getSlot(hitslot);
MWWorld::Ptr armor = ((armorslot != inv.end()) ? *armorslot : MWWorld::Ptr()); MWWorld::Ptr armor = ((armorslot != inv.end()) ? *armorslot : MWWorld::Ptr());
bool hasArmor = !armor.isEmpty() && armor.getTypeName() == typeid(ESM::Armor).name(); bool hasArmor = !armor.isEmpty() && armor.getType() == ESM::Armor::sRecordId;
// If there's no item in the carried left slot or if it is not a shield redistribute the hit. // If there's no item in the carried left slot or if it is not a shield redistribute the hit.
if (!hasArmor && hitslot == MWWorld::InventoryStore::Slot_CarriedLeft) if (!hasArmor && hitslot == MWWorld::InventoryStore::Slot_CarriedLeft)
{ {
@ -778,7 +778,7 @@ namespace MWClass
if (armorslot != inv.end()) if (armorslot != inv.end())
{ {
armor = *armorslot; armor = *armorslot;
hasArmor = !armor.isEmpty() && armor.getTypeName() == typeid(ESM::Armor).name(); hasArmor = !armor.isEmpty() && armor.getType() == ESM::Armor::sRecordId;
} }
} }
if (hasArmor) if (hasArmor)
@ -1036,7 +1036,7 @@ namespace MWClass
void Npc::registerSelf() void Npc::registerSelf()
{ {
std::shared_ptr<Class> instance (new Npc); std::shared_ptr<Class> instance (new Npc);
registerClass (typeid (ESM::NPC).name(), instance); registerClass (ESM::NPC::sRecordId, instance);
} }
bool Npc::hasToolTip(const MWWorld::ConstPtr& ptr) const bool Npc::hasToolTip(const MWWorld::ConstPtr& ptr) const
@ -1135,7 +1135,7 @@ namespace MWClass
for(int i = 0;i < MWWorld::InventoryStore::Slots;i++) for(int i = 0;i < MWWorld::InventoryStore::Slots;i++)
{ {
MWWorld::ConstContainerStoreIterator it = invStore.getSlot(i); MWWorld::ConstContainerStoreIterator it = invStore.getSlot(i);
if (it == invStore.end() || it->getTypeName() != typeid(ESM::Armor).name()) if (it == invStore.end() || it->getType() != ESM::Armor::sRecordId)
{ {
// unarmored // unarmored
ratings[i] = (fUnarmoredBase1 * unarmoredSkill) * (fUnarmoredBase2 * unarmoredSkill); ratings[i] = (fUnarmoredBase1 * unarmoredSkill) * (fUnarmoredBase2 * unarmoredSkill);
@ -1232,7 +1232,7 @@ namespace MWClass
const MWWorld::InventoryStore &inv = Npc::getInventoryStore(ptr); const MWWorld::InventoryStore &inv = Npc::getInventoryStore(ptr);
MWWorld::ConstContainerStoreIterator boots = inv.getSlot(MWWorld::InventoryStore::Slot_Boots); MWWorld::ConstContainerStoreIterator boots = inv.getSlot(MWWorld::InventoryStore::Slot_Boots);
if(boots == inv.end() || boots->getTypeName() != typeid(ESM::Armor).name()) if(boots == inv.end() || boots->getType() != ESM::Armor::sRecordId)
return (name == "left") ? "FootBareLeft" : "FootBareRight"; return (name == "left") ? "FootBareLeft" : "FootBareRight";
switch(boots->getClass().getEquipmentSkill(*boots)) switch(boots->getClass().getEquipmentSkill(*boots))

View file

@ -74,7 +74,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Potion); std::shared_ptr<Class> instance (new Potion);
registerClass (typeid (ESM::Potion).name(), instance); registerClass (ESM::Potion::sRecordId, instance);
} }
std::string Potion::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Potion::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -80,7 +80,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Probe); std::shared_ptr<Class> instance (new Probe);
registerClass (typeid (ESM::Probe).name(), instance); registerClass (ESM::Probe::sRecordId, instance);
} }
std::string Probe::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Probe::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -69,7 +69,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Repair); std::shared_ptr<Class> instance (new Repair);
registerClass (typeid (ESM::Repair).name(), instance); registerClass (ESM::Repair::sRecordId, instance);
} }
std::string Repair::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Repair::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -59,7 +59,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Static); std::shared_ptr<Class> instance (new Static);
registerClass (typeid (ESM::Static).name(), instance); registerClass (ESM::Static::sRecordId, instance);
} }
MWWorld::Ptr Static::copyToCellImpl(const MWWorld::ConstPtr &ptr, MWWorld::CellStore &cell) const MWWorld::Ptr Static::copyToCellImpl(const MWWorld::ConstPtr &ptr, MWWorld::CellStore &cell) const

View file

@ -125,7 +125,7 @@ namespace MWClass
{ {
std::shared_ptr<Class> instance (new Weapon); std::shared_ptr<Class> instance (new Weapon);
registerClass (typeid (ESM::Weapon).name(), instance); registerClass (ESM::Weapon::sRecordId, instance);
} }
std::string Weapon::getUpSoundId (const MWWorld::ConstPtr& ptr) const std::string Weapon::getUpSoundId (const MWWorld::ConstPtr& ptr) const

View file

@ -23,7 +23,7 @@
bool MWDialogue::Filter::testActor (const ESM::DialInfo& info) const bool MWDialogue::Filter::testActor (const ESM::DialInfo& info) const
{ {
bool isCreature = (mActor.getTypeName() != typeid (ESM::NPC).name()); bool isCreature = (mActor.getType() != ESM::NPC::sRecordId);
// actor id // actor id
if (!info.mActor.empty()) if (!info.mActor.empty())
@ -160,7 +160,7 @@ bool MWDialogue::Filter::testSelectStructs (const ESM::DialInfo& info) const
bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info, bool invert) const bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info, bool invert) const
{ {
bool isCreature = (mActor.getTypeName() != typeid (ESM::NPC).name()); bool isCreature = (mActor.getType() != ESM::NPC::sRecordId);
if (isCreature) if (isCreature)
return true; return true;
@ -207,7 +207,7 @@ bool MWDialogue::Filter::testFunctionLocal(const MWDialogue::SelectWrapper& sele
bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const
{ {
if (select.isNpcOnly() && (mActor.getTypeName() != typeid (ESM::NPC).name())) if (select.isNpcOnly() && (mActor.getType() != ESM::NPC::sRecordId))
// If the actor is a creature, we pass all conditions only applicable to NPCs. // If the actor is a creature, we pass all conditions only applicable to NPCs.
return true; return true;
@ -452,7 +452,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
{ {
if (target.getClass().isNpc() && target.getClass().getNpcStats(target).isWerewolf()) if (target.getClass().isNpc() && target.getClass().getNpcStats(target).isWerewolf())
return 2; return 2;
if (target.getTypeName() == typeid(ESM::Creature).name()) if (target.getType() == ESM::Creature::sRecordId)
return 1; return 1;
} }
} }

View file

@ -194,7 +194,7 @@ namespace MWGui
for (size_t i = 0; i < mModel->getItemCount(); ++i) for (size_t i = 0; i < mModel->getItemCount(); ++i)
{ {
MWWorld::Ptr item = mModel->getItem(i).mBase; MWWorld::Ptr item = mModel->getItem(i).mBase;
if (item.getTypeName() != typeid(ESM::Ingredient).name()) if (item.getType() != ESM::Ingredient::sRecordId)
continue; continue;
itemNames.insert(item.getClass().getName(item)); itemNames.insert(item.getClass().getName(item));

View file

@ -209,7 +209,7 @@ bool ContainerItemModel::onDropItem(const MWWorld::Ptr &item, int count)
MWWorld::Ptr target = mItemSources[0].first; MWWorld::Ptr target = mItemSources[0].first;
if (target.getTypeName() != typeid(ESM::Container).name()) if (target.getType() != ESM::Container::sRecordId)
return true; return true;
// check container organic flag // check container organic flag

View file

@ -508,13 +508,13 @@ namespace MWGui
int services = mPtr.getClass().getServices(mPtr); int services = mPtr.getClass().getServices(mPtr);
bool travel = (mPtr.getTypeName() == typeid(ESM::NPC).name() && !mPtr.get<ESM::NPC>()->mBase->getTransport().empty()) bool travel = (mPtr.getType() == ESM::NPC::sRecordId && !mPtr.get<ESM::NPC>()->mBase->getTransport().empty())
|| (mPtr.getTypeName() == typeid(ESM::Creature).name() && !mPtr.get<ESM::Creature>()->mBase->getTransport().empty()); || (mPtr.getType() == ESM::Creature::sRecordId && !mPtr.get<ESM::Creature>()->mBase->getTransport().empty());
const MWWorld::Store<ESM::GameSetting> &gmst = const MWWorld::Store<ESM::GameSetting> &gmst =
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>(); MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
if (mPtr.getTypeName() == typeid(ESM::NPC).name()) if (mPtr.getType() == ESM::NPC::sRecordId)
mTopicsList->addItem(gmst.find("sPersuasion")->mValue.getString()); mTopicsList->addItem(gmst.find("sPersuasion")->mValue.getString());
if (services & ESM::NPC::AllItems) if (services & ESM::NPC::AllItems)

View file

@ -46,7 +46,7 @@ namespace
bool isRightHandWeapon(const MWWorld::Ptr& item) bool isRightHandWeapon(const MWWorld::Ptr& item)
{ {
if (item.getClass().getTypeName() != typeid(ESM::Weapon).name()) if (item.getClass().getType() != ESM::Weapon::sRecordId)
return false; return false;
std::vector<int> equipmentSlots = item.getClass().getEquipmentSlots(item).first; std::vector<int> equipmentSlots = item.getClass().getEquipmentSlots(item).first;
return (!equipmentSlots.empty() && equipmentSlots.front() == MWWorld::InventoryStore::Slot_CarriedRight); return (!equipmentSlots.empty() && equipmentSlots.front() == MWWorld::InventoryStore::Slot_CarriedRight);
@ -281,7 +281,7 @@ namespace MWGui
// If we unequip weapon during attack, it can lead to unexpected behaviour // If we unequip weapon during attack, it can lead to unexpected behaviour
if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(mPtr)) if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(mPtr))
{ {
bool isWeapon = item.mBase.getTypeName() == typeid(ESM::Weapon).name(); bool isWeapon = item.mBase.getType() == ESM::Weapon::sRecordId;
MWWorld::InventoryStore& invStore = mPtr.getClass().getInventoryStore(mPtr); MWWorld::InventoryStore& invStore = mPtr.getClass().getInventoryStore(mPtr);
if (isWeapon && invStore.isEquipped(item.mBase)) if (isWeapon && invStore.isEquipped(item.mBase))
@ -555,9 +555,9 @@ namespace MWGui
if (!script.empty()) if (!script.empty())
{ {
// Ingredients, books and repair hammers must not have OnPCEquip set to 1 here // Ingredients, books and repair hammers must not have OnPCEquip set to 1 here
const std::string& type = ptr.getTypeName(); auto type = ptr.getType();
bool isBook = type == typeid(ESM::Book).name(); bool isBook = type == ESM::Book::sRecordId;
if (!isBook && type != typeid(ESM::Ingredient).name() && type != typeid(ESM::Repair).name()) if (!isBook && type != ESM::Ingredient::sRecordId && type != ESM::Repair::sRecordId)
ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 1); ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 1);
// Books must have PCSkipEquip set to 1 instead // Books must have PCSkipEquip set to 1 instead
else if (isBook) else if (isBook)
@ -593,8 +593,8 @@ namespace MWGui
useItem(ptr); useItem(ptr);
// If item is ingredient or potion don't stop drag and drop to simplify action of taking more than one 1 item // If item is ingredient or potion don't stop drag and drop to simplify action of taking more than one 1 item
if ((ptr.getTypeName() == typeid(ESM::Potion).name() || if ((ptr.getType() == ESM::Potion::sRecordId ||
ptr.getTypeName() == typeid(ESM::Ingredient).name()) ptr.getType() == ESM::Ingredient::sRecordId)
&& mDragAndDrop->mDraggedCount > 1) && mDragAndDrop->mDraggedCount > 1)
{ {
// Item can be provided from other window for example container. // Item can be provided from other window for example container.
@ -704,19 +704,19 @@ namespace MWGui
if (!MWBase::Environment::get().getWindowManager()->isAllowed(GW_Inventory)) if (!MWBase::Environment::get().getWindowManager()->isAllowed(GW_Inventory))
return; return;
// make sure the object is of a type that can be picked up // make sure the object is of a type that can be picked up
const std::string& type = object.getTypeName(); auto type = object.getType();
if ( (type != typeid(ESM::Apparatus).name()) if ( (type != ESM::Apparatus::sRecordId)
&& (type != typeid(ESM::Armor).name()) && (type != ESM::Armor::sRecordId)
&& (type != typeid(ESM::Book).name()) && (type != ESM::Book::sRecordId)
&& (type != typeid(ESM::Clothing).name()) && (type != ESM::Clothing::sRecordId)
&& (type != typeid(ESM::Ingredient).name()) && (type != ESM::Ingredient::sRecordId)
&& (type != typeid(ESM::Light).name()) && (type != ESM::Light::sRecordId)
&& (type != typeid(ESM::Miscellaneous).name()) && (type != ESM::Miscellaneous::sRecordId)
&& (type != typeid(ESM::Lockpick).name()) && (type != ESM::Lockpick::sRecordId)
&& (type != typeid(ESM::Probe).name()) && (type != ESM::Probe::sRecordId)
&& (type != typeid(ESM::Repair).name()) && (type != ESM::Repair::sRecordId)
&& (type != typeid(ESM::Weapon).name()) && (type != ESM::Weapon::sRecordId)
&& (type != typeid(ESM::Potion).name())) && (type != ESM::Potion::sRecordId))
return; return;
// An object that can be picked up must have a tooltip. // An object that can be picked up must have a tooltip.
@ -809,7 +809,7 @@ namespace MWGui
lastId = item.getCellRef().getRefId(); lastId = item.getCellRef().getRefId();
if (item.getClass().getTypeName() == typeid(ESM::Weapon).name() && if (item.getClass().getType() == ESM::Weapon::sRecordId &&
isRightHandWeapon(item) && isRightHandWeapon(item) &&
item.getClass().canBeEquipped(item, player).first) item.getClass().canBeEquipped(item, player).first)
{ {

View file

@ -387,9 +387,9 @@ namespace MWGui
if (key->type == Type_Item) if (key->type == Type_Item)
{ {
bool isWeapon = item.getTypeName() == typeid(ESM::Weapon).name(); bool isWeapon = item.getType() == ESM::Weapon::sRecordId;
bool isTool = item.getTypeName() == typeid(ESM::Probe).name() || bool isTool = item.getType() == ESM::Probe::sRecordId ||
item.getTypeName() == typeid(ESM::Lockpick).name(); item.getType() == ESM::Lockpick::sRecordId;
// delay weapon switching if player is busy // delay weapon switching if player is busy
if (isDelayNeeded && (isWeapon || isTool)) if (isDelayNeeded && (isWeapon || isTool))

View file

@ -27,22 +27,22 @@
namespace namespace
{ {
bool compareType(const std::string& type1, const std::string& type2) bool compareType(unsigned int type1, unsigned int type2)
{ {
// this defines the sorting order of types. types that are first in the vector appear before other types. // this defines the sorting order of types. types that are first in the vector appear before other types.
std::vector<std::string> mapping; std::vector<unsigned int> mapping;
mapping.emplace_back(typeid(ESM::Weapon).name() ); mapping.emplace_back(ESM::Weapon::sRecordId );
mapping.emplace_back(typeid(ESM::Armor).name() ); mapping.emplace_back(ESM::Armor::sRecordId );
mapping.emplace_back(typeid(ESM::Clothing).name() ); mapping.emplace_back(ESM::Clothing::sRecordId );
mapping.emplace_back(typeid(ESM::Potion).name() ); mapping.emplace_back(ESM::Potion::sRecordId );
mapping.emplace_back(typeid(ESM::Ingredient).name() ); mapping.emplace_back(ESM::Ingredient::sRecordId );
mapping.emplace_back(typeid(ESM::Apparatus).name() ); mapping.emplace_back(ESM::Apparatus::sRecordId );
mapping.emplace_back(typeid(ESM::Book).name() ); mapping.emplace_back(ESM::Book::sRecordId );
mapping.emplace_back(typeid(ESM::Light).name() ); mapping.emplace_back(ESM::Light::sRecordId );
mapping.emplace_back(typeid(ESM::Miscellaneous).name() ); mapping.emplace_back(ESM::Miscellaneous::sRecordId );
mapping.emplace_back(typeid(ESM::Lockpick).name() ); mapping.emplace_back(ESM::Lockpick::sRecordId );
mapping.emplace_back(typeid(ESM::Repair).name() ); mapping.emplace_back(ESM::Repair::sRecordId );
mapping.emplace_back(typeid(ESM::Probe).name() ); mapping.emplace_back(ESM::Probe::sRecordId );
assert( std::find(mapping.begin(), mapping.end(), type1) != mapping.end() ); assert( std::find(mapping.begin(), mapping.end(), type1) != mapping.end() );
assert( std::find(mapping.begin(), mapping.end(), type2) != mapping.end() ); assert( std::find(mapping.begin(), mapping.end(), type2) != mapping.end() );
@ -62,15 +62,15 @@ namespace
float result = 0; float result = 0;
// compare items by type // compare items by type
std::string leftName = left.mBase.getTypeName(); auto leftType = left.mBase.getType();
std::string rightName = right.mBase.getTypeName(); auto rightType = right.mBase.getType();
if (leftName != rightName) if (leftType != rightType)
return compareType(leftName, rightName); return compareType(leftType, rightType);
// compare items by name // compare items by name
leftName = Misc::StringUtils::lowerCaseUtf8(left.mBase.getClass().getName(left.mBase)); std::string leftName = Misc::StringUtils::lowerCaseUtf8(left.mBase.getClass().getName(left.mBase));
rightName = Misc::StringUtils::lowerCaseUtf8(right.mBase.getClass().getName(right.mBase)); std::string rightName = Misc::StringUtils::lowerCaseUtf8(right.mBase.getClass().getName(right.mBase));
result = leftName.compare(rightName); result = leftName.compare(rightName);
if (result != 0) if (result != 0)
@ -179,22 +179,22 @@ namespace MWGui
MWWorld::Ptr base = item.mBase; MWWorld::Ptr base = item.mBase;
int category = 0; int category = 0;
if (base.getTypeName() == typeid(ESM::Armor).name() if (base.getType() == ESM::Armor::sRecordId
|| base.getTypeName() == typeid(ESM::Clothing).name()) || base.getType() == ESM::Clothing::sRecordId)
category = Category_Apparel; category = Category_Apparel;
else if (base.getTypeName() == typeid(ESM::Weapon).name()) else if (base.getType() == ESM::Weapon::sRecordId)
category = Category_Weapon; category = Category_Weapon;
else if (base.getTypeName() == typeid(ESM::Ingredient).name() else if (base.getType() == ESM::Ingredient::sRecordId
|| base.getTypeName() == typeid(ESM::Potion).name()) || base.getType() == ESM::Potion::sRecordId)
category = Category_Magic; category = Category_Magic;
else if (base.getTypeName() == typeid(ESM::Miscellaneous).name() else if (base.getType() == ESM::Miscellaneous::sRecordId
|| base.getTypeName() == typeid(ESM::Ingredient).name() || base.getType() == ESM::Ingredient::sRecordId
|| base.getTypeName() == typeid(ESM::Repair).name() || base.getType() == ESM::Repair::sRecordId
|| base.getTypeName() == typeid(ESM::Lockpick).name() || base.getType() == ESM::Lockpick::sRecordId
|| base.getTypeName() == typeid(ESM::Light).name() || base.getType() == ESM::Light::sRecordId
|| base.getTypeName() == typeid(ESM::Apparatus).name() || base.getType() == ESM::Apparatus::sRecordId
|| base.getTypeName() == typeid(ESM::Book).name() || base.getType() == ESM::Book::sRecordId
|| base.getTypeName() == typeid(ESM::Probe).name()) || base.getType() == ESM::Probe::sRecordId)
category = Category_Misc; category = Category_Misc;
if (item.mFlags & ItemStack::Flag_Enchanted) if (item.mFlags & ItemStack::Flag_Enchanted)
@ -205,7 +205,7 @@ namespace MWGui
if (mFilter & Filter_OnlyIngredients) if (mFilter & Filter_OnlyIngredients)
{ {
if (base.getTypeName() != typeid(ESM::Ingredient).name()) if (base.getType() != ESM::Ingredient::sRecordId)
return false; return false;
if (!mNameFilter.empty() && !mEffectFilter.empty()) if (!mNameFilter.empty() && !mEffectFilter.empty())
@ -238,18 +238,18 @@ namespace MWGui
if ((mFilter & Filter_OnlyEnchanted) && !(item.mFlags & ItemStack::Flag_Enchanted)) if ((mFilter & Filter_OnlyEnchanted) && !(item.mFlags & ItemStack::Flag_Enchanted))
return false; return false;
if ((mFilter & Filter_OnlyChargedSoulstones) && (base.getTypeName() != typeid(ESM::Miscellaneous).name() if ((mFilter & Filter_OnlyChargedSoulstones) && (base.getType() != ESM::Miscellaneous::sRecordId
|| base.getCellRef().getSoul() == "" || !MWBase::Environment::get().getWorld()->getStore().get<ESM::Creature>().search(base.getCellRef().getSoul()))) || base.getCellRef().getSoul() == "" || !MWBase::Environment::get().getWorld()->getStore().get<ESM::Creature>().search(base.getCellRef().getSoul())))
return false; return false;
if ((mFilter & Filter_OnlyRepairTools) && (base.getTypeName() != typeid(ESM::Repair).name())) if ((mFilter & Filter_OnlyRepairTools) && (base.getType() != ESM::Repair::sRecordId))
return false; return false;
if ((mFilter & Filter_OnlyEnchantable) && (item.mFlags & ItemStack::Flag_Enchanted if ((mFilter & Filter_OnlyEnchantable) && (item.mFlags & ItemStack::Flag_Enchanted
|| (base.getTypeName() != typeid(ESM::Armor).name() || (base.getType() != ESM::Armor::sRecordId
&& base.getTypeName() != typeid(ESM::Clothing).name() && base.getType() != ESM::Clothing::sRecordId
&& base.getTypeName() != typeid(ESM::Weapon).name() && base.getType() != ESM::Weapon::sRecordId
&& base.getTypeName() != typeid(ESM::Book).name()))) && base.getType() != ESM::Book::sRecordId)))
return false; return false;
if ((mFilter & Filter_OnlyEnchantable) && base.getTypeName() == typeid(ESM::Book).name() if ((mFilter & Filter_OnlyEnchantable) && base.getType() == ESM::Book::sRecordId
&& !base.get<ESM::Book>()->mBase->mData.mIsScroll) && !base.get<ESM::Book>()->mBase->mData.mIsScroll)
return false; return false;
@ -263,8 +263,8 @@ namespace MWGui
if ((mFilter & Filter_OnlyRepairable) && ( if ((mFilter & Filter_OnlyRepairable) && (
!base.getClass().hasItemHealth(base) !base.getClass().hasItemHealth(base)
|| (base.getClass().getItemHealth(base) == base.getClass().getItemMaxHealth(base)) || (base.getClass().getItemHealth(base) == base.getClass().getItemMaxHealth(base))
|| (base.getTypeName() != typeid(ESM::Weapon).name() || (base.getType() != ESM::Weapon::sRecordId
&& base.getTypeName() != typeid(ESM::Armor).name()))) && base.getType() != ESM::Armor::sRecordId)))
return false; return false;
if (mFilter & Filter_OnlyRechargable) if (mFilter & Filter_OnlyRechargable)

View file

@ -115,7 +115,7 @@ namespace MWGui
std::vector<ESM::Transport::Dest> transport; std::vector<ESM::Transport::Dest> transport;
if (mPtr.getClass().isNpc()) if (mPtr.getClass().isNpc())
transport = mPtr.get<ESM::NPC>()->mBase->getTransport(); transport = mPtr.get<ESM::NPC>()->mBase->getTransport();
else if (mPtr.getTypeName() == typeid(ESM::Creature).name()) else if (mPtr.getType() == ESM::Creature::sRecordId)
transport = mPtr.get<ESM::Creature>()->mBase->getTransport(); transport = mPtr.get<ESM::Creature>()->mBase->getTransport();
for(unsigned int i = 0;i<transport.size();i++) for(unsigned int i = 0;i<transport.size();i++)

View file

@ -23,7 +23,7 @@ namespace MWLua
return std::to_string(id.mIndex) + "_" + std::to_string(id.mContentFile); return std::to_string(id.mIndex) + "_" + std::to_string(id.mContentFile);
} }
const static std::map<std::type_index, std::string_view> classNames = { const static std::map<std::type_index, std::string> classNames = {
{typeid(MWClass::Activator), "Activator"}, {typeid(MWClass::Activator), "Activator"},
{typeid(MWClass::Armor), "Armor"}, {typeid(MWClass::Armor), "Armor"},
{typeid(MWClass::Book), "Book"}, {typeid(MWClass::Book), "Book"},
@ -40,7 +40,7 @@ namespace MWLua
{typeid(MWClass::Weapon), "Weapon"}, {typeid(MWClass::Weapon), "Weapon"},
}; };
std::string_view getMWClassName(const std::type_index& cls_type, std::string_view fallback) std::string getMWClassName(const std::type_index& cls_type, std::string fallback)
{ {
auto it = classNames.find(cls_type); auto it = classNames.find(cls_type);
if (it != classNames.end()) if (it != classNames.end())
@ -55,13 +55,13 @@ namespace MWLua
return id == "prisonmarker" || id == "divinemarker" || id == "templemarker" || id == "northmarker"; return id == "prisonmarker" || id == "divinemarker" || id == "templemarker" || id == "northmarker";
} }
std::string_view getMWClassName(const MWWorld::Ptr& ptr) std::string getMWClassName(const MWWorld::Ptr& ptr)
{ {
if (ptr.getCellRef().getRefIdRef() == "player") if (ptr.getCellRef().getRefIdRef() == "player")
return "Player"; return "Player";
if (isMarker(ptr)) if (isMarker(ptr))
return "Marker"; return "Marker";
return getMWClassName(typeid(ptr.getClass()), ptr.getTypeName()); return ptr.getTypeDescription();
} }
std::string ptrToString(const MWWorld::Ptr& ptr) std::string ptrToString(const MWWorld::Ptr& ptr)

View file

@ -19,8 +19,8 @@ namespace MWLua
std::string idToString(const ObjectId& id); std::string idToString(const ObjectId& id);
std::string ptrToString(const MWWorld::Ptr& ptr); std::string ptrToString(const MWWorld::Ptr& ptr);
bool isMarker(const MWWorld::Ptr& ptr); bool isMarker(const MWWorld::Ptr& ptr);
std::string_view getMWClassName(const std::type_index& cls_type, std::string_view fallback = "Unknown"); std::string getMWClassName(const std::type_index& cls_type, std::string fallback = "Unknown");
std::string_view getMWClassName(const MWWorld::Ptr& ptr); std::string getMWClassName(const MWWorld::Ptr& ptr);
// Holds a mapping ObjectId -> MWWord::Ptr. // Holds a mapping ObjectId -> MWWord::Ptr.
class ObjectRegistry class ObjectRegistry

View file

@ -879,7 +879,7 @@ namespace MWMechanics
MWWorld::ContainerStoreIterator torch = inventoryStore.end(); MWWorld::ContainerStoreIterator torch = inventoryStore.end();
for (MWWorld::ContainerStoreIterator it = inventoryStore.begin(); it != inventoryStore.end(); ++it) for (MWWorld::ContainerStoreIterator it = inventoryStore.begin(); it != inventoryStore.end(); ++it)
{ {
if (it->getTypeName() == typeid(ESM::Light).name() && if (it->getType() == ESM::Light::sRecordId &&
it->getClass().canBeEquipped(*it, ptr).first) it->getClass().canBeEquipped(*it, ptr).first)
{ {
torch = it; torch = it;
@ -894,10 +894,10 @@ namespace MWMechanics
if (!ptr.getClass().getCreatureStats (ptr).getAiSequence().isInCombat()) if (!ptr.getClass().getCreatureStats (ptr).getAiSequence().isInCombat())
{ {
// For non-hostile NPCs, unequip whatever is in the left slot in favor of a light. // For non-hostile NPCs, unequip whatever is in the left slot in favor of a light.
if (heldIter != inventoryStore.end() && heldIter->getTypeName() != typeid(ESM::Light).name()) if (heldIter != inventoryStore.end() && heldIter->getType() != ESM::Light::sRecordId)
inventoryStore.unequipItem(*heldIter, ptr); inventoryStore.unequipItem(*heldIter, ptr);
} }
else if (heldIter == inventoryStore.end() || heldIter->getTypeName() == typeid(ESM::Light).name()) else if (heldIter == inventoryStore.end() || heldIter->getType() == ESM::Light::sRecordId)
{ {
// For hostile NPCs, see if they have anything better to equip first // For hostile NPCs, see if they have anything better to equip first
auto shield = inventoryStore.getPreferredShield(ptr); auto shield = inventoryStore.getPreferredShield(ptr);
@ -916,7 +916,7 @@ namespace MWMechanics
} }
else else
{ {
if (heldIter != inventoryStore.end() && heldIter->getTypeName() == typeid(ESM::Light).name()) if (heldIter != inventoryStore.end() && heldIter->getType() == ESM::Light::sRecordId)
{ {
// At day, unequip lights and auto equip shields or other suitable items // At day, unequip lights and auto equip shields or other suitable items
// (Note: autoEquip will ignore lights) // (Note: autoEquip will ignore lights)
@ -1708,7 +1708,7 @@ namespace MWMechanics
MWBase::Environment::get().getDialogueManager()->say(iter->first, "hit"); MWBase::Environment::get().getDialogueManager()->say(iter->first, "hit");
// Apply soultrap // Apply soultrap
if (iter->first.getTypeName() == typeid(ESM::Creature).name()) if (iter->first.getType() == ESM::Creature::sRecordId)
soulTrap(iter->first); soulTrap(iter->first);
// Magic effects will be reset later, and the magic effect that could kill the actor // Magic effects will be reset later, and the magic effect that could kill the actor

View file

@ -383,7 +383,7 @@ void CharacterController::refreshJumpAnims(const std::string& weapShortGroup, Ju
bool CharacterController::onOpen() bool CharacterController::onOpen()
{ {
if (mPtr.getTypeName() == typeid(ESM::Container).name()) if (mPtr.getType() == ESM::Container::sRecordId)
{ {
if (!mAnimation->hasAnimation("containeropen")) if (!mAnimation->hasAnimation("containeropen"))
return true; return true;
@ -404,7 +404,7 @@ bool CharacterController::onOpen()
void CharacterController::onClose() void CharacterController::onClose()
{ {
if (mPtr.getTypeName() == typeid(ESM::Container).name()) if (mPtr.getType() == ESM::Container::sRecordId)
{ {
if (!mAnimation->hasAnimation("containerclose")) if (!mAnimation->hasAnimation("containerclose"))
return; return;
@ -591,7 +591,7 @@ void CharacterController::refreshMovementAnims(const std::string& weapShortGroup
// even if we are running. This must be replicated, otherwise the observed speed would differ drastically. // even if we are running. This must be replicated, otherwise the observed speed would differ drastically.
std::string anim = mCurrentMovement; std::string anim = mCurrentMovement;
mAdjustMovementAnimSpeed = true; mAdjustMovementAnimSpeed = true;
if (mPtr.getClass().getTypeName() == typeid(ESM::Creature).name() if (mPtr.getClass().getType() == ESM::Creature::sRecordId
&& !(mPtr.get<ESM::Creature>()->mBase->mFlags & ESM::Creature::Flies)) && !(mPtr.get<ESM::Creature>()->mBase->mFlags & ESM::Creature::Flies))
{ {
CharacterState walkState = runStateToWalkState(mMovementState); CharacterState walkState = runStateToWalkState(mMovementState);
@ -1432,7 +1432,7 @@ bool CharacterController::updateWeaponState(CharacterState& idle)
{ {
MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr); MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = getActiveWeapon(mPtr, &weaptype); MWWorld::ConstContainerStoreIterator weapon = getActiveWeapon(mPtr, &weaptype);
isWeapon = (weapon != inv.end() && weapon->getTypeName() == typeid(ESM::Weapon).name()); isWeapon = (weapon != inv.end() && weapon->getType() == ESM::Weapon::sRecordId);
if (isWeapon) if (isWeapon)
{ {
weapSpeed = weapon->get<ESM::Weapon>()->mBase->mData.mSpeed; weapSpeed = weapon->get<ESM::Weapon>()->mBase->mData.mSpeed;
@ -1467,7 +1467,7 @@ bool CharacterController::updateWeaponState(CharacterState& idle)
mAttackStrength = 0; mAttackStrength = 0;
// Randomize attacks for non-bipedal creatures with Weapon flag // Randomize attacks for non-bipedal creatures with Weapon flag
if (mPtr.getClass().getTypeName() == typeid(ESM::Creature).name() && if (mPtr.getClass().getType() == ESM::Creature::sRecordId &&
!mPtr.getClass().isBipedal(mPtr) && !mPtr.getClass().isBipedal(mPtr) &&
(!mAnimation->hasAnimation(mCurrentWeapon) || isRandomAttackAnimation(mCurrentWeapon))) (!mAnimation->hasAnimation(mCurrentWeapon) || isRandomAttackAnimation(mCurrentWeapon)))
{ {
@ -1590,9 +1590,9 @@ bool CharacterController::updateWeaponState(CharacterState& idle)
if(!target.isEmpty()) if(!target.isEmpty())
{ {
if(item.getTypeName() == typeid(ESM::Lockpick).name()) if(item.getType() == ESM::Lockpick::sRecordId)
Security(mPtr).pickLock(target, item, resultMessage, resultSound); Security(mPtr).pickLock(target, item, resultMessage, resultSound);
else if(item.getTypeName() == typeid(ESM::Probe).name()) else if(item.getType() == ESM::Probe::sRecordId)
Security(mPtr).probeTrap(target, item, resultMessage, resultSound); Security(mPtr).probeTrap(target, item, resultMessage, resultSound);
} }
mAnimation->play(mCurrentWeapon, priorityWeapon, mAnimation->play(mCurrentWeapon, priorityWeapon,
@ -1867,7 +1867,7 @@ bool CharacterController::updateWeaponState(CharacterState& idle)
{ {
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name() if(torch != inv.end() && torch->getType() == ESM::Light::sRecordId
&& updateCarriedLeftVisible(mWeaponType)) && updateCarriedLeftVisible(mWeaponType))
{ {
if (mAnimation->isPlaying("shield")) if (mAnimation->isPlaying("shield"))

View file

@ -71,7 +71,7 @@ namespace MWMechanics
MWWorld::InventoryStore& inv = blocker.getClass().getInventoryStore(blocker); MWWorld::InventoryStore& inv = blocker.getClass().getInventoryStore(blocker);
MWWorld::ContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); MWWorld::ContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
if (shield == inv.end() || shield->getTypeName() != typeid(ESM::Armor).name()) if (shield == inv.end() || shield->getType() != ESM::Armor::sRecordId)
return false; return false;
if (!blocker.getRefData().getBaseNode()) if (!blocker.getRefData().getBaseNode())

View file

@ -29,11 +29,11 @@ namespace MWMechanics
{ {
mOldItemPtr=oldItem; mOldItemPtr=oldItem;
mWeaponType = -1; mWeaponType = -1;
mObjectType.clear(); mObjectType = 0;
if(!itemEmpty()) if(!itemEmpty())
{ {
mObjectType = mOldItemPtr.getTypeName(); mObjectType = mOldItemPtr.getType();
if (mObjectType == typeid(ESM::Weapon).name()) if (mObjectType == ESM::Weapon::sRecordId)
mWeaponType = mOldItemPtr.get<ESM::Weapon>()->mBase->mData.mType; mWeaponType = mOldItemPtr.get<ESM::Weapon>()->mBase->mData.mType;
} }
} }
@ -115,7 +115,7 @@ namespace MWMechanics
const bool powerfulSoul = getGemCharge() >= \ const bool powerfulSoul = getGemCharge() >= \
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find ("iSoulAmountForConstantEffect")->mValue.getInteger(); MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find ("iSoulAmountForConstantEffect")->mValue.getInteger();
if ((mObjectType == typeid(ESM::Armor).name()) || (mObjectType == typeid(ESM::Clothing).name())) if ((mObjectType == ESM::Armor::sRecordId) || (mObjectType == ESM::Clothing::sRecordId))
{ // Armor or Clothing { // Armor or Clothing
switch(mCastStyle) switch(mCastStyle)
{ {
@ -150,7 +150,7 @@ namespace MWMechanics
return; return;
} }
} }
else if(mObjectType == typeid(ESM::Book).name()) else if(mObjectType == ESM::Book::sRecordId)
{ // Scroll or Book { // Scroll or Book
mCastStyle = ESM::Enchantment::CastOnce; mCastStyle = ESM::Enchantment::CastOnce;
return; return;

View file

@ -23,7 +23,7 @@ namespace MWMechanics
ESM::EffectList mEffectList; ESM::EffectList mEffectList;
std::string mNewItemName; std::string mNewItemName;
std::string mObjectType; unsigned int mObjectType;
int mWeaponType; int mWeaponType;
const ESM::Enchantment* getRecord(const ESM::Enchantment& newEnchantment) const; const ESM::Enchantment* getRecord(const ESM::Enchantment& newEnchantment) const;

View file

@ -66,14 +66,14 @@ namespace MWMechanics
// Is this another levelled item or a real item? // Is this another levelled item or a real item?
MWWorld::ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), item, 1); MWWorld::ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), item, 1);
if (ref.getPtr().getTypeName() != typeid(ESM::ItemLevList).name() if (ref.getPtr().getType() != ESM::ItemLevList::sRecordId
&& ref.getPtr().getTypeName() != typeid(ESM::CreatureLevList).name()) && ref.getPtr().getType() != ESM::CreatureLevList::sRecordId)
{ {
return item; return item;
} }
else else
{ {
if (ref.getPtr().getTypeName() == typeid(ESM::ItemLevList).name()) if (ref.getPtr().getType() == ESM::ItemLevList::sRecordId)
return getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false, seed); return getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false, seed);
else else
return getLevelledItem(ref.getPtr().get<ESM::CreatureLevList>()->mBase, true, seed); return getLevelledItem(ref.getPtr().get<ESM::CreatureLevList>()->mBase, true, seed);

View file

@ -555,7 +555,7 @@ namespace MWMechanics
{ {
// Make sure zero base price items/services can't be bought/sold for 1 gold // Make sure zero base price items/services can't be bought/sold for 1 gold
// and return the intended base price for creature merchants // and return the intended base price for creature merchants
if (basePrice == 0 || ptr.getTypeName() == typeid(ESM::Creature).name()) if (basePrice == 0 || ptr.getType() == ESM::Creature::sRecordId)
return basePrice; return basePrice;
const MWMechanics::NpcStats &sellerStats = ptr.getClass().getNpcStats(ptr); const MWMechanics::NpcStats &sellerStats = ptr.getClass().getNpcStats(ptr);

View file

@ -84,7 +84,7 @@ void Objects::update(float duration, bool paused)
for(auto& object : mObjects) for(auto& object : mObjects)
{ {
if (object.first.getTypeName() != typeid(ESM::Container).name()) if (object.first.getType() != ESM::Container::sRecordId)
continue; continue;
if (object.second->isAnimPlaying("containeropen")) if (object.second->isAnimPlaying("containeropen"))

View file

@ -274,7 +274,7 @@ namespace MWMechanics
bool godmode = mCaster == MWMechanics::getPlayer() && MWBase::Environment::get().getWorld()->getGodModeState(); bool godmode = mCaster == MWMechanics::getPlayer() && MWBase::Environment::get().getWorld()->getGodModeState();
bool isProjectile = false; bool isProjectile = false;
if (item.getTypeName() == typeid(ESM::Weapon).name()) if (item.getType() == ESM::Weapon::sRecordId)
{ {
int type = item.get<ESM::Weapon>()->mBase->mData.mType; int type = item.get<ESM::Weapon>()->mBase->mData.mType;
ESM::WeaponType::Class weapclass = MWMechanics::getWeaponType(type)->mWeaponClass; ESM::WeaponType::Class weapclass = MWMechanics::getWeaponType(type)->mWeaponClass;

View file

@ -213,8 +213,8 @@ namespace
if (!wasEquipped) if (!wasEquipped)
return; return;
std::string type = currentItem->getTypeName(); auto type = currentItem->getType();
if (type != typeid(ESM::Weapon).name() && type != typeid(ESM::Armor).name() && type != typeid(ESM::Clothing).name()) if (type != ESM::Weapon::sRecordId && type != ESM::Armor::sRecordId && type != ESM::Clothing::sRecordId)
return; return;
if (actor.getClass().getCreatureStats(actor).isDead()) if (actor.getClass().getCreatureStats(actor).isDead())

View file

@ -96,7 +96,7 @@ namespace MWMechanics
float ratePotion (const MWWorld::Ptr &item, const MWWorld::Ptr& actor) float ratePotion (const MWWorld::Ptr &item, const MWWorld::Ptr& actor)
{ {
if (item.getTypeName() != typeid(ESM::Potion).name()) if (item.getType() != ESM::Potion::sRecordId)
return 0.f; return 0.f;
const ESM::Potion* potion = item.get<ESM::Potion>()->mBase; const ESM::Potion* potion = item.get<ESM::Potion>()->mBase;

View file

@ -214,7 +214,7 @@ namespace MWMechanics
case ESM::MagicEffect::Soultrap: case ESM::MagicEffect::Soultrap:
{ {
if (!target.getClass().isNpc() // no messagebox for NPCs if (!target.getClass().isNpc() // no messagebox for NPCs
&& (target.getTypeName() == typeid(ESM::Creature).name() && target.get<ESM::Creature>()->mBase->mData.mSoul == 0)) && (target.getType() == ESM::Creature::sRecordId && target.get<ESM::Creature>()->mBase->mData.mSoul == 0))
{ {
if (castByPlayer) if (castByPlayer)
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicInvalidTarget}"); MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicInvalidTarget}");

View file

@ -23,7 +23,7 @@ namespace MWMechanics
} }
// reject if npc is a creature // reject if npc is a creature
if ( merchant.getTypeName() != typeid(ESM::NPC).name() ) { if ( merchant.getType() != ESM::NPC::sRecordId ) {
return false; return false;
} }

View file

@ -20,7 +20,7 @@ namespace MWMechanics
float rateWeapon (const MWWorld::Ptr &item, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy, int type, float rateWeapon (const MWWorld::Ptr &item, const MWWorld::Ptr& actor, const MWWorld::Ptr& enemy, int type,
float arrowRating, float boltRating) float arrowRating, float boltRating)
{ {
if (enemy.isEmpty() || item.getTypeName() != typeid(ESM::Weapon).name()) if (enemy.isEmpty() || item.getType() != ESM::Weapon::sRecordId)
return 0.f; return 0.f;
if (item.getClass().hasItemHealth(item) && item.getClass().getItemHealth(item) == 0) if (item.getClass().hasItemHealth(item) && item.getClass().getItemHealth(item) == 0)

View file

@ -21,13 +21,13 @@ namespace MWMechanics
*weaptype = ESM::Weapon::HandToHand; *weaptype = ESM::Weapon::HandToHand;
else else
{ {
const std::string &type = weapon->getTypeName(); auto type = weapon->getType();
if(type == typeid(ESM::Weapon).name()) if(type == ESM::Weapon::sRecordId)
{ {
const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>(); const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>();
*weaptype = ref->mBase->mData.mType; *weaptype = ref->mBase->mData.mType;
} }
else if (type == typeid(ESM::Lockpick).name() || type == typeid(ESM::Probe).name()) else if (type == ESM::Lockpick::sRecordId || type == ESM::Probe::sRecordId)
*weaptype = ESM::Weapon::PickProbe; *weaptype = ESM::Weapon::PickProbe;
} }

View file

@ -143,21 +143,21 @@ bool ActorAnimation::updateCarriedLeftVisible(const int weaptype) const
const MWWorld::InventoryStore& inv = cls.getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = cls.getInventoryStore(mPtr);
const MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); const MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
const MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); const MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
if (shield != inv.end() && shield->getTypeName() == typeid(ESM::Armor).name() && !getShieldMesh(*shield).empty()) if (shield != inv.end() && shield->getType() == ESM::Armor::sRecordId && !getShieldMesh(*shield).empty())
{ {
if(stats.getDrawState() != MWMechanics::DrawState_Weapon) if(stats.getDrawState() != MWMechanics::DrawState_Weapon)
return false; return false;
if (weapon != inv.end()) if (weapon != inv.end())
{ {
const std::string &type = weapon->getTypeName(); auto type = weapon->getType();
if(type == typeid(ESM::Weapon).name()) if(type == ESM::Weapon::sRecordId)
{ {
const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>(); const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>();
ESM::Weapon::Type weaponType = (ESM::Weapon::Type)ref->mBase->mData.mType; ESM::Weapon::Type weaponType = (ESM::Weapon::Type)ref->mBase->mData.mType;
return !(MWMechanics::getWeaponType(weaponType)->mFlags & ESM::WeaponType::TwoHanded); return !(MWMechanics::getWeaponType(weaponType)->mFlags & ESM::WeaponType::TwoHanded);
} }
else if (type == typeid(ESM::Lockpick).name() || type == typeid(ESM::Probe).name()) else if (type == ESM::Lockpick::sRecordId || type == ESM::Probe::sRecordId)
return true; return true;
} }
} }
@ -184,7 +184,7 @@ void ActorAnimation::updateHolsteredShield(bool showCarriedLeft)
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
if (shield == inv.end() || shield->getTypeName() != typeid(ESM::Armor).name()) if (shield == inv.end() || shield->getType() != ESM::Armor::sRecordId)
return; return;
// Can not show holdstered shields with two-handed weapons at all // Can not show holdstered shields with two-handed weapons at all
@ -192,8 +192,8 @@ void ActorAnimation::updateHolsteredShield(bool showCarriedLeft)
if(weapon == inv.end()) if(weapon == inv.end())
return; return;
const std::string &type = weapon->getTypeName(); auto type = weapon->getType();
if(type == typeid(ESM::Weapon).name()) if(type == ESM::Weapon::sRecordId)
{ {
const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>(); const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>();
ESM::Weapon::Type weaponType = (ESM::Weapon::Type)ref->mBase->mData.mType; ESM::Weapon::Type weaponType = (ESM::Weapon::Type)ref->mBase->mData.mType;
@ -254,17 +254,17 @@ bool ActorAnimation::useShieldAnimations() const
const MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); const MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
const MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); const MWWorld::ConstContainerStoreIterator shield = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
if (weapon != inv.end() && shield != inv.end() && if (weapon != inv.end() && shield != inv.end() &&
shield->getTypeName() == typeid(ESM::Armor).name() && shield->getType() == ESM::Armor::sRecordId &&
!getShieldMesh(*shield).empty()) !getShieldMesh(*shield).empty())
{ {
const std::string &type = weapon->getTypeName(); auto type = weapon->getType();
if(type == typeid(ESM::Weapon).name()) if(type == ESM::Weapon::sRecordId)
{ {
const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>(); const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon->get<ESM::Weapon>();
ESM::Weapon::Type weaponType = (ESM::Weapon::Type)ref->mBase->mData.mType; ESM::Weapon::Type weaponType = (ESM::Weapon::Type)ref->mBase->mData.mType;
return !(MWMechanics::getWeaponType(weaponType)->mFlags & ESM::WeaponType::TwoHanded); return !(MWMechanics::getWeaponType(weaponType)->mFlags & ESM::WeaponType::TwoHanded);
} }
else if (type == typeid(ESM::Lockpick).name() || type == typeid(ESM::Probe).name()) else if (type == ESM::Lockpick::sRecordId || type == ESM::Probe::sRecordId)
return true; return true;
} }
@ -288,8 +288,8 @@ std::string ActorAnimation::getHolsteredWeaponBoneName(const MWWorld::ConstPtr&
if(weapon.isEmpty()) if(weapon.isEmpty())
return boneName; return boneName;
const std::string &type = weapon.getClass().getTypeName(); auto type = weapon.getClass().getType();
if(type == typeid(ESM::Weapon).name()) if(type == ESM::Weapon::sRecordId)
{ {
const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon.get<ESM::Weapon>(); const MWWorld::LiveCellRef<ESM::Weapon> *ref = weapon.get<ESM::Weapon>();
int weaponType = ref->mBase->mData.mType; int weaponType = ref->mBase->mData.mType;
@ -323,7 +323,7 @@ void ActorAnimation::updateHolsteredWeapon(bool showHolsteredWeapons)
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if (weapon == inv.end() || weapon->getTypeName() != typeid(ESM::Weapon).name()) if (weapon == inv.end() || weapon->getType() != ESM::Weapon::sRecordId)
return; return;
// Since throwing weapons stack themselves, do not show such weapon itself // Since throwing weapons stack themselves, do not show such weapon itself
@ -399,7 +399,7 @@ void ActorAnimation::updateQuiver()
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon == inv.end() || weapon->getTypeName() != typeid(ESM::Weapon).name()) if(weapon == inv.end() || weapon->getType() != ESM::Weapon::sRecordId)
return; return;
std::string mesh = weapon->getClass().getModel(*weapon); std::string mesh = weapon->getClass().getModel(*weapon);
@ -471,7 +471,7 @@ void ActorAnimation::updateQuiver()
void ActorAnimation::itemAdded(const MWWorld::ConstPtr& item, int /*count*/) void ActorAnimation::itemAdded(const MWWorld::ConstPtr& item, int /*count*/)
{ {
if (item.getTypeName() == typeid(ESM::Light).name()) if (item.getType() == ESM::Light::sRecordId)
{ {
const ESM::Light* light = item.get<ESM::Light>()->mBase; const ESM::Light* light = item.get<ESM::Light>()->mBase;
if (!(light->mData.mFlags & ESM::Light::Carry)) if (!(light->mData.mFlags & ESM::Light::Carry))
@ -486,7 +486,7 @@ void ActorAnimation::itemAdded(const MWWorld::ConstPtr& item, int /*count*/)
// If the count of equipped ammo or throwing weapon was changed, we should update quiver // If the count of equipped ammo or throwing weapon was changed, we should update quiver
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon == inv.end() || weapon->getTypeName() != typeid(ESM::Weapon).name()) if(weapon == inv.end() || weapon->getType() != ESM::Weapon::sRecordId)
return; return;
MWWorld::ConstContainerStoreIterator ammo = inv.end(); MWWorld::ConstContainerStoreIterator ammo = inv.end();
@ -502,7 +502,7 @@ void ActorAnimation::itemAdded(const MWWorld::ConstPtr& item, int /*count*/)
void ActorAnimation::itemRemoved(const MWWorld::ConstPtr& item, int /*count*/) void ActorAnimation::itemRemoved(const MWWorld::ConstPtr& item, int /*count*/)
{ {
if (item.getTypeName() == typeid(ESM::Light).name()) if (item.getType() == ESM::Light::sRecordId)
{ {
ItemLightMap::iterator iter = mItemLights.find(item); ItemLightMap::iterator iter = mItemLights.find(item);
if (iter != mItemLights.end()) if (iter != mItemLights.end())
@ -520,7 +520,7 @@ void ActorAnimation::itemRemoved(const MWWorld::ConstPtr& item, int /*count*/)
// If the count of equipped ammo or throwing weapon was changed, we should update quiver // If the count of equipped ammo or throwing weapon was changed, we should update quiver
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon == inv.end() || weapon->getTypeName() != typeid(ESM::Weapon).name()) if(weapon == inv.end() || weapon->getType() != ESM::Weapon::sRecordId)
return; return;
MWWorld::ConstContainerStoreIterator ammo = inv.end(); MWWorld::ConstContainerStoreIterator ammo = inv.end();

View file

@ -1794,7 +1794,7 @@ namespace MWRender
if (!ptr.getClass().getEnchantment(ptr).empty()) if (!ptr.getClass().getEnchantment(ptr).empty())
mGlowUpdater = SceneUtil::addEnchantedGlow(mObjectRoot, mResourceSystem, ptr.getClass().getEnchantmentColor(ptr)); mGlowUpdater = SceneUtil::addEnchantedGlow(mObjectRoot, mResourceSystem, ptr.getClass().getEnchantmentColor(ptr));
} }
if (ptr.getTypeName() == typeid(ESM::Light).name() && allowLight) if (ptr.getType() == ESM::Light::sRecordId && allowLight)
addExtraLight(getOrCreateObjectRoot(), ptr.get<ESM::Light>()->mBase); addExtraLight(getOrCreateObjectRoot(), ptr.get<ESM::Light>()->mBase);
if (!allowLight && mObjectRoot) if (!allowLight && mObjectRoot)
@ -1823,7 +1823,7 @@ namespace MWRender
bool ObjectAnimation::canBeHarvested() const bool ObjectAnimation::canBeHarvested() const
{ {
if (mPtr.getTypeName() != typeid(ESM::Container).name()) if (mPtr.getType() != ESM::Container::sRecordId)
return false; return false;
const MWWorld::LiveCellRef<ESM::Container>* ref = mPtr.get<ESM::Container>(); const MWWorld::LiveCellRef<ESM::Container>* ref = mPtr.get<ESM::Container>();

View file

@ -395,7 +395,7 @@ namespace MWRender
if(iter != inv.end()) if(iter != inv.end())
{ {
groupname = "inventoryweapononehand"; groupname = "inventoryweapononehand";
if(iter->getTypeName() == typeid(ESM::Weapon).name()) if(iter->getType() == ESM::Weapon::sRecordId)
{ {
MWWorld::LiveCellRef<ESM::Weapon> *ref = iter->get<ESM::Weapon>(); MWWorld::LiveCellRef<ESM::Weapon> *ref = iter->get<ESM::Weapon>();
int type = ref->mBase->mData.mType; int type = ref->mBase->mData.mType;
@ -428,7 +428,7 @@ namespace MWRender
mAnimation->play(mCurrentAnimGroup, 1, Animation::BlendMask_All, false, 1.0f, "start", "stop", 0.0f, 0); mAnimation->play(mCurrentAnimGroup, 1, Animation::BlendMask_All, false, 1.0f, "start", "stop", 0.0f, 0);
MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name() && showCarriedLeft) if(torch != inv.end() && torch->getType() == ESM::Light::sRecordId && showCarriedLeft)
{ {
if(!mAnimation->getInfo("torch")) if(!mAnimation->getInfo("torch"))
mAnimation->play("torch", 2, Animation::BlendMask_LeftArm, false, mAnimation->play("torch", 2, Animation::BlendMask_LeftArm, false,

View file

@ -119,7 +119,7 @@ void CreatureWeaponAnimation::updatePart(PartHolderPtr& scene, int slot)
std::string itemModel = item.getClass().getModel(item); std::string itemModel = item.getClass().getModel(item);
if (slot == MWWorld::InventoryStore::Slot_CarriedRight) if (slot == MWWorld::InventoryStore::Slot_CarriedRight)
{ {
if(item.getTypeName() == typeid(ESM::Weapon).name()) if(item.getType() == ESM::Weapon::sRecordId)
{ {
int type = item.get<ESM::Weapon>()->mBase->mData.mType; int type = item.get<ESM::Weapon>()->mBase->mData.mType;
bonename = MWMechanics::getWeaponType(type)->mAttachBone; bonename = MWMechanics::getWeaponType(type)->mAttachBone;
@ -137,7 +137,7 @@ void CreatureWeaponAnimation::updatePart(PartHolderPtr& scene, int slot)
else else
{ {
bonename = "Shield Bone"; bonename = "Shield Bone";
if (item.getTypeName() == typeid(ESM::Armor).name()) if (item.getType() == ESM::Armor::sRecordId)
{ {
// Shield body part model should be used if possible. // Shield body part model should be used if possible.
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
@ -174,7 +174,7 @@ void CreatureWeaponAnimation::updatePart(PartHolderPtr& scene, int slot)
// Crossbows start out with a bolt attached // Crossbows start out with a bolt attached
// FIXME: code duplicated from NpcAnimation // FIXME: code duplicated from NpcAnimation
if (slot == MWWorld::InventoryStore::Slot_CarriedRight && if (slot == MWWorld::InventoryStore::Slot_CarriedRight &&
item.getTypeName() == typeid(ESM::Weapon).name() && item.getType() == ESM::Weapon::sRecordId &&
item.get<ESM::Weapon>()->mBase->mData.mType == ESM::Weapon::MarksmanCrossbow) item.get<ESM::Weapon>()->mBase->mData.mType == ESM::Weapon::MarksmanCrossbow)
{ {
const ESM::WeaponType* weaponInfo = MWMechanics::getWeaponType(ESM::Weapon::MarksmanCrossbow); const ESM::WeaponType* weaponInfo = MWMechanics::getWeaponType(ESM::Weapon::MarksmanCrossbow);
@ -246,7 +246,7 @@ osg::Group *CreatureWeaponAnimation::getArrowBone()
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon == inv.end() || weapon->getTypeName() != typeid(ESM::Weapon).name()) if(weapon == inv.end() || weapon->getType() != ESM::Weapon::sRecordId)
return nullptr; return nullptr;
int type = weapon->get<ESM::Weapon>()->mBase->mData.mType; int type = weapon->get<ESM::Weapon>()->mBase->mData.mType;

View file

@ -594,13 +594,13 @@ void NpcAnimation::updateParts()
int prio = 1; int prio = 1;
bool enchantedGlow = !store->getClass().getEnchantment(*store).empty(); bool enchantedGlow = !store->getClass().getEnchantment(*store).empty();
osg::Vec4f glowColor = store->getClass().getEnchantmentColor(*store); osg::Vec4f glowColor = store->getClass().getEnchantmentColor(*store);
if(store->getTypeName() == typeid(ESM::Clothing).name()) if(store->getType() == ESM::Clothing::sRecordId)
{ {
prio = ((slotlist[i].mBasePriority+1)<<1) + 0; prio = ((slotlist[i].mBasePriority+1)<<1) + 0;
const ESM::Clothing *clothes = store->get<ESM::Clothing>()->mBase; const ESM::Clothing *clothes = store->get<ESM::Clothing>()->mBase;
addPartGroup(slotlist[i].mSlot, prio, clothes->mParts.mParts, enchantedGlow, &glowColor); addPartGroup(slotlist[i].mSlot, prio, clothes->mParts.mParts, enchantedGlow, &glowColor);
} }
else if(store->getTypeName() == typeid(ESM::Armor).name()) else if(store->getType() == ESM::Armor::sRecordId)
{ {
prio = ((slotlist[i].mBasePriority+1)<<1) + 1; prio = ((slotlist[i].mBasePriority+1)<<1) + 1;
const ESM::Armor *armor = store->get<ESM::Armor>()->mBase; const ESM::Armor *armor = store->get<ESM::Armor>()->mBase;
@ -640,7 +640,7 @@ void NpcAnimation::updateParts()
{ {
MWWorld::ConstContainerStoreIterator store = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); MWWorld::ConstContainerStoreIterator store = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft);
MWWorld::ConstPtr part; MWWorld::ConstPtr part;
if(store != inv.end() && (part=*store).getTypeName() == typeid(ESM::Light).name()) if(store != inv.end() && (part=*store).getType() == ESM::Light::sRecordId)
{ {
const ESM::Light *light = part.get<ESM::Light>()->mBase; const ESM::Light *light = part.get<ESM::Light>()->mBase;
addOrReplaceIndividualPart(ESM::PRT_Shield, MWWorld::InventoryStore::Slot_CarriedLeft, addOrReplaceIndividualPart(ESM::PRT_Shield, MWWorld::InventoryStore::Slot_CarriedLeft,
@ -771,7 +771,7 @@ bool NpcAnimation::addOrReplaceIndividualPart(ESM::PartReferenceType type, int g
{ {
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon != inv.end() && weapon->getTypeName() == typeid(ESM::Weapon).name()) if(weapon != inv.end() && weapon->getType() == ESM::Weapon::sRecordId)
{ {
int weaponType = weapon->get<ESM::Weapon>()->mBase->mData.mType; int weaponType = weapon->get<ESM::Weapon>()->mBase->mData.mType;
const std::string weaponBonename = MWMechanics::getWeaponType(weaponType)->mAttachBone; const std::string weaponBonename = MWMechanics::getWeaponType(weaponType)->mAttachBone;
@ -943,7 +943,7 @@ void NpcAnimation::showWeapons(bool showWeapon)
mesh, !weapon->getClass().getEnchantment(*weapon).empty(), &glowColor); mesh, !weapon->getClass().getEnchantment(*weapon).empty(), &glowColor);
// Crossbows start out with a bolt attached // Crossbows start out with a bolt attached
if (weapon->getTypeName() == typeid(ESM::Weapon).name() && if (weapon->getType() == ESM::Weapon::sRecordId &&
weapon->get<ESM::Weapon>()->mBase->mData.mType == ESM::Weapon::MarksmanCrossbow) weapon->get<ESM::Weapon>()->mBase->mData.mType == ESM::Weapon::MarksmanCrossbow)
{ {
int ammotype = MWMechanics::getWeaponType(ESM::Weapon::MarksmanCrossbow)->mAmmoType; int ammotype = MWMechanics::getWeaponType(ESM::Weapon::MarksmanCrossbow)->mAmmoType;
@ -975,7 +975,7 @@ void NpcAnimation::showCarriedLeft(bool show)
osg::Vec4f glowColor = iter->getClass().getEnchantmentColor(*iter); osg::Vec4f glowColor = iter->getClass().getEnchantmentColor(*iter);
std::string mesh = iter->getClass().getModel(*iter); std::string mesh = iter->getClass().getModel(*iter);
// For shields we must try to use the body part model // For shields we must try to use the body part model
if (iter->getTypeName() == typeid(ESM::Armor).name()) if (iter->getType() == ESM::Armor::sRecordId)
{ {
const ESM::Armor *armor = iter->get<ESM::Armor>()->mBase; const ESM::Armor *armor = iter->get<ESM::Armor>()->mBase;
const std::vector<ESM::PartReference>& bodyparts = armor->mParts.mParts; const std::vector<ESM::PartReference>& bodyparts = armor->mParts.mParts;
@ -987,7 +987,7 @@ void NpcAnimation::showCarriedLeft(bool show)
{ {
if (mesh.empty()) if (mesh.empty())
reserveIndividualPart(ESM::PRT_Shield, MWWorld::InventoryStore::Slot_CarriedLeft, 1); reserveIndividualPart(ESM::PRT_Shield, MWWorld::InventoryStore::Slot_CarriedLeft, 1);
if (iter->getTypeName() == typeid(ESM::Light).name() && mObjectParts[ESM::PRT_Shield]) if (iter->getType() == ESM::Light::sRecordId && mObjectParts[ESM::PRT_Shield])
addExtraLight(mObjectParts[ESM::PRT_Shield]->getNode()->asGroup(), iter->get<ESM::Light>()->mBase); addExtraLight(mObjectParts[ESM::PRT_Shield]->getNode()->asGroup(), iter->get<ESM::Light>()->mBase);
} }
} }
@ -1033,7 +1033,7 @@ osg::Group* NpcAnimation::getArrowBone()
const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr); const MWWorld::InventoryStore& inv = mPtr.getClass().getInventoryStore(mPtr);
MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if(weapon == inv.end() || weapon->getTypeName() != typeid(ESM::Weapon).name()) if(weapon == inv.end() || weapon->getType() != ESM::Weapon::sRecordId)
return nullptr; return nullptr;
int type = weapon->get<ESM::Weapon>()->mBase->mData.mType; int type = weapon->get<ESM::Weapon>()->mBase->mData.mType;

View file

@ -66,7 +66,7 @@ void WeaponAnimation::attachArrow(const MWWorld::Ptr& actor)
MWWorld::ConstContainerStoreIterator weaponSlot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ConstContainerStoreIterator weaponSlot = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if (weaponSlot == inv.end()) if (weaponSlot == inv.end())
return; return;
if (weaponSlot->getTypeName() != typeid(ESM::Weapon).name()) if (weaponSlot->getType() != ESM::Weapon::sRecordId)
return; return;
int type = weaponSlot->get<ESM::Weapon>()->mBase->mData.mType; int type = weaponSlot->get<ESM::Weapon>()->mBase->mData.mType;
@ -109,7 +109,7 @@ void WeaponAnimation::releaseArrow(MWWorld::Ptr actor, float attackStrength)
MWWorld::ContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); MWWorld::ContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
if (weapon == inv.end()) if (weapon == inv.end())
return; return;
if (weapon->getTypeName() != typeid(ESM::Weapon).name()) if (weapon->getType() != ESM::Weapon::sRecordId)
return; return;
// The orientation of the launched projectile. Always the same as the actor orientation, even if the ArrowBone's orientation dictates otherwise. // The orientation of the launched projectile. Always the same as the actor orientation, even if the ArrowBone's orientation dictates otherwise.

View file

@ -50,7 +50,7 @@ namespace
void addRandomToStore(const MWWorld::Ptr& itemPtr, int count, MWWorld::Ptr& owner, MWWorld::ContainerStore& store, bool topLevel = true) void addRandomToStore(const MWWorld::Ptr& itemPtr, int count, MWWorld::Ptr& owner, MWWorld::ContainerStore& store, bool topLevel = true)
{ {
if(itemPtr.getTypeName() == typeid(ESM::ItemLevList).name()) if(itemPtr.getType() == ESM::ItemLevList::sRecordId)
{ {
const ESM::ItemLevList* levItemList = itemPtr.get<ESM::ItemLevList>()->mBase; const ESM::ItemLevList* levItemList = itemPtr.get<ESM::ItemLevList>()->mBase;
@ -108,7 +108,7 @@ namespace MWScript
// Check if "item" can be placed in a container // Check if "item" can be placed in a container
MWWorld::ManualRef manualRef(MWBase::Environment::get().getWorld()->getStore(), item, 1); MWWorld::ManualRef manualRef(MWBase::Environment::get().getWorld()->getStore(), item, 1);
MWWorld::Ptr itemPtr = manualRef.getPtr(); MWWorld::Ptr itemPtr = manualRef.getPtr();
bool isLevelledList = itemPtr.getClass().getTypeName() == typeid(ESM::ItemLevList).name(); bool isLevelledList = itemPtr.getClass().getType() == ESM::ItemLevList::sRecordId;
if(!isLevelledList) if(!isLevelledList)
MWWorld::ContainerStore::getType(itemPtr); MWWorld::ContainerStore::getType(itemPtr);
@ -120,7 +120,7 @@ namespace MWScript
} }
// Calls to unresolved containers affect the base record // Calls to unresolved containers affect the base record
if(ptr.getClass().getTypeName() == typeid(ESM::Container).name() && (!ptr.getRefData().getCustomData() || if(ptr.getClass().getType() == ESM::Container::sRecordId && (!ptr.getRefData().getCustomData() ||
!ptr.getClass().getContainerStore(ptr).isResolved())) !ptr.getClass().getContainerStore(ptr).isResolved()))
{ {
ptr.getClass().modifyBaseInventory(ptr.getCellRef().getRefId(), item, count); ptr.getClass().modifyBaseInventory(ptr.getCellRef().getRefId(), item, count);
@ -232,7 +232,7 @@ namespace MWScript
return; return;
} }
// Calls to unresolved containers affect the base record instead // Calls to unresolved containers affect the base record instead
else if(ptr.getClass().getTypeName() == typeid(ESM::Container).name() && else if(ptr.getClass().getType() == ESM::Container::sRecordId &&
(!ptr.getRefData().getCustomData() || !ptr.getClass().getContainerStore(ptr).isResolved())) (!ptr.getRefData().getCustomData() || !ptr.getClass().getContainerStore(ptr).isResolved()))
{ {
ptr.getClass().modifyBaseInventory(ptr.getCellRef().getRefId(), item, -count); ptr.getClass().modifyBaseInventory(ptr.getCellRef().getRefId(), item, -count);
@ -380,7 +380,7 @@ namespace MWScript
const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr); const MWWorld::InventoryStore& invStore = ptr.getClass().getInventoryStore (ptr);
MWWorld::ConstContainerStoreIterator it = invStore.getSlot (slot); MWWorld::ConstContainerStoreIterator it = invStore.getSlot (slot);
if (it == invStore.end() || it->getTypeName () != typeid(ESM::Armor).name()) if (it == invStore.end() || it->getType () != ESM::Armor::sRecordId)
{ {
runtime.push(-1); runtime.push(-1);
return; return;
@ -464,13 +464,13 @@ namespace MWScript
runtime.push(-1); runtime.push(-1);
return; return;
} }
else if (it->getTypeName() != typeid(ESM::Weapon).name()) else if (it->getType() != ESM::Weapon::sRecordId)
{ {
if (it->getTypeName() == typeid(ESM::Lockpick).name()) if (it->getType() == ESM::Lockpick::sRecordId)
{ {
runtime.push(-2); runtime.push(-2);
} }
else if (it->getTypeName() == typeid(ESM::Probe).name()) else if (it->getType() == ESM::Probe::sRecordId)
{ {
runtime.push(-3); runtime.push(-3);
} }

View file

@ -310,7 +310,7 @@ namespace MWScript
// Instantly reset door to closed state // Instantly reset door to closed state
// This is done when using Lock in scripts, but not when using Lock spells. // This is done when using Lock in scripts, but not when using Lock spells.
if (ptr.getTypeName() == typeid(ESM::Door).name() && !ptr.getCellRef().getTeleport()) if (ptr.getType() == ESM::Door::sRecordId && !ptr.getCellRef().getTeleport())
{ {
MWBase::Environment::get().getWorld()->activateDoor(ptr, MWWorld::DoorState::Idle); MWBase::Environment::get().getWorld()->activateDoor(ptr, MWWorld::DoorState::Idle);
} }

View file

@ -23,7 +23,7 @@
namespace MWWorld namespace MWWorld
{ {
std::map<std::string, std::shared_ptr<Class> > Class::sClasses; std::map<unsigned int, std::shared_ptr<Class> > Class::sClasses;
void Class::insertObjectRendering (const Ptr& ptr, const std::string& mesh, MWRender::RenderingInterface& renderingInterface) const void Class::insertObjectRendering (const Ptr& ptr, const std::string& mesh, MWRender::RenderingInterface& renderingInterface) const
{ {
@ -228,15 +228,12 @@ namespace MWWorld
throw std::runtime_error("Class does not support armor rating"); throw std::runtime_error("Class does not support armor rating");
} }
const Class& Class::get (const std::string& key) const Class& Class::get (unsigned int key)
{ {
if (key.empty()) auto iter = sClasses.find (key);
throw std::logic_error ("Class::get(): attempting to get an empty key");
std::map<std::string, std::shared_ptr<Class> >::const_iterator iter = sClasses.find (key);
if (iter==sClasses.end()) if (iter==sClasses.end())
throw std::logic_error ("Class::get(): unknown class key: " + key); throw std::logic_error ("Class::get(): unknown class key: " + std::to_string(key));
return *iter->second; return *iter->second;
} }
@ -246,9 +243,9 @@ namespace MWWorld
throw std::runtime_error ("class does not support persistence"); throw std::runtime_error ("class does not support persistence");
} }
void Class::registerClass(const std::string& key, std::shared_ptr<Class> instance) void Class::registerClass(unsigned int key, std::shared_ptr<Class> instance)
{ {
instance->mTypeName = key; instance->mType = key;
sClasses.insert(std::make_pair(key, instance)); sClasses.insert(std::make_pair(key, instance));
} }

View file

@ -54,9 +54,8 @@ namespace MWWorld
/// \brief Base class for referenceable esm records /// \brief Base class for referenceable esm records
class Class class Class
{ {
static std::map<std::string, std::shared_ptr<Class> > sClasses; static std::map<unsigned int, std::shared_ptr<Class> > sClasses;
unsigned int mType;
std::string mTypeName;
protected: protected:
@ -73,8 +72,8 @@ namespace MWWorld
Class (const Class&) = delete; Class (const Class&) = delete;
Class& operator= (const Class&) = delete; Class& operator= (const Class&) = delete;
const std::string& getTypeName() const { unsigned int getType() const {
return mTypeName; return mType;
} }
virtual void insertObjectRendering (const Ptr& ptr, const std::string& mesh, MWRender::RenderingInterface& renderingInterface) const; virtual void insertObjectRendering (const Ptr& ptr, const std::string& mesh, MWRender::RenderingInterface& renderingInterface) const;
@ -338,10 +337,10 @@ namespace MWWorld
const; const;
///< Write additional state from \a ptr into \a state. ///< Write additional state from \a ptr into \a state.
static const Class& get (const std::string& key); static const Class& get (unsigned int key);
///< If there is no class for this \a key, an exception is thrown. ///< If there is no class for this \a key, an exception is thrown.
static void registerClass (const std::string& key, std::shared_ptr<Class> instance); static void registerClass (unsigned int key, std::shared_ptr<Class> instance);
virtual int getBaseGold(const MWWorld::ConstPtr& ptr) const; virtual int getBaseGold(const MWWorld::ConstPtr& ptr) const;

View file

@ -1,7 +1,6 @@
#include "containerstore.hpp" #include "containerstore.hpp"
#include <cassert> #include <cassert>
#include <typeinfo>
#include <stdexcept> #include <stdexcept>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
@ -567,7 +566,7 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::
void MWWorld::ContainerStore::addInitialItemImp(const MWWorld::Ptr& ptr, const std::string& owner, int count, void MWWorld::ContainerStore::addInitialItemImp(const MWWorld::Ptr& ptr, const std::string& owner, int count,
Misc::Rng::Seed* seed, bool topLevel) Misc::Rng::Seed* seed, bool topLevel)
{ {
if (ptr.getTypeName()==typeid (ESM::ItemLevList).name()) if (ptr.getType()==ESM::ItemLevList::sRecordId)
{ {
if(!seed) if(!seed)
return; return;
@ -693,44 +692,44 @@ int MWWorld::ContainerStore::getType (const ConstPtr& ptr)
if (ptr.isEmpty()) if (ptr.isEmpty())
throw std::runtime_error ("can't put a non-existent object into a container"); throw std::runtime_error ("can't put a non-existent object into a container");
if (ptr.getTypeName()==typeid (ESM::Potion).name()) if (ptr.getType()==ESM::Potion::sRecordId)
return Type_Potion; return Type_Potion;
if (ptr.getTypeName()==typeid (ESM::Apparatus).name()) if (ptr.getType()==ESM::Apparatus::sRecordId)
return Type_Apparatus; return Type_Apparatus;
if (ptr.getTypeName()==typeid (ESM::Armor).name()) if (ptr.getType()==ESM::Armor::sRecordId)
return Type_Armor; return Type_Armor;
if (ptr.getTypeName()==typeid (ESM::Book).name()) if (ptr.getType()==ESM::Book::sRecordId)
return Type_Book; return Type_Book;
if (ptr.getTypeName()==typeid (ESM::Clothing).name()) if (ptr.getType()==ESM::Clothing::sRecordId)
return Type_Clothing; return Type_Clothing;
if (ptr.getTypeName()==typeid (ESM::Ingredient).name()) if (ptr.getType()==ESM::Ingredient::sRecordId)
return Type_Ingredient; return Type_Ingredient;
if (ptr.getTypeName()==typeid (ESM::Light).name()) if (ptr.getType()==ESM::Light::sRecordId)
return Type_Light; return Type_Light;
if (ptr.getTypeName()==typeid (ESM::Lockpick).name()) if (ptr.getType()==ESM::Lockpick::sRecordId)
return Type_Lockpick; return Type_Lockpick;
if (ptr.getTypeName()==typeid (ESM::Miscellaneous).name()) if (ptr.getType()==ESM::Miscellaneous::sRecordId)
return Type_Miscellaneous; return Type_Miscellaneous;
if (ptr.getTypeName()==typeid (ESM::Probe).name()) if (ptr.getType()==ESM::Probe::sRecordId)
return Type_Probe; return Type_Probe;
if (ptr.getTypeName()==typeid (ESM::Repair).name()) if (ptr.getType()==ESM::Repair::sRecordId)
return Type_Repair; return Type_Repair;
if (ptr.getTypeName()==typeid (ESM::Weapon).name()) if (ptr.getType()==ESM::Weapon::sRecordId)
return Type_Weapon; return Type_Weapon;
throw std::runtime_error ( throw std::runtime_error (
"Object '" + ptr.getCellRef().getRefId() + "' of type " + ptr.getTypeName() + " can not be placed into a container"); "Object '" + ptr.getCellRef().getRefId() + "' of type " + ptr.getTypeDescription() + " can not be placed into a container");
} }
MWWorld::Ptr MWWorld::ContainerStore::findReplacement(const std::string& id) MWWorld::Ptr MWWorld::ContainerStore::findReplacement(const std::string& id)

View file

@ -139,8 +139,8 @@ MWWorld::ContainerStoreIterator MWWorld::InventoryStore::add(const Ptr& itemPtr,
if (allowAutoEquip && actorPtr != MWMechanics::getPlayer() if (allowAutoEquip && actorPtr != MWMechanics::getPlayer()
&& actorPtr.getClass().isNpc() && !actorPtr.getClass().getNpcStats(actorPtr).isWerewolf()) && actorPtr.getClass().isNpc() && !actorPtr.getClass().getNpcStats(actorPtr).isWerewolf())
{ {
const std::string& type = itemPtr.getTypeName(); auto type = itemPtr.getType();
if (type == typeid(ESM::Armor).name() || type == typeid(ESM::Clothing).name()) if (type == ESM::Armor::sRecordId || type == ESM::Clothing::sRecordId)
autoEquip(actorPtr); autoEquip(actorPtr);
} }
@ -431,7 +431,7 @@ void MWWorld::InventoryStore::autoEquipArmor (const MWWorld::Ptr& actor, TSlots&
if (iter.getType() == ContainerStore::Type_Armor) if (iter.getType() == ContainerStore::Type_Armor)
{ {
if (old.getTypeName() == typeid(ESM::Armor).name()) if (old.getType() == ESM::Armor::sRecordId)
{ {
if (old.get<ESM::Armor>()->mBase->mData.mType < test.get<ESM::Armor>()->mBase->mData.mType) if (old.get<ESM::Armor>()->mBase->mData.mType < test.get<ESM::Armor>()->mBase->mData.mType)
continue; continue;
@ -465,7 +465,7 @@ void MWWorld::InventoryStore::autoEquipArmor (const MWWorld::Ptr& actor, TSlots&
} }
} }
if (old.getTypeName() == typeid(ESM::Clothing).name()) if (old.getType() == ESM::Clothing::sRecordId)
{ {
// check value // check value
if (old.getClass().getValue (old) >= test.getClass().getValue (test)) if (old.getClass().getValue (old) >= test.getClass().getValue (test))
@ -617,8 +617,8 @@ int MWWorld::InventoryStore::remove(const Ptr& item, int count, const Ptr& actor
if (equipReplacement && wasEquipped && (actor != MWMechanics::getPlayer()) if (equipReplacement && wasEquipped && (actor != MWMechanics::getPlayer())
&& actor.getClass().isNpc() && !actor.getClass().getNpcStats(actor).isWerewolf()) && actor.getClass().isNpc() && !actor.getClass().getNpcStats(actor).isWerewolf())
{ {
const std::string& type = item.getTypeName(); auto type = item.getType();
if (type == typeid(ESM::Armor).name() || type == typeid(ESM::Clothing).name()) if (type == ESM::Armor::sRecordId || type == ESM::Clothing::sRecordId)
autoEquip(actor); autoEquip(actor);
} }

View file

@ -11,7 +11,7 @@
#include "class.hpp" #include "class.hpp"
#include "esmstore.hpp" #include "esmstore.hpp"
MWWorld::LiveCellRefBase::LiveCellRefBase(const std::string& type, const ESM::CellRef &cref) MWWorld::LiveCellRefBase::LiveCellRefBase(unsigned int type, const ESM::CellRef &cref)
: mClass(&Class::get(type)), mRef(cref), mData(cref) : mClass(&Class::get(type)), mRef(cref), mData(cref)
{ {
} }

View file

@ -1,8 +1,6 @@
#ifndef GAME_MWWORLD_LIVECELLREF_H #ifndef GAME_MWWORLD_LIVECELLREF_H
#define GAME_MWWORLD_LIVECELLREF_H #define GAME_MWWORLD_LIVECELLREF_H
#include <typeinfo>
#include "cellref.hpp" #include "cellref.hpp"
#include "refdata.hpp" #include "refdata.hpp"
@ -31,7 +29,7 @@ namespace MWWorld
/** runtime-data */ /** runtime-data */
RefData mData; RefData mData;
LiveCellRefBase(const std::string& type, const ESM::CellRef &cref=ESM::CellRef()); LiveCellRefBase(unsigned int type, const ESM::CellRef &cref=ESM::CellRef());
/* Need this for the class to be recognized as polymorphic */ /* Need this for the class to be recognized as polymorphic */
virtual ~LiveCellRefBase() { } virtual ~LiveCellRefBase() { }
@ -43,6 +41,8 @@ namespace MWWorld
virtual void save (ESM::ObjectState& state) const = 0; virtual void save (ESM::ObjectState& state) const = 0;
///< Save LiveCellRef state into \a state. ///< Save LiveCellRef state into \a state.
virtual std::string getTypeDescription() const { return ""; }
protected: protected:
void loadImp (const ESM::ObjectState& state); void loadImp (const ESM::ObjectState& state);
@ -77,11 +77,11 @@ namespace MWWorld
struct LiveCellRef : public LiveCellRefBase struct LiveCellRef : public LiveCellRefBase
{ {
LiveCellRef(const ESM::CellRef& cref, const X* b = nullptr) LiveCellRef(const ESM::CellRef& cref, const X* b = nullptr)
: LiveCellRefBase(typeid(X).name(), cref), mBase(b) : LiveCellRefBase(X::sRecordId, cref), mBase(b)
{} {}
LiveCellRef(const X* b = nullptr) LiveCellRef(const X* b = nullptr)
: LiveCellRefBase(typeid(X).name()), mBase(b) : LiveCellRefBase(X::sRecordId), mBase(b)
{} {}
// The object that this instance is based on. // The object that this instance is based on.
@ -95,6 +95,8 @@ namespace MWWorld
void save (ESM::ObjectState& state) const override; void save (ESM::ObjectState& state) const override;
///< Save LiveCellRef state into \a state. ///< Save LiveCellRef state into \a state.
std::string getTypeDescription() const override { return X::getRecordType(); }
static bool checkState (const ESM::ObjectState& state); static bool checkState (const ESM::ObjectState& state);
///< Check if state is valid and report errors. ///< Check if state is valid and report errors.
/// ///

View file

@ -43,7 +43,7 @@ namespace
bool operator()(const MWWorld::Ptr& containerPtr) bool operator()(const MWWorld::Ptr& containerPtr)
{ {
// Ignore containers without generated content // Ignore containers without generated content
if (containerPtr.getTypeName() == typeid(ESM::Container).name() && if (containerPtr.getType() == ESM::Container::sRecordId &&
containerPtr.getRefData().getCustomData() == nullptr) containerPtr.getRefData().getCustomData() == nullptr)
return true; return true;

View file

@ -6,10 +6,10 @@
#include "class.hpp" #include "class.hpp"
#include "livecellref.hpp" #include "livecellref.hpp"
const std::string& MWWorld::Ptr::getTypeName() const unsigned int MWWorld::Ptr::getType() const
{ {
if(mRef != nullptr) if(mRef != nullptr)
return mRef->mClass->getTypeName(); return mRef->mClass->getType();
throw std::runtime_error("Can't get type name from an empty object."); throw std::runtime_error("Can't get type name from an empty object.");
} }
@ -55,10 +55,10 @@ MWWorld::Ptr::operator const void *()
// ------------------------------------------------------------------------------- // -------------------------------------------------------------------------------
const std::string &MWWorld::ConstPtr::getTypeName() const unsigned int MWWorld::ConstPtr::getType() const
{ {
if(mRef != nullptr) if(mRef != nullptr)
return mRef->mClass->getTypeName(); return mRef->mClass->getType();
throw std::runtime_error("Can't get type name from an empty object."); throw std::runtime_error("Can't get type name from an empty object.");
} }

View file

@ -35,7 +35,12 @@ namespace MWWorld
return mRef == nullptr; return mRef == nullptr;
} }
const std::string& getTypeName() const; unsigned int getType() const;
std::string getTypeDescription() const
{
return mRef ? mRef->getTypeDescription() : "nullptr";
}
const Class& getClass() const const Class& getClass() const
{ {
@ -51,8 +56,8 @@ namespace MWWorld
if(ref) return ref; if(ref) return ref;
std::stringstream str; std::stringstream str;
str<< "Bad LiveCellRef cast to "<<typeid(T).name()<<" from "; str<< "Bad LiveCellRef cast to "<<T::getRecordType()<<" from ";
if(mRef != nullptr) str<< getTypeName(); if(mRef != nullptr) str<< getTypeDescription();
else str<< "an empty object"; else str<< "an empty object";
throw std::runtime_error(str.str()); throw std::runtime_error(str.str());
@ -111,7 +116,12 @@ namespace MWWorld
return mRef == nullptr; return mRef == nullptr;
} }
const std::string& getTypeName() const; unsigned int getType() const;
std::string getTypeDescription() const
{
return mRef ? mRef->getTypeDescription() : "nullptr";
}
const Class& getClass() const const Class& getClass() const
{ {
@ -127,8 +137,8 @@ namespace MWWorld
if(ref) return ref; if(ref) return ref;
std::stringstream str; std::stringstream str;
str<< "Bad LiveCellRef cast to "<<typeid(T).name()<<" from "; str<< "Bad LiveCellRef cast to "<<T::getRecordType()<<" from ";
if(mRef != nullptr) str<< getTypeName(); if(mRef != nullptr) str<< getTypeDescription();
else str<< "an empty object"; else str<< "an empty object";
throw std::runtime_error(str.str()); throw std::runtime_error(str.str());

View file

@ -784,9 +784,9 @@ namespace MWWorld
void World::addContainerScripts(const Ptr& reference, CellStore * cell) void World::addContainerScripts(const Ptr& reference, CellStore * cell)
{ {
if( reference.getTypeName()==typeid (ESM::Container).name() || if( reference.getType()==ESM::Container::sRecordId ||
reference.getTypeName()==typeid (ESM::NPC).name() || reference.getType()==ESM::NPC::sRecordId ||
reference.getTypeName()==typeid (ESM::Creature).name()) reference.getType()==ESM::Creature::sRecordId)
{ {
MWWorld::ContainerStore& container = reference.getClass().getContainerStore(reference); MWWorld::ContainerStore& container = reference.getClass().getContainerStore(reference);
for(MWWorld::ContainerStoreIterator it = container.begin(); it != container.end(); ++it) for(MWWorld::ContainerStoreIterator it = container.begin(); it != container.end(); ++it)
@ -827,9 +827,9 @@ namespace MWWorld
void World::removeContainerScripts(const Ptr& reference) void World::removeContainerScripts(const Ptr& reference)
{ {
if( reference.getTypeName()==typeid (ESM::Container).name() || if( reference.getType()==ESM::Container::sRecordId ||
reference.getTypeName()==typeid (ESM::NPC).name() || reference.getType()==ESM::NPC::sRecordId ||
reference.getTypeName()==typeid (ESM::Creature).name()) reference.getType()==ESM::Creature::sRecordId)
{ {
MWWorld::ContainerStore& container = reference.getClass().getContainerStore(reference); MWWorld::ContainerStore& container = reference.getClass().getContainerStore(reference);
for(MWWorld::ContainerStoreIterator it = container.begin(); it != container.end(); ++it) for(MWWorld::ContainerStoreIterator it = container.begin(); it != container.end(); ++it)
@ -3415,7 +3415,7 @@ namespace MWWorld
return true; return true;
// Consider references inside containers as well (except if we are looking for a Creature, they cannot be in containers) // Consider references inside containers as well (except if we are looking for a Creature, they cannot be in containers)
bool isContainer = ptr.getClass().getTypeName() == typeid(ESM::Container).name(); bool isContainer = ptr.getClass().getType() == ESM::Container::sRecordId;
if (mType != World::Detect_Creature && (ptr.getClass().isActor() || isContainer)) if (mType != World::Detect_Creature && (ptr.getClass().isActor() || isContainer))
{ {
// but ignore containers without resolved content // but ignore containers without resolved content
@ -3470,10 +3470,10 @@ namespace MWWorld
// If in werewolf form, this detects only NPCs, otherwise only creatures // If in werewolf form, this detects only NPCs, otherwise only creatures
if (detector.getClass().isNpc() && detector.getClass().getNpcStats(detector).isWerewolf()) if (detector.getClass().isNpc() && detector.getClass().getNpcStats(detector).isWerewolf())
{ {
if (ptr.getClass().getTypeName() != typeid(ESM::NPC).name()) if (ptr.getClass().getType() != ESM::NPC::sRecordId)
return false; return false;
} }
else if (ptr.getClass().getTypeName() != typeid(ESM::Creature).name()) else if (ptr.getClass().getType() != ESM::Creature::sRecordId)
return false; return false;
if (ptr.getClass().getCreatureStats(ptr).isDead()) if (ptr.getClass().getCreatureStats(ptr).isDead())