diff --git a/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp b/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp index 32d5f8260..24f7371df 100644 --- a/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp +++ b/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp @@ -719,6 +719,10 @@ void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept tempArmor.data.mData.mHealth = health; else if (writeRecordsType == mwmp::RECORD_TYPE::WEAPON) tempWeapon.data.mData.mHealth = health; + else if (writeRecordsType == mwmp::RECORD_TYPE::CREATURE) + tempCreature.data.mData.mHealth = health; + else if (writeRecordsType == mwmp::RECORD_TYPE::NPC) + tempNpc.data.mNpdt.mHealth = health; else { LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set health for record type %i which lacks that property", writeRecordsType); @@ -971,6 +975,57 @@ void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept tempOverrides.hasLevel = true; } +void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept +{ + unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; + + if (writeRecordsType == mwmp::RECORD_TYPE::CREATURE) + tempCreature.data.mData.mMana = magicka; + else if (writeRecordsType == mwmp::RECORD_TYPE::NPC) + tempNpc.data.mNpdt.mMana = magicka; + else + { + LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set magicka for record type %i which lacks that property", writeRecordsType); + return; + } + + tempOverrides.hasMagicka = true; +} + +void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept +{ + unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; + + if (writeRecordsType == mwmp::RECORD_TYPE::CREATURE) + tempCreature.data.mData.mFatigue = fatigue; + else if (writeRecordsType == mwmp::RECORD_TYPE::NPC) + tempNpc.data.mNpdt.mFatigue = fatigue; + else + { + LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set fatigue for record type %i which lacks that property", writeRecordsType); + return; + } + + tempOverrides.hasFatigue = true; +} + +void RecordsDynamicFunctions::SetRecordAiFight(int aiFight) noexcept +{ + unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; + + if (writeRecordsType == mwmp::RECORD_TYPE::CREATURE) + tempCreature.data.mAiData.mFight = aiFight; + else if (writeRecordsType == mwmp::RECORD_TYPE::NPC) + tempNpc.data.mAiData.mFight = aiFight; + else + { + LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set AI fight for record type %i which lacks that property", writeRecordsType); + return; + } + + tempOverrides.hasAiFight = true; +} + void RecordsDynamicFunctions::SetRecordIdByIndex(unsigned int index, const char* id) noexcept { unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; diff --git a/apps/openmw-mp/Script/Functions/RecordsDynamic.hpp b/apps/openmw-mp/Script/Functions/RecordsDynamic.hpp index 34b62c12b..d089f5303 100644 --- a/apps/openmw-mp/Script/Functions/RecordsDynamic.hpp +++ b/apps/openmw-mp/Script/Functions/RecordsDynamic.hpp @@ -80,6 +80,9 @@ {"SetRecordFaction", RecordsDynamicFunctions::SetRecordFaction},\ \ {"SetRecordLevel", RecordsDynamicFunctions::SetRecordLevel},\ + {"SetRecordMagicka", RecordsDynamicFunctions::SetRecordMagicka},\ + {"SetRecordFatigue", RecordsDynamicFunctions::SetRecordFatigue},\ + {"SetRecordAiFight", RecordsDynamicFunctions::SetRecordAiFight},\ \ {"SetRecordIdByIndex", RecordsDynamicFunctions::SetRecordIdByIndex},\ {"SetRecordEnchantmentIdByIndex", RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex},\ @@ -677,11 +680,38 @@ public: * \brief Set the level of the temporary record stored on the server for the * currently specified record type. * - * \param value The level of the record. + * \param level The level of the record. * \return void */ static void SetRecordLevel(int level) noexcept; + /** + * \brief Set the magicka of the temporary record stored on the server for the + * currently specified record type. + * + * \param magicka The magicka of the record. + * \return void + */ + static void SetRecordMagicka(int magicka) noexcept; + + /** + * \brief Set the fatigue of the temporary record stored on the server for the + * currently specified record type. + * + * \param fatigue The fatigue of the record. + * \return void + */ + static void SetRecordFatigue(int fatigue) noexcept; + + /** + * \brief Set the AI fight value of the temporary record stored on the server for the + * currently specified record type. + * + * \param aiFight The AI fight value of the record. + * \return void + */ + static void SetRecordAiFight(int aiFight) noexcept; + /** * \brief Set the id of the record at a certain index in the records stored on the server. * diff --git a/apps/openmw/mwmp/RecordHelper.cpp b/apps/openmw/mwmp/RecordHelper.cpp index 5d4eba57b..0dd538818 100644 --- a/apps/openmw/mwmp/RecordHelper.cpp +++ b/apps/openmw/mwmp/RecordHelper.cpp @@ -139,6 +139,18 @@ void RecordHelper::overrideCreatureRecord(const mwmp::CreatureRecord& record) 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.hasFlags) finalData.mFlags = recordData.mFlags; @@ -228,9 +240,31 @@ void RecordHelper::overrideNpcRecord(const mwmp::NpcRecord& record) 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.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() && doesNpcRecordExist(record.inventoryBaseId)) finalData.mInventory.mList = world->getStore().get().search(record.inventoryBaseId)->mInventory.mList; else if (record.baseOverrides.hasInventory) diff --git a/components/openmw-mp/Base/BaseWorldstate.hpp b/components/openmw-mp/Base/BaseWorldstate.hpp index 4bf8feec0..8860a0ec8 100644 --- a/components/openmw-mp/Base/BaseWorldstate.hpp +++ b/components/openmw-mp/Base/BaseWorldstate.hpp @@ -88,6 +88,9 @@ namespace mwmp bool hasFaction = false; bool hasLevel = false; + bool hasMagicka = false; + bool hasFatigue = false; + bool hasAiFight = false; }; struct ArmorRecord diff --git a/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp b/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp index d0e83d78d..f3d6600c6 100644 --- a/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp +++ b/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp @@ -176,6 +176,10 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send) RW(recordData.mModel, send, true); RW(recordData.mData.mType, send); RW(recordData.mData.mLevel, send); + RW(recordData.mData.mHealth, send); + RW(recordData.mData.mMana, send); + RW(recordData.mData.mFatigue, send); + RW(recordData.mAiData.mFight, send); RW(recordData.mFlags, send); RW(recordData.mScript, send, true); ProcessInventoryList(record.inventory, recordData.mInventory, send); @@ -187,6 +191,10 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send) RW(overrides.hasModel, send); RW(overrides.hasSubtype, send); RW(overrides.hasLevel, send); + RW(overrides.hasHealth, send); + RW(overrides.hasMagicka, send); + RW(overrides.hasFatigue, send); + RW(overrides.hasAiFight, send); RW(overrides.hasFlags, send); RW(overrides.hasScript, send); RW(overrides.hasInventory, send); @@ -212,6 +220,10 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send) RW(recordData.mFaction, send, true); RW(recordData.mScript, send, true); RW(recordData.mNpdt.mLevel, send); + RW(recordData.mNpdt.mHealth, send); + RW(recordData.mNpdt.mMana, send); + RW(recordData.mNpdt.mFatigue, send); + RW(recordData.mAiData.mFight, send); RW(recordData.mNpdtType, send); ProcessInventoryList(record.inventory, recordData.mInventory, send); @@ -227,6 +239,11 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send) RW(overrides.hasFaction, send); RW(overrides.hasScript, send); RW(overrides.hasLevel, send); + RW(overrides.hasHealth, send); + RW(overrides.hasMagicka, send); + RW(overrides.hasFatigue, send); + RW(overrides.hasAiFight, send); + RW(overrides.hasAutoCalc, send); RW(overrides.hasInventory, send); } }