diff options
author | Meji <alvaro.megias@outlook.com> | 2024-05-18 08:56:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-18 08:56:26 +0200 |
commit | 2ad7c7829b17bb9e6e951632e8e0e68f68b9aa44 (patch) | |
tree | 105f81c55cfbf805afa0bb3d3556d29f0ea58629 | |
parent | f3397de92f09b2799e9f257df333f2ae1fa1bb07 (diff) |
Core/AreaTriggers: Move SpellForVisuals override from AT spawn to properties (#29982)
4 files changed, 54 insertions, 36 deletions
diff --git a/sql/updates/world/master/2024_05_18_01_world.sql b/sql/updates/world/master/2024_05_18_01_world.sql new file mode 100644 index 00000000000..726c4bcbbb8 --- /dev/null +++ b/sql/updates/world/master/2024_05_18_01_world.sql @@ -0,0 +1,17 @@ +DELIMITER ;; +CREATE PROCEDURE 2024_05_18_01_areatrigger_spellvisual() BEGIN + IF NOT EXISTS (SELECT * FROM `information_schema`.`columns` WHERE `table_schema`=SCHEMA() AND `table_name`='areatrigger_create_properties' AND `column_name`='SpellsForVisuals') THEN + + ALTER TABLE `areatrigger` + DROP COLUMN `SpellForVisuals`; + + ALTER TABLE `areatrigger_create_properties` + ADD COLUMN `SpellForVisuals` INT AFTER `DecalPropertiesId`; + + END IF; +END;; + +DELIMITER ; +CALL 2024_05_18_01_areatrigger_spellvisual(); + +DROP PROCEDURE IF EXISTS 2024_05_18_01_areatrigger_spellvisual; diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 89d6aaaa599..af7170cf345 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -109,7 +109,7 @@ void AreaTrigger::PlaySpellVisual(uint32 spellVisualId) const SendMessageToSet(packet.Write(), false); } -bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Map* map, Position const& pos, int32 duration, AreaTriggerSpawn const* spawnData /* nullptr */, Unit* caster /*= nullptr*/, Unit* target /*= nullptr*/, SpellCastVisual spellVisual /*= { 0, 0 }*/, SpellInfo const* spellInfo /*= nullptr*/, Spell* spell /*= nullptr*/, AuraEffect const* aurEff /*= nullptr*/) +bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Map* map, Position const& pos, int32 duration, AreaTriggerSpawn const* spawnData /*= nullptr*/, Unit* caster /*= nullptr*/, Unit* target /*= nullptr*/, SpellCastVisual spellVisual /*= { 0, 0 }*/, SpellInfo const* spellInfo /*= nullptr*/, Spell* spell /*= nullptr*/, AuraEffect const* aurEff /*= nullptr*/) { _targetGuid = target ? target->GetGUID() : ObjectGuid::Empty; _aurEff = aurEff; @@ -151,8 +151,18 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreatingEffectGUID), spell->m_castId); if (spellInfo && !IsStaticSpawn()) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellID), spellInfo->Id); - if (spellInfo) - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spellInfo->Id); + + SpellInfo const* spellForVisuals = spellInfo; + if (GetCreateProperties()->SpellForVisuals) + { + spellForVisuals = sSpellMgr->GetSpellInfo(*GetCreateProperties()->SpellForVisuals, DIFFICULTY_NONE); + + if (spellForVisuals) + spellVisual.SpellXSpellVisualID = spellForVisuals->GetSpellXSpellVisualId(); + } + if (spellForVisuals) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spellForVisuals->Id); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); if (!IsStaticSpawn()) @@ -290,17 +300,7 @@ bool AreaTrigger::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool /*addTo if (!createProperties) return false; - SpellInfo const* spellInfo = nullptr; - SpellCastVisual spellVisual; - if (spawnData->SpellForVisuals) - { - spellInfo = sSpellMgr->GetSpellInfo(*spawnData->SpellForVisuals, DIFFICULTY_NONE); - - if (spellInfo) - spellVisual.SpellXSpellVisualID = spellInfo->GetSpellXSpellVisualId(); - } - - return Create(spawnData->Id, map, spawnData->spawnPoint, -1, spawnData, nullptr, nullptr, spellVisual, spellInfo); + return Create(spawnData->Id, map, spawnData->spawnPoint, -1, spawnData); } void AreaTrigger::Update(uint32 diff) diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index c6e3f4f67eb..df8f6aa2094 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -246,6 +246,8 @@ public: uint32 DecalPropertiesId; + Optional<int32> SpellForVisuals; + uint32 TimeToTarget; uint32 TimeToTargetScale; @@ -265,7 +267,6 @@ struct AreaTriggerSpawn : SpawnData AreaTriggerSpawn() : SpawnData(SPAWN_TYPE_AREATRIGGER) { } AreaTriggerCreatePropertiesId Id; - Optional<int32> SpellForVisuals; }; #endif diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp index a664f56431d..c170b33cdc8 100644 --- a/src/server/game/Globals/AreaTriggerDataStore.cpp +++ b/src/server/game/Globals/AreaTriggerDataStore.cpp @@ -167,9 +167,9 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() // 0 1 2 3 4 if (QueryResult areatriggerCreateProperties = WorldDatabase.Query("SELECT Id, IsCustom, AreaTriggerId, IsAreatriggerCustom, Flags, " - // 5 6 7 8 9 10 11 12 13 - "MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, TimeToTarget, TimeToTargetScale, " - // 14 15 16 17 18 19 20 21 22 23 + // 5 6 7 8 9 10 11 12 13 14 + "MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, SpellForVisuals, TimeToTarget, TimeToTargetScale, " + // 15 16 17 18 19 20 21 22 23 24 "Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5, ShapeData6, ShapeData7, ScriptName FROM `areatrigger_create_properties`")) { do @@ -185,7 +185,7 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() createProperties.Flags = AreaTriggerCreatePropertiesFlag(fields[4].GetUInt32()); - AreaTriggerShapeType shape = AreaTriggerShapeType(fields[14].GetUInt8()); + AreaTriggerShapeType shape = AreaTriggerShapeType(fields[15].GetUInt8()); if (areaTriggerId.Id && !createProperties.Template) { @@ -222,14 +222,24 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() createProperties.DecalPropertiesId = fields[11].GetUInt32(); - createProperties.TimeToTarget = fields[12].GetUInt32(); - createProperties.TimeToTargetScale = fields[13].GetUInt32(); + if (!fields[12].IsNull()) + { + createProperties.SpellForVisuals = fields[12].GetInt32(); + if (!sSpellMgr->GetSpellInfo(*createProperties.SpellForVisuals, DIFFICULTY_NONE)) + { + TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with invalid SpellForVisual {}, set to none.", createPropertiesId.Id, uint32(createPropertiesId.IsCustom), *createProperties.SpellForVisuals); + createProperties.SpellForVisuals.reset(); + } + } + + createProperties.TimeToTarget = fields[13].GetUInt32(); + createProperties.TimeToTargetScale = fields[14].GetUInt32(); createProperties.Shape.Type = static_cast<AreaTriggerShapeType>(shape); for (uint8 i = 0; i < MAX_AREATRIGGER_ENTITY_DATA; ++i) - createProperties.Shape.DefaultDatas.Data[i] = fields[15 + i].GetFloat(); + createProperties.Shape.DefaultDatas.Data[i] = fields[16 + i].GetFloat(); - createProperties.ScriptId = sObjectMgr->GetScriptId(fields[23].GetString()); + createProperties.ScriptId = sObjectMgr->GetScriptId(fields[24].GetString()); if (shape == AreaTriggerShapeType::Polygon) { @@ -317,8 +327,8 @@ void AreaTriggerDataStore::LoadAreaTriggerSpawns() spawnMasks[mapDifficulty->MapID].insert(Difficulty(mapDifficulty->DifficultyID)); uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - if (QueryResult templates = WorldDatabase.Query("SELECT SpawnId, AreaTriggerCreatePropertiesId, IsCustom, MapId, SpawnDifficulties, PosX, PosY, PosZ, Orientation, PhaseUseFlags, PhaseId, PhaseGroup, SpellForVisuals, ScriptName FROM `areatrigger`")) + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + if (QueryResult templates = WorldDatabase.Query("SELECT SpawnId, AreaTriggerCreatePropertiesId, IsCustom, MapId, SpawnDifficulties, PosX, PosY, PosZ, Orientation, PhaseUseFlags, PhaseId, PhaseGroup, ScriptName FROM `areatrigger`")) { do { @@ -395,17 +405,7 @@ void AreaTriggerDataStore::LoadAreaTriggerSpawns() spawn.phaseId = fields[10].GetUInt32(); spawn.phaseGroup = fields[11].GetUInt32(); - if (!fields[12].IsNull()) - { - spawn.SpellForVisuals = fields[12].GetInt32(); - if (!sSpellMgr->GetSpellInfo(spawn.SpellForVisuals.value(), DIFFICULTY_NONE)) - { - TC_LOG_ERROR("sql.sql", "Table `areatrigger` has areatrigger (GUID: {}) with invalid SpellForVisual {}, set to none.", spawnId, *spawn.SpellForVisuals); - spawn.SpellForVisuals.reset(); - } - } - - spawn.scriptId = sObjectMgr->GetScriptId(fields[13].GetString()); + spawn.scriptId = sObjectMgr->GetScriptId(fields[12].GetString()); spawn.spawnGroupData = sObjectMgr->GetLegacySpawnGroup(); // Add the trigger to a map::cell map, which is later used by GridLoader to query |