From 2b1ad75562cff5d8c80c49a28ddabd30a46e9be5 Mon Sep 17 00:00:00 2001 From: Warpten Date: Tue, 31 Dec 2019 14:34:43 +0100 Subject: [PATCH] Core/Spells: Implement alternative visuals for dynamic objects (#2) --- src/server/game/DataStores/DBCStructure.h | 2 +- src/server/game/DataStores/DBCfmt.h | 2 +- .../Entities/DynamicObject/DynamicObject.cpp | 49 +++++++++++++++++++ .../Entities/DynamicObject/DynamicObject.h | 2 + 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 2cd7d25e635..c03b471d6eb 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -2393,7 +2393,7 @@ struct SpellVisualEntry //uint32 PersistentAreaKit; //DBCPosition3D MissileCastOffset; //DBCPosition3D MissileImpactOffset; - //uint32 unknown + uint32 AlternativeVisualID; }; struct StableSlotPricesEntry diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index aa4cf3ae06f..4b8aba0e3b0 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -174,7 +174,7 @@ char const SpellLevelsEntryfmt[] = "diii"; char const SpellRuneCostfmt[] = "niiii"; char const SpellShapeshiftEntryfmt[] = "niiiix"; char const SpellShapeshiftFormfmt[] = "nxxiixiiixxiiiiiiiiix"; -char const SpellVisualfmt[] = "dxxxxxxiixxxxxxxxxxxxxxxxxxxxxxxx"; +char const SpellVisualfmt[] = "dxxxxxxiixxxxxxxxxxxxxxxxxxxxxxxi"; char const StableSlotPricesfmt[] = "ni"; char const SummonPropertiesfmt[] = "niiiii"; char const TalentEntryfmt[] = "niiiiiiiiixxixxxxxx"; diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 452e0ac0e05..bc8cda8e49e 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -171,6 +171,55 @@ void DynamicObject::Remove() } } +void DynamicObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const +{ + if (!target) + return; + + ByteBuffer fieldBuffer; + UpdateMask updateMask; + updateMask.SetCount(m_valuesCount); + + uint32* flags = nullptr; + uint32 visibleFlag = GetUpdateFieldData(target, flags); + ASSERT(flags); + + for (uint16 index = 0; index < m_valuesCount; ++index) + { + if (_fieldNotifyFlags & flags[index] || + ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag))) + { + updateMask.SetBit(index); + + if (index == DYNAMICOBJECT_BYTES) + { + if (Unit* caster = GetCaster()) + { + if (SpellInfo const* spellInfo = GetSpellInfo()) + { + SpellVisualEntry const* rootVisual = sSpellVisualStore.LookupEntry(spellInfo->SpellVisual[0]); + if (rootVisual && rootVisual->AlternativeVisualID) + { + SpellVisualEntry const* alternativeVisual = sSpellVisualStore.LookupEntry(rootVisual->AlternativeVisualID); + if (alternativeVisual && !caster->IsFriendlyTo(target)) + { + fieldBuffer << (rootVisual->AlternativeVisualID | (DYNAMIC_OBJECT_AREA_SPELL << 28)); + continue; + } + } + } + } + } + + fieldBuffer << m_uint32Values[index]; + } + } + + *data << uint8(updateMask.GetBlockCount()); + updateMask.AppendToPacket(data); + data->append(fieldBuffer); +} + int32 DynamicObject::GetDuration() const { if (!_aura) diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index 85f479780bd..dd268908252 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -43,6 +43,8 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject