diff --git a/apps/openmw/mwmp/RecordHelper.cpp b/apps/openmw/mwmp/RecordHelper.cpp index a5849a5a2..90214f913 100644 --- a/apps/openmw/mwmp/RecordHelper.cpp +++ b/apps/openmw/mwmp/RecordHelper.cpp @@ -5,9 +5,9 @@ #include "RecordHelper.hpp" -void RecordHelper::overrideRecord(const mwmp::CreatureRecord& record) +void RecordHelper::overrideRecord(const mwmp::ActivatorRecord& record) { - const ESM::Creature &recordData = record.data; + const ESM::Activator &recordData = record.data; if (recordData.mId.empty()) { @@ -15,17 +15,17 @@ void RecordHelper::overrideRecord(const mwmp::CreatureRecord& record) return; } - bool isExistingId = doesRecordIdExist(recordData.mId); + bool isExistingId = doesRecordIdExist(recordData.mId); MWBase::World *world = MWBase::Environment::get().getWorld(); if (record.baseId.empty()) { world->getModifiableStore().overrideRecord(recordData); } - else if (doesRecordIdExist(record.baseId)) + else if (doesRecordIdExist(record.baseId)) { - const ESM::Creature *baseData = world->getStore().get().search(record.baseId); - ESM::Creature finalData = *baseData; + const ESM::Activator *baseData = world->getStore().get().search(record.baseId); + ESM::Activator finalData = *baseData; finalData.mId = recordData.mId; if (record.baseOverrides.hasName) @@ -34,44 +34,9 @@ void RecordHelper::overrideRecord(const mwmp::CreatureRecord& record) if (record.baseOverrides.hasModel) finalData.mModel = recordData.mModel; - if (record.baseOverrides.hasSubtype) - finalData.mData.mType = recordData.mData.mType; - - if (record.baseOverrides.hasLevel) - finalData.mData.mLevel = recordData.mData.mLevel; - - if (record.baseOverrides.hasHealth) - finalData.mData.mHealth = recordData.mData.mHealth; - - if (record.baseOverrides.hasMagicka) - finalData.mData.mMana = recordData.mData.mMana; - - if (record.baseOverrides.hasFatigue) - finalData.mData.mFatigue = recordData.mData.mFatigue; - - if (record.baseOverrides.hasAiFight) - finalData.mAiData.mFight = recordData.mAiData.mFight; - - if (record.baseOverrides.hasAiFlee) - finalData.mAiData.mFlee = recordData.mAiData.mFlee; - - if (record.baseOverrides.hasAiAlarm) - finalData.mAiData.mAlarm = recordData.mAiData.mAlarm; - - if (record.baseOverrides.hasAiServices) - finalData.mAiData.mServices = recordData.mAiData.mServices; - - if (record.baseOverrides.hasFlags) - finalData.mFlags = recordData.mFlags; - if (record.baseOverrides.hasScript) finalData.mScript = recordData.mScript; - if (!record.inventoryBaseId.empty() && doesRecordIdExist(record.inventoryBaseId)) - finalData.mInventory.mList = world->getStore().get().search(record.inventoryBaseId)->mInventory.mList; - else if (record.baseOverrides.hasInventory) - finalData.mInventory.mList = recordData.mInventory.mList; - world->getModifiableStore().overrideRecord(finalData); } else @@ -84,9 +49,9 @@ void RecordHelper::overrideRecord(const mwmp::CreatureRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::NpcRecord& record) +void RecordHelper::overrideRecord(const mwmp::ApparatusRecord& record) { - const ESM::NPC &recordData = record.data; + const ESM::Apparatus &recordData = record.data; if (recordData.mId.empty()) { @@ -94,191 +59,17 @@ void RecordHelper::overrideRecord(const mwmp::NpcRecord& record) return; } - bool isExistingId = doesRecordIdExist(recordData.mId); - MWBase::World *world = MWBase::Environment::get().getWorld(); - - if (record.baseId.empty()) - { - if (!doesRecordIdExist(recordData.mRace)) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new NPC record with invalid race provided"); - return; - } - else if (!doesRecordIdExist(recordData.mClass)) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new NPC record with invalid class provided"); - return; - } - else - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::NPC *baseData = world->getStore().get().search(record.baseId); - ESM::NPC finalData = *baseData; - finalData.mId = recordData.mId; - - if (record.baseOverrides.hasName) - finalData.mName = recordData.mName; - - if (record.baseOverrides.hasFlags) - finalData.mFlags = recordData.mFlags; - - // Because the gender is part of mFlags and can easily be set incorrectly there, - // we handle it separately here - if (record.baseOverrides.hasGender) - finalData.setIsMale(recordData.isMale()); - else - finalData.setIsMale(baseData->isMale()); - - if (!record.data.mRace.empty()) - finalData.mRace = recordData.mRace; - - if (record.baseOverrides.hasModel) - finalData.mModel = recordData.mModel; - - if (record.baseOverrides.hasHair) - finalData.mHair = recordData.mHair; - - if (record.baseOverrides.hasHead) - finalData.mHead = recordData.mHead; - - if (!recordData.mClass.empty()) - finalData.mClass = recordData.mClass; - - if (record.baseOverrides.hasFaction) - finalData.mFaction = recordData.mFaction; - - if (record.baseOverrides.hasScript) - finalData.mScript = recordData.mScript; - - if (record.baseOverrides.hasLevel) - finalData.mNpdt.mLevel = recordData.mNpdt.mLevel; - - if (record.baseOverrides.hasHealth) - finalData.mNpdt.mHealth = recordData.mNpdt.mHealth; - - if (record.baseOverrides.hasMagicka) - finalData.mNpdt.mMana = recordData.mNpdt.mMana; - - if (record.baseOverrides.hasFatigue) - finalData.mNpdt.mFatigue = recordData.mNpdt.mFatigue; - - if (record.baseOverrides.hasAiFight) - finalData.mAiData.mFight = recordData.mAiData.mFight; - - if (record.baseOverrides.hasAiFlee) - finalData.mAiData.mFlee = recordData.mAiData.mFlee; - - if (record.baseOverrides.hasAiAlarm) - finalData.mAiData.mAlarm = recordData.mAiData.mAlarm; - - if (record.baseOverrides.hasAiServices) - finalData.mAiData.mServices = recordData.mAiData.mServices; - - if (record.baseOverrides.hasFlags) - finalData.mFlags = recordData.mFlags; - - if (record.baseOverrides.hasAutoCalc) - { - finalData.mNpdtType = recordData.mNpdtType; - - if ((recordData.mFlags & ESM::NPC::Autocalc) != 0) - finalData.mFlags |= ESM::NPC::Autocalc; - else - finalData.mFlags &= ~ESM::NPC::Autocalc; - } - - if (!record.inventoryBaseId.empty() && doesRecordIdExist(record.inventoryBaseId)) - finalData.mInventory.mList = world->getStore().get().search(record.inventoryBaseId)->mInventory.mList; - else if (record.baseOverrides.hasInventory) - finalData.mInventory.mList = recordData.mInventory.mList; - - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } - - if (isExistingId) - world->updatePtrsWithRefId(recordData.mId); -} - -void RecordHelper::overrideRecord(const mwmp::EnchantmentRecord& record) -{ - const ESM::Enchantment &recordData = record.data; - - if (recordData.mId.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - MWBase::World *world = MWBase::Environment::get().getWorld(); - - if (record.baseId.empty()) - { - if (recordData.mEffects.mList.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new enchantment record with no effects"); - return; - } - else - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::Enchantment *baseData = world->getStore().get().search(record.baseId); - ESM::Enchantment finalData = *baseData; - finalData.mId = recordData.mId; - - if (record.baseOverrides.hasSubtype) - finalData.mData.mType = recordData.mData.mType; - - if (record.baseOverrides.hasCost) - finalData.mData.mCost = recordData.mData.mCost; - - if (record.baseOverrides.hasCharge) - finalData.mData.mCharge = recordData.mData.mCharge; - - if (record.baseOverrides.hasAutoCalc) - finalData.mData.mAutocalc = recordData.mData.mAutocalc; - - if (record.baseOverrides.hasEffects) - finalData.mEffects.mList = recordData.mEffects.mList; - - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } -} - -void RecordHelper::overrideRecord(const mwmp::PotionRecord& record) -{ - const ESM::Potion &recordData = record.data; - - if (recordData.mId.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - bool isExistingId = doesRecordIdExist(recordData.mId); + bool isExistingId = doesRecordIdExist(recordData.mId); MWBase::World *world = MWBase::Environment::get().getWorld(); if (record.baseId.empty()) { world->getModifiableStore().overrideRecord(recordData); } - else if (doesRecordIdExist(record.baseId)) + else if (doesRecordIdExist(record.baseId)) { - const ESM::Potion *baseData = world->getStore().get().search(record.baseId); - ESM::Potion finalData = *baseData; + const ESM::Apparatus *baseData = world->getStore().get().search(record.baseId); + ESM::Apparatus finalData = *baseData; finalData.mId = recordData.mId; if (record.baseOverrides.hasName) @@ -290,21 +81,21 @@ void RecordHelper::overrideRecord(const mwmp::PotionRecord& record) if (record.baseOverrides.hasIcon) finalData.mIcon = recordData.mIcon; + if (record.baseOverrides.hasSubtype) + finalData.mData.mType = recordData.mData.mType; + if (record.baseOverrides.hasWeight) finalData.mData.mWeight = recordData.mData.mWeight; if (record.baseOverrides.hasValue) finalData.mData.mValue = recordData.mData.mValue; - if (record.baseOverrides.hasAutoCalc) - finalData.mData.mAutoCalc = recordData.mData.mAutoCalc; + if (record.baseOverrides.hasQuality) + finalData.mData.mQuality = recordData.mData.mQuality; if (record.baseOverrides.hasScript) finalData.mScript = recordData.mScript; - if (record.baseOverrides.hasEffects) - finalData.mEffects.mList = recordData.mEffects.mList; - world->getModifiableStore().overrideRecord(finalData); } else @@ -317,53 +108,6 @@ void RecordHelper::overrideRecord(const mwmp::PotionRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::SpellRecord& record) -{ - const ESM::Spell &recordData = record.data; - - if (recordData.mId.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - bool isExistingId = doesRecordIdExist(recordData.mId); - MWBase::World *world = MWBase::Environment::get().getWorld(); - - if (record.baseId.empty()) - { - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::Spell *baseData = world->getStore().get().search(record.baseId); - ESM::Spell finalData = *baseData; - finalData.mId = recordData.mId; - - if (record.baseOverrides.hasName) - finalData.mName = recordData.mName; - - if (record.baseOverrides.hasSubtype) - finalData.mData.mType = recordData.mData.mType; - - if (record.baseOverrides.hasCost) - finalData.mData.mCost = recordData.mData.mCost; - - if (record.baseOverrides.hasFlags) - finalData.mData.mFlags = recordData.mData.mFlags; - - if (record.baseOverrides.hasEffects) - finalData.mEffects.mList = recordData.mEffects.mList; - - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } -} - void RecordHelper::overrideRecord(const mwmp::ArmorRecord& record) { const ESM::Armor &recordData = record.data; @@ -527,6 +271,63 @@ void RecordHelper::overrideRecord(const mwmp::BookRecord& record) world->updatePtrsWithRefId(recordData.mId); } +void RecordHelper::overrideRecord(const mwmp::CellRecord& record) +{ + MWBase::World *world = MWBase::Environment::get().getWorld(); + + ESM::Cell recordData = record.data; + + if (recordData.mName.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + MWWorld::Ptr playerPtr = world->getPlayerPtr(); + bool isCurrentCell = Misc::StringUtils::ciEqual(recordData.mName, playerPtr.getCell()->getCell()->mName); + + if (record.baseId.empty()) + { + recordData.mData.mFlags |= ESM::Cell::Flags::Interior; + recordData.mCellId.mWorldspace = Misc::StringUtils::lowerCase(recordData.mName); + + world->unloadCell(recordData); + world->clearCellStore(recordData); + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::Cell *baseData = world->getStore().get().search(record.baseId); + ESM::Cell finalData = *baseData; + finalData.mName = recordData.mName; + finalData.mCellId.mWorldspace = Misc::StringUtils::lowerCase(recordData.mName); + + world->unloadCell(finalData); + world->clearCellStore(finalData); + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } + + if (isCurrentCell) + { + // As a temporary solution, move the player to exterior 0, 0, but + // fix this once it's possible to override exteriors cells as well + ESM::Position tempPos; + tempPos.pos[0] = 0; + tempPos.pos[1] = 0; + tempPos.pos[2] = 0; + + ESM::Position playerPos = playerPtr.getRefData().getPosition(); + + world->changeToExteriorCell(tempPos, true, true); + world->changeToInteriorCell(recordData.mName, playerPos, true, true); + } +} + void RecordHelper::overrideRecord(const mwmp::ClothingRecord& record) { const ESM::Clothing &recordData = record.data; @@ -603,165 +404,6 @@ void RecordHelper::overrideRecord(const mwmp::ClothingRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::MiscellaneousRecord& record) -{ - const ESM::Miscellaneous &recordData = record.data; - - if (recordData.mId.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - bool isExistingId = doesRecordIdExist(recordData.mId); - MWBase::World *world = MWBase::Environment::get().getWorld(); - - if (record.baseId.empty()) - { - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::Miscellaneous *baseData = world->getStore().get().search(record.baseId); - ESM::Miscellaneous finalData = *baseData; - finalData.mId = recordData.mId; - - if (record.baseOverrides.hasName) - finalData.mName = recordData.mName; - - if (record.baseOverrides.hasModel) - finalData.mModel = recordData.mModel; - - if (record.baseOverrides.hasIcon) - finalData.mIcon = recordData.mIcon; - - if (record.baseOverrides.hasWeight) - finalData.mData.mWeight = recordData.mData.mWeight; - - if (record.baseOverrides.hasValue) - finalData.mData.mValue = recordData.mData.mValue; - - if (record.baseOverrides.hasKeyState) - finalData.mData.mIsKey = recordData.mData.mIsKey; - - if (record.baseOverrides.hasScript) - finalData.mScript = recordData.mScript; - - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } - - if (isExistingId) - world->updatePtrsWithRefId(recordData.mId); -} - -void RecordHelper::overrideRecord(const mwmp::WeaponRecord& record) -{ - const ESM::Weapon &recordData = record.data; - - if (recordData.mId.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - bool isExistingId = doesRecordIdExist(recordData.mId); - MWBase::World *world = MWBase::Environment::get().getWorld(); - - if (record.baseId.empty()) - { - if (!recordData.mEnchant.empty() && !doesRecordIdExist(recordData.mEnchant)) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new weapon record with invalid enchantmentId %s", recordData.mEnchant.c_str()); - return; - } - else - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::Weapon *baseData = world->getStore().get().search(record.baseId); - ESM::Weapon finalData = *baseData; - finalData.mId = recordData.mId; - - if (record.baseOverrides.hasName) - finalData.mName = recordData.mName; - - if (record.baseOverrides.hasModel) - finalData.mModel = recordData.mModel; - - if (record.baseOverrides.hasIcon) - finalData.mIcon = recordData.mIcon; - - if (record.baseOverrides.hasSubtype) - finalData.mData.mType = recordData.mData.mType; - - if (record.baseOverrides.hasWeight) - finalData.mData.mWeight = recordData.mData.mWeight; - - if (record.baseOverrides.hasValue) - finalData.mData.mValue = recordData.mData.mValue; - - if (record.baseOverrides.hasHealth) - finalData.mData.mHealth = recordData.mData.mHealth; - - if (record.baseOverrides.hasSpeed) - finalData.mData.mSpeed = recordData.mData.mSpeed; - - if (record.baseOverrides.hasReach) - finalData.mData.mReach = recordData.mData.mReach; - - if (record.baseOverrides.hasDamageChop) - { - finalData.mData.mChop[0] = recordData.mData.mChop[0]; - finalData.mData.mChop[1] = recordData.mData.mChop[1]; - } - - if (record.baseOverrides.hasDamageSlash) - { - finalData.mData.mSlash[0] = recordData.mData.mSlash[0]; - finalData.mData.mSlash[1] = recordData.mData.mSlash[1]; - } - - if (record.baseOverrides.hasDamageThrust) - { - finalData.mData.mThrust[0] = recordData.mData.mThrust[0]; - finalData.mData.mThrust[1] = recordData.mData.mThrust[1]; - } - - if (record.baseOverrides.hasFlags) - finalData.mData.mFlags = recordData.mData.mFlags; - - if (record.baseOverrides.hasEnchantmentId) - { - if (recordData.mEnchant.empty() || doesRecordIdExist(recordData.mEnchant)) - finalData.mEnchant = recordData.mEnchant; - else - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring invalid enchantmentId %s", recordData.mEnchant.c_str()); - } - - if (record.baseOverrides.hasEnchantmentCharge) - finalData.mData.mEnchant = recordData.mData.mEnchant; - - if (record.baseOverrides.hasScript) - finalData.mScript = recordData.mScript; - - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } - - if (isExistingId) - world->updatePtrsWithRefId(recordData.mId); -} - void RecordHelper::overrideRecord(const mwmp::ContainerRecord& record) { const ESM::Container &recordData = record.data; @@ -815,6 +457,85 @@ void RecordHelper::overrideRecord(const mwmp::ContainerRecord& record) world->updatePtrsWithRefId(recordData.mId); } +void RecordHelper::overrideRecord(const mwmp::CreatureRecord& record) +{ + const ESM::Creature &recordData = record.data; + + if (recordData.mId.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + bool isExistingId = doesRecordIdExist(recordData.mId); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + if (record.baseId.empty()) + { + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::Creature *baseData = world->getStore().get().search(record.baseId); + ESM::Creature finalData = *baseData; + finalData.mId = recordData.mId; + + if (record.baseOverrides.hasName) + finalData.mName = recordData.mName; + + if (record.baseOverrides.hasModel) + finalData.mModel = recordData.mModel; + + if (record.baseOverrides.hasSubtype) + finalData.mData.mType = recordData.mData.mType; + + if (record.baseOverrides.hasLevel) + finalData.mData.mLevel = recordData.mData.mLevel; + + if (record.baseOverrides.hasHealth) + finalData.mData.mHealth = recordData.mData.mHealth; + + if (record.baseOverrides.hasMagicka) + finalData.mData.mMana = recordData.mData.mMana; + + if (record.baseOverrides.hasFatigue) + finalData.mData.mFatigue = recordData.mData.mFatigue; + + if (record.baseOverrides.hasAiFight) + finalData.mAiData.mFight = recordData.mAiData.mFight; + + if (record.baseOverrides.hasAiFlee) + finalData.mAiData.mFlee = recordData.mAiData.mFlee; + + if (record.baseOverrides.hasAiAlarm) + finalData.mAiData.mAlarm = recordData.mAiData.mAlarm; + + if (record.baseOverrides.hasAiServices) + finalData.mAiData.mServices = recordData.mAiData.mServices; + + if (record.baseOverrides.hasFlags) + finalData.mFlags = recordData.mFlags; + + if (record.baseOverrides.hasScript) + finalData.mScript = recordData.mScript; + + if (!record.inventoryBaseId.empty() && doesRecordIdExist(record.inventoryBaseId)) + finalData.mInventory.mList = world->getStore().get().search(record.inventoryBaseId)->mInventory.mList; + else if (record.baseOverrides.hasInventory) + finalData.mInventory.mList = recordData.mInventory.mList; + + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } + + if (isExistingId) + world->updatePtrsWithRefId(recordData.mId); +} + void RecordHelper::overrideRecord(const mwmp::DoorRecord& record) { const ESM::Door &recordData = record.data; @@ -843,7 +564,7 @@ void RecordHelper::overrideRecord(const mwmp::DoorRecord& record) if (record.baseOverrides.hasModel) finalData.mModel = recordData.mModel; - + if (record.baseOverrides.hasOpenSound) finalData.mOpenSound = recordData.mOpenSound; @@ -865,9 +586,9 @@ void RecordHelper::overrideRecord(const mwmp::DoorRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::ActivatorRecord& record) +void RecordHelper::overrideRecord(const mwmp::EnchantmentRecord& record) { - const ESM::Activator &recordData = record.data; + const ESM::Enchantment &recordData = record.data; if (recordData.mId.empty()) { @@ -875,27 +596,38 @@ void RecordHelper::overrideRecord(const mwmp::ActivatorRecord& record) return; } - bool isExistingId = doesRecordIdExist(recordData.mId); MWBase::World *world = MWBase::Environment::get().getWorld(); if (record.baseId.empty()) { - world->getModifiableStore().overrideRecord(recordData); + if (recordData.mEffects.mList.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new enchantment record with no effects"); + return; + } + else + world->getModifiableStore().overrideRecord(recordData); } - else if (doesRecordIdExist(record.baseId)) + else if (doesRecordIdExist(record.baseId)) { - const ESM::Activator *baseData = world->getStore().get().search(record.baseId); - ESM::Activator finalData = *baseData; + const ESM::Enchantment *baseData = world->getStore().get().search(record.baseId); + ESM::Enchantment finalData = *baseData; finalData.mId = recordData.mId; - if (record.baseOverrides.hasName) - finalData.mName = recordData.mName; + if (record.baseOverrides.hasSubtype) + finalData.mData.mType = recordData.mData.mType; - if (record.baseOverrides.hasModel) - finalData.mModel = recordData.mModel; + if (record.baseOverrides.hasCost) + finalData.mData.mCost = recordData.mData.mCost; - if (record.baseOverrides.hasScript) - finalData.mScript = recordData.mScript; + if (record.baseOverrides.hasCharge) + finalData.mData.mCharge = recordData.mData.mCharge; + + if (record.baseOverrides.hasAutoCalc) + finalData.mData.mAutocalc = recordData.mData.mAutocalc; + + if (record.baseOverrides.hasEffects) + finalData.mEffects.mList = recordData.mEffects.mList; world->getModifiableStore().overrideRecord(finalData); } @@ -904,47 +636,6 @@ void RecordHelper::overrideRecord(const mwmp::ActivatorRecord& record) LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); return; } - - if (isExistingId) - world->updatePtrsWithRefId(recordData.mId); -} - -void RecordHelper::overrideRecord(const mwmp::StaticRecord& record) -{ - const ESM::Static &recordData = record.data; - - if (recordData.mId.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - bool isExistingId = doesRecordIdExist(recordData.mId); - MWBase::World *world = MWBase::Environment::get().getWorld(); - - if (record.baseId.empty()) - { - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::Static *baseData = world->getStore().get().search(record.baseId); - ESM::Static finalData = *baseData; - finalData.mId = recordData.mId; - - if (record.baseOverrides.hasModel) - finalData.mModel = recordData.mModel; - - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } - - if (isExistingId) - world->updatePtrsWithRefId(recordData.mId); } void RecordHelper::overrideRecord(const mwmp::IngredientRecord& record) @@ -1012,9 +703,9 @@ void RecordHelper::overrideRecord(const mwmp::IngredientRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::ApparatusRecord& record) +void RecordHelper::overrideRecord(const mwmp::LightRecord& record) { - const ESM::Apparatus &recordData = record.data; + const ESM::Light &recordData = record.data; if (recordData.mId.empty()) { @@ -1022,17 +713,17 @@ void RecordHelper::overrideRecord(const mwmp::ApparatusRecord& record) return; } - bool isExistingId = doesRecordIdExist(recordData.mId); + bool isExistingId = doesRecordIdExist(recordData.mId); MWBase::World *world = MWBase::Environment::get().getWorld(); if (record.baseId.empty()) { world->getModifiableStore().overrideRecord(recordData); } - else if (doesRecordIdExist(record.baseId)) + else if (doesRecordIdExist(record.baseId)) { - const ESM::Apparatus *baseData = world->getStore().get().search(record.baseId); - ESM::Apparatus finalData = *baseData; + const ESM::Light *baseData = world->getStore().get().search(record.baseId); + ESM::Light finalData = *baseData; finalData.mId = recordData.mId; if (record.baseOverrides.hasName) @@ -1044,8 +735,8 @@ void RecordHelper::overrideRecord(const mwmp::ApparatusRecord& record) if (record.baseOverrides.hasIcon) finalData.mIcon = recordData.mIcon; - if (record.baseOverrides.hasSubtype) - finalData.mData.mType = recordData.mData.mType; + if (record.baseOverrides.hasSound) + finalData.mSound = recordData.mSound; if (record.baseOverrides.hasWeight) finalData.mData.mWeight = recordData.mData.mWeight; @@ -1053,8 +744,17 @@ void RecordHelper::overrideRecord(const mwmp::ApparatusRecord& record) if (record.baseOverrides.hasValue) finalData.mData.mValue = recordData.mData.mValue; - if (record.baseOverrides.hasQuality) - finalData.mData.mQuality = recordData.mData.mQuality; + if (record.baseOverrides.hasTime) + finalData.mData.mTime = recordData.mData.mTime; + + if (record.baseOverrides.hasRadius) + finalData.mData.mRadius = recordData.mData.mRadius; + + if (record.baseOverrides.hasColor) + finalData.mData.mColor = recordData.mData.mColor; + + if (record.baseOverrides.hasFlags) + finalData.mData.mFlags = recordData.mData.mFlags; if (record.baseOverrides.hasScript) finalData.mScript = recordData.mScript; @@ -1130,6 +830,243 @@ void RecordHelper::overrideRecord(const mwmp::LockpickRecord& record) world->updatePtrsWithRefId(recordData.mId); } +void RecordHelper::overrideRecord(const mwmp::MiscellaneousRecord& record) +{ + const ESM::Miscellaneous &recordData = record.data; + + if (recordData.mId.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + bool isExistingId = doesRecordIdExist(recordData.mId); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + if (record.baseId.empty()) + { + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::Miscellaneous *baseData = world->getStore().get().search(record.baseId); + ESM::Miscellaneous finalData = *baseData; + finalData.mId = recordData.mId; + + if (record.baseOverrides.hasName) + finalData.mName = recordData.mName; + + if (record.baseOverrides.hasModel) + finalData.mModel = recordData.mModel; + + if (record.baseOverrides.hasIcon) + finalData.mIcon = recordData.mIcon; + + if (record.baseOverrides.hasWeight) + finalData.mData.mWeight = recordData.mData.mWeight; + + if (record.baseOverrides.hasValue) + finalData.mData.mValue = recordData.mData.mValue; + + if (record.baseOverrides.hasKeyState) + finalData.mData.mIsKey = recordData.mData.mIsKey; + + if (record.baseOverrides.hasScript) + finalData.mScript = recordData.mScript; + + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } + + if (isExistingId) + world->updatePtrsWithRefId(recordData.mId); +} + +void RecordHelper::overrideRecord(const mwmp::NpcRecord& record) +{ + const ESM::NPC &recordData = record.data; + + if (recordData.mId.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + bool isExistingId = doesRecordIdExist(recordData.mId); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + if (record.baseId.empty()) + { + if (!doesRecordIdExist(recordData.mRace)) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new NPC record with invalid race provided"); + return; + } + else if (!doesRecordIdExist(recordData.mClass)) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new NPC record with invalid class provided"); + return; + } + else + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::NPC *baseData = world->getStore().get().search(record.baseId); + ESM::NPC finalData = *baseData; + finalData.mId = recordData.mId; + + if (record.baseOverrides.hasName) + finalData.mName = recordData.mName; + + if (record.baseOverrides.hasFlags) + finalData.mFlags = recordData.mFlags; + + // Because the gender is part of mFlags and can easily be set incorrectly there, + // we handle it separately here + if (record.baseOverrides.hasGender) + finalData.setIsMale(recordData.isMale()); + else + finalData.setIsMale(baseData->isMale()); + + if (!record.data.mRace.empty()) + finalData.mRace = recordData.mRace; + + if (record.baseOverrides.hasModel) + finalData.mModel = recordData.mModel; + + if (record.baseOverrides.hasHair) + finalData.mHair = recordData.mHair; + + if (record.baseOverrides.hasHead) + finalData.mHead = recordData.mHead; + + if (!recordData.mClass.empty()) + finalData.mClass = recordData.mClass; + + if (record.baseOverrides.hasFaction) + finalData.mFaction = recordData.mFaction; + + if (record.baseOverrides.hasScript) + finalData.mScript = recordData.mScript; + + if (record.baseOverrides.hasLevel) + finalData.mNpdt.mLevel = recordData.mNpdt.mLevel; + + if (record.baseOverrides.hasHealth) + finalData.mNpdt.mHealth = recordData.mNpdt.mHealth; + + if (record.baseOverrides.hasMagicka) + finalData.mNpdt.mMana = recordData.mNpdt.mMana; + + if (record.baseOverrides.hasFatigue) + finalData.mNpdt.mFatigue = recordData.mNpdt.mFatigue; + + if (record.baseOverrides.hasAiFight) + finalData.mAiData.mFight = recordData.mAiData.mFight; + + if (record.baseOverrides.hasAiFlee) + finalData.mAiData.mFlee = recordData.mAiData.mFlee; + + if (record.baseOverrides.hasAiAlarm) + finalData.mAiData.mAlarm = recordData.mAiData.mAlarm; + + if (record.baseOverrides.hasAiServices) + finalData.mAiData.mServices = recordData.mAiData.mServices; + + if (record.baseOverrides.hasFlags) + finalData.mFlags = recordData.mFlags; + + if (record.baseOverrides.hasAutoCalc) + { + finalData.mNpdtType = recordData.mNpdtType; + + if ((recordData.mFlags & ESM::NPC::Autocalc) != 0) + finalData.mFlags |= ESM::NPC::Autocalc; + else + finalData.mFlags &= ~ESM::NPC::Autocalc; + } + + if (!record.inventoryBaseId.empty() && doesRecordIdExist(record.inventoryBaseId)) + finalData.mInventory.mList = world->getStore().get().search(record.inventoryBaseId)->mInventory.mList; + else if (record.baseOverrides.hasInventory) + finalData.mInventory.mList = recordData.mInventory.mList; + + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } + + if (isExistingId) + world->updatePtrsWithRefId(recordData.mId); +} + +void RecordHelper::overrideRecord(const mwmp::PotionRecord& record) +{ + const ESM::Potion &recordData = record.data; + + if (recordData.mId.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + bool isExistingId = doesRecordIdExist(recordData.mId); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + if (record.baseId.empty()) + { + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::Potion *baseData = world->getStore().get().search(record.baseId); + ESM::Potion finalData = *baseData; + finalData.mId = recordData.mId; + + if (record.baseOverrides.hasName) + finalData.mName = recordData.mName; + + if (record.baseOverrides.hasModel) + finalData.mModel = recordData.mModel; + + if (record.baseOverrides.hasIcon) + finalData.mIcon = recordData.mIcon; + + if (record.baseOverrides.hasWeight) + finalData.mData.mWeight = recordData.mData.mWeight; + + if (record.baseOverrides.hasValue) + finalData.mData.mValue = recordData.mData.mValue; + + if (record.baseOverrides.hasAutoCalc) + finalData.mData.mAutoCalc = recordData.mData.mAutoCalc; + + if (record.baseOverrides.hasScript) + finalData.mScript = recordData.mScript; + + if (record.baseOverrides.hasEffects) + finalData.mEffects.mList = recordData.mEffects.mList; + + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } + + if (isExistingId) + world->updatePtrsWithRefId(recordData.mId); +} + void RecordHelper::overrideRecord(const mwmp::ProbeRecord& record) { const ESM::Probe &recordData = record.data; @@ -1248,9 +1185,9 @@ void RecordHelper::overrideRecord(const mwmp::RepairRecord& record) world->updatePtrsWithRefId(recordData.mId); } -void RecordHelper::overrideRecord(const mwmp::LightRecord& record) +void RecordHelper::overrideRecord(const mwmp::SpellRecord& record) { - const ESM::Light &recordData = record.data; + const ESM::Spell &recordData = record.data; if (recordData.mId.empty()) { @@ -1258,17 +1195,108 @@ void RecordHelper::overrideRecord(const mwmp::LightRecord& record) return; } - bool isExistingId = doesRecordIdExist(recordData.mId); + bool isExistingId = doesRecordIdExist(recordData.mId); MWBase::World *world = MWBase::Environment::get().getWorld(); if (record.baseId.empty()) { world->getModifiableStore().overrideRecord(recordData); } - else if (doesRecordIdExist(record.baseId)) + else if (doesRecordIdExist(record.baseId)) { - const ESM::Light *baseData = world->getStore().get().search(record.baseId); - ESM::Light finalData = *baseData; + const ESM::Spell *baseData = world->getStore().get().search(record.baseId); + ESM::Spell finalData = *baseData; + finalData.mId = recordData.mId; + + if (record.baseOverrides.hasName) + finalData.mName = recordData.mName; + + if (record.baseOverrides.hasSubtype) + finalData.mData.mType = recordData.mData.mType; + + if (record.baseOverrides.hasCost) + finalData.mData.mCost = recordData.mData.mCost; + + if (record.baseOverrides.hasFlags) + finalData.mData.mFlags = recordData.mData.mFlags; + + if (record.baseOverrides.hasEffects) + finalData.mEffects.mList = recordData.mEffects.mList; + + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } +} + +void RecordHelper::overrideRecord(const mwmp::StaticRecord& record) +{ + const ESM::Static &recordData = record.data; + + if (recordData.mId.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + bool isExistingId = doesRecordIdExist(recordData.mId); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + if (record.baseId.empty()) + { + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::Static *baseData = world->getStore().get().search(record.baseId); + ESM::Static finalData = *baseData; + finalData.mId = recordData.mId; + + if (record.baseOverrides.hasModel) + finalData.mModel = recordData.mModel; + + world->getModifiableStore().overrideRecord(finalData); + } + else + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); + return; + } + + if (isExistingId) + world->updatePtrsWithRefId(recordData.mId); +} + +void RecordHelper::overrideRecord(const mwmp::WeaponRecord& record) +{ + const ESM::Weapon &recordData = record.data; + + if (recordData.mId.empty()) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); + return; + } + + bool isExistingId = doesRecordIdExist(recordData.mId); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + if (record.baseId.empty()) + { + if (!recordData.mEnchant.empty() && !doesRecordIdExist(recordData.mEnchant)) + { + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring new weapon record with invalid enchantmentId %s", recordData.mEnchant.c_str()); + return; + } + else + world->getModifiableStore().overrideRecord(recordData); + } + else if (doesRecordIdExist(record.baseId)) + { + const ESM::Weapon *baseData = world->getStore().get().search(record.baseId); + ESM::Weapon finalData = *baseData; finalData.mId = recordData.mId; if (record.baseOverrides.hasName) @@ -1280,8 +1308,8 @@ void RecordHelper::overrideRecord(const mwmp::LightRecord& record) if (record.baseOverrides.hasIcon) finalData.mIcon = recordData.mIcon; - if (record.baseOverrides.hasSound) - finalData.mSound = recordData.mSound; + if (record.baseOverrides.hasSubtype) + finalData.mData.mType = recordData.mData.mType; if (record.baseOverrides.hasWeight) finalData.mData.mWeight = recordData.mData.mWeight; @@ -1289,18 +1317,47 @@ void RecordHelper::overrideRecord(const mwmp::LightRecord& record) if (record.baseOverrides.hasValue) finalData.mData.mValue = recordData.mData.mValue; - if (record.baseOverrides.hasTime) - finalData.mData.mTime = recordData.mData.mTime; + if (record.baseOverrides.hasHealth) + finalData.mData.mHealth = recordData.mData.mHealth; - if (record.baseOverrides.hasRadius) - finalData.mData.mRadius = recordData.mData.mRadius; + if (record.baseOverrides.hasSpeed) + finalData.mData.mSpeed = recordData.mData.mSpeed; - if (record.baseOverrides.hasColor) - finalData.mData.mColor = recordData.mData.mColor; + if (record.baseOverrides.hasReach) + finalData.mData.mReach = recordData.mData.mReach; + + if (record.baseOverrides.hasDamageChop) + { + finalData.mData.mChop[0] = recordData.mData.mChop[0]; + finalData.mData.mChop[1] = recordData.mData.mChop[1]; + } + + if (record.baseOverrides.hasDamageSlash) + { + finalData.mData.mSlash[0] = recordData.mData.mSlash[0]; + finalData.mData.mSlash[1] = recordData.mData.mSlash[1]; + } + + if (record.baseOverrides.hasDamageThrust) + { + finalData.mData.mThrust[0] = recordData.mData.mThrust[0]; + finalData.mData.mThrust[1] = recordData.mData.mThrust[1]; + } if (record.baseOverrides.hasFlags) finalData.mData.mFlags = recordData.mData.mFlags; + if (record.baseOverrides.hasEnchantmentId) + { + if (recordData.mEnchant.empty() || doesRecordIdExist(recordData.mEnchant)) + finalData.mEnchant = recordData.mEnchant; + else + LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring invalid enchantmentId %s", recordData.mEnchant.c_str()); + } + + if (record.baseOverrides.hasEnchantmentCharge) + finalData.mData.mEnchant = recordData.mData.mEnchant; + if (record.baseOverrides.hasScript) finalData.mScript = recordData.mScript; @@ -1315,60 +1372,3 @@ void RecordHelper::overrideRecord(const mwmp::LightRecord& record) if (isExistingId) world->updatePtrsWithRefId(recordData.mId); } - -void RecordHelper::overrideRecord(const mwmp::CellRecord& record) -{ - MWBase::World *world = MWBase::Environment::get().getWorld(); - - ESM::Cell recordData = record.data; - - if (recordData.mName.empty()) - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with no id provided"); - return; - } - - MWWorld::Ptr playerPtr = world->getPlayerPtr(); - bool isCurrentCell = Misc::StringUtils::ciEqual(recordData.mName, playerPtr.getCell()->getCell()->mName); - - if (record.baseId.empty()) - { - recordData.mData.mFlags |= ESM::Cell::Flags::Interior; - recordData.mCellId.mWorldspace = Misc::StringUtils::lowerCase(recordData.mName); - - world->unloadCell(recordData); - world->clearCellStore(recordData); - world->getModifiableStore().overrideRecord(recordData); - } - else if (doesRecordIdExist(record.baseId)) - { - const ESM::Cell *baseData = world->getStore().get().search(record.baseId); - ESM::Cell finalData = *baseData; - finalData.mName = recordData.mName; - finalData.mCellId.mWorldspace = Misc::StringUtils::lowerCase(recordData.mName); - - world->unloadCell(finalData); - world->clearCellStore(finalData); - world->getModifiableStore().overrideRecord(finalData); - } - else - { - LOG_APPEND(TimedLog::LOG_INFO, "-- Ignoring record override with invalid baseId %s", record.baseId.c_str()); - return; - } - - if (isCurrentCell) - { - // As a temporary solution, move the player to exterior 0, 0, but - // fix this once it's possible to override exteriors cells as well - ESM::Position tempPos; - tempPos.pos[0] = 0; - tempPos.pos[1] = 0; - tempPos.pos[2] = 0; - - ESM::Position playerPos = playerPtr.getRefData().getPosition(); - - world->changeToExteriorCell(tempPos, true, true); - world->changeToInteriorCell(recordData.mName, playerPos, true, true); - } -} diff --git a/apps/openmw/mwmp/RecordHelper.hpp b/apps/openmw/mwmp/RecordHelper.hpp index e1d7c74f9..5e7655c3a 100644 --- a/apps/openmw/mwmp/RecordHelper.hpp +++ b/apps/openmw/mwmp/RecordHelper.hpp @@ -7,27 +7,27 @@ namespace RecordHelper { - void overrideRecord(const mwmp::CreatureRecord& record); - void overrideRecord(const mwmp::NpcRecord& record); - void overrideRecord(const mwmp::EnchantmentRecord& record); - void overrideRecord(const mwmp::PotionRecord& record); - void overrideRecord(const mwmp::SpellRecord& record); + void overrideRecord(const mwmp::ActivatorRecord& record); + void overrideRecord(const mwmp::ApparatusRecord& record); void overrideRecord(const mwmp::ArmorRecord& record); void overrideRecord(const mwmp::BookRecord& record); + void overrideRecord(const mwmp::CellRecord& record); void overrideRecord(const mwmp::ClothingRecord& record); - void overrideRecord(const mwmp::MiscellaneousRecord& record); - void overrideRecord(const mwmp::WeaponRecord& record); void overrideRecord(const mwmp::ContainerRecord& record); + void overrideRecord(const mwmp::CreatureRecord& record); void overrideRecord(const mwmp::DoorRecord& record); - void overrideRecord(const mwmp::ActivatorRecord& record); - void overrideRecord(const mwmp::StaticRecord& record); + void overrideRecord(const mwmp::EnchantmentRecord& record); void overrideRecord(const mwmp::IngredientRecord& record); - void overrideRecord(const mwmp::ApparatusRecord& record); + void overrideRecord(const mwmp::LightRecord& record); void overrideRecord(const mwmp::LockpickRecord& record); + void overrideRecord(const mwmp::MiscellaneousRecord& record); + void overrideRecord(const mwmp::NpcRecord& record); + void overrideRecord(const mwmp::PotionRecord& record); void overrideRecord(const mwmp::ProbeRecord& record); void overrideRecord(const mwmp::RepairRecord& record); - void overrideRecord(const mwmp::LightRecord& record); - void overrideRecord(const mwmp::CellRecord& record); + void overrideRecord(const mwmp::SpellRecord& record); + void overrideRecord(const mwmp::StaticRecord& record); + void overrideRecord(const mwmp::WeaponRecord& record); template void overrideRecord(const RecordType &record)