From 3111f7e988d322d03e53dad205a89cfbcda2612e Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 21 Mar 2020 14:12:00 +0100 Subject: [PATCH] [General] Cell record water level information --- .../Script/Functions/RecordsDynamic.cpp | 35 +++++++++++++++++++ .../Script/Functions/RecordsDynamic.hpp | 20 +++++++++++ apps/openmw/mwmp/RecordHelper.cpp | 11 ++++++ components/openmw-mp/Base/BaseWorldstate.hpp | 3 ++ .../Worldstate/PacketRecordDynamic.cpp | 2 ++ 5 files changed, 71 insertions(+) diff --git a/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp b/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp index b26571853..a156b7f27 100644 --- a/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp +++ b/apps/openmw-mp/Script/Functions/RecordsDynamic.cpp @@ -1530,6 +1530,41 @@ void RecordsDynamicFunctions::SetRecordFog(unsigned int red, unsigned int green, tempOverrides.hasFog = true; } +void RecordsDynamicFunctions::SetRecordHasWater(bool hasWater) noexcept +{ + unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; + + if (writeRecordsType == mwmp::RECORD_TYPE::CELL) { + if(hasWater) + tempCell.data.mData.mFlags |= ESM::Cell::Flags::HasWater; + else + tempCell.data.mData.mFlags &= ~ESM::Cell::Flags::HasWater; + } + else + { + LOG_MESSAGE_SIMPLE(TimedLog::LOG_ERROR, "Tried to set ambient color for record type %i which lacks that property", writeRecordsType); + return; + } + + tempOverrides.hasHasWater = true; +} + +void RecordsDynamicFunctions::SetRecordWaterLevel(double waterLevel) noexcept +{ + unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; + + if (writeRecordsType == mwmp::RECORD_TYPE::CELL) { + tempCell.data.mWater = waterLevel; + } + else + { + LOG_MESSAGE_SIMPLE(TimedLog::LOG_ERROR, "Tried to set ambient color for record type %i which lacks that property", writeRecordsType); + return; + } + + tempOverrides.hasWaterLevel = 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 75b5e6760..fa853693f 100644 --- a/apps/openmw-mp/Script/Functions/RecordsDynamic.hpp +++ b/apps/openmw-mp/Script/Functions/RecordsDynamic.hpp @@ -108,6 +108,8 @@ {"SetRecordAmbientColor", RecordsDynamicFunctions::SetRecordAmbientColor},\ {"SetRecordSunlightColor", RecordsDynamicFunctions::SetRecordSunlightColor},\ {"SetRecordFog", RecordsDynamicFunctions::SetRecordFog},\ + {"SetRecordHasWater", RecordsDynamicFunctions::SetRecordHasWater},\ + {"SetRecordWaterLevel", RecordsDynamicFunctions::SetRecordWaterLevel},\ \ {"SetRecordIdByIndex", RecordsDynamicFunctions::SetRecordIdByIndex},\ {"SetRecordEnchantmentIdByIndex", RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex},\ @@ -918,6 +920,24 @@ public: */ static void SetRecordFog(unsigned int red, unsigned int green, unsigned int blue, double density) noexcept; + /** + * \brief Set the has water of the temporary record stored on the server for the + * currently specified record type. + * + * \param hasWater Has water of the record + * \return void + */ + static void SetRecordHasWater(bool hasWater) noexcept; + + /** + * \brief Set the water level of the temporary record stored on the server for the + * currently specified record type. + * + * \param waterLevel waterLevel of the record + * \return void + */ + static void SetRecordWaterLevel(double waterLevel) 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 c38cf3f45..420c9f0cb 100644 --- a/apps/openmw/mwmp/RecordHelper.cpp +++ b/apps/openmw/mwmp/RecordHelper.cpp @@ -361,10 +361,21 @@ void RecordHelper::overrideRecord(const mwmp::CellRecord& record) finalData.mAmbi.mFog = recordData.mAmbi.mFog; finalData.mAmbi.mFogDensity = recordData.mAmbi.mFogDensity; } + if (record.baseOverrides.hasHasWater) { + bool hasWater = recordData.mData.mFlags & ESM::Cell::Flags::HasWater; + if (hasWater) + finalData.mData.mFlags |= ESM::Cell::Flags::HasWater; + else + finalData.mData.mFlags &= ~ESM::Cell::Flags::HasWater; + } + if (record.baseOverrides.hasWaterLevel) { + finalData.mWater = recordData.mWater; + } world->unloadCell(finalData); world->clearCellStore(finalData); world->getModifiableStore().overrideRecord(finalData); + } else { diff --git a/components/openmw-mp/Base/BaseWorldstate.hpp b/components/openmw-mp/Base/BaseWorldstate.hpp index 1845ab9a5..7a64b34fa 100644 --- a/components/openmw-mp/Base/BaseWorldstate.hpp +++ b/components/openmw-mp/Base/BaseWorldstate.hpp @@ -143,6 +143,9 @@ namespace mwmp bool hasAmbientColor = false; bool hasSunlightColor = false; bool hasFog = false; + bool hasHasWater = false; + bool hasWaterLevel = false; + }; struct ActivatorRecord diff --git a/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp b/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp index 35f79624d..289b5db55 100644 --- a/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp +++ b/components/openmw-mp/Packets/Worldstate/PacketRecordDynamic.cpp @@ -510,6 +510,8 @@ void PacketRecordDynamic::Packet(RakNet::BitStream *newBitstream, bool send) RW(overrides.hasAmbientColor, send); RW(overrides.hasSunlightColor, send); RW(overrides.hasFog, send); + RW(overrides.hasHasWater, send); + RW(overrides.hasWaterLevel, send); } } }