forked from teamnwah/openmw-tes3coop
[General] Allow setting of AI fight & dynamic stats in record packets
Additionally, allow the setting of the Autocalc flag for an NPC record based on an existing record.
This commit is contained in:
parent
d03722b3f4
commit
888e1dfff8
5 changed files with 140 additions and 1 deletions
|
@ -719,6 +719,10 @@ void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept
|
||||||
tempArmor.data.mData.mHealth = health;
|
tempArmor.data.mData.mHealth = health;
|
||||||
else if (writeRecordsType == mwmp::RECORD_TYPE::WEAPON)
|
else if (writeRecordsType == mwmp::RECORD_TYPE::WEAPON)
|
||||||
tempWeapon.data.mData.mHealth = health;
|
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
|
else
|
||||||
{
|
{
|
||||||
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set health for record type %i which lacks that property", writeRecordsType);
|
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;
|
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
|
void RecordsDynamicFunctions::SetRecordIdByIndex(unsigned int index, const char* id) noexcept
|
||||||
{
|
{
|
||||||
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
|
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
|
||||||
|
|
|
@ -80,6 +80,9 @@
|
||||||
{"SetRecordFaction", RecordsDynamicFunctions::SetRecordFaction},\
|
{"SetRecordFaction", RecordsDynamicFunctions::SetRecordFaction},\
|
||||||
\
|
\
|
||||||
{"SetRecordLevel", RecordsDynamicFunctions::SetRecordLevel},\
|
{"SetRecordLevel", RecordsDynamicFunctions::SetRecordLevel},\
|
||||||
|
{"SetRecordMagicka", RecordsDynamicFunctions::SetRecordMagicka},\
|
||||||
|
{"SetRecordFatigue", RecordsDynamicFunctions::SetRecordFatigue},\
|
||||||
|
{"SetRecordAiFight", RecordsDynamicFunctions::SetRecordAiFight},\
|
||||||
\
|
\
|
||||||
{"SetRecordIdByIndex", RecordsDynamicFunctions::SetRecordIdByIndex},\
|
{"SetRecordIdByIndex", RecordsDynamicFunctions::SetRecordIdByIndex},\
|
||||||
{"SetRecordEnchantmentIdByIndex", RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex},\
|
{"SetRecordEnchantmentIdByIndex", RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex},\
|
||||||
|
@ -677,11 +680,38 @@ public:
|
||||||
* \brief Set the level of the temporary record stored on the server for the
|
* \brief Set the level of the temporary record stored on the server for the
|
||||||
* currently specified record type.
|
* currently specified record type.
|
||||||
*
|
*
|
||||||
* \param value The level of the record.
|
* \param level The level of the record.
|
||||||
* \return void
|
* \return void
|
||||||
*/
|
*/
|
||||||
static void SetRecordLevel(int level) noexcept;
|
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.
|
* \brief Set the id of the record at a certain index in the records stored on the server.
|
||||||
*
|
*
|
||||||
|
|
|
@ -139,6 +139,18 @@ void RecordHelper::overrideCreatureRecord(const mwmp::CreatureRecord& record)
|
||||||
if (record.baseOverrides.hasLevel)
|
if (record.baseOverrides.hasLevel)
|
||||||
finalData.mData.mLevel = recordData.mData.mLevel;
|
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)
|
if (record.baseOverrides.hasFlags)
|
||||||
finalData.mFlags = recordData.mFlags;
|
finalData.mFlags = recordData.mFlags;
|
||||||
|
|
||||||
|
@ -228,9 +240,31 @@ void RecordHelper::overrideNpcRecord(const mwmp::NpcRecord& record)
|
||||||
if (record.baseOverrides.hasLevel)
|
if (record.baseOverrides.hasLevel)
|
||||||
finalData.mNpdt.mLevel = recordData.mNpdt.mLevel;
|
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)
|
if (record.baseOverrides.hasAutoCalc)
|
||||||
|
{
|
||||||
finalData.mNpdtType = recordData.mNpdtType;
|
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))
|
if (!record.inventoryBaseId.empty() && doesNpcRecordExist(record.inventoryBaseId))
|
||||||
finalData.mInventory.mList = world->getStore().get<ESM::NPC>().search(record.inventoryBaseId)->mInventory.mList;
|
finalData.mInventory.mList = world->getStore().get<ESM::NPC>().search(record.inventoryBaseId)->mInventory.mList;
|
||||||
else if (record.baseOverrides.hasInventory)
|
else if (record.baseOverrides.hasInventory)
|
||||||
|
|
|
@ -88,6 +88,9 @@ namespace mwmp
|
||||||
bool hasFaction = false;
|
bool hasFaction = false;
|
||||||
|
|
||||||
bool hasLevel = false;
|
bool hasLevel = false;
|
||||||
|
bool hasMagicka = false;
|
||||||
|
bool hasFatigue = false;
|
||||||
|
bool hasAiFight = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ArmorRecord
|
struct ArmorRecord
|
||||||
|
|
|
@ -176,6 +176,10 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send)
|
||||||
RW(recordData.mModel, send, true);
|
RW(recordData.mModel, send, true);
|
||||||
RW(recordData.mData.mType, send);
|
RW(recordData.mData.mType, send);
|
||||||
RW(recordData.mData.mLevel, 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.mFlags, send);
|
||||||
RW(recordData.mScript, send, true);
|
RW(recordData.mScript, send, true);
|
||||||
ProcessInventoryList(record.inventory, recordData.mInventory, send);
|
ProcessInventoryList(record.inventory, recordData.mInventory, send);
|
||||||
|
@ -187,6 +191,10 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send)
|
||||||
RW(overrides.hasModel, send);
|
RW(overrides.hasModel, send);
|
||||||
RW(overrides.hasSubtype, send);
|
RW(overrides.hasSubtype, send);
|
||||||
RW(overrides.hasLevel, 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.hasFlags, send);
|
||||||
RW(overrides.hasScript, send);
|
RW(overrides.hasScript, send);
|
||||||
RW(overrides.hasInventory, send);
|
RW(overrides.hasInventory, send);
|
||||||
|
@ -212,6 +220,10 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *bs, bool send)
|
||||||
RW(recordData.mFaction, send, true);
|
RW(recordData.mFaction, send, true);
|
||||||
RW(recordData.mScript, send, true);
|
RW(recordData.mScript, send, true);
|
||||||
RW(recordData.mNpdt.mLevel, send);
|
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);
|
RW(recordData.mNpdtType, send);
|
||||||
ProcessInventoryList(record.inventory, recordData.mInventory, 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.hasFaction, send);
|
||||||
RW(overrides.hasScript, send);
|
RW(overrides.hasScript, send);
|
||||||
RW(overrides.hasLevel, 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);
|
RW(overrides.hasInventory, send);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue