Merge remote-tracking branch 'azerothcore/master'
# Conflicts: # src/server/game/Entities/Item/Item.cpp # src/server/game/Server/WorldSession.cpp
This commit is contained in:
@@ -2,9 +2,7 @@
|
||||
|
||||
[](CODE_OF_CONDUCT.md)
|
||||
[](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk)
|
||||
[](https://stackoverflow.com/questions/tagged/azerothcore?sort=newest "Ask / browse questions here")
|
||||
[](https://discord.gg/gkt4y2x "Our community hub on Discord")
|
||||
[](https://www.bountyhub.dev/bounties?repo=azerothcore)
|
||||
|
||||
## Build Status
|
||||
|
||||
|
||||
@@ -10,12 +10,6 @@ on:
|
||||
- opened
|
||||
- reopened
|
||||
- synchronize
|
||||
# A PR that only touches data/ (SQL) leaves the C++ untouched, so there is
|
||||
# nothing to compile. Dashboard CI runs on every PR unfiltered and already
|
||||
# imports the SQL and starts a real worldserver, so coverage is unaffected.
|
||||
# Pushes to master are not filtered and always build.
|
||||
paths-ignore:
|
||||
- 'data/**'
|
||||
|
||||
concurrency:
|
||||
# One concurrency group per workflow + ref.
|
||||
|
||||
@@ -10,12 +10,6 @@ on:
|
||||
- opened
|
||||
- reopened
|
||||
- synchronize
|
||||
# A PR that only touches data/ (SQL) leaves the C++ untouched, so there is
|
||||
# nothing to compile. Dashboard CI runs on every PR unfiltered and already
|
||||
# imports the SQL and starts a real worldserver, so coverage is unaffected.
|
||||
# Pushes to master are not filtered and always build.
|
||||
paths-ignore:
|
||||
- 'data/**'
|
||||
|
||||
concurrency:
|
||||
# One concurrency group per workflow + ref.
|
||||
|
||||
@@ -248,18 +248,36 @@ jobs:
|
||||
run: |
|
||||
./acore.sh test core
|
||||
|
||||
# This job runs zero-conf, so the core falls back to console-only logging and
|
||||
# writes no Errors.log, which is what the build workflows scrape. The grep is a
|
||||
# second net in case a later change stops the updater from failing the run on a
|
||||
# bad import.
|
||||
- name: Test authserver dry-run
|
||||
run: |
|
||||
source ./acore.sh config load
|
||||
cd env/dist/bin
|
||||
timeout 5m ./authserver -dry-run
|
||||
timeout 5m ./authserver -dry-run 2>&1 | tee "$RUNNER_TEMP/authserver-dry-run.log"
|
||||
status=${PIPESTATUS[0]}
|
||||
[ "$status" -eq 0 ] || exit "$status"
|
||||
|
||||
if grep -qE "Applying of file .+ failed!" "$RUNNER_TEMP/authserver-dry-run.log"; then
|
||||
echo "::error::A SQL update failed to apply during the authserver dry run"
|
||||
exit 1
|
||||
fi
|
||||
continue-on-error: false
|
||||
|
||||
- name: Test worldserver dry-run
|
||||
run: |
|
||||
source ./acore.sh config load
|
||||
cd env/dist/bin
|
||||
timeout 5m ./worldserver -dry-run
|
||||
timeout 5m ./worldserver -dry-run 2>&1 | tee "$RUNNER_TEMP/worldserver-dry-run.log"
|
||||
status=${PIPESTATUS[0]}
|
||||
[ "$status" -eq 0 ] || exit "$status"
|
||||
|
||||
if grep -qE "Applying of file .+ failed!" "$RUNNER_TEMP/worldserver-dry-run.log"; then
|
||||
echo "::error::A SQL update failed to apply during the worldserver dry run"
|
||||
exit 1
|
||||
fi
|
||||
continue-on-error: false
|
||||
|
||||
|
||||
@@ -289,6 +307,46 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
continue-on-error: false
|
||||
|
||||
# Proves the dry-run steps above actually fail on a bad import.
|
||||
- name: Verify a broken SQL update fails the dry run
|
||||
run: |
|
||||
# Absolute: the trap fires after the cd below.
|
||||
probe="$PWD/data/sql/updates/pending_db_world/rev_9999999999999999999.sql"
|
||||
trap 'rm -f "$probe"' EXIT
|
||||
|
||||
cat > "$probe" <<'EOF'
|
||||
DELETE FROM `ci_gate_probe_table_that_does_not_exist` WHERE `id` = 1;
|
||||
EOF
|
||||
|
||||
source ./acore.sh config load
|
||||
cd env/dist/bin
|
||||
|
||||
# Without this the step fails on a healthy tree as soon as it gains a
|
||||
# `shell: bash`: that turns pipefail on, so errexit aborts on the exit 1 the
|
||||
# assertions below are here to check for.
|
||||
set +o pipefail
|
||||
timeout 5m ./worldserver -dry-run 2>&1 | tee "$RUNNER_TEMP/broken-update-dry-run.log"
|
||||
status=${PIPESTATUS[0]}
|
||||
|
||||
# Exactly 1, so a hang (timeout returns 124) does not pass as a detection.
|
||||
if [ "$status" -ne 1 ]; then
|
||||
echo "::error::expected worldserver -dry-run to exit 1 on a broken SQL update, got $status"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 1 is also the generic startup failure code, so require the updater to be the one
|
||||
# that failed the run, on the probe file specifically.
|
||||
if ! grep -qE "Applying of file .*rev_9999999999999999999\.sql.* failed!" "$RUNNER_TEMP/broken-update-dry-run.log"; then
|
||||
echo "::error::worldserver -dry-run exited 1 without reporting the broken probe update"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! grep -q "Failed Database Update" "$RUNNER_TEMP/broken-update-dry-run.log"; then
|
||||
echo "::error::the dry run did not terminate on the failed update count"
|
||||
exit 1
|
||||
fi
|
||||
timeout-minutes: 10
|
||||
|
||||
# The old "only save on a cache miss" guard is dropped: the per-run key
|
||||
# only ever collides on a re-run, since github.run_id is stable across
|
||||
# attempts, and there the save is a no-op anyway.
|
||||
|
||||
Vendored
+1
@@ -107,6 +107,7 @@ option(WITH_STRICT_DATABASE_TYPE_CHECKS "Enable strict checking of database fiel
|
||||
option(WITHOUT_METRICS "Disable metrics reporting (i.e. InfluxDB and Grafana)" 0)
|
||||
option(WITH_DETAILED_METRICS "Enable detailed metrics reporting (i.e. time each session takes to update)" 0)
|
||||
option(TOOL_CONFIG_MERGER "Install the Python config merger tool alongside config files" 0)
|
||||
option(USE_REAL_LIBSIDECAR "Use real libsidecar and expect that compiled shared lib is in deps/libsidecar folder." 0)
|
||||
|
||||
CheckApplicationsBuildList()
|
||||
CheckToolsBuildList()
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
-- DB update 2026_07_24_05 -> 2026_07_25_00
|
||||
--
|
||||
UPDATE `smart_scripts` SET `action_type` = 26, `target_type` = 16 WHERE (`entryorguid` = 2731600) AND (`source_type` = 9) AND (`id` IN (34));
|
||||
@@ -0,0 +1,14 @@
|
||||
-- DB update 2026_07_25_00 -> 2026_07_25_01
|
||||
-- SPELL_TRANSFORM_GHOST and SPELL_FORGIVENESS
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (28443, 28697);
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(28443, 'spell_transform_ghost_visual'),
|
||||
(28697, 'spell_forgiveness_dummy_visual');
|
||||
|
||||
-- Smartscript
|
||||
-- Deleted 28 due to SPELL_FORGIVENESS attack death
|
||||
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 3976) AND (`source_type` = 0) AND (`id` IN (24, 28, 29));
|
||||
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
|
||||
(3976, 0, 24, 28, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Commander Mograine - On Reached Point 1 - Start Attacking'),-- Change link 29 to 28
|
||||
(3976, 0, 28, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Commander Mograine - On Reached Point 1 - Enable Evade');-- Change id 29 to 28
|
||||
@@ -0,0 +1,3 @@
|
||||
-- DB update 2026_07_25_01 -> 2026_07_25_02
|
||||
--
|
||||
UPDATE `creature_template` SET `KillCredit1` = 0 WHERE (`entry` = 27370);
|
||||
@@ -0,0 +1,3 @@
|
||||
-- DB update 2026_07_25_02 -> 2026_07_25_03
|
||||
--
|
||||
UPDATE `quest_offer_reward` SET `Emote1` = 5, `Emote2` = 1, `Emote3` = 1, `EmoteDelay2` = 1000, `RewardText` = 'WHAT?!$B$B<The image before you distorts for a moment as the archmage attempts to regain his composure.>$B$BOf course, we should have guessed that this was what they were up to all along. Quickly, there\'s no time to waste.$B$BWyrmrest must be warned!' WHERE (`ID` = 12110);
|
||||
@@ -0,0 +1,30 @@
|
||||
-- DB update 2026_07_25_03 -> 2026_07_25_04
|
||||
--
|
||||
DELETE FROM `creature` WHERE (`id` = 24516) AND (`guid` IN (114439, 114440));
|
||||
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `Comment`, `CreateObject`, `VerifiedBuild`) VALUES
|
||||
(114439, 24516, 571, 0, 0, 1, 1, 0, 2319.6106, -3020.8176, 136.57187, 2.20952, 300, 0, 0, 0, 0, 2, 0, 0, 0, '', NULL, 1, 65512);
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` = 114439;
|
||||
INSERT INTO `creature_addon` (`guid`, `path_id`) VALUES
|
||||
(114439, 1144390);
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id` = 1144390;
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES
|
||||
(1144390, 1 , 2319.6106, -3020.8176, 136.57187, NULL),
|
||||
(1144390, 2 , 2293.5505, -3033.0613, 136.70703, NULL),
|
||||
(1144390, 3 , 2270.9585, -3049.1892, 136.7957, NULL),
|
||||
(1144390, 4 , 2261.9817, -3069.591, 137.1125, NULL),
|
||||
(1144390, 5 , 2244.4805, -3111.4001, 136.79797, NULL),
|
||||
(1144390, 6 , 2234.3372, -3129.741, 138.23094, NULL),
|
||||
(1144390, 7 , 2205.1501, -3149.454, 140.47078, NULL),
|
||||
(1144390, 8 , 2178.7832, -3143.6543, 139.04956, NULL),
|
||||
(1144390, 9 , 2159.131, -3118.843, 138.94107, NULL),
|
||||
(1144390, 10, 2157.4236, -3090.9448, 138.66618, NULL),
|
||||
(1144390, 11, 2184.6926, -3076.7776, 137.69681, NULL),
|
||||
(1144390, 12, 2205.2817, -3067.4485, 138.47263, NULL),
|
||||
(1144390, 13, 2241.1084, -3040.399, 136.02086, NULL),
|
||||
(1144390, 14, 2251.2544, -3001.0442, 135.393, NULL),
|
||||
(1144390, 15, 2261.8438, -2975.5894, 137.61548, NULL),
|
||||
(1144390, 16, 2288.5696, -2967.9568, 134.09793, NULL),
|
||||
(1144390, 17, 2312.0784, -2973.8508, 131.73712, NULL),
|
||||
(1144390, 18, 2327.24, -2996.011, 135.02109, NULL);
|
||||
@@ -0,0 +1,7 @@
|
||||
-- DB update 2026_07_25_04 -> 2026_07_25_05
|
||||
--
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (63510, 63514, 63531);
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(63510, 'spell_pal_improved_concentraction_aura_effect'),
|
||||
(63514, 'spell_pal_improved_devotion_aura_effect'),
|
||||
(63531, 'spell_pal_sanctified_retribution_effect');
|
||||
@@ -0,0 +1,102 @@
|
||||
-- DB update 2026_07_25_05 -> 2026_07_25_06
|
||||
DELETE FROM `spell_custom_attr` WHERE `spell_id` IN (6197, 11971, 12579, 14183, 15502, 17962, 27891, 28969, 29306, 29325, 30659, 32593, 32594, 34655, 35859, 38044, 38449, 40327, 40520, 43138, 45145, 45271, 45347, 45348, 45537, 49283, 49284, 49381, 49882, 50315, 50526, 52752, 53353, 54314, 54331, 54714, 55093, 55604, 55645, 56098, 58567, 58690, 58984, 59283, 59354, 59805, 61920, 62775, 63124, 63293, 63675, 63978, 64125, 64126, 64619, 64638, 65280, 65775, 66378, 66765, 66809, 67097, 67098, 67099, 67331, 67333, 67721, 67847, 67861, 67862, 67863, 68873, 70324, 71157, 72347, 72409, 72447, 72448, 72449, 72465, 72963, 72964, 72965, 72966, 74507);
|
||||
INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES
|
||||
-- SPELL_ATTR0_CU_CONE_BACK (0x2)
|
||||
(58690, 2), -- Cyanigosa, Tail Sweep
|
||||
(59283, 2), -- Cyanigosa, Tail Sweep
|
||||
-- SPELL_ATTR0_CU_CONE_LINE (0x4)
|
||||
(63293, 4), -- Mimiron - spinning damage
|
||||
(64619, 4), -- Ulduar, Mimiron, Emergency Fire Bot, Water Spray
|
||||
(68873, 4), -- Wailing Souls
|
||||
(70324, 4), -- Wailing Souls
|
||||
-- SPELL_ATTR0_CU_SHARE_DAMAGE (0x8)
|
||||
(66765, 8), -- Meteor Fists
|
||||
(66809, 8), -- Meteor Fists
|
||||
(67331, 8), -- Meteor Fists
|
||||
(67333, 8), -- Meteor Fists
|
||||
-- SPELL_ATTR0_CU_NO_INITIAL_THREAT (0x10)
|
||||
(6197, 16), -- Eagle Eye
|
||||
-- SPELL_ATTR0_CU_DONT_BREAK_STEALTH (0x40)
|
||||
(14183, 64), -- Premeditation
|
||||
-- SPELL_ATTR0_CU_NO_PVP_FLAG (0x80)
|
||||
(50315, 128), -- Disco Ball
|
||||
(58984, 128), -- Shadowmeld, issue #16626
|
||||
-- SPELL_ATTR0_CU_IGNORE_EVADE (0x800)
|
||||
(45537, 2048), -- Cosmetic - Lightning Beam Channel
|
||||
-- SPELL_ATTR0_CU_NEGATIVE_EFF0 (0x1000)
|
||||
(72347, 4096), -- Lock Players and Tap Chest (Gunship Battle)
|
||||
-- SPELL_ATTR0_CU_IGNORE_ARMOR (0x8000)
|
||||
(49882, 32768), -- Leviroth Self-Impale
|
||||
(62775, 32768), -- Ulduar: XT-002 Tympanic Tamparum
|
||||
(64125, 32768), -- Ulduar, Yogg-Saron, Squeeze
|
||||
(64126, 32768), -- Ulduar, Yogg-Saron, Squeeze
|
||||
(66378, 32768), -- Trial of the Crusader, Jaraxxus, Shivan Slash
|
||||
(67097, 32768), -- Trial of the Crusader, Jaraxxus, Shivan Slash
|
||||
(67098, 32768), -- Trial of the Crusader, Jaraxxus, Shivan Slash
|
||||
(67099, 32768), -- Trial of the Crusader, Jaraxxus, Shivan Slash
|
||||
(72409, 32768), -- Rune of Blood (Deathbringer Saurfang)
|
||||
(72447, 32768), -- Rune of Blood (Deathbringer Saurfang)
|
||||
(72448, 32768), -- Rune of Blood (Deathbringer Saurfang)
|
||||
(72449, 32768), -- Rune of Blood (Deathbringer Saurfang)
|
||||
-- SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET (0x20000)
|
||||
(63124, 131072), -- quest There's Something About the Squire (13654)
|
||||
-- SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET (0x40000)
|
||||
(43138, 262144), -- North Fleet Reservist Kill Credit
|
||||
-- SPELL_ATTR0_CU_BINARY_SPELL (0x100000)
|
||||
(45145, 1048576), -- Snake Trap Effect
|
||||
-- SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS (0x200000)
|
||||
(17962, 2097152), -- Conflagrate
|
||||
(32593, 2097152), -- Earth Shield aura
|
||||
(32594, 2097152), -- Earth Shield aura
|
||||
(49283, 2097152), -- Earth Shield aura
|
||||
(49284, 2097152), -- Earth Shield aura
|
||||
(50526, 2097152), -- Wandering Plague
|
||||
(52752, 2097152), -- Ancestral Awakening Heal
|
||||
(53353, 2097152), -- Chimera Shot - Serpent trigger
|
||||
(63675, 2097152), -- Improved Devouring Plague
|
||||
-- SPELL_ATTR0_CU_SINGLE_AURA_STACK (0x400000)
|
||||
(11971, 4194304), -- Sunder Armor
|
||||
(12579, 4194304), -- Player Winter's Chill
|
||||
(15502, 4194304), -- Sunder Armor
|
||||
(27891, 4194304), -- Naxxramas, Sludge Belcher, Acidic Sludge (10 normal)
|
||||
(28969, 4194304), -- Naxxramas, Crypt Guard, Acid Spit (10 normal)
|
||||
(29306, 4194304), -- Naxxramas (Gluth's Zombies): Infected Wound
|
||||
(29325, 4194304), -- Naxxramas, Stoneskin Gargoyle, Acid Volley (10 normal)
|
||||
(30659, 4194304), -- Hellfire Ramparts, Fel Infusion
|
||||
(34655, 4194304), -- Snake Trap, Deadly Poison
|
||||
(35859, 4194304), -- The Eye, Nether Vapor
|
||||
(38044, 4194304), -- Serpentshrine Cavern, Surge
|
||||
(38449, 4194304), -- Serpentshrine Cavern, Blessing of the Tides
|
||||
(40327, 4194304), -- Black Temple, Atrophy
|
||||
(40520, 4194304), -- Black Temple, Shade Soul Channel
|
||||
(45271, 4194304), -- Sunwell, Eredar Twins encounter, Dark Strike
|
||||
(45347, 4194304), -- Sunwell, Eredar Twins encounter, Dark Touched
|
||||
(45348, 4194304), -- Sunwell, Eredar Twins encounter, Flame Touched
|
||||
(49381, 4194304), -- Drak'tharon Keep, Consume
|
||||
(54314, 4194304), -- Azjol'Nerub Drain Power
|
||||
(54331, 4194304), -- Naxxramas, Sludge Belcher, Acidic Sludge (25 normal)
|
||||
(54714, 4194304), -- Naxxramas, Stoneskin Gargoyle, Acid Volley (25 normal)
|
||||
(55093, 4194304), -- Gundrak, Grip of Slad'ran
|
||||
(55604, 4194304), -- Naxxramas, Unrelenting Trainee, Death Plague (10 normal)
|
||||
(55645, 4194304), -- Naxxramas, Unrelenting Trainee, Death Plague (25 normal)
|
||||
(56098, 4194304), -- Naxxramas, Crypt Guard, Acid Spit (25 normal)
|
||||
(58567, 4194304), -- Player Sunder Armor
|
||||
(59354, 4194304), -- Azjol'Nerub Drain Power
|
||||
(59805, 4194304), -- Drak'tharon Keep, Consume
|
||||
(61920, 4194304), -- Ulduar (Spellbreaker): Supercharge
|
||||
(63978, 4194304), -- Ulduar (Rubble): Stone Nova
|
||||
(64638, 4194304), -- Ulduar, Winter Jormungar, Acidic Bite
|
||||
(65280, 4194304), -- Ulduar, Hodir, Singed
|
||||
(65775, 4194304), -- Anub'arak, Swarm Scarab, Acid-Drenched Mandibles (10 normal)
|
||||
(67721, 4194304), -- Anub'arak, Nerubian Burrower, Expose Weakness (normal)
|
||||
(67847, 4194304), -- Anub'arak, Nerubian Burrower, Expose Weakness (heroic)
|
||||
(67861, 4194304), -- Anub'arak, Swarm Scarab, Acid-Drenched Mandibles (25 normal)
|
||||
(67862, 4194304), -- Anub'arak, Swarm Scarab, Acid-Drenched Mandibles (10 heroic)
|
||||
(67863, 4194304), -- Anub'arak, Swarm Scarab, Acid-Drenched Mandibles (25 heroic)
|
||||
(71157, 4194304), -- Icecrown Citadel, Plagued Zombie, Infected Wound
|
||||
(72465, 4194304), -- Icecrown Citadel, Sindragosa, Respite for a Tormented Soul (weekly quest)
|
||||
(72963, 4194304), -- Icecrown Citadel, Rot Worm, Flesh Rot (10 normal)
|
||||
(72964, 4194304), -- Icecrown Citadel, Rot Worm, Flesh Rot (25 normal)
|
||||
(72965, 4194304), -- Icecrown Citadel, Rot Worm, Flesh Rot (10 heroic)
|
||||
(72966, 4194304), -- Icecrown Citadel, Rot Worm, Flesh Rot (25 heroic)
|
||||
(74507, 4194304); -- Ruby Sanctum, Siphoned Might
|
||||
@@ -0,0 +1,40 @@
|
||||
-- DB update 2026_07_25_06 -> 2026_07_25_07
|
||||
--
|
||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (6877,6880,6883,6885,6886);
|
||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
|
||||
(6885,6877,12,180,515,0,0),
|
||||
(6885,6880,9,180,515,0,0),
|
||||
(6885,6883,6,180,515,0,0),
|
||||
(6885,6885,0,0,515,0,0),
|
||||
(6885,6886,3,180,515,0,0);
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id`=68850;
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `velocity`, `delay`, `smoothTransition`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
|
||||
(68850,1,-6686.64,-2162.67,244.195,NULL,0,117750,0,0,0,100,0),
|
||||
(68850,2,-6698.09,-2166.71,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,3,-6724.88,-2177.67,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,4,-6754.51,-2188.96,244.145,NULL,0,0,0,0,0,100,0),
|
||||
(68850,5,-6789.04,-2200.47,244.127,NULL,0,0,0,0,0,100,0),
|
||||
(68850,6,-6836.76,-2216.8,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,7,-6842.6,-2224.08,243.735,NULL,0,0,0,0,0,100,0),
|
||||
(68850,8,-6831.41,-2224.13,244.326,NULL,0,0,0,0,0,100,0),
|
||||
(68850,9,-6819.23,-2217.24,244.193,NULL,0,0,0,0,0,100,0),
|
||||
(68850,10,-6779.18,-2201.85,244.142,NULL,0,0,0,0,0,100,0),
|
||||
(68850,11,-6742.57,-2187.83,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,12,-6704.67,-2180.27,244.325,NULL,0,0,0,0,0,100,0),
|
||||
(68850,13,-6696.46,-2187.56,247.256,NULL,0,0,0,0,0,100,0),
|
||||
(68850,14,-6675.44,-2195.12,247.47,NULL,0,0,0,0,0,100,0),
|
||||
(68850,15,-6657.14,-2204.38,246.199,NULL,0,0,0,0,0,100,0),
|
||||
(68850,16,-6639.98,-2211.67,244.322,NULL,0,0,0,0,0,100,0),
|
||||
(68850,17,-6622.15,-2237.86,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,18,-6609.55,-2297.66,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,19,-6602.49,-2337.11,244.564,NULL,0,0,0,0,0,100,0),
|
||||
(68850,20,-6593.68,-2338.02,244.451,NULL,0,0,0,0,0,100,0),
|
||||
(68850,21,-6597.48,-2311.3,244.163,NULL,0,0,0,0,0,100,0),
|
||||
(68850,22,-6608.46,-2282.16,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,23,-6615.97,-2237.53,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,24,-6638.14,-2204.14,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,25,-6664.19,-2186.06,244.144,NULL,0,0,0,0,0,100,0),
|
||||
(68850,26,-6689.15,-2168.01,244.145,NULL,0,0,0,0,0,100,0),
|
||||
(68850,27,-6690.26,-2159.42,244.145,NULL,0,0,0,0,0,100,0),
|
||||
(68850,28,-6686.64,-2162.67,244.195,NULL,0,150000,0,0,0,100,0);
|
||||
@@ -0,0 +1,11 @@
|
||||
-- DB update 2026_07_25_07 -> 2026_07_26_00
|
||||
-- --------------------------------------------------------------------------------------------
|
||||
-- Icecrown (Northrend, map 571)
|
||||
-- Vaelen the Flayed (Entry 30056, GUID 122535)
|
||||
-- Prevent NPC from attacking other NPCs while chained up
|
||||
-- -------------------------------------------
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 30056;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 30056) AND (`source_type` = 0) AND (`id` IN (1));
|
||||
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
|
||||
(30056, 0, 1, 0, 11, 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, 'Vaelen the Flayed - On Respawn - Set Reactstate Passive');
|
||||
@@ -0,0 +1,7 @@
|
||||
-- DB update 2026_07_26_00 -> 2026_07_26_01
|
||||
-- On 25-man, Faerlina's Frenzy is countered by Mind Controlling a Naxxramas
|
||||
-- Worshipper to cast Widow's Embrace, so the 25-man entry must not be
|
||||
-- charm-immune: -414 (with CHARM) -> -413 (same set without CHARM).
|
||||
-- The 10-man entry (16506) keeps -414: there the Worshipper cannot be MC'd
|
||||
-- and is killed next to Faerlina instead (casts Widow's Embrace on death).
|
||||
UPDATE `creature_template` SET `CreatureImmunitiesId` = -413 WHERE `entry` = 29274;
|
||||
@@ -0,0 +1,7 @@
|
||||
-- DB update 2026_07_26_01 -> 2026_07_26_02
|
||||
--
|
||||
-- Embalming Slime
|
||||
UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` = 29355;
|
||||
-- Patchwork Golem, Bile Retcher, and Sludge Belcher
|
||||
UPDATE `creature_template` SET `CreatureImmunitiesId` = -405 WHERE `entry` IN (16017, 16018, 29347, 29353);
|
||||
UPDATE `creature_template` SET `CreatureImmunitiesId` = -93 WHERE `entry` IN (16029, 29356);
|
||||
@@ -0,0 +1,25 @@
|
||||
-- DB update 2026_07_26_02 -> 2026_07_28_00
|
||||
--
|
||||
UPDATE `spell_area` SET `spell` = 44018 WHERE `spell` = 44017 AND `area` = 3990 AND `quest_start` = 11504 AND `aura_spell` = 0 AND `racemask` = 0 AND `gender` = 2;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2471300);
|
||||
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
|
||||
(2471300, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - Actionlist - Remove Npc Flags Gossip'),
|
||||
(2471300, 9, 1, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - Actionlist - Say Line'),
|
||||
(2471300, 9, 2, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - Actionlist - Set Faction 14'),
|
||||
(2471300, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - Actionlist - Start Attacking'),
|
||||
(2471300, 9, 4, 0, 0, 0, 100, 0, 30000, 30000, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - Actionlist - Add Npc Flags Gossip'),
|
||||
(2471300, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 2, 1888, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - Actionlist - Set Faction 1888');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 24713);
|
||||
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
|
||||
(24713, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - On Reset - Add Npc Flags Gossip'),
|
||||
(24713, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 2, 1888, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - On Reset - Set Faction 1888'),
|
||||
(24713, 0, 2, 0, 62, 0, 100, 0, 9335, 0, 0, 0, 0, 0, 80, 2471300, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Crowleg" Dan - On Gossip Option Selected - Run Script');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2453900);
|
||||
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
|
||||
(2453900, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '\'Silvermoon\' Harry - On Script - Say Line 0'),
|
||||
(2453900, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 83, 131, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Silvermoon" Harry - Actionlist - Remove Npc Flags Gossip & Questgiver & Vendor'),
|
||||
(2453900, 9, 2, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '"Silvermoon" Harry - Actionlist - Set Faction 14'),
|
||||
(2453900, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 10, 0, 0, 0, 0, 0, 0, 0, '"Silvermoon" Harry - Actionlist - Start Attacking');
|
||||
@@ -0,0 +1,162 @@
|
||||
-- DB update 2026_07_28_00 -> 2026_07_28_01
|
||||
--
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 24900);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(24900, 0, 0, 'Its power courses through me! I AM A GOD!', 12, 0, 100, 5, 0, 0, 23977, 0, 'Abdul the Insane'),
|
||||
(24900, 0, 1, 'ABDUL IS STRONG LIKE BULL!', 12, 0, 100, 5, 0, 0, 23978, 0, 'Abdul the Insane'),
|
||||
(24900, 0, 2, 'ARE YOU CHALLENGING ME? I HAVE THE STRENGTH OF TEN MEN!', 12, 0, 100, 5, 0, 0, 23979, 0, 'Abdul the Insane');
|
||||
|
||||
DELETE FROM `creature_template_addon` WHERE (`entry` = 24900);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(24900, 0, 0, 0, 1, 0, 0, '42459');
|
||||
|
||||
DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 24902);
|
||||
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES
|
||||
(24902, 0, 0, 1, 0, 0, 0, 0);
|
||||
|
||||
SET @CGUID := 131255;
|
||||
|
||||
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+60 AND `id` IN (24900, 24678, 24676, 24902);
|
||||
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `CreateObject`, `VerifiedBuild`) VALUES
|
||||
-- Abdul the Insane
|
||||
(@CGUID+0 , 24900, 571, 495, 4226, 1, 538.5657958984375, -3534.0439453125, 13.27492332458496093, 2.76789093017578125, 300, 2, 68887),
|
||||
-- ID - 29266 Permanent Feign Death
|
||||
-- Tuskarrs already added
|
||||
-- (@CGUID+1 , 24678, 571, 495, 4226, 1, 513.756103515625, -3475.178955078125, 3.054831266403198242, 4.328416347503662109, 300, 2, 68887),
|
||||
-- (@CGUID+2 , 24678, 571, 495, 4226, 1, 546.94964599609375, -3499.382080078125, 1.653660416603088378, 3.996803998947143554, 300, 2, 68887),
|
||||
-- (@CGUID+3 , 24678, 571, 495, 4226, 1, 550.87042236328125, -3473.961669921875, 6.492102622985839843, 1.082104086875915527, 300, 2, 68887),
|
||||
-- (@CGUID+4 , 24678, 571, 495, 4226, 1, 599.42919921875, -3485.27392578125, 3.573660135269165039, 1.396263360977172851, 300, 2, 68887),
|
||||
-- (@CGUID+5 , 24678, 571, 495, 4226, 1, 575.3487548828125, -3477.45263671875, 6.197434425354003906, 1.169370532035827636, 300, 2, 68887),
|
||||
-- (@CGUID+6 , 24678, 571, 495, 4226, 1, 563.58868408203125, -3447.75439453125, 12.59216117858886718, 3.892084121704101562, 300, 2, 68887),
|
||||
-- (@CGUID+7 , 24678, 571, 495, 4226, 1, 531.68231201171875, -3453.604248046875, 11.97931098937988281, 1.832595705986022949, 300, 2, 68887),
|
||||
(@CGUID+8 , 24676, 571, 495, 4226, 1, 534.32720947265625, -3539.286376953125, 13.35808563232421875, 2.111848354339599609, 300, 2, 68887),
|
||||
(@CGUID+9 , 24676, 571, 495, 4226, 1, 504.918731689453125, -3533.240478515625, 0.43048134446144104, 0.977384388446807861, 300, 2, 68887),
|
||||
(@CGUID+10, 24676, 571, 495, 4226, 1, 532.400390625, -3535.951904296875, 0.452539354562759399, 1.256637096405029296, 300, 2, 68887),
|
||||
(@CGUID+11, 24676, 571, 495, 4226, 1, 514.6165771484375, -3537.1767578125, 13.05911636352539062, 5.305800914764404296, 300, 2, 68887),
|
||||
(@CGUID+12, 24676, 571, 495, 4226, 1, 520.39453125, -3528.095458984375, 12.97960662841796875, 6.248278617858886718, 300, 2, 68887),
|
||||
(@CGUID+13, 24676, 571, 495, 4226, 1, 507.170318603515625, -3528.2158203125, 0.452536344528198242, 4.764749050140380859, 300, 2, 68887),
|
||||
(@CGUID+14, 24676, 571, 495, 4226, 1, 502.215240478515625, -3536.001953125, 7.773830413818359375, 5.567600250244140625, 300, 2, 68887),
|
||||
(@CGUID+15, 24676, 571, 495, 4226, 1, 498.7921142578125, -3526.788330078125, 18.84368896484375, 5.951572895050048828, 300, 2, 68887),
|
||||
(@CGUID+16, 24676, 571, 495, 4226, 1, 524.718017578125, -3538.3740234375, 13.1880807876586914, 0.506145477294921875, 300, 2, 68887),
|
||||
(@CGUID+17, 24676, 571, 495, 4226, 1, 518.16339111328125, -3538.41455078125, 7.774502277374267578, 6.230825424194335937, 300, 2, 68887),
|
||||
(@CGUID+18, 24676, 571, 495, 4226, 1, 515.48565673828125, -3536.5859375, 0.45254334807395935, 1.692969322204589843, 300, 2, 68887),
|
||||
(@CGUID+19, 24676, 571, 495, 4226, 1, 547.3468017578125, -3542.5078125, 4.519763469696044921, 0.977384388446807861, 300, 2, 68887),
|
||||
(@CGUID+20, 24676, 571, 495, 4226, 1, 533.98565673828125, -3531.822509765625, 13.15357398986816406, 4.834561824798583984, 300, 2, 68887),
|
||||
(@CGUID+21, 24676, 571, 495, 4226, 1, 520.6046142578125, -3529.746337890625, 7.774504661560058593, 3.351032257080078125, 300, 2, 68887),
|
||||
(@CGUID+22, 24676, 571, 495, 4226, 1, 507.74859619140625, -3525.21142578125, 7.773883342742919921, 6.021385669708251953, 300, 2, 68887),
|
||||
(@CGUID+23, 24676, 571, 495, 4226, 1, 499.4669189453125, -3529.2509765625, 12.82720661163330078, 3.490658521652221679, 300, 2, 68887),
|
||||
(@CGUID+24, 24676, 571, 495, 4226, 1, 503.6337890625, -3530.083251953125, 18.15540885925292968, 3.874630928039550781, 300, 2, 68887),
|
||||
(@CGUID+25, 24676, 571, 495, 4226, 1, 531.33056640625, -3540.401611328125, 7.774502277374267578, 4.328416347503662109, 300, 2, 68887),
|
||||
(@CGUID+26, 24676, 571, 495, 4226, 1, 490.982635498046875, -3527.24658203125, 7.772498607635498046, 4.729842185974121093, 300, 2, 68887),
|
||||
-- Relays
|
||||
(@CGUID+27, 24902, 571, 495, 4226, 0, 502.78961181640625, -3529.977783203125, 1.876146316528320312, 5.8817596435546875, 300, 2, 68887),
|
||||
(@CGUID+28, 24902, 571, 495, 4226, 0, 535.84027099609375, -3536.106689453125, 2.473374366760253906, 0.575958669185638427, 300, 2, 68887),
|
||||
(@CGUID+29, 24902, 571, 495, 4226, 0, 527.89703369140625, -3537.730224609375, 14.98894596099853515, 4.101523876190185546, 300, 2, 68887),
|
||||
(@CGUID+30, 24902, 571, 495, 4226, 0, 542.07421875, -3540.149658203125, 25.2296142578125, 1.65806281566619873, 300, 2, 68887),
|
||||
(@CGUID+31, 24902, 571, 495, 4226, 0, 503.9805908203125, -3535.368408203125, 15.09825325012207031, 1.413716673851013183, 300, 2, 68887),
|
||||
(@CGUID+32, 24902, 571, 495, 4226, 0, 510.803924560546875, -3532.58935546875, 28.18550300598144531, 0.314159274101257324, 300, 2, 68887),
|
||||
(@CGUID+33, 24902, 571, 495, 4226, 0, 533.3746337890625, -3540.956298828125, 9.142557144165039062, 3.909537553787231445, 300, 2, 68887),
|
||||
(@CGUID+34, 24902, 571, 495, 4226, 0, 512.82012939453125, -3538.3798828125, 14.82322120666503906, 3.944444179534912109, 300, 2, 68887),
|
||||
(@CGUID+35, 24902, 571, 495, 4226, 0, 539.58770751953125, -3539.770751953125, 34.4637908935546875, 4.852015495300292968, 300, 2, 68887),
|
||||
(@CGUID+36, 24902, 571, 495, 4226, 0, 544.17913818359375, -3536.342041015625, 18.80006599426269531, 0.680678427219390869, 300, 2, 68887),
|
||||
(@CGUID+37, 24902, 571, 495, 4226, 0, 514.40899658203125, -3533.298095703125, 20.05545234680175781, 5.969026088714599609, 300, 2, 68887),
|
||||
(@CGUID+38, 24902, 571, 495, 4226, 0, 526.3057861328125, -3531.612060546875, 9.31069183349609375, 3.385938644409179687, 300, 2, 68887),
|
||||
(@CGUID+39, 24902, 571, 495, 4226, 0, 514.2957763671875, -3521.106689453125, 29.82574272155761718, 4.904375076293945312, 300, 2, 68887),
|
||||
(@CGUID+40, 24902, 571, 495, 4226, 0, 512.51300048828125, -3522.553955078125, 40.32722854614257812, 5.724679946899414062, 300, 2, 68887),
|
||||
(@CGUID+41, 24902, 571, 495, 4226, 0, 507.89984130859375, -3537.92041015625, 37.27643585205078125, 5.462880611419677734, 300, 2, 68887),
|
||||
(@CGUID+42, 24902, 571, 495, 4226, 0, 507.966461181640625, -3525.26171875, 9.635132789611816406, 0.261799395084381103, 300, 2, 68887),
|
||||
(@CGUID+43, 24902, 571, 495, 4226, 0, 518.94781494140625, -3528.173583984375, 2.695600271224975585, 0.506145477294921875, 300, 2, 68887),
|
||||
(@CGUID+44, 24902, 571, 495, 4226, 0, 507.234375, -3540.390380859375, 17.92135429382324218, 1.151917338371276855, 300, 2, 68887),
|
||||
(@CGUID+45, 24902, 571, 495, 4226, 0, 547.06927490234375, -3542.5791015625, 6.49201059341430664, 6.2657318115234375, 300, 2, 68887),
|
||||
(@CGUID+46, 24902, 571, 495, 4226, 0, 540.0841064453125, -3546.8876953125, 18.93019866943359375, 4.677482128143310546, 300, 2, 68887),
|
||||
(@CGUID+47, 24902, 571, 495, 4226, 0, 544.32098388671875, -3534.352783203125, 26.10087966918945312, 5.689773082733154296, 300, 2, 68887),
|
||||
-- Live Crazed Slavers
|
||||
(@CGUID+48, 24676, 571, 495, 4226, 1, 584.24462890625, -3444.849609375, 15.61687374114990234, 4.455326557159423828, 300, 2, 68887),
|
||||
(@CGUID+49, 24676, 571, 495, 4226, 1, 603.7803955078125, -3474.509521484375, 5.77075958251953125, 2.223934412002563476, 300, 2, 68887),
|
||||
(@CGUID+50, 24676, 571, 495, 4226, 1, 528.7786865234375, -3464.49462890625, 7.305242538452148437, 2.169778823852539062, 300, 2, 68887),
|
||||
(@CGUID+51, 24676, 571, 495, 4226, 1, 542.29071044921875, -3448.540283203125, 12.66628646850585937, 5.86032724380493164, 300, 2, 68887),
|
||||
(@CGUID+52, 24676, 571, 495, 4226, 1, 511.39642333984375, -3439.80419921875, 11.89968109130859375, 4.935037612915039062, 300, 2, 68887),
|
||||
(@CGUID+53, 24676, 571, 495, 4226, 1, 608.0699462890625, -3455.2109375, 13.95431327819824218, 5.57839202880859375, 300, 2, 68887),
|
||||
(@CGUID+54, 24676, 571, 495, 4226, 1, 511.60784912109375, -3464.18994140625, 6.321629524230957031, 4.948744773864746093, 300, 2, 68887),
|
||||
(@CGUID+55, 24676, 571, 495, 4226, 1, 556.938232421875, -3454.048583984375, 11.112030029296875, 2.213882684707641601, 300, 2, 68887),
|
||||
(@CGUID+56, 24676, 571, 495, 4226, 1, 540.74676513671875, -3481.5888671875, 4.12340545654296875, 3.639571905136108398, 300, 2, 68887),
|
||||
(@CGUID+57, 24676, 571, 495, 4226, 1, 536.22503662109375, -3424.553955078125, 15.90343570709228515, 0.815584659576416015, 300, 2, 68887),
|
||||
(@CGUID+58, 24676, 571, 495, 4226, 1, 552.94879150390625, -3432.64306640625, 16.24846076965332031, 6.042760372161865234, 300, 2, 68887),
|
||||
(@CGUID+59, 24676, 571, 495, 4226, 1, 566.82171630859375, -3497.459228515625, 3.745334148406982421, 0.587951838970184326, 300, 2, 68887),
|
||||
(@CGUID+60, 24676, 571, 495, 4226, 1, 563.77935791015625, -3419.53369140625, 17.73925971984863281, 0.82975548505783081, 300, 2, 68887);
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+60;
|
||||
INSERT INTO `creature_addon` (`guid`, `path_id`, `bytes2`, `auras`) VALUES
|
||||
(@CGUID+0 , (@CGUID+0)*10, 1, '42459'),
|
||||
-- (@CGUID+1 , 0, 1, '29266'),
|
||||
-- (@CGUID+2 , 0, 1, '29266'),
|
||||
-- (@CGUID+3 , 0, 1, '29266'),
|
||||
-- (@CGUID+4 , 0, 1, '29266'),
|
||||
-- (@CGUID+5 , 0, 1, '29266'),
|
||||
-- (@CGUID+6 , 0, 1, '29266'),
|
||||
-- (@CGUID+7 , 0, 1, '29266'),
|
||||
(@CGUID+8 , 0, 1, '29266'),
|
||||
(@CGUID+9 , 0, 1, '29266'),
|
||||
(@CGUID+10, 0, 1, '29266'),
|
||||
(@CGUID+11, 0, 1, '29266'),
|
||||
(@CGUID+12, 0, 1, '29266'),
|
||||
(@CGUID+13, 0, 1, '29266'),
|
||||
(@CGUID+14, 0, 1, '29266'),
|
||||
(@CGUID+15, 0, 1, '29266'),
|
||||
(@CGUID+16, 0, 1, '29266'),
|
||||
(@CGUID+17, 0, 1, '29266'),
|
||||
(@CGUID+18, 0, 1, '29266'),
|
||||
(@CGUID+19, 0, 1, '29266'),
|
||||
(@CGUID+20, 0, 1, '29266'),
|
||||
(@CGUID+21, 0, 1, '29266'),
|
||||
(@CGUID+22, 0, 1, '29266'),
|
||||
(@CGUID+23, 0, 1, '29266'),
|
||||
(@CGUID+24, 0, 1, '29266'),
|
||||
(@CGUID+25, 0, 1, '29266'),
|
||||
(@CGUID+26, 0, 1, '29266');
|
||||
|
||||
UPDATE `creature` SET `MovementType` = 2 WHERE `guid` = @CGUID+0 AND `id` = 24900;
|
||||
DELETE FROM `waypoint_data` WHERE `id` = (@CGUID+0)*10;
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES
|
||||
((@CGUID+0)*10, 1 , 520.78326, -3528.5442, 12.9033985, NULL),
|
||||
((@CGUID+0)*10, 2 , 520.56726, -3528.5063, 12.90191, NULL),
|
||||
((@CGUID+0)*10, 3 , 518.361, -3528.121, 12.875548, NULL),
|
||||
((@CGUID+0)*10, 4 , 515.5044, -3527.6223, 12.961787, NULL),
|
||||
((@CGUID+0)*10, 5 , 515.0117, -3528.3594, 12.976471, NULL),
|
||||
((@CGUID+0)*10, 6 , 511.1382, -3527.1458, 17.459843, NULL),
|
||||
((@CGUID+0)*10, 7 , 508.55902, -3526.4094, 17.707817, NULL),
|
||||
((@CGUID+0)*10, 8 , 493.4898, -3522.895, 19.701223, NULL),
|
||||
((@CGUID+0)*10, 9 , 491.23422, -3526.7734, 19.972063, NULL),
|
||||
((@CGUID+0)*10, 10, 491.6969, -3530.882, 19.567657, NULL),
|
||||
((@CGUID+0)*10, 11, 506.23975, -3536.302, 17.600271, NULL),
|
||||
((@CGUID+0)*10, 12, 508.6644, -3526.426, 17.695713, NULL),
|
||||
((@CGUID+0)*10, 13, 515.59094, -3527.4902, 12.962172, NULL),
|
||||
((@CGUID+0)*10, 14, 516.2962, -3534.7651, 13.047868, NULL),
|
||||
((@CGUID+0)*10, 15, 515.4622, -3539.2668, 12.90454, NULL),
|
||||
((@CGUID+0)*10, 16, 525.41144, -3542.12, 13.014915, NULL),
|
||||
((@CGUID+0)*10, 17, 534.9085, -3545.4343, 13.161723, NULL),
|
||||
((@CGUID+0)*10, 18, 538.82996, -3540.1965, 13.375676, NULL),
|
||||
((@CGUID+0)*10, 19, 536.6614, -3533.3171, 13.121769, NULL),
|
||||
((@CGUID+0)*10, 20, 529.2123, -3530.3767, 12.970497, NULL);
|
||||
|
||||
UPDATE `creature` SET `MovementType` = 1, `wander_distance` = 10 WHERE `guid` BETWEEN @CGUID+48 AND @CGUID+60 AND `id` = 24676;
|
||||
|
||||
-- One Relay casts every 5s
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE (`entry` = 24902);
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = -(@CGUID+27));
|
||||
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
|
||||
(-(@CGUID+27), 0, 0, 0, 60, 0, 100, 0, 5000, 5000, 5000, 5000, 0, 0, 11, 44886, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Abdul Relay - On Update - Cast \'Storm\'s Fury Staff\'');
|
||||
|
||||
-- Spell only affects other Relays
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 44886) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 24902) AND (`ConditionValue3` = 0);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 44886, 0, 0, 31, 0, 3, 24902, 0, 0, 0, 0, '', 'Spell Storm\'s Fury Staff (44886) can only target Abdul Relay (24902)');
|
||||
|
||||
-- Abdul talks every now and then. Around 20s
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 24900;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 24900);
|
||||
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
|
||||
(24900, 0, 0, 0, 1, 0, 100, 0, 15000, 30000, 15000, 30000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Abdul the Insane - Out of Combat - Say Line');
|
||||
|
||||
-- Delete old Slavers
|
||||
DELETE FROM `creature` WHERE `guid` IN (104895,104897,104902,104903,104908,104909,104911,104912,104913,104915,104916) AND `id` = 24676;
|
||||
@@ -0,0 +1,19 @@
|
||||
-- DB update 2026_07_28_01 -> 2026_07_28_02
|
||||
--
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 17681;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 17681);
|
||||
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
|
||||
(17681, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 1768100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Expedition Researcher - On Just Summoned - Run Script'),
|
||||
(17681, 0, 1, 0, 34, 0, 100, 0, 8, 1, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Expedition Researcher - On Reached Point - Despawn Instant');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 1768100);
|
||||
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
|
||||
(1768100, 9, 0, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Expedition Researcher - Actionlist - Say Line'),
|
||||
(1768100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, -1592.8748, -10851.978, 57.814125, 0, 'Expedition Researcher - Actionlist - Move To Position');
|
||||
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 17681);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(17681, 0, 0, 'We\'re free! We\'re free!', 12, 7, 100, 0, 0, 0, 14346, 0, 'Expedition Researcher'),
|
||||
(17681, 0, 1, 'Woot! Thanks!', 12, 7, 100, 0, 0, 0, 14347, 0, 'Expedition Researcher'),
|
||||
(17681, 0, 2, 'By the forehead signet of Velen, I am saved!', 12, 7, 100, 0, 0, 0, 14348, 0, 'Expedition Researcher'),
|
||||
(17681, 0, 3, 'I knew Cornelius wouldn\'t leave us behind!', 12, 7, 100, 0, 0, 0, 14349, 0, 'Expedition Researcher');
|
||||
@@ -0,0 +1,136 @@
|
||||
-- DB update 2026_07_28_02 -> 2026_07_28_03
|
||||
--
|
||||
-- Quest 11529 "Sorlof's Booty": restore the sniffed cannon chain.
|
||||
--
|
||||
-- Clicking The Big Gun used to cast the damage spell itself, instantly, with the
|
||||
-- clicker as original caster - so Sorlof could be shelled from anywhere on the map by
|
||||
-- spamming the gun, and the player tagged him and looted his corpse. Sniffs show the
|
||||
-- click casts the primer, which starts the player's timed Big Gun Assault, which in
|
||||
-- turn has the gun fire Cannon Assault at Sorlof.
|
||||
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` = 24992;
|
||||
INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
|
||||
(24992, 45045, 3, 0); -- The Big Gun - Big Cannon Assault Primer
|
||||
|
||||
-- Resolve the nearby-entry target of Big Gun Assault to the gun the player is manning.
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 45013;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 45013, 0, 0, 31, 0, 3, 24992, 0, 0, 0, 0, '', 'Spell Big Gun Assault targets The Big Gun');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (45013, 45045);
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(45045, 'spell_sorlofs_booty_cannon_primer'),
|
||||
(45013, 'spell_sorlofs_booty_big_gun_assault');
|
||||
|
||||
--
|
||||
-- Sorlof shadows the Sister Mercy along the shore instead of walking his own loop.
|
||||
--
|
||||
-- The ship's stops carry departure events in TaxiPathNode.dbc (path 778), which
|
||||
-- MotionTransport::DoEventIfAny hands to her GameObjectAI; the script forwards each one
|
||||
-- to Sorlof as the path he takes to the matching shore position.
|
||||
UPDATE `gameobject_template` SET `ScriptName` = 'go_sister_mercy' WHERE `entry` = 187038; -- Sister Mercy
|
||||
|
||||
-- His movement, boulder assault and death are all script-driven now.
|
||||
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_sorlof' WHERE `entry` = 24914; -- Sorlof
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` = 24914 AND `source_type` = 0;
|
||||
|
||||
-- Sniffed spawn position; the AI walks him from here on the ship's first departure.
|
||||
UPDATE `creature` SET `position_x` = 97.17545, `position_y` = -4024.8862, `position_z` = 1.5117704, `orientation` = 2.606328010559082031, `MovementType` = 0 WHERE `guid` = 103278; -- Sorlof
|
||||
|
||||
-- The boulders land on these: crew triggers dotted over the Sister Mercy's decks and
|
||||
-- rigging. 44965 has no target cap, so the script picks one of them per throw.
|
||||
SET @CGUID := 73617;
|
||||
|
||||
-- Crew Triggers for Boulder Targets
|
||||
DELETE FROM `creature` WHERE `id` = 24973 AND `guid` BETWEEN @CGUID+0 AND @CGUID+26;
|
||||
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `CreateObject`, `VerifiedBuild`) VALUES
|
||||
(@CGUID+0 , 24973, 594, 495, 4077, -20.6305503845214843, 0.87925499677658081, 23.15439796447753906, 2.234021425247192382, 120, 1, 68887),
|
||||
(@CGUID+1 , 24973, 594, 495, 4077, -26.7290573120117187, 8.964938163757324218, 16.09914779663085937, 1.326450228691101074, 120, 1, 68887),
|
||||
(@CGUID+2 , 24973, 594, 495, 4077, -28.3763332366943359, 2.132025003433227539, 19.53076934814453125, 2.897246599197387695, 120, 1, 68887),
|
||||
(@CGUID+3 , 24973, 594, 495, 4077, -16.0938186645507812, 0.273838013410568237, 43.55142974853515625, 4.485496044158935546, 120, 1, 68887),
|
||||
(@CGUID+4 , 24973, 594, 495, 4077, -18.2567806243896484, 12.23450279235839843, 13.1617746353149414, 4.15388345718383789, 120, 1, 68887),
|
||||
(@CGUID+5 , 24973, 594, 495, 4077, -21.46112060546875, -0.04458500072360038, 26.67117500305175781, 1.064650893211364746, 120, 1, 68887),
|
||||
(@CGUID+6 , 24973, 594, 495, 4077, 1.346712946891784667, 13.24960041046142578, 20.16955184936523437, 1.326450228691101074, 120, 1, 68887),
|
||||
(@CGUID+7 , 24973, 594, 495, 4077, -10.768381118774414, 10.98365497589111328, 11.52657890319824218, 4.590215682983398437, 120, 1, 68887),
|
||||
(@CGUID+8 , 24973, 594, 495, 4077, 0.120067000389099121, 2.717941045761108398, 9.014368057250976562, 2.827433347702026367, 120, 1, 68887),
|
||||
(@CGUID+9 , 24973, 594, 495, 4077, -14.4963808059692382, 5.586709022521972656, 19.56297492980957031, 2.652900457382202148, 120, 1, 68887),
|
||||
(@CGUID+10, 24973, 594, 495, 4077, 2.856342077255249023, 0.252011001110076904, 39.62346649169921875, 2.216568231582641601, 120, 1, 68887),
|
||||
(@CGUID+11, 24973, 594, 495, 4077, 7.384247779846191406, 4.385578155517578125, 14.35732841491699218, 2.478367567062377929, 120, 1, 68887),
|
||||
(@CGUID+12, 24973, 594, 495, 4077, -4.44231891632080078, 1.441480040550231933, 30.1070098876953125, 0.104719758033752441, 120, 1, 68887),
|
||||
(@CGUID+13, 24973, 594, 495, 4077, -0.38327699899673461, 9.437303543090820312, 8.811459541320800781, 4.24114990234375, 120, 1, 68887),
|
||||
(@CGUID+14, 24973, 594, 495, 4077, -0.61927801370620727, 0.729270994663238525, 15.69870185852050781, 4.712388992309570312, 120, 1, 68887),
|
||||
(@CGUID+15, 24973, 594, 495, 4077, 2.437870979309082031, 10.67437362670898437, 3.100884199142456054, 5.602506637573242187, 120, 1, 68887),
|
||||
(@CGUID+16, 24973, 594, 495, 4077, 0.543250977993011474, 0.511954009532928466, 22.23152732849121093, 0.436332315206527709, 120, 1, 68887),
|
||||
(@CGUID+17, 24973, 594, 495, 4077, 5.890214920043945312, 0.641448020935058593, 56.5892181396484375, 3.228859186172485351, 120, 1, 68887),
|
||||
(@CGUID+18, 24973, 594, 495, 4077, 2.481215953826904296, -7.58693122863769531, 14.11674880981445312, 2.635447263717651367, 120, 1, 68887),
|
||||
(@CGUID+19, 24973, 594, 495, 4077, 28.58755874633789062, 7.992822170257568359, 20.73052597045898437, 5.009094715118408203, 120, 1, 68887),
|
||||
(@CGUID+20, 24973, 594, 495, 4077, 11.99658966064453125, 13.07939910888671875, 10.18214607238769531, 6.230825424194335937, 120, 1, 68887),
|
||||
(@CGUID+21, 24973, 594, 495, 4077, 21.87375259399414062, 12.49561214447021484, 9.61978912353515625, 3.246312379837036132, 120, 1, 68887),
|
||||
(@CGUID+22, 24973, 594, 495, 4077, 22.16750526428222656, 1.304870963096618652, 25.48061752319335937, 5.480333805084228515, 120, 1, 68887),
|
||||
(@CGUID+23, 24973, 594, 495, 4077, 25.33149147033691406, 0.86961299180984497, 46.09729766845703125, 6.213372230529785156, 120, 1, 68887),
|
||||
(@CGUID+24, 24973, 594, 495, 4077, 32.807464599609375, 3.295629024505615234, 20.36577415466308593, 5.585053443908691406, 120, 1, 68887),
|
||||
(@CGUID+25, 24973, 594, 495, 4077, 8.728032112121582031, 11.15651130676269531, 3.116890192031860351, 2.39110112190246582, 120, 1, 68887),
|
||||
(@CGUID+26, 24973, 594, 495, 4077, 20.87360382080078125, 10.74199485778808593, 3.112012147903442382, 4.607669353485107421, 120, 1, 68887);
|
||||
|
||||
-- Boulder Assault: 44965 picks a crew trigger inside its 200 yard reach, lands 44966 on
|
||||
-- it, and 44967 leaves Creeping Flames burning where it struck.
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 44965;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 44965, 0, 0, 31, 0, 3, 24973, 0, 0, 0, 0, '', 'Spell Boulder Assault targets Ellis Crew Trigger');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (44965, 44966);
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(44965, 'spell_sorlofs_booty_boulder_assault'),
|
||||
(44966, 'spell_sorlofs_booty_boulder_assault_hit');
|
||||
|
||||
-- Serverside Boulder Assault: triggers 44965 at the Ellis Crew Trigger every 3s.
|
||||
DELETE FROM `creature_addon` WHERE `guid` = 103278;
|
||||
INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(103278, 0, 0, 0, 1, 0, 3, '44964'); -- Sorlof
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (1032780, 1032781, 1032782, 1032783, 1032784, 1032785);
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES
|
||||
-- Pos 1 (spawn)
|
||||
(1032780, 1, 97.17545, -4024.8862, 1.5117704, NULL),
|
||||
-- Pos 2
|
||||
(1032781, 1, 101.15443, -3924.839, 2.2858443, NULL),
|
||||
(1032781, 2, 92.51937, -3893.2766, 1.7101376, NULL),
|
||||
(1032781, 3, 113.66331, -3885.0088, 3.9941988, NULL),
|
||||
-- Pos 3
|
||||
(1032782, 1, 170.00453, -3834.312, 1.0282993, NULL),
|
||||
-- Pos 4
|
||||
(1032783, 1, 234.34787, -3839.6567, 6.5361958, NULL),
|
||||
(1032783, 2, 260.00797, -3825.02, 4.976329, NULL),
|
||||
(1032783, 3, 279.02988, -3805.746, 4.17469, NULL),
|
||||
(1032783, 4, 266.36356, -3775.4158, 3.9740202, NULL),
|
||||
-- Pos 5
|
||||
(1032784, 1, 307.11368, -3802.3945, 2.1991935, NULL),
|
||||
(1032784, 2, 327.66074, -3807.0261, 2.548757, NULL),
|
||||
(1032784, 3, 356.2998, -3801.8398, 1.4324319, NULL),
|
||||
(1032784, 4, 390.81516, -3765.8672, 0.9260107, NULL),
|
||||
-- Return path (inferred - he died at the last position)
|
||||
(1032785, 1, 356.2998, -3801.8398, 1.4324319, NULL),
|
||||
(1032785, 2, 327.66074, -3807.0261, 2.548757, NULL),
|
||||
(1032785, 3, 307.11368, -3802.3945, 2.1991935, NULL),
|
||||
(1032785, 4, 266.36356, -3775.4158, 3.9740202, NULL),
|
||||
(1032785, 5, 279.02988, -3805.746, 4.17469, NULL),
|
||||
(1032785, 6, 260.00797, -3825.02, 4.976329, NULL),
|
||||
(1032785, 7, 234.34787, -3839.6567, 6.5361958, NULL),
|
||||
(1032785, 8, 170.00453, -3834.312, 1.0282993, NULL),
|
||||
(1032785, 9, 113.66331, -3885.0088, 3.9941988, NULL),
|
||||
(1032785, 10, 92.51937, -3893.2766, 1.7101376, NULL),
|
||||
(1032785, 11, 101.15443, -3924.839, 2.2858443, NULL),
|
||||
(1032785, 12, 97.17545, -4024.8862, 1.5117704, NULL);
|
||||
|
||||
DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 24992);
|
||||
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES
|
||||
(24992, 0, 0, 1, 1, 0, 0, 0);
|
||||
|
||||
UPDATE `creature_template` SET `flags_extra` = `flags_extra`|128 WHERE (`entry` = 23826);
|
||||
DELETE FROM `creature_template_addon` WHERE (`entry` = 23826);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(23826, 0, 0, 0, 0, 0, 0, '42460');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 24911);
|
||||
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
|
||||
(24911, 0, 0, 1, 60, 0, 100, 0, 3400, 6200, 3400, 6200, 0, 0, 11, 44961, 64, 0, 0, 0, 0, 10, 103278, 24914, 0, 0, 0, 0, 0, 0, 'Cursed Sea Dog - On Update - Cast \'Shoot\' at Sorlof'),
|
||||
(24911, 0, 1, 0, 61, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Cursed Sea Dog - On Cast \'Shoot\' - Say Line');
|
||||
@@ -0,0 +1,6 @@
|
||||
-- DB update 2026_07_28_03 -> 2026_07_28_04
|
||||
--
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (63036, 64064) AND `ScriptName` IN ('spell_mimiron_summon_rocket_strike', 'spell_mimiron_rocket_strike_aura');
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(63036, 'spell_mimiron_summon_rocket_strike'),
|
||||
(64064, 'spell_mimiron_rocket_strike_aura');
|
||||
@@ -0,0 +1,8 @@
|
||||
-- DB update 2026_07_28_04 -> 2026_07_28_05
|
||||
--
|
||||
-- Invisibility and Stealth Detection
|
||||
UPDATE `creature_template_addon` SET `auras` = '18950' WHERE (`entry` IN (16024, 29355));
|
||||
-- 3.0 speed
|
||||
UPDATE `creature_template` SET `speed_run` = 0.42857 WHERE (`entry` = 29355);
|
||||
-- mech=0x3C8B3E12(DISORIENTED|FEAR|SLEEP|SNARE|STUN|FREEZE|KNOCKOUT|POLYMORPH|BANISH|SHACKLE|HORROR|DAZE|DISCOVERY|IMMUNE_SHIELD|SAPPED)
|
||||
UPDATE `creature_template` SET `CreatureImmunitiesId` = -393 WHERE (`entry` IN (16024, 29355));
|
||||
@@ -0,0 +1,132 @@
|
||||
-- DB update 2026_07_28_05 -> 2026_07_29_00
|
||||
--
|
||||
UPDATE `creature_template` SET `ScriptName` = '' WHERE (`entry` = 23784);
|
||||
|
||||
DELETE FROM `script_waypoint` WHERE `entry` = 23784;
|
||||
|
||||
DELETE FROM `creature_template_addon` WHERE (`entry` = 23784);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(23784, 0, 0, 0, 1, 0, 0, '5680');
|
||||
|
||||
SET @CGUID := 117903;
|
||||
SET @PATH := @CGUID * 10;
|
||||
DELETE FROM `waypoint_data` WHERE `id`= @PATH;
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`) VALUES
|
||||
(@PATH, 1 , 1379.813, -6409.201, 1.539683, NULL, 0, 1),
|
||||
(@PATH, 2 , 1380.114, -6401.745, 2.517954, NULL, 0, 1),
|
||||
(@PATH, 3 , 1380.114, -6401.745, 2.517954, 1.523505, 11000, 1),
|
||||
(@PATH, 4 , 1394.768, -6387.708, 3.68069, NULL, 0, 1),
|
||||
(@PATH, 5 , 1405.694, -6380.924, 4.62476, NULL, 0, 1),
|
||||
(@PATH, 6 , 1416.18, -6370.656, 5.950443, NULL, 0, 1),
|
||||
(@PATH, 7 , 1425.048, -6361.604, 6.354269, NULL, 0, 1),
|
||||
(@PATH, 8 , 1427.955, -6350.528, 6.354269, NULL, 0, 1),
|
||||
(@PATH, 9 , 1424.617, -6340.581, 5.786398, NULL, 0, 1),
|
||||
(@PATH, 10, 1416.344, -6335.909, 5.705465, NULL, 0, 1),
|
||||
(@PATH, 11, 1404.921, -6335.286, 6.229269, NULL, 0, 1),
|
||||
(@PATH, 12, 1404.921, -6335.286, 6.229269, NULL, 0, 1),
|
||||
(@PATH, 13, 1400.859, -6340.079, 6.476339, NULL, 0, 1),
|
||||
(@PATH, 14, 1400.859, -6340.079, 6.476339, 3.994878, 9400, 1),
|
||||
(@PATH, 15, 1419.282, -6332.309, 5.531731, NULL, 0, 1),
|
||||
(@PATH, 16, 1428.454, -6335.082, 5.604269, NULL, 0, 1),
|
||||
(@PATH, 17, 1446.955, -6338.777, 7.95246, NULL, 0, 1),
|
||||
(@PATH, 18, 1457.27, -6343.141, 8.380317, NULL, 0, 1),
|
||||
(@PATH, 19, 1465.724, -6345.168, 7.788642, NULL, 0, 1),
|
||||
(@PATH, 20, 1465.724, -6345.168, 7.788642, 6.044203, 1600, 1),
|
||||
(@PATH, 21, 1471.415, -6347.916, 7.629934, NULL, 5000, 1),
|
||||
(@PATH, 22, 1461.322, -6337.461, 7.834174, NULL, 0, 1),
|
||||
(@PATH, 23, 1465.077, -6331.357, 7.562849, NULL, 0, 1),
|
||||
(@PATH, 24, 1475.621, -6327.219, 7.119575, NULL, 0, 1),
|
||||
(@PATH, 25, 1490.551, -6315.318, 8.244208, NULL, 0, 1),
|
||||
(@PATH, 26, 1497.682, -6311.022, 7.41413, NULL, 0, 1),
|
||||
(@PATH, 27, 1506.431, -6317.528, 7.372158, NULL, 10600, 1),
|
||||
(@PATH, 28, 1513.499, -6287.491, 5.818699, NULL, 0, 1),
|
||||
(@PATH, 29, 1513.937, -6277.724, 5.583104, NULL, 0, 1),
|
||||
(@PATH, 30, 1523.013, -6259.255, 4.599159, NULL, 0, 1),
|
||||
(@PATH, 31, 1538.941, -6220.414, 6.434206, NULL, 0, 1),
|
||||
(@PATH, 32, 1554.772, -6204.828, 6.688478, NULL, 0, 1),
|
||||
(@PATH, 33, 1566.746, -6192.293, 7.589974, NULL, 0, 1),
|
||||
(@PATH, 34, 1583.782, -6168.592, 8.31788, NULL, 0, 1),
|
||||
(@PATH, 35, 1588.554, -6163.325, 7.81916, NULL, 0, 1),
|
||||
(@PATH, 36, 1600.514, -6157.163, 8.667747, NULL, 0, 1),
|
||||
(@PATH, 37, 1615.063, -6157.817, 9.339622, NULL, 0, 1);
|
||||
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 23784) AND (`GroupID` IN (1, 5));
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(23784, 1, 0, 'Yes, let us leave... but not before we leave our Alliance hosts something to remember us by!', 12, 1, 100, 16, 0, 0, 22486, 0, 'Apothecary Hanes'),
|
||||
(23784, 5, 0, 'That\'ll teach you to mess with an apothecary, you motherless Alliance dogs!', 14, 1, 100, 14, 0, 0, 22491, 0, 'Apothecary Hanes');
|
||||
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 23784;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23784);
|
||||
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
|
||||
(23784, 0, 0 , 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2378400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Respawn - Run Script'),
|
||||
(23784, 0, 1 , 0, 1, 0, 100, 0, 30000, 30000, 30000, 30000, 0, 0, 5, 20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Out of Combat - Play Emote OneShotBeg if Near Lieutenant Celeyne'),
|
||||
(23784, 0, 2 , 0, 2, 0, 100, 0, 0, 75, 10000, 10000, 0, 0, 11, 17534, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Between 0-75% Health - Cast \'Healing Potion\''),
|
||||
(23784, 0, 3 , 0, 19, 0, 100, 0, 11241, 0, 0, 0, 0, 0, 80, 2378401, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Quest \'Trail of Fire\' Taken - Run Script'),
|
||||
(23784, 0, 4 , 0, 108, 0, 100, 0, 3, 1179030, 0, 0, 0, 0, 80, 2378402, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 3 Reached - Run Script'),
|
||||
(23784, 0, 5 , 0, 108, 0, 100, 0, 14, 1179030, 0, 0, 0, 0, 80, 2378403, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 14 Reached - Run Script'),
|
||||
(23784, 0, 6 , 0, 108, 0, 100, 0, 20, 1179030, 0, 0, 0, 0, 80, 2378404, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 20 Reached - Run Script'),
|
||||
(23784, 0, 7 , 0, 108, 0, 100, 0, 21, 1179030, 0, 0, 0, 0, 80, 2378405, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 21 Reached - Run Script'),
|
||||
(23784, 0, 8 , 0, 108, 0, 100, 0, 27, 1179030, 0, 0, 0, 0, 80, 2378406, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 27 Reached - Run Script'),
|
||||
(23784, 0, 9 , 0, 108, 0, 100, 0, 34, 1179030, 0, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 34 Reached - Say Line 7'),
|
||||
(23784, 0, 10, 0, 108, 0, 100, 0, 37, 1179030, 0, 0, 0, 0, 80, 2378407, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Point 37 Reached - Run Script'),
|
||||
(23784, 0, 11, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 6, 11241, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Just Died - Fail Quest \'Trail of Fire\''),
|
||||
(23784, 0, 12, 0, 19, 0, 100, 0, 11241, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - On Quest \'Trail of Fire\' Taken - Store Targetlist');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378400);
|
||||
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
|
||||
(2378400, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Set Flag Standstate Kneel'),
|
||||
(2378400, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 82, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Add Npc Flags Questgiver'),
|
||||
(2378400, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 2, 1933, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Set Faction 1933');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378401);
|
||||
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
|
||||
(2378401, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 91, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Remove FlagStandstate Kneel'),
|
||||
(2378401, 9, 1, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 0'),
|
||||
(2378401, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 2, 232, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Set Faction 232'),
|
||||
(2378401, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 1179030, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Start Path 1179030');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378402);
|
||||
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
|
||||
(2378402, 9, 0, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 1'),
|
||||
(2378402, 9, 1, 0, 0, 0, 100, 0, 4600, 4600, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 2');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378403);
|
||||
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
|
||||
(2378403, 9, 0, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 11, 42685, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Cast \'Burn\''),
|
||||
(2378403, 9, 1, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 3');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378404);
|
||||
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
|
||||
(2378404, 9, 0, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 11, 42685, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Cast \'Burn\'');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378405);
|
||||
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
|
||||
(2378405, 9, 0, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 11, 42685, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Cast \'Burn\''),
|
||||
(2378405, 9, 1, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 4');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378406);
|
||||
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
|
||||
(2378406, 9, 0, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 11, 42685, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Cast \'Burn\''),
|
||||
(2378406, 9, 1, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 0, 5, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Play Emote 11'),
|
||||
(2378406, 9, 2, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 5'),
|
||||
(2378406, 9, 3, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 6');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2378407);
|
||||
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
|
||||
(2378407, 9, 0, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Set Orientation Stored'),
|
||||
(2378407, 9, 1, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Say Line 8'),
|
||||
(2378407, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 26, 11241, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Quest Credit \'Trail of Fire\''),
|
||||
(2378407, 9, 3, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Hanes - Actionlist - Despawn Instant');
|
||||
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 23968;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23968);
|
||||
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
|
||||
(23968, 0, 0, 0, 8, 0, 100, 0, 42685, 0, 0, 0, 0, 0, 50, 182071, 60000, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hanes Fire Trigger - On Spellhit \'Burn\' - Summon Gameobject \'Small Chapel Fire\'');
|
||||
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 42685) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 23968) AND (`ConditionValue3` = 0);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 42685, 0, 0, 31, 0, 3, 23968, 0, 0, 0, 0, '', 'Spell \'Burn\' (42685) from \'Trail of Fire\' (11241) Quest Requires Target \'Hanes Fire Trigger\' (23968)');
|
||||
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 2) AND (`SourceEntry` = 23784) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 29) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 23964) AND (`ConditionValue2` = 5) AND (`ConditionValue3` = 0);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(22, 2, 23784, 0, 0, 29, 1, 23964, 5, 0, 0, 0, 0, '', 'Apothecary Hanes (23784) will only emote Beg when near an alive Lieutenant Celeyne (23964)');
|
||||
@@ -0,0 +1,104 @@
|
||||
-- DB update 2026_07_29_00 -> 2026_07_30_00
|
||||
--
|
||||
DELETE FROM `creature_template_addon` WHERE (`entry` = 24051);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(24051, 0, 0, 0, 1, 0, 0, '42865');
|
||||
|
||||
DELETE FROM `creature_template_addon` WHERE (`entry` = 24063);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(24063, 0, 0, 0, 0, 0, 0, '42865');
|
||||
|
||||
-- Empty equip_template to not throw errors
|
||||
DELETE FROM `creature_equip_template` WHERE (`CreatureID` = 24063);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES
|
||||
(24063, 1, 0, 0, 0, 68887);
|
||||
|
||||
UPDATE `creature_template` SET `lootid` = 0 WHERE (`entry` = 24063);
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry` = 24063;
|
||||
|
||||
UPDATE `creature_template` SET `flags_extra` = `flags_extra`|64|134217728, `detection_range` = 20 WHERE (`entry` IN (24051, 24063));
|
||||
|
||||
UPDATE `creature_template` SET `speed_walk` = 1, `speed_run` = 1.142857 WHERE (`entry` = 24063);
|
||||
|
||||
-- Delete old ones
|
||||
DELETE FROM `creature` WHERE (`id` = 24063) AND (`guid` BETWEEN 120557 AND 120561);
|
||||
DELETE FROM `creature` WHERE (`id` = 24051) AND (`guid` BETWEEN 118766 AND 118773);
|
||||
DELETE FROM `creature_addon` WHERE (`guid` BETWEEN 120557 AND 120561);
|
||||
DELETE FROM `creature_addon` WHERE (`guid` BETWEEN 118766 AND 118773);
|
||||
DELETE FROM `waypoint_data` WHERE (`id` BETWEEN 1205570 AND 1205610);
|
||||
DELETE FROM `waypoint_data` WHERE (`id` BETWEEN 1187660 AND 1187730);
|
||||
|
||||
SET @CGUID := 12804;
|
||||
|
||||
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID AND @CGUID+6 AND `id` = 24051;
|
||||
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `CreateObject`, `VerifiedBuild`) VALUES
|
||||
(@CGUID+0, 24051, 571, 495, 3981, 1, 733.43774, -4872.8115, 5.9952602, 2.02116, 120, 1, 68887),
|
||||
(@CGUID+1, 24051, 571, 495, 3981, 1, 811.02466, -4967.3896, 1.8235762, 0.0481025, 120, 1, 68887),
|
||||
(@CGUID+2, 24051, 571, 495, 3981, 1, 798.0802, -4867.249, -0.5787722, 0.366519, 120, 1, 68887),
|
||||
(@CGUID+3, 24051, 571, 495, 3981, 1, 780.9059, -4882.871, 0.5644784, 3.03564, 120, 1, 68887),
|
||||
(@CGUID+4, 24051, 571, 495, 3981, 1, 783.75476, -4949.7236, 1.654979, 3.02413, 120, 1, 68887),
|
||||
(@CGUID+5, 24051, 571, 495, 3981, 1, 794.9075, -4874.745, -0.62727714, 3.11962, 120, 1, 68887),
|
||||
(@CGUID+6, 24051, 571, 495, 3981, 1, 803.7593, -4924.593, 0.1089665, 3.11962, 120, 1, 68887);
|
||||
|
||||
DELETE FROM `creature_multispawn` WHERE `spawnId` BETWEEN @CGUID+0 AND @CGUID+6 AND `entry` = 24063;
|
||||
INSERT INTO `creature_multispawn` (`spawnId`, `entry`) VALUES
|
||||
(@CGUID+0, 24063),
|
||||
(@CGUID+1, 24063),
|
||||
(@CGUID+2, 24063),
|
||||
(@CGUID+3, 24063),
|
||||
(@CGUID+4, 24063),
|
||||
(@CGUID+5, 24063),
|
||||
(@CGUID+6, 24063);
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id` BETWEEN (@CGUID+0)*10 AND (@CGUID+6)*10;
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `move_type`) VALUES
|
||||
-- X: 733.43774 Y: -4872.8115 Z: 5.9952602
|
||||
((@CGUID+0)*10, 1, 732.7387, -4884.812, 3.0737715, NULL, 1),
|
||||
((@CGUID+0)*10, 2, 719.05145, -4894.5073, 6.2719183, NULL, 1),
|
||||
((@CGUID+0)*10, 3, 697.83594, -4907.74, 6.1251554, NULL, 1),
|
||||
-- X: 811.02466 Y: -4967.3896 Z: 1.8235762
|
||||
((@CGUID+1)*10, 1, 744.038, -4960.3228, 2.330449, NULL, 1),
|
||||
((@CGUID+1)*10, 2, 727.86505, -4985.579, 5.602709, NULL, 1),
|
||||
((@CGUID+1)*10, 3, 722.78345, -4988.4126, 6.404078, NULL, 1),
|
||||
-- X: 798.0802 Y: -4867.249 Z: -0.5787722
|
||||
((@CGUID+2)*10, 1, 741.7717, -4904.015, 3.1975787, NULL, 1),
|
||||
((@CGUID+2)*10, 2, 734.9463, -4927.025, 6.25686, NULL, 1),
|
||||
((@CGUID+2)*10, 3, 719.4844, -4935.973, 6.7613916, NULL, 1),
|
||||
-- X: 780.9059 Y: -4882.871 Z: 0.5644784
|
||||
((@CGUID+3)*10, 1, 730.73535, -4893.994, 4.5011435, NULL, 1),
|
||||
((@CGUID+3)*10, 2, 704.7542, -4905.6694, 7.276061, NULL, 1),
|
||||
((@CGUID+3)*10, 3, 709.357, -4927.3623, 7.2387867, NULL, 1),
|
||||
-- X: 783.75476 Y: -4949.7236 Z: 1.654979
|
||||
((@CGUID+4)*10, 1, 728.9895, -4940.7905, 6.076869, NULL, 1),
|
||||
((@CGUID+4)*10, 2, 715.9845, -4970.6724, 6.0854883, NULL, 1),
|
||||
-- X: 794.9075 Y: -4874.745 Z: -0.62727714
|
||||
((@CGUID+5)*10, 1, 738.62933, -4915.262, 5.2849817, NULL, 1),
|
||||
((@CGUID+5)*10, 2, 731.65607, -4927.6084, 6.734372, NULL, 1),
|
||||
((@CGUID+5)*10, 3, 712.5723, -4926.47, 7.523102, NULL, 1),
|
||||
-- X: 803.7593 Y: -4924.593 Z: 0.1089665
|
||||
((@CGUID+6)*10, 1, 739.2899, -4937.828, 5.6794043, NULL, 1),
|
||||
((@CGUID+6)*10, 2, 719.42474, -4959.9834, 4.882431, NULL, 1);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 24051);
|
||||
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
|
||||
(24051, 0, 0, 0, 9, 0, 100, 0, 5700, 11700, 5700, 11700, 8, 25, 11, 27577, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - Within 8-25 Range - Cast \'Intercept\''),
|
||||
(24051, 0, 1, 0, 9, 0, 100, 0, 8700, 14700, 8700, 14700, 10, 25, 11, 42870, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - Within 10-25 Range - Cast \'Throw Dragonflayer Harpoon\''),
|
||||
(24051, 0, 2, 0, 4, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Aggro - Say Line'),
|
||||
(24051, 0, 3, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 5000, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Just Died - Despawn In 5000 ms'),
|
||||
(24051, 0, 4, 0, 109, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 19, 23739, 60, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Path Finished - Start Attacking');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 24063);
|
||||
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
|
||||
(24063, 0, 0, 0, 0, 0, 70, 0, 5000, 10000, 5000, 10000, 0, 0, 11, 7367, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Worg - In Combat - Cast \'Infected Bite\''),
|
||||
(24063, 0, 1, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 5000, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Worg - On Just Died - Despawn In 5000 ms'),
|
||||
(24063, 0, 2, 0, 109, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 19, 23739, 60, 0, 0, 0, 0, 0, 0, 'Dragonflayer Worg - On Path Finished - Start Attacking');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` BETWEEN -(@CGUID+6) AND -(@CGUID+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
|
||||
(-(@CGUID+0), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+0)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path'),
|
||||
(-(@CGUID+1), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+1)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path'),
|
||||
(-(@CGUID+2), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+2)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path'),
|
||||
(-(@CGUID+3), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+3)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path'),
|
||||
(-(@CGUID+4), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+4)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path'),
|
||||
(-(@CGUID+5), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+5)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path'),
|
||||
(-(@CGUID+6), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, (@CGUID+6)*10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonflayer Invader - On Respawn - Start Path');
|
||||
@@ -0,0 +1,6 @@
|
||||
-- DB update 2026_07_30_00 -> 2026_07_31_00
|
||||
--
|
||||
DELETE FROM `creature_template_model` WHERE (`CreatureID` = 24701);
|
||||
INSERT INTO `creature_template_model` (`CreatureID`, `Idx`, `CreatureDisplayID`, `DisplayScale`, `Probability`, `VerifiedBuild`) VALUES
|
||||
(24701, 1, 17188, 1, 0, 51831),
|
||||
(24701, 0, 22522, 1, 1, 51831);
|
||||
@@ -0,0 +1,3 @@
|
||||
-- DB update 2026_07_31_00 -> 2026_07_31_01
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` = 57572 AND `ScriptName` = 'spell_sartharion_lava_strike';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (57572, 'spell_sartharion_lava_strike');
|
||||
@@ -0,0 +1,16 @@
|
||||
-- DB update 2026_07_31_01 -> 2026_07_31_02
|
||||
--
|
||||
-- Zeppelin, Alliance - Westguard Keep to Shattered Straits (taxi path 727)
|
||||
UPDATE `gameobject_template` SET `ScriptName` = 'go_transport_westguard_zeppelin' WHERE (`entry` = 186371);
|
||||
|
||||
-- Harrowmeiser - dock announcements, fired from the taxi arrival event 15431
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 23823);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(23823, 0, 0, 'My zeppelin has docked. Despite my being held captive, and the sorry state that she\'s in, she\'ll be departing the dock again in two minutes.', 14, 0, 100, 0, 0, 0, 22336, 0, 'Harrowmeiser - Arrival'),
|
||||
(23823, 1, 0, 'The zeppelin\'s leaving for a tour around the bay in less than one minute! Oh, and if anyone feels like setting me free, I\'m on the dock.', 14, 0, 100, 0, 0, 0, 22337, 0, 'Harrowmeiser - Departure');
|
||||
|
||||
-- Harrowmeiser and Bombardier Petrov - gossip text picked from the zeppelin's path
|
||||
-- progress, which also pushes the world state that npc_text 11322 and 11332 substitute
|
||||
-- into "in less than $3078w minutes"
|
||||
UPDATE `creature_template` SET `ScriptName` = 'npc_harrowmeiser' WHERE (`entry` = 23823);
|
||||
UPDATE `creature_template` SET `ScriptName` = 'npc_bombardier_petrov' WHERE (`entry` = 23895);
|
||||
@@ -0,0 +1,123 @@
|
||||
-- DB update 2026_07_31_02 -> 2026_08_01_00
|
||||
--
|
||||
UPDATE `creature_template` SET `npcflag` = 3 WHERE (`entry` IN (28070, 31366));
|
||||
|
||||
DELETE FROM `gossip_menu_option` WHERE (`MenuID` = 9669);
|
||||
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
|
||||
(9669, 37476, 0, 'Brann, it would be our honor!', 27614, 1, 1, 0, 0, 0, 0, '', 0, 0);
|
||||
|
||||
DELETE FROM `gossip_menu_option` WHERE (`MenuID` = 9670);
|
||||
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
|
||||
(9670, 36142, 0, 'Let\'s move Brann, enough of the history lesson!', 27616, 1, 1, 0, 0, 0, 0, '', 0, 0);
|
||||
|
||||
DELETE FROM `gossip_menu_option` WHERE (`MenuID` = 10206);
|
||||
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
|
||||
(10206, 36412, 0, 'There will be plenty of time for this later Brann, we need to get moving!', 33002, 1, 1, 0, 0, 0, 0, '', 0, 0);
|
||||
|
||||
DELETE FROM `gossip_menu_option` WHERE (`MenuID` = 10012);
|
||||
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
|
||||
(10012, 36236, 0, 'We\'re with you Brann! Open it!', 31547, 1, 1, 0, 0, 0, 0, '', 0, 0);
|
||||
|
||||
-- Summon Groups. They have the same position, yes
|
||||
DELETE FROM `creature_summon_groups` WHERE `summonerId` = 28070 AND `summonerType` = 0;
|
||||
INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES
|
||||
(28070, 0, 0, 27983, 943.0883, 401.3776, 206.16098, 3.804817676544189453, 6, 20000, 'Halls of Stone Tribunal - Dark Rune Protector Group'),
|
||||
(28070, 0, 0, 27983, 943.0883, 401.3776, 206.16098, 3.804817676544189453, 6, 20000, 'Halls of Stone Tribunal - Dark Rune Protector Group'),
|
||||
(28070, 0, 0, 27983, 943.0883, 401.3776, 206.16098, 3.804817676544189453, 6, 20000, 'Halls of Stone Tribunal - Dark Rune Protector Group'),
|
||||
(28070, 0, 1, 27984, 967.0001, 376.83203, 206.16098, 3.804817676544189453, 6, 20000, 'Halls of Stone Tribunal - Dark Rune Stormcaller Group'),
|
||||
(28070, 0, 1, 27984, 967.0001, 376.83203, 206.16098, 3.804817676544189453, 6, 20000, 'Halls of Stone Tribunal - Dark Rune Stormcaller Group'),
|
||||
(28070, 0, 2, 27985, 964.302, 381.94174, 206.16098, 3.857177734375, 6, 20000, 'Halls of Stone Tribunal - Golem Custodian Group');
|
||||
|
||||
-- CreatureText
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 28070);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(28070, 0, 0, 'Now that\'s earnin\' your supper!', 14, 0, 100, 0, 0, 14244, 30525, 0, 'brann SAY_KILL_1'),
|
||||
(28070, 0, 1, 'Press on; that\'s the way!', 14, 0, 100, 0, 0, 14245, 30526, 0, 'brann SAY_KILL_2'),
|
||||
(28070, 0, 2, 'Keep it up now. Plenty of death-dealing for everyone!', 14, 0, 100, 0, 0, 14246, 0, 0, 'brann SAY_KILL_3'),
|
||||
(28070, 1, 0, 'I\'m all kinds of busted up... might not... make it.', 14, 0, 100, 0, 0, 14257, 28121, 0, 'brann SAY_LOW_HEALTH'),
|
||||
(28070, 2, 0, 'Not yet... not ye--', 14, 0, 100, 0, 0, 14258, 30522, 0, 'brann SAY_DEATH'),
|
||||
(28070, 3, 0, 'I\'m doin\' everything I can!', 14, 0, 100, 0, 0, 14260, 30562, 0, 'brann SAY_PLAYER_DEATH_1'),
|
||||
(28070, 3, 1, 'Light preserve ye!', 14, 0, 100, 0, 0, 14261, 30563, 0, 'brann SAY_PLAYER_DEATH_2'),
|
||||
(28070, 3, 2, 'I hope this is all worth it!', 14, 0, 100, 0, 0, 14262, 30564, 0, 'brann SAY_PLAYER_DEATH_3'),
|
||||
(28070, 4, 0, 'Time to get some answers! Let\'s get this show on the road!', 14, 0, 100, 0, 0, 14259, 30561, 0, 'brann SAY_ESCORT_START'),
|
||||
(28070, 5, 0, 'Don\'t worry! Ol\' Brann\'s got yer back! Keep that metal monstrosity busy, and I\'ll see if I can\'t sweet talk this machine into helping ye!', 14, 0, 100, 0, 0, 14274, 31555, 0, 'brann SAY_SPAWN_DWARF'),
|
||||
(28070, 6, 0, 'This is a wee bit trickier than before... Oh, bloody--incomin\'!', 14, 0, 100, 0, 0, 14275, 27589, 0, 'brann SAY_SPAWN_TROGG'),
|
||||
(28070, 7, 0, 'What in the name o\' Madoran did THAT do? Oh! Wait: I just about got it...', 14, 0, 100, 0, 0, 14276, 27590, 0, 'brann SAY_SPAWN_OOZE'),
|
||||
(28070, 8, 0, 'Ha, that did it! Help\'s a-comin\'! Take this, ya glowin\' iron brute!', 14, 0, 100, 0, 0, 14277, 27591, 0, 'brann SAY_SPAWN_EARTHEN'),
|
||||
(28070, 9, 0, 'Take a moment and relish this with me. Soon... all will be revealed. Okay then, let\'s do this!', 14, 0, 100, 4, 0, 14247, 30523, 0, 'brann SAY_EVENT_INTRO_1'),
|
||||
(28070, 10, 0, 'Now keep an eye out! I\'ll have this licked in two shakes of a--', 14, 0, 100, 432, 0, 14248, 30552, 0, 'brann SAY_EVENT_INTRO_2'),
|
||||
(28070, 11, 0, 'Oh, that doesn\'t sound good. We might have a complication or two...', 14, 0, 100, 1, 0, 14249, 30553, 0, 'brann SAY_EVENT_A_1'),
|
||||
(28070, 12, 0, 'Ah, you want to play hardball, eh? That\'s just my game!', 14, 0, 100, 0, 0, 14250, 30554, 0, 'brann SAY_EVENT_A_3'),
|
||||
(28070, 13, 0, 'Couple more minutes and I\'ll--', 14, 0, 100, 0, 0, 14251, 30555, 0, 'brann SAY_EVENT_B_1'),
|
||||
(28070, 14, 0, 'Heightened? What\'s the good news?', 14, 0, 100, 0, 0, 14252, 30556, 0, 'brann SAY_EVENT_B_3'),
|
||||
(28070, 15, 0, 'So that was the problem? Now I\'m makin\' progress...', 14, 0, 100, 0, 0, 14253, 30557, 0, 'brann SAY_EVENT_C_1'),
|
||||
(28070, 16, 0, 'Hang on! Nobody\'s gonna\' be sanitized as long as I have a say in it!', 14, 0, 100, 0, 0, 14254, 30558, 0, 'brann SAY_EVENT_C_3'),
|
||||
(28070, 17, 0, 'Ha! The old magic fingers finally won through! Now let\'s get down to--', 14, 0, 100, 0, 0, 14255, 30559, 0, 'brann SAY_EVENT_D_1'),
|
||||
(28070, 18, 0, 'Purge? No no no no no.. where did I-- Aha, this should do the trick...', 14, 0, 100, 0, 0, 14256, 30560, 0, 'brann SAY_EVENT_D_3'),
|
||||
(28070, 19, 0, 'Query? What do you think I\'m here for, tea and biscuits? Spill the beans already!', 14, 0, 100, 0, 0, 14263, 30565, 0, 'brann SAY_EVENT_END_01'),
|
||||
(28070, 20, 0, 'Tell me how the dwarves came to be, and start at the beginning!', 14, 0, 100, 0, 0, 14264, 30566, 0, 'brann SAY_EVENT_END_02'),
|
||||
(28070, 21, 0, 'Right, right... I know the earthen were made from stone to shape the deep regions o\' the world. But what about the anomalies? Matrix non-stabilizin\' and what-not?', 14, 0, 100, 0, 0, 14265, 30567, 0, 'brann SAY_EVENT_END_04'),
|
||||
(28070, 22, 0, 'Necrowhatinthe-- Speak bloody Common, will ye?', 14, 0, 100, 0, 0, 14266, 30568, 0, 'brann SAY_EVENT_END_06'),
|
||||
(28070, 23, 0, 'Old Gods, huh? So they zapped the earthen with this Curse of Flesh... and then what?', 14, 0, 100, 0, 0, 14267, 30577, 0, 'brann SAY_EVENT_END_08'),
|
||||
(28070, 24, 0, 'If they killed the Old Gods, Azeroth would\'ve been destroyed...', 14, 0, 100, 0, 0, 14268, 30578, 0, 'brann SAY_EVENT_END_10'),
|
||||
(28070, 25, 0, 'What protectors?', 14, 0, 100, 0, 0, 14269, 30579, 0, 'brann SAY_EVENT_END_12'),
|
||||
(28070, 26, 0, 'Aesir and Vanir... Okay, so the Forge o\' Wills started makin\' new earthen... but what happened to the old ones?', 14, 0, 100, 0, 0, 14270, 30580, 0, 'brann SAY_EVENT_END_14'),
|
||||
(28070, 27, 0, 'Hold everything! The Aesir and Vanir went to war? Why?', 14, 0, 100, 0, 0, 14271, 30581, 0, 'brann SAY_EVENT_END_16'),
|
||||
(28070, 28, 0, 'This "Loken" sounds like a nasty character. Glad we don\'t have to worry about the likes o\' him anymore. So... if I\'m understandin\' ye right, the original earthen eventually woke up from this stasis, and by that time the destabili-whatever had turned \'em into proper dwarves. Or at least... dwarf ancestors.', 14, 0, 100, 0, 0, 14272, 30582, 0, 'brann SAY_EVENT_END_18'),
|
||||
(28070, 29, 0, 'Well, now... that\'s a lot to digest. I\'m gonna need some time to take all this in. Thank ye.', 14, 0, 100, 0, 0, 14273, 30583, 0, 'brann SAY_EVENT_END_20'),
|
||||
(28070, 30, 0, 'Loken?! That\'s downright bothersome... We might\'ve neutralized the iron dwarves, but I\'d lay odds there\'s another machine somewhere else churnin\' out a whole mess o\' these iron vrykul!', 14, 0, 100, 1, 0, 14278, 28591, 0, 'brann SAY_VICTORY_SJONNIR_1'),
|
||||
(28070, 31, 0, 'I\'ll use the forge to make batches o\' earthen to stand guard... But our greatest challenge still remains: find and stop Loken!', 14, 0, 100, 1, 0, 14279, 30584, 0, 'brann SAY_VICTORY_SJONNIR_2'),
|
||||
(28070, 32, 0, 'I think it\'s time to see what\'s behind the door near the entrance. I\'m going to sneak over there, nice and quiet. Meet me at the door and I\'ll get us in.', 14, 0, 100, 0, 0, 0, 31660, 0, 'brann SAY_ENTRANCE_MEET');
|
||||
|
||||
-- Abedneum (30899) creature_text
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 30899);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(30899, 0, 0, 'Warning: life form pattern not recognized. Archival processing terminated. Continued interference will result in targeted response.', 14, 0, 100, 0, 0, 13765, 29561, 0, 'abedneum SAY_WARNING'),
|
||||
(30899, 1, 0, 'Critical threat index. Void analysis diverted. Initiating sanitization protocol.', 14, 0, 100, 0, 0, 13767, 29577, 0, 'abedneum SAY_CRITICAL'),
|
||||
(30899, 2, 0, 'Alert: security fail-safes deactivated. Beginning memory purge and...', 14, 0, 100, 0, 0, 13768, 29579, 0, 'abedneum SAY_FAILSAFE'),
|
||||
(30899, 3, 0, 'System online. Life form pattern recognized. Welcome, Branbronzan. Query?', 14, 0, 100, 0, 0, 13769, 29580, 0, 'abedneum SAY_ONLINE'),
|
||||
(30899, 4, 0, 'Accessing prehistoric data... retrieved. In the beginning the earthen were created to--', 14, 0, 100, 0, 0, 13770, 30611, 0, 'abedneum SAY_LORE_1'),
|
||||
(30899, 5, 0, 'Accessing... In the early stages of it\'s development cycle, Azeroth suffered infection by parasitic necrophotic symbiotes.', 14, 0, 100, 0, 0, 13771, 30612, 0, 'abedneum SAY_LORE_2'),
|
||||
(30899, 6, 0, 'Designation: Old Gods. Old Gods rendered all systems, including earthen, defenseless in order to facilitate assimilation. This matrix destabilization has been termed the Curse of Flesh. Effects of destabilization increased over time.', 14, 0, 100, 0, 0, 13772, 30613, 0, 'abedneum SAY_LORE_3'),
|
||||
(30899, 7, 0, 'Acknowledged, Branbronzan. Session terminated.', 14, 0, 100, 0, 0, 13773, 30614, 0, 'abedneum SAY_SESSION_END');
|
||||
|
||||
-- Kaddrak (30898) creature_text
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 30898);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(30898, 0, 0, 'Security breach in progress. Analysis of historical archives transferred to lower-priority queue. Countermeasures engaged.', 14, 0, 100, 0, 0, 13756, 29575, 0, 'kaddrak SAY_SECURITY'),
|
||||
(30898, 1, 0, 'Accessing... Creators arrived to extirpate symbiotic infection. Assessment revealed that Old God infestation had grown malignant. Excising parasites would result in loss of host--', 14, 0, 100, 0, 0, 13757, 30603, 0, 'kaddrak SAY_LORE_1'),
|
||||
(30898, 2, 0, 'Correct. Creators neutralized parasitic threat and contained it within the host. Forge of Wills and other systems were instituted to create new earthen. Safeguards were implemented, and protectors were appointed.', 14, 0, 100, 0, 0, 13758, 30604, 0, 'kaddrak SAY_LORE_2'),
|
||||
(30898, 3, 0, 'Designations: Aesir and Vanir. Or in the common nomenclature, storm and earth giants. Sentinel Loken designated supreme. Dragon Aspects appointed to monitor evolution on Azeroth.', 14, 0, 100, 0, 0, 13759, 30605, 0, 'kaddrak SAY_LORE_3');
|
||||
|
||||
-- Marnak (30897) creature_text
|
||||
DELETE FROM `creature_text` WHERE (`CreatureID` = 30897);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(30897, 0, 0, 'Threat index threshold exceeded. Celestial archive aborted. Security level heightened.', 14, 0, 100, 0, 0, 13761, 29576, 0, 'marnak SAY_THREAT'),
|
||||
(30897, 1, 0, 'Additional background is relevant to your query: following global combat between Aesir and Vanir--', 14, 0, 100, 0, 0, 13762, 30606, 0, 'marnak SAY_LORE_1'),
|
||||
(30897, 2, 0, 'Unknown. Data suggests that impetus for global combat originated with prime designate Loken, who neutralized all remaining Aesir and Vanir, affecting termination of conflict. Prime designate Loken then initiated stasis of several seed races, including earthen, giants and vrykul, at designated holding facilities.', 14, 0, 100, 0, 0, 13763, 30607, 0, 'marnak SAY_LORE_2'),
|
||||
(30897, 3, 0, 'Essentially that is correct.', 14, 0, 100, 0, 0, 13764, 30608, 0, 'marnak SAY_LORE_3');
|
||||
|
||||
-- The escort no longer runs on ScriptedEscortAI, the old script_waypoint path is dead
|
||||
DELETE FROM `script_waypoint` WHERE `entry` = 28070;
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (280701, 280702);
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `move_type`) VALUES
|
||||
-- Escort
|
||||
(280701, 1 , 1062.9545, 475.52713, 207.73082, NULL, 1),
|
||||
(280701, 2 , 1051.7512, 474.38412, 208.46428, NULL, 1),
|
||||
(280701, 3 , 1038.5206, 470.5408, 207.74431 , NULL, 1),
|
||||
(280701, 4 , 1025.4148, 461.32217, 207.71443, NULL, 1),
|
||||
(280701, 5 , 1013.8148, 450.56674, 207.71445, NULL, 1),
|
||||
(280701, 6 , 998.8864, 437.2246, 207.36806 , NULL, 1),
|
||||
(280701, 7 , 988.21234, 424.72006, 207.41689, NULL, 1),
|
||||
(280701, 8 , 981.52594, 420.01965, 205.98004, NULL, 1),
|
||||
(280701, 9 , 973.29675, 421.35568, 205.98004, NULL, 1),
|
||||
(280701, 10, 961.14746, 421.33258, 205.98004, NULL, 1),
|
||||
(280701, 11, 951.749, 416.0841, 205.98004 , NULL, 1),
|
||||
(280701, 12, 944.52466, 406.57574, 205.98004, NULL, 1),
|
||||
(280701, 13, 945.35394, 395.39194, 205.98003, NULL, 1),
|
||||
(280701, 14, 946.6389, 386.1174, 205.98001 , NULL, 1),
|
||||
(280701, 15, 939.6467, 375.48926, 207.41608 , NULL, 1),
|
||||
-- Fight Start
|
||||
(280702, 1, 1304.24, 667.208, 189.5993, NULL, 1),
|
||||
(280702, 2, 1308.33, 666.755, 189.5994, NULL, 1);
|
||||
@@ -0,0 +1,6 @@
|
||||
-- DB update 2026_08_01_00 -> 2026_08_01_01
|
||||
-- Where Time Went Wrong (13048): Lorehammer reaction lines
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (56796, 56797);
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(56796, 'spell_q13048_time_period'),
|
||||
(56797, 'spell_q13048_time_period');
|
||||
@@ -0,0 +1,5 @@
|
||||
-- DB update 2026_08_01_01 -> 2026_08_01_02
|
||||
--
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 44270) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 24707) AND (`ConditionValue3` = 0);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 44270, 0, 0, 31, 0, 3, 24707, 0, 0, 0, 0, '', 'Breathing Tube (44270) Targets Buoy (24707)');
|
||||
@@ -0,0 +1,214 @@
|
||||
-- DB update 2026_08_01_02 -> 2026_08_01_03
|
||||
--
|
||||
DELETE FROM `creature` WHERE `guid` IN (114183, 114190, 114191, 114192, 115488, 115489, 115490, 115491, 115492, 115493, 115494, 115495, 115496, 115497, 115498, 115499) AND `id` IN (24272, 24258);
|
||||
|
||||
SET @GUID := 104973;
|
||||
|
||||
DELETE FROM `creature` WHERE `guid` BETWEEN @GUID+0 AND @GUID+15 AND `id` IN (24272, 24258);
|
||||
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `MovementType`, `CreateObject`, `VerifiedBuild`) VALUES
|
||||
(@GUID+0 , 24272, 571, 495, 848.914, -4861.28, -56.3568, 3.335474967956542968, 300, 2, 1, 68887),
|
||||
(@GUID+1 , 24272, 571, 495, 855.236, -4870.75, -52.5024, 2.263822793960571289, 300, 2, 1, 68887),
|
||||
(@GUID+2 , 24272, 571, 495, 808.746, -4812.05, -60.7842, 1.539675593376159667, 300, 2, 1, 68887),
|
||||
(@GUID+3 , 24272, 571, 495, 841.371, -4795.87, -76.126 , 4.534464836120605468, 300, 2, 1, 68887),
|
||||
(@GUID+4 , 24272, 571, 495, 842.362, -4806.11, -49.189 , 0.624028563499450683, 300, 2, 1, 68887),
|
||||
(@GUID+5 , 24272, 571, 495, 856.303, -4904.3, -58.4141 , 1.895198464393615722, 300, 2, 1, 68887),
|
||||
(@GUID+6 , 24272, 571, 495, 956.294, -4824.18, -58.553 , 3.400452613830566406, 300, 2, 1, 68887),
|
||||
(@GUID+7 , 24272, 571, 495, 885.365, -4965.28, -61.1363, 3.501873493194580078, 300, 2, 1, 68887),
|
||||
(@GUID+8 , 24272, 571, 495, 875.447, -4849.24, -55.6919, 5.19333505630493164, 300, 2, 1, 68887),
|
||||
(@GUID+9 , 24272, 571, 495, 929.063, -4850.18, -55.1919, 5.312902450561523437, 300, 2, 1, 68887),
|
||||
(@GUID+10, 24272, 571, 495, 920.499, -4831, -51.3586 , 4.276251792907714843, 300, 2, 1, 68887),
|
||||
(@GUID+11, 24272, 571, 495, 910.928, -4821.96, -55.6085, 5.397297859191894531, 300, 2, 1, 68887),
|
||||
(@GUID+12, 24258, 571, 495, 814.389, -4744.63, -70.1722, 2.795719623565673828, 300, 2, 1, 68887),
|
||||
(@GUID+13, 24258, 571, 495, 810.841, -4724.84, -68.6167, 4.948425769805908203, 300, 2, 1, 68887),
|
||||
(@GUID+14, 24258, 571, 495, 819.966, -4713.89, -82.5333, 1.868739247322082519, 300, 2, 1, 68887),
|
||||
(@GUID+15, 24258, 571, 495, 775.797, -4717.9, -73.1167 , 5.536564826965332031, 300, 2, 1, 68887);
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID+0 AND @GUID+15;
|
||||
INSERT INTO `creature_addon` (`guid`, `path_id`) VALUES
|
||||
(@GUID+0 , (@GUID+0 )*10),
|
||||
(@GUID+1 , (@GUID+1 )*10),
|
||||
(@GUID+2 , (@GUID+2 )*10),
|
||||
(@GUID+3 , (@GUID+3 )*10),
|
||||
(@GUID+4 , (@GUID+4 )*10),
|
||||
(@GUID+5 , (@GUID+5 )*10),
|
||||
(@GUID+6 , (@GUID+6 )*10),
|
||||
(@GUID+7 , (@GUID+7 )*10),
|
||||
(@GUID+8 , (@GUID+8 )*10),
|
||||
(@GUID+9 , (@GUID+9 )*10),
|
||||
(@GUID+10, (@GUID+10)*10),
|
||||
(@GUID+11, (@GUID+11)*10),
|
||||
(@GUID+12, (@GUID+12)*10),
|
||||
(@GUID+13, (@GUID+13)*10),
|
||||
(@GUID+14, (@GUID+14)*10),
|
||||
(@GUID+15, (@GUID+15)*10);
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id` BETWEEN (@GUID+0)*10 AND (@GUID+15)*10;
|
||||
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `smoothTransition`, `move_type`) VALUES
|
||||
((@GUID+0)*10, 1, 848.9135, -4861.279, -56.356846, NULL, 1, 0),
|
||||
((@GUID+0)*10, 2, 843.5121, -4860.611, -55.995728, NULL, 1, 0),
|
||||
((@GUID+0)*10, 3, 832.5501, -4862.95, -52.301285, NULL, 1, 0),
|
||||
((@GUID+0)*10, 4, 830.4649, -4874.2656, -55.301296, NULL, 1, 0),
|
||||
((@GUID+0)*10, 5, 838.2181, -4877.518, -57.773518, NULL, 1, 0),
|
||||
((@GUID+0)*10, 6, 849.66473, -4878.1978, -52.30129, NULL, 1, 0),
|
||||
((@GUID+0)*10, 7, 855.8818, -4870.2886, -54.884624, NULL, 1, 0),
|
||||
((@GUID+0)*10, 8, 853.19977, -4863.428, -54.07906, NULL, 1, 0),
|
||||
|
||||
((@GUID+1)*10, 1 , 855.2356, -4870.7456, -52.50243, NULL, 1, 0),
|
||||
((@GUID+1)*10, 2 , 854.4634, -4865.868, -55.030205, NULL, 1, 0),
|
||||
((@GUID+1)*10, 3 , 847.1954, -4852.519, -51.002426, NULL, 1, 0),
|
||||
((@GUID+1)*10, 4 , 833.26086, -4847.0156, -52.50243, NULL, 1, 0),
|
||||
((@GUID+1)*10, 5 , 826.88336, -4840.7393, -55.6691, NULL, 1, 0),
|
||||
((@GUID+1)*10, 6 , 824.3039, -4827.225, -50.64132, NULL, 1, 0),
|
||||
((@GUID+1)*10, 7 , 833.80774, -4811.9253, -57.252434, NULL, 1, 0),
|
||||
((@GUID+1)*10, 8 , 829.8226, -4795.3335, -51.891308, NULL, 1, 0),
|
||||
((@GUID+1)*10, 9 , 808.6812, -4796.8833, -50.141315, NULL, 1, 0),
|
||||
((@GUID+1)*10, 10, 809.5606, -4808.7876, -52.50243, NULL, 1, 0),
|
||||
((@GUID+1)*10, 11, 819.323, -4813.9507, -56.280205, NULL, 1, 0),
|
||||
((@GUID+1)*10, 12, 834.9311, -4820.883, -55.752438, NULL, 1, 0),
|
||||
((@GUID+1)*10, 13, 839.3295, -4836.557, -51.002434, NULL, 1, 0),
|
||||
((@GUID+1)*10, 14, 837.72943, -4845.846, -52.50243, NULL, 1, 0),
|
||||
((@GUID+1)*10, 15, 836.0781, -4862.7334, -50.974655, NULL, 1, 0),
|
||||
((@GUID+1)*10, 16, 842.90826, -4873.529, -52.50243, NULL, 1, 0),
|
||||
((@GUID+1)*10, 17, 851.32794, -4875.8633, -56.25243, NULL, 1, 0),
|
||||
|
||||
((@GUID+2)*10, 1, 808.7459, -4812.053, -60.784233, NULL, 1, 0),
|
||||
((@GUID+2)*10, 2, 808.22986, -4801.94, -63.67312, NULL, 1, 0),
|
||||
((@GUID+2)*10, 3, 816.9509, -4795.5044, -61.228664, NULL, 1, 0),
|
||||
((@GUID+2)*10, 4, 829.1684, -4789.4434, -59.756443, NULL, 1, 0),
|
||||
((@GUID+2)*10, 5, 841.48395, -4787.0703, -63.673115, NULL, 1, 0),
|
||||
((@GUID+2)*10, 6, 847.0665, -4798.9966, -67.97867, NULL, 1, 0),
|
||||
((@GUID+2)*10, 7, 842.1066, -4805.202, -66.75646, NULL, 1, 0),
|
||||
((@GUID+2)*10, 8, 832.9062, -4808.4556, -63.673115, NULL, 1, 0),
|
||||
((@GUID+2)*10, 9, 822.26166, -4811.9453, -70.97868, NULL, 1, 0),
|
||||
|
||||
((@GUID+3)*10, 1 , 841.3709, -4795.8716, -76.12601, NULL, 1, 0),
|
||||
((@GUID+3)*10, 2 , 840.8404, -4793.573, -74.042656, NULL, 1, 0),
|
||||
((@GUID+3)*10, 3 , 833.81134, -4790.756, -74.042656, NULL, 1, 0),
|
||||
((@GUID+3)*10, 4 , 821.35486, -4792.3564, -76.57045, NULL, 1, 0),
|
||||
((@GUID+3)*10, 5 , 807.6492, -4795.983, -71.459335, NULL, 1, 0),
|
||||
((@GUID+3)*10, 6 , 804.25726, -4805.17, -76.098206, NULL, 1, 0),
|
||||
((@GUID+3)*10, 7 , 808.15625, -4809.107, -71.95932, NULL, 1, 0),
|
||||
((@GUID+3)*10, 8 , 818.56116, -4809.982, -76.181564, NULL, 1, 0),
|
||||
((@GUID+3)*10, 9 , 828.70197, -4805.0776, -72.2371, NULL, 1, 0),
|
||||
((@GUID+3)*10, 10, 837.5706, -4800.3423, -76.876, NULL, 1, 0),
|
||||
|
||||
((@GUID+4)*10, 1, 842.36163, -4806.111, -49.189034, NULL, 1, 0),
|
||||
((@GUID+4)*10, 2, 837.8431, -4792.732, -47.244583, NULL, 1, 0),
|
||||
((@GUID+4)*10, 3, 822.47595, -4803.012, -73.189026, NULL, 1, 0),
|
||||
((@GUID+4)*10, 4, 809.6625, -4811.376, -83.49458, NULL, 1, 0),
|
||||
((@GUID+4)*10, 5, 805.55206, -4798.9004, -71.827934, NULL, 1, 0),
|
||||
((@GUID+4)*10, 6, 820.4665, -4799.2095, -57.689022, NULL, 1, 0),
|
||||
|
||||
((@GUID+5)*10, 1 , 856.3028, -4904.3022, -58.41408, NULL, 1, 0),
|
||||
((@GUID+5)*10, 2 , 854.17365, -4898.4, -59.71962, NULL, 1, 0),
|
||||
((@GUID+5)*10, 3 , 863.13043, -4928.3853, -56.85851, NULL, 1, 0),
|
||||
((@GUID+5)*10, 4 , 871.44116, -4934.106, -46.719616, NULL, 1, 0),
|
||||
((@GUID+5)*10, 5 , 873.2085, -4937.753, -46.55295, NULL, 1, 0),
|
||||
((@GUID+5)*10, 6 , 868.90454, -4944.4087, -46.802937, NULL, 1, 0),
|
||||
((@GUID+5)*10, 7 , 865.4396, -4945.6777, -47.441845, NULL, 1, 0),
|
||||
((@GUID+5)*10, 8 , 859.10596, -4939.4043, -47.247375, NULL, 1, 0),
|
||||
((@GUID+5)*10, 9 , 857.44183, -4936.1675, -47.580734, NULL, 1, 0),
|
||||
((@GUID+5)*10, 10, 861.15643, -4927.1235, -47.830723, NULL, 1, 0),
|
||||
((@GUID+5)*10, 11, 885.2923, -4930.4893, -57.858524, NULL, 1, 0),
|
||||
((@GUID+5)*10, 12, 890.75793, -4935.6025, -57.85853, NULL, 1, 0),
|
||||
((@GUID+5)*10, 13, 902.4837, -4955.032, -59.191864, NULL, 1, 0),
|
||||
((@GUID+5)*10, 14, 897.88824, -4959.8027, -59.191868, NULL, 1, 0),
|
||||
((@GUID+5)*10, 15, 888.0645, -4963.673, -59.191868, NULL, 1, 0),
|
||||
((@GUID+5)*10, 16, 878.6978, -4969.4277, -59.191868, NULL, 1, 0),
|
||||
((@GUID+5)*10, 17, 867.50726, -4945.597, -58.414085, NULL, 1, 0),
|
||||
|
||||
((@GUID+6)*10, 1 , 956.29407, -4824.1797, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 2 , 954.33856, -4825.6763, -56.636303, NULL, 1, 0),
|
||||
((@GUID+6)*10, 3 , 944.4089, -4828.8906, -58.05299, NULL, 1, 0),
|
||||
((@GUID+6)*10, 4 , 930.31903, -4833.362, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 5 , 916.5547, -4832.821, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 6 , 907.56335, -4820.896, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 7 , 912.11633, -4808.6274, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 8 , 919.03937, -4811.3105, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 9 , 922.1953, -4824.7915, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 10, 917.2956, -4855.327, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 11, 923.5457, -4863.1436, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 12, 933.1302, -4851.1187, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 13, 917.71704, -4840.79, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 14, 897.5533, -4841.8276, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 15, 879.6963, -4848.92, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 16, 894.97485, -4844.9746, -58.55297, NULL, 1, 0),
|
||||
((@GUID+6)*10, 17, 927.064, -4833.6255, -58.55297, NULL, 1, 0),
|
||||
|
||||
((@GUID+7)*10, 1 , 885.36487, -4965.276, -61.136265, NULL, 1, 0),
|
||||
((@GUID+7)*10, 2 , 880.6454, -4976.131, -58.330708, NULL, 1, 0),
|
||||
((@GUID+7)*10, 3 , 871.6718, -4968.5884, -58.330708, NULL, 1, 0),
|
||||
((@GUID+7)*10, 4 , 847.3286, -4975.932, -58.330708, NULL, 1, 0),
|
||||
((@GUID+7)*10, 5 , 842.7772, -4960.105, -53.941807, NULL, 1, 0),
|
||||
((@GUID+7)*10, 6 , 830.42755, -4921.7407, -59.580708, NULL, 1, 0),
|
||||
((@GUID+7)*10, 7 , 847.0207, -4915.108, -55.080704, NULL, 1, 0),
|
||||
((@GUID+7)*10, 8 , 884.1066, -4903.206, -59.33071, NULL, 1, 0),
|
||||
((@GUID+7)*10, 9 , 895.1483, -4929.2446, -53.91404, NULL, 1, 0),
|
||||
((@GUID+7)*10, 10, 904.24805, -4959.203, -58.330708, NULL, 1, 0),
|
||||
|
||||
((@GUID+8)*10, 1 , 875.44745, -4849.2446, -55.691887, NULL, 1, 0),
|
||||
((@GUID+8)*10, 2 , 881.71857, -4848.7783, -52.553, NULL, 1, 0),
|
||||
((@GUID+8)*10, 3 , 887.10187, -4850.419, -52.553, NULL, 1, 0),
|
||||
((@GUID+8)*10, 4 , 900.8484, -4871.943, -56.136345, NULL, 1, 0),
|
||||
((@GUID+8)*10, 5 , 922.4768, -4866.539, -54.77522, NULL, 1, 0),
|
||||
((@GUID+8)*10, 6 , 956.3114, -4855.176, -55.691887, NULL, 1, 0),
|
||||
((@GUID+8)*10, 7 , 950.0135, -4821.555, -55.691887, NULL, 1, 0),
|
||||
((@GUID+8)*10, 8 , 936.5696, -4800.5327, -55.691887, NULL, 1, 0),
|
||||
((@GUID+8)*10, 9 , 902.14124, -4808.3345, -55.691887, NULL, 1, 0),
|
||||
((@GUID+8)*10, 10, 883.8032, -4817.885, -55.691887, NULL, 1, 0),
|
||||
((@GUID+8)*10, 11, 889.00183, -4840.078, -55.691887, NULL, 1, 0),
|
||||
|
||||
((@GUID+9)*10, 1, 929.0633, -4850.184, -55.19186, NULL, 1, 0),
|
||||
((@GUID+9)*10, 2, 923.3711, -4849.388, -54.108555, NULL, 1, 0),
|
||||
((@GUID+9)*10, 3, 919.9915, -4853.378, -54.46964, NULL, 1, 0),
|
||||
((@GUID+9)*10, 4, 920.9106, -4857.063, -57.80299, NULL, 1, 0),
|
||||
((@GUID+9)*10, 5, 925.6862, -4858.741, -57.386322, NULL, 1, 0),
|
||||
((@GUID+9)*10, 6, 929.6542, -4854.92, -59.052975, NULL, 1, 0),
|
||||
|
||||
((@GUID+10)*10, 1, 920.4993, -4830.998, -51.358562, NULL, 1, 0),
|
||||
((@GUID+10)*10, 2, 915.2309, -4832.864, -51.636337, NULL, 1, 0),
|
||||
((@GUID+10)*10, 3, 914.1133, -4838.8735, -51.219673, NULL, 1, 0),
|
||||
((@GUID+10)*10, 4, 918.5, -4841.5537, -50.99744, NULL, 1, 0),
|
||||
((@GUID+10)*10, 5, 923.9588, -4838.46, -51.775223, NULL, 1, 0),
|
||||
((@GUID+10)*10, 6, 923.8309, -4834.0894, -51.441895, NULL, 1, 0),
|
||||
|
||||
((@GUID+11)*10, 1, 910.92755, -4821.955, -55.60853, NULL, 1, 0),
|
||||
((@GUID+11)*10, 2, 914.6762, -4821.7783, -55.497433, NULL, 1, 0),
|
||||
((@GUID+11)*10, 3, 917.8987, -4821.0103, -53.969646, NULL, 1, 0),
|
||||
((@GUID+11)*10, 4, 918.1646, -4815.973, -54.858536, NULL, 1, 0),
|
||||
((@GUID+11)*10, 5, 915.9987, -4812.069, -53.469646, NULL, 1, 0),
|
||||
((@GUID+11)*10, 6, 910.28516, -4813.324, -53.58076, NULL, 1, 0),
|
||||
((@GUID+11)*10, 7, 907.968, -4818.275, -53.747437, NULL, 1, 0),
|
||||
|
||||
-- Overseers
|
||||
((@GUID+12)*10, 1, 814.38885, -4744.631, -70.172195, NULL, 1, 0),
|
||||
((@GUID+12)*10, 2, 794.30457, -4746.817, -73.53331, NULL, 1, 0),
|
||||
((@GUID+12)*10, 3, 779.25586, -4732.826, -70.172195, NULL, 1, 0),
|
||||
((@GUID+12)*10, 4, 778.02563, -4713.221, -67.42218, NULL, 1, 0),
|
||||
((@GUID+12)*10, 5, 795.8828, -4708.0474, -73.644424, NULL, 1, 0),
|
||||
((@GUID+12)*10, 6, 814.5335, -4707.928, -72.67219, NULL, 1, 0),
|
||||
((@GUID+12)*10, 7, 819.36945, -4734.119, -73.949974, NULL, 1, 0),
|
||||
|
||||
((@GUID+13)*10, 1, 810.841, -4724.8433, -68.616684, NULL, 1, 0),
|
||||
((@GUID+13)*10, 2, 808.7681, -4718.541, -65.172226, NULL, 1, 0),
|
||||
((@GUID+13)*10, 3, 798.9675, -4710.6704, -65.172226, NULL, 1, 0),
|
||||
((@GUID+13)*10, 4, 785.41595, -4707.411, -65.172226, NULL, 1, 0),
|
||||
((@GUID+13)*10, 5, 775.47003, -4725.557, -65.172226, NULL, 1, 0),
|
||||
((@GUID+13)*10, 6, 784.88116, -4743.483, -65.172226, NULL, 1, 0),
|
||||
((@GUID+13)*10, 7, 801.7946, -4743.7324, -68.81113, NULL, 1, 0),
|
||||
|
||||
((@GUID+14)*10, 1, 819.9661, -4713.8853, -82.53329, NULL, 1, 0),
|
||||
((@GUID+14)*10, 2, 809.4178, -4704.249, -83.28329, NULL, 1, 0),
|
||||
((@GUID+14)*10, 3, 794.2107, -4704.6787, -78.50551, NULL, 1, 0),
|
||||
((@GUID+14)*10, 4, 781.2782, -4710.818, -84.64439, NULL, 1, 0),
|
||||
((@GUID+14)*10, 5, 780.4466, -4742.383, -82.838844, NULL, 1, 0),
|
||||
((@GUID+14)*10, 6, 801.2428, -4748.2944, -79.56106, NULL, 1, 0),
|
||||
((@GUID+14)*10, 7, 820.7194, -4732.687, -84.69994, NULL, 1, 0),
|
||||
|
||||
((@GUID+15)*10, 1, 775.7975, -4717.895, -73.11665, NULL, 1, 0),
|
||||
((@GUID+15)*10, 2, 788.4036, -4704.089, -73.61664, NULL, 1, 0),
|
||||
((@GUID+15)*10, 3, 801.8325, -4702.2114, -73.97776, NULL, 1, 0),
|
||||
((@GUID+15)*10, 4, 815.7599, -4716.915, -71.25553, NULL, 1, 0),
|
||||
((@GUID+15)*10, 5, 816.86053, -4741.8823, -73.00555, NULL, 1, 0),
|
||||
((@GUID+15)*10, 6, 795.74396, -4748.135, -71.9222, NULL, 1, 0),
|
||||
((@GUID+15)*10, 7, 778.3672, -4739.311, -69.28331, NULL, 1, 0);
|
||||
@@ -0,0 +1,133 @@
|
||||
-- DB update 2026_08_01_03 -> 2026_08_02_00
|
||||
|
||||
-- Set Right Emotes.
|
||||
UPDATE `creature_text` SET `Emote` = 1 WHERE (`CreatureID` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074)) AND (`GroupID` IN (0, 2, 3, 4, 5, 6, 7, 8));
|
||||
UPDATE `creature_text` SET `Emote` = 25 WHERE (`CreatureID` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074)) AND (`GroupID` IN (1));
|
||||
|
||||
-- Deactive RegenHealth.
|
||||
UPDATE `creature_template` SET `RegenHealth` = 0 WHERE (`entry` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074));
|
||||
|
||||
-- Set Curhealth to 30%.
|
||||
UPDATE `creature` SET `curhealth` = 3 WHERE (`id` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074));
|
||||
|
||||
-- Remove Script Name and Enable SAI.
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE (`entry` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074));
|
||||
|
||||
-- Set SAI.
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074));
|
||||
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
|
||||
(29032, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - On Respawn - Set Flags Immune To Players'),
|
||||
(29032, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29032, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - On Respawn - Set Event Phase 1'),
|
||||
(29032, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29032, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29032, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29032, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Malar Bravehorn - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29061, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - On Respawn - Set Flags Immune To Players'),
|
||||
(29061, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29061, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - On Respawn - Set Event Phase 1'),
|
||||
(29061, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29061, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29061, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29061, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ellen Stanbridge - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29065, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - On Respawn - Set Flags Immune To Players'),
|
||||
(29065, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29065, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - On Respawn - Set Event Phase 1'),
|
||||
(29065, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29065, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29065, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29065, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Yazmina Oakenthorn - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29067, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - On Respawn - Set Flags Immune To Players'),
|
||||
(29067, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29067, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - On Respawn - Set Event Phase 1'),
|
||||
(29067, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29067, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29067, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29067, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Donovan Pulfrost - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29068, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - On Respawn - Set Flags Immune To Players'),
|
||||
(29068, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29068, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - On Respawn - Set Event Phase 1'),
|
||||
(29068, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29068, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29068, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29068, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goby Blastenheimer - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29070, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - On Respawn - Set Flags Immune To Players'),
|
||||
(29070, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29070, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - On Respawn - Set Event Phase 1'),
|
||||
(29070, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29070, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29070, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29070, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Valok the Righteous - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29071, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - On Respawn - Set Flags Immune To Players'),
|
||||
(29071, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29071, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - On Respawn - Set Event Phase 1'),
|
||||
(29071, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29071, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29071, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29071, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Antoine Brack - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29072, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - On Respawn - Set Flags Immune To Players'),
|
||||
(29072, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29072, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - On Respawn - Set Event Phase 1'),
|
||||
(29072, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29072, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29072, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29072, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kug Ironjaw - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29073, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - On Respawn - Set Flags Immune To Players'),
|
||||
(29073, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29073, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - On Respawn - Set Event Phase 1'),
|
||||
(29073, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29073, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29073, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29073, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Iggy Darktusk - Out of Combat - Play Emote 18 (Phase 1)'),
|
||||
(29074, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - On Respawn - Set Flags Immune To Players'),
|
||||
(29074, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - On Respawn - Set Flag Standstate Kneel'),
|
||||
(29074, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - On Respawn - Set Event Phase 1'),
|
||||
(29074, 0, 3, 4, 10, 0, 100, 257, 1, 3, 0, 0, 1, 0, 64, 25, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - On Out of Combat LoS - Store Targetlist (No Repeat)'),
|
||||
(29074, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - On Out of Combat LoS - Set Event Phase 2 (No Repeat)'),
|
||||
(29074, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2907400, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - On Out of Combat LoS - Run Script (No Repeat)'),
|
||||
(29074, 0, 6, 0, 1, 1, 100, 0, 30000, 60000, 30000, 60000, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Out of Combat - Play Emote 18 (Phase 1)');
|
||||
|
||||
-- Set Action List (Used by all the Creatures).
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2907400);
|
||||
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
|
||||
(2907400, 9, 0, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 0'),
|
||||
(2907400, 9, 1, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 91, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Remove FlagStandstate Kneel'),
|
||||
(2907400, 9, 2, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 1'),
|
||||
(2907400, 9, 3, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 2'),
|
||||
(2907400, 9, 4, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 3'),
|
||||
(2907400, 9, 5, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 4'),
|
||||
(2907400, 9, 6, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 5'),
|
||||
(2907400, 9, 7, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 0, 5, 274, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Play Emote 274'),
|
||||
(2907400, 9, 8, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 6'),
|
||||
(2907400, 9, 9, 0, 0, 0, 100, 0, 9000, 9000, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Play Emote 5'),
|
||||
(2907400, 9, 10, 0, 0, 0, 100, 0, 4500, 4500, 0, 0, 0, 0, 100, 25, 0, 0, 0, 0, 0, 10, 129947, 29053, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Send Target 25'),
|
||||
(2907400, 9, 11, 0, 0, 0, 100, 0, 500, 500, 0, 0, 0, 0, 223, 25, 0, 0, 0, 0, 0, 10, 129947, 29053, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Do Action ID 25'),
|
||||
(2907400, 9, 12, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 7'),
|
||||
(2907400, 9, 13, 0, 0, 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, 'Lady Eonys - Actionlist - Set Reactstate Passive'),
|
||||
(2907400, 9, 14, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 5, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Play Emote 18'),
|
||||
(2907400, 9, 15, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 0, 0, 90, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Set Flag Standstate Kneel'),
|
||||
(2907400, 9, 16, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 19, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Remove Flags Immune To Players'),
|
||||
(2907400, 9, 17, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 8'),
|
||||
(2907400, 9, 18, 0, 0, 0, 100, 0, 30000, 30000, 0, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Say Line 9'),
|
||||
(2907400, 9, 19, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lady Eonys - Actionlist - Kill Self');
|
||||
|
||||
-- Set Plaguefist SAI.
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 29053;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 29053);
|
||||
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
|
||||
(29053, 0, 0, 0, 72, 0, 100, 0, 25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 25, 0, 0, 0, 0, 0, 0, 0, 'Knight Commander Plaguefist - On Action 25 Done - Say Line 0');
|
||||
|
||||
-- Set Conditions
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 4) AND (`SourceEntry` IN (29032, 29061, 29065, 29067, 29068, 29070, 29071, 29072, 29073, 29074)) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 47) AND (`ConditionTarget` = 0) AND (`ConditionValue1` IN (12739, 12742, 12743, 12744, 12745, 12746, 12750, 12748, 12749, 12747)) AND (`ConditionValue2` = 8) AND (`ConditionValue3` = 0);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(22, 4, 29032, 0, 0, 47, 0, 12739, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Tauren) quest incomplete.'),
|
||||
(22, 4, 29061, 0, 0, 47, 0, 12742, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Human) quest incomplete.'),
|
||||
(22, 4, 29065, 0, 0, 47, 0, 12743, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Night Elf) quest incomplete.'),
|
||||
(22, 4, 29067, 0, 0, 47, 0, 12744, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Dwarf) quest incomplete.'),
|
||||
(22, 4, 29068, 0, 0, 47, 0, 12745, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Gnome) quest incomplete.'),
|
||||
(22, 4, 29070, 0, 0, 47, 0, 12746, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Draenei) quest incomplete.'),
|
||||
(22, 4, 29071, 0, 0, 47, 0, 12750, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Undead) quest incomplete.'),
|
||||
(22, 4, 29072, 0, 0, 47, 0, 12748, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Orc) quest incomplete.'),
|
||||
(22, 4, 29073, 0, 0, 47, 0, 12749, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Troll) quest incomplete.'),
|
||||
(22, 4, 29074, 0, 0, 47, 0, 12747, 8, 0, 0, 0, 0, '', 'The event will only occur when the player has the "A Special Surprise" (Blood Elf) quest incomplete.');
|
||||
@@ -0,0 +1,132 @@
|
||||
-- DB update 2026_08_02_00 -> 2026_08_02_01
|
||||
-- Mission: Eternal Flame
|
||||
|
||||
-- Halgrind Bunny 1
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 23921;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23921);
|
||||
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
|
||||
(23921, 0, 0, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 11, 42632, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 01 - On Spellhit \'Ever-burning Torch\' - Cast \'Mission: Eternal Flame: Bunny 01 Kill Credit\''),
|
||||
(23921, 0, 1, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 01 - On Spellhit \'Ever-burning Torch\' - Summon Gameobject Group');
|
||||
|
||||
DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 23921 AND `summonerType` = 0;
|
||||
INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES
|
||||
(23921, 0, 0, 186457, 863.741, -4335.81, 175.882, 2.80998, 0, 0, 0.986285, 0.16505, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186459, 863.839, -4335.78, 175.87, 2.25147, 0, 0, 0.902585, 0.430512, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186457, 870.085, -4333.66, 175.913, 2.05949, 0, 0, 0.857167, 0.515038, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186457, 865.093, -4329.5, 184.862, 5.044, 0, 0, -0.580703, 0.814116, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186459, 870.059, -4333.67, 175.912, 3.26377, 0, 0, -0.998135, 0.0610518, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186459, 865.027, -4329.54, 184.859, 3.76991, 0, 0, -0.951056, 0.309017, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186457, 868.802, -4339.79, 182.212, 1.93731, 0, 0, 0.824125, 0.566408, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23921, 0, 0, 186459, 868.747, -4339.82, 182.209, 4.06662, 0, 0, -0.894934, 0.446199, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame');
|
||||
|
||||
-- Halgrind Bunny 2
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 23922;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23922);
|
||||
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
|
||||
(23922, 0, 0, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 11, 42633, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 02 - On Spellhit \'Ever-burning Torch\' - Cast \'Mission: Eternal Flame: Bunny 02 Kill Credit\''),
|
||||
(23922, 0, 1, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 02 - On Spellhit \'Ever-burning Torch\' - Summon Gameobject Group');
|
||||
|
||||
DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 23922 AND `summonerType` = 0;
|
||||
INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES
|
||||
(23922, 0, 0, 186457, 989.369, -4306.89, 178.847, 5.60251, 0, 0, -0.333807, 0.942641, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186459, 989.394, -4306.69, 178.823, 1.44862, 0, 0, 0.66262, 0.748956, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186457, 990.37, -4312.48, 169.811, 6.14356, 0, 0, -0.0697556, 0.997564, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186457, 984.746, -4311.37, 170.311, 0.925024, 0, 0, 0.446198, 0.894935, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186459, 986.956, -4317.4, 175.751, 5.49779, 0, 0, -0.382683, 0.92388, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186459, 984.89, -4311.39, 170.28, 5.11382, 0, 0, -0.551936, 0.833886, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186457, 987, -4317.33, 175.794, 5.28835, 0, 0, -0.477159, 0.878817, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23922, 0, 0, 186459, 990.378, -4312.45, 169.814, 4.67748, 0, 0, -0.719339, 0.694659, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame');
|
||||
|
||||
-- Halgrind Bunny 3
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 23923;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23923);
|
||||
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
|
||||
(23923, 0, 0, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 11, 42634, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 03 - On Spellhit \'Ever-burning Torch\' - Cast \'Mission: Eternal Flame: Bunny 03 Kill Credit\''),
|
||||
(23923, 0, 1, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 03 - On Spellhit \'Ever-burning Torch\' - Summon Gameobject Group');
|
||||
|
||||
DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 23923 AND `summonerType` = 0;
|
||||
INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES
|
||||
(23923, 0, 0, 186457, 1091.08, -4492.35, 199.826, 1.53589, 0, 0, 0.694658, 0.71934, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186459, 1090.99, -4492.31, 199.843, 4.34587, 0, 0, -0.824126, 0.566406, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186457, 1082.45, -4486.05, 197.245, 2.26893, 0, 0, 0.906307, 0.422619, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186457, 1088.52, -4486.68, 191.176, 2.65289, 0, 0, 0.970295, 0.241925, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186459, 1082.47, -4486.01, 197.243, 3.75246, 0, 0, -0.953716, 0.300708, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186459, 1088.55, -4486.6, 191.189, 5.79449, 0, 0, -0.241921, 0.970296, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186457, 1084.6, -4491.49, 190.98, 1.23918, 0, 0, 0.580703, 0.814116, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23923, 0, 0, 186459, 1084.63, -4491.51, 190.978, 2.58308, 0, 0, 0.961261, 0.27564, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame');
|
||||
|
||||
-- Halgrind Bunny 4
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 23924;
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23924);
|
||||
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
|
||||
(23924, 0, 0, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 11, 42635, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 04 - On Spellhit \'Ever-burning Torch\' - Cast \'Mission: Eternal Flame: Bunny 04 Kill Credit\''),
|
||||
(23924, 0, 1, 0, 8, 0, 100, 0, 42564, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Halgrind Torch Bunny 04 - On Spellhit \'Ever-burning Torch\' - Summon Gameobject Group');
|
||||
|
||||
DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 23924 AND `summonerType` = 0;
|
||||
INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES
|
||||
(23924, 0, 0, 186457, 798.11, -4505.71, 186.714, 5.79449, 0, 0, -0.241921, 0.970296, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186459, 798.052, -4505.68, 186.727, 0.209439, 0, 0, 0.104528, 0.994522, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186457, 793.686, -4502.09, 187.292, 1.53589, 0, 0, 0.694658, 0.71934, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186457, 794.305, -4506.92, 196.746, 0.733038, 0, 0, 0.358368, 0.93358, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186459, 793.655, -4502.07, 187.294, 2.26893, 0, 0, 0.906307, 0.422619, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186459, 794.087, -4507.06, 196.769, 6.05629, 0, 0, -0.113203, 0.993572, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186457, 800.002, -4499.43, 192.178, 0.59341, 0, 0, 0.292371, 0.956305, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame'),
|
||||
(23924, 0, 0, 186459, 800.015, -4499.37, 192.14, 5.23599, 0, 0, -0.5, 0.866025, 60, 'Halgrind Torch Bunny - Mission: Eternal Flame');
|
||||
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 2) AND (`SourceEntry` IN (23921, 23922, 23923, 23924)) AND (`SourceId` = 0) AND (`ConditionTypeOrReference` = 30) AND (`ConditionValue1` = 186457);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(22, 2, 23921, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, 23922, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, 23923, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, 23924, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\'');
|
||||
|
||||
-- Mission: Plague This!
|
||||
UPDATE `creature_template` SET `flags_extra` = `flags_extra`|134217728 WHERE (`entry` = 24290);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 24290);
|
||||
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
|
||||
(24290, 0, 0, 0, 8, 0, 100, 0, 43404, 0, 0, 0, 0, 0, 11, 43419, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'New Agamand Plague Tank Bunny - On Spellhit \'Mission: Plague This!: Orehammer\'s Precision Bombs Dummy\' - Cast \'Mission: Plague This!: Kill Credit\'');
|
||||
|
||||
DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 24290 AND `summonerType` = 0;
|
||||
INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES
|
||||
-- 117615
|
||||
(24290, 0, 0, 186457, 423.099, -4608.35, 247.876, 0.610863, 0, 0, 0.300705, 0.953717, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 0, 186459, 423.039, -4608.36, 247.832, 3.97935, 0, 0, -0.913545, 0.406738, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 0, 186457, 431.65, -4604.21, 252.061, 4.59022, 0, 0, -0.748956, 0.66262, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 0, 186459, 431.542, -4604.23, 252.05, 4.76475, 0, 0, -0.688354, 0.725374, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
-- 117616
|
||||
(24290, 0, 1, 186457, 375.438, -4655.56, 251.9, 4.57276, 0, 0, -0.754709, 0.656059, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 1, 186459, 375.424, -4655.62, 251.928, 0.174532, 0, 0, 0.0871553, 0.996195, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 1, 186457, 369.526, -4663.41, 254.98, 0.471238, 0, 0, 0.233445, 0.97237, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 1, 186459, 369.434, -4663.53, 254.965, 3.9619, 0, 0, -0.91706, 0.39875, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
-- 117617
|
||||
(24290, 0, 2, 186457, 357.424, -4498.92, 250.582, 4.7473, 0, 0, -0.694658, 0.71934, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 2, 186459, 357.5, -4499.03, 250.514, 4.72984, 0, 0, -0.700909, 0.713251, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 2, 186457, 352.185, -4490.65, 253.284, 2.91469, 0, 0, 0.993571, 0.113208, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 2, 186459, 352.146, -4490.48, 253.261, 6.16101, 0, 0, -0.0610485, 0.998135, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
-- 117618
|
||||
(24290, 0, 3, 186457, 371.951, -4565.31, 250.922, 5.77704, 0, 0, -0.25038, 0.968148, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 3, 186459, 371.923, -4565.43, 250.925, 3.35105, 0, 0, -0.994521, 0.104536, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 3, 186457, 362.21, -4566.04, 254.082, 0.418879, 0, 0, 0.207911, 0.978148, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 3, 186459, 362.188, -4566.2, 254.066, 5.86431, 0, 0, -0.207911, 0.978148, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
-- 117619
|
||||
(24290, 0, 4, 186457, 469.041, -4591.96, 251.803, 1.13446, 0, 0, 0.537299, 0.843392, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 4, 186459, 469.198, -4591.82, 251.922, 5.98648, 0, 0, -0.147809, 0.989016, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 4, 186457, 473.667, -4583.1, 255.491, 0.872664, 0, 0, 0.422618, 0.906308, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!'),
|
||||
(24290, 0, 4, 186459, 473.587, -4583.14, 255.273, 0.785397, 0, 0, 0.382683, 0.92388, 60, 'New Agamand Plague Tank Bunny - Mission: Plague This!');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-117615, -117616, -117617, -117618, -117619));
|
||||
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
|
||||
(-117615, 0, 1, 0, 8, 0, 100, 0, 43404, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'New Agamand Plague Tank Bunny - On Spellhit \'Mission: Plague This!: Orehammer\'s Precision Bombs Dummy\' - Summon Gameobject Group 0'),
|
||||
(-117616, 0, 1, 0, 8, 0, 100, 0, 43404, 0, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'New Agamand Plague Tank Bunny - On Spellhit \'Mission: Plague This!: Orehammer\'s Precision Bombs Dummy\' - Summon Gameobject Group 1'),
|
||||
(-117617, 0, 1, 0, 8, 0, 100, 0, 43404, 0, 0, 0, 0, 0, 241, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'New Agamand Plague Tank Bunny - On Spellhit \'Mission: Plague This!: Orehammer\'s Precision Bombs Dummy\' - Summon Gameobject Group 2'),
|
||||
(-117618, 0, 1, 0, 8, 0, 100, 0, 43404, 0, 0, 0, 0, 0, 241, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'New Agamand Plague Tank Bunny - On Spellhit \'Mission: Plague This!: Orehammer\'s Precision Bombs Dummy\' - Summon Gameobject Group 3'),
|
||||
(-117619, 0, 1, 0, 8, 0, 100, 0, 43404, 0, 0, 0, 0, 0, 241, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'New Agamand Plague Tank Bunny - On Spellhit \'Mission: Plague This!: Orehammer\'s Precision Bombs Dummy\' - Summon Gameobject Group 4');
|
||||
|
||||
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 2) AND (`SourceEntry` IN (-117615, -117616, -117617, -117618, -117619)) AND (`SourceId` = 0) AND (`ConditionTypeOrReference` = 30) AND (`ConditionValue1` = 186457);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(22, 2, -117615, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, -117616, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, -117617, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, -117618, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\''),
|
||||
(22, 2, -117619, 0, 0, 30, 1, 186457, 20, 0, 1, 0, 0, '', 'Don\'t spawn multiple fire gameobjects for quests \'Mission: Eternal Flame\' and \'Mission: Plague This!\'');
|
||||
@@ -0,0 +1,75 @@
|
||||
-- DB update 2026_08_02_01 -> 2026_08_02_02
|
||||
--
|
||||
DELETE FROM `waypoints` WHERE `entry` IN (24826, 24831, 24827, 24832, 24828, 24829);
|
||||
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `point_comment`) VALUES
|
||||
-- Level 1 Casts ID - 44617 Flight Control from Entry: 24826
|
||||
(24826, 1, 280.82797, -5761.3735, 277.73404, NULL, 'Iron Rune Construct - Level 1'),
|
||||
(24826, 2, 280.77197, -5761.0996, 295.87283, NULL, 'Iron Rune Construct - Level 1'),
|
||||
(24826, 3, 260.43723, -5744.7876, 295.87283, NULL, 'Iron Rune Construct - Level 1'),
|
||||
(24826, 4, 235.15402, -5720.8535, 280.4008, NULL, 'Iron Rune Construct - Level 1'),
|
||||
(24826, 5, 200.93599, -5702.767, 250.15074, NULL, 'Iron Rune Construct - Level 1'),
|
||||
(24826, 6, 172.59885, -5707.901, 222.73409, NULL, 'Iron Rune Construct - Level 1'),
|
||||
(24826, 7, 156.39767, -5711.138, 189.6507, NULL, 'Iron Rune Construct - Level 1'),
|
||||
-- Return Casts ID - 44641 Flight Control from Entry: 24831
|
||||
(24831, 1 , 157.4528, -5711.876, 211.86284, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 2 , 156.17014, -5711.024, 232.8862, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 3 , 156.15657, -5710.987, 260.71613, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 4 , 180.31906, -5720.8403, 260.71613, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 5 , 199.37154, -5735.3086, 260.71613, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 6 , 211.77333, -5748.754, 260.71613, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 7 , 223.5114, -5761.5483, 260.71613, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 8 , 223.50467, -5761.7954, 303.86234, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 9 , 229.7093, -5765.8896, 317.5126, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 10, 250.55605, -5760.333, 317.5126, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 11, 265.1381, -5751.5454, 307.11902, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 12, 284.76993, -5753.517, 271.8551, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
(24831, 13, 284.97504, -5753.2534, 268.28796, NULL, 'Iron Rune Construct - Level 1 Return'),
|
||||
-- Level 2: ID - 44618 Flight Control from Entry: 24827
|
||||
(24827, 1 , 278.66238, -5758.194, 279.06732, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 2 , 278.5747, -5758.241, 289.8726, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 3 , 269.04297, -5767.173, 289.8726, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 4 , 239.51433, -5790.2734, 289.8726, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 5 , 247.64844, -5787.9404, 250.62247, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 6 , 268.27203, -5802.7534, 224.31705, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 7 , 272.60754, -5837.522, 197.06702, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 8 , 262.26395, -5870.9893, 161.09479, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 9 , 262.3072, -5887.508, 101.3447, NULL, 'Iron Rune Construct - Level 2'),
|
||||
(24827, 10, 261.9209, -5891.551, 82.983734, NULL, 'Iron Rune Construct - Level 2'),
|
||||
-- Return ID - 44642 Flight Control from Entry: 24832
|
||||
(24832, 1 , 257.1165, -5892.109, 100.22715, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 2 , 259.04214, -5891.484, 146.76863, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 3 , 260.59924, -5892.124, 195.9614, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 4 , 260.35483, -5890.513, 235.85194, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 5 , 255.50754, -5850.0728, 244.8389, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 6 , 254.50412, -5827.996, 244.8389, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 7 , 254.48741, -5827.2915, 274.31253, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 8 , 266.03604, -5779.646, 278.7674, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 9 , 283.13635, -5756.9517, 278.7674, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
(24832, 10, 289.55197, -5750.2974, 268.75247, NULL, 'Iron Rune Construct - Level 2 Return'),
|
||||
-- Ground Level ID - 44619 Flight Control from Entry: 24828
|
||||
(24828, 1 , 276.1676, -5755.2744, 275.984, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 2 , 276.1321, -5755.2983, 295.3451, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 3 , 263.57172, -5775.5312, 295.34512, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 4 , 233.31233, -5806.0596, 295.34512, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 5 , 215.6205, -5821.7324, 288.92853, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 6 , 218.82439, -5826.261, 246.06738, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 7 , 221.03316, -5821.7417, 197.0952, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 8 , 206.45714, -5831.2085, 164.56743, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 9 , 200.56282, -5829.0884, 117.5119, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 10, 164.57916, -5835.1406, 117.51191, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 11, 155.94423, -5830.077, 69.17854, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 12, 156.96501, -5829.7173, 20.01187, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
(24828, 13, 154.16417, -5830.073, 8.539649, NULL, 'Iron Rune Construct - Ground Level'),
|
||||
-- Return ID - 44620 Flight Control from Entry: 24829
|
||||
(24829, 1 , 158.92567, -5823.2563, 28.678633, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 2 , 159.09982, -5823.481, 77.97439, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 3 , 158.97054, -5823.208, 126.89106, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 4 , 158.79774, -5823.169, 175.94661, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 5 , 159.12772, -5822.8076, 218.19658, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 6 , 158.67703, -5823.0186, 267.9187, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 7 , 178.53484, -5813.614, 274.39093, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 8 , 216.50195, -5794.8096, 274.39093, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 9 , 245.81316, -5780.415, 274.39093, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 10, 278.6206, -5757.555, 274.39093, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 11, 290.01926, -5749.016, 274.39093, NULL, 'Iron Rune Construct - Ground Level Return'),
|
||||
(24829, 12, 290.63077, -5749.0225, 268.97437, NULL, 'Iron Rune Construct - Ground Level Return');
|
||||
Vendored
+2
@@ -47,3 +47,5 @@ if (BUILD_TOOLS_MAPS)
|
||||
add_subdirectory(libmpq)
|
||||
add_subdirectory(fkYAML)
|
||||
endif()
|
||||
|
||||
add_subdirectory(libsidecar)
|
||||
|
||||
Vendored
+4
@@ -85,3 +85,7 @@ recastnavigation (Recast is state of the art navigation mesh construction toolse
|
||||
fkYAML (A C++ header-only YAML library)
|
||||
https://github.com/fktn-k/fkYAML
|
||||
Version: 721edb3e1a817e527fd9e1e18a3bea300822522e
|
||||
|
||||
libsidecar (enables interaction with other components when the worldserver is running in cluster mode. It requires building a shared library first and putting it in the corresponding folder.)
|
||||
https://github.com/walkline/ToCloud9/tree/master/game-server/libsidecar
|
||||
Version: master
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# we changed this because jemalloc/jemalloc#2900 isn't in a tagged release yet
|
||||
diff --git a/deps/jemalloc/src/jemalloc_cpp.cpp b/deps/jemalloc/src/jemalloc_cpp.cpp
|
||||
index da0441a7c..05d5c3a7c 100644
|
||||
--- a/deps/jemalloc/src/jemalloc_cpp.cpp
|
||||
+++ b/deps/jemalloc/src/jemalloc_cpp.cpp
|
||||
@@ -67,7 +67,7 @@ handleOOM(std::size_t size, bool nothrow) {
|
||||
}
|
||||
|
||||
if (ptr == nullptr && !nothrow)
|
||||
- std::__throw_bad_alloc();
|
||||
+ throw std::bad_alloc();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -67,7 +67,7 @@ handleOOM(std::size_t size, bool nothrow) {
|
||||
}
|
||||
|
||||
if (ptr == nullptr && !nothrow)
|
||||
std::__throw_bad_alloc();
|
||||
throw std::bad_alloc();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
Vendored
+66
@@ -0,0 +1,66 @@
|
||||
#
|
||||
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||
#
|
||||
# This file is free software; as a special exception the author gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
|
||||
# Use stub implementation only when the real libsidecar is disabled.
|
||||
if (NOT USE_REAL_LIBSIDECAR)
|
||||
|
||||
file(GLOB sources stub/*.c stub/*.h)
|
||||
|
||||
add_library(libsidecar STATIC ${sources})
|
||||
|
||||
set_target_properties(libsidecar
|
||||
PROPERTIES
|
||||
LINKER_LANGUAGE
|
||||
CXX
|
||||
INTERFACE_INCLUDE_DIRECTORIES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/stub)
|
||||
|
||||
else()
|
||||
add_library(libsidecar SHARED IMPORTED GLOBAL)
|
||||
|
||||
# Determine the correct library extension based on platform
|
||||
if(WIN32)
|
||||
set(LIBSIDECAR_EXTENSION "dll")
|
||||
set(LIBSIDECAR_IMPORT_LIB "libsidecar.lib")
|
||||
elseif(APPLE)
|
||||
set(LIBSIDECAR_EXTENSION "dylib")
|
||||
else()
|
||||
set(LIBSIDECAR_EXTENSION "so")
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
set_target_properties(libsidecar
|
||||
PROPERTIES
|
||||
IMPORTED_LOCATION
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libsidecar.${LIBSIDECAR_EXTENSION}
|
||||
IMPORTED_IMPLIB
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${LIBSIDECAR_IMPORT_LIB}
|
||||
INTERFACE_INCLUDE_DIRECTORIES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
else()
|
||||
set_target_properties(libsidecar
|
||||
PROPERTIES
|
||||
IMPORTED_LOCATION
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libsidecar.${LIBSIDECAR_EXTENSION}
|
||||
INTERFACE_INCLUDE_DIRECTORIES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
IMPORTED_NO_SONAME
|
||||
true)
|
||||
|
||||
set_target_properties(libsidecar PROPERTIES
|
||||
IMPORTED_LOCATION_NOCONFIG
|
||||
"${CMAKE_INSTALL_RPATH}/libsidecar.${LIBSIDECAR_EXTENSION}"
|
||||
IMPORTED_SONAME_NOCONFIG
|
||||
"libsidecar.${LIBSIDECAR_EXTENSION}")
|
||||
endif()
|
||||
|
||||
endif()
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
#ifndef __BATTLEGROUND_API__
|
||||
#define __BATTLEGROUND_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum BattlegroundErrorCode {
|
||||
BattlegroundErrorCodeNoError = 0,
|
||||
BattlegroundErrorCodeNoHandler = 1,
|
||||
BattlegroundErrorFailedToCreateBG = 2,
|
||||
BattlegroundErrorBattlegroundNotFound = 3,
|
||||
} BattlegroundErrorCode;
|
||||
|
||||
typedef struct {
|
||||
uint8_t battlegroundTypeID;
|
||||
uint32_t arenaType;
|
||||
bool isRated;
|
||||
uint32_t mapID;
|
||||
uint8_t bracketLvl;
|
||||
uint64_t *hordePlayersToAdd;
|
||||
int hordePlayersToAddSize;
|
||||
uint64_t *alliancePlayersToAdd;
|
||||
int alliancePlayersToAddSize;
|
||||
uint64_t *randomBGPlayers;
|
||||
int randomBGPlayersSize;
|
||||
} BattlegroundStartRequest;
|
||||
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint64_t instanceID;
|
||||
uint64_t instanceClientID;
|
||||
} BattlegroundStartResponse;
|
||||
|
||||
typedef BattlegroundStartResponse (*BattlegroundStartHandler) (BattlegroundStartRequest* request);
|
||||
void SetBattlegroundStartHandler(BattlegroundStartHandler h);
|
||||
BattlegroundStartResponse CallBattlegroundStartHandler(BattlegroundStartRequest* request);
|
||||
|
||||
typedef struct {
|
||||
uint8_t battlegroundTypeID;
|
||||
uint64_t instanceID;
|
||||
uint64_t *hordePlayersToAdd;
|
||||
int hordePlayersToAddSize;
|
||||
uint64_t *alliancePlayersToAdd;
|
||||
int alliancePlayersToAddSize;
|
||||
uint64_t *randomBGPlayers;
|
||||
int randomBGPlayersSize;
|
||||
} BattlegroundAddPlayersRequest;
|
||||
|
||||
typedef BattlegroundErrorCode (*BattlegroundAddPlayersHandler) (BattlegroundAddPlayersRequest* request);
|
||||
void SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
|
||||
BattlegroundErrorCode CallBattlegroundAddPlayersHandler(BattlegroundAddPlayersRequest* request);
|
||||
|
||||
typedef enum BattlegroundJoinCheckErrorCode {
|
||||
BattlegroundJoinCheckErrorCodeOK = 0,
|
||||
BattlegroundJoinCheckErrorCodeNoHook = 1,
|
||||
BattlegroundJoinCheckErrorCodeResponseIsFalse = 2,
|
||||
BattlegroundJoinCheckErrorCodePlayerNotFound = 3,
|
||||
} BattlegroundJoinCheckErrorCode;
|
||||
|
||||
typedef BattlegroundJoinCheckErrorCode (*CanPlayerJoinBattlegroundQueueHandler)(uint64_t playerGuid);
|
||||
void SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
|
||||
BattlegroundJoinCheckErrorCode CallCanPlayerJoinBattlegroundQueueHandler(uint64_t playerGuid);
|
||||
|
||||
typedef BattlegroundJoinCheckErrorCode (*CanPlayerTeleportToBattlegroundHandler)(uint64_t playerGuid);
|
||||
void SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
|
||||
BattlegroundJoinCheckErrorCode CallCanPlayerTeleportToBattlegroundHandler(uint64_t playerGuid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
#ifndef __EVENT_GROUP__
|
||||
#define __EVENT_GROUP__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum GroupStatus {
|
||||
GroupHookStatusOK = 0,
|
||||
GroupHookStatusNoHook = 1
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t guid;
|
||||
uint64_t leader;
|
||||
uint8_t lootMethod;
|
||||
uint64_t looterGuid;
|
||||
uint8_t lootThreshold;
|
||||
uint8_t groupType;
|
||||
uint8_t difficulty;
|
||||
uint8_t raidDifficulty;
|
||||
uint64_t masterLooterGuid;
|
||||
uint64_t *members;
|
||||
uint8_t membersSize;
|
||||
} EventObjectGroup;
|
||||
|
||||
typedef void (*OnGroupCreatedHook) (EventObjectGroup *group);
|
||||
void SetOnGroupCreatedHook(OnGroupCreatedHook h);
|
||||
int CallOnGroupCreatedHook(EventObjectGroup *group);
|
||||
|
||||
typedef void (*OnGroupMemberAddedHook) (uint32_t guid, uint64_t newMemberGuid);
|
||||
void SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
|
||||
int CallOnGroupMemberAddedHook(uint32_t guid, uint64_t newMemberGuid);
|
||||
|
||||
typedef void (*OnGroupMemberRemovedHook) (uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
|
||||
void SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
|
||||
int CallOnGroupMemberRemovedHook(uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
|
||||
|
||||
typedef void (*OnGroupDisbandedHook) (uint32_t guid);
|
||||
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
|
||||
int CallOnGroupDisbandedHook(uint32_t guid);
|
||||
|
||||
typedef void (*OnGroupLootTypeChangedHook) (uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
|
||||
void SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
|
||||
int CallOnGroupLootTypeChangedHook(uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
|
||||
|
||||
typedef void (*OnGroupDungeonDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
|
||||
void SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
|
||||
int CallOnGroupDungeonDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
|
||||
|
||||
typedef void (*OnGroupRaidDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
|
||||
void SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
|
||||
int CallOnGroupRaidDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
|
||||
|
||||
typedef void (*OnGroupConvertedToRaidHook) (uint32_t guid);
|
||||
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
|
||||
int CallOnGroupConvertedToRaidHook(uint32_t guid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
#ifndef __EVENT_GUILD__
|
||||
#define __EVENT_GUILD__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum GuildHookStatus {
|
||||
GuildHookStatusOK = 0,
|
||||
GuildHookStatusNoHook = 1
|
||||
};
|
||||
|
||||
typedef void (*OnGuildMemberAddedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
|
||||
void SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
|
||||
int CallOnGuildMemberAddedHook(uint64_t guild_id, uint64_t player_guid);
|
||||
|
||||
typedef void (*OnGuildMemberLeftHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
|
||||
void SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
|
||||
int CallOnGuildMemberLeftHook(uint64_t guild_id, uint64_t player_guid);
|
||||
|
||||
typedef void (*OnGuildMemberRemovedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
|
||||
void SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
|
||||
int CallOnGuildMemberRemovedHook(uint64_t guild_id, uint64_t player_guid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef __EVENT_SERVERS_REGISTRY__
|
||||
#define __EVENT_SERVERS_REGISTRY__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum ServersRegistryStatus {
|
||||
ServersRegistryHookStatusOK = 0,
|
||||
ServersRegistryHookStatusNoHook = 1
|
||||
};
|
||||
|
||||
typedef void (*OnMapsReassignedHook) (uint32_t* /*maps_added*/, int /*maps_added_size*/, uint32_t* /*maps_removed*/, int /*maps_removed_size*/);
|
||||
void SetOnMapsReassignedHook(OnMapsReassignedHook h);
|
||||
int CallOnMapsReassignedHook(uint32_t* maps_added, int maps_added_size, uint32_t* maps_removed, int maps_removed_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Vendored
+116
@@ -0,0 +1,116 @@
|
||||
#ifndef __LIBSIDECAR_H__
|
||||
#define __LIBSIDECAR_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Export/import decoration for Windows DLL */
|
||||
#ifdef _WIN32
|
||||
#ifdef TC9_BUILDING_DLL
|
||||
#define TC9_API __declspec(dllexport)
|
||||
#else
|
||||
#define TC9_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#ifdef TC9_BUILDING_DLL
|
||||
#define TC9_API __attribute__((visibility("default")))
|
||||
#else
|
||||
#define TC9_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Include all API headers */
|
||||
#include "battleground-api.h"
|
||||
#include "events-group.h"
|
||||
#include "events-guild.h"
|
||||
#include "events-servers-registry.h"
|
||||
#include "monitoring.h"
|
||||
#include "player-interactions-api.h"
|
||||
#include "player-items-api.h"
|
||||
#include "player-money-api.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Main library functions */
|
||||
TC9_API void TC9InitLib(uint16_t port, uint32_t realmID, uint8_t isCrossRealm, char* availableMaps, uint32_t** assignedMaps, int* assignedMapsSize);
|
||||
TC9_API void TC9GracefulShutdown();
|
||||
TC9_API void TC9ProcessGRPCOrHTTPRequests();
|
||||
TC9_API void TC9ProcessEventsHooks();
|
||||
|
||||
/* GUID generation */
|
||||
TC9_API uint64_t TC9GetNextAvailableCharacterGuid(int realmID);
|
||||
TC9_API uint64_t TC9GetNextAvailableItemGuid(int realmID);
|
||||
TC9_API uint64_t TC9GetNextAvailableInstanceGuid(int realmID);
|
||||
|
||||
/* Map loading notification */
|
||||
TC9_API void TC9ReadyToAcceptPlayersFromMaps(uint32_t* maps, int mapsLen);
|
||||
|
||||
/* Generic NATS pub/sub. Payloads are opaque bytes, subjects are arbitrary.
|
||||
* Subscription callbacks run on the thread draining TC9ProcessEventsHooks
|
||||
* (the world update thread), not on the NATS delivery thread. Both return
|
||||
* 0 on success, -1 on failure.
|
||||
*
|
||||
* Example — a mod broadcasting and consuming its own events:
|
||||
*
|
||||
* // Publish (any thread):
|
||||
* const char msg[] = "{\"zone\":1519,\"boss\":466}";
|
||||
* TC9NatsPublish("mymod.boss.spawned", msg, sizeof(msg) - 1);
|
||||
*
|
||||
* // Subscribe once at startup; the handler runs on the world update
|
||||
* // thread, so it is safe to touch game state from it:
|
||||
* void OnBossSpawned(const char* subject, const char* payload, int payloadLen)
|
||||
* {
|
||||
* std::string data(payload, payloadLen); // payload is not NUL-terminated
|
||||
* // ... react to the event ...
|
||||
* }
|
||||
* TC9NatsSubscribe("mymod.boss.spawned", &OnBossSpawned);
|
||||
*/
|
||||
typedef void (*TC9NatsMessageHandler)(const char* subject, const char* payload, int payloadLen);
|
||||
TC9_API int TC9NatsPublish(const char* subject, const char* payload, int payloadLen);
|
||||
TC9_API int TC9NatsSubscribe(const char* subject, TC9NatsMessageHandler handler);
|
||||
|
||||
/* Matchmaking notifications */
|
||||
TC9_API void TC9PlayerLeftBattleground(uint64_t playerGUID, uint32_t realmID, uint32_t instanceID);
|
||||
TC9_API void TC9BattlegroundStatusChanged(uint32_t instanceID, uint8_t status);
|
||||
|
||||
/* Event hooks registration */
|
||||
TC9_API void TC9SetOnGroupCreatedHook(OnGroupCreatedHook h);
|
||||
TC9_API void TC9SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
|
||||
TC9_API void TC9SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
|
||||
TC9_API void TC9SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
|
||||
TC9_API void TC9SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
|
||||
TC9_API void TC9SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
|
||||
TC9_API void TC9SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
|
||||
TC9_API void TC9SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
|
||||
|
||||
TC9_API void TC9SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
|
||||
TC9_API void TC9SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
|
||||
TC9_API void TC9SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
|
||||
|
||||
TC9_API void TC9SetOnMapsReassignedHook(OnMapsReassignedHook h);
|
||||
|
||||
/* Handler registration for gRPC requests */
|
||||
TC9_API void TC9SetBattlegroundStartHandler(BattlegroundStartHandler h);
|
||||
TC9_API void TC9SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
|
||||
TC9_API void TC9SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
|
||||
TC9_API void TC9SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
|
||||
|
||||
TC9_API void TC9SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
|
||||
|
||||
TC9_API void TC9SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
|
||||
TC9_API void TC9SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
|
||||
|
||||
TC9_API void TC9SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
|
||||
TC9_API void TC9SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
|
||||
TC9_API void TC9SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
|
||||
|
||||
TC9_API void TC9SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
|
||||
TC9_API void TC9SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __LIBSIDECAR_H__ */
|
||||
Vendored
+36
@@ -0,0 +1,36 @@
|
||||
#ifndef __MONITORING__
|
||||
#define __MONITORING__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum MonitoringErrorCode {
|
||||
MonitoringErrorCodeNoError = 0,
|
||||
MonitoringErrorCodeNoHandler = 1,
|
||||
} MonitoringErrorCode;
|
||||
|
||||
// MonitoringDataCollectorResponse request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint32_t connectedPlayers;
|
||||
uint32_t diffMean;
|
||||
uint32_t diffMedian;
|
||||
uint32_t diff95Percentile;
|
||||
uint32_t diff99Percentile;
|
||||
uint32_t diffMaxPercentile;
|
||||
} MonitoringDataCollectorResponse;
|
||||
|
||||
typedef MonitoringDataCollectorResponse (*MonitoringDataCollectorHandler)();
|
||||
void SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
|
||||
MonitoringDataCollectorResponse CallMonitoringDataCollectorHandler();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
#ifndef __PLAYER_INTERACTIONS_API__
|
||||
#define __PLAYER_INTERACTIONS_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum PlayerInteractionErrorCode {
|
||||
PlayerInteractionErrorCodeNoError = 0,
|
||||
PlayerInteractionErrorCodeNoHandler = 1,
|
||||
PlayerInteractionErrorCodeCodePlayerNotFound = 2,
|
||||
} PlayerInteractionErrorCode;
|
||||
|
||||
// CanPlayerInteractWithNPCAndFlags request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
bool canInteract;
|
||||
} CanPlayerInteractWithNPCAndFlagsResponse;
|
||||
|
||||
typedef CanPlayerInteractWithNPCAndFlagsResponse (*CanPlayerInteractWithNPCAndFlagsHandler) (uint64_t /*playerGUID*/, uint64_t /*npcGUID*/, uint32_t /*npcFlags*/);
|
||||
void SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
|
||||
CanPlayerInteractWithNPCAndFlagsResponse CallCanPlayerInteractWithNPCAndFlagsHandler(uint64_t player_guid, uint64_t npc_guid, uint32_t npc_flags);
|
||||
|
||||
// CanPlayerInteractWithGOAndType request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
bool canInteract;
|
||||
} CanPlayerInteractWithGOAndTypeResponse;
|
||||
|
||||
typedef CanPlayerInteractWithGOAndTypeResponse (*CanPlayerInteractWithGOAndTypeHandler) (uint64_t /*playerGUID*/, uint64_t /*goGUID*/, uint8_t /*goType*/);
|
||||
void SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
|
||||
CanPlayerInteractWithGOAndTypeResponse CallCanPlayerInteractWithGOAndTypeHandler(uint64_t player_guid, uint64_t go_guid, uint8_t go_type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
#ifndef __PLAYER_ITEMS_API__
|
||||
#define __PLAYER_ITEMS_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum PlayerItemErrorCode {
|
||||
PlayerItemErrorCodeNoError = 0,
|
||||
PlayerItemErrorCodeNoHandler = 1,
|
||||
PlayerItemErrorCodePlayerNotFound = 2,
|
||||
PlayerItemErrorNoInventorySpace = 3,
|
||||
PlayerItemErrorUnknownTemplate = 4,
|
||||
PlayerItemErrorFailedToCreateItem = 5
|
||||
} PlayerItemErrorCode;
|
||||
|
||||
// GetPlayerItemsByGuids request.
|
||||
typedef struct {
|
||||
uint64_t guid;
|
||||
uint32_t entry;
|
||||
uint64_t owner;
|
||||
uint8_t bagSlot;
|
||||
uint8_t slot;
|
||||
bool isTradable;
|
||||
uint32_t count;
|
||||
uint16_t flags;
|
||||
uint8_t durability;
|
||||
int8_t randomPropertyID;
|
||||
const char* text;
|
||||
} PlayerItem;
|
||||
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
PlayerItem* items;
|
||||
int itemsSize;
|
||||
} GetPlayerItemsByGuidsResponse;
|
||||
|
||||
typedef GetPlayerItemsByGuidsResponse (*GetPlayerItemsByGuidsHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/);
|
||||
void SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
|
||||
GetPlayerItemsByGuidsResponse CallGetPlayerItemsByGuidsHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size);
|
||||
|
||||
// RemoveItemsWithGuidsFromPlayer request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint64_t* updatedItems;
|
||||
int updatedItemsSize;
|
||||
} RemoveItemsWithGuidsFromPlayerResponse;
|
||||
|
||||
typedef RemoveItemsWithGuidsFromPlayerResponse (*RemoveItemsWithGuidsFromPlayerHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/, uint64_t /*assign_player_guid*/);
|
||||
void SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
|
||||
RemoveItemsWithGuidsFromPlayerResponse CallRemoveItemsWithGuidsFromPlayerHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size, uint64_t assign_player_guid);
|
||||
|
||||
// AddExistingItemToPlayer request.
|
||||
typedef struct {
|
||||
uint64_t playerGuid;
|
||||
uint64_t itemGuid;
|
||||
uint32_t itemEntry;
|
||||
uint32_t itemCount;
|
||||
uint16_t itemFlags;
|
||||
uint8_t itemDurability;
|
||||
int8_t itemRandomPropertyID;
|
||||
} AddExistingItemToPlayerRequest;
|
||||
|
||||
typedef PlayerItemErrorCode (*AddExistingItemToPlayerHandler) (AddExistingItemToPlayerRequest*);
|
||||
void SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
|
||||
PlayerItemErrorCode CallAddExistingItemToPlayerHandler(AddExistingItemToPlayerRequest*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
#ifndef __PLAYER_MONEY_API__
|
||||
#define __PLAYER_MONEY_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum PlayerMoneyErrorCode {
|
||||
PlayerMoneyErrorCodeNoError = 0,
|
||||
PlayerMoneyErrorCodeNoHandler = 1,
|
||||
PlayerMoneyErrorCodePlayerNotFound = 2,
|
||||
PlayerMoneyErrorCodeTooMuchMoney = 3,
|
||||
} PlayerMoneyErrorCode;
|
||||
|
||||
// GetMoneyForPlayer request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint32_t money;
|
||||
} GetMoneyForPlayerResponse;
|
||||
|
||||
typedef GetMoneyForPlayerResponse (*GetMoneyForPlayerHandler) (uint64_t /*player_guid*/);
|
||||
void SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
|
||||
GetMoneyForPlayerResponse CallGetMoneyForPlayerHandler(uint64_t player_guid);
|
||||
|
||||
// ModifyMoneyForPlayer request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint32_t newMoneyValue;
|
||||
} ModifyMoneyForPlayerResponse;
|
||||
|
||||
typedef ModifyMoneyForPlayerResponse (*ModifyMoneyForPlayerHandler) (uint64_t /*player_guid*/, int32_t /*amount*/);
|
||||
void SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
|
||||
ModifyMoneyForPlayerResponse CallModifyMoneyForPlayerHandler(uint64_t player_guid, int32_t amount);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
#include "battleground-api.h"
|
||||
|
||||
static BattlegroundStartHandler battlegroundStartHandler;
|
||||
void SetBattlegroundStartHandler(BattlegroundStartHandler h) {
|
||||
battlegroundStartHandler = h;
|
||||
}
|
||||
|
||||
BattlegroundStartResponse CallBattlegroundStartHandler(BattlegroundStartRequest* request) {
|
||||
if (battlegroundStartHandler == 0) {
|
||||
BattlegroundStartResponse resp;
|
||||
resp.errorCode = BattlegroundErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return battlegroundStartHandler(request);
|
||||
}
|
||||
|
||||
static BattlegroundAddPlayersHandler battlegroundAddPlayersHandler;
|
||||
void SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h) {
|
||||
battlegroundAddPlayersHandler = h;
|
||||
}
|
||||
|
||||
BattlegroundErrorCode CallBattlegroundAddPlayersHandler(BattlegroundAddPlayersRequest* request) {
|
||||
if (battlegroundAddPlayersHandler == 0) {
|
||||
return BattlegroundErrorCodeNoHandler;
|
||||
}
|
||||
|
||||
return battlegroundAddPlayersHandler(request);
|
||||
}
|
||||
|
||||
static CanPlayerJoinBattlegroundQueueHandler canPlayerJoinBattlegroundQueueHandler = 0;
|
||||
|
||||
void SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h) {
|
||||
canPlayerJoinBattlegroundQueueHandler = h;
|
||||
}
|
||||
|
||||
BattlegroundJoinCheckErrorCode CallCanPlayerJoinBattlegroundQueueHandler(uint64_t playerGuid) {
|
||||
if (canPlayerJoinBattlegroundQueueHandler == 0) {
|
||||
return BattlegroundJoinCheckErrorCodeNoHook;
|
||||
}
|
||||
return canPlayerJoinBattlegroundQueueHandler(playerGuid);
|
||||
}
|
||||
|
||||
static CanPlayerTeleportToBattlegroundHandler canPlayerTeleportToBattlegroundHandler = 0;
|
||||
|
||||
void SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h) {
|
||||
canPlayerTeleportToBattlegroundHandler = h;
|
||||
}
|
||||
|
||||
BattlegroundJoinCheckErrorCode CallCanPlayerTeleportToBattlegroundHandler(uint64_t playerGuid) {
|
||||
if (canPlayerTeleportToBattlegroundHandler == 0) {
|
||||
return BattlegroundJoinCheckErrorCodeNoHook;
|
||||
}
|
||||
return canPlayerTeleportToBattlegroundHandler(playerGuid);
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
#ifndef __BATTLEGROUND_API__
|
||||
#define __BATTLEGROUND_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef enum BattlegroundErrorCode {
|
||||
BattlegroundErrorCodeNoError = 0,
|
||||
BattlegroundErrorCodeNoHandler = 1,
|
||||
BattlegroundErrorFailedToCreateBG = 2,
|
||||
BattlegroundErrorBattlegroundNotFound = 3,
|
||||
} BattlegroundErrorCode;
|
||||
|
||||
typedef struct {
|
||||
uint8_t battlegroundTypeID;
|
||||
uint32_t arenaType;
|
||||
bool isRated;
|
||||
uint32_t mapID;
|
||||
uint8_t bracketLvl;
|
||||
uint64_t *hordePlayersToAdd;
|
||||
int hordePlayersToAddSize;
|
||||
uint64_t *alliancePlayersToAdd;
|
||||
int alliancePlayersToAddSize;
|
||||
uint64_t *randomBGPlayers;
|
||||
int randomBGPlayersSize;
|
||||
} BattlegroundStartRequest;
|
||||
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint64_t instanceID;
|
||||
uint64_t instanceClientID;
|
||||
} BattlegroundStartResponse;
|
||||
|
||||
typedef BattlegroundStartResponse (*BattlegroundStartHandler) (BattlegroundStartRequest* request);
|
||||
void SetBattlegroundStartHandler(BattlegroundStartHandler h);
|
||||
BattlegroundStartResponse CallBattlegroundStartHandler(BattlegroundStartRequest* request);
|
||||
|
||||
typedef struct {
|
||||
uint8_t battlegroundTypeID;
|
||||
uint64_t instanceID;
|
||||
uint64_t *hordePlayersToAdd;
|
||||
int hordePlayersToAddSize;
|
||||
uint64_t *alliancePlayersToAdd;
|
||||
int alliancePlayersToAddSize;
|
||||
uint64_t *randomBGPlayers;
|
||||
int randomBGPlayersSize;
|
||||
} BattlegroundAddPlayersRequest;
|
||||
|
||||
typedef BattlegroundErrorCode (*BattlegroundAddPlayersHandler) (BattlegroundAddPlayersRequest* request);
|
||||
void SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
|
||||
BattlegroundErrorCode CallBattlegroundAddPlayersHandler(BattlegroundAddPlayersRequest* request);
|
||||
|
||||
typedef enum BattlegroundJoinCheckErrorCode {
|
||||
BattlegroundJoinCheckErrorCodeOK = 0,
|
||||
BattlegroundJoinCheckErrorCodeNoHook = 1,
|
||||
BattlegroundJoinCheckErrorCodeResponseIsFalse = 2,
|
||||
BattlegroundJoinCheckErrorCodePlayerNotFound = 3,
|
||||
} BattlegroundJoinCheckErrorCode;
|
||||
|
||||
typedef BattlegroundJoinCheckErrorCode (*CanPlayerJoinBattlegroundQueueHandler)(uint64_t playerGuid);
|
||||
void SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
|
||||
BattlegroundJoinCheckErrorCode CallCanPlayerJoinBattlegroundQueueHandler(uint64_t playerGuid);
|
||||
|
||||
typedef BattlegroundJoinCheckErrorCode (*CanPlayerTeleportToBattlegroundHandler)(uint64_t playerGuid);
|
||||
void SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
|
||||
BattlegroundJoinCheckErrorCode CallCanPlayerTeleportToBattlegroundHandler(uint64_t playerGuid);
|
||||
|
||||
#endif
|
||||
Vendored
+117
@@ -0,0 +1,117 @@
|
||||
#include "events-group.h"
|
||||
|
||||
// OnGroupCreatedHook
|
||||
OnGroupCreatedHook groupCreatedHook;
|
||||
void SetOnGroupCreatedHook(OnGroupCreatedHook h) {
|
||||
groupCreatedHook = h;
|
||||
}
|
||||
|
||||
int CallOnGroupCreatedHook(EventObjectGroup *group) {
|
||||
if (groupCreatedHook == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupCreatedHook(group);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
// GroupMemberAdded
|
||||
static OnGroupMemberAddedHook groupMemberAddedHook;
|
||||
void SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h) {
|
||||
groupMemberAddedHook = h;
|
||||
}
|
||||
|
||||
int CallOnGroupMemberAddedHook(uint32_t guid, uint64_t newMemberGuid) {
|
||||
if (groupMemberAddedHook == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupMemberAddedHook(guid, newMemberGuid);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
// GroupMemberRemoved
|
||||
static OnGroupMemberRemovedHook groupMemberRemovedHook;
|
||||
void SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h) {
|
||||
groupMemberRemovedHook = h;
|
||||
}
|
||||
|
||||
int CallOnGroupMemberRemovedHook(uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid) {
|
||||
if (groupMemberRemovedHook == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupMemberRemovedHook(guid, removedMemberGuid, newLeaderGuid);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
|
||||
typedef void (*OnGroupDisbandedHook) (uint32_t guid);
|
||||
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
|
||||
int CallOnGroupDisbandedHook(uint32_t guid);
|
||||
|
||||
static OnGroupDisbandedHook groupDisbandedHook;
|
||||
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h) {
|
||||
groupDisbandedHook = h;
|
||||
}
|
||||
|
||||
int CallOnGroupDisbandedHook(uint32_t guid) {
|
||||
if (groupDisbandedHook == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupDisbandedHook(guid);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
static OnGroupLootTypeChangedHook groupLootTypeChanged;
|
||||
void SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h) {
|
||||
groupLootTypeChanged = h;
|
||||
}
|
||||
|
||||
int CallOnGroupLootTypeChangedHook(uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold) {
|
||||
if (groupLootTypeChanged == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupLootTypeChanged(guid, lootMethod, looter, lootThreshold);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
static OnGroupDungeonDifficultyChangedHook groupDungeonDifficultyChanged;
|
||||
void SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h) {
|
||||
groupDungeonDifficultyChanged = h;
|
||||
}
|
||||
|
||||
int CallOnGroupDungeonDifficultyChangedHook(uint32_t guid, uint8_t difficulty) {
|
||||
if (groupDungeonDifficultyChanged == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupDungeonDifficultyChanged(guid, difficulty);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
static OnGroupRaidDifficultyChangedHook groupRaidDifficultyChanged;
|
||||
void SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h) {
|
||||
groupRaidDifficultyChanged = h;
|
||||
}
|
||||
|
||||
int CallOnGroupRaidDifficultyChangedHook(uint32_t guid, uint8_t difficulty) {
|
||||
if (groupRaidDifficultyChanged == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupRaidDifficultyChanged(guid, difficulty);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
|
||||
typedef void (*OnGroupConvertedToRaidHook) (uint32_t guid);
|
||||
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
|
||||
int CallOnGroupConvertedToRaidHook(uint32_t guid);
|
||||
|
||||
static OnGroupConvertedToRaidHook groupConvertedToRaid;
|
||||
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h) {
|
||||
groupConvertedToRaid = h;
|
||||
}
|
||||
|
||||
int CallOnGroupConvertedToRaidHook(uint32_t guid) {
|
||||
if (groupConvertedToRaid == 0) {
|
||||
return GroupHookStatusNoHook;
|
||||
}
|
||||
groupConvertedToRaid(guid);
|
||||
return GroupHookStatusOK;
|
||||
}
|
||||
Vendored
+58
@@ -0,0 +1,58 @@
|
||||
#ifndef __EVENT_GROUP__
|
||||
#define __EVENT_GROUP__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
enum GroupStatus {
|
||||
GroupHookStatusOK = 0,
|
||||
GroupHookStatusNoHook = 1
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t guid;
|
||||
uint64_t leader;
|
||||
uint8_t lootMethod;
|
||||
uint64_t looterGuid;
|
||||
uint8_t lootThreshold;
|
||||
uint8_t groupType;
|
||||
uint8_t difficulty;
|
||||
uint8_t raidDifficulty;
|
||||
uint64_t masterLooterGuid;
|
||||
uint64_t *members;
|
||||
uint8_t membersSize;
|
||||
} EventObjectGroup;
|
||||
|
||||
typedef void (*OnGroupCreatedHook) (EventObjectGroup *group);
|
||||
void SetOnGroupCreatedHook(OnGroupCreatedHook h);
|
||||
int CallOnGroupCreatedHook(EventObjectGroup *group);
|
||||
|
||||
typedef void (*OnGroupMemberAddedHook) (uint32_t guid, uint64_t newMemberGuid);
|
||||
void SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
|
||||
int CallOnGroupMemberAddedHook(uint32_t guid, uint64_t newMemberGuid);
|
||||
|
||||
typedef void (*OnGroupMemberRemovedHook) (uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
|
||||
void SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
|
||||
int CallOnGroupMemberRemovedHook(uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
|
||||
|
||||
typedef void (*OnGroupDisbandedHook) (uint32_t guid);
|
||||
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
|
||||
int CallOnGroupDisbandedHook(uint32_t guid);
|
||||
|
||||
typedef void (*OnGroupLootTypeChangedHook) (uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
|
||||
void SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
|
||||
int CallOnGroupLootTypeChangedHook(uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
|
||||
|
||||
typedef void (*OnGroupDungeonDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
|
||||
void SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
|
||||
int CallOnGroupDungeonDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
|
||||
|
||||
typedef void (*OnGroupRaidDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
|
||||
void SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
|
||||
int CallOnGroupRaidDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
|
||||
|
||||
typedef void (*OnGroupConvertedToRaidHook) (uint32_t guid);
|
||||
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
|
||||
int CallOnGroupConvertedToRaidHook(uint32_t guid);
|
||||
|
||||
#endif
|
||||
Vendored
+43
@@ -0,0 +1,43 @@
|
||||
#include "events-guild.h"
|
||||
|
||||
// GuildMemberAddedHook
|
||||
OnGuildMemberAddedHook guildMemberAddedHook;
|
||||
void SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h) {
|
||||
guildMemberAddedHook = h;
|
||||
}
|
||||
|
||||
int CallOnGuildMemberAddedHook(uint64_t guild_id, uint64_t player_guid) {
|
||||
if (guildMemberAddedHook == 0) {
|
||||
return GuildHookStatusNoHook;
|
||||
}
|
||||
guildMemberAddedHook(guild_id, player_guid);
|
||||
return GuildHookStatusOK;
|
||||
}
|
||||
|
||||
// GuildMemberLeft
|
||||
static OnGuildMemberLeftHook guildMemberLeftHook;
|
||||
void SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h) {
|
||||
guildMemberLeftHook = h;
|
||||
}
|
||||
|
||||
int CallOnGuildMemberLeftHook(uint64_t guild_id, uint64_t player_guid) {
|
||||
if (guildMemberLeftHook == 0) {
|
||||
return GuildHookStatusNoHook;
|
||||
}
|
||||
guildMemberLeftHook(guild_id, player_guid);
|
||||
return GuildHookStatusOK;
|
||||
}
|
||||
|
||||
// GuildMemberRemoved
|
||||
static OnGuildMemberRemovedHook guildMemberRemovedHook;
|
||||
void SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h) {
|
||||
guildMemberRemovedHook = h;
|
||||
}
|
||||
|
||||
int CallOnGuildMemberRemovedHook(uint64_t guild_id, uint64_t player_guid) {
|
||||
if (guildMemberRemovedHook == 0) {
|
||||
return GuildHookStatusNoHook;
|
||||
}
|
||||
guildMemberRemovedHook(guild_id, player_guid);
|
||||
return GuildHookStatusOK;
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
#ifndef __EVENT_GUILD__
|
||||
#define __EVENT_GUILD__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum GuildHookStatus {
|
||||
GuildHookStatusOK = 0,
|
||||
GuildHookStatusNoHook = 1
|
||||
};
|
||||
|
||||
typedef void (*OnGuildMemberAddedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
|
||||
void SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
|
||||
int CallOnGuildMemberAddedHook(uint64_t guild_id, uint64_t player_guid);
|
||||
|
||||
typedef void (*OnGuildMemberLeftHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
|
||||
void SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
|
||||
int CallOnGuildMemberLeftHook(uint64_t guild_id, uint64_t player_guid);
|
||||
|
||||
typedef void (*OnGuildMemberRemovedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
|
||||
void SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
|
||||
int CallOnGuildMemberRemovedHook(uint64_t guild_id, uint64_t player_guid);
|
||||
|
||||
#endif
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
#include "events-servers-registry.h"
|
||||
|
||||
// MapsReassignedHook
|
||||
OnMapsReassignedHook mapsReassignedHook;
|
||||
void SetOnMapsReassignedHook(OnMapsReassignedHook h) {
|
||||
mapsReassignedHook = h;
|
||||
}
|
||||
|
||||
int CallOnMapsReassignedHook(uint32_t* maps_added, int maps_added_size, uint32_t* maps_removed, int maps_removed_size) {
|
||||
if (mapsReassignedHook == 0) {
|
||||
return ServersRegistryHookStatusNoHook;
|
||||
}
|
||||
mapsReassignedHook(maps_added, maps_added_size, maps_removed, maps_removed_size);
|
||||
return ServersRegistryHookStatusOK;
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
#ifndef __EVENT_SERVERS_REGISTRY__
|
||||
#define __EVENT_SERVERS_REGISTRY__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum ServersRegistryStatus {
|
||||
ServersRegistryHookStatusOK = 0,
|
||||
ServersRegistryHookStatusNoHook = 1
|
||||
};
|
||||
|
||||
typedef void (*OnMapsReassignedHook) (uint32_t* /*maps_added*/, int /*maps_added_size*/, uint32_t* /*maps_removed*/, int /*maps_removed_size*/);
|
||||
void SetOnMapsReassignedHook(OnMapsReassignedHook h);
|
||||
int CallOnMapsReassignedHook(uint32_t* maps_added, int maps_added_size, uint32_t* maps_removed, int maps_removed_size);
|
||||
|
||||
#endif
|
||||
Vendored
+138
@@ -0,0 +1,138 @@
|
||||
#include "libsidecar.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void panicWithTC9Unavailable(const char* message) {
|
||||
fprintf(stderr, "Tried to call '%s', but using stub for libsidecar. Use -DUSE_REAL_LIBSIDECAR=ON in cmake to use the real one.\n", message);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// TC9SetBattlegroundStartHandler sets handler for starting battleground.
|
||||
//
|
||||
extern void TC9SetBattlegroundStartHandler(BattlegroundStartHandler h) { panicWithTC9Unavailable("TC9SetBattlegroundStartHandler"); }
|
||||
|
||||
// TC9SetBattlegroundAddPlayersHandler sets handler for adding players to battleground.
|
||||
//
|
||||
extern void TC9SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h) { panicWithTC9Unavailable("TC9SetBattlegroundAddPlayersHandler"); }
|
||||
|
||||
void TC9SetOnGroupCreatedHook(OnGroupCreatedHook h) { panicWithTC9Unavailable("TC9SetOnGroupCreatedHook"); }
|
||||
|
||||
// TC9SetOnGroupMemberAddedHook sets hook for member added event.
|
||||
//
|
||||
void TC9SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h) { panicWithTC9Unavailable("TC9SetOnGroupMemberAddedHook"); }
|
||||
|
||||
// TC9SetOnGroupMemberRemovedHook sets hook for member left/kicked event.
|
||||
//
|
||||
void TC9SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h) { panicWithTC9Unavailable("TC9SetOnGroupMemberRemovedHook"); }
|
||||
|
||||
// TC9SetOnGroupDisbandedHook sets hook for group disbanded event.
|
||||
//
|
||||
void TC9SetOnGroupDisbandedHook(OnGroupDisbandedHook h) { panicWithTC9Unavailable("TC9SetOnGroupDisbandedHook"); }
|
||||
|
||||
// TC9SetOnGroupLootTypeChangedHook sets hook for group loot type changed event.
|
||||
//
|
||||
void TC9SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h) { panicWithTC9Unavailable("TC9SetOnGroupLootTypeChangedHook"); }
|
||||
|
||||
// TC9SetOnGroupDungeonDifficultyChangedHook sets hook for group dungeon difficulty changed event.
|
||||
//
|
||||
void TC9SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h) { panicWithTC9Unavailable("TC9SetOnGroupDungeonDifficultyChangedHook"); }
|
||||
|
||||
// TC9SetOnGroupRaidDifficultyChangedHook sets hook for group raid difficulty changed event.
|
||||
//
|
||||
void TC9SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h) { panicWithTC9Unavailable("TC9SetOnGroupRaidDifficultyChangedHook"); }
|
||||
|
||||
// TC9SetOnGroupConvertedToRaidHook sets hook for group converted to raid event.
|
||||
//
|
||||
void TC9SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h) { panicWithTC9Unavailable("TC9SetOnGroupConvertedToRaidHook"); }
|
||||
|
||||
void TC9SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h) { panicWithTC9Unavailable("TC9SetOnGuildMemberAddedHook"); }
|
||||
|
||||
// TC9SetOnGuildMemberRemovedHook sets hook for guild member removed (kicked) event.
|
||||
void TC9SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h) { panicWithTC9Unavailable("TC9SetOnGuildMemberRemovedHook"); }
|
||||
|
||||
// TC9SetOnGuildMemberLeftHook sets hook for guild member left event.
|
||||
void TC9SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h) { panicWithTC9Unavailable("TC9SetOnGuildMemberLeftHook"); }
|
||||
|
||||
// TC9ProcessEventsHooks calls all events hooks.
|
||||
void TC9ProcessEventsHooks() { panicWithTC9Unavailable("TC9ProcessEventsHooks"); }
|
||||
|
||||
// TC9ProcessGRPCOrHTTPRequests calls all grpc or http handlers in queue.
|
||||
//
|
||||
void TC9ProcessGRPCOrHTTPRequests() { panicWithTC9Unavailable("TC9ProcessGRPCOrHTTPRequests"); }
|
||||
|
||||
// TC9GetNextAvailableCharacterGuid returns next available characters GUID. Thread unsafe.
|
||||
uint64_t TC9GetNextAvailableCharacterGuid(int realmID) { panicWithTC9Unavailable("TC9GetNextAvailableCharacterGuid"); return 0; }
|
||||
|
||||
// TC9GetNextAvailableItemGuid returns next available item GUID. Thread unsafe.
|
||||
uint64_t TC9GetNextAvailableItemGuid(int realmID) { panicWithTC9Unavailable("TC9GetNextAvailableItemGuid"); return 0; }
|
||||
|
||||
// TC9GetNextAvailableInstanceGuid returns next available dungeon/raid instance GUID. Thread unsafe.
|
||||
uint64_t TC9GetNextAvailableInstanceGuid(int realmID) { panicWithTC9Unavailable("TC9GetNextAvailableInstanceGuid"); return 0; }
|
||||
|
||||
// TC9InitLib inits lib by starting services like grpc and healthcheck.
|
||||
// Adds game server to the servers registry that will make this server visible for game load balancer.
|
||||
//
|
||||
void TC9InitLib(uint16_t port, uint32_t realmID, uint8_t isCrossRealm, char* availableMaps, uint32_t** assignedMaps, int* assignedMapsSize) { panicWithTC9Unavailable("TC9InitLib"); }
|
||||
|
||||
// TC9GracefulShutdown gracefully stops all running services.
|
||||
//
|
||||
void TC9GracefulShutdown() { panicWithTC9Unavailable("TC9GracefulShutdown"); }
|
||||
|
||||
// TC9ReadyToAcceptPlayersFromMaps notifies servers registry that this server
|
||||
// loaded maps related data and ready to accept players from those maps.
|
||||
//
|
||||
void TC9ReadyToAcceptPlayersFromMaps(uint32_t* maps, int mapsLen) { panicWithTC9Unavailable("TC9ReadyToAcceptPlayersFromMaps"); }
|
||||
|
||||
// TC9SetCanPlayerInteractWithNPCAndFlagsHandler sets handler for can player interact with NPC and with given NPC flags request.
|
||||
//
|
||||
void TC9SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerInteractWithNPCAndFlagsHandler"); }
|
||||
|
||||
// TC9SetCanPlayerInteractWithGOAndTypeHandler sets handler for can player interact with GameObject and with given object type request.
|
||||
//
|
||||
void TC9SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerInteractWithGOAndTypeHandler"); }
|
||||
|
||||
// TC9SetGetPlayerItemsByGuidsHandler sets handler for getting players item by guids request.
|
||||
void TC9SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h) { panicWithTC9Unavailable("TC9SetGetPlayerItemsByGuidsHandler"); }
|
||||
|
||||
// TC9SetRemoveItemsWithGuidsFromPlayerHandler sets handler for removing items by guids from player request.
|
||||
void TC9SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h) { panicWithTC9Unavailable("TC9SetRemoveItemsWithGuidsFromPlayerHandler"); }
|
||||
|
||||
// TC9SetAddExistingItemToPlayerHandler sets handler for adding item to player request.
|
||||
void TC9SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h) { panicWithTC9Unavailable("TC9SetAddExistingItemToPlayerHandler"); }
|
||||
|
||||
// TC9SetGetMoneyForPlayerHandler sets handler for getting money for player request.
|
||||
//
|
||||
void TC9SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h) { panicWithTC9Unavailable("TC9SetGetMoneyForPlayerHandler"); }
|
||||
|
||||
// TC9SetModifyMoneyForPlayerHandler sets handler for modify money for given player request.
|
||||
//
|
||||
void TC9SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h) { panicWithTC9Unavailable("TC9SetModifyMoneyForPlayerHandler"); }
|
||||
|
||||
|
||||
// TC9SetOnMapsReassignedHook sets hook for maps reassigning by servers registry event.
|
||||
//
|
||||
void TC9SetOnMapsReassignedHook(OnMapsReassignedHook h) { panicWithTC9Unavailable("TC9SetOnMapsReassignedHook"); }
|
||||
|
||||
// TC9SetMonitoringDataCollectorHandler sets handler for getting data to handle monitoring request.
|
||||
//
|
||||
void TC9SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h) { panicWithTC9Unavailable("TC9SetMonitoringDataCollectorHandler"); }
|
||||
|
||||
// TC9NatsPublish/Subscribe generic NATS pub/sub for in-process extensions
|
||||
int TC9NatsPublish(const char* subject, const char* payload, int payloadLen) { panicWithTC9Unavailable("TC9NatsPublish"); return -1; }
|
||||
int TC9NatsSubscribe(const char* subject, TC9NatsMessageHandler handler) { panicWithTC9Unavailable("TC9NatsSubscribe"); return -1; }
|
||||
|
||||
// TC9PlayerLeftBattleground notifies matchmaking server that player left battleground
|
||||
//
|
||||
void TC9PlayerLeftBattleground(uint64_t playerGUID, uint32_t realmID, uint32_t instanceID) { panicWithTC9Unavailable("TC9PlayerLeftBattleground"); }
|
||||
|
||||
// TC9BattlegroundStatusChanged notifies matchmaking server that battleground status changed
|
||||
//
|
||||
void TC9BattlegroundStatusChanged(uint32_t instanceID, uint8_t status) { panicWithTC9Unavailable("TC9BattlegroundStatusChanged"); }
|
||||
|
||||
// TC9SetCanPlayerJoinBattlegroundQueueHandler sets handler for checking if player can join to battleground queue.
|
||||
//
|
||||
void TC9SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerJoinBattlegroundQueueHandler"); }
|
||||
|
||||
// TC9SetCanPlayerTeleportToBattlegroundHandler sets handler for checking if player can teleport to battleground.
|
||||
//
|
||||
void TC9SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerTeleportToBattlegroundHandler"); }
|
||||
Vendored
+84
@@ -0,0 +1,84 @@
|
||||
#ifndef __LIBSIDECAR_H__
|
||||
#define __LIBSIDECAR_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Include all API headers */
|
||||
#include "battleground-api.h"
|
||||
#include "events-group.h"
|
||||
#include "events-guild.h"
|
||||
#include "events-servers-registry.h"
|
||||
#include "monitoring.h"
|
||||
#include "player-interactions-api.h"
|
||||
#include "player-items-api.h"
|
||||
#include "player-money-api.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Main library functions */
|
||||
void TC9InitLib(uint16_t port, uint32_t realmID, uint8_t isCrossRealm, char* availableMaps, uint32_t** assignedMaps, int* assignedMapsSize);
|
||||
void TC9GracefulShutdown();
|
||||
void TC9ProcessGRPCOrHTTPRequests();
|
||||
void TC9ProcessEventsHooks();
|
||||
|
||||
/* GUID generation */
|
||||
uint64_t TC9GetNextAvailableCharacterGuid(int realmID);
|
||||
uint64_t TC9GetNextAvailableItemGuid(int realmID);
|
||||
uint64_t TC9GetNextAvailableInstanceGuid(int realmID);
|
||||
|
||||
/* Map loading notification */
|
||||
void TC9ReadyToAcceptPlayersFromMaps(uint32_t* maps, int mapsLen);
|
||||
|
||||
/* Generic NATS pub/sub for in-process extensions. Subscribe callbacks run
|
||||
* on the thread that calls TC9ProcessEventsHooks. Call after TC9InitLib.
|
||||
* Both return 0 on success, -1 on error. */
|
||||
typedef void (*TC9NatsMessageHandler)(const char* subject, const char* payload, int payloadLen);
|
||||
int TC9NatsPublish(const char* subject, const char* payload, int payloadLen);
|
||||
int TC9NatsSubscribe(const char* subject, TC9NatsMessageHandler handler);
|
||||
|
||||
/* Matchmaking notifications */
|
||||
void TC9PlayerLeftBattleground(uint64_t playerGUID, uint32_t realmID, uint32_t instanceID);
|
||||
void TC9BattlegroundStatusChanged(uint32_t instanceID, uint8_t status);
|
||||
|
||||
/* Event hooks registration */
|
||||
void TC9SetOnGroupCreatedHook(OnGroupCreatedHook h);
|
||||
void TC9SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
|
||||
void TC9SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
|
||||
void TC9SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
|
||||
void TC9SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
|
||||
void TC9SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
|
||||
void TC9SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
|
||||
void TC9SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
|
||||
|
||||
void TC9SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
|
||||
void TC9SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
|
||||
void TC9SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
|
||||
|
||||
void TC9SetOnMapsReassignedHook(OnMapsReassignedHook h);
|
||||
|
||||
/* Handler registration for gRPC requests */
|
||||
void TC9SetBattlegroundStartHandler(BattlegroundStartHandler h);
|
||||
void TC9SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
|
||||
void TC9SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
|
||||
void TC9SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
|
||||
|
||||
void TC9SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
|
||||
|
||||
void TC9SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
|
||||
void TC9SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
|
||||
|
||||
void TC9SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
|
||||
void TC9SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
|
||||
void TC9SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
|
||||
|
||||
void TC9SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
|
||||
void TC9SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __LIBSIDECAR_H__ */
|
||||
Vendored
+16
@@ -0,0 +1,16 @@
|
||||
#include "monitoring.h"
|
||||
|
||||
static MonitoringDataCollectorHandler monitoringDataCollectorHandler;
|
||||
void SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h) {
|
||||
monitoringDataCollectorHandler = h;
|
||||
}
|
||||
|
||||
MonitoringDataCollectorResponse CallMonitoringDataCollectorHandler() {
|
||||
if (monitoringDataCollectorHandler == 0) {
|
||||
MonitoringDataCollectorResponse resp;
|
||||
resp.errorCode = MonitoringErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return monitoringDataCollectorHandler();
|
||||
}
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
#ifndef __MONITORING__
|
||||
#define __MONITORING__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef enum MonitoringErrorCode {
|
||||
MonitoringErrorCodeNoError = 0,
|
||||
MonitoringErrorCodeNoHandler = 1,
|
||||
} MonitoringErrorCode;
|
||||
|
||||
// MonitoringDataCollectorResponse request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint32_t connectedPlayers;
|
||||
uint32_t diffMean;
|
||||
uint32_t diffMedian;
|
||||
uint32_t diff95Percentile;
|
||||
uint32_t diff99Percentile;
|
||||
uint32_t diffMaxPercentile;
|
||||
} MonitoringDataCollectorResponse;
|
||||
|
||||
typedef MonitoringDataCollectorResponse (*MonitoringDataCollectorHandler)();
|
||||
void SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
|
||||
MonitoringDataCollectorResponse CallMonitoringDataCollectorHandler();
|
||||
|
||||
#endif
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
#include "player-interactions-api.h"
|
||||
|
||||
static CanPlayerInteractWithNPCAndFlagsHandler canPlayerInteractWithNPCAndFlagsHandler;
|
||||
void SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h) {
|
||||
canPlayerInteractWithNPCAndFlagsHandler = h;
|
||||
}
|
||||
|
||||
CanPlayerInteractWithNPCAndFlagsResponse CallCanPlayerInteractWithNPCAndFlagsHandler(uint64_t player_guid, uint64_t npc_guid, uint32_t npc_flags) {
|
||||
if (canPlayerInteractWithNPCAndFlagsHandler == 0) {
|
||||
CanPlayerInteractWithNPCAndFlagsResponse resp;
|
||||
resp.errorCode = PlayerInteractionErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return canPlayerInteractWithNPCAndFlagsHandler(player_guid, npc_guid, npc_flags);
|
||||
}
|
||||
|
||||
static CanPlayerInteractWithGOAndTypeHandler canPlayerInteractWithGOAndTypeHandler;
|
||||
void SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h) {
|
||||
canPlayerInteractWithGOAndTypeHandler = h;
|
||||
}
|
||||
|
||||
CanPlayerInteractWithGOAndTypeResponse CallCanPlayerInteractWithGOAndTypeHandler(uint64_t player_guid, uint64_t go_guid, uint8_t go_type) {
|
||||
if (canPlayerInteractWithGOAndTypeHandler == 0) {
|
||||
CanPlayerInteractWithGOAndTypeResponse resp;
|
||||
resp.errorCode = PlayerInteractionErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return canPlayerInteractWithGOAndTypeHandler(player_guid, go_guid, go_type);
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
#ifndef __PLAYER_INTERACTIONS_API__
|
||||
#define __PLAYER_INTERACTIONS_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef enum PlayerInteractionErrorCode {
|
||||
PlayerInteractionErrorCodeNoError = 0,
|
||||
PlayerInteractionErrorCodeNoHandler = 1,
|
||||
PlayerInteractionErrorCodeCodePlayerNotFound = 2,
|
||||
} PlayerInteractionErrorCode;
|
||||
|
||||
// CanPlayerInteractWithNPCAndFlags request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
bool canInteract;
|
||||
} CanPlayerInteractWithNPCAndFlagsResponse;
|
||||
|
||||
typedef CanPlayerInteractWithNPCAndFlagsResponse (*CanPlayerInteractWithNPCAndFlagsHandler) (uint64_t /*playerGUID*/, uint64_t /*npcGUID*/, uint32_t /*npcFlags*/);
|
||||
void SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
|
||||
CanPlayerInteractWithNPCAndFlagsResponse CallCanPlayerInteractWithNPCAndFlagsHandler(uint64_t player_guid, uint64_t npc_guid, uint32_t npc_flags);
|
||||
|
||||
// CanPlayerInteractWithGOAndType request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
bool canInteract;
|
||||
} CanPlayerInteractWithGOAndTypeResponse;
|
||||
|
||||
typedef CanPlayerInteractWithGOAndTypeResponse (*CanPlayerInteractWithGOAndTypeHandler) (uint64_t /*playerGUID*/, uint64_t /*goGUID*/, uint8_t /*goType*/);
|
||||
void SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
|
||||
CanPlayerInteractWithGOAndTypeResponse CallCanPlayerInteractWithGOAndTypeHandler(uint64_t player_guid, uint64_t go_guid, uint8_t go_type);
|
||||
|
||||
#endif
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
#include "player-items-api.h"
|
||||
|
||||
static GetPlayerItemsByGuidsHandler getPlayerItemsByGuidsHandler;
|
||||
void SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h) {
|
||||
getPlayerItemsByGuidsHandler = h;
|
||||
}
|
||||
|
||||
GetPlayerItemsByGuidsResponse CallGetPlayerItemsByGuidsHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size) {
|
||||
if (getPlayerItemsByGuidsHandler == 0) {
|
||||
GetPlayerItemsByGuidsResponse resp;
|
||||
resp.errorCode = PlayerItemErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return getPlayerItemsByGuidsHandler(player_guid, items_guids, items_guids_size);
|
||||
}
|
||||
|
||||
static RemoveItemsWithGuidsFromPlayerHandler removeItemsWithGuidsFromPlayerHandler;
|
||||
void SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h) {
|
||||
removeItemsWithGuidsFromPlayerHandler = h;
|
||||
}
|
||||
|
||||
RemoveItemsWithGuidsFromPlayerResponse CallRemoveItemsWithGuidsFromPlayerHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size, uint64_t assign_player_guid) {
|
||||
if (removeItemsWithGuidsFromPlayerHandler == 0) {
|
||||
RemoveItemsWithGuidsFromPlayerResponse resp;
|
||||
resp.errorCode = PlayerItemErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return removeItemsWithGuidsFromPlayerHandler(player_guid, items_guids, items_guids_size, assign_player_guid);
|
||||
}
|
||||
|
||||
static AddExistingItemToPlayerHandler addExistingItemToPlayerHandler;
|
||||
void SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h) {
|
||||
addExistingItemToPlayerHandler = h;
|
||||
}
|
||||
|
||||
PlayerItemErrorCode CallAddExistingItemToPlayerHandler(AddExistingItemToPlayerRequest *r) {
|
||||
if (addExistingItemToPlayerHandler == 0) {
|
||||
return PlayerItemErrorCodeNoHandler;
|
||||
}
|
||||
|
||||
return addExistingItemToPlayerHandler(r);
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
#ifndef __PLAYER_ITEMS_API__
|
||||
#define __PLAYER_ITEMS_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef enum PlayerItemErrorCode {
|
||||
PlayerItemErrorCodeNoError = 0,
|
||||
PlayerItemErrorCodeNoHandler = 1,
|
||||
PlayerItemErrorCodePlayerNotFound = 2,
|
||||
PlayerItemErrorNoInventorySpace = 3,
|
||||
PlayerItemErrorUnknownTemplate = 4,
|
||||
PlayerItemErrorFailedToCreateItem = 5
|
||||
} PlayerItemErrorCode;
|
||||
|
||||
// GetPlayerItemsByGuids request.
|
||||
typedef struct {
|
||||
uint64_t guid;
|
||||
uint32_t entry;
|
||||
uint64_t owner;
|
||||
uint8_t bagSlot;
|
||||
uint8_t slot;
|
||||
bool isTradable;
|
||||
uint32_t count;
|
||||
uint16_t flags;
|
||||
uint8_t durability;
|
||||
int8_t randomPropertyID;
|
||||
const char* text;
|
||||
} PlayerItem;
|
||||
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
PlayerItem* items;
|
||||
int itemsSize;
|
||||
} GetPlayerItemsByGuidsResponse;
|
||||
|
||||
typedef GetPlayerItemsByGuidsResponse (*GetPlayerItemsByGuidsHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/);
|
||||
void SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
|
||||
GetPlayerItemsByGuidsResponse CallGetPlayerItemsByGuidsHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size);
|
||||
|
||||
// RemoveItemsWithGuidsFromPlayer request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint64_t* updatedItems;
|
||||
int updatedItemsSize;
|
||||
} RemoveItemsWithGuidsFromPlayerResponse;
|
||||
|
||||
typedef RemoveItemsWithGuidsFromPlayerResponse (*RemoveItemsWithGuidsFromPlayerHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/, uint64_t /*assign_player_guid*/);
|
||||
void SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
|
||||
RemoveItemsWithGuidsFromPlayerResponse CallRemoveItemsWithGuidsFromPlayerHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size, uint64_t assign_player_guid);
|
||||
|
||||
// AddExistingItemToPlayer request.
|
||||
typedef struct {
|
||||
uint64_t playerGuid;
|
||||
uint64_t itemGuid;
|
||||
uint32_t itemEntry;
|
||||
uint32_t itemCount;
|
||||
uint16_t itemFlags;
|
||||
uint8_t itemDurability;
|
||||
int8_t itemRandomPropertyID;
|
||||
} AddExistingItemToPlayerRequest;
|
||||
|
||||
typedef PlayerItemErrorCode (*AddExistingItemToPlayerHandler) (AddExistingItemToPlayerRequest*);
|
||||
void SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
|
||||
PlayerItemErrorCode CallAddExistingItemToPlayerHandler(AddExistingItemToPlayerRequest*);
|
||||
|
||||
#endif
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
#include "player-money-api.h"
|
||||
|
||||
static GetMoneyForPlayerHandler getMoneyForPlayerHandler;
|
||||
void SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h) {
|
||||
getMoneyForPlayerHandler = h;
|
||||
}
|
||||
|
||||
GetMoneyForPlayerResponse CallGetMoneyForPlayerHandler(uint64_t player_guid) {
|
||||
if (getMoneyForPlayerHandler == 0) {
|
||||
GetMoneyForPlayerResponse resp;
|
||||
resp.errorCode = PlayerMoneyErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return getMoneyForPlayerHandler(player_guid);
|
||||
}
|
||||
|
||||
static ModifyMoneyForPlayerHandler modifyMoneyForPlayerHandler;
|
||||
void SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h) {
|
||||
modifyMoneyForPlayerHandler = h;
|
||||
}
|
||||
|
||||
ModifyMoneyForPlayerResponse CallModifyMoneyForPlayerHandler(uint64_t player_guid, int32_t amount) {
|
||||
if (modifyMoneyForPlayerHandler == 0) {
|
||||
ModifyMoneyForPlayerResponse resp;
|
||||
resp.errorCode = PlayerMoneyErrorCodeNoHandler;
|
||||
return resp;
|
||||
}
|
||||
|
||||
return modifyMoneyForPlayerHandler(player_guid, amount);
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
#ifndef __PLAYER_MONEY_API__
|
||||
#define __PLAYER_MONEY_API__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef enum PlayerMoneyErrorCode {
|
||||
PlayerMoneyErrorCodeNoError = 0,
|
||||
PlayerMoneyErrorCodeNoHandler = 1,
|
||||
PlayerMoneyErrorCodePlayerNotFound = 2,
|
||||
PlayerMoneyErrorCodeTooMuchMoney = 3,
|
||||
} PlayerMoneyErrorCode;
|
||||
|
||||
// GetMoneyForPlayer request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint32_t money;
|
||||
} GetMoneyForPlayerResponse;
|
||||
|
||||
typedef GetMoneyForPlayerResponse (*GetMoneyForPlayerHandler) (uint64_t /*player_guid*/);
|
||||
void SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
|
||||
GetMoneyForPlayerResponse CallGetMoneyForPlayerHandler(uint64_t player_guid);
|
||||
|
||||
// ModifyMoneyForPlayer request.
|
||||
typedef struct {
|
||||
int errorCode;
|
||||
uint32_t newMoneyValue;
|
||||
} ModifyMoneyForPlayerResponse;
|
||||
|
||||
typedef ModifyMoneyForPlayerResponse (*ModifyMoneyForPlayerHandler) (uint64_t /*player_guid*/, int32_t /*amount*/);
|
||||
void SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
|
||||
ModifyMoneyForPlayerResponse CallModifyMoneyForPlayerHandler(uint64_t player_guid, int32_t amount);
|
||||
|
||||
#endif
|
||||
@@ -121,6 +121,12 @@ else()
|
||||
message("* Use GIT revision hash : Yes (default)")
|
||||
endif()
|
||||
|
||||
if ( USE_REAL_LIBSIDECAR )
|
||||
message("* Use stub for libsidecar : No")
|
||||
else()
|
||||
message("* Use stub for libsidecar : Yes")
|
||||
endif()
|
||||
|
||||
if ( NOJEM )
|
||||
message("")
|
||||
message(" *** NOJEM - WARNING!")
|
||||
|
||||
@@ -198,7 +198,8 @@ bool GameObjectModel::intersectRay(G3D::Ray const& ray, float& MaxDist, bool Sto
|
||||
|
||||
bool GameObjectModel::GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationInfo& info, uint32 ph_mask) const
|
||||
{
|
||||
if (!(phasemask & ph_mask) || !owner->IsSpawned() || !IsMapObject())
|
||||
// transports provide inaccurate area info while moving (e.g. Booty Bay - Ratchet boat, see #7335)
|
||||
if (!(phasemask & ph_mask) || !owner->IsSpawned() || !IsMapObject() || owner->IsTransport())
|
||||
return false;
|
||||
|
||||
if (!iBound.contains(point))
|
||||
@@ -216,6 +217,8 @@ bool GameObjectModel::GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationI
|
||||
float world_Z = ((modelGround * iInvRot) * iScale + iPos).z;
|
||||
if (info.ground_Z < world_Z)
|
||||
{
|
||||
info.rootId = groupInfo.rootId;
|
||||
info.hitModel = groupInfo.hitModel;
|
||||
info.ground_Z = world_Z;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ public:
|
||||
virtual ~GameObjectModelOwnerBase() = default;
|
||||
|
||||
[[nodiscard]] virtual bool IsSpawned() const = 0;
|
||||
[[nodiscard]] virtual bool IsTransport() const { return false; }
|
||||
[[nodiscard]] virtual uint32 GetDisplayId() const = 0;
|
||||
[[nodiscard]] virtual uint32 GetPhaseMask() const = 0;
|
||||
[[nodiscard]] virtual G3D::Vector3 GetPosition() const = 0;
|
||||
|
||||
@@ -139,7 +139,8 @@ foreach(APPLICATION_NAME ${APPLICATIONS_BUILD_LIST})
|
||||
game
|
||||
gsoap
|
||||
readline
|
||||
gperftools)
|
||||
gperftools
|
||||
libsidecar)
|
||||
|
||||
if (UNIX AND NOT NOJEM)
|
||||
set(${APP_PROJECT_NAME}_LINK_FLAGS "-pthread -lncurses ${${APP_PROJECT_NAME}_LINK_FLAGS}")
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "AuthSocketMgr.h"
|
||||
#include "Banner.h"
|
||||
#include "Config.h"
|
||||
#include "DBUpdater.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "DatabaseLoader.h"
|
||||
#include "GitRevision.h"
|
||||
@@ -142,13 +143,23 @@ int main(int argc, char** argv)
|
||||
|
||||
if (sRealmList->GetRealms().empty())
|
||||
{
|
||||
LOG_ERROR("server.authserver", "No valid realms specified.");
|
||||
LOG_ERROR("server.authserver", "No valid realms specified. Possible reasons:");
|
||||
LOG_ERROR("server.authserver", "- the realmlist table of the auth database is empty");
|
||||
LOG_ERROR("server.authserver", "- every realm has flag 3 (REALM_FLAG_VERSION_MISMATCH | REALM_FLAG_OFFLINE), which the realm list "
|
||||
"query excludes. Reset it with: UPDATE realmlist SET flag = 0 WHERE id = <realm id>;");
|
||||
LOG_ERROR("server.authserver", "- no realm address could be resolved, see the resolver errors logged above");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Stop auth server if dry run
|
||||
if (sConfigMgr->isDryRun())
|
||||
{
|
||||
if (uint32 failed = DBUpdaterUtil::GetFailedUpdateCount())
|
||||
{
|
||||
LOG_FATAL("server.authserver", "Dry run completed with {} failed database update(s), terminating.", failed);
|
||||
return 1;
|
||||
}
|
||||
|
||||
LOG_INFO("server.authserver", "Dry run completed, terminating.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -49,10 +49,12 @@
|
||||
#include "SharedDefines.h"
|
||||
#include "SteadyTimer.h"
|
||||
#include "Systemd.h"
|
||||
#include "TC9Sidecar.h"
|
||||
#include "World.h"
|
||||
#include "WorldSessionMgr.h"
|
||||
#include "WorldSocket.h"
|
||||
#include "WorldSocketMgr.h"
|
||||
#include "libsidecar.h"
|
||||
#include <boost/asio/signal_set.hpp>
|
||||
#include <boost/program_options.hpp>
|
||||
#include <csignal>
|
||||
@@ -365,7 +367,8 @@ int main(int argc, char** argv)
|
||||
sWorldSocketMgr.StopNetwork();
|
||||
|
||||
///- Clean database before leaving
|
||||
ClearOnlineAccounts();
|
||||
if (!sToCloud9Sidecar->ClusterModeEnabled())
|
||||
ClearOnlineAccounts();
|
||||
});
|
||||
|
||||
// Set server online (allow connecting now)
|
||||
@@ -397,11 +400,15 @@ int main(int argc, char** argv)
|
||||
cliThread.reset(new std::thread(CliThread), &ShutdownCLIThread);
|
||||
}
|
||||
|
||||
sToCloud9Sidecar->Init(worldPort, realm.Id.Realm);
|
||||
|
||||
WorldUpdateLoop();
|
||||
|
||||
// Shutdown starts here
|
||||
threadPool.reset();
|
||||
|
||||
sToCloud9Sidecar->Deinit();
|
||||
|
||||
sLog->SetSynchronous();
|
||||
|
||||
sScriptMgr->OnShutdown();
|
||||
@@ -460,8 +467,11 @@ bool StartDB()
|
||||
LOG_INFO("server.loading", "Loading World Information...");
|
||||
LOG_INFO("server.loading", "> RealmID: {}", realm.Id.Realm);
|
||||
|
||||
///- Clean the database before starting
|
||||
ClearOnlineAccounts();
|
||||
///- Clean the database before starting.
|
||||
/// Cluster.Enabled is read from config here because sToCloud9Sidecar->Init()
|
||||
/// has not run yet; ClusterModeEnabled() would still be the default false.
|
||||
if (!sConfigMgr->GetOption<bool>("Cluster.Enabled", false))
|
||||
ClearOnlineAccounts();
|
||||
|
||||
///- Insert version info into DB
|
||||
WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_VERSION);
|
||||
|
||||
@@ -72,6 +72,8 @@
|
||||
# DEBUG
|
||||
# DYNAMIC RESPAWN SETTINGS
|
||||
#
|
||||
# CLUSTER SETTINGS
|
||||
#
|
||||
###################################################################################################
|
||||
|
||||
###################################################################################################
|
||||
@@ -1838,6 +1840,20 @@ PlayerSave.Stats.MinLevel = 0
|
||||
|
||||
PlayerSave.Stats.SaveOnlyOnLogout = 1
|
||||
|
||||
#
|
||||
# PlayerSave.AdditionalSaves
|
||||
# Description: Bitmask of player data to save to the database a few seconds after
|
||||
# important changes instead of waiting for the next periodic save
|
||||
# (PlayerSaveInterval). Reduces the progress lost on a server crash.
|
||||
# Combine the values to enable multiple triggers.
|
||||
# Values: 1 - Inventory and gold (after looting an item of rare or better quality)
|
||||
# 2 - Quest status (after quest status changes)
|
||||
# 4 - Achievements (after completing an achievement)
|
||||
# Default: 0 - (Disabled)
|
||||
# 7 - (All of the above)
|
||||
|
||||
PlayerSave.AdditionalSaves = 0
|
||||
|
||||
#
|
||||
# CleanCharacterDB
|
||||
# Description: Clean out deprecated achievements, skills, spells and talents from the db.
|
||||
@@ -4895,3 +4911,56 @@ Respawn.ForceCompatibilityMode = 0
|
||||
# GAME SETTINGS END #
|
||||
# #
|
||||
###################################################################################################
|
||||
|
||||
###################################################################################################
|
||||
# #
|
||||
# CLUSTER SETTINGS BEGIN #
|
||||
# #
|
||||
###################################################################################################
|
||||
|
||||
###################################################################################################
|
||||
# CLUSTER SETTINGS
|
||||
#
|
||||
# This feature is experimental and still under development. It enables cluster mode, allowing multiple
|
||||
# worldservers to run for a single realm, distributing the load between them. Alongside worldservers,
|
||||
# additional services are required for proper functionality. If you encounter any issues, please report
|
||||
# them to the ToCloud9 project: https://github.com/walkline/ToCloud9.
|
||||
#
|
||||
# Cluster.Enabled
|
||||
# Description: Enables/disables cluster mode.
|
||||
# SECURITY: in cluster mode the ToCloud9 gateway is the trusted
|
||||
# authentication boundary. This worldserver then skips session-key
|
||||
# digest verification, packet encryption, warden, IP/country locks,
|
||||
# ban and minimum-security-level enforcement, and the
|
||||
# character-ownership check on login. The worldserver port must
|
||||
# only be reachable by the gateway, never directly by players.
|
||||
# Default: 0 - (Disabled)
|
||||
# 1 - (Enabled)
|
||||
|
||||
Cluster.Enabled=0
|
||||
|
||||
#
|
||||
# Cluster.AvailableMaps
|
||||
# Description: List of available maps id on this server.
|
||||
# Examples: "" - (Can handle any map)
|
||||
# "0,1,573"
|
||||
|
||||
Cluster.AvailableMaps=""
|
||||
|
||||
#
|
||||
# Cluster.IsCrossrealm
|
||||
# Description: Enables cross-realm functionality for a cross-realm setup.
|
||||
# When enabled, a connection to a MySQL cross-realm reverse proxy is required.
|
||||
# Default: 0 - (Disabled)
|
||||
# 1 - (Enabled)
|
||||
|
||||
Cluster.IsCrossrealm=0
|
||||
|
||||
#
|
||||
###################################################################################################
|
||||
|
||||
###################################################################################################
|
||||
# #
|
||||
# CLUSTER SETTINGS END #
|
||||
# #
|
||||
###################################################################################################
|
||||
|
||||
@@ -642,6 +642,13 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
// world_state
|
||||
PrepareStatement(CHAR_SEL_WORLD_STATE, "SELECT Id, Data FROM world_state", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_REP_WORLD_STATE, "REPLACE INTO world_state (Id, Data) VALUES(?, ?)", CONNECTION_ASYNC);
|
||||
|
||||
// CHAR_NO_OP_PROVIDE_REALM_CONTEXT is a no-op query that accepts a single parameter: the realm ID.
|
||||
// This query is used specifically in cross-realm scenarios when the database transaction
|
||||
// lacks sufficient context to determine which realm's database the query should target.
|
||||
// By providing the realm ID explicitly, this ensures that mysql reverse proxy will use
|
||||
// correct realm database for the transaction.
|
||||
PrepareStatement(CHAR_NO_OP_PROVIDE_REALM_CONTEXT, "SELECT ? AS no_op", CONNECTION_ASYNC);
|
||||
}
|
||||
|
||||
CharacterDatabaseConnection::CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo)
|
||||
|
||||
@@ -546,6 +546,8 @@ enum CharacterDatabaseStatements : uint32
|
||||
CHAR_SEL_WORLD_STATE,
|
||||
CHAR_REP_WORLD_STATE,
|
||||
|
||||
CHAR_NO_OP_PROVIDE_REALM_CONTEXT,
|
||||
|
||||
MAX_CHARACTERDATABASE_STATEMENTS
|
||||
};
|
||||
|
||||
|
||||
@@ -64,6 +64,22 @@ std::string& DBUpdaterUtil::corrected_path()
|
||||
return path;
|
||||
}
|
||||
|
||||
uint32& DBUpdaterUtil::failed_updates()
|
||||
{
|
||||
static uint32 count = 0;
|
||||
return count;
|
||||
}
|
||||
|
||||
void DBUpdaterUtil::MarkUpdateFailed()
|
||||
{
|
||||
++failed_updates();
|
||||
}
|
||||
|
||||
uint32 DBUpdaterUtil::GetFailedUpdateCount()
|
||||
{
|
||||
return failed_updates();
|
||||
}
|
||||
|
||||
// Auth Database
|
||||
template<>
|
||||
std::string DBUpdater<LoginDatabaseConnection>::GetConfigEntry()
|
||||
@@ -582,6 +598,10 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos
|
||||
"If you are a developer, please fix your sql query.",
|
||||
path.generic_string(), pool.GetConnectionInfo()->database);
|
||||
|
||||
// Recorded in both modes. A dry run does not throw below, so it keeps attempting the
|
||||
// remaining files and this count is the only thing left to fail the run on.
|
||||
DBUpdaterUtil::MarkUpdateFailed();
|
||||
|
||||
if (!sConfigMgr->isDryRun())
|
||||
{
|
||||
if (uint32 delay = sConfigMgr->GetOption<uint32>("Updates.ExceptionShutdownDelay", 10000))
|
||||
|
||||
@@ -60,8 +60,15 @@ public:
|
||||
|
||||
static bool CheckExecutable();
|
||||
|
||||
// Counts every update file that failed to apply, in any mode. A dry run does not throw
|
||||
// on a bad file, so it keeps going and a single run reports all of them; whoever ends
|
||||
// the run must check this and exit non-zero, otherwise CI goes green on a failed import.
|
||||
static void MarkUpdateFailed();
|
||||
static uint32 GetFailedUpdateCount();
|
||||
|
||||
private:
|
||||
static std::string& corrected_path();
|
||||
static uint32& failed_updates();
|
||||
};
|
||||
|
||||
template <class T>
|
||||
|
||||
@@ -596,7 +596,25 @@ void SmartAI::UpdateAI(uint32 diff)
|
||||
return;
|
||||
|
||||
if (mCanAutoAttack)
|
||||
{
|
||||
UpdateMeleeStance();
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
|
||||
void SmartAI::UpdateMeleeStance()
|
||||
{
|
||||
// Ranged creatures should not switch to melee stance at distance
|
||||
if (!_currentRangeMode || me->IsCrowdControlled())
|
||||
return;
|
||||
|
||||
Unit* victim = me->GetVictim();
|
||||
if (!victim)
|
||||
return;
|
||||
|
||||
bool const canMelee = me->IsWithinMeleeRange(victim);
|
||||
if (canMelee != me->HasUnitState(UNIT_STATE_MELEE_ATTACKING))
|
||||
me->Attack(victim, canMelee);
|
||||
}
|
||||
|
||||
bool SmartAI::IsEscortInvokerInRange()
|
||||
@@ -741,7 +759,9 @@ void SmartAI::EnterEvadeMode(EvadeReason why)
|
||||
|
||||
if (Unit* owner = me->GetCharmerOrOwner())
|
||||
{
|
||||
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle());
|
||||
if (!me->IsVehicle()) // vehicles should not follow their owner (passenger)
|
||||
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle());
|
||||
|
||||
me->ClearUnitState(UNIT_STATE_EVADE);
|
||||
}
|
||||
else if (HasEscortState(SMART_ESCORT_ESCORTING))
|
||||
@@ -927,7 +947,7 @@ void SmartAI::AttackStart(Unit* who)
|
||||
return;
|
||||
}
|
||||
|
||||
if (who && me->Attack(who, mCanAutoAttack))
|
||||
if (who && me->Attack(who, mCanAutoAttack && !_currentRangeMode))
|
||||
{
|
||||
if (!me->HasUnitState(UNIT_STATE_NO_COMBAT_MOVEMENT))
|
||||
{
|
||||
@@ -1202,7 +1222,12 @@ void SmartAI::SetCurrentRangeMode(bool on, float range)
|
||||
_attackDistance = range;
|
||||
|
||||
if (Unit* victim = me->GetVictim())
|
||||
{
|
||||
me->GetMotionMaster()->MoveChase(victim, _attackDistance);
|
||||
|
||||
if (!on && mCanAutoAttack && !me->HasUnitState(UNIT_STATE_MELEE_ATTACKING))
|
||||
me->Attack(victim, true);
|
||||
}
|
||||
}
|
||||
|
||||
void SmartAI::SetMainSpell(uint32 spellId)
|
||||
|
||||
@@ -265,6 +265,7 @@ private:
|
||||
uint32 mDespawnState;
|
||||
void UpdateDespawn(const uint32 diff);
|
||||
void UpdateFollow(const uint32 diff);
|
||||
void UpdateMeleeStance();
|
||||
uint32 mEscortInvokerCheckTimer;
|
||||
bool mJustReset;
|
||||
|
||||
|
||||
@@ -1775,7 +1775,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||
{
|
||||
// those requirements couldn't be found in the dbc
|
||||
AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
|
||||
if (!data || !data->Meets(GetPlayer(), nullptr))
|
||||
if (!data || !data->Meets(GetPlayer(), unit))
|
||||
continue;
|
||||
|
||||
// Check map id requirement
|
||||
@@ -2333,6 +2333,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
|
||||
}
|
||||
}
|
||||
|
||||
_player->AdditionalSavingAddMask(ADDITIONAL_SAVING_ACHIEVEMENTS);
|
||||
|
||||
if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL) && !_player->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS))
|
||||
sAchievementMgr->SetRealmCompleted(achievement);
|
||||
|
||||
|
||||
@@ -342,7 +342,7 @@ void Arena::EndBattleground(TeamId winnerTeamId)
|
||||
// update achievement BEFORE personal rating update
|
||||
uint32 rating = player->GetArenaPersonalRating(winnerArenaTeam->GetSlot());
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, GetMapId());
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, GetMapId(), 0, player);
|
||||
|
||||
// Last standing - Rated 5v5 arena & be solely alive player
|
||||
if (GetArenaType() == ARENA_TYPE_5v5 && aliveWinners == 1 && player->IsAlive())
|
||||
|
||||
@@ -35,10 +35,12 @@
|
||||
#include "ObjectMgr.h"
|
||||
#include "Pet.h"
|
||||
#include "Player.h"
|
||||
#include "Realm.h"
|
||||
#include "RBAC.h"
|
||||
#include "ReputationMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "SpellAuras.h"
|
||||
#include "TC9Sidecar.h"
|
||||
#include "Transport.h"
|
||||
#include "Util.h"
|
||||
#include "World.h"
|
||||
@@ -277,6 +279,12 @@ void Battleground::Update(uint32 diff)
|
||||
if (!GetInvitedCount(TEAM_HORDE) && !GetInvitedCount(TEAM_ALLIANCE))
|
||||
{
|
||||
m_SetDeleteThis = true;
|
||||
|
||||
// Only needed for the sidecar notify inside SetStatus; queue and
|
||||
// spectator code read the status within this manager pass, so do
|
||||
// not change it on non-cluster servers.
|
||||
if (sToCloud9Sidecar->ClusterModeEnabled())
|
||||
SetStatus(STATUS_WAIT_LEAVE);
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -1071,6 +1079,11 @@ void Battleground::RemovePlayerAtLeave(Player* player)
|
||||
// if the player was a match participant
|
||||
if (participant)
|
||||
{
|
||||
if (sToCloud9Sidecar->ClusterModeEnabled())
|
||||
sToCloud9Sidecar->OnPlayerLeftBattleground(player->GetGUID().GetCounter(),
|
||||
player->GetGUID().GetRealmID(),
|
||||
GetInstanceID());
|
||||
|
||||
player->ClearAfkReports();
|
||||
|
||||
WorldPacket data;
|
||||
@@ -1889,3 +1902,11 @@ uint8 Battleground::GetUniqueBracketId() const
|
||||
{
|
||||
return GetMaxLevel() / 10;
|
||||
}
|
||||
|
||||
void Battleground::SetStatus(BattlegroundStatus Status)
|
||||
{
|
||||
m_Status = Status;
|
||||
|
||||
if (sToCloud9Sidecar->ClusterModeEnabled() && GetInstanceID() != 0)
|
||||
sToCloud9Sidecar->OnBattlegroundStatusChanged(GetInstanceID(), Status);
|
||||
}
|
||||
|
||||
@@ -367,7 +367,7 @@ public:
|
||||
void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; }
|
||||
void SetBracket(PvPDifficultyEntry const* bracketEntry);
|
||||
void SetInstanceID(uint32 InstanceID) { m_InstanceID = InstanceID; }
|
||||
void SetStatus(BattlegroundStatus Status) { m_Status = Status; }
|
||||
void SetStatus(BattlegroundStatus Status);
|
||||
void SetClientInstanceID(uint32 InstanceID) { m_ClientInstanceID = InstanceID; }
|
||||
void SetStartTime(uint32 Time) { m_StartTime = Time; }
|
||||
void SetEndTime(uint32 Time) { m_EndTime = Time; }
|
||||
|
||||
@@ -54,7 +54,8 @@ target_link_libraries(game
|
||||
PRIVATE
|
||||
acore-core-interface
|
||||
PUBLIC
|
||||
game-interface)
|
||||
game-interface
|
||||
libsidecar)
|
||||
|
||||
set_target_properties(game
|
||||
PROPERTIES
|
||||
|
||||
@@ -1771,6 +1771,9 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad
|
||||
|
||||
SetHealth(m_deathState == DeathState::Alive ? curhealth : 0);
|
||||
|
||||
// SelectLevel() sized the player damage requirement against full health, before curhealth was known
|
||||
ResetPlayerDamageReq();
|
||||
|
||||
// checked at creature_template loading
|
||||
m_defaultMovementType = MovementGeneratorType(data->movementType);
|
||||
|
||||
@@ -2172,14 +2175,17 @@ void Creature::ForcedDespawn(Milliseconds timeMSToDespawn, Seconds forceRespawnT
|
||||
if (forceRespawnTimer > 0s)
|
||||
m_respawnDelay = forceRespawnTimer.count();
|
||||
|
||||
if (IsAlive())
|
||||
bool const wasAlive = IsAlive();
|
||||
|
||||
if (wasAlive)
|
||||
setDeathState(DeathState::JustDied, true);
|
||||
|
||||
// Xinef: Set new respawn time, ignore corpse decay time...
|
||||
// After setDeathState, m_respawnTime includes m_corpseDelay which we don't
|
||||
// want for a forced respawn. Override it so RemoveCorpse's max() picks ours.
|
||||
if (forceRespawnTimer > 0s)
|
||||
m_respawnTime = GameTime::GetGameTime().count() + forceRespawnTimer.count();
|
||||
// setDeathState(JustDied) folds m_corpseDelay into m_respawnTime, but a creature
|
||||
// despawned while alive never leaves a corpse, so the decay must not be charged.
|
||||
// Recompute so RemoveCorpse's max() has nothing stale to pick up.
|
||||
if (forceRespawnTimer > 0s || wasAlive)
|
||||
m_respawnTime = GameTime::GetGameTime().count() + m_respawnDelay;
|
||||
|
||||
RemoveCorpse(true);
|
||||
|
||||
|
||||
@@ -2968,6 +2968,7 @@ public:
|
||||
explicit GameObjectModelOwnerImpl(GameObject* owner) : _owner(owner) { }
|
||||
|
||||
bool IsSpawned() const override { return _owner->isSpawned(); }
|
||||
bool IsTransport() const override { return _owner->IsTransport(); }
|
||||
uint32 GetDisplayId() const override { return _owner->GetDisplayId(); }
|
||||
uint32 GetPhaseMask() const override { return (_owner->GetGoState() == GO_STATE_READY || _owner->IsTransport()) ? _owner->GetPhaseMask() : 0; }
|
||||
G3D::Vector3 GetPosition() const override { return G3D::Vector3(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); }
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellMgr.h"
|
||||
#include "StringConvert.h"
|
||||
#include "TC9Sidecar.h"
|
||||
#include "Tokenize.h"
|
||||
#include "WorldPacket.h"
|
||||
|
||||
@@ -348,7 +349,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans)
|
||||
uint8 index = 0;
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(uState == ITEM_NEW ? CHAR_REP_ITEM_INSTANCE : CHAR_UPD_ITEM_INSTANCE);
|
||||
stmt->SetData( index, GetEntry());
|
||||
stmt->SetData(++index, GetOwnerGUID().GetCounter());
|
||||
stmt->SetData(++index, GetOwnerGUID().GetRawValue());
|
||||
stmt->SetData(++index, GetGuidValue(ITEM_FIELD_CREATOR).GetCounter());
|
||||
stmt->SetData(++index, GetGuidValue(ITEM_FIELD_GIFTCREATOR).GetCounter());
|
||||
stmt->SetData(++index, GetCount());
|
||||
@@ -381,7 +382,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans)
|
||||
if ((uState == ITEM_CHANGED) && IsWrapped())
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GIFT_OWNER);
|
||||
stmt->SetData(0, GetOwnerGUID().GetCounter());
|
||||
stmt->SetData(0, GetOwnerGUID().GetRawValue());
|
||||
stmt->SetData(1, guid);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -1096,30 +1097,33 @@ Item* Item::CreateItem(uint32 item, uint32 count, Player const* player, bool clo
|
||||
return nullptr; //don't create item at zero count
|
||||
|
||||
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
|
||||
if (pProto)
|
||||
{
|
||||
if (count > pProto->GetMaxStackSize())
|
||||
count = pProto->GetMaxStackSize();
|
||||
|
||||
ASSERT_NODEBUGINFO(count != 0 && "pProto->Stackable == 0 but checked at loading already");
|
||||
|
||||
Item* pItem = NewItemOrBag(pProto);
|
||||
uint32 guid = temp ? 0xFFFFFFFF : sObjectMgr->GetGenerator<HighGuid::Item>().Generate();
|
||||
if (pItem->Create(guid, item, player))
|
||||
{
|
||||
pItem->SetCount(count);
|
||||
if (!clone)
|
||||
pItem->SetItemRandomProperties(randomPropertyId ? randomPropertyId : Item::GenerateItemRandomPropertyId(item));
|
||||
else if (randomPropertyId)
|
||||
pItem->SetItemRandomProperties(randomPropertyId);
|
||||
return pItem;
|
||||
}
|
||||
else
|
||||
delete pItem;
|
||||
}
|
||||
else
|
||||
if (!pProto)
|
||||
ABORT();
|
||||
return nullptr;
|
||||
|
||||
if (count > pProto->GetMaxStackSize())
|
||||
count = pProto->GetMaxStackSize();
|
||||
|
||||
ASSERT_NODEBUGINFO(count != 0 && "pProto->Stackable == 0 but checked at loading already");
|
||||
|
||||
uint16 realmId = DEFAULT_NON_CROSSREALM_REALM_ID;
|
||||
if (sToCloud9Sidecar->IsCrossrealm() && player)
|
||||
realmId = player->GetGUID().GetRealmID();
|
||||
|
||||
Item* pItem = NewItemOrBag(pProto);
|
||||
uint32 guid = temp ? 0xFFFFFFFF : sObjectMgr->GetGenerator<HighGuid::Item>().Generate(realmId);
|
||||
if (!pItem->Create(guid, item, player))
|
||||
{
|
||||
delete pItem;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
pItem->SetCount(count);
|
||||
if (!clone)
|
||||
pItem->SetItemRandomProperties(randomPropertyId ? randomPropertyId : Item::GenerateItemRandomPropertyId(item));
|
||||
else if (randomPropertyId)
|
||||
pItem->SetItemRandomProperties(randomPropertyId);
|
||||
|
||||
return pItem;
|
||||
}
|
||||
|
||||
Item* Item::CloneItem(uint32 count, Player const* player) const
|
||||
|
||||
@@ -121,10 +121,14 @@ void Object::_InitValues()
|
||||
}
|
||||
|
||||
void Object::_Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
|
||||
{
|
||||
_Create(ObjectGuid(guidhigh, entry, guidlow));
|
||||
}
|
||||
|
||||
void Object::_Create(ObjectGuid guid)
|
||||
{
|
||||
if (!m_uint32Values) _InitValues();
|
||||
|
||||
ObjectGuid guid(guidhigh, entry, guidlow);
|
||||
SetGuidValue(OBJECT_FIELD_GUID, guid);
|
||||
SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType);
|
||||
m_PackGUID.Set(guid);
|
||||
|
||||
@@ -241,6 +241,7 @@ protected:
|
||||
|
||||
void _InitValues();
|
||||
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh);
|
||||
void _Create(ObjectGuid guid);
|
||||
[[nodiscard]] std::string _ConcatFields(uint16 startIndex, uint16 size) const;
|
||||
bool _LoadIntoDataField(std::string const& data, uint32 startOffset, uint32 count);
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "ObjectGuid.h"
|
||||
#include "Log.h"
|
||||
#include "TC9Sidecar.h"
|
||||
#include "World.h"
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
@@ -96,6 +97,21 @@ void ObjectGuidGeneratorBase::HandleCounterOverflow(HighGuid high)
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
|
||||
bool ObjectGuidGeneratorBase::GetClusterGuid(HighGuid high, uint16 realmId, ObjectGuid::LowType& clusterGuid)
|
||||
{
|
||||
if (!sToCloud9Sidecar->ClusterModeEnabled())
|
||||
return false;
|
||||
|
||||
if (high == HighGuid::Player)
|
||||
clusterGuid = ObjectGuid::LowType(sToCloud9Sidecar->GenerateCharacterGuid(realmId));
|
||||
else if (high == HighGuid::Item)
|
||||
clusterGuid = ObjectGuid::LowType(sToCloud9Sidecar->GenerateItemGuid(realmId));
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define GUID_TRAIT_INSTANTIATE_GUID( HIGH_GUID ) \
|
||||
template class ObjectGuidGenerator< HIGH_GUID >;
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
// Realm id packed into bits 32-47 of a player ObjectGuid; 0 means local / non-crossrealm.
|
||||
constexpr uint16 DEFAULT_NON_CROSSREALM_REALM_ID = 0;
|
||||
|
||||
enum TypeID
|
||||
{
|
||||
TYPEID_OBJECT = 0,
|
||||
@@ -142,6 +145,7 @@ class ObjectGuid
|
||||
[[nodiscard]] uint64 GetRawValue() const { return _guid; }
|
||||
[[nodiscard]] HighGuid GetHigh() const { return HighGuid((_guid >> 48) & 0x0000FFFF); }
|
||||
[[nodiscard]] uint32 GetEntry() const { return HasEntry() ? uint32((_guid >> 24) & UI64LIT(0x0000000000FFFFFF)) : 0; }
|
||||
[[nodiscard]] uint16 GetRealmID() const { return IsPlayer() ? uint16((_guid >> 32) & UI64LIT(0xFFFF)) : 0; }
|
||||
[[nodiscard]] LowType GetCounter() const
|
||||
{
|
||||
return HasEntry()
|
||||
@@ -283,12 +287,13 @@ public:
|
||||
ObjectGuidGeneratorBase(ObjectGuid::LowType start = 1) : _nextGuid(start) { }
|
||||
|
||||
virtual void Set(ObjectGuid::LowType val) { _nextGuid = val; }
|
||||
virtual ObjectGuid::LowType Generate() = 0;
|
||||
virtual ObjectGuid::LowType Generate(uint16 realmId = DEFAULT_NON_CROSSREALM_REALM_ID) = 0;
|
||||
[[nodiscard]] ObjectGuid::LowType GetNextAfterMaxUsed() const { return _nextGuid; }
|
||||
virtual ~ObjectGuidGeneratorBase() = default;
|
||||
|
||||
protected:
|
||||
static void HandleCounterOverflow(HighGuid high);
|
||||
static bool GetClusterGuid(HighGuid high, uint16 realmId, ObjectGuid::LowType& clusterGuid);
|
||||
ObjectGuid::LowType _nextGuid;
|
||||
};
|
||||
|
||||
@@ -298,8 +303,12 @@ class ObjectGuidGenerator : public ObjectGuidGeneratorBase
|
||||
public:
|
||||
explicit ObjectGuidGenerator(ObjectGuid::LowType start = 1) : ObjectGuidGeneratorBase(start) { }
|
||||
|
||||
ObjectGuid::LowType Generate() override
|
||||
ObjectGuid::LowType Generate(uint16 realmId = DEFAULT_NON_CROSSREALM_REALM_ID) override
|
||||
{
|
||||
ObjectGuid::LowType clusterGuid = 0;
|
||||
if (GetClusterGuid(high, realmId, clusterGuid))
|
||||
return clusterGuid;
|
||||
|
||||
if (_nextGuid >= ObjectGuid::GetMaxCounter(high) - 1)
|
||||
HandleCounterOverflow(high);
|
||||
|
||||
|
||||
@@ -3861,7 +3861,7 @@ void Player::_LoadSpellCooldowns(PreparedQueryResult result)
|
||||
void Player::_SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
time_t curTime = GameTime::GetGameTime().count();
|
||||
@@ -4852,7 +4852,7 @@ void Player::SpawnCorpseBones(bool triggerSave /*= true*/)
|
||||
|
||||
// pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REMOVE_GHOST);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
_SaveAuras(trans, false);
|
||||
@@ -6647,7 +6647,7 @@ void Player::ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans)
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_HONOR_POINTS);
|
||||
stmt->SetData(0, newValue);
|
||||
stmt->SetData(1, GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
}
|
||||
}
|
||||
@@ -6663,7 +6663,7 @@ void Player::ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans)
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_ARENA_POINTS);
|
||||
stmt->SetData(0, newValue);
|
||||
stmt->SetData(1, GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
}
|
||||
}
|
||||
@@ -9516,7 +9516,7 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
|
||||
// Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID);
|
||||
stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
|
||||
stmt->SetData(1, GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetRawValue());
|
||||
stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
@@ -11694,7 +11694,7 @@ void Player::LeaveBattleground(Battleground* bg)
|
||||
if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, BG_DESERTION_TYPE_LEAVE_BG);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
@@ -14218,7 +14218,7 @@ void Player::_LoadSkills(PreparedQueryResult result)
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_SKILL);
|
||||
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, skill);
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
@@ -15163,7 +15163,7 @@ void Player::_SaveEquipmentSets(CharacterDatabaseTransaction trans)
|
||||
stmt->SetData(j++, eqset.IgnoreMask);
|
||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
stmt->SetData(j++, eqset.Items[i].GetCounter());
|
||||
stmt->SetData(j++, GetGUID().GetCounter());
|
||||
stmt->SetData(j++, GetGUID().GetRawValue());
|
||||
stmt->SetData(j++, eqset.Guid);
|
||||
stmt->SetData(j, index);
|
||||
trans->Append(stmt);
|
||||
@@ -15172,7 +15172,7 @@ void Player::_SaveEquipmentSets(CharacterDatabaseTransaction trans)
|
||||
break;
|
||||
case EQUIPMENT_SET_NEW:
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
|
||||
stmt->SetData(j++, GetGUID().GetCounter());
|
||||
stmt->SetData(j++, GetGUID().GetRawValue());
|
||||
stmt->SetData(j++, eqset.Guid);
|
||||
stmt->SetData(j++, index);
|
||||
stmt->SetData(j++, eqset.Name.c_str());
|
||||
@@ -15202,11 +15202,11 @@ void Player::_SaveEntryPoint(CharacterDatabaseTransaction trans)
|
||||
return;
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData (1, m_entryPointData.joinPos.GetPositionX());
|
||||
stmt->SetData (2, m_entryPointData.joinPos.GetPositionY());
|
||||
stmt->SetData (3, m_entryPointData.joinPos.GetPositionZ());
|
||||
@@ -15243,7 +15243,7 @@ void Player::RemoveAtLoginFlag(AtLoginFlags flags, bool persist /*= false*/)
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_REM_AT_LOGIN_FLAG);
|
||||
|
||||
stmt->SetData(0, uint16(flags));
|
||||
stmt->SetData(1, GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetRawValue());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
@@ -15309,7 +15309,7 @@ void Player::_SaveCharacter(bool create, CharacterDatabaseTransaction trans)
|
||||
//! Insert query
|
||||
//! TO DO: Filter out more redundant fields that can take their default value at player create
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
|
||||
stmt->SetData(index++, GetGUID().GetCounter());
|
||||
stmt->SetData(index++, GetGUID().GetRawValue());
|
||||
stmt->SetData(index++, GetSession()->GetAccountId());
|
||||
stmt->SetData(index++, GetName());
|
||||
stmt->SetData(index++, getRace(true));
|
||||
@@ -15567,7 +15567,7 @@ void Player::_SaveCharacter(bool create, CharacterDatabaseTransaction trans)
|
||||
|
||||
stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
|
||||
// Index
|
||||
stmt->SetData(index++, GetGUID().GetCounter());
|
||||
stmt->SetData(index++, GetGUID().GetRawValue());
|
||||
}
|
||||
|
||||
trans->Append(stmt);
|
||||
@@ -15616,7 +15616,7 @@ void Player::_SaveGlyphs(CharacterDatabaseTransaction trans)
|
||||
return;
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
for (uint8 spec = 0; spec < m_specsCount; ++spec)
|
||||
@@ -15624,7 +15624,7 @@ void Player::_SaveGlyphs(CharacterDatabaseTransaction trans)
|
||||
uint8 index = 0;
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
|
||||
stmt->SetData(index++, GetGUID().GetCounter());
|
||||
stmt->SetData(index++, GetGUID().GetRawValue());
|
||||
stmt->SetData(index++, spec);
|
||||
|
||||
for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
|
||||
@@ -15671,7 +15671,7 @@ void Player::_SaveTalents(CharacterDatabaseTransaction trans)
|
||||
if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, itr->first);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -15680,7 +15680,7 @@ void Player::_SaveTalents(CharacterDatabaseTransaction trans)
|
||||
if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, itr->first);
|
||||
stmt->SetData(2, itr->second->specMask);
|
||||
trans->Append(stmt);
|
||||
@@ -15853,7 +15853,7 @@ void Player::ActivateSpec(uint8 spec)
|
||||
// load them asynchronously
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, m_activeSpec);
|
||||
|
||||
WorldSession* mySess = GetSession();
|
||||
@@ -16368,7 +16368,7 @@ void Player::SetRandomWinner(bool isWinner)
|
||||
if (m_IsBGRandomWinner)
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_BATTLEGROUND_RANDOM);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
}
|
||||
@@ -16485,7 +16485,7 @@ void Player::_LoadBrewOfTheMonth(PreparedQueryResult result)
|
||||
|
||||
// Update Event Id
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_BREW_OF_THE_MONTH);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, uint32(eventId));
|
||||
trans->Append(stmt);
|
||||
|
||||
|
||||
@@ -995,6 +995,7 @@ enum AdditionalSaving
|
||||
ADDITIONAL_SAVING_NONE = 0x00,
|
||||
ADDITIONAL_SAVING_INVENTORY_AND_GOLD = 0x01,
|
||||
ADDITIONAL_SAVING_QUEST_STATUS = 0x02,
|
||||
ADDITIONAL_SAVING_ACHIEVEMENTS = 0x04,
|
||||
};
|
||||
|
||||
enum PlayerCommandStates
|
||||
@@ -2638,7 +2639,7 @@ public:
|
||||
bool IsFreeFlying() const { return HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || HasAuraType(SPELL_AURA_FLY); }
|
||||
|
||||
// saving
|
||||
void AdditionalSavingAddMask(uint8 mask) { m_additionalSaveTimer = 2000; m_additionalSaveMask |= mask; }
|
||||
void AdditionalSavingAddMask(uint8 mask);
|
||||
// arena spectator
|
||||
[[nodiscard]] bool IsSpectator() const { return m_ExtraFlags & PLAYER_EXTRA_SPECTATOR_ON; }
|
||||
void SetIsSpectator(bool on);
|
||||
@@ -2836,6 +2837,7 @@ protected:
|
||||
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans);
|
||||
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans);
|
||||
void _SavePlayerSettings(CharacterDatabaseTransaction trans);
|
||||
void UpdateAdditionalSaves(uint32 p_time);
|
||||
|
||||
/*********************************************************/
|
||||
/*** ENVIRONMENTAL SYSTEM ***/
|
||||
|
||||
@@ -5004,7 +5004,7 @@ void Player::SetHomebind(WorldLocation const& loc, uint32 areaId)
|
||||
stmt->SetData (2, m_homebindX);
|
||||
stmt->SetData (3, m_homebindY);
|
||||
stmt->SetData (4, m_homebindZ);
|
||||
stmt->SetData(5, GetGUID().GetCounter());
|
||||
stmt->SetData(5, GetGUID().GetRawValue());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
@@ -5053,9 +5053,9 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons
|
||||
return false;
|
||||
}
|
||||
|
||||
ObjectGuid::LowType guid = playerGuid.GetCounter();
|
||||
uint64 guid = playerGuid.GetRawValue();
|
||||
|
||||
Object::_Create(guid, 0, HighGuid::Player);
|
||||
Object::_Create(playerGuid);
|
||||
|
||||
m_name = fields[2].Get<std::string>();
|
||||
|
||||
@@ -6147,7 +6147,7 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3
|
||||
// xinef: sync query
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
|
||||
stmt->SetData(0, item->GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetRawValue());
|
||||
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
|
||||
{
|
||||
item->SetRefundRecipient((*result)[0].Get<uint32>());
|
||||
@@ -7199,7 +7199,7 @@ bool Player::_LoadHomeBind(PreparedQueryResult result)
|
||||
else
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
}
|
||||
@@ -7232,7 +7232,7 @@ bool Player::_LoadHomeBind(PreparedQueryResult result)
|
||||
m_homebindZ = info->positionZ;
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_HOMEBIND);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, m_homebindMapId);
|
||||
stmt->SetData(2, m_homebindAreaId);
|
||||
stmt->SetData (3, m_homebindX);
|
||||
@@ -7320,6 +7320,18 @@ void Player::SaveToDB(CharacterDatabaseTransaction trans, bool create, bool logo
|
||||
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
|
||||
}
|
||||
|
||||
// flag data to be saved by UpdateAdditionalSaves a moment after an important change,
|
||||
// filtered by the PlayerSave.AdditionalSaves config mask
|
||||
void Player::AdditionalSavingAddMask(uint8 mask)
|
||||
{
|
||||
mask &= sWorld->getIntConfig(CONFIG_ADDITIONAL_SAVES);
|
||||
if (!mask)
|
||||
return;
|
||||
|
||||
m_additionalSaveTimer = 2000;
|
||||
m_additionalSaveMask |= mask;
|
||||
}
|
||||
|
||||
// fast save function for item/money cheating preventing - save only inventory and money state
|
||||
void Player::SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
|
||||
{
|
||||
@@ -7331,7 +7343,7 @@ void Player::SaveGoldToDB(CharacterDatabaseTransaction trans)
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_MONEY);
|
||||
stmt->SetData(0, GetMoney());
|
||||
stmt->SetData(1, GetGUID().GetCounter());
|
||||
stmt->SetData(1, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
}
|
||||
|
||||
@@ -7345,7 +7357,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
|
||||
{
|
||||
case ACTIONBUTTON_NEW:
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, m_activeSpec);
|
||||
stmt->SetData(2, itr->first);
|
||||
stmt->SetData(3, itr->second.GetAction());
|
||||
@@ -7359,7 +7371,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
|
||||
stmt->SetData(0, itr->second.GetAction());
|
||||
stmt->SetData(1, uint8(itr->second.GetType()));
|
||||
stmt->SetData(2, GetGUID().GetCounter());
|
||||
stmt->SetData(2, GetGUID().GetRawValue());
|
||||
stmt->SetData(3, itr->first);
|
||||
stmt->SetData(4, m_activeSpec);
|
||||
trans->Append(stmt);
|
||||
@@ -7369,7 +7381,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
|
||||
break;
|
||||
case ACTIONBUTTON_DELETED:
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, itr->first);
|
||||
stmt->SetData(2, m_activeSpec);
|
||||
trans->Append(stmt);
|
||||
@@ -7386,7 +7398,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
|
||||
void Player::_SaveAuras(CharacterDatabaseTransaction trans, bool logout)
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
|
||||
@@ -7421,7 +7433,7 @@ void Player::_SaveAuras(CharacterDatabaseTransaction trans, bool logout)
|
||||
|
||||
uint8 index = 0;
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
|
||||
stmt->SetData(index++, GetGUID().GetCounter());
|
||||
stmt->SetData(index++, GetGUID().GetRawValue());
|
||||
stmt->SetData(index++, itr->second->GetCasterGUID().GetRawValue());
|
||||
stmt->SetData(index++, itr->second->GetCastItemGUID().GetRawValue());
|
||||
stmt->SetData(index++, itr->second->GetId());
|
||||
@@ -7506,7 +7518,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans)
|
||||
if (m_itemUpdateQueue.empty())
|
||||
return;
|
||||
|
||||
ObjectGuid::LowType lowGuid = GetGUID().GetCounter();
|
||||
uint64 guid = GetGUID().GetRawValue();
|
||||
for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i)
|
||||
{
|
||||
Item* item = m_itemUpdateQueue[i];
|
||||
@@ -7525,12 +7537,12 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans)
|
||||
if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot()))
|
||||
bagTestGUID = test2->GetGUID().GetCounter();
|
||||
LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item {} (state {}) are incorrect, the player doesn't have an item at that position!",
|
||||
lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
|
||||
guid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
|
||||
// according to the test that was just performed nothing should be in this slot, delete
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT);
|
||||
stmt->SetData(0, bagTestGUID);
|
||||
stmt->SetData(1, item->GetSlot());
|
||||
stmt->SetData(2, lowGuid);
|
||||
stmt->SetData(2, guid);
|
||||
trans->Append(stmt);
|
||||
|
||||
RemoveTradeableItem(item); // pussywizard
|
||||
@@ -7546,7 +7558,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans)
|
||||
else if (test != item)
|
||||
{
|
||||
LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item ({}) are incorrect, the item ({}) is there instead!",
|
||||
lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
|
||||
guid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
|
||||
// save all changes to the item...
|
||||
if (item->GetState() != ITEM_NEW) // only for existing items, no dupes
|
||||
item->SaveToDB(trans);
|
||||
@@ -7560,7 +7572,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans)
|
||||
case ITEM_NEW:
|
||||
case ITEM_CHANGED:
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_INVENTORY_ITEM);
|
||||
stmt->SetData(0, lowGuid);
|
||||
stmt->SetData(0, guid);
|
||||
stmt->SetData(1, bag_guid);
|
||||
stmt->SetData (2, item->GetSlot());
|
||||
stmt->SetData(3, item->GetGUID().GetCounter());
|
||||
@@ -7676,7 +7688,7 @@ void Player::_SaveQuestStatus(CharacterDatabaseTransaction trans)
|
||||
uint8 index = 0;
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS);
|
||||
|
||||
stmt->SetData(index++, GetGUID().GetCounter());
|
||||
stmt->SetData(index++, GetGUID().GetRawValue());
|
||||
stmt->SetData(index++, statusItr->first);
|
||||
stmt->SetData(index++, uint8(statusItr->second.Status));
|
||||
stmt->SetData(index++, statusItr->second.Explored);
|
||||
@@ -7695,7 +7707,7 @@ void Player::_SaveQuestStatus(CharacterDatabaseTransaction trans)
|
||||
else
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, saveItr->first);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -7710,7 +7722,7 @@ void Player::_SaveQuestStatus(CharacterDatabaseTransaction trans)
|
||||
else // xinef: what the is this? quest can be removed by spelleffect if (!keepAbandoned)
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST);
|
||||
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, saveItr->first);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -7732,14 +7744,14 @@ void Player::_SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
|
||||
|
||||
// we don't need transactions here.
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
|
||||
{
|
||||
if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
|
||||
stmt->SetData(2, uint64(m_lastDailyQuestTime));
|
||||
trans->Append(stmt);
|
||||
@@ -7751,7 +7763,7 @@ void Player::_SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
|
||||
for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, (*itr));
|
||||
stmt->SetData(2, uint64(m_lastDailyQuestTime));
|
||||
trans->Append(stmt);
|
||||
@@ -7766,7 +7778,7 @@ void Player::_SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
|
||||
|
||||
// we don't need transactions here.
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
|
||||
@@ -7774,7 +7786,7 @@ void Player::_SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
|
||||
uint32 quest_id = *iter;
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, quest_id);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -7791,7 +7803,7 @@ void Player::_SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
|
||||
|
||||
// we don't need transactions here.
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
m_SeasonalQuestChanged = false;
|
||||
@@ -7810,7 +7822,7 @@ void Player::_SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
|
||||
uint32 questId = *itr;
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
|
||||
stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
|
||||
stmt->SetArguments(GetGUID().GetRawValue(), questId, eventId);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
}
|
||||
@@ -7823,14 +7835,14 @@ void Player::_SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
|
||||
|
||||
// we don't need transactions here.
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
|
||||
{
|
||||
uint32 quest_id = *iter;
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, quest_id);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -7853,7 +7865,7 @@ void Player::_SaveSkills(CharacterDatabaseTransaction trans)
|
||||
if (itr->second.uState == SKILL_DELETED)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, itr->first);
|
||||
trans->Append(stmt);
|
||||
|
||||
@@ -7869,7 +7881,7 @@ void Player::_SaveSkills(CharacterDatabaseTransaction trans)
|
||||
{
|
||||
case SKILL_NEW:
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, uint16(itr->first));
|
||||
stmt->SetData(2, value);
|
||||
stmt->SetData(3, max);
|
||||
@@ -7880,7 +7892,7 @@ void Player::_SaveSkills(CharacterDatabaseTransaction trans)
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
|
||||
stmt->SetData(0, value);
|
||||
stmt->SetData(1, max);
|
||||
stmt->SetData(2, GetGUID().GetCounter());
|
||||
stmt->SetData(2, GetGUID().GetRawValue());
|
||||
stmt->SetData(3, uint16(itr->first));
|
||||
trans->Append(stmt);
|
||||
|
||||
@@ -7911,7 +7923,7 @@ void Player::_SaveSpells(CharacterDatabaseTransaction trans)
|
||||
if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, itr->first);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
@@ -7920,7 +7932,7 @@ void Player::_SaveSpells(CharacterDatabaseTransaction trans)
|
||||
if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
stmt->SetData(1, itr->first);
|
||||
stmt->SetData(2, itr->second->specMask);
|
||||
trans->Append(stmt);
|
||||
@@ -7950,13 +7962,13 @@ void Player::_SaveStats(CharacterDatabaseTransaction trans)
|
||||
CharacterDatabasePreparedStatement* stmt = nullptr;
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
|
||||
stmt->SetData(0, GetGUID().GetCounter());
|
||||
stmt->SetData(0, GetGUID().GetRawValue());
|
||||
trans->Append(stmt);
|
||||
|
||||
uint8 index = 0;
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
|
||||
stmt->SetData(index++, GetGUID().GetCounter());
|
||||
stmt->SetData(index++, GetGUID().GetRawValue());
|
||||
stmt->SetData(index++, GetMaxHealth());
|
||||
|
||||
for (uint8 i = 0; i < MAX_POWERS; ++i)
|
||||
|
||||
@@ -332,6 +332,8 @@ void Player::Update(uint32 p_time)
|
||||
}
|
||||
}
|
||||
|
||||
UpdateAdditionalSaves(p_time);
|
||||
|
||||
// Handle Water/drowning
|
||||
HandleDrowning(p_time);
|
||||
|
||||
@@ -2400,3 +2402,49 @@ void Player::ProcessSpellQueue()
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// save only the data flagged by AdditionalSavingAddMask shortly after
|
||||
// important changes, so a crash loses at most a few seconds of them
|
||||
void Player::UpdateAdditionalSaves(uint32 p_time)
|
||||
{
|
||||
if (!m_additionalSaveTimer || GetSession()->isLogingOut())
|
||||
return;
|
||||
|
||||
if (m_additionalSaveTimer > p_time)
|
||||
{
|
||||
m_additionalSaveTimer -= p_time;
|
||||
return;
|
||||
}
|
||||
|
||||
uint8 mask = m_additionalSaveMask;
|
||||
m_additionalSaveTimer = 0;
|
||||
m_additionalSaveMask = 0;
|
||||
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
|
||||
if (mask & ADDITIONAL_SAVING_INVENTORY_AND_GOLD)
|
||||
SaveInventoryAndGoldToDB(trans);
|
||||
|
||||
if (mask & ADDITIONAL_SAVING_QUEST_STATUS)
|
||||
{
|
||||
_SaveQuestStatus(trans);
|
||||
|
||||
// if nothing changed, nothing will happen
|
||||
_SaveDailyQuestStatus(trans);
|
||||
_SaveWeeklyQuestStatus(trans);
|
||||
_SaveSeasonalQuestStatus(trans);
|
||||
_SaveMonthlyQuestStatus(trans);
|
||||
}
|
||||
|
||||
if (mask & ADDITIONAL_SAVING_ACHIEVEMENTS)
|
||||
{
|
||||
m_achievementMgr->SaveToDB(trans);
|
||||
|
||||
// achievements are often earned together with skill or gold changes
|
||||
// (professions, riding, wealth), save those too to keep the DB consistent
|
||||
_SaveSkills(trans);
|
||||
SaveGoldToDB(trans);
|
||||
}
|
||||
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "Cell.h"
|
||||
#include "CellImpl.h"
|
||||
#include "Common.h"
|
||||
#include "Config.h"
|
||||
#include "DBCStores.h"
|
||||
#include "GameObjectAI.h"
|
||||
#include "GameTime.h"
|
||||
@@ -30,8 +31,28 @@
|
||||
#include "Spell.h"
|
||||
#include "Vehicle.h"
|
||||
#include "WorldModel.h"
|
||||
#include <chrono>
|
||||
|
||||
MotionTransport::MotionTransport() : Transport(), _transportInfo(nullptr), _isMoving(true), _pendingStop(false), _triggeredArrivalEvent(false), _triggeredDepartureEvent(false), _passengersLoaded(false), _delayedTeleport(false)
|
||||
namespace
|
||||
{
|
||||
// Any fixed reference epoch works; this one is 2023-07-12 05:20:00 UTC.
|
||||
std::time_t const startTimestamp = 1689139200;
|
||||
std::chrono::system_clock::time_point const transportStartDate = std::chrono::system_clock::from_time_t(startTimestamp);
|
||||
|
||||
// Calculates time of the next departure cycle.
|
||||
std::chrono::system_clock::time_point calculateNextDepartureTime(int oneIterationInterval)
|
||||
{
|
||||
std::chrono::system_clock::time_point currentTime = std::chrono::system_clock::now();
|
||||
std::chrono::milliseconds interval(oneIterationInterval);
|
||||
std::chrono::milliseconds timeSinceStart = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - transportStartDate);
|
||||
int64 intervalsPassed = timeSinceStart.count() / oneIterationInterval;
|
||||
std::chrono::system_clock::time_point nextDeparture = transportStartDate + (interval * (intervalsPassed + 1));
|
||||
return nextDeparture;
|
||||
}
|
||||
}
|
||||
|
||||
MotionTransport::MotionTransport() : Transport(), _transportInfo(nullptr), _isMoving(true), _pendingStop(false), _triggeredArrivalEvent(false), _triggeredDepartureEvent(false), _passengersLoaded(false), _delayedTeleport(false),
|
||||
_requiresFirstDepartureSync(false), _firstDepartureTime(transportStartDate)
|
||||
{
|
||||
m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION;
|
||||
}
|
||||
@@ -76,6 +97,13 @@ bool MotionTransport::CreateMoTrans(ObjectGuid::LowType guidlow, uint32 entry, u
|
||||
|
||||
_transportInfo = tInfo;
|
||||
|
||||
// Enable transport sync only in cluster mode and for transport with several maps.
|
||||
if (sConfigMgr->GetOption<bool>("Cluster.Enabled", false) && tInfo->mapsUsed.size() > 1)
|
||||
{
|
||||
_requiresFirstDepartureSync = true;
|
||||
this->SetPhaseMask(2, true);
|
||||
}
|
||||
|
||||
// initialize waypoints
|
||||
_nextFrame = tInfo->keyFrames.begin();
|
||||
_currentFrame = _nextFrame++;
|
||||
@@ -108,6 +136,56 @@ bool MotionTransport::CreateMoTrans(ObjectGuid::LowType guidlow, uint32 entry, u
|
||||
return true;
|
||||
}
|
||||
|
||||
// Delays first departure to make sure that transport follows strict schedule
|
||||
// and with that makes transport synced between cluster nodes.
|
||||
uint32 MotionTransport::HandleFirstDepartureSync(uint32 diff)
|
||||
{
|
||||
if (!_requiresFirstDepartureSync)
|
||||
return diff;
|
||||
|
||||
if (_firstDepartureTime == transportStartDate)
|
||||
{
|
||||
_firstDepartureTime = calculateNextDepartureTime(_transportInfo->pathTime);
|
||||
return diff;
|
||||
}
|
||||
|
||||
// Making system call for current time to be more accurate.
|
||||
// Shouldn't be an issue since it runs only before the very first departure.
|
||||
int32 millLeftToDeparture = std::chrono::duration_cast<std::chrono::milliseconds>(_firstDepartureTime - std::chrono::system_clock::now()).count();
|
||||
if (millLeftToDeparture > 0)
|
||||
return diff;
|
||||
|
||||
// At this point we are ready for first departure.
|
||||
_requiresFirstDepartureSync = false;
|
||||
this->SetPhaseMask(1, true);
|
||||
|
||||
// Players don't know about transport because it was in a different phase.
|
||||
// We need to notify players that object exists before departure.
|
||||
Map::PlayerList const& players = this->GetMap()->GetPlayers();
|
||||
if (!players.IsEmpty())
|
||||
{
|
||||
for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
|
||||
{
|
||||
if (Player* player = i->GetSource())
|
||||
{
|
||||
// Same phase filter as Map::SendInitTransports: players outside
|
||||
// the transport's phase must not get a create-block for it.
|
||||
if (!player->InSamePhase(this))
|
||||
continue;
|
||||
|
||||
UpdateData transData;
|
||||
this->BuildCreateUpdateBlockForPlayer(&transData, player);
|
||||
|
||||
WorldPacket packet;
|
||||
transData.BuildPacket(packet);
|
||||
player->SendDirectMessage(&packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return millLeftToDeparture * -1;
|
||||
}
|
||||
|
||||
void MotionTransport::CleanupsBeforeDelete(bool finalCleanup /*= true*/)
|
||||
{
|
||||
UnloadStaticPassengers();
|
||||
@@ -137,6 +215,13 @@ void MotionTransport::BuildUpdate(UpdateDataMapType& data_map)
|
||||
|
||||
void MotionTransport::Update(uint32 diff)
|
||||
{
|
||||
if (_requiresFirstDepartureSync)
|
||||
{
|
||||
diff = HandleFirstDepartureSync(diff);
|
||||
if (_requiresFirstDepartureSync)
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 const positionUpdateDelay = 1;
|
||||
|
||||
if (AI())
|
||||
|
||||
@@ -90,6 +90,8 @@ private:
|
||||
void UpdatePassengerPositions(PassengerSet& passengers);
|
||||
void DoEventIfAny(KeyFrame const& node, bool departure);
|
||||
|
||||
uint32 HandleFirstDepartureSync(uint32 diff);
|
||||
|
||||
//! Helpers to know if stop frame was reached
|
||||
bool IsMoving() const { return _isMoving; }
|
||||
void SetMoving(bool val) { _isMoving = val; }
|
||||
@@ -109,6 +111,9 @@ private:
|
||||
mutable std::mutex Lock;
|
||||
bool _passengersLoaded;
|
||||
bool _delayedTeleport;
|
||||
|
||||
bool _requiresFirstDepartureSync;
|
||||
std::chrono::system_clock::time_point _firstDepartureTime;
|
||||
};
|
||||
|
||||
class StaticTransport : public Transport
|
||||
|
||||
@@ -4181,8 +4181,11 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell)
|
||||
}
|
||||
case CURRENT_CHANNELED_SPELL:
|
||||
{
|
||||
// channel spells always break generic non-delayed and any channeled spells
|
||||
InterruptSpell(CURRENT_GENERIC_SPELL, false);
|
||||
// channel spells always break generic non-delayed and any channeled spells,
|
||||
// unless the channel itself is allowed to run alongside other actions
|
||||
if (!pSpell->GetSpellInfo()->IsActionAllowedChannel())
|
||||
InterruptSpell(CURRENT_GENERIC_SPELL, false);
|
||||
|
||||
InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
|
||||
|
||||
// it also does break autorepeat if not Auto Shot
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "Player.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "SharedDefines.h"
|
||||
#include "TC9Sidecar.h"
|
||||
#include "UpdateFieldFlags.h"
|
||||
#include "Util.h"
|
||||
#include "World.h"
|
||||
@@ -329,7 +330,7 @@ void Group::ConvertToRaid()
|
||||
|
||||
_initRaidSubGroupsCounter();
|
||||
|
||||
if (!isBGGroup() && !isBFGroup())
|
||||
if (!sToCloud9Sidecar->ClusterModeEnabled() && !isBGGroup() && !isBFGroup())
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_TYPE);
|
||||
|
||||
@@ -584,6 +585,52 @@ bool Group::AddMember(Player* player, uint8 roles /* = 0 */)
|
||||
return true;
|
||||
}
|
||||
|
||||
void Group::AddMemberWithGuid(ObjectGuid guid)
|
||||
{
|
||||
// Idempotent under sidecar event redelivery: never duplicate a MemberSlot.
|
||||
if (IsMember(guid))
|
||||
return;
|
||||
|
||||
if (Player* player = ObjectAccessor::FindPlayer(guid))
|
||||
{
|
||||
AddMember(player);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get first not-full group
|
||||
uint8 subGroup = 0;
|
||||
if (m_subGroupsCounts)
|
||||
{
|
||||
bool groupFound = false;
|
||||
for (; subGroup < MAX_RAID_SUBGROUPS; ++subGroup)
|
||||
{
|
||||
if (m_subGroupsCounts[subGroup] < MAXGROUPSIZE)
|
||||
{
|
||||
groupFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// We are raid group and no one slot is free
|
||||
if (!groupFound)
|
||||
return;
|
||||
}
|
||||
|
||||
MemberSlot member;
|
||||
member.guid = guid;
|
||||
sCharacterCache->GetCharacterNameByGuid(guid, member.name);
|
||||
member.group = subGroup;
|
||||
member.flags = 0;
|
||||
member.roles = 0;
|
||||
m_memberSlots.push_back(member);
|
||||
|
||||
if (!isBGGroup() && !isBFGroup())
|
||||
{
|
||||
sCharacterCache->UpdateCharacterGroup(guid, GetGUID());
|
||||
}
|
||||
|
||||
SubGroupCounterIncrease(subGroup);
|
||||
}
|
||||
|
||||
bool Group::RemoveMember(ObjectGuid guid, RemoveMethod const& method /*= GROUP_REMOVEMETHOD_DEFAULT*/, ObjectGuid kicker /*= ObjectGuid::Empty*/, char const* reason /*= nullptr*/)
|
||||
{
|
||||
BroadcastGroupUpdate();
|
||||
@@ -595,8 +642,14 @@ bool Group::RemoveMember(ObjectGuid guid, RemoveMethod const& method /*= GROUP_R
|
||||
return m_memberSlots.size() > 0;
|
||||
}
|
||||
|
||||
// remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group)
|
||||
if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u))
|
||||
// remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group),
|
||||
// except in cluster mode, where this branch is taken for any size: the group
|
||||
// service owns the group lifecycle and local Disband() is a no-op, so always
|
||||
// unlink the removed member here; waiting for the disband event leaves the
|
||||
// last two members with a dangling group pointer whenever that event is lost
|
||||
// (group service restart).
|
||||
if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u)
|
||||
|| (sToCloud9Sidecar->ClusterModeEnabled() && !isBGGroup() && !isBFGroup()))
|
||||
{
|
||||
Player* player = ObjectAccessor::FindConnectedPlayer(guid);
|
||||
if (player)
|
||||
@@ -616,19 +669,24 @@ bool Group::RemoveMember(ObjectGuid guid, RemoveMethod const& method /*= GROUP_R
|
||||
player->UpdateForQuestWorldObjects();
|
||||
}
|
||||
|
||||
WorldPacket data;
|
||||
|
||||
if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG)
|
||||
// BG/BF groups stay locally owned in cluster mode (see the gates above),
|
||||
// so their removal packets must not be delegated to the group service.
|
||||
if (!sToCloud9Sidecar->ClusterModeEnabled() || isBGGroup() || isBFGroup())
|
||||
{
|
||||
data.Initialize(SMSG_GROUP_UNINVITE, 0);
|
||||
player->SendDirectMessage(&data);
|
||||
}
|
||||
WorldPacket data;
|
||||
|
||||
// Do we really need to send this opcode?
|
||||
data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
|
||||
data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
|
||||
data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
|
||||
player->SendDirectMessage(&data);
|
||||
if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG)
|
||||
{
|
||||
data.Initialize(SMSG_GROUP_UNINVITE, 0);
|
||||
player->GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
// Do we really need to send this opcode?
|
||||
data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
|
||||
data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
|
||||
data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
|
||||
player->GetSession()->SendPacket(&data);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove player from group in DB
|
||||
@@ -763,7 +821,7 @@ void Group::ChangeLeader(ObjectGuid newLeaderGuid)
|
||||
sScriptMgr->OnGroupChangeLeader(this, newLeaderGuid, m_leaderGuid); // This hook should be executed at the end - Not used anywhere in the original core
|
||||
}
|
||||
|
||||
void Group::Disband(bool hideDestroy /* = false */)
|
||||
void Group::ForcedDisband(bool hideDestroy /* = false */)
|
||||
{
|
||||
sScriptMgr->OnGroupDisband(this);
|
||||
|
||||
@@ -859,6 +917,14 @@ void Group::Disband(bool hideDestroy /* = false */)
|
||||
delete this;
|
||||
}
|
||||
|
||||
void Group::Disband(bool hideDestroy /* = false */)
|
||||
{
|
||||
if (sToCloud9Sidecar->ClusterModeEnabled() && !this->isBFGroup() && !this->isBGGroup())
|
||||
return;
|
||||
|
||||
ForcedDisband(hideDestroy);
|
||||
}
|
||||
|
||||
/*********************************************************/
|
||||
/*** LOOT SYSTEM ***/
|
||||
/*********************************************************/
|
||||
@@ -1798,6 +1864,12 @@ void Group::SendTargetIconList(WorldSession* session)
|
||||
|
||||
void Group::SendUpdate()
|
||||
{
|
||||
if (sToCloud9Sidecar->ClusterModeEnabled() && !this->isBFGroup() && !this->isBGGroup())
|
||||
{
|
||||
// Group service responsible for sending these updates.
|
||||
return;
|
||||
}
|
||||
|
||||
for (member_witerator witr = m_memberSlots.begin(); witr != m_memberSlots.end(); ++witr)
|
||||
SendUpdateToPlayer(witr->guid, &(*witr));
|
||||
}
|
||||
@@ -2214,7 +2286,7 @@ void Roll::targetObjectBuildLink()
|
||||
void Group::SetDungeonDifficulty(Difficulty difficulty)
|
||||
{
|
||||
m_dungeonDifficulty = difficulty;
|
||||
if (!isBGGroup() && !isBFGroup())
|
||||
if (!sToCloud9Sidecar->ClusterModeEnabled() && !isBGGroup() && !isBFGroup())
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_DIFFICULTY);
|
||||
|
||||
@@ -2235,7 +2307,7 @@ void Group::SetDungeonDifficulty(Difficulty difficulty)
|
||||
void Group::SetRaidDifficulty(Difficulty difficulty)
|
||||
{
|
||||
m_raidDifficulty = difficulty;
|
||||
if (!isBGGroup() && !isBFGroup())
|
||||
if (!sToCloud9Sidecar->ClusterModeEnabled() && !isBGGroup() && !isBFGroup())
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_RAID_DIFFICULTY);
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ class Unit;
|
||||
class WorldObject;
|
||||
class WorldPacket;
|
||||
class WorldSession;
|
||||
class ToCloud9GroupHooks;
|
||||
|
||||
struct MapEntry;
|
||||
|
||||
@@ -174,6 +175,7 @@ public:
|
||||
/** todo: uninvite people that not accepted invite **/
|
||||
class Group
|
||||
{
|
||||
friend class ToCloud9GroupHooks;
|
||||
public:
|
||||
struct MemberSlot
|
||||
{
|
||||
@@ -349,6 +351,9 @@ protected:
|
||||
void SubGroupCounterDecrease(uint8 subgroup);
|
||||
void ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply);
|
||||
|
||||
void AddMemberWithGuid(ObjectGuid guid);
|
||||
void ForcedDisband(bool hideDestroy = false);
|
||||
|
||||
MemberSlotList m_memberSlots;
|
||||
GroupRefMgr m_memberMgr;
|
||||
InvitesList m_invitees;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user