mirror of
https://github.com/azerothcore/azerothcore-wotlk.git
synced 2025-11-10 21:04:26 +08:00
Merge branch 'master' into ovv/systemd-socket-activation
This commit is contained in:
commit
ffeb7daf5c
19
AUTHORS
19
AUTHORS
@ -34,3 +34,22 @@ The third-party libraries have their own way of addressing authorship, and the a
|
||||
a third-party library reflects who did the importing instead of who wrote the code within the commit.
|
||||
|
||||
The Authors of third-party libraries are not explicitly mentioned, and usually is possible to obtain from the files belonging to the third-party libraries.
|
||||
|
||||
## Cross-project collaboration
|
||||
|
||||
At AzerothCore, we actively promote collaboration with other MaNGOS-based open-source projects that are actively maintained. This also includes cherry-picking commits from relevant projects such as:
|
||||
|
||||
* TrinityCore: https://github.com/trinitycore
|
||||
* CMaNGOS: https://github.com/cmangos/
|
||||
* vMaNGOS: https://github.com/vmangos
|
||||
* and others
|
||||
|
||||
It is strictly required for any contributor importing code to credit the original author by:
|
||||
- linking the original PR (or commit)
|
||||
- adding a [Co-authored-by](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors) line in the PR description
|
||||
|
||||
This will automatically include the original author in our list of [Contributors](https://github.com/azerothcore/azerothcore-wotlk/graphs/contributors).
|
||||
|
||||
If you notice a violation of the above, please report it to the Staff immediately.
|
||||
|
||||
We encourage other projects to adopt similar practices to promote healthy cross-project collaboration and proper attribution.
|
||||
|
||||
85
apps/extractor/extractor.sh
Executable file
85
apps/extractor/extractor.sh
Executable file
@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
function Base {
|
||||
echo "Extract Base"
|
||||
rm -rf dbc maps Cameras
|
||||
./map_extractor
|
||||
Menu
|
||||
}
|
||||
|
||||
function VMaps {
|
||||
echo "Extract VMaps"
|
||||
mkdir -p Buildings vmaps
|
||||
rm -rf Buildings/* vmaps/*
|
||||
./vmap4_extractor
|
||||
./vmap4_assembler Buildings vmaps
|
||||
rmdir -rf Buildings
|
||||
Menu
|
||||
}
|
||||
|
||||
function MMaps {
|
||||
echo "This may take a few hours to complete. Please be patient."
|
||||
mkdir -p mmaps
|
||||
rm -rf mmaps/*
|
||||
./mmaps_generator
|
||||
Menu
|
||||
}
|
||||
|
||||
function All {
|
||||
echo "This may take a few hours to complete. Please be patient."
|
||||
rm -rf dbc maps Cameras
|
||||
mkdir -p Buildings vmaps mmaps
|
||||
rm -rf Buildings/* vmaps/* mmaps/*
|
||||
./map_extractor
|
||||
./vmap4_extractor
|
||||
./vmap4_assembler Buildings vmaps
|
||||
rmdir -rf Buildings
|
||||
./mmaps_generator
|
||||
Menu
|
||||
}
|
||||
|
||||
function Menu {
|
||||
echo ""
|
||||
echo "..............................................."
|
||||
echo "AzerothCore dbc, maps, vmaps, mmaps extractor"
|
||||
echo "..............................................."
|
||||
echo "PRESS 1, 2, 3 OR 4 to select your task, or 5 to EXIT."
|
||||
echo "..............................................."
|
||||
echo ""
|
||||
echo "WARNING! when extracting the vmaps extractor will"
|
||||
echo "output the text below, it's intended and not an error:"
|
||||
echo ".........................................."
|
||||
echo "Extracting World\Wmo\Band\Final_Stage.wmo"
|
||||
echo "No such file."
|
||||
echo "Couldn't open RootWmo!!!"
|
||||
echo "Done!"
|
||||
echo " .........................................."
|
||||
echo ""
|
||||
echo "Press 1, 2, 3 or 4 to start extracting or 5 to exit."
|
||||
echo "1 - Extract base files (NEEDED) and cameras."
|
||||
echo "2 - Extract vmaps (needs maps to be extracted before you run this) (OPTIONAL, highly recommended)"
|
||||
echo "3 - Extract mmaps (needs vmaps to be extracted before you run this, may take hours) (OPTIONAL, highly recommended)"
|
||||
echo "4 - Extract all (may take hours)"
|
||||
echo "5 - EXIT"
|
||||
echo ""
|
||||
|
||||
read -rp "Type 1, 2, 3, 4 or 5 then press ENTER: " choice
|
||||
|
||||
case $choice in
|
||||
1) Base ;;
|
||||
2) VMaps ;;
|
||||
3) MMaps ;;
|
||||
4) All ;;
|
||||
5) exit 0;;
|
||||
*) echo "Invalid choice."; read -rp "Type 1, 2, 3, 4 or 5 then press ENTER: " choice ;;
|
||||
esac
|
||||
}
|
||||
|
||||
if [ -d "./Data" ] && [ -f "map_extractor" ] && [ -f "vmap4_extractor" ] && [ -f "vmap4_assembler" ] && [ -f "mmaps_generator" ]; then
|
||||
echo "The required files and folder exist in the current directory."
|
||||
chmod +x map_extractor vmap4_extractor vmap4_assembler mmaps_generator
|
||||
Menu
|
||||
else
|
||||
echo "One or more of the required files or folder is missing from the current directory."
|
||||
echo "Place map_extractor vmap4_extractor vmap4_assembler mmaps_generator"
|
||||
echo "In your WoW folder with WoW.exe"
|
||||
fi
|
||||
85
apps/extractor/extractor_es.sh
Executable file
85
apps/extractor/extractor_es.sh
Executable file
@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
function Base {
|
||||
echo "Extrayendo archivos base"
|
||||
rm -rf dbc maps Cameras
|
||||
./map_extractor
|
||||
Menu
|
||||
}
|
||||
|
||||
function VMaps {
|
||||
echo "Extrayendo VMaps"
|
||||
mkdir -p Buildings vmaps
|
||||
rm -rf Buildings/* vmaps/*
|
||||
./vmap4_extractor
|
||||
./vmap4_assembler Buildings vmaps
|
||||
rmdir -rf Buildings
|
||||
Menu
|
||||
}
|
||||
|
||||
function MMaps {
|
||||
echo "Esto puede tardar unas horas en completarse. Por favor, tenga paciencia."
|
||||
mkdir -p mmaps
|
||||
rm -rf mmaps/*
|
||||
./mmaps_generator
|
||||
Menu
|
||||
}
|
||||
|
||||
function All {
|
||||
echo "Esto puede tardar varias horas en completarse. Por favor, tenga paciencia."
|
||||
rm -rf dbc maps Cameras
|
||||
mkdir -p Buildings vmaps mmaps
|
||||
rm -rf Buildings/* vmaps/* mmaps/*
|
||||
./map_extractor
|
||||
./vmap4_extractor
|
||||
./vmap4_assembler Buildings vmaps
|
||||
rmdir -rf Buildings
|
||||
./mmaps_generator
|
||||
Menu
|
||||
}
|
||||
|
||||
function Menu {
|
||||
echo ""
|
||||
echo "..............................................."
|
||||
echo "Extractor de dbc, maps, vmaps, mmaps de AzerothCore"
|
||||
echo "..............................................."
|
||||
echo "PRESIONE 1, 2, 3 O 4 para seleccionar su tarea, o 5 para SALIR."
|
||||
echo "..............................................."
|
||||
echo ""
|
||||
echo "ADVERTENCIA: al extraer los vmaps del extractor"
|
||||
echo "la salida del texto de abajo, es intencional y no un error:"
|
||||
echo ".........................................."
|
||||
echo "Extracting World\Wmo\Band\Final_Stage.wmo"
|
||||
echo "No such file."
|
||||
echo "Couldn't open RootWmo!!!"
|
||||
echo "Done!"
|
||||
echo ".........................................."
|
||||
echo ""
|
||||
echo "Presione 1, 2, 3 o 4 para iniciar la extracción o 5 para salir."
|
||||
echo "1 - Extraer los archivos base (NECESARIOS) y las cámaras."
|
||||
echo "2 - Extraer vmaps (necesita que los mapas se extraigan antes de ejecutar esto) (OPCIONAL, muy recomendable)"
|
||||
echo "3 - Extraer mmaps (necesita que los vmaps se extraigan antes de ejecutar esto, puede llevar horas) (OPCIONAL, muy recomendable)"
|
||||
echo "4 - Extraer todo (puede llevar varias horas)"
|
||||
echo "5 - SALIR"
|
||||
echo ""
|
||||
|
||||
read -rp "Escriba 1, 2, 3, 4 o 5 y pulse ENTER: " choice
|
||||
|
||||
case $choice in
|
||||
1) Base ;;
|
||||
2) VMaps ;;
|
||||
3) MMaps ;;
|
||||
4) All ;;
|
||||
5) exit 0;;
|
||||
*) echo "Opción inválida."; read -rp "Escriba 1, 2, 3, 4 o 5 y presione ENTER: " choice ;;
|
||||
esac
|
||||
}
|
||||
|
||||
if [ -d "./Data" ] && [ -f "map_extractor" ] && [ -f "vmap4_extractor" ] && [ -f "vmap4_assembler" ] && [ -f "mmaps_generator" ]; then
|
||||
echo "Los archivos y carpetas requeridos existen en el directorio actual."
|
||||
chmod +x map_extractor vmap4_extractor vmap4_assembler mmaps_generator
|
||||
Menu
|
||||
else
|
||||
echo "Uno o más archivos o carpetas requeridos no se encuentran en el directorio actual."
|
||||
echo "Coloque map_extractor vmap4_extractor vmap4_assembler mmaps_generator"
|
||||
echo "en su directorio de WoW junto con WoW.exe"
|
||||
fi
|
||||
4
data/sql/updates/db_world/2025_05_12_00.sql
Normal file
4
data/sql/updates/db_world/2025_05_12_00.sql
Normal file
@ -0,0 +1,4 @@
|
||||
-- DB update 2025_05_10_04 -> 2025_05_12_00
|
||||
|
||||
-- Add No_Taunt flag
|
||||
UPDATE `creature_template` SET `flags_extra` = `flags_extra` |256 WHERE (`entry` = 25315);
|
||||
10
data/sql/updates/db_world/2025_05_12_01.sql
Normal file
10
data/sql/updates/db_world/2025_05_12_01.sql
Normal file
@ -0,0 +1,10 @@
|
||||
-- DB update 2025_05_12_00 -> 2025_05_12_01
|
||||
|
||||
-- Update comments and edit row 2.
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28529;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28529);
|
||||
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
|
||||
(28529, 0, 0, 0, 0, 0, 100, 0, 0, 0, 2000, 3000, 0, 0, 11, 6660, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - In Combat - Cast \'Shoot\''),
|
||||
(28529, 0, 1, 0, 4, 0, 50, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Aggro - Say Line 0'),
|
||||
(28529, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 205, 23, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set combat distance to 23');
|
||||
2
data/sql/updates/db_world/2025_05_13_00.sql
Normal file
2
data/sql/updates/db_world/2025_05_13_00.sql
Normal file
@ -0,0 +1,2 @@
|
||||
-- DB update 2025_05_12_01 -> 2025_05_13_00
|
||||
UPDATE `creature_model_info` SET `BoundingRadius` = 6, `CombatReach` = 15 WHERE `DisplayID` = 23200;
|
||||
11
data/sql/updates/db_world/2025_05_15_00.sql
Normal file
11
data/sql/updates/db_world/2025_05_15_00.sql
Normal file
@ -0,0 +1,11 @@
|
||||
-- DB update 2025_05_13_00 -> 2025_05_15_00
|
||||
--
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` = 46102;
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(46102, 'spell_spell_fury_aura');
|
||||
|
||||
-- Remove 'Deal periodic damage'
|
||||
SET @procFlags = (0x4000 | 0x10000);
|
||||
DELETE FROM `spell_proc_event` WHERE `entry` = 46102;
|
||||
INSERT INTO `spell_proc_event` (`entry`, `procFlags`) VALUES
|
||||
(46102, @procFlags);
|
||||
3
data/sql/updates/db_world/2025_05_18_00.sql
Normal file
3
data/sql/updates/db_world/2025_05_18_00.sql
Normal file
@ -0,0 +1,3 @@
|
||||
-- DB update 2025_05_15_00 -> 2025_05_18_00
|
||||
-- Sets the SAI Link to 0 from 1 for Ziggurat Defender (has only 1 cast, nothing to link to)
|
||||
UPDATE `smart_scripts` SET `link` = 0 WHERE (`source_type` = 0 AND `entryorguid` = 26202 AND `id` = 0);
|
||||
17
data/sql/updates/db_world/2025_05_19_00.sql
Normal file
17
data/sql/updates/db_world/2025_05_19_00.sql
Normal file
@ -0,0 +1,17 @@
|
||||
-- DB update 2025_05_18_00 -> 2025_05_19_00
|
||||
-- Deletes `Dalaran Wizard's Robe` (5110) from References: `World Drop - White World Drop - NPC Levels` 14-15 (1011415), 15-15 (1011515), 15-16 (1011516), 16-16 (1011616)
|
||||
DELETE FROM `reference_loot_template` WHERE `Item` = 5110;
|
||||
|
||||
DELETE FROM `creature_loot_template` WHERE `Item` = 5110;
|
||||
INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(1867, 5110, 0, 3, 0, 1, 0, 1, 1, 'Dalaran Apprentice - Dalaran Wizard\'s Robe'),
|
||||
(1888, 5110, 0, 4, 0, 1, 0, 1, 1, 'Dalaran Watcher - Dalaran Wizard\'s Robe'),
|
||||
(1889, 5110, 0, 4, 0, 1, 0, 1, 1, 'Dalaran Wizard - Dalaran Wizard\'s Robe'),
|
||||
(1912, 5110, 0, 3, 0, 1, 0, 1, 1, 'Dalaran Protector - Dalaran Wizard\'s Robe'),
|
||||
(1913, 5110, 0, 4, 0, 1, 0, 1, 1, 'Dalaran Warder - Dalaran Wizard\'s Robe'),
|
||||
(1914, 5110, 0, 3, 0, 1, 0, 1, 1, 'Dalaran Mage - Dalaran Wizard\'s Robe'),
|
||||
(1915, 5110, 0, 4, 0, 1, 0, 1, 1, 'Dalaran Conjuror - Dalaran Wizard\'s Robe'),
|
||||
(1920, 5110, 0, 1.6, 0, 1, 0, 1, 1, 'Dalaran Spellscribe - Dalaran Wizard\'s Robe'),
|
||||
(2120, 5110, 0, 1.8, 0, 1, 0, 1, 1, 'Archmage Ataeric - Dalaran Wizard\'s Robe'),
|
||||
(3577, 5110, 0, 4, 0, 1, 0, 1, 1, 'Dalaran Brewmaster - Dalaran Wizard\'s Robe'),
|
||||
(3578, 5110, 0, 3, 0, 1, 0, 1, 1, 'Dalaran Miner - Dalaran Wizard\'s Robe');
|
||||
2
data/sql/updates/db_world/2025_05_20_00.sql
Normal file
2
data/sql/updates/db_world/2025_05_20_00.sql
Normal file
@ -0,0 +1,2 @@
|
||||
-- DB update 2025_05_19_00 -> 2025_05_20_00
|
||||
UPDATE `creature_loot_template` SET `Chance` = 6 WHERE `Item` = 34334 AND `Entry` = 25315;
|
||||
4
data/sql/updates/db_world/2025_05_21_00.sql
Normal file
4
data/sql/updates/db_world/2025_05_21_00.sql
Normal file
@ -0,0 +1,4 @@
|
||||
-- DB update 2025_05_20_00 -> 2025_05_21_00
|
||||
--
|
||||
DELETE FROM `spell_custom_attr` WHERE `spell_id`=45770;
|
||||
INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (45770, 4194304);
|
||||
@ -4897,8 +4897,10 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_70_YARDS);
|
||||
});
|
||||
|
||||
// Encapsulate
|
||||
ApplySpellFix({ 45662 }, [](SpellInfo* spellInfo)
|
||||
ApplySpellFix({
|
||||
45662, // Encapsulate
|
||||
45642 // Fire Bloom
|
||||
}, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->AttributesEx7 |= SPELL_ATTR7_TREAT_AS_NPC_AOE;
|
||||
});
|
||||
|
||||
@ -1755,7 +1755,6 @@ void World::SetInitialWorldSettings()
|
||||
|
||||
LOG_INFO("server.loading", "Loading WorldStates..."); // must be loaded before battleground, outdoor PvP and conditions
|
||||
sWorldState->LoadWorldStates();
|
||||
sWorldState->Load();
|
||||
|
||||
LOG_INFO("server.loading", "Loading Conditions...");
|
||||
sConditionMgr->LoadConditions();
|
||||
@ -1880,6 +1879,9 @@ void World::SetInitialWorldSettings()
|
||||
uint32 nextGameEvent = sGameEventMgr->StartSystem();
|
||||
_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event
|
||||
|
||||
LOG_INFO("server.loading", "Loading WorldState...");
|
||||
sWorldState->Load(); // must be called after loading game events
|
||||
|
||||
// Delete all characters which have been deleted X days before
|
||||
Player::DeleteOldCharacters();
|
||||
|
||||
|
||||
@ -141,6 +141,7 @@ struct npc_kiljaeden_controller : public NullCreatureAI
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
scheduler.CancelAll();
|
||||
instance->SetBossState(DATA_KILJAEDEN, NOT_STARTED);
|
||||
summons.DespawnAll();
|
||||
ResetOrbs();
|
||||
@ -286,11 +287,11 @@ struct boss_kiljaeden : public BossAI
|
||||
DoCastSelf(SPELL_SHADOW_SPIKE);
|
||||
});
|
||||
|
||||
ScheduleTimedEvent(3s, [&] {
|
||||
ScheduleTimedEvent(31s, [&] {
|
||||
DoCastSelf(SPELL_FLAME_DART);
|
||||
}, 10s);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(50s, [&] {
|
||||
ScheduleTimedEvent(55s, [&] {
|
||||
Talk(EMOTE_KJ_DARKNESS);
|
||||
DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS);
|
||||
}, 45s);
|
||||
@ -326,7 +327,11 @@ struct boss_kiljaeden : public BossAI
|
||||
ScheduleBasicAbilities();
|
||||
});
|
||||
|
||||
ScheduleTimedEvent(50s, [&] {
|
||||
ScheduleTimedEvent(28s, [&] {
|
||||
DoCastSelf(SPELL_FLAME_DART);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(64s, [&] {
|
||||
me->RemoveAurasDueToSpell(SPELL_ARMAGEDDON_PERIODIC);
|
||||
Talk(EMOTE_KJ_DARKNESS);
|
||||
DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS);
|
||||
@ -394,7 +399,11 @@ struct boss_kiljaeden : public BossAI
|
||||
|
||||
ScheduleBasicAbilities();
|
||||
|
||||
ScheduleTimedEvent(30s, [&] {
|
||||
ScheduleTimedEvent(16s, [&] {
|
||||
DoCastSelf(SPELL_FLAME_DART);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(15s, [&] {
|
||||
me->RemoveAurasDueToSpell(SPELL_ARMAGEDDON_PERIODIC);
|
||||
Talk(EMOTE_KJ_DARKNESS);
|
||||
DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS);
|
||||
|
||||
@ -336,6 +336,22 @@ private:
|
||||
TaskScheduler scheduler;
|
||||
};
|
||||
|
||||
class spell_spell_fury_aura : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_spell_fury_aura);
|
||||
|
||||
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetUnitOwner()->ToPlayer())
|
||||
ModStackAmount(5);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_spell_fury_aura::OnApply, EFFECT_0, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_sunwell_plateau()
|
||||
{
|
||||
new instance_sunwell_plateau();
|
||||
@ -345,4 +361,5 @@ void AddSC_instance_sunwell_plateau()
|
||||
RegisterSpellScriptWithArgs(spell_sunwell_teleport, "spell_teleport_to_apex_point", SPELL_TELEPORT_TO_APEX_POINT);
|
||||
RegisterSpellScriptWithArgs(spell_sunwell_teleport, "spell_teleport_to_witchs_sanctum", SPELL_TELEPORT_TO_WITCHS_SANCTUM);
|
||||
RegisterSpellScriptWithArgs(spell_sunwell_teleport, "spell_teleport_to_sunwell_plateau", SPELL_TELEPORT_TO_SUNWELL_PLATEAU);
|
||||
RegisterSpellScript(spell_spell_fury_aura);
|
||||
}
|
||||
|
||||
@ -122,9 +122,9 @@ public:
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
|
||||
{
|
||||
if (GetClosestCreatureWithEntry(me, NPC_SOUTH_GATE, 200.0f))
|
||||
player->KilledMonsterCredit(NPC_SOUTH_GATE_CREDIT);
|
||||
player->RewardPlayerAndGroupAtEvent(NPC_SOUTH_GATE_CREDIT, player);
|
||||
else if (GetClosestCreatureWithEntry(me, NPC_NORTH_GATE, 200.0f))
|
||||
player->KilledMonsterCredit(NPC_NORTH_GATE_CREDIT);
|
||||
player->RewardPlayerAndGroupAtEvent(NPC_NORTH_GATE_CREDIT, player);
|
||||
// complete quest part
|
||||
if (Creature* bunny = GetClosestCreatureWithEntry(me, NPC_EXPLOSION_BUNNY, 200.0f))
|
||||
bunny->CastSpell(nullptr, SPELL_EXPLOSION, TRIGGERED_NONE);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user