diff --git a/data/sql/updates/pending_db_world/rev_1597612448272232200.sql b/data/sql/updates/pending_db_world/rev_1597612448272232200.sql new file mode 100644 index 000000000..0f7c35d69 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1597612448272232200.sql @@ -0,0 +1,16 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1597612448272232200'); + +UPDATE `gameobject_template` SET `ScriptName` = 'go_brewfest_music' WHERE `entry` = 186221; +UPDATE `gameobject_template` SET `ScriptName` = 'go_pirate_day_music' WHERE `entry` = 190363; +UPDATE `gameobject_template` SET `ScriptName` = 'go_darkmoon_faire_music' WHERE `entry` = 180335; +UPDATE `gameobject_template` SET `ScriptName` = 'go_midsummer_music' WHERE `entry` = 188174; + +SET @LASTGUID = 4718; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @LASTGUID+1 AND @LASTGUID+2; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@LASTGUID+1 , 186221, 530, 1, 1, -1897.498, 5560.614, -12.34483, 4.363323, 0, 0, 0, 0, 120, 255, 1), +(@LASTGUID+2 , 186221, 530, 1, 1, 9325.442, -7276.318, 13.34217, 4.363323, 0, 0, 0, 0, 120, 255, 1); + +DELETE FROM `game_event_gameobject` WHERE `guid` IN (@LASTGUID+1,@LASTGUID+2); +INSERT INTO `game_event_gameobject` VALUES (24, @LASTGUID+1); +INSERT INTO `game_event_gameobject` VALUES (24, @LASTGUID+2); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index cc44d690b..95604f9f1 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2894,6 +2894,21 @@ void WorldObject::PlayDirectSound(uint32 sound_id, Player* target /*= NULL*/) SendMessageToSet(&data, true); } + +void WorldObject::PlayDirectMusic(uint32 music_id, Player* target /*= NULL*/) +{ + WorldPacket data(SMSG_PLAY_MUSIC, 4); + data << uint32(music_id); + if (target) + { + target->SendDirectMessage(&data); + } + else + { + SendMessageToSet(&data, true); + } +} + void WorldObject::DestroyForNearbyPlayers() { if (!IsInWorld()) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index ce54e9c73..72e9d9188 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -913,6 +913,7 @@ class WorldObject : public Object, public WorldLocation void PlayDistanceSound(uint32 sound_id, Player* target = nullptr); void PlayDirectSound(uint32 sound_id, Player* target = nullptr); + void PlayDirectMusic(uint32 music_id, Player* target = nullptr); void SendObjectDeSpawnAnim(uint64 guid); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 0029b6587..4e2e5a395 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -410,6 +410,369 @@ public: // Theirs +/*#### +## go_brewfest_music +####*/ + +enum BrewfestMusic +{ + EVENT_BREWFESTDWARF01 = 11810, // 1.35 min + EVENT_BREWFESTDWARF02 = 11812, // 1.55 min + EVENT_BREWFESTDWARF03 = 11813, // 0.23 min + EVENT_BREWFESTGOBLIN01 = 11811, // 1.08 min + EVENT_BREWFESTGOBLIN02 = 11814, // 1.33 min + EVENT_BREWFESTGOBLIN03 = 11815 // 0.28 min +}; + +// These are in seconds +enum BrewfestMusicTime +{ + EVENT_BREWFESTDWARF01_TIME = 95000, + EVENT_BREWFESTDWARF02_TIME = 155000, + EVENT_BREWFESTDWARF03_TIME = 23000, + EVENT_BREWFESTGOBLIN01_TIME = 68000, + EVENT_BREWFESTGOBLIN02_TIME = 93000, + EVENT_BREWFESTGOBLIN03_TIME = 28000 +}; + +enum BrewfestMusicAreas +{ + SILVERMOON = 3430, // Horde + UNDERCITY = 1497, + ORGRIMMAR_1 = 1296, + ORGRIMMAR_2 = 14, + THUNDERBLUFF = 1638, + IRONFORGE_1 = 809, // Alliance + IRONFORGE_2 = 1, + STORMWIND = 12, + EXODAR = 3557, + DARNASSUS = 1657, + SHATTRATH = 3703 // General +}; + +enum BrewfestMusicEvents +{ + EVENT_BM_SELECT_MUSIC = 1, + EVENT_BM_START_MUSIC = 2 +}; + +class go_brewfest_music : public GameObjectScript +{ +public: + go_brewfest_music() : GameObjectScript("go_brewfest_music") { } + + struct go_brewfest_musicAI : public GameObjectAI + { + go_brewfest_musicAI(GameObject* go) : GameObjectAI(go) + { + _events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, 1000); + _events.ScheduleEvent(EVENT_BM_START_MUSIC, 1500); + _currentMusicEvent = EVENT_BREWFESTGOBLIN01; + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BM_SELECT_MUSIC: + { + if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active + break; + // Select random music sample + uint32 rnd = urand(0, 2); + uint32 musicTime = 1000; + //Restart the current selected music + _currentMusicEvent = 0; + //Check zone to play correct music + if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF) + { + switch (rnd) + { + case 0: + _currentMusicEvent = EVENT_BREWFESTGOBLIN01; + musicTime = EVENT_BREWFESTGOBLIN01_TIME; + break; + case 1: + _currentMusicEvent = EVENT_BREWFESTGOBLIN02; + musicTime = EVENT_BREWFESTGOBLIN02_TIME; + break; + case 2: + _currentMusicEvent = EVENT_BREWFESTGOBLIN03; + musicTime = EVENT_BREWFESTGOBLIN03_TIME; + break; + default: + break; + } + } + else if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS) + { + switch (rnd) + { + case 0: + _currentMusicEvent = EVENT_BREWFESTDWARF01; + musicTime = EVENT_BREWFESTDWARF01_TIME; + break; + case 1: + _currentMusicEvent = EVENT_BREWFESTDWARF02; + musicTime = EVENT_BREWFESTDWARF02_TIME; + break; + case 2: + _currentMusicEvent = EVENT_BREWFESTDWARF03; + musicTime = EVENT_BREWFESTDWARF03_TIME; + break; + default: + break; + } + } + else if (go->GetAreaId() == SHATTRATH) + { + rnd = urand(0, 5); + switch (rnd) + { + case 0: + _currentMusicEvent = EVENT_BREWFESTGOBLIN01; + musicTime = EVENT_BREWFESTGOBLIN01_TIME; + break; + case 1: + _currentMusicEvent = EVENT_BREWFESTGOBLIN02; + musicTime = EVENT_BREWFESTGOBLIN02_TIME; + break; + case 2: + _currentMusicEvent = EVENT_BREWFESTGOBLIN03; + musicTime = EVENT_BREWFESTGOBLIN03_TIME; + break; + case 3: + _currentMusicEvent = EVENT_BREWFESTDWARF01; + musicTime = EVENT_BREWFESTDWARF01_TIME; + break; + case 4: + _currentMusicEvent = EVENT_BREWFESTDWARF02; + musicTime = EVENT_BREWFESTDWARF02_TIME; + break; + case 5: + _currentMusicEvent = EVENT_BREWFESTDWARF03; + musicTime = EVENT_BREWFESTDWARF03_TIME; + break; + default: + break; + } + } + _events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, musicTime); // Select new song music after play time is over + break; + } + case EVENT_BM_START_MUSIC: + if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active + break; + // Play selected music + if (_currentMusicEvent != 0) + { + go->PlayDirectMusic(_currentMusicEvent); + } + _events.ScheduleEvent(EVENT_BM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client + break; + default: + break; + } + } + } + private: + EventMap _events; + uint32 _currentMusicEvent; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_brewfest_musicAI(go); + } +}; + +/*#### +## go_pirate_day_music +####*/ + +enum PirateDayMusic +{ + MUSIC_PIRATE_DAY_MUSIC = 12845 +}; + +enum PirateDayMusicEvents +{ + EVENT_PDM_START_MUSIC = 1 +}; + +class go_pirate_day_music : public GameObjectScript +{ +public: + go_pirate_day_music() : GameObjectScript("go_pirate_day_music") { } + + struct go_pirate_day_musicAI : public GameObjectAI + { + uint32 rnd; + + go_pirate_day_musicAI(GameObject* go) : GameObjectAI(go) + { + _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 1000); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_PDM_START_MUSIC: + if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) + break; + go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); + _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + break; + default: + break; + } + } + } + private: + EventMap _events; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_pirate_day_musicAI(go); + } +}; + +/*#### +## go_darkmoon_faire_music +####*/ +enum DarkmoonFaireMusic +{ + MUSIC_DARKMOON_FAIRE_MUSIC = 8440 +}; + +enum DarkmoonFaireMusicEvents +{ + EVENT_DFM_START_MUSIC = 1 +}; + +class go_darkmoon_faire_music : public GameObjectScript +{ +public: + go_darkmoon_faire_music() : GameObjectScript("go_darkmoon_faire_music") { } + + struct go_darkmoon_faire_musicAI : public GameObjectAI + { + uint32 rnd; + + go_darkmoon_faire_musicAI(GameObject* go) : GameObjectAI(go) + { + _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 1000); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DFM_START_MUSIC: + if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) + break; + go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); + _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + break; + default: + break; + } + } + } + private: + EventMap _events; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_darkmoon_faire_musicAI(go); + } +}; + +/*#### +## go_midsummer_music +####*/ + +enum MidsummerMusic +{ + EVENTMIDSUMMERFIREFESTIVAL_A = 12319, // 1.08 min + EVENTMIDSUMMERFIREFESTIVAL_H = 12325, // 1.12 min +}; + +enum MidsummerMusicEvents +{ + EVENT_MM_START_MUSIC = 1 +}; + +class go_midsummer_music : public GameObjectScript +{ +public: + go_midsummer_music() : GameObjectScript("go_midsummer_music") { } + + struct go_midsummer_musicAI : public GameObjectAI + { + go_midsummer_musicAI(GameObject* go) : GameObjectAI(go) + { + _events.ScheduleEvent(EVENT_MM_START_MUSIC, 1000); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MM_START_MUSIC: + { + if (!IsHolidayActive(HOLIDAY_FIRE_FESTIVAL)) + break; + + Map::PlayerList const& players = go->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()) + { + if (player->GetTeamId() == TEAM_HORDE) + { + go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); + } + else + { + go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); + } + } + } + + _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + break; + } + default: + break; + } + } + } + private: + EventMap _events; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_musicAI(go); + } +}; + /*###### ## go_cat_figurine ######*/ @@ -1277,6 +1640,10 @@ void AddSC_go_scripts() new go_heat(); // Theirs + new go_brewfest_music(); + new go_pirate_day_music(); + new go_darkmoon_faire_music(); + new go_midsummer_music(); new go_cat_figurine(); new go_gilded_brazier(); //new go_shrine_of_the_birds();