diff --git a/data/sql/updates/pending_db_world/rev_1559456042362460279.sql b/data/sql/updates/pending_db_world/rev_1559456042362460279.sql new file mode 100644 index 000000000..5b93fe14f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1559456042362460279.sql @@ -0,0 +1,14 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1559456042362460279'); + +-- use "SMART_ACTION_MUSIC" instead of "SMART_ACTION_SOUND" to play "Lament of the Highborne" as music for all players within 50 yards distance +-- changed the comments of the other SAI entries slightly +DELETE FROM `smart_scripts` WHERE `entryorguid` = 39048 AND `source_type` = 0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) +VALUES +(39048,0,0,0,60,0,100,1,200,200,0,0,0,11,37090,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Sylvanas Lamenter - On Update - Cast Spell ''Lament of the Highborne: Highborne Aura'' (No Repeat)'), +(39048,0,1,0,1,0,100,0,0,0,5000,5000,0,216,15095,1,0,0,0,0,18,50,0,0,0,0,0,0,0,'Sylvanas Lamenter - OOC - Play music for players within 50 yards (Repeat every 5 seconds)'), +(39048,0,2,3,60,0,100,1,1000,1000,0,0,0,60,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Sylvanas Lamenter - On Update - Set Fly (No Repeat)'), +(39048,0,3,0,61,0,100,0,0,0,0,0,0,69,1,0,0,0,0,0,1,0,0,0,0,0,0,6,0,'Sylvanas Lamenter - Linked - Move Pos To Self offset Z'); + +-- use "onlySelf" 1 for Thrall event as the music needs to be played only for the players directly +UPDATE `smart_scripts` SET `action_param2` = 1 WHERE `entryorguid` = 19556 AND `source_type` = 0 AND `action_type` = 216; diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 77e73b38b..25b2abc91 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -205,6 +205,45 @@ void ScriptedAI::DoPlaySoundToSet(WorldObject* source, uint32 soundId) source->PlayDirectSound(soundId); } +void ScriptedAI::DoPlayMusic(uint32 soundId, bool zone) +{ + ObjectList* targets = NULL; + + if (me && me->FindMap()) + { + Map::PlayerList const &players = me->GetMap()->GetPlayers(); + targets = new ObjectList(); + + if (!players.isEmpty()) + { + for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) + if (Player* player = i->GetSource()) + { + if (player->GetZoneId() == me->GetZoneId()) + { + if (!zone) + { + if (player->GetAreaId() == me->GetAreaId()) + targets->push_back(player); + } + else + targets->push_back(player); + } + } + } + } + + if (targets) + { + for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) + { + (*itr)->SendPlayMusic(soundId, true); + } + + delete targets; + } +} + Creature* ScriptedAI::DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, uint32 type, uint32 despawntime) { return me->SummonCreature(entry, me->GetPositionX() + offsetX, me->GetPositionY() + offsetY, me->GetPositionZ() + offsetZ, angle, TempSummonType(type), despawntime); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 5c7db9d11..9d2f09a43 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -14,6 +14,8 @@ #define CAST_AI(a, b) (dynamic_cast(b)) +typedef std::list ObjectList; + class InstanceScript; class SummonList @@ -237,6 +239,9 @@ struct ScriptedAI : public CreatureAI //Plays a sound to all nearby players void DoPlaySoundToSet(WorldObject* source, uint32 soundId); + //Plays music for all players in the zone (zone = true) or the area (zone = false) + void DoPlayMusic(uint32 soundId, bool zone); + //Drops all threat to 0%. Does not remove players from the threat list void DoResetThreat(); diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index 159141119..1c5f14b02 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -125,7 +125,7 @@ public: if (type == GUID_EVENT_INVOKER) { Talk(EMOTE_LAMENT); - DoPlaySoundToSet(me, SOUND_CREDIT); + DoPlayMusic(SOUND_CREDIT, true); DoCast(me, SPELL_SYLVANAS_CAST, false); playerGUID = guid; LamentEvent = true;