Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2024-05-26 23:00:39 +08:00
78 changed files with 102236 additions and 327 deletions
+1 -1
View File
@@ -25,7 +25,7 @@ runs:
using: composite using: composite
steps: steps:
- name: Cache - name: Cache
uses: actions/cache@v3 uses: actions/cache@v4
if: inputs.pch != 'true' if: inputs.pch != 'true'
with: with:
path: ${{ github.workspace }}/var/ccache path: ${{ github.workspace }}/var/ccache
+10 -2
View File
@@ -33,8 +33,16 @@ jobs:
CXX: clang++-15 CXX: clang++-15
- os: ubuntu-22.04 - os: ubuntu-22.04
compiler: compiler:
CC: gcc-13 CC: gcc-12
CXX: g++-13 CXX: g++-12
- os: ubuntu-24.04
compiler:
CC: clang-18
CXX: clang++-18
- os: ubuntu-24.04
compiler:
CC: gcc-14
CXX: g++-14
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: ${{ matrix.os }}-${{ matrix.compiler }}-nopch name: ${{ matrix.os }}-${{ matrix.compiler }}-nopch
env: env:
+10 -2
View File
@@ -30,8 +30,16 @@ jobs:
CXX: clang++-15 CXX: clang++-15
- os: ubuntu-22.04 - os: ubuntu-22.04
compiler: compiler:
CC: gcc-13 CC: gcc-12
CXX: g++-13 CXX: g++-12
- os: ubuntu-24.04
compiler:
CC: clang-18
CXX: clang++-18
- os: ubuntu-24.04
compiler:
CC: gcc-14
CXX: g++-14
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: ${{ matrix.os }}-${{ matrix.compiler }}-pch name: ${{ matrix.os }}-${{ matrix.compiler }}-pch
env: env:
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Cache - name: Cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/Library/Caches/ccache path: ~/Library/Caches/ccache
key: ccache:${{ matrix.os }}:${{ github.ref }}:${{ github.sha }} key: ccache:${{ matrix.os }}:${{ github.ref }}:${{ github.sha }}
+1 -1
View File
@@ -30,7 +30,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Cache - name: Cache
uses: actions/cache@v3 uses: actions/cache@v4
env: env:
cache-name: cache-tools cache-name: cache-tools
with: with:
+1 -1
View File
@@ -27,7 +27,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: ccache - name: ccache
uses: hendrikmuhs/ccache-action@v1.2.9 uses: hendrikmuhs/ccache-action@v1.2.13
- name: Configure OS - name: Configure OS
shell: bash shell: bash
env: env:
+35 -3
View File
@@ -1,14 +1,46 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
CONF_DIR="${CONF_DIR:-/azerothcore/env/dist/etc}"
LOGS_DIR="${LOGS_DIR:-/azerothcore/env/dist/logs}"
if ! touch "$CONF_DIR/.write-test" || ! touch "$LOGS_DIR/.write-test"; then
cat <<EOF
===== WARNING =====
The current user doesn't have write permissions for
the configuration dir ($CONF_DIR) or logs dir ($LOGS_DIR).
It's likely that services will fail due to this.
This is usually caused by cloning the repository as root,
so the files are owned by root (uid 0).
To resolve this, you can set the ownership of the
configuration directory with the command on the host machine.
Note that if the files are owned as root, the ownership must
be changed as root (hence sudo).
$ sudo chown -R $(id -u):$(id -g) /path/to$CONF_DIR /path/to$LOGS_DIR
Alternatively, you can set the DOCKER_USER environment
variable (on the host machine) to "root", though this
isn't recommended.
$ DOCKER_USER=root docker-compose up -d
====================
EOF
fi
[[ -f "$CONF_DIR/.write-test" ]] && rm -f "$CONF_DIR/.write-test"
[[ -f "$LOGS_DIR/.write-test" ]] && rm -f "$LOGS_DIR/.write-test"
# Copy all default config files to env/dist/etc if they don't already exist # Copy all default config files to env/dist/etc if they don't already exist
# -r == recursive # -r == recursive
# -n == no clobber (don't overwrite) # -n == no clobber (don't overwrite)
# -v == be verbose # -v == be verbose
cp -rnv /azerothcore/env/ref/etc/* /azerothcore/env/dist/etc cp -rnv /azerothcore/env/ref/etc/* "$CONF_DIR"
CONF="/azerothcore/env/dist/etc/$ACORE_COMPONENT.conf" CONF="$CONF_DIR/$ACORE_COMPONENT.conf"
CONF_DIST="/azerothcore/env/dist/etc/$ACORE_COMPONENT.conf.dist" CONF_DIST="$CONF_DIR/$ACORE_COMPONENT.conf.dist"
# Copy the "dist" file to the "conf" if the conf doesn't already exist # Copy the "dist" file to the "conf" if the conf doesn't already exist
if [[ -f "$CONF_DIST" ]]; then if [[ -f "$CONF_DIST" ]]; then
@@ -0,0 +1,72 @@
-- DB update 2024_05_04_00 -> 2024_05_09_00
SET @REFIDONE = 35100,
@REFIDTWO = 35101,
@REFIDTHREE = 35102,
@TANZAR = 22699,
@KRAZ = 22790,
@ASHLI = 22797,
@HARKOR = 22968;
DELETE FROM `gameobject_loot_template` WHERE `Entry` IN (@TANZAR, @KRAZ, @ASHLI, @HARKOR);
INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(@TANZAR, @REFIDONE, @REFIDONE, 100, 0, 1, 0, 1, 1, 'Tanzar\'s Trunk - First Hostage Loot'),
(@TANZAR, @REFIDTWO, @REFIDTWO, 100, 0, 1, 0, 1, 1, 'Tanzar\'s Trunk - Second Hostage Loot'),
(@TANZAR, @REFIDTHREE, @REFIDTHREE, 100, 0, 1, 0, 1, 1, 'Tanzar\'s Trunk - Third Hostage Loot'),
(@KRAZ, @REFIDONE, @REFIDONE, 100, 0, 1, 0, 1, 1, 'Kraz\'s Package - First Hostage Loot'),
(@KRAZ, @REFIDTWO, @REFIDTWO, 100, 0, 1, 0, 1, 1, 'Kraz\'s Package - Second Hostage Loot'),
(@KRAZ, @REFIDTHREE, @REFIDTHREE, 100, 0, 1, 0, 1, 1, 'Kraz\'s Package - Third Hostage Loot'),
(@ASHLI, @REFIDONE, @REFIDONE, 100, 0, 1, 0, 1, 1, 'Ashli\'s Bag - First Hostage Loot'),
(@ASHLI, @REFIDTWO, @REFIDTWO, 100, 0, 1, 0, 1, 1, 'Ashli\'s Bag - Second Hostage Loot'),
(@ASHLI, @REFIDTHREE, @REFIDTHREE, 100, 0, 1, 0, 1, 1, 'Ashli\'s Bag - Third Hostage Loot'),
(@HARKOR, @REFIDONE, @REFIDONE, 100, 0, 1, 0, 1, 1, 'Harkor\'s Satchel - First Hostage Loot'),
(@HARKOR, @REFIDTWO, @REFIDTWO, 100, 0, 1, 0, 1, 1, 'Harkor\'s Satchel - Second Hostage Loot'),
(@HARKOR, @REFIDTHREE, @REFIDTHREE, 100, 0, 1, 0, 1, 1, 'Harkor\'s Satchel - Third Hostage Loot');
DELETE FROM `reference_loot_template` WHERE `Entry` IN (@REFIDONE, @REFIDTWO, @REFIDTHREE);
INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(@REFIDONE, 33480, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Cord of Braided Troll Hair'),
(@REFIDONE, 33481, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Pauldrons of Stone Resolve'),
(@REFIDONE, 33483, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Life-step Belt'),
(@REFIDONE, 33489, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Mantle of Ill Intent'),
(@REFIDONE, 33590, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Cloak of Fiends'),
(@REFIDONE, 33591, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Shadowcaster\'s Drape'),
(@REFIDONE, 33805, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Shadowhunter\'s Treads'),
(@REFIDONE, 33971, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - First Hostage Loot - Elunite Imbued Leggings'),
(@REFIDTWO, 33490, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Second Hostage Loot - Staff of Dark Mending'),
(@REFIDTWO, 33491, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Second Hostage Loot - Tuskbreaker'),
(@REFIDTWO, 33492, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Second Hostage Loot - Trollbane'),
(@REFIDTWO, 33493, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Second Hostage Loot - Umbral Shiv'),
(@REFIDTWO, 33494, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Second Hostage Loot - Amani Divining Staff'),
(@REFIDTWO, 33495, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Second Hostage Loot - Rage'),
(@REFIDTHREE, 33496, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Third Hostage Loot - Signet of Primal Wrath'),
(@REFIDTHREE, 33497, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Third Hostage Loot - Mana Attuned Band'),
(@REFIDTHREE, 33498, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Third Hostage Loot - Signet of the Quiet Forest'),
(@REFIDTHREE, 33499, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Third Hostage Loot - Signet of the Last Defender'),
(@REFIDTHREE, 33500, 0, 0, 0, 1, 1, 1, 1, 'Zul\'Aman - Third Hostage Loot - Signet of Eternal Life');
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 10) AND (`SourceGroup` IN (@REFIDONE, @REFIDTWO, @REFIDTHREE, @REFIDFOUR)) AND (`ConditionTypeOrReference` = 13) AND (`ConditionValue1` = 8);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(10, @REFIDONE, 33480, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33481, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33483, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33489, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33590, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33591, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33805, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDONE, 33971, 0, 0, 13, 0, 8, 1, 0, 0, 0, 0, '', 'Yield first hostage loot if first hostage has been rescued'),
(10, @REFIDTWO, 33490, 0, 0, 13, 0, 8, 2, 0, 0, 0, 0, '', 'Yield second hostage loot if second hostage has been rescued'),
(10, @REFIDTWO, 33491, 0, 0, 13, 0, 8, 2, 0, 0, 0, 0, '', 'Yield second hostage loot if second hostage has been rescued'),
(10, @REFIDTWO, 33492, 0, 0, 13, 0, 8, 2, 0, 0, 0, 0, '', 'Yield second hostage loot if second hostage has been rescued'),
(10, @REFIDTWO, 33493, 0, 0, 13, 0, 8, 2, 0, 0, 0, 0, '', 'Yield second hostage loot if second hostage has been rescued'),
(10, @REFIDTWO, 33494, 0, 0, 13, 0, 8, 2, 0, 0, 0, 0, '', 'Yield second hostage loot if second hostage has been rescued'),
(10, @REFIDTWO, 33495, 0, 0, 13, 0, 8, 2, 0, 0, 0, 0, '', 'Yield second hostage loot if second hostage has been rescued'),
(10, @REFIDTHREE, 33496, 0, 1, 13, 0, 8, 3, 0, 0, 0, 0, '', 'Yield third hostage loot if third hostage has been rescued'),
(10, @REFIDTHREE, 33497, 0, 1, 13, 0, 8, 3, 0, 0, 0, 0, '', 'Yield third hostage loot if third hostage has been rescued'),
(10, @REFIDTHREE, 33498, 0, 1, 13, 0, 8, 3, 0, 0, 0, 0, '', 'Yield third hostage loot if third hostage has been rescued'),
(10, @REFIDTHREE, 33499, 0, 1, 13, 0, 8, 3, 0, 0, 0, 0, '', 'Yield third hostage loot if third hostage has been rescued'),
(10, @REFIDTHREE, 33500, 0, 1, 13, 0, 8, 3, 0, 0, 0, 0, '', 'Yield third hostage loot if third hostage has been rescued'),
(10, @REFIDTHREE, 33496, 0, 2, 13, 0, 8, 4, 0, 0, 0, 0, '', 'Yield third hostage loot if all hostages have been rescued'),
(10, @REFIDTHREE, 33497, 0, 2, 13, 0, 8, 4, 0, 0, 0, 0, '', 'Yield third hostage loot if all hostages have been rescued'),
(10, @REFIDTHREE, 33498, 0, 2, 13, 0, 8, 4, 0, 0, 0, 0, '', 'Yield third hostage loot if all hostages have been rescued'),
(10, @REFIDTHREE, 33499, 0, 2, 13, 0, 8, 4, 0, 0, 0, 0, '', 'Yield third hostage loot if all hostages have been rescued'),
(10, @REFIDTHREE, 33500, 0, 2, 13, 0, 8, 4, 0, 0, 0, 0, '', 'Yield third hostage loot if all hostages have been rescued');
@@ -0,0 +1,8 @@
-- DB update 2024_05_09_00 -> 2024_05_11_00
--
UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` IN (180690, 180691);
DELETE FROM `smart_scripts` WHERE (`source_type` = 1 AND `entryorguid` IN (180690, 180691));
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`, `event_param6`, `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
(180690, 1, 0, 0, 70, 0, 100, 0, 2, 0, 0, 0, 0, 0, 106, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Large Scarab Coffer - On Gameobject State Changed - Remove Gameobject Flags Locked'),
(180691, 1, 0, 0, 70, 0, 100, 0, 2, 0, 0, 0, 0, 0, 106, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarab Coffer - On Gameobject State Changed - Remove Gameobject Flags Locked');
@@ -0,0 +1,3 @@
-- DB update 2024_05_11_00 -> 2024_05_11_01
--
UPDATE `spell_target_position` SET `PositionX`=386.27, `PositionY`=33.4144, `PositionZ`=-130.934, `VerifiedBuild`=52237 WHERE `ID`=21128;
+109
View File
@@ -0,0 +1,109 @@
-- DB update 2024_05_11_01 -> 2024_05_11_02
-- Onslaught Raven Priest with guid 102088 smart ai
SET @ENTRY := -102088;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 27202;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 45, 0, 1, 0, 0, 0, 0, 10, 85485, 27210, 0, 0, 0, 0, 0, 'On aggro - Creature High General Abbendis (27210) with guid 85485 (fetching): Set creature data #0 to 1');
-- Onslaught Footman with guid 102193 smart ai
SET @ENTRY := -102193;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 27203;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 45, 0, 1, 0, 0, 0, 0, 10, 85485, 27210, 0, 0, 0, 0, 0, 'On aggro - Creature High General Abbendis (27210) with guid 85485 (fetching): Set creature data #0 to 1');
-- Onslaught Footman with guid 102194 smart ai
SET @ENTRY := -102194;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 27203;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 45, 0, 1, 0, 0, 0, 0, 10, 85485, 27210, 0, 0, 0, 0, 0, 'On aggro - Creature High General Abbendis (27210) with guid 85485 (fetching): Set creature data #0 to 1');
DELETE FROM `creature_text` WHERE `CreatureID` = 27210;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(27210, 0, 0, 'Now I\'ll show you the REAL power of the Onslaught!', 12, 0, 100, 0, 0, 14192, 27593, 0, 'High General Abbendis'),
(27210, 1, 0, 'You\'ve come to test the might of the Onslaught?', 14, 0, 100, 6, 0, 14188, 27596, 0, 'High General Abbendis'),
(27210, 1, 1, 'Deal with this intrusion quickly. I don\'t have time for this!', 14, 0, 100, 5, 0, 14189, 27597, 0, 'High General Abbendis'),
(27210, 1, 2, 'You may want to rethink your actions, fool.', 14, 0, 100, 25, 0, 14190, 27598, 0, 'High General Abbendis'),
(27210, 1, 3, 'Am I going to have to deal with this intrusion myself?', 14, 0, 100, 6, 0, 14191, 27599, 0, 'High General Abbendis');
-- High General Abbendis smart ai
SET @ENTRY := 27210;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 4, 0, 100, 1, 0, 0, 0, 0, 11, 50908, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High General Abbendis - On aggro - Cast spell Seal of Onslaught (50908) on Self'),
(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 4000, 7000, 19000, 23000, 11, 50915, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'High General Abbendis - Cast spell - Raging Consecration (50915) on Victim'),
(@ENTRY, 0, 2, 0, 0, 0, 100, 0, 9000, 12000, 20000, 23000, 11, 50905, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'High General Abbendis- Cast spell - Judgement of Onslaught (50905) on Victim'),
(@ENTRY, 0, 3, 4, 2, 0, 100, 1, 0, 20, 0, 0, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'When health between 0%-20%% (once) - Set event phase to phase 1'),
(@ENTRY, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'When health between 0%-20%% (once) - Self: Talk 0 to Self'),
(@ENTRY, 0, 5, 0, 0, 1, 100, 0, 0, 0, 6000, 6000, 11, 50921, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High General Abbendis - Cast spell - Reckless Onslaught (50921) on Self'),
(@ENTRY, 0, 6, 0, 6, 0, 100, 512, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 10, 85322, 27951, 0, 0, 0, 0, 0, 'High General Abbendis - On death - Creature Admiral Barean Westwind (27951) with guid 85322 (fetching): Set creature data #1 to 1'),
(@ENTRY, 0, 7, 0, 4, 0, 100, 512, 0, 0, 0, 0, 45, 0, 1, 0, 0, 0, 0, 19, 27951, 10, 0, 0, 0, 0, 0, 'High General Abbendis - On aggro - Closest alive creature Admiral Barean Westwind (27951) in 10 yards: Set creature data #0 to 1'),
(@ENTRY, 0, 8, 0, 11, 0, 100, 512, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 85322, 27951, 0, 0, 0, 0, 0, 'High General Abbendis - On respawn - Creature Admiral Barean Westwind (27951) with guid 85322 (fetching): Set respawn timer to 0 ms'),
(@ENTRY, 0, 9, 0, 25, 0, 100, 512, 0, 0, 0, 0, 45, 0, 2, 0, 0, 0, 0, 10, 85322, 27951, 0, 0, 0, 0, 0, 'High General Abbendis - On reset - Creature Admiral Barean Westwind (27951) with guid 85322 (fetching): Set creature data #0 to 2'),
(@ENTRY, 0, 10, 0, 38, 0, 100, 0, 0, 1, 5000, 5000, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'On data[0] set to 1 (wait 5000 - 5000 ms before next event trigger) - Self: Talk 1 to invoker'),
(@ENTRY, 0, 11, 0, 38, 0, 100, 0, 0, 2, 0, 0, 49, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 'On data[0] set to 2 - Self: Attack storedTarget[0]');
-- Admiral Barean Westwind smart ai
SET @ENTRY := 27951;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 9 AND `entryOrGuid` IN (@ENTRY * 100, @ENTRY * 100 + 1, @ENTRY * 100 + 2, @ENTRY * 100 + 3, @ENTRY * 100 + 4);
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 1, 11, 0, 100, 512, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On respawn - Set react state to Defensive'),
(@ENTRY, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On respawn - Unset active'),
(@ENTRY, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 19, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On respawn - Remove UNIT_FLAGS to IMMUNE_TO_PC'),
(@ENTRY, 0, 3, 4, 4, 0, 100, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On aggro - Remove all auras'),
(@ENTRY, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On aggro - storedTarget[0] = Attacked unit'),
(@ENTRY, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 10, 85485, 27210, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On aggro - Send stored target storedTarget[0] to Creature High General Abbendis (27210) with guid 85485 (fetching)'),
(@ENTRY, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 45, 0, 2, 0, 0, 0, 0, 19, 27210, 10, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On aggro - Closest alive creature High General Abbendis (27210) in 10 yards: Set creature data #0 to 2'),
(@ENTRY, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On aggro - Evade'),
(@ENTRY, 0, 8, 0, 21, 0, 100, 512, 0, 0, 0, 0, 80, 2795100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind On home reached - Self: Start timed action list id #Admiral Barean Westwind #0 (2795100) (update always) // -inline'),
(@ENTRY * 100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set react state to Passive'),
(@ENTRY * 100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set UNIT_FLAGS to IMMUNE_TO_PC'),
(@ENTRY * 100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 19, 524288, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Remove UNIT_FLAGS to IN_COMBAT'),
(@ENTRY * 100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 50161, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Cast spell Protection Sphere (50161) on Self'),
(@ENTRY * 100, 9, 4, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 27210, 50, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Look at Closest alive creature High General Abbendis (27210) in 50 yards'),
(@ENTRY * 100, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11, 27210, 50, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Talk 0 to Creature High General Abbendis (27210) in 50 yd'),
(@ENTRY * 100, 9, 6, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set orientation to home position orientation'),
(@ENTRY, 0, 9, 10, 38, 0, 100, 512, 1, 1, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On data[1] set to 1 - Set active'),
(@ENTRY, 0, 10, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2795101, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On data[1] set to 1 - Start timed action list id #Admiral Barean Westwind #1 (2795101) (update always) // -inline'),
(@ENTRY * 100 + 1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Talk 1 to invoker'),
(@ENTRY * 100 + 1, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set walk'),
(@ENTRY * 100 + 1, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 1, 0, 0, 1, 0, 0, 19, 27210, 50, 1, 0, 0, 0, 0, 'Admiral Barean Westwind - Move to Closest dead creature High General Abbendis (27210) in 50 yards in 1 yd distance (point id 1)'),
(@ENTRY, 0, 11, 0, 34, 0, 100, 0, 8, 1, 0, 0, 80, 2795102, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On movement of type POINT_MOTION_TYPE inform, point 1 - Self: Start timed action list id #Admiral Barean Westwind #2 (2795102) (update out of combat) // -inline_wp'),
(@ENTRY * 100 + 2, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set stand state to KNEEL'),
(@ENTRY * 100 + 2, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Talk 2 to invoker'),
(@ENTRY * 100 + 2, 9, 5, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 91, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Remove stand state KNEEL'),
(@ENTRY * 100 + 2, 9, 6, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0.139626, 'Admiral Barean Westwind - Set orientation to 0.139626'),
(@ENTRY * 100 + 2, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 5, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Play emote ONESHOT_LAUGH (11)'),
(@ENTRY * 100 + 2, 9, 8, 0, 0, 0, 100, 0, 3225, 3225, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Talk 3 to invoker'),
(@ENTRY * 100 + 2, 9, 9, 0, 0, 0, 100, 0, 0, 0, 0, 0, 53, 0, 27951, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Start path #27951, walk, do not repeat, Passive'),
(@ENTRY, 0, 12, 13, 38, 0, 100, 512, 0, 2, 0, 0, 28, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On data[0] set to 2 - Self: Remove all auras'),
(@ENTRY, 0, 13, 0, 61, 0, 100, 0, 0, 0, 0, 0, 19, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On data[0] set to 2 - Self: Remove UNIT_FLAGS to IMMUNE_TO_PC'),
(@ENTRY, 0, 14, 15, 58, 0, 100, 512, 4, 27951, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On waypoint 4 of path 27951 ended - Self: Stop path, despawn instantly'),
(@ENTRY, 0, 15, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2795103, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On waypoint 4 of path 27951 ended - Self: Start timed action list id #Admiral Barean Westwind #3 (2795103) (update always) // -inline'),
(@ENTRY * 100 + 3, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 11, 34427, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Cast spell Ethereal Teleport(34427) on Self'),
(@ENTRY * 100 + 3, 9, 1, 0, 0, 0, 100, 0, 1700, 1700, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Self: Despawn instantly'),
(@ENTRY, 0, 16, 0, 38, 0, 100, 0, 0, 1, 0, 0, 80, 2795104, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On data[0] set to 1 - Self: Start timed action list id #Admiral Barean Westwind #4 (2795104) (update always) // -inline'),
(@ENTRY * 100 + 4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set UNIT_FLAGS to IMMUNE_TO_PC'),
(@ENTRY * 100 + 4, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 19, 524288, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Remove UNIT_FLAGS to IN_COMBAT'),
(@ENTRY * 100 + 4, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 50161, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Cast spell Protection Sphere (50161) on Self'),
(@ENTRY * 100 + 4, 9, 3, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 27210, 50, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Look at Closest alive creature High General Abbendis (27210) in 50 yards'),
(@ENTRY * 100 + 4, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 11, 27210, 50, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Talk 0 to Creature High General Abbendis (27210) in 50 yd'),
(@ENTRY * 100 + 4, 9, 5, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Set orientation to home position orientation');
DELETE FROM `waypoints` WHERE `entry`=27951;
INSERT INTO `waypoints` VALUES (27951, 1, 2711.5, -352.357, 141.363, NULL, 0, 'Admiral Barean Westwind');
INSERT INTO `waypoints` VALUES (27951, 2, 2718.2, -351.358, 141.363, NULL, 0, 'Admiral Barean Westwind');
INSERT INTO `waypoints` VALUES (27951, 3, 2721.99, -358.182, 141.363, NULL, 0, 'Admiral Barean Westwind');
INSERT INTO `waypoints` VALUES (27951, 4, 2738.1, -355.936, 141.363, NULL, 0, 'Admiral Barean Westwind');
DELETE FROM `creature_text` WHERE `CreatureID` = 27211;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(27211, 0, 0, 'About time!', 12, 0, 100, 0, 0, 0, 26292, 0, 'Onslaught Executioner'),
(27211, 1, 0, 'Any last words you impure mongrel?', 12, 0, 100, 0, 0, 0, 26293, 0, 'Onslaught Executioner'),
(27211, 2, 0, 'On second thought, I don\'t care. Burn in hell wretch!', 12, 0, 100, 0, 0, 0, 26294, 0, 'Onslaught Executioner'),
(27211, 3, 0, 'Hah! That never gets old.', 12, 0, 100, 0, 0, 0, 26295, 0, 'Onslaught Executioner');
@@ -0,0 +1,9 @@
-- DB update 2024_05_11_02 -> 2024_05_11_03
--
-- 28622: Web Wrap stunned dot
DELETE FROM `spell_script_names` WHERE `spell_id` = 28622;
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`)
VALUES(28622, 'spell_web_wrap_damage');
-- 28618: Disable pull effect and periodic trigger event. Keep pacify silence and set duration to 5 seconds
UPDATE `spell_dbc` SET `DurationIndex` = 27, `Effect_1` = 0, `Effect_2` = 0 WHERE `ID` = 28618;
@@ -0,0 +1,12 @@
-- DB update 2024_05_11_03 -> 2024_05_11_04
DELETE FROM `spell_script_names` WHERE `spell_id` = 28865;
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(28865,'spell_gen_consumption');
DELETE FROM `creature_template_spell` WHERE `CreatureID` = 16697;
UPDATE `creature_template` SET `ScriptName` = '', `AIName` = 'SmartAI' WHERE `entry` = 16697;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 16697);
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`, `event_param6`, `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
(16697, 0, 0, 0, 60, 0, 100, 0, 0, 0, 2500, 2500, 0, 0, 11, 28865, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Void Zone - On Update - Cast \'Consumption\''),
(16697, 0, 1, 0, 37, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Void Zone - On Initialize - Set Reactstate Passive');
@@ -0,0 +1,8 @@
-- DB update 2024_05_11_04 -> 2024_05_12_00
DELETE FROM `creature_template_spell` WHERE `CreatureID` = 27354;
INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES
(27354, 0, 48548, 53788),
(27354, 1, 48558, 53788),
(27354, 2, 48604, 53788),
(27354, 4, 48610, 53788);
@@ -0,0 +1,49 @@
-- DB update 2024_05_12_00 -> 2024_05_12_01
-- Shen'dralar Ancient smart ai
SET @ENTRY := 14358;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - On reset - Set event phase to phase 1'),
(@ENTRY, 0, 1, 0, 62, 0, 100, 512, 5723, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - On gossip action 0 from menu 5723 selected - Gossip player: Close gossip'),
(@ENTRY, 0, 2, 3, 20, 1, 100, 0, 7461, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - On player rewarded quest The Madness Within (7461) - Set event phase to phase 2'),
(@ENTRY, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - storedTarget[0] = Rewarded player'),
(@ENTRY, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (5, 0, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, 3.5, 3.5, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (3.5, 3.5, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (0, 5, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, 3.5, -3.5, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (3.5, -3.5, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 8, 9, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, -5, 0, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (-5, 0, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 9, 10, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, -3.5, -3.5, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (-3.5, -3.5, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 10, 11, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, 0, -5, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (0, -5, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 11, 12, 61, 0, 100, 0, 0, 0, 0, 0, 12, 14364, 3, 300000, 0, 0, 0, 1, 0, 0, 0, -3.5, 3.5, 0, 0, 'Shen\'dralar Ancient - Summon creature Shen\'dralar Spirit (14364) at Self\'s position, moved by offset (-3.5, 3.5, 0, 0) as summon type timed despawn with duration 300 seconds'),
(@ENTRY, 0, 12, 13, 61, 0, 100, 0, 0, 0, 0, 0, 5, 21, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - Play emote ONESHOT_APPLAUD (21)'),
(@ENTRY, 0, 13, 0, 61, 0, 100, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 11, 14364, 10, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - Send stored target storedTarget[0] to Creature Shen\'dralar Spirit (14364) in 10 yd'),
(@ENTRY, 0, 14, 15, 20, 2, 100, 0, 7461, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - storedTarget[0] = Rewarded player (phase 2)'),
(@ENTRY, 0, 15, 0, 61, 0, 100, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 11, 14364, 10, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - Send stored target storedTarget[0] to Creature Shen\'dralar Spirit (14364) in 10 yd (phase 2)'),
(@ENTRY, 0, 16, 0, 35, 0, 100, 512, 14364, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Ancient - On summoned creature Shen\'dralar Spirit (14364) despawn - Set event phase to phase 1');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 22 AND `SourceEntry` = 14358 AND `SourceId` = 0;
-- Shen'dralar Spirit smart ai
SET @ENTRY := 14364;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 60, 0, 100, 0, 0, 30000, 20000, 30000, 10, 2, 21, 4, 66, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Spirit - Play random emote: ONESHOT_BOW (2), ONESHOT_APPLAUD (21), ONESHOT_CHEER(DNR) (4), ONESHOT_SALUTE (66),'),
(@ENTRY, 0, 1, 0, 60, 0, 100, 512, 15000, 15000, 15000, 15000, 66, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 'Shen\'dralar Spirit Look at storedTarget[0]');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 22 AND `SourceEntry` = 14364 AND `SourceId` = 0;
-- Treasure of the Shen'dralar
-- 179517 (Area: 2557 - Difficulty: 1) CreateObject1
SET @OGUID1:=11921;
DELETE FROM `gameobject` WHERE (`id` = 179517) AND (`guid` IN (@OGUID1));
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`) VALUES
(@OGUID1, 179517, 429, 2557, 2557, 1, 1, 129.4810638427734375, 544.96710205078125, -48.4663200378417968, 1.623155713081359863, 0, 0, 0.725374221801757812, 0.688354730606079101, 7200, 255, 1, '', 52237);
-- Skeletal Remains of Kariel Winthalus
-- 179544 (Area: 2557 - Difficulty: 1) CreateObject1
SET @OGUID2:=44739;
DELETE FROM `gameobject` WHERE (`id` = 179544) AND (`guid` IN (@OGUID2));
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`) VALUES
(@OGUID2, 179544, 429, 2557, 2557, 1, 1, 163.0381622314453125, 530.1822509765625, -48.4669570922851562, 5.026549339294433593, 0, 0, -0.5877847671508789, 0.809017360210418701, 7200, 255, 1, '', 52237);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,3 @@
-- DB update 2024_05_12_02 -> 2024_05_12_03
-- was 20
UPDATE `creature_template` SET `detection_range` = 60 WHERE `entry` = 17968;
@@ -0,0 +1,23 @@
-- DB update 2024_05_12_03 -> 2024_05_13_00
-- Rimblat Earthshatter smart ai
SET @ENTRY := 16134;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 9 AND `entryOrGuid` IN (@ENTRY * 100);
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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 1, 0, 100, 512, 1000, 15000, 150000, 180000, 80, 1613400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Rimblat Earthshatter: Start timed action list id #Rimblat Earthshatter #0 (1613400) (update out of combat) // -inline'),
(@ENTRY * 100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Rimblat Earthshatter - Talk 0 to invoker'),
(@ENTRY * 100, 9, 1, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 5, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Rimblat Earthshatter - Play emote ONESHOT_KNEEL (16)'),
(@ENTRY * 100, 9, 2, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 50, 181104, 0, 1, 8, 0, 0, 8, 0, 0, 0, 2276.9, -5326.88, 88.6976, 1.67551, 'Rimblat Earthshatter - Summon gameobject - Small Dirt Mound (181104) at (2276.9, -5326.88, 88.6976, 1.67551) and despawn in 0 ms'),
(@ENTRY * 100, 9, 3, 0, 0, 0, 100, 0, 4400, 4400, 0, 0, 11, 27824, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Rimblat Earthshatter - Cast spell Rimblat Grows Flower DND (27824) on Self'),
(@ENTRY * 100, 9, 4, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 50, 181103, 0, 1, 8, 0, 0, 8, 0, 0, 0, 2277, -5326.86, 88.7085, 5.74214, 'Rimblat Earthshatter - Summon gameobject - Flower (181103) at (2277, -5326.86, 88.7085, 5.74214) and despawn in 0 ms'),
(@ENTRY * 100, 9, 5, 0, 0, 0, 100, 0, 2400, 2400, 0, 0, 41, 0, 0, 0, 0, 0, 0, 20, 181104, 10, 0, 0, 0, 0, 0, 'Closest gameobject Small Dirt Mound (181104) in 10 yards: Despawn instantly'),
(@ENTRY * 100, 9, 6, 0, 0, 0, 100, 0, 1500, 1500, 0, 0, 5, 21, 0, 0, 0, 0, 0, 10, 54186, 16135, 0, 0, 0, 0, 0, 'Creature Rayne (16135) with guid 54186 (fetching): Play emote ONESHOT_APPLAUD (21)'),
(@ENTRY * 100, 9, 7, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10, 54186, 16135, 0, 0, 0, 0, 0, 'Creature Rayne (16135) with guid 54186 (fetching): Talk 0 to invoker'),
(@ENTRY * 100, 9, 8, 0, 0, 0, 100, 0, 58600, 58600, 0, 0, 41, 0, 0, 0, 0, 0, 0, 20, 181103, 10, 0, 0, 0, 0, 0, 'Closest gameobject Flower (181103) in 10 yards: Despawn instantly');
-- DEL Flower
DELETE FROM `gameobject` WHERE `id` = 181103 AND `guid` = 45964;
-- DEL Small Dirt Mound
DELETE FROM `gameobject` WHERE `id` = 181104 AND `guid` = 45965;
@@ -0,0 +1,6 @@
-- DB update 2024_05_13_00 -> 2024_05_14_00
--
DELETE FROM `smart_scripts` WHERE `entryorguid` = 17908 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`, `event_param6`, `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
(17908, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 89, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Giant Infernal - On Respawn - Start Random Movement 10y'),
(17908, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 35747, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Giant Infernal - On Respawn - Cast \'Flame Buffet\'');
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,4 @@
-- DB update 2024_05_14_02 -> 2024_05_15_00
-- clear all gameobjects in map 30 "Alterac Valley"
-- these will be spawned in the bg script
DELETE FROM `gameobject` WHERE `map` = 30;
@@ -0,0 +1,2 @@
-- DB update 2024_05_15_00 -> 2024_05_18_00
UPDATE `creature_text` SET `BroadcastTextId`='32838' WHERE `CreatureID`='32169' AND `GroupID`='0' AND `ID`='0';
@@ -0,0 +1,3 @@
-- DB update 2024_05_18_00 -> 2024_05_18_01
--
UPDATE `acore_string` SET `content_default`='%d - |c%x|Hitem:%d:0:0:0:0:0:0:0:0|h[%s]|h|r ', `locale_deDE`='%d - |c%x|Hitem:%d:0:0:0:0:0:0:0:0|h[%s]|h|r ', `locale_zhCN`='%d - |c%x|Hitem:%d:0:0:0:0:0:0:0:0|h[%s]|h|r' WHERE `entry`=512;
@@ -0,0 +1,4 @@
-- DB update 2024_05_18_01 -> 2024_05_18_02
-- add missing broadcastID to Elder Clearwater txt lines
UPDATE `creature_text` SET `BroadcastTextId` = '38218' WHERE `CreatureID` = '38294' AND `GroupID` = '1' AND `ID`='0';
UPDATE `creature_text` SET `BroadcastTextId` = '38222' WHERE `CreatureID` = '38294' AND `GroupID` = '3' AND `ID`='0';
@@ -0,0 +1,19 @@
-- DB update 2024_05_18_02 -> 2024_05_19_00
-- Update gameobject 'Crossroads' Supply Crates' with sniffed values
-- updated spawns
DELETE FROM `gameobject` WHERE (`id` IN (175708))
AND (`guid` IN (13381, 13382, 13384, 13385));
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES
(13381, 175708, 1, 0, 0, 1, 1, -69.6404571533203125, -3390.967529296875, 92.3358001708984375, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 120, 255, 1, "", 45435, NULL),
(13382, 175708, 1, 0, 0, 1, 1, -230.87164306640625, -3307.604248046875, 91.66666412353515625, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 120, 255, 1, "", 46902, NULL),
(13384, 175708, 1, 0, 0, 1, 1, -60.1678390502929687, -3398.855712890625, 91.72420501708984375, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 255, 1, "", 45435, NULL),
(13385, 175708, 1, 0, 0, 1, 1, -212.19598388671875, -3292.279052734375, 91.66666412353515625, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 120, 255, 1, "", 51943, NULL);
-- new spawns
DELETE FROM `gameobject` WHERE (`id` IN (175708))
AND (`guid` IN (443, 444, 445, 446));
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES
(443, 175708, 1, 0, 0, 1, 1, -134.407684326171875, -3309.6806640625, 91.66666412353515625, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 120, 255, 1, "", 45435, NULL),
(444, 175708, 1, 0, 0, 1, 1, -238.936386108398437, -3337.522705078125, 91.68515777587890625, 1.064649581909179687, 0, 0, 0.507537841796875, 0.861629426479339599, 120, 255, 1, "", 45435, NULL),
(445, 175708, 1, 0, 0, 1, 1, -38.3517112731933593, -3373.55859375, 91.701904296875, 0.767943859100341796, 0, 0, 0.374606132507324218, 0.927184045314788818, 120, 255, 1, "", 46902, NULL),
(446, 175708, 1, 0, 0, 1, 1, -48.2439079284667968, -3403.219482421875, 91.69777679443359375, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 46902, NULL);
@@ -0,0 +1,8 @@
-- DB update 2024_05_19_00 -> 2024_05_19_01
UPDATE `creature_template` SET `mingold` = 2500000, `maxgold` = 2500000 WHERE `entry` IN (17767, 17808, 17842, 17888, 18805, 18831, 19044, 19514, 19516, 21213, 21214, 21215, 21216, 21217, 22841, 23420, 22871, 22887, 22898, 22947, 22948, 24882, 24892, 25038, 25840);
UPDATE `creature_template` SET `mingold` = 625000, `maxgold` = 625000 WHERE `entry` IN (22949, 22950, 22951, 22952);
UPDATE `creature_template` SET `mingold` = 3000000, `maxgold` = 3000000 WHERE `entry` IN (17968, 19622, 21212, 22917);
UPDATE `creature_template` SET `mingold` = 3500000, `maxgold` = 3500000 WHERE `entry` IN (25165, 25166);
UPDATE `creature_template` SET `mingold` = 5000000, `maxgold` = 5000000 WHERE `entry` = 25315;
-- Values below are entirely guessed, ±25g from Wowhead's ~500g average money drop.
UPDATE `creature_template` SET `mingold` = 4750000, `maxgold` = 5250000 WHERE `entry` IN (17257, 17711, 18728);
@@ -0,0 +1,5 @@
-- DB update 2024_05_19_01 -> 2024_05_20_00
--
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_anetheron_sleep';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(31298, 'spell_anetheron_sleep');
@@ -0,0 +1,9 @@
-- DB update 2024_05_20_00 -> 2024_05_21_00
--
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 18104;
UPDATE `creature_template` SET `ScriptName` = '' WHERE `entry` = 18095;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 18104);
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`, `event_param6`, `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
(18104, 0, 0, 0, 60, 0, 100, 512, 1600, 1600, 1600, 1600, 0, 0, 89, 40, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Doomfire Spirit - Update - move to random near position in 40 yards'),
(18104, 0, 1, 0, 60, 0, 100, 512, 1550, 1550, 1600, 1600, 0, 0, 212, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Doomfire Spirit - Update - stop moving');
@@ -0,0 +1,21 @@
-- DB update 2024_05_21_00 -> 2024_05_25_00
--
-- Remove encounter auras minus glow aura from Keepers, add glow aura to Gossip Keepers
UPDATE `creature_template_addon` SET `auras` = '62647' WHERE `entry` IN (33410,33411,33412,33413,33213,33241,33242,33244);
DELETE FROM `spell_script_names` WHERE `spell_id` = 64170;
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (64170, 'spell_keeper_freya_summon_sanity_well');
DELETE FROM `spell_script_names` WHERE `spell_id` IN (62650,62670,62671,62702);
DELETE FROM `spell_script_names` WHERE `spell_id` = 64174 AND `ScriptName` = 'spell_gen_area_aura_select_players';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(62650, 'spell_gen_area_aura_select_players_and_caster'),
(62670, 'spell_gen_area_aura_select_players_and_caster'),
(62671, 'spell_gen_area_aura_select_players_and_caster'),
(62702, 'spell_gen_area_aura_select_players_and_caster'),
(64174, 'spell_gen_area_aura_select_players');
-- Keeper: handle spawns with script
DELETE FROM `creature` WHERE `id1` IN (33213,33241,33242,33244);
-- Keeper: remove not selectable, immune to pc, immune to player; civilian
UPDATE `creature_template` SET `unit_flags` = `unit_flags` & ~(256 | 512 | 33554432), `flags_extra` = `flags_extra` & ~2 WHERE `entry` IN (33410,33411,33412,33413);
@@ -0,0 +1,3 @@
-- DB update 2024_05_25_00 -> 2024_05_25_01
UPDATE `creature_loot_template` SET `Reference` = 1080007 WHERE `Reference` = 1080008 AND `Comment` = 'World Drop - Profession Recipes - NPC Levels ~50-63';
DELETE FROM `reference_loot_template` WHERE `Entry` = 1080008;
-1
View File
@@ -5,7 +5,6 @@
# Don't make changes this file! make a `docker-compose.override.yml` and make your # Don't make changes this file! make a `docker-compose.override.yml` and make your
# changes there instead. # changes there instead.
version: '3'
services: services:
ac-database: ac-database:
container_name: ac-database container_name: ac-database
@@ -1349,6 +1349,26 @@ bool BattlegroundAV::SetupBattleground()
return false; return false;
} }
// Generic gameobjects
for (uint16 i = 0; i <= (BG_AV_OBJECT_GENERIC_MAX - BG_AV_OBJECT_GENERIC_MIN); i++)
{
if (!AddObject(BG_AV_OBJECT_GENERIC_MIN + i,
std::get<0>(BG_AV_GenericObjectPos[i]),
std::get<1>(BG_AV_GenericObjectPos[i]).GetPositionX(),
std::get<1>(BG_AV_GenericObjectPos[i]).GetPositionY(),
std::get<1>(BG_AV_GenericObjectPos[i]).GetPositionZ(),
std::get<1>(BG_AV_GenericObjectPos[i]).GetOrientation(),
std::get<2>(BG_AV_GenericObjectPos[i])[0],
std::get<2>(BG_AV_GenericObjectPos[i])[1],
std::get<2>(BG_AV_GenericObjectPos[i])[2],
std::get<2>(BG_AV_GenericObjectPos[i])[3],
RESPAWN_ONE_DAY))
{
LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!10.{}", i);
return false;
}
}
// Quest banners // Quest banners
if (!AddObject(BG_AV_OBJECT_FROSTWOLF_BANNER, BG_AV_OBJECTID_FROSTWOLF_BANNER, BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][0], BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][1], BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][2], BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][3], 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][3] / 2), cos(BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][3] / 2), RESPAWN_ONE_DAY)) if (!AddObject(BG_AV_OBJECT_FROSTWOLF_BANNER, BG_AV_OBJECTID_FROSTWOLF_BANNER, BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][0], BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][1], BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][2], BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][3], 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][3] / 2), cos(BG_AV_ObjectPos[AV_OPLACE_FROSTWOLF_BANNER][3] / 2), RESPAWN_ONE_DAY))
{ {
@@ -1404,6 +1424,10 @@ bool BattlegroundAV::SetupBattleground()
for (i = BG_AV_OBJECT_HANDPACKED_SNOWDRIFT_MIN ; i <= BG_AV_OBJECT_HANDPACKED_SNOWDRIFT_MAX; i++) for (i = BG_AV_OBJECT_HANDPACKED_SNOWDRIFT_MIN ; i <= BG_AV_OBJECT_HANDPACKED_SNOWDRIFT_MAX; i++)
SpawnBGObject(i, RESPAWN_IMMEDIATELY); SpawnBGObject(i, RESPAWN_IMMEDIATELY);
// Generic gameobjects
for (uint16 i = BG_AV_OBJECT_GENERIC_MIN; i <= BG_AV_OBJECT_GENERIC_MAX; i++)
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
// Quest banners // Quest banners
SpawnBGObject(BG_AV_OBJECT_FROSTWOLF_BANNER, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_AV_OBJECT_FROSTWOLF_BANNER, RESPAWN_IMMEDIATELY);
SpawnBGObject(BG_AV_OBJECT_STORMPIKE_BANNER, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_AV_OBJECT_STORMPIKE_BANNER, RESPAWN_IMMEDIATELY);
@@ -324,8 +324,10 @@ enum BG_AV_ObjectTypes
BG_AV_OBJECT_HANDPACKED_SNOWDRIFT_MAX = 246, BG_AV_OBJECT_HANDPACKED_SNOWDRIFT_MAX = 246,
BG_AV_OBJECT_FROSTWOLF_BANNER = 247, BG_AV_OBJECT_FROSTWOLF_BANNER = 247,
BG_AV_OBJECT_STORMPIKE_BANNER = 248, BG_AV_OBJECT_STORMPIKE_BANNER = 248,
BG_AV_OBJECT_GENERIC_MIN = 249,
BG_AV_OBJECT_GENERIC_MAX = 323,
BG_AV_OBJECT_MAX = 249 BG_AV_OBJECT_MAX = 324
}; };
enum BG_AV_OBJECTS enum BG_AV_OBJECTS
@@ -565,6 +567,97 @@ const float BG_AV_ObjectPos[AV_OPLACE_MAX][4] =
{40.0913f, 0.0153897f, -4.0962f, 0.96131f} {40.0913f, 0.0153897f, -4.0962f, 0.96131f}
}; };
// GO template ID, Position, rotation0-3, VerifiedBuild
std::tuple<uint32, Position, std::array<float, 4>> const BG_AV_GenericObjectPos[BG_AV_OBJECT_GENERIC_MAX - BG_AV_OBJECT_GENERIC_MIN + 1] =
{
// Burning Embers
{ 3832, { -1235.57f, -241.478f, 73.4377f, 1.48353f }, { 0.0f, 0.0f, 0.67559f, 0.737278f } }, // 46248
{ 3833, { -1248.85f, -254.06f, 73.4377f, 1.48353f }, { 0.0f, 0.0f, 0.67559f, 0.737278f } }, // 46248
{ 3834, { -1248.15f, -245.599f, 73.4377f, 6.23083f }, { 0.0f, 0.0f, -0.0261765f, 0.999657f } }, // 46248
{ 3835, { -1237.21f, -260.168f, 73.4377f, 1.48353f }, { 0.0f, 0.0f, 0.67559f, 0.737278f } }, // 46248
{ 3836, { -1260.37f, -248.767f, 77.9454f, 1.48353f }, { 0.0f, 0.0f, 0.67559f, 0.737278f } }, // 46248
{ 3837, { -1249.32f, -244.907f, 92.3372f, 0.401425f }, { 0.0f, 0.0f, 0.199368f, 0.979925f } }, // 46248
{ 3838, { -1250.09f, -254.604f, 92.3015f, 0.148352f }, { 0.0f, 0.0f, 0.0741081f, 0.99725f } }, // 46248
// Wooden Chair
{ 28048, { 41.1672f, -426.866f, 44.6828f, 2.7838f }, { 0.0f, 0.0f, 0.98404f, 0.177946f } }, // 52237
{ 28049, { 39.0988f, -425.746f, 44.688f, 5.66359f }, { 0.0f, 0.0f, -0.304864f, 0.952396f } }, // 52237
{ 28605, { 25.2482f, -433.104f, 47.6369f, 2.38237f }, { 0.0f, 0.0f, 0.928809f, 0.370558f } }, // 52237
{ 28606, { 25.758f, -425.837f, 47.6369f, 4.30224f }, { 0.0f, 0.0f, -0.836286f, 0.548294f } }, // 52237
{ 28607, { 27.6786f, -427.69f, 47.6369f, 3.60411f }, { 0.0f, 0.0f, -0.973379f, 0.229201f } }, // 52237
// Anvil
{ 32571, { -100.071f, -583.512f, 41.7316f, 0.00872424f }, { 0.0f, 0.0f, 0.00436211f, 0.99999f } }, // 46248
{ 32572, { -102.733f, -588.775f, 41.7316f, 5.24472f }, { 0.0f, 0.0f, -0.496216f, 0.868199f } }, // 46248
{ 32573, { -100.966f, -586.958f, 41.7316f, 5.76831f }, { 0.0f, 0.0f, -0.254601f, 0.967046f } }, // 46248
{ 32574, { -106.172f, -589.721f, 41.7316f, 4.72112f }, { 0.0f, 0.0f, -0.704014f, 0.710186f } }, // 46248
{ 51704, { -1245.2f, -307.059f, 63.3199f, 3.0796f }, { -0.00711155f, -0.0236301f, 0.99922f, 0.0308324f } }, // 46248
{ 51705, { -1258.23f, -310.977f, 63.2015f, 0.862903f }, { 0.0179744f, -0.0169086f, 0.418255f, 0.907994f } }, // 46248
{ 161489, { 360.38f, -527.549f, 71.1205f, 4.23242f }, { 0.0f, 0.0f, -0.854912f, 0.518773f } }, // 46248
{ 178685, { 646.207f, -57.2431f, 41.6587f, 6.12611f }, { 0.0f, 0.0f, -0.0784588f, 0.996917f } }, // 46248
{ 179391, { 548.682f, -100.846f, 44.8191f, 1.46608f }, { 0.0f, 0.0f, 0.66913f, 0.743145f } }, // 46248
{ 179391, { -172.363f, -452.824f, 33.2796f, 0.628319f }, { 0.0f, 0.0f, 0.309017f, 0.951056f } }, // 46248
{ 179392, { 552.429f, -102.764f, 44.8191f, 2.46964f }, { 0.0f, 0.0f, 0.944089f, 0.329691f } }, // 46248
{ 179392, { -171.282f, -456.892f, 33.2796f, 1.63188f }, { 0.0f, 0.0f, 0.728371f, 0.685183f } }, // 46248
{ 179393, { 549.472f, -101.547f, 44.8191f, 1.16064f }, { 0.0f, 0.0f, 0.548293f, 0.836286f } }, // 46248
{ 179393, { -172.356f, -453.88f, 33.2796f, 0.322884f }, { 0.0f, 0.0f, 0.160742f, 0.986997f } }, // 46248
{ 179394, { 550.347f, -101.698f, 44.8191f, 1.59698f }, { 0.0f, 0.0f, 0.716302f, 0.69779f } }, // 46248
{ 179394, { -171.882f, -454.632f, 33.2796f, 0.759217f }, { 0.0f, 0.0f, 0.370557f, 0.92881f } }, // 46248
{ 179395, { 551.271f, -102.226f, 44.8191f, 0.898843f }, { 0.0f, 0.0f, 0.434444f, 0.900699f } }, // 46248
{ 179395, { -171.656f, -455.671f, 33.2796f, 0.0610847f }, { 0.0f, 0.0f, 0.0305376f, 0.999534f } }, // 46248
{ 179396, { -170.699f, -458.41f, 33.2796f, 5.25344f }, { 0.0f, 0.0f, -0.492423f, 0.870356f } }, // 46248
{ 179396, { 553.947f, -103.347f, 44.8191f, 6.0912f }, { 0.0f, 0.0f, -0.0958452f, 0.995396f } }, // 46248
{ 179397, { -170.14f, -457.609f, 33.2796f, 5.60251f }, { 0.0f, 0.0f, -0.333806f, 0.942642f } }, // 46248
{ 179397, { 553.725f, -102.396f, 44.8191f, 0.157079f }, { 0.0f, 0.0f, 0.0784588f, 0.996917f } }, // 46248
// Forge
{ 34571, { -105.423f, -584.352f, 42.0149f, 2.36492f }, { 0.0f, 0.0f, 0.92554f, 0.37865f } }, // 46248
{ 161487, { 361.097f, -531.693f, 71.1898f, 4.12771f }, { 0.0f, 0.0f, -0.88089f, 0.473321f } }, // 46248
{ 178684, { 649.264f, -59.1111f, 41.5476f, 3.59538f }, { 0.0f, 0.0f, -0.97437f, 0.224951f } }, // 46248
// Bonfire
{ 161488, { 360.915f, -497.099f, 71.3389f, 3.14159f }, { 0.0f, 0.0f, -1.0f, 0.0f } }, // 46248
{ 177408, { -743.427f, -398.241f, 76.4266f, 0.872664f }, { 0.0173936f, -0.00633049f, 0.422701f, 0.90608f } }, // 46248
// Brazier
{ 177261, { -1290.27f, -172.47f, 72.1853f, 3.06302f }, { 0.00871992f, -0.00034237f, 0.99919f, 0.0392748f } }, // 46248
{ 177292, { -1099.21f, -266.231f, 57.8849f, 3.99681f }, { 0.0f, 0.0f, -0.909961f, 0.414694f } }, // 46248
{ 177293, { -1082.6f, -266.681f, 57.8575f, 2.40855f }, { 0.0f, 0.0f, 0.933579f, 0.35837f } }, // 46248
{ 177405, { -1140.82f, -343.392f, 50.9077f, 3.49939f }, { 0.0f, 0.0f, -0.98404f, 0.177946f } }, // 46248
{ 177406, { -1139.68f, -356.288f, 51.264f, 5.57633f }, { 0.0f, 0.0f, -0.346116f, 0.938192f } }, // 46248
{ 177409, { -1215.59f, -371.946f, 56.5293f, 0.357792f }, { 0.0f, 0.0f, 0.177943f, 0.984041f } }, // 46248
{ 177410, { -1241.25f, -345.115f, 59.6867f, 0.357792f }, { 0.0f, 0.0f, 0.177943f, 0.984041f } }, // 46248
{ 177411, { -1202.81f, -271.599f, 72.5805f, 0.357792f }, { 0.0f, 0.0f, 0.177943f, 0.984041f } }, // 46248
{ 177412, { -1282.21f, -284.083f, 87.256f, 6.2221f }, { 0.0f, 0.0f, -0.0305376f, 0.999534f } }, // 46248
{ 177413, { -1256.55f, -280.278f, 73.9473f, 6.2221f }, { 0.0f, 0.0f, -0.0305376f, 0.999534f } }, // 46248
{ 179419, { -1423.16f, -318.436f, 89.1136f, 2.35619f }, { 0.0f, 0.0f, 0.923879f, 0.382686f } }, // 46248
// Campfire
{ 177262, { -1286.25f, -184.481f, 71.8334f, 4.23243f }, { -0.00733089f, -0.0299597f, -0.854258f, 0.518934f } }, // 46248
{ 177263, { -1280.17f, -220.536f, 72.2686f, 1.62315f }, { 0.0f, 0.0f, 0.725373f, 0.688356f } }, // 46248
{ 177324, { -375.017f, -523.71f, 84.0771f, 3.14159f }, { 0.0f, 0.0f, -1.0f, 0.0f } }, // 46248
{ 177325, { -413.51f, -521.413f, 84.0771f, 2.05948f }, { 0.0f, 0.0f, 0.857166f, 0.51504f } }, // 46248
{ 177326, { -487.401f, -526.486f, 82.5708f, 5.47161f }, { 0.0f, 0.0f, -0.394743f, 0.918792f } }, // 46248
{ 177327, { -251.556f, -562.061f, 68.1725f, 6.11738f }, { 0.0f, 0.0f, -0.0828075f, 0.996566f } }, // 46248
{ 177425, { -353.118f, 37.0955f, 65.8904f, 3.14159f }, { 0.0f, 0.0f, -1.0f, 0.0f } }, // 48632
{ 179945, { -1070.53f, -617.908f, 51.3249f, 5.83813f }, { 0.0f, 0.0f, -0.220697f, 0.975342f } }, // 46248
// Cauldron
{ 177396, { 12.8247f, -120.21f, 41.6669f, 3.14159f }, { 0.0f, 0.0f, -1.0f, 0.0f } }, // 46248
// Chair
{ 179384, { -145.341f, -444.846f, 26.4163f, 6.23083f }, { 0.0f, 0.0f, -0.0261765f, 0.999657f } }, // 52237
{ 179384, { 560.834f, -75.4266f, 37.9558f, 0.785397f }, { 0.0f, 0.0f, 0.382683f, 0.92388f } }, // 52237
{ 179385, { 550.678f, -79.8234f, 44.8257f, 3.18527f }, { 0.0f, 0.0f, -0.999762f, 0.0218352f } }, // 52237
{ 179385, { -155.405f, -440.24f, 33.2862f, 2.34747f }, { 0.0f, 0.0f, 0.922201f, 0.38671f } }, // 52237
{ 179386, { 568.326f, -89.4992f, 37.9558f, 1.39626f }, { 0.0f, 0.0f, 0.642787f, 0.766045f } }, // 52237
{ 179386, { -150.787f, -459.829f, 26.4163f, 0.558504f }, { 0.0f, 0.0f, 0.275637f, 0.961262f } }, // 52237
{ 179387, { 550.597f, -77.5213f, 44.8257f, 4.23242f }, { 0.0f, 0.0f, -0.854912f, 0.518773f } }, // 52237
{ 179387, { -153.748f, -438.639f, 33.2862f, 3.39467f }, { 0.0f, 0.0f, -0.992004f, 0.126203f } }, // 52237
{ 179388, { 570.419f, -89.0567f, 37.9558f, 2.22529f }, { 0.0f, 0.0f, 0.896873f, 0.442289f } }, // 52237
{ 179388, { -149.057f, -461.089f, 26.4163f, 1.38754f }, { 0.0f, 0.0f, 0.63944f, 0.768841f } }, // 52237
{ 179389, { 555.517f, -101.589f, 44.8257f, 0.392697f }, { 0.0f, 0.0f, 0.195089f, 0.980785f } }, // 52237
{ 179389, { -168.342f, -458.4f, 33.2862f, 5.83813f }, { 0.0f, 0.0f, -0.220697f, 0.975342f } }, // 52237
{ 179390, { 561.851f, -73.1481f, 37.9558f, 4.88692f }, { 0.0f, 0.0f, -0.642787f, 0.766045f } }, // 52237
{ 179390, { -142.968f, -444.076f, 26.4163f, 4.04917f }, { 0.0f, 0.0f, -0.898793f, 0.438373f } }, // 52237
// Wanted: ORCS!
{ 179437, { 618.748f, -52.1126f, 42.1122f, 6.21337f }, { 0.0f, 0.0f, -0.0348988f, 0.999390f } }, // 46248
// Wanted: DWARVES!
{ 179438, { -1181.10f, -370.747f, 53.6246f, 2.68781f }, { 0.0f, 0.0f, 0.974370f, 0.224951f } }, // 46248
};
const float BG_AV_DoorPositons[2][4] = const float BG_AV_DoorPositons[2][4] =
{ {
{780.487f, -493.024f, 99.9553f, 3.0976f}, //alliance {780.487f, -493.024f, 99.9553f, 3.0976f}, //alliance
@@ -6586,6 +6586,8 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply
statType = proto->ItemStat[i].ItemStatType; statType = proto->ItemStat[i].ItemStatType;
val = proto->ItemStat[i].ItemStatValue; val = proto->ItemStat[i].ItemStatValue;
sScriptMgr->OnApplyItemModsBefore(this, slot, apply, i, statType, val);
} }
if (val == 0) if (val == 0)
@@ -4451,6 +4451,8 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
} }
} }
sScriptMgr->OnApplyEnchantmentItemModsBefore(this, item, slot, apply, enchant_spell_id, enchant_amount);
LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id); LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
switch (enchant_spell_id) switch (enchant_spell_id)
{ {
+1 -1
View File
@@ -19312,7 +19312,7 @@ float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, i
modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance); modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
} }
missChance += hitChance - 100.0f; missChance -= hitChance - 100.0f;
if (attType == RANGED_ATTACK) if (attType == RANGED_ATTACK)
missChance -= m_modRangedHitChance; missChance -= m_modRangedHitChance;
+1 -1
View File
@@ -2351,6 +2351,6 @@ void LoadLootTemplates_Reference()
// output error for any still listed ids (not referenced from any loot table) // output error for any still listed ids (not referenced from any loot table)
LootTemplates_Reference.ReportUnusedIds(lootIdSet); LootTemplates_Reference.ReportUnusedIds(lootIdSet);
LOG_INFO("server.loading", ">> Loaded refence loot templates in {} ms", GetMSTimeDiffToNow(oldMSTime)); LOG_INFO("server.loading", ">> Loaded reference loot templates in {} ms", GetMSTimeDiffToNow(oldMSTime));
LOG_INFO("server.loading", " "); LOG_INFO("server.loading", " ");
} }
@@ -647,6 +647,16 @@ void ScriptMgr::OnCustomScalingStatValue(Player* player, ItemTemplate const* pro
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE, script->OnCustomScalingStatValue(player, proto, statType, val, itemProtoStatNumber, ScalingStatValue, ssv)); CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE, script->OnCustomScalingStatValue(player, proto, statType, val, itemProtoStatNumber, ScalingStatValue, ssv));
} }
void ScriptMgr::OnApplyItemModsBefore(Player* player, uint8 slot, bool apply, uint8 itemProtoStatNumber, uint32 statType, int32& val)
{
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_APPLY_ITEM_MODS_BEFORE, script->OnApplyItemModsBefore(player, slot, apply, itemProtoStatNumber, statType, val));
}
void ScriptMgr::OnApplyEnchantmentItemModsBefore(Player* player, Item* item, EnchantmentSlot slot, bool apply, uint32 enchant_spell_id, uint32& enchant_amount)
{
CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_APPLY_ENCHANTMENT_ITEM_MODS_BEFORE, script->OnApplyEnchantmentItemModsBefore(player, item, slot, apply, enchant_spell_id, enchant_amount));
}
bool ScriptMgr::CanArmorDamageModifier(Player* player) bool ScriptMgr::CanArmorDamageModifier(Player* player)
{ {
CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_ARMOR_DAMAGE_MODIFIER, !script->CanArmorDamageModifier(player)); CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_CAN_ARMOR_DAMAGE_MODIFIER, !script->CanArmorDamageModifier(player));
@@ -146,6 +146,8 @@ enum PlayerHook
PLAYERHOOK_ON_VICTIM_REWARD_AFTER, PLAYERHOOK_ON_VICTIM_REWARD_AFTER,
PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE_BEFORE, PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE_BEFORE,
PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE, PLAYERHOOK_ON_CUSTOM_SCALING_STAT_VALUE,
PLAYERHOOK_ON_APPLY_ITEM_MODS_BEFORE,
PLAYERHOOK_ON_APPLY_ENCHANTMENT_ITEM_MODS_BEFORE,
PLAYERHOOK_CAN_ARMOR_DAMAGE_MODIFIER, PLAYERHOOK_CAN_ARMOR_DAMAGE_MODIFIER,
PLAYERHOOK_ON_GET_FERAL_AP_BONUS, PLAYERHOOK_ON_GET_FERAL_AP_BONUS,
PLAYERHOOK_CAN_APPLY_WEAPON_DEPENDENT_AURA_DAMAGE_MOD, PLAYERHOOK_CAN_APPLY_WEAPON_DEPENDENT_AURA_DAMAGE_MOD,
@@ -543,6 +545,10 @@ public:
virtual void OnCustomScalingStatValue(Player* /*player*/, ItemTemplate const* /*proto*/, uint32& /*statType*/, int32& /*val*/, uint8 /*itemProtoStatNumber*/, uint32 /*ScalingStatValue*/, ScalingStatValuesEntry const* /*ssv*/) { } virtual void OnCustomScalingStatValue(Player* /*player*/, ItemTemplate const* /*proto*/, uint32& /*statType*/, int32& /*val*/, uint8 /*itemProtoStatNumber*/, uint32 /*ScalingStatValue*/, ScalingStatValuesEntry const* /*ssv*/) { }
virtual void OnApplyItemModsBefore(Player* /*player*/, uint8 /*slot*/, bool /*apply*/, uint8 /*itemProtoStatNumber*/, uint32 /*statType*/, int32& /*val*/) { }
virtual void OnApplyEnchantmentItemModsBefore(Player* /*player*/, Item* /*item*/, EnchantmentSlot /*slot*/, bool /*apply*/, uint32 /*enchant_spell_id*/, uint32& /*enchant_amount*/) { }
[[nodiscard]] virtual bool CanArmorDamageModifier(Player* /*player*/) { return true; } [[nodiscard]] virtual bool CanArmorDamageModifier(Player* /*player*/) { return true; }
virtual void OnGetFeralApBonus(Player* /*player*/, int32& /*feral_bonus*/, int32 /*dpsMod*/, ItemTemplate const* /*proto*/, ScalingStatValuesEntry const* /*ssv*/) { } virtual void OnGetFeralApBonus(Player* /*player*/, int32& /*feral_bonus*/, int32 /*dpsMod*/, ItemTemplate const* /*proto*/, ScalingStatValuesEntry const* /*ssv*/) { }
+2
View File
@@ -445,6 +445,8 @@ public: /* PlayerScript */
void OnVictimRewardAfter(Player* player, Player* victim, uint32& killer_title, uint32& victim_rank, float& honor_f); void OnVictimRewardAfter(Player* player, Player* victim, uint32& killer_title, uint32& victim_rank, float& honor_f);
void OnCustomScalingStatValueBefore(Player* player, ItemTemplate const* proto, uint8 slot, bool apply, uint32& CustomScalingStatValue); void OnCustomScalingStatValueBefore(Player* player, ItemTemplate const* proto, uint8 slot, bool apply, uint32& CustomScalingStatValue);
void OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv); void OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv);
void OnApplyItemModsBefore(Player* player, uint8 slot, bool apply, uint8 itemProtoStatNumber, uint32 statType, int32& val);
void OnApplyEnchantmentItemModsBefore(Player* player, Item* item, EnchantmentSlot slot, bool apply, uint32 enchant_spell_id, uint32& enchant_amount);
bool CanArmorDamageModifier(Player* player); bool CanArmorDamageModifier(Player* player);
void OnGetFeralApBonus(Player* player, int32& feral_bonus, int32 dpsMod, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv); void OnGetFeralApBonus(Player* player, int32& feral_bonus, int32 dpsMod, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv);
bool CanApplyWeaponDependentAuraDamageMod(Player* player, Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply); bool CanApplyWeaponDependentAuraDamageMod(Player* player, Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply);
+1 -1
View File
@@ -1275,7 +1275,7 @@ void World::LoadConfigSettings(bool reload)
_bool_configs[CONFIG_ALLOW_JOIN_BG_AND_LFG] = sConfigMgr->GetOption<bool>("JoinBGAndLFG.Enable", false); _bool_configs[CONFIG_ALLOW_JOIN_BG_AND_LFG] = sConfigMgr->GetOption<bool>("JoinBGAndLFG.Enable", false);
_bool_configs[CONFIG_LEAVE_GROUP_ON_LOGOUT] = sConfigMgr->GetOption<bool>("LeaveGroupOnLogout.Enabled", true); _bool_configs[CONFIG_LEAVE_GROUP_ON_LOGOUT] = sConfigMgr->GetOption<bool>("LeaveGroupOnLogout.Enabled", false);
_bool_configs[CONFIG_QUEST_POI_ENABLED] = sConfigMgr->GetOption<bool>("QuestPOI.Enabled", true); _bool_configs[CONFIG_QUEST_POI_ENABLED] = sConfigMgr->GetOption<bool>("QuestPOI.Enabled", true);
+3 -2
View File
@@ -33,6 +33,7 @@ EndScriptData */
#include "ReputationMgr.h" #include "ReputationMgr.h"
#include "SpellInfo.h" #include "SpellInfo.h"
#include "SpellMgr.h" #include "SpellMgr.h"
#include "SharedDefines.h"
using namespace Acore::ChatCommands; using namespace Acore::ChatCommands;
@@ -516,7 +517,7 @@ public:
if (handler->GetSession()) if (handler->GetSession())
{ {
handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate.ItemId, itemTemplate.ItemId, name.c_str()); handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate.ItemId, ItemQualityColors[itemTemplate.Quality], itemTemplate.ItemId, name.c_str());
} }
else else
{ {
@@ -550,7 +551,7 @@ public:
if (handler->GetSession()) if (handler->GetSession())
{ {
handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate.ItemId, itemTemplate.ItemId, name.c_str()); handler->PSendSysMessage(LANG_ITEM_LIST_CHAT, itemTemplate.ItemId, ItemQualityColors[itemTemplate.Quality], itemTemplate.ItemId, name.c_str());
} }
else else
{ {
@@ -109,6 +109,18 @@ struct boss_nightbane : public BossAI
me->GetMotionMaster()->MoveTakeoff(POINT_DESPAWN, -11013.246f, -1770.5212f, 166.50139f); me->GetMotionMaster()->MoveTakeoff(POINT_DESPAWN, -11013.246f, -1770.5212f, 166.50139f);
} }
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damageEffectType, SpellSchoolMask spellSchoolMask) override
{
if (_flying || Phase == 2)
{
if (damage >= me->GetHealth())
{
damage = me->GetHealth() - 1;
}
}
BossAI::DamageTaken(attacker, damage, damageEffectType, spellSchoolMask);
}
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
{ {
BossAI::JustEngagedWith(who); BossAI::JustEngagedWith(who);
@@ -160,17 +172,21 @@ struct boss_nightbane : public BossAI
scheduler.Schedule(2s, GROUP_FLYING, [this](TaskContext) scheduler.Schedule(2s, GROUP_FLYING, [this](TaskContext)
{ {
DoResetThreatList(); DoResetThreatList();
DoCastVictim(SPELL_RAIN_OF_BONES); if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
_skeletonscheduler.Schedule(50ms, [this](TaskContext context)
{ {
//spawns skeletons every second until skeletonCount is reached _skeletonSpawnPos = target->GetPosition();
if(_skeletonSpawnCounter < _skeletonCount) me->CastSpell(_skeletonSpawnPos.GetPositionX(), _skeletonSpawnPos.GetPositionY(), _skeletonSpawnPos.GetPositionZ(), SPELL_RAIN_OF_BONES, true);
_skeletonscheduler.Schedule(50ms, [this](TaskContext context)
{ {
DoCastVictim(SPELL_SUMMON_SKELETON, true); //spawns skeletons every 2 seconds until skeletonCount is reached
_skeletonSpawnCounter++; if(_skeletonSpawnCounter < _skeletonCount)
context.Repeat(2s); {
} me->CastSpell(_skeletonSpawnPos.GetPositionX(), _skeletonSpawnPos.GetPositionY(), _skeletonSpawnPos.GetPositionZ(), SPELL_SUMMON_SKELETON, true);
}); _skeletonSpawnCounter++;
context.Repeat(2s);
}
});
}
}).Schedule(20s, GROUP_FLYING, [this](TaskContext context) }).Schedule(20s, GROUP_FLYING, [this](TaskContext context)
{ {
DoCastRandomTarget(SPELL_DISTRACTING_ASH); DoCastRandomTarget(SPELL_DISTRACTING_ASH);
@@ -371,6 +387,7 @@ private:
uint32 _movePhase; uint32 _movePhase;
uint8 _skeletonCount; uint8 _skeletonCount;
uint8 _skeletonSpawnCounter; uint8 _skeletonSpawnCounter;
Position _skeletonSpawnPos;
}; };
class go_blackened_urn : public GameObjectScript class go_blackened_urn : public GameObjectScript
@@ -23,6 +23,7 @@ void AddSC_event_winter_veil_scripts();
void AddSC_event_love_in_the_air(); void AddSC_event_love_in_the_air();
void AddSC_event_midsummer_scripts(); void AddSC_event_midsummer_scripts();
void AddSC_event_childrens_week(); void AddSC_event_childrens_week();
void AddSC_event_firework_show_scripts();
// The name of this function should match: // The name of this function should match:
// void Add${NameOfDirectory}Scripts() // void Add${NameOfDirectory}Scripts()
@@ -35,4 +36,5 @@ void AddEventsScripts()
AddSC_event_love_in_the_air(); AddSC_event_love_in_the_air();
AddSC_event_midsummer_scripts(); AddSC_event_midsummer_scripts();
AddSC_event_childrens_week(); AddSC_event_childrens_week();
AddSC_event_firework_show_scripts();
} }
@@ -0,0 +1,206 @@
/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "firework_show.h"
#include "firework_show_BootyBay.h"
#include "firework_show_Exodar.h"
#include "firework_show_Ironforge.h"
#include "firework_show_Orgrimmar.h"
#include "firework_show_Shattrath.h"
#include "firework_show_Silvermoon.h"
#include "firework_show_Stormwind.h"
#include "firework_show_Teldrassil.h"
#include "firework_show_ThunderBluff.h"
#include "firework_show_Undercity.h"
#include "GameObjectAI.h"
#include "GameObjectScript.h"
// <mapId, zoneId>, show
std::map<std::pair<uint32, uint32>, FireworkShow const *> const FireworkShowStore = {
{ { 0, 1 }, &fireworkShowIronforge },
{ { 0, 33 }, &fireworkShowBootyBay },
{ { 0, 1497 }, &fireworkShowUndercity },
{ { 0, 1519 }, &fireworkShowStormwind },
{ { 1, 141 }, &fireworkShowTeldrassil },
{ { 1, 1637 }, &fireworkShowOrgrimmar },
{ { 1, 1638 }, &fireworkShowThunderBluff },
{ { 530, 3430 }, &fireworkShowSilvermoon },
{ { 530, 3557 }, &fireworkShowExodar },
{ { 530, 3703 }, &fireworkShowShattrath },
};
struct go_firework_show : public GameObjectAI
{
go_firework_show(GameObject* go) : GameObjectAI(go)
{
_curIdx = 0;
_showRunning = false;
_show = nullptr;
InitShow();
}
void InitShow()
{
_show = nullptr;
auto itr = FireworkShowStore.find(std::make_pair(me->GetMapId(), me->GetZoneId()));
if (itr != FireworkShowStore.end() && itr->second)
_show = itr->second;
StopShow();
_scheduler.Schedule(Milliseconds(4200), [this](TaskContext context)
{
// check for show start
if (!_showRunning)
{
tzset(); // set timezone for localtime_r() -> fix issues due to daylight time
tm local_tm = Acore::Time::TimeBreakdown();
// each show runs approx. 12 minutes
// and starts at the full hour
if ((local_tm.tm_min >= 0) && (local_tm.tm_min < 12))
{
StartShow(local_tm.tm_min);
}
}
context.Repeat();
});
}
// provide start offset to handle a "late start"
// e.g. if the gameobject is spawned later then the desired start time
void StartShow(int minutesOffset)
{
if (!_show || !_show->schedule.entries || !_show->schedule.size || !_show->spawns.entries || !_show->spawns.size)
return;
_curIdx = 0;
_showRunning = true;
me->setActive(true);
// fast-forward show if we've got a late start
if (minutesOffset > 0)
{
int ts = 0;
do {
ts = _show->schedule.entries[_curIdx].timestamp;
} while ((ts <= (minutesOffset * MINUTE * IN_MILLISECONDS)) && (++_curIdx < _show->schedule.size));
}
_scheduler.Schedule(0s, [this](TaskContext context)
{
int32 dt = 0;
do {
dt = SpawnNextFirework();
} while (dt == 0);
if (0 < dt)
context.Repeat(Milliseconds(dt));
else
StopShow();
});
}
void StopShow()
{
if (_showRunning)
{
// Trigger SAI to spawn 'Toasting Goblets' on show end
std::list<GameObject*> _goList;
me->GetGameObjectListWithEntryInGrid(_goList, GO_TOASTING_GOBLET, 1420.0f);
for (std::list<GameObject*>::const_iterator itr = _goList.begin(); itr != _goList.end(); ++itr)
{
if (GameObjectAI* ai = (*itr)->AI())
ai->SetData(0, 1);
}
// Trigger SAI to make Revelers cheer on show end
for (uint32 i = 0; i < COUNT_REVELER_ID; i++)
{
std::list<Creature*> _crList;
me->GetCreatureListWithEntryInGrid(_crList, _show->revelerId[i], 1420.0f);
for (std::list<Creature*>::const_iterator itr = _crList.begin(); itr != _crList.end(); ++itr)
{
if (CreatureAI* ai = (*itr)->AI())
ai->SetData(0, 1);
}
}
}
_showRunning = false;
me->setActive(false);
}
int32 SpawnNextFirework()
{
if (!_showRunning)
return -1;
if (!_show || !_show->schedule.entries || !_show->spawns.entries)
return -2;
if (_curIdx >= _show->schedule.size)
return -3;
uint32 posIdx = _show->schedule.entries[_curIdx].spawnIndex;
if (posIdx < _show->spawns.size)
{
me->SummonGameObject(_show->schedule.entries[_curIdx].gameobjectId,
_show->spawns.entries[posIdx].x,
_show->spawns.entries[posIdx].y,
_show->spawns.entries[posIdx].z,
_show->spawns.entries[posIdx].o,
_show->spawns.entries[posIdx].rot0,
_show->spawns.entries[posIdx].rot1,
_show->spawns.entries[posIdx].rot2,
_show->spawns.entries[posIdx].rot3,
0);
}
uint32 ts = _show->schedule.entries[_curIdx].timestamp;
if (++_curIdx >= _show->schedule.size)
return -4;
if (_show->schedule.entries[_curIdx].timestamp < ts)
return -5;
return (_show->schedule.entries[_curIdx].timestamp - ts);
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
uint32_t _curIdx;
bool _showRunning;
FireworkShow const * _show;
};
void AddSC_event_firework_show_scripts()
{
// Gameobjects
RegisterGameObjectAI(go_firework_show);
}
@@ -0,0 +1,98 @@
/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DEF_FIREWORK_SHOW_H
#define DEF_FIREWORK_SHOW_H
#include "Define.h"
enum eFireworks
{
GO_FIREWORK_SHOW_TYPE_1_RED = 180703,
GO_FIREWORK_SHOW_TYPE_2_RED = 180704,
GO_FIREWORK_SHOW_TYPE_1_RED_BIG = 180707,
GO_FIREWORK_SHOW_TYPE_2_RED_BIG = 180708,
GO_FIREWORK_SHOW_TYPE_1_BLUE = 180720,
GO_FIREWORK_SHOW_TYPE_2_BLUE = 180721,
GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG = 180722,
GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG = 180723,
GO_FIREWORK_SHOW_TYPE_1_GREEN = 180724,
GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG = 180725,
GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG = 180726,
GO_FIREWORK_SHOW_TYPE_2_GREEN = 180727,
GO_FIREWORK_SHOW_TYPE_1_WHITE = 180728,
GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG = 180729,
GO_FIREWORK_SHOW_TYPE_2_WHITE = 180730,
GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG = 180731,
GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG = 180733,
GO_FIREWORK_SHOW_TYPE_1_YELLOW = 180736,
GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG = 180737,
GO_FIREWORK_SHOW_TYPE_2_YELLOW = 180738,
GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG = 180739,
GO_FIREWORK_SHOW_TYPE_2_PURPLE = 180740,
GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG = 180741,
GO_TOASTING_GOBLET = 180754,
NPC_STORMWIND_REVELER = 15694,
NPC_THUNDER_BLUFF_REVELER = 15719,
NPC_BOOTY_BAY_REVELER = 15723,
NPC_DARNASSUS_REVELER = 15905,
NPC_IRONFORGE_REVELER = 15906,
NPC_UNDERCITY_REVELER = 15907,
NPC_ORGRIMMAR_REVELER = 15908,
NPC_SCRYER_REVELER = 23023,
NPC_ALDOR_REVELER = 23024,
NPC_DRAENEI_REVELER = 23039,
NPC_BLOOD_ELF_REVELER = 23045,
COUNT_REVELER_ID = 2,
};
struct FireworkShowGameobject
{
float x;
float y;
float z;
float o;
float rot0;
float rot1;
float rot2;
float rot3;
};
struct FireworkShowScheduleEntry
{
uint32 timestamp;
uint32 gameobjectId;
uint32 spawnIndex;
};
struct FireworkShow
{
struct{
FireworkShowScheduleEntry const * entries;
uint32 const size;
} schedule;
struct {
FireworkShowGameobject const * entries;
uint32 const size;
} spawns;
uint32 const revelerId[COUNT_REVELER_ID];
};
#endif
@@ -0,0 +1,537 @@
/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DEF_FIREWORK_SHOW_BOOTYBAY_H
#define DEF_FIREWORK_SHOW_BOOTYBAY_H
#include "firework_show.h"
// VerifiedBuild 50250 - Midsummer Fireworks Spectacular event
FireworkShowGameobject const FireworkShowGameobjectBootyBay[] =
{
{ -14360.708f, 493.60358f, 32.061573f, 5.8468537f, 0.0f, 0.0f, -0.21643925f, 0.97629607f }, /* 0 */
{ -14382.423f, 516.2576f, 37.59617f, 5.8468537f, 0.0f, 0.0f, -0.21643925f, 0.97629607f }, /* 1 */
{ -14351.329f, 506.18985f, 28.696842f, 5.8468537f, 0.0f, 0.0f, -0.21643925f, 0.97629607f }, /* 2 */
{ -14356.573f, 494.1887f, 39.58786f, 3.6826503f, 0.0f, 0.0f, -0.9636297f, 0.267241f }, /* 3 */
{ -14376.763f, 507.98416f, 59.565323f, 0.9773831f, 0.0f, 0.0f, 0.46947098f, 0.8829479f }, /* 4 */
{ -14358.028f, 515.05804f, 34.266403f, 3.6826503f, 0.0f, 0.0f, -0.9636297f, 0.267241f }, /* 5 */
{ -14358.974f, 502.0223f, 43.826313f, 2.1991146f, 0.0f, 0.0f, 0.89100647f, 0.45399064f }, /* 6 */
{ -14363.282f, 506.73438f, 41.271564f, 5.8992143f, 0.0f, 0.0f, -0.1908083f, 0.9816273f }, /* 7 */
{ -14370.767f, 487.4859f, 45.464447f, 4.886924f, 0.0f, 0.0f, -0.642787f, 0.766045f }, /* 8 */
{ -14357.489f, 490.84445f, 39.473286f, 0.9773831f, 0.0f, 0.0f, 0.46947098f, 0.8829479f }, /* 9 */
{ -14359.632f, 522.25714f, 31.286598f, 2.1991146f, 0.0f, 0.0f, 0.89100647f, 0.45399064f }, /* 10 */
{ -14376.658f, 516.6852f, 38.5385f, 2.1991146f, 0.0f, 0.0f, 0.89100647f, 0.45399064f }, /* 11 */
{ -14374.429f, 496.0701f, 31.312653f, 4.7647495f, 0.0f, 0.0f, -0.6883545f, 0.72537446f }, /* 12 */
{ -14374.914f, 491.50797f, 40.34925f, 4.886924f, 0.0f, 0.0f, -0.642787f, 0.766045f }, /* 13 */
{ -14355.49f, 518.56555f, 35.36923f, 4.7647495f, 0.0f, 0.0f, -0.6883545f, 0.72537446f }, /* 14 */
{ -14354.371f, 491.87906f, 39.833744f, 3.6826503f, 0.0f, 0.0f, -0.9636297f, 0.267241f }, /* 15 */
{ -14389.842f, 503.46115f, 37.370884f, 5.8992143f, 0.0f, 0.0f, -0.1908083f, 0.9816273f }, /* 16 */
{ -14353.637f, 485.4063f, 34.117043f, 4.7647495f, 0.0f, 0.0f, -0.6883545f, 0.72537446f }, /* 17 */
{ -14376.54f, 487.52817f, 44.470444f, 5.8992143f, 0.0f, 0.0f, -0.1908083f, 0.9816273f }, /* 18 */
{ -14379.146f, 507.23697f, 43.95641f, 6.0912004f, 0.0f, 0.0f, -0.09584522f, 0.99539626f }, /* 19 */
{ -14378.098f, 473.56082f, 40.167862f, 0.9773831f, 0.0f, 0.0f, 0.46947098f, 0.8829479f }, /* 20 */
{ -14380.022f, 506.33127f, 59.75512f, 6.0912004f, 0.0f, 0.0f, -0.09584522f, 0.99539626f }, /* 21 */
{ -14353.664f, 485.8341f, 36.866394f, 4.886924f, 0.0f, 0.0f, -0.642787f, 0.766045f }, /* 22 */
{ -14389.552f, 485.74365f, 36.326534f, 6.0912004f, 0.0f, 0.0f, -0.09584522f, 0.99539626f }, /* 23 */
{ -14371.19f, 505.8404f, 28.751783f, 6.0912004f, 0.0f, 0.0f, -0.09584522f, 0.99539626f }, /* 24 */
{ -14351.266f, 494.81473f, 26.889748f, 3.47321f, 0.0f, 0.0f, -0.9862852f, 0.1650499f }, /* 25 */
{ -14391.585f, 505.7818f, 29.009865f, 3.7001047f, 0.0f, 0.0f, -0.9612608f, 0.2756405f }, /* 26 */
{ -14360.903f, 476.7781f, 27.833723f, 2.5481794f, 0.0f, 0.0f, 0.95630455f, 0.29237235f }, /* 27 */
{ -14359.229f, 494.81744f, 41.420765f, 0.13962449f, 0.0f, 0.0f, 0.069755554f, 0.99756414f }, /* 28 */
{ -14373.079f, 524.4762f, 26.045519f, 4.66003f, 0.0f, 0.0f, -0.7253742f, 0.68835473f }, /* 29 */
{ -14373.886f, 491.5064f, 47.466377f, 3.47321f, 0.0f, 0.0f, -0.9862852f, 0.1650499f }, /* 30 */
{ -14372.838f, 508.7278f, 34.971527f, 2.5481794f, 0.0f, 0.0f, 0.95630455f, 0.29237235f }, /* 31 */
{ -14362.134f, 526.2929f, 24.909328f, 0.13962449f, 0.0f, 0.0f, 0.069755554f, 0.99756414f }, /* 32 */
{ -14401.415f, 506.0231f, 33.67751f, 4.729844f, 0.0f, 0.0f, -0.70090866f, 0.71325105f }, /* 33 */
{ -14349.437f, 528.6766f, 28.356276f, 6.073746f, 0.0f, 0.0f, -0.10452843f, 0.9945219f }, /* 34 */
{ -14351.302f, 489.6769f, 37.13969f, 4.66003f, 0.0f, 0.0f, -0.7253742f, 0.68835473f }, /* 35 */
{ -14382.14f, 470.336f, 30.188276f, 3.0543265f, 0.0f, 0.0f, 0.99904823f, 0.04361926f }, /* 36 */
{ -14392.547f, 503.00327f, 28.878883f, 4.66003f, 0.0f, 0.0f, -0.7253742f, 0.68835473f }, /* 37 */
{ -14377.155f, 486.9521f, 42.376797f, 5.550147f, 0.0f, 0.0f, -0.35836792f, 0.93358046f }, /* 38 */
{ -14358.694f, 516.5423f, 35.368343f, 2.1118479f, 0.0f, 0.0f, 0.8703556f, 0.4924237f }, /* 39 */
};
// VerifiedBuild 50250 - Midsummer Fireworks Spectacular event
FireworkShowScheduleEntry const fireworkShowScheduleBootyBay[] =
{
{ 0, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 0 },
{ 0, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 1 },
{ 3373, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 2 },
{ 3373, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 3 },
{ 4811, GO_FIREWORK_SHOW_TYPE_2_BLUE, 4 },
{ 4811, GO_FIREWORK_SHOW_TYPE_1_RED, 5 },
{ 6671, GO_FIREWORK_SHOW_TYPE_1_BLUE, 6 },
{ 8088, GO_FIREWORK_SHOW_TYPE_2_GREEN, 7 },
{ 8088, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 8 },
{ 9699, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 9 },
{ 12937, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 10 },
{ 12937, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 11 },
{ 18189, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 12 },
{ 19399, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 13 },
{ 19399, GO_FIREWORK_SHOW_TYPE_1_GREEN, 0 },
{ 19399, GO_FIREWORK_SHOW_TYPE_2_RED, 14 },
{ 19399, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 15 },
{ 22854, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 1 },
{ 22854, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 16 },
{ 23814, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 8 },
{ 24400, GO_FIREWORK_SHOW_TYPE_2_RED, 5 },
{ 30902, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 17 },
{ 35539, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 18 },
{ 36779, GO_FIREWORK_SHOW_TYPE_1_BLUE, 4 },
{ 36779, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 19 },
{ 39170, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 16 },
{ 43244, GO_FIREWORK_SHOW_TYPE_1_WHITE, 13 },
{ 43244, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 20 },
{ 44869, GO_FIREWORK_SHOW_TYPE_1_GREEN, 0 },
{ 44869, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 6 },
{ 48378, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 14 },
{ 54582, GO_FIREWORK_SHOW_TYPE_2_BLUE, 7 },
{ 54582, GO_FIREWORK_SHOW_TYPE_2_WHITE, 10 },
{ 56200, GO_FIREWORK_SHOW_TYPE_1_WHITE, 21 },
{ 56200, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 1 },
{ 57792, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 9 },
{ 59558, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 59558, GO_FIREWORK_SHOW_TYPE_2_BLUE, 12 },
{ 62634, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 64599, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 14 },
{ 72352, GO_FIREWORK_SHOW_TYPE_2_GREEN, 0 },
{ 75554, GO_FIREWORK_SHOW_TYPE_2_WHITE, 2 },
{ 77215, GO_FIREWORK_SHOW_TYPE_1_RED, 14 },
{ 77544, GO_FIREWORK_SHOW_TYPE_2_RED, 22 },
{ 79500, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 80599, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 1 },
{ 82023, GO_FIREWORK_SHOW_TYPE_1_GREEN, 7 },
{ 84074, GO_FIREWORK_SHOW_TYPE_1_GREEN, 4 },
{ 84074, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 8 },
{ 84074, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 10 },
{ 88626, GO_FIREWORK_SHOW_TYPE_1_GREEN, 15 },
{ 88626, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 17 },
{ 88986, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 13 },
{ 90134, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 9 },
{ 91901, GO_FIREWORK_SHOW_TYPE_1_WHITE, 20 },
{ 93406, GO_FIREWORK_SHOW_TYPE_1_RED, 23 },
{ 93406, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 12 },
{ 98400, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 2 },
{ 103301, GO_FIREWORK_SHOW_TYPE_1_RED, 22 },
{ 103301, GO_FIREWORK_SHOW_TYPE_1_GREEN, 4 },
{ 104878, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 21 },
{ 104878, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 5 },
{ 106741, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 20 },
{ 107980, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 109583, GO_FIREWORK_SHOW_TYPE_2_RED, 23 },
{ 112931, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 13 },
{ 114485, GO_FIREWORK_SHOW_TYPE_2_GREEN, 7 },
{ 114485, GO_FIREWORK_SHOW_TYPE_2_WHITE, 17 },
{ 114485, GO_FIREWORK_SHOW_TYPE_2_WHITE, 10 },
{ 119512, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 0 },
{ 119512, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 22 },
{ 120078, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 3 },
{ 122918, GO_FIREWORK_SHOW_TYPE_2_RED, 5 },
{ 124409, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 1 },
{ 124796, GO_FIREWORK_SHOW_TYPE_1_WHITE, 2 },
{ 126246, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 13 },
{ 127461, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 8 },
{ 127461, GO_FIREWORK_SHOW_TYPE_1_GREEN, 4 },
{ 133204, GO_FIREWORK_SHOW_TYPE_1_RED, 14 },
{ 133790, GO_FIREWORK_SHOW_TYPE_2_GREEN, 6 },
{ 134298, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 16 },
{ 137335, GO_FIREWORK_SHOW_TYPE_1_BLUE, 15 },
{ 137481, GO_FIREWORK_SHOW_TYPE_1_RED, 23 },
{ 140362, GO_FIREWORK_SHOW_TYPE_2_BLUE, 19 },
{ 142113, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 12 },
{ 142355, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 22 },
{ 144060, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 144060, GO_FIREWORK_SHOW_TYPE_1_WHITE, 2 },
{ 145573, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 9 },
{ 145573, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 0 },
{ 147185, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 3 },
{ 148806, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 17 },
{ 150390, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 151991, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 21 },
{ 155240, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 1 },
{ 156857, GO_FIREWORK_SHOW_TYPE_2_GREEN, 15 },
{ 158563, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 16 },
{ 161477, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 0 },
{ 161841, GO_FIREWORK_SHOW_TYPE_2_BLUE, 8 },
{ 163297, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 14 },
{ 163297, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 9 },
{ 163618, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 13 },
{ 164965, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 166948, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 18 },
{ 170039, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 2 },
{ 171084, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 6 },
{ 171577, GO_FIREWORK_SHOW_TYPE_2_RED, 22 },
{ 171577, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 20 },
{ 174281, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 23 },
{ 174683, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 3 },
{ 177931, GO_FIREWORK_SHOW_TYPE_1_BLUE, 12 },
{ 178063, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 1 },
{ 178063, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 21 },
{ 178063, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 16 },
{ 181375, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 181375, GO_FIREWORK_SHOW_TYPE_2_BLUE, 8 },
{ 183163, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 10 },
{ 184183, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 20 },
{ 184183, GO_FIREWORK_SHOW_TYPE_2_BLUE, 7 },
{ 185594, GO_FIREWORK_SHOW_TYPE_1_BLUE, 4 },
{ 191057, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 14 },
{ 192283, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 13 },
{ 195742, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 17 },
{ 197319, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 197319, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 0 },
{ 198932, GO_FIREWORK_SHOW_TYPE_2_GREEN, 19 },
{ 200843, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 18 },
{ 202366, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 3 },
{ 203966, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 21 },
{ 203966, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 22 },
{ 205480, GO_FIREWORK_SHOW_TYPE_1_WHITE, 20 },
{ 205480, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 8 },
{ 210262, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 10 },
{ 213488, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 3 },
{ 213488, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 11 },
{ 216732, GO_FIREWORK_SHOW_TYPE_2_GREEN, 7 },
{ 218348, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 1 },
{ 218348, GO_FIREWORK_SHOW_TYPE_2_RED, 23 },
{ 218348, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 8 },
{ 219949, GO_FIREWORK_SHOW_TYPE_2_RED, 18 },
{ 221574, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 19 },
{ 224412, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 0 },
{ 224806, GO_FIREWORK_SHOW_TYPE_2_GREEN, 15 },
{ 224806, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 5 },
{ 224806, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 4 },
{ 224806, GO_FIREWORK_SHOW_TYPE_1_WHITE, 16 },
{ 227653, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 6 },
{ 228197, GO_FIREWORK_SHOW_TYPE_1_WHITE, 2 },
{ 231054, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 1 },
{ 231054, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 12 },
{ 236554, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 21 },
{ 238978, GO_FIREWORK_SHOW_TYPE_2_WHITE, 10 },
{ 240997, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 17 },
{ 240997, GO_FIREWORK_SHOW_TYPE_2_RED, 22 },
{ 241228, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 16 },
{ 242637, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 23 },
{ 243860, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 4 },
{ 243860, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 14 },
{ 243860, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 7 },
{ 245491, GO_FIREWORK_SHOW_TYPE_2_GREEN, 15 },
{ 248733, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 3 },
{ 249123, GO_FIREWORK_SHOW_TYPE_1_BLUE, 19 },
{ 249123, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 18 },
{ 252159, GO_FIREWORK_SHOW_TYPE_1_WHITE, 2 },
{ 252159, GO_FIREWORK_SHOW_TYPE_2_BLUE, 0 },
{ 258449, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 20 },
{ 261694, GO_FIREWORK_SHOW_TYPE_1_GREEN, 12 },
{ 264945, GO_FIREWORK_SHOW_TYPE_1_BLUE, 6 },
{ 266555, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 9 },
{ 268343, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 11 },
{ 271638, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 14 },
{ 271638, GO_FIREWORK_SHOW_TYPE_1_BLUE, 15 },
{ 276618, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 1 },
{ 276618, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 13 },
{ 277914, GO_FIREWORK_SHOW_TYPE_2_GREEN, 4 },
{ 281152, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 284622, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 6 },
{ 286427, GO_FIREWORK_SHOW_TYPE_2_WHITE, 16 },
{ 286427, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 12 },
{ 286427, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 21 },
{ 287804, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 2 },
{ 289649, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 10 },
{ 292520, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 19 },
{ 292520, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 17 },
{ 292520, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 22 },
{ 294260, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 13 },
{ 297365, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 15 },
{ 298961, GO_FIREWORK_SHOW_TYPE_1_GREEN, 0 },
{ 300613, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 4 },
{ 300613, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 11 },
{ 302640, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 9 },
{ 307076, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 6 },
{ 307076, GO_FIREWORK_SHOW_TYPE_1_GREEN, 19 },
{ 308699, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 20 },
{ 310329, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 5 },
{ 312068, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 18 },
{ 318539, GO_FIREWORK_SHOW_TYPE_2_RED, 23 },
{ 321664, GO_FIREWORK_SHOW_TYPE_2_BLUE, 8 },
{ 323439, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 3 },
{ 323439, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 0 },
{ 324888, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 6 },
{ 324888, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 7 },
{ 326864, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 11 },
{ 326864, GO_FIREWORK_SHOW_TYPE_2_WHITE, 21 },
{ 326864, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 2 },
{ 328133, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 1 },
{ 330143, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 16 },
{ 330143, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 10 },
{ 330143, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 13 },
{ 333012, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 12 },
{ 338445, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 21 },
{ 339491, GO_FIREWORK_SHOW_TYPE_2_BLUE, 15 },
{ 339491, GO_FIREWORK_SHOW_TYPE_2_RED, 22 },
{ 343023, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 14 },
{ 343023, GO_FIREWORK_SHOW_TYPE_2_WHITE, 20 },
{ 344952, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 8 },
{ 346258, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 4 },
{ 346379, GO_FIREWORK_SHOW_TYPE_2_BLUE, 19 },
{ 348137, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 17 },
{ 349225, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 6 },
{ 349225, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 18 },
{ 352459, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 13 },
{ 354263, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 5 },
{ 357492, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 9 },
{ 357706, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 16 },
{ 364145, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 11 },
{ 364246, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 10 },
{ 365398, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 3 },
{ 368650, GO_FIREWORK_SHOW_TYPE_1_WHITE, 2 },
{ 368650, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 20 },
{ 368650, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 22 },
{ 370406, GO_FIREWORK_SHOW_TYPE_1_RED, 18 },
{ 375230, GO_FIREWORK_SHOW_TYPE_2_GREEN, 19 },
{ 378329, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 7 },
{ 378728, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 21 },
{ 379950, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 382105, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 14 },
{ 383602, GO_FIREWORK_SHOW_TYPE_1_GREEN, 12 },
{ 384820, GO_FIREWORK_SHOW_TYPE_1_RED, 23 },
{ 386448, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 9 },
{ 388461, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 13 },
{ 390083, GO_FIREWORK_SHOW_TYPE_2_WHITE, 10 },
{ 393115, GO_FIREWORK_SHOW_TYPE_1_GREEN, 8 },
{ 393324, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 6 },
{ 393324, GO_FIREWORK_SHOW_TYPE_1_RED, 22 },
{ 395247, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 17 },
{ 399395, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 0 },
{ 400128, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 11 },
{ 400128, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 19 },
{ 401420, GO_FIREWORK_SHOW_TYPE_1_RED, 23 },
{ 401420, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 3 },
{ 404247, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 14 },
{ 406280, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 7 },
{ 406392, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 20 },
{ 412613, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 17 },
{ 419353, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 23 },
{ 422060, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 15 },
{ 422454, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 11 },
{ 423676, GO_FIREWORK_SHOW_TYPE_2_RED, 22 },
{ 423676, GO_FIREWORK_SHOW_TYPE_1_WHITE, 13 },
{ 424078, GO_FIREWORK_SHOW_TYPE_2_BLUE, 7 },
{ 425639, GO_FIREWORK_SHOW_TYPE_1_WHITE, 10 },
{ 427333, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 16 },
{ 428551, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 1 },
{ 429072, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 14 },
{ 430986, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 19 },
{ 432415, GO_FIREWORK_SHOW_TYPE_2_WHITE, 2 },
{ 435133, GO_FIREWORK_SHOW_TYPE_2_BLUE, 6 },
{ 435645, GO_FIREWORK_SHOW_TYPE_1_BLUE, 8 },
{ 436759, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 12 },
{ 445135, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 17 },
{ 446474, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 1 },
{ 447149, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 23 },
{ 448353, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 11 },
{ 448353, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 20 },
{ 449568, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 18 },
{ 449568, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 9 },
{ 456048, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 15 },
{ 456048, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 4 },
{ 457673, GO_FIREWORK_SHOW_TYPE_1_RED, 14 },
{ 458075, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 7 },
{ 467378, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 22 },
{ 469319, GO_FIREWORK_SHOW_TYPE_1_WHITE, 21 },
{ 470607, GO_FIREWORK_SHOW_TYPE_2_GREEN, 4 },
{ 472631, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 19 },
{ 472631, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 16 },
{ 474380, GO_FIREWORK_SHOW_TYPE_1_WHITE, 2 },
{ 475596, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 18 },
{ 476046, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 1 },
{ 480526, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 15 },
{ 480909, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 11 },
{ 483964, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 17 },
{ 485533, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 13 },
{ 488416, GO_FIREWORK_SHOW_TYPE_1_GREEN, 8 },
{ 488830, GO_FIREWORK_SHOW_TYPE_2_WHITE, 2 },
{ 490197, GO_FIREWORK_SHOW_TYPE_2_GREEN, 12 },
{ 493271, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 5 },
{ 495286, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 21 },
{ 496508, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 18 },
{ 498389, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 0 },
{ 500136, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 7 },
{ 504546, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 1 },
{ 506489, GO_FIREWORK_SHOW_TYPE_1_RED, 22 },
{ 507870, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 20 },
{ 508280, GO_FIREWORK_SHOW_TYPE_2_WHITE, 10 },
{ 509626, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 4 },
{ 513073, GO_FIREWORK_SHOW_TYPE_2_WHITE_BIG, 16 },
{ 519506, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 5 },
{ 519607, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 19 },
{ 520816, GO_FIREWORK_SHOW_TYPE_2_BLUE, 6 },
{ 522444, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 23 },
{ 524056, GO_FIREWORK_SHOW_TYPE_2_BLUE, 7 },
{ 524457, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 3 },
{ 526082, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 10 },
{ 531320, GO_FIREWORK_SHOW_TYPE_2_GREEN, 15 },
{ 532256, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 0 },
{ 532548, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 2 },
{ 534172, GO_FIREWORK_SHOW_TYPE_2_BLUE, 8 },
{ 534172, GO_FIREWORK_SHOW_TYPE_1_WHITE, 13 },
{ 535387, GO_FIREWORK_SHOW_TYPE_1_RED, 22 },
{ 535789, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 4 },
{ 538623, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 21 },
{ 539026, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 1 },
{ 540639, GO_FIREWORK_SHOW_TYPE_2_RED, 23 },
{ 545637, GO_FIREWORK_SHOW_TYPE_2_WHITE, 17 },
{ 545637, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 13 },
{ 546711, GO_FIREWORK_SHOW_TYPE_2_BLUE, 0 },
{ 554835, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 18 },
{ 556447, GO_FIREWORK_SHOW_TYPE_2_GREEN, 12 },
{ 556986, GO_FIREWORK_SHOW_TYPE_1_BLUE, 19 },
{ 559700, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 2 },
{ 559700, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 9 },
{ 559700, GO_FIREWORK_SHOW_TYPE_2_GREEN, 4 },
{ 561718, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 561718, GO_FIREWORK_SHOW_TYPE_2_RED, 1 },
{ 562914, GO_FIREWORK_SHOW_TYPE_1_BLUE, 7 },
{ 563325, GO_FIREWORK_SHOW_TYPE_1_WHITE, 20 },
{ 566572, GO_FIREWORK_SHOW_TYPE_1_WHITE, 13 },
{ 568021, GO_FIREWORK_SHOW_TYPE_1_RED, 5 },
{ 568021, GO_FIREWORK_SHOW_TYPE_1_BLUE, 19 },
{ 568365, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 14 },
{ 570142, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 6 },
{ 571271, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 17 },
{ 573051, GO_FIREWORK_SHOW_TYPE_2_BLUE, 12 },
{ 574935, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 16 },
{ 576217, GO_FIREWORK_SHOW_TYPE_2_WHITE, 10 },
{ 576217, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 3 },
{ 580884, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 22 },
{ 585601, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 21 },
{ 588953, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 13 },
{ 590871, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 14 },
{ 592329, GO_FIREWORK_SHOW_TYPE_2_BLUE, 7 },
{ 592329, GO_FIREWORK_SHOW_TYPE_2_WHITE, 2 },
{ 595337, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 5 },
{ 595842, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 8 },
{ 597351, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 10 },
{ 600721, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 16 },
{ 602198, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 1 },
{ 602198, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 22 },
{ 602198, GO_FIREWORK_SHOW_TYPE_2_WHITE, 17 },
{ 603681, GO_FIREWORK_SHOW_TYPE_1_RED, 9 },
{ 604103, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 15 },
{ 607059, GO_FIREWORK_SHOW_TYPE_2_BLUE, 4 },
{ 608678, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 11 },
{ 613545, GO_FIREWORK_SHOW_TYPE_2_WHITE, 20 },
{ 613545, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 19 },
{ 615572, GO_FIREWORK_SHOW_TYPE_2_WHITE, 13 },
{ 616784, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 5 },
{ 616784, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 18 },
{ 618808, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 22 },
{ 620021, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 17 },
{ 625058, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 3 },
{ 626785, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 4 },
{ 626785, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 1 },
{ 626785, GO_FIREWORK_SHOW_TYPE_2_BLUE, 6 },
{ 627731, GO_FIREWORK_SHOW_TYPE_2_BLUE, 12 },
{ 629949, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 21 },
{ 630970, GO_FIREWORK_SHOW_TYPE_1_RED, 9 },
{ 631607, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 15 },
{ 632741, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 8 },
{ 634464, GO_FIREWORK_SHOW_TYPE_2_BLUE, 19 },
{ 634605, GO_FIREWORK_SHOW_TYPE_1_WHITE, 20 },
{ 636559, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 2 },
{ 636559, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 13 },
{ 639045, GO_FIREWORK_SHOW_TYPE_1_BLUE, 0 },
{ 639437, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 10 },
{ 641461, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 23 },
{ 642671, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 17 },
{ 645920, GO_FIREWORK_SHOW_TYPE_1_BLUE, 7 },
{ 645920, GO_FIREWORK_SHOW_TYPE_1_RED, 22 },
{ 648856, GO_FIREWORK_SHOW_TYPE_2_GREEN, 6 },
{ 649157, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 3 },
{ 652004, GO_FIREWORK_SHOW_TYPE_1_BLUE, 15 },
{ 652405, GO_FIREWORK_SHOW_TYPE_2_WHITE, 16 },
{ 652405, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 20 },
{ 655372, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 0 },
{ 660268, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 11 },
{ 661838, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 12 },
{ 663825, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 23 },
{ 666714, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 2 },
{ 666714, GO_FIREWORK_SHOW_TYPE_2_BLUE, 7 },
{ 667363, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 3 },
{ 667363, GO_FIREWORK_SHOW_TYPE_1_YELLOW_BIG, 21 },
{ 668168, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 14 },
{ 668168, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 5 },
{ 674629, GO_FIREWORK_SHOW_TYPE_1_WHITE, 24 },
{ 676245, GO_FIREWORK_SHOW_TYPE_2_RED, 22 },
{ 676245, GO_FIREWORK_SHOW_TYPE_1_RED, 1 },
{ 677053, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 25 },
{ 677053, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 26 },
{ 677053, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 27 },
{ 677053, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 28 },
{ 677053, GO_FIREWORK_SHOW_TYPE_2_YELLOW_BIG, 16 },
{ 677053, GO_FIREWORK_SHOW_TYPE_1_GREEN_BIG, 7 },
{ 677053, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 2 },
{ 677053, GO_FIREWORK_SHOW_TYPE_1_WHITE_BIG, 29 },
{ 677053, GO_FIREWORK_SHOW_TYPE_1_GREEN, 12 },
{ 677053, GO_FIREWORK_SHOW_TYPE_1_GREEN, 6 },
{ 677053, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 14 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_GREEN, 30 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 23 },
{ 678667, GO_FIREWORK_SHOW_TYPE_1_BLUE_BIG, 31 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_PURPLE, 32 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_GREEN_BIG, 15 },
{ 678667, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 11 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 5 },
{ 678667, GO_FIREWORK_SHOW_TYPE_1_PURPLE_BIG, 33 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_PURPLE_BIG, 34 },
{ 678667, GO_FIREWORK_SHOW_TYPE_1_BLUE, 35 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_RED, 36 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 19 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_RED, 37 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_BLUE_BIG, 38 },
{ 678667, GO_FIREWORK_SHOW_TYPE_1_GREEN, 4 },
{ 678667, GO_FIREWORK_SHOW_TYPE_2_RED_BIG, 18 },
{ 679422, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 3 },
{ 679422, GO_FIREWORK_SHOW_TYPE_2_WHITE, 39 },
{ 679422, GO_FIREWORK_SHOW_TYPE_1_YELLOW, 21 },
{ 679809, GO_FIREWORK_SHOW_TYPE_1_GREEN, 8 },
{ 679809, GO_FIREWORK_SHOW_TYPE_2_WHITE, 20 },
{ 681100, GO_FIREWORK_SHOW_TYPE_2_YELLOW, 17 },
{ 681100, GO_FIREWORK_SHOW_TYPE_2_BLUE, 0 },
{ 682717, GO_FIREWORK_SHOW_TYPE_1_WHITE, 13 },
{ 686258, GO_FIREWORK_SHOW_TYPE_1_WHITE, 10 },
{ 690976, GO_FIREWORK_SHOW_TYPE_1_RED_BIG, 9 },
};
FireworkShow const fireworkShowBootyBay =
{
.schedule =
{
.entries = fireworkShowScheduleBootyBay,
.size = sizeof(fireworkShowScheduleBootyBay) / sizeof(fireworkShowScheduleBootyBay[0])
},
.spawns =
{
.entries = FireworkShowGameobjectBootyBay,
.size = sizeof(FireworkShowGameobjectBootyBay) / sizeof(FireworkShowGameobjectBootyBay[0])
},
.revelerId =
{
NPC_BOOTY_BAY_REVELER,
0
}
};
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -17,6 +17,8 @@
#include "CreatureScript.h" #include "CreatureScript.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "hyjal.h" #include "hyjal.h"
enum Spells enum Spells
@@ -58,18 +60,18 @@ public:
scheduler.Schedule(20s, 28s, [this](TaskContext context) scheduler.Schedule(20s, 28s, [this](TaskContext context)
{ {
if (DoCastRandomTarget(SPELL_CARRION_SWARM, 0, 60.f)) if (DoCastRandomTarget(SPELL_CARRION_SWARM, 0, 60.f) == SPELL_CAST_OK)
Talk(SAY_SWARM); Talk(SAY_SWARM);
context.Repeat(10s, 15s); context.Repeat(10s, 15s);
}).Schedule(25s, 32s, [this](TaskContext context) }).Schedule(25s, 32s, [this](TaskContext context)
{ {
if (DoCastRandomTarget(SPELL_SLEEP)) if (DoCastRandomTarget(SPELL_SLEEP) == SPELL_CAST_OK)
Talk(SAY_SLEEP); Talk(SAY_SLEEP);
context.Repeat(35s, 48s); context.Repeat(35s, 48s);
}).Schedule(30s, 48s, [this](TaskContext context) }).Schedule(30s, 48s, [this](TaskContext context)
{ {
if (DoCastRandomTarget(SPELL_INFERNO)) if (DoCastRandomTarget(SPELL_INFERNO) == SPELL_CAST_OK)
Talk(SAY_INFERNO); Talk(SAY_INFERNO);
context.Repeat(50s, 55s); context.Repeat(50s, 55s);
@@ -138,7 +140,24 @@ private:
}; };
class spell_anetheron_sleep : public SpellScript
{
PrepareSpellScript(spell_anetheron_sleep);
void FilterTargets(std::list<WorldObject*>& targets)
{
if (!targets.empty())
Acore::Containers::RandomResize(targets, 3);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anetheron_sleep::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
void AddSC_boss_anetheron() void AddSC_boss_anetheron()
{ {
RegisterHyjalAI(boss_anetheron); RegisterHyjalAI(boss_anetheron);
RegisterSpellScript(spell_anetheron_sleep);
} }
@@ -144,79 +144,10 @@ struct npc_ancient_wisp : public ScriptedAI
return; return;
} }
private: private:
InstanceScript* _instance; InstanceScript* _instance;
}; };
//TODO: move to db?
struct npc_doomfire : public ScriptedAI
{
npc_doomfire(Creature* creature) : ScriptedAI(creature), _summons(me) { }
void Reset() override
{
_summons.DespawnAll();
}
void MoveInLineOfSight(Unit* /*who*/) override { }
void JustEngagedWith(Unit* /*who*/) override { }
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
damage = 0;
}
void JustSummoned(Creature* summoned) override
{
_summons.Summon(summoned);
if (summoned->GetEntry() == CREATURE_DOOMFIRE_SPIRIT)
{
me->GetMotionMaster()->MoveFollow(summoned, 0.0f, 0.0f);
}
}
private:
SummonList _summons;
};
struct npc_doomfire_targetting : public ScriptedAI
{
npc_doomfire_targetting(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
_chaseTarget = nullptr;
ScheduleTimedEvent(5s, [&]
{
if (_chaseTarget)
{
me->GetMotionMaster()->MoveFollow(_chaseTarget, 0.0f, 0.0f);
}
else
{
Position randomPosition = me->GetRandomNearPosition(40.0f);
me->GetMotionMaster()->MovePoint(0, randomPosition);
}
}, 5s);
}
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer())
{
_chaseTarget = who;
}
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
damage = 0;
}
private:
Unit* _chaseTarget;
};
struct boss_archimonde : public BossAI struct boss_archimonde : public BossAI
{ {
boss_archimonde(Creature* creature) : BossAI(creature, DATA_ARCHIMONDE) boss_archimonde(Creature* creature) : BossAI(creature, DATA_ARCHIMONDE)
@@ -256,6 +187,7 @@ struct boss_archimonde : public BossAI
} }
ScheduleHealthCheckEvent(10, [&]{ ScheduleHealthCheckEvent(10, [&]{
scheduler.CancelAll();
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
DoCastProtection(); DoCastProtection();
Talk(SAY_ENRAGE); Talk(SAY_ENRAGE);
@@ -326,11 +258,11 @@ struct boss_archimonde : public BossAI
ScheduleTimedEvent(25s, 35s, [&] ScheduleTimedEvent(25s, 35s, [&]
{ {
Talk(SAY_AIR_BURST); Talk(SAY_AIR_BURST);
DoCastRandomTarget(SPELL_AIR_BURST); DoCastRandomTarget(SPELL_AIR_BURST, 0, 0.0f, true, false, false);
}, 25s, 40s); }, 25s, 40s);
ScheduleTimedEvent(25s, 35s, [&] ScheduleTimedEvent(25s, 35s, [&]
{ {
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, false))
{ {
DoCastDoomFire(target); DoCastDoomFire(target);
} }
@@ -441,18 +373,22 @@ struct boss_archimonde : public BossAI
{ {
summoned->AI()->AttackStart(me); summoned->AI()->AttackStart(me);
} }
else if (summoned->GetEntry() == CREATURE_DOOMFIRE)
{
summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN);
summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, 0, 0, me->GetGUID());
}
else if (summoned->GetEntry() == CREATURE_DOOMFIRE_SPIRIT)
{
Position randomPosition = summoned->GetRandomNearPosition(40.0f);
summoned->GetMotionMaster()->MovePoint(0, randomPosition);
}
else else
{ {
summoned->SetFaction(me->GetFaction()); //remove? summoned->SetFaction(me->GetFaction()); //remove?
summoned->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); summoned->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
summoned->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); summoned->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
} }
if (summoned->GetEntry() == CREATURE_DOOMFIRE)
{
summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN);
summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, 0, 0, me->GetGUID());
}
} }
void DoCastDoomFire(Unit* target) void DoCastDoomFire(Unit* target)
@@ -461,12 +397,16 @@ struct boss_archimonde : public BossAI
Talk(SAY_DOOMFIRE); Talk(SAY_DOOMFIRE);
Position spiritPosition = { target->GetPositionX() + DOOMFIRE_OFFSET, target->GetPositionY() + DOOMFIRE_OFFSET, target->GetPositionZ(), 0.0f }; Position spiritPosition = { target->GetPositionX() + DOOMFIRE_OFFSET, target->GetPositionY() + DOOMFIRE_OFFSET, target->GetPositionZ(), 0.0f };
Position doomfirePosition = { target->GetPositionX() - DOOMFIRE_OFFSET, target->GetPositionY() - DOOMFIRE_OFFSET, target->GetPositionZ(), 0.0f }; Position doomfirePosition = { target->GetPositionX() - DOOMFIRE_OFFSET, target->GetPositionY() - DOOMFIRE_OFFSET, target->GetPositionZ(), 0.0f };
if (Unit* doomfireSpirit = me->SummonCreature(CREATURE_DOOMFIRE_SPIRIT, spiritPosition, TEMPSUMMON_TIMED_DESPAWN, 27000)) if (Creature* doomfireSpirit = me->SummonCreature(CREATURE_DOOMFIRE_SPIRIT, spiritPosition, TEMPSUMMON_TIMED_DESPAWN, 27000))
{ {
if (Unit* doomfire = me->SummonCreature(CREATURE_DOOMFIRE, doomfirePosition, TEMPSUMMON_TIMED_DESPAWN, 27000)) if (Creature* doomfire = me->SummonCreature(CREATURE_DOOMFIRE, doomfirePosition, TEMPSUMMON_TIMED_DESPAWN, 27000))
{ {
doomfireSpirit->SetVisible(false); doomfireSpirit->SetVisible(false);
doomfire->SetVisible(false); doomfire->SetVisible(false);
doomfireSpirit->SetWalk(false);
doomfireSpirit->SetReactState(REACT_PASSIVE);
doomfire->SetReactState(REACT_PASSIVE);
doomfire->GetMotionMaster()->MoveFollow(doomfireSpirit, 0.0f, 0.0f);
} }
} }
} }
@@ -567,8 +507,6 @@ void AddSC_boss_archimonde()
RegisterSpellScript(spell_hand_of_death); RegisterSpellScript(spell_hand_of_death);
RegisterSpellScript(spell_finger_of_death); RegisterSpellScript(spell_finger_of_death);
RegisterHyjalAI(boss_archimonde); RegisterHyjalAI(boss_archimonde);
RegisterHyjalAI(npc_doomfire);
RegisterHyjalAI(npc_doomfire_targetting);
RegisterHyjalAI(npc_ancient_wisp); RegisterHyjalAI(npc_ancient_wisp);
} }
@@ -48,14 +48,19 @@ struct boss_kazrogal : public BossAI
public: public:
boss_kazrogal(Creature* creature) : BossAI(creature, DATA_KAZROGAL) boss_kazrogal(Creature* creature) : BossAI(creature, DATA_KAZROGAL)
{ {
_recentlySpoken = false;
_markCounter = 0;
scheduler.SetValidator([this] scheduler.SetValidator([this]
{ {
return !me->HasUnitState(UNIT_STATE_CASTING); return !me->HasUnitState(UNIT_STATE_CASTING);
}); });
} }
void Reset() override
{
_recentlySpoken = false;
_markCounter = 0;
BossAI::Reset();
}
void JustEngagedWith(Unit * who) override void JustEngagedWith(Unit * who) override
{ {
BossAI::JustEngagedWith(who); BossAI::JustEngagedWith(who);
@@ -96,8 +96,6 @@ public:
void Initialize() override void Initialize() override
{ {
SetHeaders(DataHeader);
_bossWave = 0; _bossWave = 0;
_retreat = 0; _retreat = 0;
trash = 0; trash = 0;
@@ -16,11 +16,19 @@
*/ */
#include "boss_four_horsemen.h" #include "boss_four_horsemen.h"
#include "CreatureScript.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "naxxramas.h"
using namespace FourHorsemen;
void AddSC_boss_four_horsemen() void AddSC_boss_four_horsemen()
{ {
new boss_four_horsemen(); new boss_four_horsemen();
new spell_four_horsemen_mark(); new spell_four_horsemen_mark();
RegisterSpellScript(spell_four_horsemen_consumption);
} }
@@ -17,13 +17,19 @@
#include "boss_maexxna.h" #include "boss_maexxna.h"
#include "CreatureScript.h" #include "CreatureScript.h"
#include "Player.h"
#include "PassiveAI.h" #include "PassiveAI.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "naxxramas.h" #include "naxxramas.h"
using namespace Maexxna;
void AddSC_boss_maexxna() void AddSC_boss_maexxna()
{ {
new boss_maexxna(); new boss_maexxna();
new boss_maexxna_webwrap(); new boss_maexxna_webwrap();
RegisterSpellScript(spell_web_wrap_damage);
} }
@@ -1196,7 +1196,12 @@ public:
{ {
if (InstanceScript *instance = player->GetInstanceScript()) if (InstanceScript *instance = player->GetInstanceScript())
{ {
if (instance->CheckRequiredBosses(BOSS_SAPPHIRON)) bool AreAllWingsCleared = instance->GetBossState(BOSS_MAEXXNA) == DONE
&& (instance->GetBossState(BOSS_LOATHEB) == DONE)
&& (instance->GetBossState(BOSS_THADDIUS) == DONE)
&& (instance->GetBossState(BOSS_HORSEMAN) == DONE);
if (AreAllWingsCleared)
{ {
player->TeleportTo(533, sapphironEntryTP.m_positionX, sapphironEntryTP.m_positionY, sapphironEntryTP.m_positionZ, sapphironEntryTP.m_orientation); player->TeleportTo(533, sapphironEntryTP.m_positionX, sapphironEntryTP.m_positionY, sapphironEntryTP.m_positionZ, sapphironEntryTP.m_orientation);
return true; return true;
@@ -46,7 +46,6 @@ enum Spells
SPELL_COSMIC_SMASH_VISUAL_STATE = 62300, SPELL_COSMIC_SMASH_VISUAL_STATE = 62300,
SPELL_SELF_STUN = 65256, SPELL_SELF_STUN = 65256,
SPELL_KILL_CREDIT = 65184, SPELL_KILL_CREDIT = 65184,
SPELL_TELEPORT = 62940,
SPELL_DUAL_WIELD = 42459, SPELL_DUAL_WIELD = 42459,
// Algalon Stalker // Algalon Stalker
@@ -347,7 +347,6 @@ public:
uint32 chestId = RAID_MODE(GO_FREYA_CHEST, GO_FREYA_CHEST_HERO); uint32 chestId = RAID_MODE(GO_FREYA_CHEST, GO_FREYA_CHEST_HERO);
chestId -= 2 * _elderCount; // offset chestId -= 2 * _elderCount; // offset
me->DespawnOrUnsummon(5000);
if (GameObject* go = me->SummonGameObject(chestId, 2345.61f, -71.20f, 425.104f, 3.0f, 0, 0, 0, 0, 0)) if (GameObject* go = me->SummonGameObject(chestId, 2345.61f, -71.20f, 425.104f, 3.0f, 0, 0, 0, 0, 0))
{ {
go->ReplaceAllGameObjectFlags((GameObjectFlags)0); go->ReplaceAllGameObjectFlags((GameObjectFlags)0);
@@ -360,10 +359,24 @@ public:
me->CastSpell(me, 65074, true); // credit me->CastSpell(me, 65074, true); // credit
m_pInstance->SetData(TYPE_FREYA, DONE); m_pInstance->SetData(TYPE_FREYA, DONE);
} }
scheduler.Schedule(14s, [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_TELEPORT);
});
} }
} }
} }
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
m_pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
}
}
void JustSummoned(Creature* cr) override void JustSummoned(Creature* cr) override
{ {
if (cr->GetEntry() == NPC_FREYA_UNSTABLE_SUN_BEAM) if (cr->GetEntry() == NPC_FREYA_UNSTABLE_SUN_BEAM)
@@ -547,6 +560,7 @@ public:
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
scheduler.Update(diff);
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
@@ -346,6 +346,7 @@ public:
{ {
pInstance->SetData(TYPE_HODIR, DONE); pInstance->SetData(TYPE_HODIR, DONE);
me->CastSpell(me, 64899, true); // credit me->CastSpell(me, 64899, true); // credit
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
} }
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
@@ -355,7 +356,6 @@ public:
me->CombatStop(); me->CombatStop();
me->InterruptNonMeleeSpells(true); me->InterruptNonMeleeSpells(true);
me->RemoveAllAuras(); me->RemoveAllAuras();
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
events.Reset(); events.Reset();
summons.DespawnAll(); summons.DespawnAll();
@@ -383,13 +383,17 @@ public:
} }
Talk(TEXT_DEATH); Talk(TEXT_DEATH);
me->DespawnOrUnsummon(10000); scheduler.Schedule(14s, [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_TELEPORT);
});
} }
} }
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
scheduler.Update(diff);
if (me->GetPositionY() <= ENTRANCE_DOOR.GetPositionY() || me->GetPositionY() >= EXIT_DOOR.GetPositionY()) if (me->GetPositionY() <= ENTRANCE_DOOR.GetPositionY() || me->GetPositionY() >= EXIT_DOOR.GetPositionY())
{ {
boss_hodirAI::EnterEvadeMode(); boss_hodirAI::EnterEvadeMode();
@@ -497,6 +501,15 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
}
}
Creature* GetHelper(uint8 index) Creature* GetHelper(uint8 index)
{ {
return Helpers[index] ? ObjectAccessor::GetCreature(*me, Helpers[index]) : nullptr; return Helpers[index] ? ObjectAccessor::GetCreature(*me, Helpers[index]) : nullptr;
@@ -237,7 +237,6 @@ public:
_looksAchievement = true; _looksAchievement = true;
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE);
me->DisableRotate(true); me->DisableRotate(true);
events.Reset(); events.Reset();
@@ -327,6 +326,8 @@ public:
arm->DespawnOrUnsummon(3000); // visual arm->DespawnOrUnsummon(3000); // visual
if (Creature* arm = ObjectAccessor::GetCreature(*me, _right)) if (Creature* arm = ObjectAccessor::GetCreature(*me, _right))
arm->DespawnOrUnsummon(3000); // visual arm->DespawnOrUnsummon(3000); // visual
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetDisableGravity(true);
} }
void KilledUnit(Unit*) override void KilledUnit(Unit*) override
@@ -802,12 +802,21 @@ public:
case EVENT_DISAPPEAR: case EVENT_DISAPPEAR:
if( pInstance ) if( pInstance )
pInstance->SetData(TYPE_MIMIRON, DONE); pInstance->SetData(TYPE_MIMIRON, DONE);
DoCastSelf(SPELL_TELEPORT);
summons.DespawnAll(); summons.DespawnAll();
me->DespawnOrUnsummon();
break; break;
} }
} }
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
}
}
void MoveInLineOfSight(Unit* /*mover*/) override {} void MoveInLineOfSight(Unit* /*mover*/) override {}
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
@@ -197,6 +197,7 @@ enum ThorimEvents
EVENT_THORIM_OUTRO1 = 13, EVENT_THORIM_OUTRO1 = 13,
EVENT_THORIM_OUTRO2 = 14, EVENT_THORIM_OUTRO2 = 14,
EVENT_THORIM_OUTRO3 = 15, EVENT_THORIM_OUTRO3 = 15,
EVENT_THORIM_OUTRO4 = 16,
EVENT_DR_ACOLYTE_GH = 20, EVENT_DR_ACOLYTE_GH = 20,
EVENT_DR_ACOLYTE_HS = 21, EVENT_DR_ACOLYTE_HS = 21,
@@ -630,6 +631,11 @@ public:
me->CastSpell(me, SPELL_LIGHTNING_CHARGE_BUFF, true); me->CastSpell(me, SPELL_LIGHTNING_CHARGE_BUFF, true);
events.RescheduleEvent(EVENT_THORIM_LIGHTNING_CHARGE, 10s, 0, EVENT_PHASE_RING); events.RescheduleEvent(EVENT_THORIM_LIGHTNING_CHARGE, 10s, 0, EVENT_PHASE_RING);
} }
else if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
m_pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
}
} }
void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override
@@ -773,12 +779,13 @@ public:
{ {
Talk(SAY_END_NORMAL_3); Talk(SAY_END_NORMAL_3);
} }
// Defeat credit // Defeat credit
if (m_pInstance) if (m_pInstance)
m_pInstance->SetData(TYPE_THORIM, DONE); m_pInstance->SetData(TYPE_THORIM, DONE);
events.ScheduleEvent(EVENT_THORIM_OUTRO4, 14s, 0, 3);
me->DespawnOrUnsummon(8000); break;
case EVENT_THORIM_OUTRO4:
DoCastSelf(SPELL_TELEPORT);
break; break;
} }
@@ -251,6 +251,8 @@ enum Misc
ACTION_ILLUSION_ICECROWN = 2, ACTION_ILLUSION_ICECROWN = 2,
ACTION_ILLUSION_STORMWIND = 3, ACTION_ILLUSION_STORMWIND = 3,
// ACTION_SARA_UPDATE_SUMMON_KEEPERS = 4, // defined in ulduar.h
EVENT_PHASE_ONE = 1, EVENT_PHASE_ONE = 1,
EVENT_PHASE_TWO = 2, EVENT_PHASE_TWO = 2,
EVENT_PHASE_THREE = 3, EVENT_PHASE_THREE = 3,
@@ -271,6 +273,26 @@ struct LocationsXY
float x, y, z; float x, y, z;
}; };
Position const GossipKeepersPos[4] =
{
{1945.6823f, 33.342014f, 411.44083f, 5.270895f}, // Freya
{1945.7609f, -81.52171f, 411.4407f, 1.029744f}, // Hodir
{2028.7656f, 17.42014f, 411.44458f, 3.857178f}, // Mimiron
{2028.8219f, -65.73573f, 411.44257f, 2.460914f} // Thorim
};
const Position KeepersPos[4] =
{
{1939.32f, 42.165f, 338.415f, 5.17955f}, // Freya
{1939.13f, -90.8332f, 338.415f, 1.00123f}, // Hodir
{2036.81f, 25.6646f, 338.415f, 3.74227f}, // Mimiron
{2036.59f, -73.8499f, 338.415f, 2.34819f} // Thorim
};
const uint32 TABLE_KEEPER_ENTRY[4] = {NPC_FREYA_KEEPER, NPC_HODIR_KEEPER, NPC_MIMIRON_KEEPER, NPC_THORIM_KEEPER};
const uint32 TABLE_GOSSIP_ENTRY[4] = {NPC_FREYA_GOSSIP, NPC_HODIR_GOSSIP, NPC_MIMIRON_GOSSIP, NPC_THORIM_GOSSIP};
const uint32 TABLE_KEEPER_TYPE[4] = {TYPE_FREYA, TYPE_HODIR, TYPE_MIMIRON, TYPE_THORIM};
static LocationsXY yoggPortalLoc[] = static LocationsXY yoggPortalLoc[] =
{ {
{1970.48f, -9.75f, 325.5f}, {1970.48f, -9.75f, 325.5f},
@@ -344,7 +366,6 @@ enum Texts
SAY_LK_2 = 1, SAY_LK_2 = 1,
SAY_YOGG_5 = 3, SAY_YOGG_5 = 3,
SAY_YOGG_6 = 4, SAY_YOGG_6 = 4,
}; };
const Position Middle = {1980.28f, -25.5868f, 329.397f, M_PI * 1.5f}; const Position Middle = {1980.28f, -25.5868f, 329.397f, M_PI * 1.5f};
@@ -371,7 +392,6 @@ public:
SummonList summons; SummonList summons;
uint32 _initFight; uint32 _initFight;
ObjectGuid _keepersGUID[4];
uint8 _summonedGuardiansCount; uint8 _summonedGuardiansCount;
uint32 _p2TalkTimer; uint32 _p2TalkTimer;
bool _secondPhase; bool _secondPhase;
@@ -382,17 +402,9 @@ public:
void AttackStart(Unit*) override { } void AttackStart(Unit*) override { }
void MoveInLineOfSight(Unit*) override { } void MoveInLineOfSight(Unit*) override { }
void JustSummoned(Creature* cr) override void JustSummoned(Creature* summon) override
{ {
summons.Summon(cr); summons.Summon(summon);
if (cr->GetEntry() >= NPC_FREYA_KEEPER && cr->GetEntry() <= NPC_THORIM_KEEPER)
{
if (cr->GetEntry() == NPC_FREYA_KEEPER)
cr->CastSpell(cr, SPELL_CONJURE_SANITY_WELL, false);
_keepersGUID[cr->GetEntry() - NPC_FREYA_KEEPER] = cr->GetGUID();
}
else if (cr->GetEntry() == NPC_SANITY_WELL)
cr->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SCALE, true);
} }
void SpawnClouds() void SpawnClouds()
@@ -407,15 +419,6 @@ public:
} }
} }
void SpawnWeels()
{
me->SummonCreature(NPC_SANITY_WELL, 2042.56f, -40.3667f, 329.274f, 0.0f);
me->SummonCreature(NPC_SANITY_WELL, 1975.89f, 40.0216f, 331.1f, 0.0f);
me->SummonCreature(NPC_SANITY_WELL, 1987.12f, -91.2702f, 330.186f, 0.0f);
me->SummonCreature(NPC_SANITY_WELL, 1900.48f, -51.2386f, 332.13f, 0.0f);
me->SummonCreature(NPC_SANITY_WELL, 1899.94f, 0.330621f, 332.296f, 0.0f);
}
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
{ {
if (!_EnterEvadeMode(why)) if (!_EnterEvadeMode(why))
@@ -469,9 +472,7 @@ public:
_initFight = 1; _initFight = 1;
for (uint8 i = 0; i < 4; ++i) UpdateKeeperSpawns();
_keepersGUID[i].Clear();
_summonedGuardiansCount = 0; _summonedGuardiansCount = 0;
_p2TalkTimer = 0; _p2TalkTimer = 0;
_secondPhase = false; _secondPhase = false;
@@ -503,9 +504,11 @@ public:
me->SetInCombatWithZone(); me->SetInCombatWithZone();
AttackStart(target); AttackStart(target);
me->CastSpell(me, SPELL_SANITY_BASE, true); DespawnGossipKeepers();
// Engage Keepers
summons.DoZoneInCombat();
SaveKeepers(); me->CastSpell(me, SPELL_SANITY_BASE, true);
events.ScheduleEvent(EVENT_SARA_P1_DOORS_CLOSE, 15s, 0, EVENT_PHASE_ONE); events.ScheduleEvent(EVENT_SARA_P1_DOORS_CLOSE, 15s, 0, EVENT_PHASE_ONE);
events.ScheduleEvent(EVENT_SARA_P1_BERSERK, 15min, 0, 0); events.ScheduleEvent(EVENT_SARA_P1_BERSERK, 15min, 0, 0);
@@ -516,26 +519,27 @@ public:
me->setActive(true); me->setActive(true);
} }
void SaveKeepers() void DespawnGossipKeepers()
{ {
for (uint8 i = 0; i < 4; ++i) for (uint8 i = KEEPER_FREYA; i <= KEEPER_THORIM; i++)
summons.DespawnEntry(TABLE_GOSSIP_ENTRY[i]);
}
void UpdateKeeperSpawns()
{
for (uint8 i = KEEPER_FREYA; i <= KEEPER_THORIM; i++)
{
if (m_pInstance->GetData(TYPE_WATCHERS) & (1 << i)) if (m_pInstance->GetData(TYPE_WATCHERS) & (1 << i))
switch (i) {
{ if (!summons.HasEntry(TABLE_KEEPER_ENTRY[i]))
case KEEPER_FREYA: me->SummonCreature(TABLE_KEEPER_ENTRY[i], KeepersPos[i]);
SpawnWeels(); }
me->SummonCreature(NPC_FREYA_KEEPER, 1939.32f, 42.165f, 338.415f, 5.17955f); else if (m_pInstance->GetData(TABLE_KEEPER_TYPE[i]) == DONE)
break; {
case KEEPER_HODIR: if (!summons.HasEntry(TABLE_GOSSIP_ENTRY[i]))
me->SummonCreature(NPC_HODIR_KEEPER, 1939.13f, -90.8332f, 338.415f, 1.00123f); me->SummonCreature(TABLE_GOSSIP_ENTRY[i], GossipKeepersPos[i]);
break; }
case KEEPER_MIMIRON: }
me->SummonCreature(NPC_MIMIRON_KEEPER, 2036.81f, 25.6646f, 338.415f, 3.74227f);
break;
case KEEPER_THORIM:
me->SummonCreature(NPC_THORIM_KEEPER, 2036.59f, -73.8499f, 338.415f, 2.34819f);
break;
}
} }
void InformCloud() void InformCloud()
@@ -625,9 +629,8 @@ public:
{ {
uint8 _count = 0; uint8 _count = 0;
for (uint8 i = 0; i < 4; ++i) for (uint8 i = 0; i < 4; ++i)
if (_keepersGUID[i]) if (m_pInstance->GetData(TYPE_WATCHERS) & (1 << i))
++_count; ++_count;
return _count; return _count;
} }
else if (param == DATA_GET_SARA_PHASE) else if (param == DATA_GET_SARA_PHASE)
@@ -638,7 +641,11 @@ public:
void DoAction(int32 param) override void DoAction(int32 param) override
{ {
if (param == ACTION_BRAIN_DAMAGED) if (param == ACTION_SARA_UPDATE_SUMMON_KEEPERS)
{
UpdateKeeperSpawns();
}
else if (param == ACTION_BRAIN_DAMAGED)
{ {
summons.DoAction(ACTION_REMOVE_STUN); summons.DoAction(ACTION_REMOVE_STUN);
@@ -648,7 +655,7 @@ public:
EntryCheckPredicate pred3(NPC_THORIM_KEEPER); EntryCheckPredicate pred3(NPC_THORIM_KEEPER);
summons.DoAction(ACTION_THORIM_START_STORM, pred3); summons.DoAction(ACTION_THORIM_START_STORM, pred3);
if (!(_keepersGUID[0] && _keepersGUID[1] && _keepersGUID[2] && _keepersGUID[3]) && me->GetMap()->Is25ManRaid()) if (me->GetMap()->Is25ManRaid() && (GetData(DATA_GET_KEEPERS_COUNT) > 0))
summons.DoAction(ACTION_YOGG_SARON_HARD_MODE, pred2); summons.DoAction(ACTION_YOGG_SARON_HARD_MODE, pred2);
summons.DespawnEntry(NPC_DEATH_ORB); summons.DespawnEntry(NPC_DEATH_ORB);
@@ -660,8 +667,17 @@ public:
} }
else if (param == ACTION_YOGG_SARON_DEATH) else if (param == ACTION_YOGG_SARON_DEATH)
{ {
// Despawn everything but Yogg-Saron's corpse
summons.DoAction(ACTION_DESPAWN_ADDS);
summons.DespawnEntry(NPC_CRUSHER_TENTACLE);
summons.DespawnEntry(NPC_CONSTRICTOR_TENTACLE);
summons.DespawnEntry(NPC_CORRUPTOR_TENTACLE);
summons.DespawnEntry(NPC_VOICE_OF_YOGG_SARON); summons.DespawnEntry(NPC_VOICE_OF_YOGG_SARON);
summons.DespawnEntry(NPC_BRAIN_OF_YOGG_SARON); summons.DespawnEntry(NPC_BRAIN_OF_YOGG_SARON);
summons.DespawnEntry(NPC_MIMIRON_GOSSIP);
summons.DespawnEntry(NPC_HODIR_GOSSIP);
summons.DespawnEntry(NPC_FREYA_GOSSIP);
summons.DespawnEntry(NPC_THORIM_GOSSIP);
summons.DespawnEntry(NPC_MIMIRON_KEEPER); summons.DespawnEntry(NPC_MIMIRON_KEEPER);
summons.DespawnEntry(NPC_HODIR_KEEPER); summons.DespawnEntry(NPC_HODIR_KEEPER);
summons.DespawnEntry(NPC_FREYA_KEEPER); summons.DespawnEntry(NPC_FREYA_KEEPER);
@@ -1709,52 +1725,56 @@ public:
}; };
}; };
class boss_yoggsaron_keeper : public CreatureScript struct boss_yoggsaron_keeper : public NullCreatureAI
{ {
public: boss_yoggsaron_keeper(Creature* creature) : NullCreatureAI(creature), _summons(creature) { }
boss_yoggsaron_keeper() : CreatureScript("boss_yoggsaron_keeper") { }
CreatureAI* GetAI(Creature* pCreature) const override void DoAction(int32 param) override
{ {
return GetUlduarAI<boss_yoggsaron_keeperAI>(pCreature); if (me->GetEntry() == NPC_THORIM_KEEPER && param == ACTION_THORIM_START_STORM)
me->CastSpell(me, SPELL_TITANIC_STORM_PASSIVE, false);
else if (param == ACTION_DESPAWN_ADDS)
_summons.DespawnAll();
} }
struct boss_yoggsaron_keeperAI : public NullCreatureAI void JustSummoned(Creature* summon) override
{ {
boss_yoggsaron_keeperAI(Creature* pCreature) : NullCreatureAI(pCreature) _summons.Summon(summon);
}
void JustEngagedWith(Unit* /*who*/) override
{
switch (me->GetEntry())
{ {
_checkTimer = 0; case NPC_FREYA_KEEPER:
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SCALE, true); me->AddAura(SPELL_FREYA_PASSIVE, me);
} me->CastSpell(me, SPELL_CONJURE_SANITY_WELL, false);
break;
uint32 _checkTimer; case NPC_HODIR_KEEPER:
me->AddAura(SPELL_HODIR_PASSIVE, me);
void DoAction(int32 param) override me->AddAura(SPELL_PROTECTIVE_GAZE, me);
{ break;
if (me->GetEntry() == NPC_THORIM_KEEPER && param == ACTION_THORIM_START_STORM) case NPC_MIMIRON_KEEPER:
me->CastSpell(me, SPELL_TITANIC_STORM_PASSIVE, false); me->AddAura(SPELL_MIMIRON_PASSIVE, me);
} scheduler.Schedule(2s, [this](TaskContext context)
void UpdateAI(uint32 diff) override
{
if (me->GetInstanceScript())
if (me->GetInstanceScript()->GetData(TYPE_YOGGSARON) != IN_PROGRESS)
return;
_checkTimer += diff;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->GetEntry() == NPC_MIMIRON_KEEPER)
{
if (_checkTimer >= 2000)
{ {
me->CastSpell(me, SPELL_DESTABILIZATION_MATRIX, false); if (!me->HasUnitState(UNIT_STATE_CASTING))
_checkTimer = 0; me->CastSpell(me, SPELL_DESTABILIZATION_MATRIX, false);
} context.Repeat(2s);
} });
break;
case NPC_THORIM_KEEPER:
me->AddAura(SPELL_THORIM_PASSIVE, me);
break;
} }
}; }
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
}
private:
SummonList _summons;
}; };
class boss_yoggsaron_descend_portal : public CreatureScript class boss_yoggsaron_descend_portal : public CreatureScript
@@ -2739,6 +2759,33 @@ public:
} }
}; };
const Position SanityWellsPos[5] =
{
{2042.56f, -40.3667f, 329.274f, 0.0f},
{1975.89f, 40.0216f, 331.1f, 0.0f},
{1987.12f, -91.2702f, 330.186f, 0.0f},
{1900.48f, -51.2386f, 332.13f, 0.0f},
{1899.94f, 0.330621f, 332.296f, 0.0f}
};
// 64170 - Sanity Well
class spell_keeper_freya_summon_sanity_well : public SpellScript
{
PrepareSpellScript(spell_keeper_freya_summon_sanity_well);
void OnEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
for (int i = 0; i < 5; i++)
caster->SummonCreature(NPC_SANITY_WELL, SanityWellsPos[i]);
}
void Register() override
{
OnEffectLaunch += SpellEffectFn(spell_keeper_freya_summon_sanity_well::OnEffect, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
/* 63881 - Malady of the Mind /* 63881 - Malady of the Mind
63795 - Psychosis 63795 - Psychosis
63830 - Malady of the Mind 63830 - Malady of the Mind
@@ -3032,7 +3079,7 @@ void AddSC_boss_yoggsaron()
new boss_yoggsaron_crusher_tentacle(); new boss_yoggsaron_crusher_tentacle();
new boss_yoggsaron_corruptor_tentacle(); new boss_yoggsaron_corruptor_tentacle();
new boss_yoggsaron_constrictor_tentacle(); new boss_yoggsaron_constrictor_tentacle();
new boss_yoggsaron_keeper(); RegisterUlduarCreatureAI(boss_yoggsaron_keeper);
new boss_yoggsaron_descend_portal(); new boss_yoggsaron_descend_portal();
new boss_yoggsaron_influence_tentacle(); new boss_yoggsaron_influence_tentacle();
new boss_yoggsaron_immortal_guardian(); new boss_yoggsaron_immortal_guardian();
@@ -3053,6 +3100,7 @@ void AddSC_boss_yoggsaron()
new spell_yogg_saron_insane_periodic_trigger(); new spell_yogg_saron_insane_periodic_trigger();
new spell_yogg_saron_insane(); new spell_yogg_saron_insane();
new spell_yogg_saron_sanity_well(); new spell_yogg_saron_sanity_well();
RegisterSpellScript(spell_keeper_freya_summon_sanity_well);
new spell_yogg_saron_sanity_reduce(); new spell_yogg_saron_sanity_reduce();
new spell_yogg_saron_empowering_shadows(); new spell_yogg_saron_empowering_shadows();
new spell_yogg_saron_in_the_maws_of_the_old_god(); new spell_yogg_saron_in_the_maws_of_the_old_god();
@@ -370,22 +370,6 @@ public:
case NPC_MIMIRON_ACU: case NPC_MIMIRON_ACU:
m_MimironACUguid = creature->GetGUID(); m_MimironACUguid = creature->GetGUID();
break; break;
case NPC_FREYA_GOSSIP:
m_keepersGossipGUID[TYPE_FREYA - TYPE_FREYA] = creature->GetGUID();
ShowKeeperGossip(TYPE_FREYA, creature);
break;
case NPC_HODIR_GOSSIP:
m_keepersGossipGUID[TYPE_HODIR - TYPE_FREYA] = creature->GetGUID();
ShowKeeperGossip(TYPE_HODIR, creature);
break;
case NPC_THORIM_GOSSIP:
m_keepersGossipGUID[TYPE_THORIM - TYPE_FREYA] = creature->GetGUID();
ShowKeeperGossip(TYPE_THORIM, creature);
break;
case NPC_MIMIRON_GOSSIP:
m_keepersGossipGUID[TYPE_MIMIRON - TYPE_FREYA] = creature->GetGUID();
ShowKeeperGossip(TYPE_MIMIRON, creature);
break;
case NPC_ELDER_IRONBRANCH: case NPC_ELDER_IRONBRANCH:
case NPC_ELDER_STONEBARK: case NPC_ELDER_STONEBARK:
case NPC_ELDER_BRIGHTLEAF: case NPC_ELDER_BRIGHTLEAF:
@@ -433,19 +417,6 @@ public:
go->SetGoState(state); go->SetGoState(state);
} }
void ShowKeeperGossip(uint8 type, Creature* cr, ObjectGuid guid = ObjectGuid::Empty)
{
if (!cr)
{
cr = instance->GetCreature(guid);
if (!cr)
return;
}
bool on = (GetData(type) == DONE && !(GetData(TYPE_WATCHERS) & (1 << (type - TYPE_FREYA))));
cr->SetVisible(on);
}
void OnGameObjectCreate(GameObject* gameObject) override void OnGameObjectCreate(GameObject* gameObject) override
{ {
switch (gameObject->GetEntry()) switch (gameObject->GetEntry())
@@ -695,7 +666,6 @@ public:
case TYPE_THORIM: case TYPE_THORIM:
case TYPE_FREYA: case TYPE_FREYA:
m_auiEncounter[type] = data; m_auiEncounter[type] = data;
ShowKeeperGossip(type, nullptr, m_keepersGossipGUID[type - TYPE_FREYA]);
if (GetData(TYPE_MIMIRON) == DONE && GetData(TYPE_FREYA) == DONE && GetData(TYPE_HODIR) == DONE && GetData(TYPE_THORIM) == DONE) if (GetData(TYPE_MIMIRON) == DONE && GetData(TYPE_FREYA) == DONE && GetData(TYPE_HODIR) == DONE && GetData(TYPE_THORIM) == DONE)
{ {
if (GameObject* go = instance->GetGameObject(m_keepersgateGUID)) if (GameObject* go = instance->GetGameObject(m_keepersgateGUID))
@@ -716,8 +686,11 @@ public:
break; break;
case TYPE_WATCHERS: case TYPE_WATCHERS:
m_auiEncounter[type] |= 1 << data; m_auiEncounter[type] |= 1 << data;
[[fallthrough]];
case EVENT_KEEPER_TELEPORTED:
if (Creature* sara = instance->GetCreature(m_saraGUID))
sara->AI()->DoAction(ACTION_SARA_UPDATE_SUMMON_KEEPERS);
break; break;
case DATA_MAGE_BARRIER: case DATA_MAGE_BARRIER:
m_mageBarrier = data; m_mageBarrier = data;
break; break;
@@ -728,6 +701,7 @@ public:
case EVENT_TOWER_OF_FLAMES_DESTROYED: case EVENT_TOWER_OF_FLAMES_DESTROYED:
{ {
instance->LoadGrid(364.0f, -16.0f); //make sure leviathan is loaded instance->LoadGrid(364.0f, -16.0f); //make sure leviathan is loaded
instance->LoadGrid(364.0f, 32.0f); //make sure Mimiron's and Thorim's Targetting Crystal are loaded
m_leviathanTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED] = data; m_leviathanTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED] = data;
for (uint8 i = 0; i < 2; ++i) for (uint8 i = 0; i < 2; ++i)
{ {
@@ -21,6 +21,7 @@
#include "GameObjectScript.h" #include "GameObjectScript.h"
#include "Player.h" #include "Player.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "PassiveAI.h"
#include "ScriptedGossip.h" #include "ScriptedGossip.h"
#include "SpellAuraEffects.h" #include "SpellAuraEffects.h"
#include "SpellScript.h" #include "SpellScript.h"
@@ -51,7 +52,14 @@ enum Texts
GOSSIP_MENU_CONFIRM = 10333, GOSSIP_MENU_CONFIRM = 10333,
NPC_TEXT_CONFIRM = 14325, NPC_TEXT_CONFIRM = 14325,
SAY_KEEPER_SELECTED = 1, // Chosen
SAY_KEEPER_CHOSEN_TO_PLAYER = 0,
SAY_KEEPER_CHOSEN_ANNOUNCE = 1,
};
enum UldActions
{
ACTION_KEEPER_OUTRO = 0,
}; };
enum UldNPCs enum UldNPCs
@@ -69,6 +77,8 @@ enum UldGameObjects
enum UldSpells enum UldSpells
{ {
SPELL_SIMPLE_TELEPORT = 12980,
SPELL_KEEPER_TELEPORT = 62940,
SPELL_SNOW_MOUND_PARTICLES = 64615 SPELL_SNOW_MOUND_PARTICLES = 64615
}; };
@@ -77,6 +87,68 @@ class npc_ulduar_keeper : public CreatureScript
public: public:
npc_ulduar_keeper() : CreatureScript("npc_ulduar_keeper_gossip") { } npc_ulduar_keeper() : CreatureScript("npc_ulduar_keeper_gossip") { }
struct npc_ulduar_keeperAI : public NullCreatureAI
{
npc_ulduar_keeperAI(Creature* creature) : NullCreatureAI(creature) { }
void Reset() override
{
scheduler.Schedule(250ms, [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_SIMPLE_TELEPORT);
});
}
void DoAction(int32 param) override
{
if (param == ACTION_KEEPER_OUTRO)
{
switch (me->GetEntry())
{
case NPC_FREYA_GOSSIP:
_keeper = KEEPER_FREYA;
break;
case NPC_HODIR_GOSSIP:
_keeper = KEEPER_HODIR;
break;
case NPC_MIMIRON_GOSSIP:
_keeper = KEEPER_MIMIRON;
break;
case NPC_THORIM_GOSSIP:
_keeper = KEEPER_THORIM;
break;
default:
return;
}
scheduler.Schedule(1s, [this](TaskContext /*context*/)
{
DoCastSelf(SPELL_KEEPER_TELEPORT);
});
}
}
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
me->GetInstanceScript()->SetData(TYPE_WATCHERS, _keeper);
}
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
}
private:
uint8 _keeper;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_ulduar_keeperAI>(creature);
}
bool OnGossipHello(Player* player, Creature* creature) override bool OnGossipHello(Player* player, Creature* creature) override
{ {
uint32 gossipMenuId = 0; uint32 gossipMenuId = 0;
@@ -109,7 +181,6 @@ public:
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
{ {
ClearGossipMenuFor(player); ClearGossipMenuFor(player);
uint8 _keeper = 0;
switch (action) switch (action)
{ {
case GOSSIP_ACTION_INFO_DEF+1: case GOSSIP_ACTION_INFO_DEF+1:
@@ -118,34 +189,12 @@ public:
break; break;
case GOSSIP_ACTION_INFO_DEF+2: case GOSSIP_ACTION_INFO_DEF+2:
{ {
switch (creature->GetEntry()) creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
{
case NPC_FREYA_GOSSIP:
creature->AI()->Talk(SAY_KEEPER_SELECTED);
_keeper = KEEPER_FREYA;
break;
case NPC_HODIR_GOSSIP:
creature->AI()->Talk(SAY_KEEPER_SELECTED);
_keeper = KEEPER_HODIR;
break;
case NPC_MIMIRON_GOSSIP:
creature->AI()->Talk(SAY_KEEPER_SELECTED);
_keeper = KEEPER_MIMIRON;
break;
case NPC_THORIM_GOSSIP:
creature->AI()->Talk(SAY_KEEPER_SELECTED);
_keeper = KEEPER_THORIM;
break;
}
creature->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE);
CloseGossipMenuFor(player); CloseGossipMenuFor(player);
if (creature->GetInstanceScript()) creature->AI()->Talk(SAY_KEEPER_CHOSEN_TO_PLAYER, player);
{ creature->AI()->Talk(SAY_KEEPER_CHOSEN_ANNOUNCE);
creature->GetInstanceScript()->SetData(TYPE_WATCHERS, _keeper); creature->AI()->DoAction(ACTION_KEEPER_OUTRO);
creature->DespawnOrUnsummon(6000);
}
} }
} }
return true; return true;
@@ -284,6 +284,14 @@ enum UlduarMisc
TIMER_ALGALON_TO_SUMMON = 200, TIMER_ALGALON_TO_SUMMON = 200,
TIMER_ALGALON_SUMMONED = 100, TIMER_ALGALON_SUMMONED = 100,
// Algalon the Observer, Freya, Hodir, Mimiron, Thorim, Gossip Keepers
SPELL_TELEPORT = 62940,
// Freya, Hodir, Mimiron, Thorim
EVENT_KEEPER_TELEPORTED = 62941,
// Yogg-Saron
ACTION_SARA_UPDATE_SUMMON_KEEPERS = 4,
KEEPER_FREYA = 0, KEEPER_FREYA = 0,
KEEPER_HODIR = 1, KEEPER_HODIR = 1,
KEEPER_MIMIRON = 2, KEEPER_MIMIRON = 2,
@@ -1287,19 +1287,21 @@ public:
if (!summoner) if (!summoner)
return; return;
if (summoner->GetTypeId() != TYPEID_UNIT) if (summoner->GetTypeId() != TYPEID_PLAYER)
{
return; return;
}
summoner->ToUnit()->CastSpell(summoner->ToUnit(), SPELL_WAITING_FOR_A_BOMBER, true); Player* player = summoner->ToPlayer();
summoner->ToUnit()->CastSpell(summoner->ToUnit(), SPELL_FLIGHT_ORDERS, true); if (!player)
return;
player->CastSpell(player, SPELL_WAITING_FOR_A_BOMBER, true);
player->CastSpell(player, SPELL_FLIGHT_ORDERS, true);
events.ScheduleEvent(EVENT_START_FLIGHT, 0); events.ScheduleEvent(EVENT_START_FLIGHT, 0);
events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3000); events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3000);
me->SetCanFly(true); me->SetCanFly(true);
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->SetSpeed(MOVE_FLIGHT, 0.1f); me->SetSpeed(MOVE_FLIGHT, 0.1f);
me->SetFaction(summoner->ToUnit()->GetFaction()); me->SetFaction(player->GetFaction());
} }
void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask) override void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask) override
@@ -472,7 +472,7 @@ struct boss_kaelthas : public BossAI
{ {
DoCastRandomTarget(SPELL_FLAME_STRIKE, 0, 100.0f); DoCastRandomTarget(SPELL_FLAME_STRIKE, 0, 100.0f);
}, 30250ms, 50650ms); }, 30250ms, 50650ms);
ScheduleTimedEvent(71000ms, [&] ScheduleTimedEvent(50000ms, [&]
{ {
Talk(SAY_SUMMON_PHOENIX); Talk(SAY_SUMMON_PHOENIX);
DoCastSelf(SPELL_PHOENIX); DoCastSelf(SPELL_PHOENIX);
@@ -439,9 +439,6 @@ enum EnshlavedNetherwingDrake
NPC_DRAGONMAW_WRANGLER = 21717, NPC_DRAGONMAW_WRANGLER = 21717,
NPC_ESCAPE_DUMMY = 22317, NPC_ESCAPE_DUMMY = 22317,
EVENT_TAKE_OFF = 1,
EVENT_CREDIT_PLAYER = 2,
// Point // Point
POINT_DESPAWN = 1 POINT_DESPAWN = 1
}; };
@@ -451,18 +448,14 @@ struct npc_enslaved_netherwing_drake : public ScriptedAI
public: public:
npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature) npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature)
{ {
Tapped = false; _tapped = false;
Reset(); Reset();
} }
ObjectGuid PlayerGUID;
bool Tapped;
Player* GetPlayer() { return ObjectAccessor::GetPlayer(*me, PlayerGUID); }
void Reset() override void Reset() override
{ {
if (!Tapped) scheduler.CancelAll();
if (!_tapped)
{ {
me->RestoreFaction(); me->RestoreFaction();
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
@@ -474,9 +467,8 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
Tapped = false; _tapped = false;
me->RestoreFaction(); me->RestoreFaction();
events.CancelEvent(EVENT_TAKE_OFF);
} }
void SpellHit(Unit* caster, SpellInfo const* spell) override void SpellHit(Unit* caster, SpellInfo const* spell) override
@@ -485,20 +477,45 @@ public:
if (!playerCaster) if (!playerCaster)
return; return;
if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !Tapped && if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !_tapped &&
playerCaster->GetQuestStatus(QUEST_THE_FORCE_OF_NELTHARAKU) == QUEST_STATUS_INCOMPLETE) playerCaster->GetQuestStatus(QUEST_THE_FORCE_OF_NELTHARAKU) == QUEST_STATUS_INCOMPLETE)
{ {
Tapped = true; _tapped = true;
PlayerGUID = caster->GetGUID(); _playerGUID = caster->GetGUID();
me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai. scheduler.Schedule(2s, [this](TaskContext)
{
me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai.
if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f)) if (Unit* dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f))
AttackStart(Dragonmaw); AttackStart(dragonmaw);
else if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f)) else if (Unit* dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f))
AttackStart(Dragonmaw); AttackStart(dragonmaw);
scheduler.Schedule(2s, [this](TaskContext)
{
_tapped = false;
Position pos;
if (Unit* escapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30.0f))
pos = escapeDummy->GetPosition();
else
{
pos = me->GetRandomNearPosition(20.0f);
pos.m_positionZ += 25.0f;
}
events.ScheduleEvent(EVENT_TAKE_OFF, 2s); me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, pos);
me->SetReactState(REACT_PASSIVE);
scheduler.Schedule(100ms, [this](TaskContext)
{
if (Player* player = _GetPlayer())
{
DoCast(player, SPELL_FORCE_OF_NELTHARAKU, true);
}
me->DespawnOrUnsummon(3s, 0s);
});
});
});
} }
} }
@@ -514,40 +531,21 @@ public:
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
events.Update(diff); scheduler.Update(diff);
if (!UpdateVictim()) if (!UpdateVictim())
{
switch (events.ExecuteEvent())
{
case EVENT_TAKE_OFF:
{
Tapped = false;
Position pos;
if (Unit* EscapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30))
pos = EscapeDummy->GetPosition();
else
{
pos = me->GetRandomNearPosition(20);
pos.m_positionZ += 25;
}
me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, pos);
me->SetReactState(REACT_PASSIVE);
events.ScheduleEvent(EVENT_CREDIT_PLAYER, 100ms);
break;
}
case EVENT_CREDIT_PLAYER:
DoCast(GetPlayer(), SPELL_FORCE_OF_NELTHARAKU, true);
me->DespawnOrUnsummon(3s, 0s);
break;
}
return; return;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
private:
bool _tapped;
ObjectGuid _playerGUID;
Player* _GetPlayer() { return ObjectAccessor::GetPlayer(*me, _playerGUID); }
}; };
/*##### /*#####
@@ -628,6 +628,7 @@ class spell_gen_black_magic_enchant : public AuraScript
}; };
// 53642 - The Might of Mograine // 53642 - The Might of Mograine
// 64174 - Protective Gaze
class spell_gen_area_aura_select_players : public AuraScript class spell_gen_area_aura_select_players : public AuraScript
{ {
PrepareAuraScript(spell_gen_area_aura_select_players); PrepareAuraScript(spell_gen_area_aura_select_players);
@@ -642,6 +643,24 @@ class spell_gen_area_aura_select_players : public AuraScript
} }
}; };
// 62650 - Fortitude of Frost
// 62670 - Resilience of Nature
// 62671 - Speed of Invention
// 62702 - Fury of the Storm
class spell_gen_area_aura_select_players_and_caster : public AuraScript
{
PrepareAuraScript(spell_gen_area_aura_select_players_and_caster);
bool CheckAreaTarget(Unit* target)
{
return target->GetTypeId() == TYPEID_PLAYER || target == GetCaster();
}
void Register() override
{
DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_area_aura_select_players_and_caster::CheckAreaTarget);
}
};
/* 29883 - Blink (spell_gen_select_target_count_15_1) /* 29883 - Blink (spell_gen_select_target_count_15_1)
38573 - Spore Drop Effect (spell_gen_select_target_count_15_1) 38573 - Spore Drop Effect (spell_gen_select_target_count_15_1)
38633 - Arcane Volley (spell_gen_select_target_count_15_1) 38633 - Arcane Volley (spell_gen_select_target_count_15_1)
@@ -5134,6 +5153,43 @@ class spell_gen_choking_vines : public AuraScript
} }
}; };
// 28865 - Consumption
class spell_gen_consumption : public SpellScript
{
PrepareSpellScript(spell_gen_consumption);
void CalculateDamage(SpellEffIndex /*effIndex*/)
{
Map* map = GetCaster()->GetMap();
if (!map)
{
return;
}
int32 value = 0;
if (map->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) // NAXX25 N
{
value = urand(4500, 4700);
}
else if (map->GetId() == 533) // NAXX10 N
{
value = urand(3000, 3200);
}
else if (map->GetId() == 532) // Karazhan
{
value = urand(1110, 1310);
}
if (value)
{
SetEffectValue(value);
}
}
void Register() override
{
OnEffectLaunchTarget += SpellEffectFn(spell_gen_consumption::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
void AddSC_generic_spell_scripts() void AddSC_generic_spell_scripts()
{ {
RegisterSpellScript(spell_silithyst); RegisterSpellScript(spell_silithyst);
@@ -5156,6 +5212,7 @@ void AddSC_generic_spell_scripts()
RegisterSpellScript(spell_gen_disabled_above_63); RegisterSpellScript(spell_gen_disabled_above_63);
RegisterSpellScript(spell_gen_black_magic_enchant); RegisterSpellScript(spell_gen_black_magic_enchant);
RegisterSpellScript(spell_gen_area_aura_select_players); RegisterSpellScript(spell_gen_area_aura_select_players);
RegisterSpellScript(spell_gen_area_aura_select_players_and_caster);
RegisterSpellScriptWithArgs(spell_gen_select_target_count, "spell_gen_select_target_count_15_1", TARGET_UNIT_SRC_AREA_ENEMY, 1); RegisterSpellScriptWithArgs(spell_gen_select_target_count, "spell_gen_select_target_count_15_1", TARGET_UNIT_SRC_AREA_ENEMY, 1);
RegisterSpellScriptWithArgs(spell_gen_select_target_count, "spell_gen_select_target_count_15_2", TARGET_UNIT_SRC_AREA_ENEMY, 2); RegisterSpellScriptWithArgs(spell_gen_select_target_count, "spell_gen_select_target_count_15_2", TARGET_UNIT_SRC_AREA_ENEMY, 2);
RegisterSpellScriptWithArgs(spell_gen_select_target_count, "spell_gen_select_target_count_15_5", TARGET_UNIT_SRC_AREA_ENEMY, 5); RegisterSpellScriptWithArgs(spell_gen_select_target_count, "spell_gen_select_target_count_15_5", TARGET_UNIT_SRC_AREA_ENEMY, 5);
@@ -5287,5 +5344,6 @@ void AddSC_generic_spell_scripts()
RegisterSpellScript(spell_gen_jubling_cooldown); RegisterSpellScript(spell_gen_jubling_cooldown);
RegisterSpellScript(spell_gen_yehkinya_bramble); RegisterSpellScript(spell_gen_yehkinya_bramble);
RegisterSpellScript(spell_gen_choking_vines); RegisterSpellScript(spell_gen_choking_vines);
RegisterSpellScript(spell_gen_consumption);
} }