From 226a7372339ca7c2f5130933593f72433ab3232c Mon Sep 17 00:00:00 2001 From: Unholychick Date: Fri, 24 Jul 2015 17:05:11 +0200 Subject: [PATCH 001/110] [3.3.5] Core/Spells: Fix Shattered Barrier triggering on dispel Prevents Shattered Barrier talent from triggering when Ice Barrier is dispelled. It should only trigger when Ice Barrier is removed by damage(destroyed). Closes #14555 Closes #14605 --- src/server/game/Spells/Auras/SpellAuras.cpp | 10 --------- src/server/scripts/Spells/spell_mage.cpp | 25 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index e6f01dea33e..4eea5eed03d 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1419,16 +1419,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b default: break; } - if (!caster) - break; - // Ice barrier - dispel/absorb remove - if (removeMode == AURA_REMOVE_BY_ENEMY_SPELL && GetSpellInfo()->SpellFamilyFlags[1] & 0x1) - { - // Shattered Barrier - if (AuraEffect* dummy = caster->GetDummyAuraEffect(SPELLFAMILY_MAGE, 2945, 0)) - if (roll_chance_i(dummy->GetSpellInfo()->ProcChance)) - caster->CastSpell(target, 55080, true, NULL, GetEffect(0)); - } break; case SPELLFAMILY_WARRIOR: if (!caster) diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 4edbf8822f7..c45442e1f80 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -45,11 +45,17 @@ enum MageSpells SPELL_MAGE_WORGEN_FORM = 32819, SPELL_MAGE_SHEEP_FORM = 32820, SPELL_MAGE_GLYPH_OF_ETERNAL_WATER = 70937, + SPELL_MAGE_SHATTERED_BARRIER = 55080, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907, SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126, }; +enum MageSpellIcons +{ + SPELL_ICON_MAGE_SHATTERED_BARRIER = 2945 +}; + // Incanter's Absorbtion class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript { @@ -321,6 +327,13 @@ class spell_mage_ice_barrier : public SpellScriptLoader { PrepareAuraScript(spell_mage_ice_barrier_AuraScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SHATTERED_BARRIER)) + return false; + return true; + } + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) { canBeRecalculated = false; @@ -341,10 +354,22 @@ class spell_mage_ice_barrier : public SpellScriptLoader } } + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Shattered Barrier + // Procs only if removed by damage. + if (aurEff->GetAmount() <= 0) + if (Unit* caster = GetCaster()) + if (AuraEffect* dummy = caster->GetDummyAuraEffect(SPELLFAMILY_MAGE, SPELL_ICON_MAGE_SHATTERED_BARRIER, EFFECT_0)) + if (roll_chance_i(dummy->GetSpellInfo()->ProcChance)) + caster->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER, true, nullptr, aurEff); + } + void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0); + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ice_barrier_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); } }; From 071b2c68e8efc0e71b15f4e0e6574a06cd2ca2b9 Mon Sep 17 00:00:00 2001 From: Incorrect Date: Wed, 12 Aug 2015 22:49:21 +0300 Subject: [PATCH 002/110] Core/Misc: Add a few consts to methods --- src/server/game/Entities/Player/Player.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d01cef1dda2..42fa6dc2ea3 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1627,9 +1627,9 @@ class Player : public Unit, public GridObject // Dual Spec void UpdateSpecCount(uint8 count); - uint32 GetActiveSpec() { return m_activeSpec; } + uint32 GetActiveSpec() const { return m_activeSpec; } void SetActiveSpec(uint8 spec){ m_activeSpec = spec; } - uint8 GetSpecsCount() { return m_specsCount; } + uint8 GetSpecsCount() const { return m_specsCount; } void SetSpecsCount(uint8 count) { m_specsCount = count; } void ActivateSpec(uint8 spec); From 43e8c841f5357a6cf41cdb8ed5e496019f14a16a Mon Sep 17 00:00:00 2001 From: jackpoz Date: Wed, 12 Aug 2015 23:43:24 +0200 Subject: [PATCH 003/110] Core/Spells: Fix potions exploit Fix an exploit that allowed to consume different potions even if they share the same cooldown. Closes #15265 --- src/server/game/Globals/ObjectMgr.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 5699dba7cb4..d67d7446d41 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2754,6 +2754,14 @@ void ObjectMgr::LoadItemTemplates() TC_LOG_ERROR("sql.sql", "Item (Entry: %u) has broken spell in spellid_%d (%d)", entry, j+1, itemTemplate.Spells[j].SpellId); itemTemplate.Spells[j].SpellId = 0; } + + if (spellInfo && itemTemplate.Spells[j].SpellCategory) + { + bool added = sSpellsByCategoryStore[itemTemplate.Spells[j].SpellCategory].insert(itemTemplate.Spells[j].SpellId).second; + if (added) + TC_LOG_DEBUG("sql.sql", "Item(Entry: %u) spellid_%d (%d) category %u added to sSpellsByCategoryStore", + entry, j + 1, itemTemplate.Spells[j].SpellId, itemTemplate.Spells[j].SpellCategory); + } } } } From c75ad6c8b1c2c44b85fbbd05383478cf1e4af68f Mon Sep 17 00:00:00 2001 From: Rushor Date: Thu, 13 Aug 2015 15:21:40 +0200 Subject: [PATCH 004/110] DB/Pathing: Stratholme - King's Square * Patchwerk + Ghouls * Emote for 'Mangled Cadaver' --- sql/updates/world/2015_08_13_00_world.sql | 234 ++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 sql/updates/world/2015_08_13_00_world.sql diff --git a/sql/updates/world/2015_08_13_00_world.sql b/sql/updates/world/2015_08_13_00_world.sql new file mode 100644 index 00000000000..828a626851b --- /dev/null +++ b/sql/updates/world/2015_08_13_00_world.sql @@ -0,0 +1,234 @@ +-- Stratholme - King's Square +-- 3.x +4.x +6.x +-- rndmmovement +UPDATE `creature` SET `spawndist`=2 WHERE `guid` IN (53148, 52999, 53000, 53000, 53149); +-- pathing +-- patchwerk 1 +SET @NPC := 53954; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3656.723,`position_y`=-3513.025,`position_z`=136.9099 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3656.723,-3513.025,136.9099,0,0,0,0,100,0), +(@PATH,2,3657.473,-3512.525,136.9099,0,0,0,0,100,0), +(@PATH,3,3658.473,-3498.275,136.6599,0,0,0,0,100,0), +(@PATH,4,3658.507,-3497.959,136.9155,0,0,0,0,100,0), +(@PATH,5,3658.757,-3494.459,136.9155,0,0,0,0,100,0), +(@PATH,6,3654.507,-3492.959,136.9155,0,0,0,0,100,0), +(@PATH,7,3651.257,-3491.459,136.9155,0,0,0,0,100,0), +(@PATH,8,3645.507,-3488.959,137.4155,0,0,0,0,100,0), +(@PATH,9,3645.125,-3488.808,137.3199,0,0,0,0,100,0), +(@PATH,10,3643.375,-3488.058,137.5699,0,0,0,0,100,0), +(@PATH,11,3638.125,-3490.058,137.3199,0,0,0,0,100,0), +(@PATH,12,3635.125,-3491.308,137.5699,0,0,0,0,100,0), +(@PATH,13,3627.464,-3493.699,137.235,0,0,0,0,100,0), +(@PATH,14,3622.464,-3493.949,137.485,0,0,0,0,100,0), +(@PATH,15,3613.366,-3494.758,136.9154,0,0,0,0,100,0), +(@PATH,16,3609.366,-3491.258,136.6654,0,0,0,0,100,0), +(@PATH,17,3602.366,-3485.008,135.9154,0,0,0,0,100,0), +(@PATH,18,3595.843,-3479.371,135.1627,0,0,0,0,100,0), +(@PATH,19,3600.593,-3486.121,135.9127,0,0,0,0,100,0), +(@PATH,20,3605.343,-3493.371,136.6627,0,0,0,0,100,0), +(@PATH,21,3612.294,-3503.09,137.4564,0,0,0,0,100,0), +(@PATH,22,3613.294,-3504.09,137.4564,0,0,0,0,100,0), +(@PATH,23,3620.044,-3512.09,137.4564,0,0,0,0,100,0), +(@PATH,24,3622.044,-3514.34,137.2064,0,0,0,0,100,0), +(@PATH,25,3628.683,-3521.636,137.0146,0,0,0,0,100,0), +(@PATH,26,3632.433,-3521.136,136.7646,0,0,0,0,100,0), +(@PATH,27,3635.433,-3520.636,136.7646,0,0,0,0,100,0), +(@PATH,28,3639.933,-3519.886,137.0146,0,0,0,0,100,0), +(@PATH,29,3641.183,-3519.886,136.7646,0,0,0,0,100,0), +(@PATH,30,3647.269,-3518.891,136.7158,0,0,0,0,100,0), +(@PATH,31,3649.769,-3517.391,136.7158,0,0,0,0,100,0), +(@PATH,32,3656.769,-3513.141,136.9658,0,0,0,0,100,0); + +-- patchwerk 2 +SET @NPC := 53943; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3693.587,`position_y`=-3392.627,`position_z`=132.258 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3693.587,-3392.627,132.258,0,0,0,0,100,0), +(@PATH,2,3692.087,-3390.627,132.008,0,0,0,0,100,0), +(@PATH,3,3690.087,-3386.627,131.508,0,0,0,0,100,0), +(@PATH,4,3688.087,-3382.877,130.758,0,0,0,0,100,0), +(@PATH,5,3685.837,-3379.127,130.008,0,0,0,0,100,0), +(@PATH,6,3682.587,-3373.127,129.508,0,0,0,0,100,0), +(@PATH,7,3679.837,-3367.627,128.758,0,0,0,0,100,0), +(@PATH,8,3677.837,-3364.127,128.008,0,0,0,0,100,0), +(@PATH,9,3677.505,-3363.911,127.5753,0,0,0,0,100,0), +(@PATH,10,3676.505,-3361.911,127.0753,0,0,0,0,100,0), +(@PATH,11,3675.255,-3360.161,126.8253,0,0,0,0,100,0), +(@PATH,12,3674.505,-3358.911,126.3253,0,0,0,0,100,0), +(@PATH,13,3671.505,-3354.411,125.8253,0,0,0,0,100,0), +(@PATH,14,3669.005,-3350.161,125.5753,0,0,0,0,100,0), +(@PATH,15,3667.255,-3347.411,125.3253,0,0,0,0,100,0), +(@PATH,16,3662.255,-3339.911,124.5753,0,0,0,0,100,0), +(@PATH,17,3659.744,-3335.81,124.2587,0,0,0,0,100,0), +(@PATH,18,3661.244,-3333.56,124.0087,0,0,0,0,100,0), +(@PATH,19,3666.244,-3325.56,124.0087,0,0,0,0,100,0), +(@PATH,20,3667.994,-3322.81,124.0087,0,0,0,0,100,0), +(@PATH,21,3668.494,-3321.31,124.5087,0,0,0,0,100,0), +(@PATH,22,3673.494,-3313.06,126.5087,0,0,0,0,100,0), +(@PATH,23,3676.687,-3308.217,127.0456,0,0,0,0,100,0), +(@PATH,24,3678.437,-3301.217,127.5456,0,0,0,0,100,0), +(@PATH,25,3680.437,-3292.967,128.0456,0,0,0,0,100,0), +(@PATH,26,3681.687,-3288.717,128.2956,0,0,0,0,100,0), +(@PATH,27,3682.687,-3285.467,128.0456,0,0,0,0,100,0), +(@PATH,28,3683.687,-3280.967,128.0456,0,0,0,0,100,0), +(@PATH,29,3684.886,-3277.052,127.8707,0,0,0,0,100,0), +(@PATH,30,3691.386,-3272.302,128.1207,0,0,0,0,100,0), +(@PATH,31,3696.886,-3268.552,128.1207,0,0,0,0,100,0), +(@PATH,32,3703.386,-3263.302,127.8707,0,0,0,0,100,0), +(@PATH,33,3703.537,-3263.307,127.8513,0,0,0,0,100,0), +(@PATH,34,3696.787,-3268.307,128.1013,0,0,0,0,100,0), +(@PATH,35,3691.537,-3272.307,128.1013,0,0,0,0,100,0), +(@PATH,36,3684.775,-3277.28,127.9393,0,0,0,0,100,0), +(@PATH,37,3683.775,-3281.03,127.9393,0,0,0,0,100,0), +(@PATH,38,3682.525,-3285.28,127.9393,0,0,0,0,100,0), +(@PATH,39,3681.775,-3288.78,128.1893,0,0,0,0,100,0), +(@PATH,40,3680.775,-3292.78,127.9393,0,0,0,0,100,0), +(@PATH,41,3678.525,-3301.28,127.4393,0,0,0,0,100,0), +(@PATH,42,3676.775,-3307.78,126.9393,0,0,0,0,100,0), +(@PATH,43,3676.495,-3308.055,126.7956,0,0,0,0,100,0), +(@PATH,44,3676.495,-3308.305,126.7956,0,0,0,0,100,0), +(@PATH,45,3673.495,-3313.055,126.2956,0,0,0,0,100,0), +(@PATH,46,3668.495,-3321.305,124.5456,0,0,0,0,100,0), +(@PATH,47,3667.995,-3322.555,124.0456,0,0,0,0,100,0), +(@PATH,48,3666.245,-3325.555,124.0456,0,0,0,0,100,0), +(@PATH,49,3661.245,-3333.555,124.0456,0,0,0,0,100,0), +(@PATH,50,3661.398,-3333.665,124.0029,0,0,0,0,100,0), +(@PATH,51,3659.898,-3336.165,124.2529,0,0,0,0,100,0), +(@PATH,52,3662.398,-3339.915,124.5029,0,0,0,0,100,0), +(@PATH,53,3667.148,-3347.165,125.2529,0,0,0,0,100,0), +(@PATH,54,3668.898,-3349.915,125.2529,0,0,0,0,100,0), +(@PATH,55,3671.648,-3354.415,125.7529,0,0,0,0,100,0), +(@PATH,56,3674.398,-3358.915,126.2529,0,0,0,0,100,0), +(@PATH,57,3675.398,-3360.165,126.7529,0,0,0,0,100,0); + +-- patchwerk 3 +SET @NPC := 53953; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3548.131,`position_y`=-3350.274,`position_z`=129.7909 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3548.131,-3350.274,129.7909,0,0,0,0,100,0), +(@PATH,2,3553.131,-3348.024,129.2909,0,0,0,0,100,0), +(@PATH,3,3559.131,-3345.524,129.2909,0,0,0,0,100,0), +(@PATH,4,3566.631,-3342.524,129.7909,0,0,0,0,100,0), +(@PATH,5,3568.131,-3341.774,129.5409,0,0,0,0,100,0), +(@PATH,6,3575.881,-3338.274,128.7909,0,0,0,0,100,0), +(@PATH,7,3578.131,-3337.274,128.5409,0,0,0,0,100,0), +(@PATH,8,3586.131,-3334.024,128.0409,0,0,0,0,100,0), +(@PATH,9,3586.197,-3333.996,128.0313,0,0,0,0,100,0), +(@PATH,10,3586.697,-3333.746,128.0313,0,0,0,0,100,0), +(@PATH,11,3576.947,-3333.746,128.7813,0,0,0,0,100,0), +(@PATH,12,3569.697,-3333.496,129.2813,0,0,0,0,100,0), +(@PATH,13,3565.197,-3333.496,129.5313,0,0,0,0,100,0), +(@PATH,14,3560.02,-3333.251,129.5826,0,0,0,0,100,0), +(@PATH,15,3542.77,-3327.501,129.5826,0,0,0,0,100,0), +(@PATH,16,3537.52,-3325.501,129.5826,0,0,0,0,100,0), +(@PATH,17,3533.931,-3324.1,130.2483,0,0,0,0,100,0), +(@PATH,18,3526.181,-3320.85,130.9983,0,0,0,0,100,0), +(@PATH,19,3526.113,-3320.813,131.0822,0,0,0,0,100,0), +(@PATH,20,3534.17,-3324.386,129.9323,0,0,0,0,100,0), +(@PATH,21,3537.67,-3325.636,129.6823,0,0,0,0,100,0), +(@PATH,22,3542.67,-3327.386,129.6823,0,0,0,0,100,0), +(@PATH,23,3560.328,-3333.262,129.4392,0,0,0,0,100,0), +(@PATH,24,3565.078,-3333.262,129.4392,0,0,0,0,100,0), +(@PATH,25,3569.578,-3333.262,129.1892,0,0,0,0,100,0), +(@PATH,26,3577.078,-3333.262,128.6892,0,0,0,0,100,0), +(@PATH,27,3586.078,-3333.512,128.1892,0,0,0,0,100,0), +(@PATH,28,3586.124,-3333.573,128.1801,0,0,0,0,100,0), +(@PATH,29,3586.624,-3333.573,127.9301,0,0,0,0,100,0), +(@PATH,30,3578.124,-3337.323,128.6801,0,0,0,0,100,0), +(@PATH,31,3576.374,-3338.073,128.6801,0,0,0,0,100,0), +(@PATH,32,3568.124,-3341.823,129.4301,0,0,0,0,100,0), +(@PATH,33,3566.624,-3342.323,129.6801,0,0,0,0,100,0), +(@PATH,34,3559.124,-3345.573,129.4301,0,0,0,0,100,0), +(@PATH,35,3553.124,-3348.073,129.4301,0,0,0,0,100,0), +(@PATH,36,3547.868,-3350.434,130.0947,0,0,0,0,100,0), +(@PATH,37,3546.368,-3354.684,130.8447,0,0,0,0,100,0), +(@PATH,38,3543.118,-3365.184,131.8447,0,0,0,0,100,0), +(@PATH,39,3540.868,-3371.184,132.5947,0,0,0,0,100,0), +(@PATH,40,3538.868,-3376.434,132.5947,0,0,0,0,100,0); + +-- ghoul 1 +SET @NPC := 53594; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH, 1, 3473.78, -3366.93, 136.507, 0, 0, 0, 0, 100, 0), +(@PATH, 2, 3490.31, -3376.55, 135.208, 0, 0, 0, 0, 100, 0), +(@PATH, 3, 3503.41, -3381.49, 134.565, 0, 0, 0, 0, 100, 0), +(@PATH, 4, 3535.2, -3388.79, 132.377, 0, 0, 0, 0, 100, 0), +(@PATH, 5, 3537.69, -3394.79, 132.377, 0, 0, 0, 0, 100, 0), +(@PATH, 6, 3547.23, -3422.23, 135.428, 0, 0, 0, 0, 100, 0), +(@PATH, 7, 3542.17, -3409.17, 133.978, 0, 0, 0, 0, 100, 0), +(@PATH, 8, 3534.93, -3390.99, 132.376, 0, 0, 0, 0, 100, 0), +(@PATH, 9, 3514.6, -3385.83, 132.954, 0, 0, 0, 0, 100, 0), +(@PATH, 10, 3490.51, -3379.59, 135.276, 0, 0, 0, 0, 100, 0); + +-- ghoul 2 +SET @NPC := 53650; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH, 1, 3540.4, -3368.09, 132.121, 0, 0, 0, 0, 100, 0), +(@PATH, 2, 3542.78, -3361.51, 131.314, 0, 0, 0, 0, 100, 0), +(@PATH, 3, 3549.92, -3341.76, 129.224, 0, 0, 0, 0, 100, 0), +(@PATH, 4, 3560.03, -3335.19, 129.328, 0, 0, 0, 0, 100, 0), +(@PATH, 5, 3574.02, -3335.48, 128.637, 0, 0, 0, 0, 100, 0), +(@PATH, 6, 3573.64, -3335.16, 128.678, 0, 0, 0, 0, 100, 0), +(@PATH, 7, 3555.43, -3333.6, 129.334, 0, 0, 0, 0, 100, 0), +(@PATH, 8, 3551.14, -3346.93, 129.178, 0, 0, 0, 0, 100, 0), +(@PATH, 9, 3543.94, -3366.65, 131.755, 0, 0, 0, 0, 100, 0), +(@PATH, 10, 3538.8, -3383.53, 132.376, 0, 0, 0, 0, 100, 0), +(@PATH, 11, 3541.21, -3408.97, 133.924, 0, 0, 0, 0, 100, 0), +(@PATH, 12, 3543.48, -3415.58, 134.695, 0, 0, 0, 0, 100, 0), +(@PATH, 13, 3544.42, -3415.4, 134.705, 0, 0, 0, 0, 100, 0), +(@PATH, 14, 3540.17, -3402.06, 133.109, 0, 0, 0, 0, 100, 0), +(@PATH, 15, 3539.67, -3377.05, 132.376, 0, 0, 0, 0, 100, 0); + +-- ghoul 3 +SET @NPC := 53674; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH, 1, 3522.5, -3323, 131.049, 0, 0, 0, 0, 100, 0), +(@PATH, 2, 3502.3, -3316.38, 130.224, 0, 0, 0, 0, 100, 0), +(@PATH, 3, 3526.88, -3322.32, 130.737, 0, 0, 0, 0, 100, 0), +(@PATH, 4, 3540.5, -3325.57, 129.385, 0, 0, 0, 0, 100, 0), +(@PATH, 5, 3560.99, -3330.15, 129.396, 0, 0, 0, 0, 100, 0), +(@PATH, 6, 3584.68, -3334.31, 127.753, 0, 0, 0, 0, 100, 0), +(@PATH, 7, 3571, -3331.47, 129.071, 0, 0, 0, 0, 100, 0), +(@PATH, 8, 3557.25, -3328.84, 129.396, 0, 0, 0, 0, 100, 0), +(@PATH, 9, 3532.13, -3323.54, 130.087, 0, 0, 0, 0, 100, 0); + + -- cadaver emote + -- Mangled Cadaver SAI +SET @ENTRY := 10382; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,3,0,0,30000,30000,11,16143,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mangled Cadaver - In Combat - Cast 'Cadaver Worms' (No Repeat) (Normal Dungeon)"), +(@ENTRY,0,1,0,6,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mangled Cadaver - On Just Died - Say Line 0"); + +DELETE FROM `creature_text` WHERE `entry`=10382; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(10382, 0, 0, '%s collapses but the broken body rises again!', 16, 0, 100, 0, 0, 0, 5772, 'Mangled Cadaver'); From 073bf45740c67daedc286c6ac34378cd05b882b2 Mon Sep 17 00:00:00 2001 From: Rushor Date: Thu, 13 Aug 2015 16:43:31 +0200 Subject: [PATCH 005/110] DB/Pathing: Stratholme - Patchwork Horror --- sql/updates/world/2015_08_13_01_world.sql | 68 +++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 sql/updates/world/2015_08_13_01_world.sql diff --git a/sql/updates/world/2015_08_13_01_world.sql b/sql/updates/world/2015_08_13_01_world.sql new file mode 100644 index 00000000000..cdfc38b1202 --- /dev/null +++ b/sql/updates/world/2015_08_13_01_world.sql @@ -0,0 +1,68 @@ +-- Patchwork Horror +-- Pathing for Entry: 53943 'TDB FORMAT' +SET @NPC := 53953; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x` = 3560.001, `position_y` = -3333.560, `position_z` = 129.3446 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES +(@PATH, 1, 3560, -3333.56, 129.345), +(@PATH, 2, 3586.66, -3333.67, 127.532), +(@PATH, 3, 3547.96, -3350.48, 129.671), +(@PATH, 4, 3535.26, -3386.41, 132.376), +(@PATH, 5, 3547.32, -3425.53, 135.592), +(@PATH, 6, 3535.26, -3386.41, 132.376), +(@PATH, 7, 3547.96, -3350.48, 129.671), +(@PATH, 8, 3586.66, -3333.67, 127.532), +(@PATH, 9, 3560, -3333.56, 129.345), +(@PATH, 10, 3534.01, -3324.43, 129.798), +(@PATH, 11, 3514.71, -3316.2, 131.367), +(@PATH, 12, 3534.01, -3324.43, 129.798); + +-- Pathing for Entry: 53943 'TDB FORMAT' +SET @NPC := 53943; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2, `position_x` = 3658.833, `position_y` = -3494.780, `position_z` = 136.6372 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES +(@PATH, 1, 3658.83, -3494.78, 136.637), +(@PATH, 2, 3643.47, -3488.16, 137.328), +(@PATH, 3, 3627.43, -3493.95, 136.949), +(@PATH, 4, 3613.32, -3494.96, 136.837), +(@PATH, 5, 3595.51, -3479.3, 134.85), +(@PATH, 6, 3611.96, -3502.99, 137.218), +(@PATH, 7, 3628.52, -3521.97, 136.803), +(@PATH, 8, 3646.97, -3519.17, 136.667), +(@PATH, 9, 3657.54, -3512.66, 136.748); + +-- Pathing for Entry: 53954 'TDB FORMAT' +SET @NPC := 53954; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2, `position_x` = 3659.589, `position_y` = -3336.161, `position_z` = 123.8126 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES +(@PATH, 1, 3659.59, -3336.16, 123.813), +(@PATH, 2, 3676.39, -3362, 126.91), +(@PATH, 3, 3684.48, -3376.63, 129.534), +(@PATH, 4, 3692.16, -3390.77, 131.803), +(@PATH, 5, 3704.82, -3409.99, 132.136), +(@PATH, 6, 3707.44, -3415.75, 131.862), +(@PATH, 7, 3713.12, -3429.09, 131.052), +(@PATH, 8, 3707.44, -3415.75, 131.862), +(@PATH, 9, 3704.82, -3409.99, 132.136), +(@PATH, 10, 3692.16, -3390.77, 131.803), +(@PATH, 11, 3684.48, -3376.63, 129.534), +(@PATH, 12, 3676.56, -3362.26, 126.988), +(@PATH, 13, 3659.59, -3336.16, 123.813), +(@PATH, 14, 3676.38, -3308.39, 126.575), +(@PATH, 15, 3684.71, -3277.38, 127.788), +(@PATH, 16, 3710.36, -3258.23, 127.414), +(@PATH, 17, 3684.71, -3277.38, 127.788), +(@PATH, 18, 3676.38, -3308.39, 126.575); + +UPDATE `creature_template` SET `speed_walk` = 1 WHERE `Entry` = 10414; From 8a6a5d32ff462a1732686d55d44929480c13d989 Mon Sep 17 00:00:00 2001 From: Rushor Date: Thu, 13 Aug 2015 17:17:36 +0200 Subject: [PATCH 006/110] DB/Pathing: Stratholme - Hall of Light --- sql/updates/world/2015_08_13_02_world.sql | 204 ++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 sql/updates/world/2015_08_13_02_world.sql diff --git a/sql/updates/world/2015_08_13_02_world.sql b/sql/updates/world/2015_08_13_02_world.sql new file mode 100644 index 00000000000..e2863aea0f7 --- /dev/null +++ b/sql/updates/world/2015_08_13_02_world.sql @@ -0,0 +1,204 @@ +-- Stratholme - Hall of Light +-- 1. +SET @NPC := 54085; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3616.438,`position_y`=-3097.423,`position_z`=134.3719 WHERE `guid`=@NPC; +UPDATE `creature` SET `spawndist`=0,`MovementType`=0,`position_x`=3616.438,`position_y`=-3097.423,`position_z`=134.3719 WHERE `guid`=54071; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3616.438,-3097.423,134.3719,0,0,0,0,100,0), +(@PATH,2,3614.938,-3098.173,134.3719,0,0,0,0,100,0), +(@PATH,3,3612.438,-3099.173,134.3719,0,0,0,0,100,0), +(@PATH,4,3606.938,-3101.423,134.3719,0,0,0,0,100,0), +(@PATH,5,3606.734,-3101.405,134.6407,0,0,0,0,100,0), +(@PATH,6,3604.484,-3102.155,134.6407,0,0,0,0,100,0), +(@PATH,7,3600.234,-3096.655,134.6407,0,0,0,0,100,0), +(@PATH,8,3598.984,-3095.155,135.8907,0,0,0,0,100,0), +(@PATH,9,3598.234,-3094.155,135.8907,0,0,0,0,100,0), +(@PATH,10,3595.816,-3091.076,135.9108,0,0,0,0,100,0), +(@PATH,11,3587.79,-3079.112,135.9129,0,0,0,0,100,0), +(@PATH,12,3587.842,-3079.453,135.662,0,0,0,0,100,0), +(@PATH,13,3588.163,-3079.576,135.9112,0,0,0,0,100,0), +(@PATH,14,3596.181,-3091.539,135.891,0,0,0,0,100,0), +(@PATH,15,3598.431,-3094.289,135.891,0,0,0,0,100,0), +(@PATH,16,3598.931,-3095.039,135.891,0,0,0,0,100,0), +(@PATH,17,3599.931,-3096.539,134.891,0,0,0,0,100,0), +(@PATH,18,3604.416,-3102.23,134.1847,0,0,0,0,100,0), +(@PATH,19,3606.416,-3101.48,134.1847,0,0,0,0,100,0), +(@PATH,20,3612.416,-3098.98,134.1847,0,0,0,0,100,0), +(@PATH,21,3614.166,-3098.23,134.1847,0,0,0,0,100,0), +(@PATH,22,3614.522,-3098.114,134.3642,0,0,0,0,100,0), +(@PATH,23,3616.772,-3097.114,134.3642,0,0,0,0,100,0), +(@PATH,24,3621.522,-3093.864,134.3642,0,0,0,0,100,0), +(@PATH,25,3623.522,-3092.114,134.3642,0,0,0,0,100,0), +(@PATH,26,3632.772,-3086.114,134.3642,0,0,0,0,100,0), +(@PATH,27,3633.048,-3085.9,134.3664,0,0,0,0,100,0), +(@PATH,28,3634.048,-3085.4,134.3664,0,0,0,0,100,0), +(@PATH,29,3636.548,-3083.65,134.3664,0,0,0,0,100,0), +(@PATH,30,3638.048,-3082.9,134.3664,0,0,0,0,100,0), +(@PATH,31,3639.548,-3081.9,134.3664,0,0,0,0,100,0), +(@PATH,32,3639.528,-3081.807,134.366,0,0,0,0,100,0), +(@PATH,33,3638.028,-3082.807,134.366,0,0,0,0,100,0), +(@PATH,34,3636.778,-3083.557,134.366,0,0,0,0,100,0); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=54085; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(54085, 54085, 0, 0, 2, 0, 0), +(54085, 54071, 3, 0, 2, 0, 0); + +-- 2. +SET @NPC := 52141; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3535.722,`position_y`=-3057.91,`position_z`=135.3322 WHERE `guid`=@NPC; +UPDATE `creature` SET `spawndist`=0,`MovementType`=0,`position_x`=3535.722,`position_y`=-3057.91,`position_z`=135.3322 WHERE `guid`=54169; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3535.722,-3057.91,135.3322,0,0,0,0,100,0), +(@PATH,2,3540.984,-3066.577,135.6673,0,0,0,0,100,0), +(@PATH,3,3537.299,-3060.883,135.6673,0,0,0,0,100,0), +(@PATH,4,3535.783,-3058.649,135.6673,0,0,0,0,100,0), +(@PATH,5,3535.532,-3058.017,135.5822,0,0,0,0,100,0), +(@PATH,6,3533.794,-3055.673,134.997,0,0,0,0,100,0), +(@PATH,7,3529.241,-3048.929,134.997,0,0,0,0,100,0), +(@PATH,8,3530.385,-3053.843,134.997,0,0,0,0,100,0), +(@PATH,9,3529.099,-3054.688,135.247,0,0,0,0,100,0), +(@PATH,10,3524.849,-3056.438,135.247,0,0,0,0,100,0), +(@PATH,11,3524.898,-3057.071,135.247,0,0,0,0,100,0), +(@PATH,12,3517.685,-3062.228,134.997,0,0,0,0,100,0), +(@PATH,13,3515.195,-3063.973,134.997,0,0,0,0,100,0), +(@PATH,14,3517.849,-3062.096,134.997,0,0,0,0,100,0), +(@PATH,15,3512.628,-3065.658,135.247,0,0,0,0,100,0), +(@PATH,16,3512.88,-3065.546,134.997,0,0,0,0,100,0), +(@PATH,17,3512.397,-3065.865,135.247,0,0,0,0,100,0), +(@PATH,18,3507.873,-3069.02,134.997,0,0,0,0,100,0), +(@PATH,19,3501.293,-3073.773,134.997,0,0,0,0,100,0), +(@PATH,20,3502.973,-3072.586,134.997,0,0,0,0,100,0), +(@PATH,21,3500.175,-3074.654,135.247,0,0,0,0,100,0), +(@PATH,22,3498.175,-3076.154,135.247,0,0,0,0,100,0), +(@PATH,23,3498.078,-3076.195,134.997,0,0,0,0,100,0), +(@PATH,24,3497.885,-3076.195,135.247,0,0,0,0,100,0), +(@PATH,25,3496.635,-3077.195,135.247,0,0,0,0,100,0), +(@PATH,26,3498.074,-3076.204,134.997,0,0,0,0,100,0), +(@PATH,27,3500.452,-3074.542,135.247,0,0,0,0,100,0), +(@PATH,28,3503.016,-3072.576,134.997,0,0,0,0,100,0), +(@PATH,29,3509.555,-3067.772,134.997,0,0,0,0,100,0), +(@PATH,30,3507.929,-3069.026,134.997,0,0,0,0,100,0), +(@PATH,31,3512.387,-3065.935,135.247,0,0,0,0,100,0), +(@PATH,32,3512.517,-3065.823,135.247,0,0,0,0,100,0), +(@PATH,33,3519.535,-3060.917,134.997,0,0,0,0,100,0), +(@PATH,34,3517.873,-3062.076,134.997,0,0,0,0,100,0), +(@PATH,35,3524.547,-3057.446,134.997,0,0,0,0,100,0), +(@PATH,36,3522.894,-3058.655,134.997,0,0,0,0,100,0), +(@PATH,37,3525.393,-3056.905,135.247,0,0,0,0,100,0), +(@PATH,38,3528.643,-3054.905,135.247,0,0,0,0,100,0), +(@PATH,39,3527.923,-3055.323,134.997,0,0,0,0,100,0), +(@PATH,40,3528.969,-3054.581,135.247,0,0,0,0,100,0), +(@PATH,41,3532.499,-3054.48,134.997,0,0,0,0,100,0); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=52141; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(52141, 52141, 0, 0, 2, 0, 0), +(52141, 54169, 3, 0, 2, 0, 0); + +-- 3. +SET @NPC := 52144; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3443.406,`position_y`=-3083.562,`position_z`=135.0021 WHERE `guid`=@NPC; +UPDATE `creature` SET `spawndist`=0,`MovementType`=0,`position_x`=3443.406,`position_y`=-3083.562,`position_z`=135.0021 WHERE `guid`=54170; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3443.406,-3083.562,135.0021,0,0,0,0,100,0), +(@PATH,2,3438.447,-3078.663,135.5136,0,0,0,0,100,0), +(@PATH,3,3438.595,-3078.601,135.0019,0,0,0,0,100,0), +(@PATH,4,3442.701,-3082.71,135.0021,0,0,0,0,100,0), +(@PATH,5,3444.575,-3084.654,135.0022,0,0,0,0,100,0), +(@PATH,6,3445.956,-3083.634,135.0022,0,0,0,0,100,0), +(@PATH,7,3446.778,-3083.367,135.2478,0,0,0,0,100,0), +(@PATH,8,3449.778,-3082.867,135.2478,0,0,0,0,100,0), +(@PATH,9,3449.807,-3082.485,135.2462,0,0,0,0,100,0), +(@PATH,10,3457.698,-3077.302,134.9976,0,0,0,0,100,0), +(@PATH,11,3455.978,-3078.373,134.9957,0,0,0,0,100,0), +(@PATH,12,3458.637,-3076.211,135.2484,0,0,0,0,100,0), +(@PATH,13,3460.387,-3075.211,135.2484,0,0,0,0,100,0), +(@PATH,14,3460.28,-3075.071,135.2505,0,0,0,0,100,0), +(@PATH,15,3465.067,-3071.659,135.2512,0,0,0,0,100,0), +(@PATH,16,3465.241,-3071.764,135.2516,0,0,0,0,100,0), +(@PATH,17,3472.513,-3066.586,135.0025,0,0,0,0,100,0), +(@PATH,18,3470.79,-3067.797,135.0025,0,0,0,0,100,0), +(@PATH,19,3474.771,-3064.983,135.2522,0,0,0,0,100,0), +(@PATH,20,3474.693,-3065.094,135.2523,0,0,0,0,100,0), +(@PATH,21,3482.48,-3059.7,135.0017,0,0,0,0,100,0), +(@PATH,22,3480.787,-3060.873,135.0018,0,0,0,0,100,0), +(@PATH,23,3478.327,-3062.577,135.002,0,0,0,0,100,0), +(@PATH,24,3476.108,-3064.115,135.0021,0,0,0,0,100,0), +(@PATH,25,3475.113,-3064.708,135.2523,0,0,0,0,100,0), +(@PATH,26,3472.919,-3066.325,135.0025,0,0,0,0,100,0), +(@PATH,27,3471.327,-3067.427,135.0025,0,0,0,0,100,0), +(@PATH,28,3465.504,-3071.557,135.2518,0,0,0,0,100,0), +(@PATH,29,3466.285,-3070.921,135.0025,0,0,0,0,100,0), +(@PATH,30,3465.06,-3071.76,135.2514,0,0,0,0,100,0), +(@PATH,31,3460.56,-3074.76,135.2514,0,0,0,0,100,0), +(@PATH,32,3461.687,-3074.164,135.0022,0,0,0,0,100,0), +(@PATH,33,3460.227,-3075.276,135.2483,0,0,0,0,100,0), +(@PATH,34,3458.727,-3076.276,135.2483,0,0,0,0,100,0), +(@PATH,35,3456.701,-3077.72,134.9965,0,0,0,0,100,0), +(@PATH,36,3450.072,-3082.449,134.9891,0,0,0,0,100,0), +(@PATH,37,3451.695,-3081.291,134.9909,0,0,0,0,100,0), +(@PATH,38,3449.717,-3082.664,135.247,0,0,0,0,100,0), +(@PATH,39,3447.467,-3084.164,135.247,0,0,0,0,100,0), +(@PATH,40,3447.448,-3084.141,135.2488,0,0,0,0,100,0), +(@PATH,41,3445.289,-3083.674,135.0022,0,0,0,0,100,0); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=52144; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(52144, 52144, 0, 0, 2, 0, 0), +(52144, 54170, 3, 0, 2, 0, 0); + +-- 4. +SET @NPC := 54205; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3581.3,`position_y`=-2994.275,`position_z`=125.25 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,3581.3,-2994.275,125.25,0,0,0,0,100,0), +(@PATH,2,3582.05,-2995.275,125.25,0,0,0,0,100,0), +(@PATH,3,3581.05,-2995.775,125.25,0,0,0,0,100,0), +(@PATH,4,3575.3,-2999.775,125.25,0,0,0,0,100,0), +(@PATH,5,3573.05,-3001.275,125.25,0,0,0,0,100,0), +(@PATH,6,3571.8,-3002.025,125.25,0,0,0,0,100,0), +(@PATH,7,3569.3,-3004.025,125.25,0,0,0,0,100,0), +(@PATH,8,3565.3,-3006.775,125.25,0,0,0,0,100,0), +(@PATH,9,3562.695,-3008.538,125.2498,0,0,0,0,100,0), +(@PATH,10,3555.445,-3014.038,125.2498,0,0,0,0,100,0), +(@PATH,11,3553.945,-3015.288,125.2498,0,0,0,0,100,0), +(@PATH,12,3551.945,-3016.788,125.2498,0,0,0,0,100,0), +(@PATH,13,3546.965,-3020.639,125.3795,0,0,0,0,100,0), +(@PATH,14,3550.465,-3026.139,125.3795,0,0,0,0,100,0), +(@PATH,15,3550.965,-3027.139,125.3795,0,0,0,0,100,0), +(@PATH,16,3552.215,-3028.389,125.3795,0,0,0,0,100,0), +(@PATH,17,3552.715,-3029.889,125.3795,0,0,0,0,100,0), +(@PATH,18,3553.965,-3031.639,126.1295,0,0,0,0,100,0), +(@PATH,19,3553.932,-3031.731,126.1293,0,0,0,0,100,0), +(@PATH,20,3552.932,-3029.731,125.3793,0,0,0,0,100,0), +(@PATH,21,3552.182,-3028.981,125.3793,0,0,0,0,100,0), +(@PATH,22,3551.182,-3026.981,125.3793,0,0,0,0,100,0), +(@PATH,23,3550.432,-3025.981,125.3793,0,0,0,0,100,0), +(@PATH,24,3546.863,-3020.401,125.2494,0,0,0,0,100,0), +(@PATH,25,3551.863,-3016.651,125.2494,0,0,0,0,100,0), +(@PATH,26,3553.863,-3015.401,125.2494,0,0,0,0,100,0), +(@PATH,27,3555.363,-3014.151,125.2494,0,0,0,0,100,0), +(@PATH,28,3562.876,-3008.442,125.2495,0,0,0,0,100,0), +(@PATH,29,3565.126,-3006.692,125.2495,0,0,0,0,100,0), +(@PATH,30,3569.376,-3003.942,125.2495,0,0,0,0,100,0), +(@PATH,31,3571.876,-3002.192,125.2495,0,0,0,0,100,0), +(@PATH,32,3573.126,-3001.442,125.2495,0,0,0,0,100,0), +(@PATH,33,3575.376,-2999.942,125.2495,0,0,0,0,100,0), +(@PATH,34,3581.126,-2995.942,125.2495,0,0,0,0,100,0); From d35a5ee8d255b9ec1c0c97c637dfb0ff240a051f Mon Sep 17 00:00:00 2001 From: Rushor Date: Thu, 13 Aug 2015 18:37:58 +0200 Subject: [PATCH 007/110] DB/Pathing: Stratholme - The Gauntlet --- sql/updates/world/2015_08_13_03_world.sql | 104 ++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 sql/updates/world/2015_08_13_03_world.sql diff --git a/sql/updates/world/2015_08_13_03_world.sql b/sql/updates/world/2015_08_13_03_world.sql new file mode 100644 index 00000000000..364124850c8 --- /dev/null +++ b/sql/updates/world/2015_08_13_03_world.sql @@ -0,0 +1,104 @@ +-- Stratholme - The Gauntlet +-- 1. Ghoul +SET @NPC := 53675; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH, 1, 3711.96, -3428.02, 131.083, 0, 0, 0, 0, 100, 0), +(@PATH, 2, 3715.35, -3439.06, 129.468, 0, 0, 0, 0, 100, 0), +(@PATH, 3, 3719.55, -3452.41, 129.604, 0, 0, 0, 0, 100, 0), +(@PATH, 4, 3723.87, -3470.47, 129.838, 0, 0, 0, 0, 100, 0), +(@PATH, 5, 3711.6, -3485.74, 129.702, 0, 0, 0, 0, 100, 0), +(@PATH, 6, 3696.91, -3487.86, 131.216, 0, 0, 0, 0, 100, 0), +(@PATH, 7, 3675.95, -3489.1, 135.379, 0, 0, 0, 0, 100, 0), +(@PATH, 8, 3650.84, -3490.4, 136.889, 0, 0, 0, 0, 100, 0), +(@PATH, 9, 3664.74, -3488.84, 136.633, 0, 0, 0, 0, 100, 0), +(@PATH, 10, 3692.63, -3486.4, 132.018, 0, 0, 0, 0, 100, 0), +(@PATH, 11, 3713.54, -3482.02, 129.701, 0, 0, 0, 0, 100, 0), +(@PATH, 12, 3719.24, -3466.01, 129.741, 0, 0, 0, 0, 100, 0), +(@PATH, 13, 3717.94, -3444.6, 129.36, 0, 0, 0, 0, 100, 0), +(@PATH, 14, 3716.43, -3439.47, 129.393, 0, 0, 0, 0, 100, 0); +-- 2 . ghoul +SET @NPC := 53601; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH, 1, 3590.12, -3472.24, 135.046, 0, 0, 0, 0, 100, 0), +(@PATH, 2, 3605.83, -3487.43, 135.938, 0, 0, 0, 0, 100, 0), +(@PATH, 3, 3615.36, -3497.68, 137.061, 0, 0, 0, 0, 100, 0), +(@PATH, 4, 3627.56, -3514.74, 136.693, 0, 0, 0, 0, 100, 0), +(@PATH, 5, 3638.86, -3523.51, 136.974, 0, 0, 0, 0, 100, 0), +(@PATH, 6, 3654.2, -3517.46, 136.842, 0, 0, 0, 0, 100, 0), +(@PATH, 7, 3661.21, -3505.25, 136.721, 0, 0, 0, 0, 100, 0), +(@PATH, 8, 3655.99, -3491.83, 136.798, 0, 0, 0, 0, 100, 0), +(@PATH, 9, 3640.93, -3487.52, 137.452, 0, 0, 0, 0, 100, 0), +(@PATH, 10, 3631.02, -3489.32, 137.395, 0, 0, 0, 0, 100, 0), +(@PATH, 11, 3613.42, -3495.94, 136.891, 0, 0, 0, 0, 100, 0), +(@PATH, 12, 3601.41, -3489.18, 135.84, 0, 0, 0, 0, 100, 0); + +-- texts +-- Undead Postman SAI +SET @ENTRY := 11142; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,40,0,0,0,0,0,0,"Undead Postman - On Just Summoned - Start Attacking"), +(@ENTRY,0,1,0,0,0,50,0,0,1000,20000,30000,11,5137,64,0,0,0,0,2,0,0,0,0,0,0,0,"Undead Postman - In Combat - Cast 'Call of the Grave'"), +(@ENTRY,0,2,0,0,0,75,0,3000,4000,8000,9000,11,7713,64,0,0,0,0,2,0,0,0,0,0,0,0,"Undead Postman - In Combat - Cast 'Wailing Dead'"), +(@ENTRY,0,3,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Undead Postman - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `entry`=11142; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(11142, 0, 0, 'No tampering with the mail!', 12, 0, 100, 0, 0, 0, 6470, 'Undead Postman'); + +-- enable flying +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=10408; +-- ghoul +SET @NPC := 53696; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH, 1, 3874.56, -3680.21, 142.696, 0, 0, 0, 0, 100, 0), +(@PATH, 2, 3888.33, -3677.68, 141.623, 0, 0, 0, 0, 100, 0), +(@PATH, 3, 3910.54, -3669.96, 138.655, 0, 0, 0, 0, 100, 0), +(@PATH, 4, 3927.9, -3660.86, 139.4, 0, 0, 0, 0, 100, 0), +(@PATH, 5, 3937.1, -3653.54, 140.085, 0, 0, 0, 0, 100, 0), +(@PATH, 6, 3951.33, -3644.09, 135.489, 0, 0, 0, 0, 100, 0), +(@PATH, 7, 3966.27, -3637.04, 132.434, 0, 0, 0, 0, 100, 0), +(@PATH, 8, 3981.49, -3626.32, 130.01, 0, 0, 0, 0, 100, 0), +(@PATH, 9, 3994.5, -3616.13, 129.41, 0, 0, 0, 0, 100, 0), +(@PATH, 10, 3984.25, -3625.25, 130.021, 0, 0, 0, 0, 100, 0), +(@PATH, 11, 3972.75, -3635.49, 131.203, 0, 0, 0, 0, 100, 0), +(@PATH, 12, 3956.89, -3644.66, 134.041, 0, 0, 0, 0, 100, 0), +(@PATH, 13, 3941.59, -3650.12, 139.218, 0, 0, 0, 0, 100, 0), +(@PATH, 14, 3930.15, -3658.18, 139.569, 0, 0, 0, 0, 100, 0), +(@PATH, 15, 3918.7, -3666.25, 137.71, 0, 0, 0, 0, 100, 0), +(@PATH, 16, 3902.74, -3674.09, 139.385, 0, 0, 0, 0, 100, 0), +(@PATH, 17, 3896.26, -3676.72, 140.59, 0, 0, 0, 0, 100, 0); + +-- Plague Ghoul SAI +SET @ENTRY := 10405; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=4; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,4,0,1,0,100,0,3000,5000,8000,12000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Plague Ghoul - Out of Combat - Play Emote 1"); + +-- Ghoul Ravener SAI +SET @ENTRY := 10406; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,2,0,1,0,100,0,3000,5000,8000,12000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ghoul Ravener - Out of Combat - Play Emote 1"); + +-- Fleshflayer Ghoul SAI +SET @ENTRY := 10407; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,2,0,1,0,100,0,3000,5000,8000,12000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Fleshflayer Ghoul - Out of Combat - Play Emote 1"); From ba6f0d064a9ea712979c03baa9c2861a113d2e92 Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 13 Aug 2015 18:54:10 +0200 Subject: [PATCH 008/110] DB/Quest: Mystery of the Infinite, Redux Close #10871 --- sql/updates/world/2015_08_13_04_world.sql | 113 ++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 sql/updates/world/2015_08_13_04_world.sql diff --git a/sql/updates/world/2015_08_13_04_world.sql b/sql/updates/world/2015_08_13_04_world.sql new file mode 100644 index 00000000000..abf0cb0ab27 --- /dev/null +++ b/sql/updates/world/2015_08_13_04_world.sql @@ -0,0 +1,113 @@ +-- +SET @QUEST := 13343; -- Mystery of the Infinite 2 (13343) +SET @NPC_HoE := 32327; -- Hourglass of Eternity +SET @NPC_PU := 32331; -- Past You +SET @SPELL_SUMMON_PU := 60790; -- Mystery of the Infinite: Force Cast to Player of Summon Past You +SET @SPELL_MIRROR := 49889; -- Mystery of the Infinite: Future You's Mirror Image Aura +SET @SPELL_NEARBY := 50867; -- Hourglass of Eternity Nearby +SET @AURA_VISUAL := 50057; -- Mystery of the Infinite: Hourglass of Eternity Visual/Sound Aura +SET @SPELL_ASSAILANT := 49900; -- Summon Infinite Assailant +SET @SPELL_DESTROYER := 49901; -- Summon Infinite Destroyer +SET @SPELL_MAGUS := 49902; -- Summon Infinite Chrono-Magus +SET @SPELL_TIMERENDER := 60887; -- Summon Infinite Timerender +SET @NPC_IT := 32352; -- Infinite Timerender + +-- Infinite Timerender +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@NPC_IT; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@NPC_IT; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC_IT,0,0,0,0,0,100,0,5000,6000,12000,17000,11,51020,0,0,0,0,0,2,0,0,0,0,0,0,0,'Infinite Timerender - IC - Cast Time Lapse'), +(@NPC_IT,0,1,0,6,0,100,0,0,0,0,0,45,2,1,0,0,0,0,19,@NPC_HoE,20,0,0,0,0,0,'Infinite Timerender - On Death - Set Data on HoE'); + +UPDATE `spell_area` SET `quest_start_status`=66, `quest_end_status`=0 WHERE `spell`=50012 AND `area`=4175; + +-- Hourglass of Eternity +UPDATE `creature_template` SET `AIName`='SmartAI',`RegenHealth`=0 WHERE `entry`=@NPC_HoE; +DELETE FROM `smart_scripts` WHERE (`entryorguid`=@NPC_HoE AND `source_type`=0) OR (`entryorguid`IN (@NPC_HoE*100,@NPC_HoE*100+1) AND `source_type`=9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC_HoE,0,0,1,54,0,100,1,0,0,0,0,85,@SPELL_SUMMON_PU,0,0,0,0,0,7,0,0,0,0,0,0,0,'Hourglass of Eternity - On spawn - Invoker Cast'), +(@NPC_HoE,0,1,2,61,0,100,0,0,0,0,0,11,@SPELL_NEARBY,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On link - Cast Spell'), +(@NPC_HoE,0,2,3,61,0,100,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - Set passive - Self'), +(@NPC_HoE,0,3,6,61,0,100,0,0,0,0,0,80,@NPC_HoE*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On link - Start timed script'), +(@NPC_HoE,0,4,0,6,0,100,0,0,0,0,0,6,@QUEST,0,0,0,0,0,16,0,0,0,0,0,0,0,'Hourglass of Eternity - On Death - Fail Quest'), +(@NPC_HoE,0,5,0,38,0,100,0,2,1,0,0,80,@NPC_HoE*100+1,2,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On Data Set - Start timed script two'), +(@NPC_HoE,0,6,0,61,0,100,0,0,0,0,0,11,@AURA_VISUAL,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On link - Cast Spell'), +(@NPC_HoE,0,7,0,54,0,100,0,0,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'Hourglass of Eternity - On spawn - Store target'), + +-- Wave 1 +(@NPC_HoE*100,9,0,0,0,0,100,1,3000,3000,0,0,45,1,1,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,1,0,0,0,100,1,5000,5000,0,0,45,1,2,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,2,0,0,0,100,1,5000,5000,0,0,11,@SPELL_MAGUS,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +(@NPC_HoE*100,9,3,0,0,0,100,1,0,0,0,0,11,@SPELL_ASSAILANT,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +-- Wave 2 +(@NPC_HoE*100,9,4,0,0,0,100,1,5000,5000,0,0,45,1,3,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,5,0,0,0,100,1,6000,6000,0,0,45,1,4,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,6,0,0,0,100,1,19000,19000,0,0,11,@SPELL_MAGUS,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +(@NPC_HoE*100,9,7,0,0,0,100,1,0,0,0,0,11,@SPELL_MAGUS,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +-- Wave 3 +(@NPC_HoE*100,9,8,0,0,0,100,1,5000,5000,0,0,45,1,5,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,9,0,0,0,100,1,6000,6000,0,0,45,1,6,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,10,0,0,0,100,1,5000,5000,0,0,45,1,7,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,11,0,0,0,100,1,14000,14000,0,0,11,@SPELL_MAGUS,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +(@NPC_HoE*100,9,12,0,0,0,100,1,0,0,0,0,11,@SPELL_ASSAILANT,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +(@NPC_HoE*100,9,13,0,0,0,100,1,0,0,0,0,11,@SPELL_DESTROYER,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +-- Wave 4 +(@NPC_HoE*100,9,14,0,0,0,100,1,5000,5000,0,0,45,1,8,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,15,0,0,0,100,1,9000,9000,0,0,45,1,9,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,16,0,0,0,100,1,7000,7000,0,0,45,1,10,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,17,0,0,0,100,1,9000,9000,0,0,11,@SPELL_MAGUS,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100,9,18,0,0,0,100,1,0,0,0,0,11,@SPELL_ASSAILANT,0,0,0,0,0,1,0,0,0,0,0,0,0,'OHourglass of Eternity - On update - Cast Spell on self'), +(@NPC_HoE*100,9,19,0,0,0,100,1,0,0,0,0,11,@SPELL_DESTROYER,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +-- Wave 5 final +(@NPC_HoE*100,9,20,0,0,0,100,1,23000,23000,0,0,11,@SPELL_TIMERENDER,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update - Cast Spell on self'), +-- End Text Script +(@NPC_HoE*100+1,9,0,0,0,0,100,1,4000,4000,0,0,45,2,1,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100+1,9,1,0,0,0,100,1,0,0,0,0,15,@QUEST,0,0,0,0,0,12,1,0,0,0,0,0,0,'Hourglass of Eternity - On update - Give Quest Credit'), +(@NPC_HoE*100+1,9,2,0,0,0,100,1,8000,8000,0,0,45,2,2,0,0,0,0,19,@NPC_PU,20,0,0,0,0,0,'Hourglass of Eternity - On update - Set Data on Past You'), +(@NPC_HoE*100+1,9,3,0,0,0,100,1,4000,4000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hourglass of Eternity - On update -Despawn after timer'); + +-- Past You +DELETE FROM `smart_scripts` WHERE `entryorguid`=@NPC_PU AND `source_type`=0; +UPDATE `creature_template` SET `faction`=2141,`AIName`='SmartAI',`unit_flags`=0,`RegenHealth`=0, `minlevel`=75, `maxlevel`=75 WHERE `entry`=@NPC_PU; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC_PU,0,0,1,54,0,100,1,0,0,0,0,85,@SPELL_MIRROR,2,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On spawn - Invoker Cast Spell - Self'), +(@NPC_PU,0,1,0,61,0,100,0,0,0,0,0,66,0,0,0,0,0,0,11,@NPC_HoE,10,0,0,0,0,0,'Past You - On link - Set Orientation'), +(@NPC_PU,0,2,0,38,0,100,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 1'), +(@NPC_PU,0,3,0,38,0,100,0,1,2,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 2'), +(@NPC_PU,0,4,0,38,0,100,0,1,3,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 3'), +(@NPC_PU,0,5,0,38,0,100,0,1,4,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 4'), +(@NPC_PU,0,6,0,38,0,100,0,1,5,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 5'), +(@NPC_PU,0,7,0,38,0,100,0,1,6,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 6'), +(@NPC_PU,0,8,0,38,0,100,0,1,7,0,0,1,7,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 7'), +(@NPC_PU,0,9,0,38,0,100,0,1,8,0,0,1,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 8'), +(@NPC_PU,0,10,0,38,0,100,0,1,9,0,0,1,9,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 9'), +(@NPC_PU,0,11,0,38,0,100,0,1,10,0,0,1,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 10'), +(@NPC_PU,0,12,0,38,0,100,0,2,1,0,0,1,11,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Data set - Whisper 11'), +(@NPC_PU,0,13,14,38,0,100,0,2,2,0,0,1,12,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Future You - On Data Set - Whisper 12'), +(@NPC_PU,0,14,0,61,0,100,0,0,0,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Link - Despawn after timer'), +(@NPC_PU,0,15,16,7,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Past You - On Evade - Despawn after timer'), +(@NPC_PU,0,16,0,61,0,100,0,0,0,0,0,85,@SPELL_SUMMON_PU,0,0,0,0,0,7,0,0,0,0,0,0,0,'Past You - On Link - Cast Summon Clone'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=@SPELL_MIRROR AND `ConditionValue2`=@NPC_PU; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,7,@SPELL_MIRROR,0,1,31,0,3,@NPC_PU,0,0,0,'','Spell target Past You'); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (@NPC_PU); +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES +(@NPC_PU,0,0x0,0x1,''); + +-- Past You's text +DELETE FROM `creature_text` WHERE `entry`=@NPC_PU; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextId`) VALUES +(@NPC_PU,1,0,'Whoa! You''re me, but from the future! Hey, my equipment got an upgrade! Cool!',15,0,100,396,0,0,'Past You', 32764), +(@NPC_PU,2,0,'Here come the Infinites! I''ve got to keep the hourglass safe. Can you help?',15,0,100,396,0,0,'Past You', 32769), +(@NPC_PU,3,0,'This equipment looks cool and all, but couldn''t we have done a little better? Are you even raiding?',15,0,100,396,0,0,'Past You', 32770), +(@NPC_PU,4,0,'So, how does it all turn out in Icecrown?',15,0,100,396,0,0,'Past You', 32771), +(@NPC_PU,5,0,'It might help if you could tell me how many of these guys we''re going to fight. You can remember that, right, grandpa?',15,0,100,396,0,0,'Past You', 32775), +(@NPC_PU,6,0,'Chromie said that if I don''t do this just right, I might wink out of existence. If I go, then you go!',15,0,100,396,0,0,'Past You', 32772), +(@NPC_PU,7,0,'I just want you to know that if we get through this alive, I''m making sure that we turn out better than you. No offense.',15,0,100,396,0,0,'Past You', 32776), +(@NPC_PU,8,0,'Looks like I''m an underachiever.',15,0,100,396,0,0,'Past You', 32773), +(@NPC_PU,9,0,'Wait a minute! If you''re here, then that means that in the not-so-distant future I''m going to be you helping me? Are we stuck in a time loop?!',15,0,100,396,0,0,'Past You', 32777), +(@NPC_PU,10,0,'I think I''m going to turn to drinking after this.',15,0,100,396,0,0,'Past You', 32774), +(@NPC_PU,11,0,'What the heck? Nozdormu is up there!',15,0,100,396,0,0,'Past You', 32781), +(@NPC_PU,12,0,'I feel like I''m being pulled away through time. Thanks for the help....',15,0,100,396,0,0,'Past You', 32782); From ca940548bfbeff585983aa537da036f75d3f0f7b Mon Sep 17 00:00:00 2001 From: jackpoz Date: Fri, 14 Aug 2015 18:18:30 +0200 Subject: [PATCH 009/110] Buildsystem: Fix Boost not found targeting VS2015 with pre-built binaries Fix Boost libraries not being found by CMake when targeting Visual Studio 2015 with Boost installed using the binaries. Fixes #15277 --- cmake/macros/ConfigureBoost.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/macros/ConfigureBoost.cmake b/cmake/macros/ConfigureBoost.cmake index 190151af155..98caa5eb227 100644 --- a/cmake/macros/ConfigureBoost.cmake +++ b/cmake/macros/ConfigureBoost.cmake @@ -12,7 +12,11 @@ if(WIN32) set(BOOST_DEBUG ON) if(DEFINED ENV{BOOST_ROOT}) set(BOOST_ROOT $ENV{BOOST_ROOT}) - set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib${PLATFORM}-msvc-12.0) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0) + set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib${PLATFORM}-msvc-12.0) + else() + set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib${PLATFORM}-msvc-14.0) + endif() else() message(FATAL_ERROR "No BOOST_ROOT environment variable could be found! Please make sure it is set and the points to your Boost installation.") endif() From fa6a83b27089cfc5ef7dd8efff4a565cf78caad4 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Sat, 15 Aug 2015 17:48:00 +0100 Subject: [PATCH 010/110] Build: Add 1.59 Boost version to FindBoost --- cmake/macros/FindBoost.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/macros/FindBoost.cmake b/cmake/macros/FindBoost.cmake index 8364156c906..24ed90dd36b 100644 --- a/cmake/macros/FindBoost.cmake +++ b/cmake/macros/FindBoost.cmake @@ -478,8 +478,8 @@ else() # The user has not requested an exact version. Among known # versions, find those that are acceptable to the user request. set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} - "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55" "1.54.0" "1.54" - "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51" + "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55" + "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51" "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1" "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42" "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37" From e1b534e40f4e7a5fc94298c09d4d72bf77adb350 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Sat, 15 Aug 2015 18:09:12 +0100 Subject: [PATCH 011/110] Core/Object: Add changes to ObjectGuid from 6.x copy and move cctor assignment and assig move operators Ref 81abfe93bb96e5a769dc855f06fdc7578b352b39 and 89a8a7e1a4bdc22d2da17b1a3bf34fd52bf87e85 --- src/server/game/Entities/Object/ObjectGuid.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 45881ddab6d..b541328c467 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -89,6 +89,11 @@ class ObjectGuid explicit ObjectGuid(uint64 guid) : _guid(guid) { } ObjectGuid(HighGuid hi, uint32 entry, LowType counter) : _guid(counter ? uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48) : 0) { } ObjectGuid(HighGuid hi, LowType counter) : _guid(counter ? uint64(counter) | (uint64(hi) << 48) : 0) { } + ObjectGuid(ObjectGuid const& r) : _guid(r._guid) { } + ObjectGuid(ObjectGuid&& r) : _guid(r._guid) { } + + ObjectGuid& operator=(ObjectGuid const& r) { _guid = r._guid; return *this; } + ObjectGuid& operator=(ObjectGuid&& r) { _guid = r._guid; return *this; } operator uint64() const { return _guid; } PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); } From 79cd2f9bb9e4cc214150ec36a85817bafad814d6 Mon Sep 17 00:00:00 2001 From: Laintime Date: Sat, 15 Aug 2015 19:50:30 +0200 Subject: [PATCH 012/110] Core/Achievement: Fix Save The Day Closes #15202 Closes #15211 --- src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 5c4b1025e8e..f94639efaf4 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -882,7 +882,10 @@ bool BattlegroundWS::CheckAchievementCriteriaMeet(uint32 criteriaId, Player cons switch (criteriaId) { case BG_CRITERIA_CHECK_SAVE_THE_DAY: - return GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE; + if (target) + if (Player const* playerTarget = target->ToPlayer()) + return GetFlagState(playerTarget->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE; + return false; } return Battleground::CheckAchievementCriteriaMeet(criteriaId, player, target, miscValue); From cdbd563157f18423111ddb95ff4132f315d274dc Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 16 Aug 2015 00:12:18 +0200 Subject: [PATCH 013/110] Core/Logging: Refactored appender creation to allow using logging without mysql dependency in tools (future task) Conflicts: src/server/bnetserver/Main.cpp src/server/worldserver/Main.cpp --- src/server/authserver/Main.cpp | 4 + src/server/shared/Logging/Appender.cpp | 9 +- src/server/shared/Logging/Appender.h | 22 ++++- src/server/shared/Logging/AppenderConsole.cpp | 7 +- src/server/shared/Logging/AppenderConsole.h | 7 +- src/server/shared/Logging/AppenderDB.cpp | 4 +- src/server/shared/Logging/AppenderDB.h | 7 +- src/server/shared/Logging/AppenderFile.cpp | 33 +++++-- src/server/shared/Logging/AppenderFile.h | 7 +- src/server/shared/Logging/Log.cpp | 88 ++++++------------- src/server/shared/Logging/Log.h | 23 +++-- src/server/worldserver/Main.cpp | 9 +- 12 files changed, 123 insertions(+), 97 deletions(-) diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 9a3bd6a58dd..06d20658eb0 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -30,6 +30,7 @@ #include "DatabaseEnv.h" #include "DatabaseLoader.h" #include "Log.h" +#include "AppenderDB.h" #include "ProcessPriority.h" #include "RealmList.h" #include "SystemConfig.h" @@ -99,6 +100,9 @@ int main(int argc, char** argv) return 1; } + sLog->RegisterAppender(); + sLog->Initialize(nullptr); + TC_LOG_INFO("server.authserver", "%s (authserver)", _FULLVERSION); TC_LOG_INFO("server.authserver", " to stop.\n"); TC_LOG_INFO("server.authserver", "Using configuration file %s.", configFile.c_str()); diff --git a/src/server/shared/Logging/Appender.cpp b/src/server/shared/Logging/Appender.cpp index 31db3ae1b86..d19ef8cf96f 100644 --- a/src/server/shared/Logging/Appender.cpp +++ b/src/server/shared/Logging/Appender.cpp @@ -37,8 +37,8 @@ std::string LogMessage::getTimeStr() return getTimeStr(mtime); } -Appender::Appender(uint8 _id, std::string const& _name, AppenderType _type /* = APPENDER_NONE*/, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */): -id(_id), name(_name), type(_type), level(_level), flags(_flags) { } +Appender::Appender(uint8 _id, std::string const& _name, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */): +id(_id), name(_name), level(_level), flags(_flags) { } Appender::~Appender() { } @@ -52,11 +52,6 @@ std::string const& Appender::getName() const return name; } -AppenderType Appender::getType() const -{ - return type; -} - LogLevel Appender::getLogLevel() const { return level; diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index 73af351e41d..09ee6070050 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -22,6 +22,7 @@ #include #include #include +#include #include "Define.h" // Values assigned have their equivalent in enum ACE_Log_Priority @@ -85,18 +86,19 @@ struct LogMessage class Appender { public: - Appender(uint8 _id, std::string const& name, AppenderType type = APPENDER_NONE, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE); + Appender(uint8 _id, std::string const& name, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE); virtual ~Appender(); uint8 getId() const; std::string const& getName() const; - AppenderType getType() const; + virtual AppenderType getType() const = 0; LogLevel getLogLevel() const; AppenderFlags getFlags() const; void setLogLevel(LogLevel); void write(LogMessage* message); static const char* getLogLevelString(LogLevel level); + virtual void setRealmId(uint32 /*realmId*/) { } private: virtual void _write(LogMessage const* /*message*/) = 0; @@ -110,4 +112,20 @@ class Appender typedef std::unordered_map AppenderMap; +typedef std::vector ExtraAppenderArgs; +typedef Appender*(*AppenderCreatorFn)(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); +typedef std::unordered_map AppenderCreatorMap; + +template +Appender* CreateAppender(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs) +{ + return new AppenderImpl(id, name, level, flags, std::forward(extraArgs)); +} + +class InvalidAppenderArgsException : public std::length_error +{ +public: + using std::length_error::length_error; +}; + #endif diff --git a/src/server/shared/Logging/AppenderConsole.cpp b/src/server/shared/Logging/AppenderConsole.cpp index 2efa4db4d2e..531df266aa1 100644 --- a/src/server/shared/Logging/AppenderConsole.cpp +++ b/src/server/shared/Logging/AppenderConsole.cpp @@ -25,11 +25,14 @@ #include #endif -AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags): -Appender(id, name, APPENDER_CONSOLE, level, flags), _colored(false) +AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs) + : Appender(id, name, level, flags), _colored(false) { for (uint8 i = 0; i < MaxLogLevels; ++i) _colors[i] = ColorTypes(MaxColors); + + if (!extraArgs.empty()) + InitColors(extraArgs[0]); } void AppenderConsole::InitColors(std::string const& str) diff --git a/src/server/shared/Logging/AppenderConsole.h b/src/server/shared/Logging/AppenderConsole.h index 0acf7636e35..6b30505c6bd 100644 --- a/src/server/shared/Logging/AppenderConsole.h +++ b/src/server/shared/Logging/AppenderConsole.h @@ -42,11 +42,14 @@ enum ColorTypes const uint8 MaxColors = uint8(WHITE) + 1; -class AppenderConsole: public Appender +class AppenderConsole : public Appender { public: - AppenderConsole(uint8 _id, std::string const& name, LogLevel level, AppenderFlags flags); + typedef std::integral_constant::type TypeIndex; + + AppenderConsole(uint8 _id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); void InitColors(const std::string& init_str); + AppenderType getType() const override { return TypeIndex::value; } private: void SetColor(bool stdout_stream, ColorTypes color); diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/shared/Logging/AppenderDB.cpp index 8a329ea3a0f..9e6ab1a057c 100644 --- a/src/server/shared/Logging/AppenderDB.cpp +++ b/src/server/shared/Logging/AppenderDB.cpp @@ -18,8 +18,8 @@ #include "AppenderDB.h" #include "Database/DatabaseEnv.h" -AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level) - : Appender(id, name, APPENDER_DB, level), realmId(0), enabled(false) { } +AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags /*flags*/, ExtraAppenderArgs /*extraArgs*/) + : Appender(id, name, level), realmId(0), enabled(false) { } AppenderDB::~AppenderDB() { } diff --git a/src/server/shared/Logging/AppenderDB.h b/src/server/shared/Logging/AppenderDB.h index 09affdb46f1..50607fd8136 100644 --- a/src/server/shared/Logging/AppenderDB.h +++ b/src/server/shared/Logging/AppenderDB.h @@ -23,10 +23,13 @@ class AppenderDB: public Appender { public: - AppenderDB(uint8 _id, std::string const& _name, LogLevel level); + typedef std::integral_constant::type TypeIndex; + + AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); ~AppenderDB(); - void setRealmId(uint32 realmId); + void setRealmId(uint32 realmId) override; + AppenderType getType() const override { return TypeIndex::value; } private: uint32 realmId; diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp index c9cc1935c7a..d33818626fe 100644 --- a/src/server/shared/Logging/AppenderFile.cpp +++ b/src/server/shared/Logging/AppenderFile.cpp @@ -17,24 +17,45 @@ #include "AppenderFile.h" #include "Common.h" +#include "StringFormat.h" +#include "Log.h" #if PLATFORM == PLATFORM_WINDOWS # include #endif -AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags, uint64 fileSize): - Appender(id, name, APPENDER_FILE, level, flags), +AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs) : + Appender(id, name, level, flags), logfile(NULL), - _fileName(filename), - _logDir(logDir), - _maxFileSize(fileSize), + _logDir(sLog->GetLogsDir()), _fileSize(0) { + if (extraArgs.empty()) + throw InvalidAppenderArgsException(Trinity::StringFormat("Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name.c_str())); + + _fileName = extraArgs[0]; + + char const* mode = "a"; + if (extraArgs.size() > 1) + mode = extraArgs[1]; + + if (flags & APPENDER_FLAGS_USE_TIMESTAMP) + { + size_t dot_pos = _fileName.find_last_of("."); + if (dot_pos != std::string::npos) + _fileName.insert(dot_pos, sLog->GetLogsTimestamp()); + else + _fileName += sLog->GetLogsTimestamp(); + } + + if (extraArgs.size() > 2) + _maxFileSize = atoi(extraArgs[2]); + _dynamicName = std::string::npos != _fileName.find("%s"); _backup = (flags & APPENDER_FLAGS_MAKE_FILE_BACKUP) != 0; if (!_dynamicName) - logfile = OpenFile(filename, mode, !strcmp(mode, "w") && _backup); + logfile = OpenFile(_fileName, mode, !strcmp(mode, "w") && _backup); } AppenderFile::~AppenderFile() diff --git a/src/server/shared/Logging/AppenderFile.h b/src/server/shared/Logging/AppenderFile.h index 4082b34a2b4..c2781eb1ee9 100644 --- a/src/server/shared/Logging/AppenderFile.h +++ b/src/server/shared/Logging/AppenderFile.h @@ -21,12 +21,15 @@ #include #include "Appender.h" -class AppenderFile: public Appender +class AppenderFile : public Appender { public: - AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags, uint64 maxSize); + typedef std::integral_constant::type TypeIndex; + + AppenderFile(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); ~AppenderFile(); FILE* OpenFile(std::string const& name, std::string const& mode, bool backup); + AppenderType getType() const override { return TypeIndex::value; } private: void CloseFile(); diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index 6c2580b3168..88ce78f0d86 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -31,7 +31,8 @@ Log::Log() : _ioService(nullptr), _strand(nullptr) { m_logsTimestamp = "_" + GetTimestampStr(); - LoadFromConfig(); + RegisterAppender(); + RegisterAppender(); } Log::~Log() @@ -101,60 +102,21 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName) if (size > 2) flags = AppenderFlags(atoi(*iter++)); - switch (type) + auto factoryFunction = appenderFactory.find(type); + if (factoryFunction == appenderFactory.end()) { - case APPENDER_CONSOLE: - { - AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags); - appenders[appender->getId()] = appender; - if (size > 3) - appender->InitColors(*iter++); - //fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type CONSOLE, Mask %u\n", appender->getName().c_str(), appender->getId(), appender->getLogLevel()); - break; - } - case APPENDER_FILE: - { - std::string filename; - std::string mode = "a"; + fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); + return; + } - if (size < 4) - { - fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name.c_str()); - return; - } - - filename = *iter++; - - if (size > 4) - mode = *iter++; - - if (flags & APPENDER_FLAGS_USE_TIMESTAMP) - { - size_t dot_pos = filename.find_last_of("."); - if (dot_pos != filename.npos) - filename.insert(dot_pos, m_logsTimestamp); - else - filename += m_logsTimestamp; - } - - uint64 maxFileSize = 0; - if (size > 5) - maxFileSize = atoi(*iter++); - - uint8 id = NextAppenderId(); - appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags, maxFileSize); - //fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type FILE, Mask %u, File %s, Mode %s\n", name.c_str(), id, level, filename.c_str(), mode.c_str()); - break; - } - case APPENDER_DB: - { - uint8 id = NextAppenderId(); - appenders[id] = new AppenderDB(id, name, level); - break; - } - default: - fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); - break; + try + { + Appender* appender = factoryFunction->second(NextAppenderId(), name, level, flags, ExtraAppenderArgs(iter, tokens.end())); + appenders[appender->getId()] = appender; + } + catch (InvalidAppenderArgsException const& iaae) + { + fprintf(stderr, iaae.what()); } } @@ -250,7 +212,7 @@ void Log::ReadLoggersFromConfig() Close(); // Clean any Logger or Appender created - AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE); + AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE, ExtraAppenderArgs()); appenders[appender->getId()] = appender; Logger& logger = loggers[LOGGER_ROOT]; @@ -347,21 +309,29 @@ void Log::outCharDump(char const* str, uint32 accountId, uint64 guid, char const void Log::SetRealmId(uint32 id) { for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) - if (it->second && it->second->getType() == APPENDER_DB) - static_cast(it->second)->setRealmId(id); + it->second->setRealmId(id); } void Log::Close() { loggers.clear(); for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) - { delete it->second; - it->second = NULL; - } + appenders.clear(); } +void Log::Initialize(boost::asio::io_service* ioService) +{ + if (ioService) + { + _ioService = ioService; + _strand = new boost::asio::strand(*ioService); + } + + LoadFromConfig(); +} + void Log::LoadFromConfig() { Close(); diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index ab7b2169ed2..a15bb4ad485 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -44,19 +44,13 @@ class Log public: - static Log* instance(boost::asio::io_service* ioService = nullptr) + static Log* instance() { static Log instance; - - if (ioService != nullptr) - { - instance._ioService = ioService; - instance._strand = new boost::asio::strand(*ioService); - } - return &instance; } + void Initialize(boost::asio::io_service* ioService); void LoadFromConfig(); void Close(); bool ShouldLog(std::string const& type, LogLevel level) const; @@ -88,6 +82,18 @@ class Log void SetRealmId(uint32 id); + template + void RegisterAppender() + { + using Index = typename AppenderImpl::TypeIndex; + auto itr = appenderFactory.find(Index::value); + ASSERT(itr == appenderFactory.end()); + appenderFactory[Index::value] = &CreateAppender; + } + + std::string const& GetLogsDir() const { return m_logsDir; } + std::string const& GetLogsTimestamp() const { return m_logsTimestamp; } + private: static std::string GetTimestampStr(); void write(std::unique_ptr&& msg) const; @@ -100,6 +106,7 @@ class Log void ReadAppendersFromConfig(); void ReadLoggersFromConfig(); + AppenderCreatorMap appenderFactory; AppenderMap appenders; LoggerMap loggers; uint8 AppenderId; diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index b3d97d7884c..50ed59a22a1 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -48,6 +48,7 @@ #include "WorldSocket.h" #include "WorldSocketMgr.h" #include "DatabaseLoader.h" +#include "AppenderDB.h" using namespace boost::program_options; @@ -120,11 +121,9 @@ extern int main(int argc, char** argv) return 1; } - if (sConfigMgr->GetBoolDefault("Log.Async.Enable", false)) - { - // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton - Log::instance(&_ioService); - } + sLog->RegisterAppender(); + // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton + sLog->Initialize(sConfigMgr->GetBoolDefault("Log.Async.Enable", false) ? &_ioService : nullptr); TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", _FULLVERSION); TC_LOG_INFO("server.worldserver", " to stop.\n"); From 233615c785a5b9b56f7b004e5ac082a28fecc35b Mon Sep 17 00:00:00 2001 From: DDuarte Date: Sun, 16 Aug 2015 00:45:07 +0100 Subject: [PATCH 014/110] Fix build warnings addded in d5cf594bfe91ff22175c6e344b23b95cdbcc8a3c --- src/server/shared/Logging/Appender.h | 3 +++ src/server/shared/Logging/Log.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index 09ee6070050..f5d3b254ef9 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "Define.h" @@ -126,6 +127,8 @@ class InvalidAppenderArgsException : public std::length_error { public: using std::length_error::length_error; + + explicit InvalidAppenderArgsException(std::string const& message) : length_error(message) { } }; #endif diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index 88ce78f0d86..5075815ad54 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -116,7 +116,7 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName) } catch (InvalidAppenderArgsException const& iaae) { - fprintf(stderr, iaae.what()); + fprintf(stderr, "%s", iaae.what()); } } From 90c9290761ecb7849a036d82c2b93f64920164c6 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Sun, 16 Aug 2015 01:09:29 +0100 Subject: [PATCH 015/110] Add a missing include of d5cf594bfe91ff22175c6e344b23b95cdbcc8a3c --- src/server/shared/Logging/Appender.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index f5d3b254ef9..17bc8d4e039 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -19,6 +19,7 @@ #define APPENDER_H #include +#include #include #include #include From 94f69fb1bcef103392ca27074ebb31ef2ebd27fb Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sun, 16 Aug 2015 16:56:11 +0200 Subject: [PATCH 016/110] Core/Build: Removed obsolete SystemConfig.h and made genrev be part of shared library, which allows cache hits to happen more likely --- cmake/genrev.cmake | 8 +-- ...ion.h.in.cmake => revision_data.h.in.cmake | 6 +- src/genrev/CMakeLists.txt | 2 +- src/server/authserver/CMakeLists.txt | 2 - src/server/authserver/Main.cpp | 6 +- src/server/authserver/authserver.rc | 2 +- src/server/game/CMakeLists.txt | 2 - src/server/game/Entities/Player/Player.cpp | 6 +- src/server/game/Handlers/CharacterHandler.cpp | 4 +- src/server/game/World/World.cpp | 4 +- src/server/scripts/CMakeLists.txt | 2 - src/server/scripts/Commands/cs_server.cpp | 4 +- src/server/shared/CMakeLists.txt | 2 + .../Debugging/WheatyExceptionReport.cpp | 9 ++- .../shared/PrecompiledHeaders/sharedPCH.h | 1 + src/server/shared/Revision.cpp | 71 +++++++++++++++++++ .../shared/{SystemConfig.h => Revision.h} | 41 +++++------ src/server/shared/Updater/DBUpdater.cpp | 8 +-- src/server/worldserver/CMakeLists.txt | 2 - src/server/worldserver/Main.cpp | 10 +-- src/server/worldserver/worldserver.rc | 2 +- 21 files changed, 127 insertions(+), 67 deletions(-) rename revision.h.in.cmake => revision_data.h.in.cmake (88%) create mode 100644 src/server/shared/Revision.cpp rename src/server/shared/{SystemConfig.h => Revision.h} (50%) diff --git a/cmake/genrev.cmake b/cmake/genrev.cmake index 1f5f02ceeec..db722f9fdb8 100644 --- a/cmake/genrev.cmake +++ b/cmake/genrev.cmake @@ -66,11 +66,11 @@ else() endif() endif() -# Create the actual revision.h file from the above params -if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}" OR NOT "${rev_branch_cached}" MATCHES "${rev_branch}" OR NOT EXISTS "${BUILDDIR}/revision.h") +# Create the actual revision_data.h file from the above params +if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}" OR NOT "${rev_branch_cached}" MATCHES "${rev_branch}" OR NOT EXISTS "${BUILDDIR}/revision_data.h") configure_file( - "${CMAKE_SOURCE_DIR}/revision.h.in.cmake" - "${BUILDDIR}/revision.h" + "${CMAKE_SOURCE_DIR}/revision_data.h.in.cmake" + "${BUILDDIR}/revision_data.h" @ONLY ) set(rev_hash_cached "${rev_hash}" CACHE INTERNAL "Cached commit-hash") diff --git a/revision.h.in.cmake b/revision_data.h.in.cmake similarity index 88% rename from revision.h.in.cmake rename to revision_data.h.in.cmake index 214b18762ca..d3ddf99bc37 100644 --- a/revision.h.in.cmake +++ b/revision_data.h.in.cmake @@ -1,5 +1,5 @@ -#ifndef __REVISION_H__ -#define __REVISION_H__ +#ifndef __REVISION_DATA_H__ +#define __REVISION_DATA_H__ #define _HASH "@rev_hash@" #define _DATE "@rev_date@" #define _BRANCH "@rev_branch@" @@ -12,4 +12,4 @@ #define VER_FILEVERSION_STR "@rev_hash@ @rev_date@ (@rev_branch@ branch)" #define VER_PRODUCTVERSION VER_FILEVERSION #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR -#endif // __REVISION_H__ +#endif // __REVISION_DATA_H__ diff --git a/src/genrev/CMakeLists.txt b/src/genrev/CMakeLists.txt index e72643c6a6b..05db165fe00 100644 --- a/src/genrev/CMakeLists.txt +++ b/src/genrev/CMakeLists.txt @@ -9,7 +9,7 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # Need to pass old ${CMAKE_BINARY_DIR} as param because its different at build stage -add_custom_target(revision.h ALL +add_custom_target(revision_data.h ALL COMMAND "${CMAKE_COMMAND}" -DBUILDDIR="${CMAKE_BINARY_DIR}" -P "${CMAKE_SOURCE_DIR}/cmake/genrev.cmake" "${CMAKE_BINARY_DIR}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index 7c76df5d06c..f6d99de5271 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -73,8 +73,6 @@ add_executable(authserver ${authserver_PCH_SRC} ) -add_dependencies(authserver revision.h) - if( NOT WIN32 ) set_target_properties(authserver PROPERTIES COMPILE_DEFINITIONS _TRINITY_REALM_CONFIG="${CONF_DIR}/authserver.conf" diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 06d20658eb0..7342a638958 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -33,7 +33,7 @@ #include "AppenderDB.h" #include "ProcessPriority.h" #include "RealmList.h" -#include "SystemConfig.h" +#include "Revision.h" #include "Util.h" #include #include @@ -103,7 +103,7 @@ int main(int argc, char** argv) sLog->RegisterAppender(); sLog->Initialize(nullptr); - TC_LOG_INFO("server.authserver", "%s (authserver)", _FULLVERSION); + TC_LOG_INFO("server.authserver", "%s (authserver)", Revision::GetFullVersion().c_str()); TC_LOG_INFO("server.authserver", " to stop.\n"); TC_LOG_INFO("server.authserver", "Using configuration file %s.", configFile.c_str()); TC_LOG_INFO("server.authserver", "Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); @@ -293,7 +293,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile if (variablesMap.count("help")) std::cout << all << "\n"; else if (variablesMap.count("version")) - std::cout << _FULLVERSION << "\n"; + std::cout << Revision::GetFullVersion() << "\n"; return variablesMap; } diff --git a/src/server/authserver/authserver.rc b/src/server/authserver/authserver.rc index e0d972d9351..ca8fc9f031f 100644 --- a/src/server/authserver/authserver.rc +++ b/src/server/authserver/authserver.rc @@ -17,7 +17,7 @@ */ #include "resource.h" -#include "revision.h" +#include "revision_data.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 91380b085ea..66425ed2dc7 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -215,8 +215,6 @@ add_library(game STATIC ${game_STAT_PCH_SRC} ) -add_dependencies(game revision.h) - # Generate precompiled header if (USE_COREPCH) add_cxx_pch(game ${game_STAT_PCH_HDR} ${game_STAT_PCH_SRC}) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 14dc5b5c0d6..caaadb9422b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -60,7 +60,7 @@ #include "Pet.h" #include "QuestDef.h" #include "ReputationMgr.h" -#include "revision.h" +#include "Revision.h" #include "SkillDiscovery.h" #include "SocialMgr.h" #include "Spell.h" @@ -15123,8 +15123,8 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK); stmt->setUInt32(0, quest_id); stmt->setUInt32(1, GetGUIDLow()); - stmt->setString(2, _HASH); - stmt->setString(3, _DATE); + stmt->setString(2, Revision::GetHash()); + stmt->setString(3, Revision::GetDate()); // add to Quest Tracker CharacterDatabase.Execute(stmt); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 0701271b5e4..940e32d22b2 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -36,10 +36,10 @@ #include "PlayerDump.h" #include "Player.h" #include "ReputationMgr.h" +#include "Revision.h" #include "ScriptMgr.h" #include "SharedDefines.h" #include "SocialMgr.h" -#include "SystemConfig.h" #include "UpdateMask.h" #include "Util.h" #include "World.h" @@ -827,7 +827,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) // send server info if (sWorld->getIntConfig(CONFIG_ENABLE_SINFO_LOGIN) == 1) - chH.PSendSysMessage(_FULLVERSION); + chH.PSendSysMessage(Revision::GetFullVersion().c_str()); TC_LOG_DEBUG("network", "WORLD: Sent server info"); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 9c4cb1002c7..057f97e0e2b 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -51,11 +51,11 @@ #include "OutdoorPvPMgr.h" #include "Player.h" #include "PoolMgr.h" +#include "Revision.h" #include "ScriptMgr.h" #include "SkillDiscovery.h" #include "SkillExtraItems.h" #include "SmartAI.h" -#include "SystemConfig.h" #include "TicketMgr.h" #include "TransportMgr.h" #include "Unit.h" @@ -1789,7 +1789,7 @@ void World::SetInitialWorldSettings() m_startTime = m_gameTime; LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES(%u, %u, 0, '%s')", - realmID, uint32(m_startTime), _FULLVERSION); // One-time query + realmID, uint32(m_startTime), Revision::GetFullVersion().c_str()); // One-time query m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 20b970b6ac1..57f145eb15a 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -153,8 +153,6 @@ add_library(scripts STATIC ${scripts_STAT_PCH_SRC} ) -add_dependencies(scripts revision.h) - # Generate precompiled header if (USE_SCRIPTPCH) add_cxx_pch(scripts ${scripts_STAT_PCH_HDR} ${scripts_STAT_PCH_SRC}) diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 0fecdea5ced..16c5371ffb8 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -28,7 +28,7 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptMgr.h" -#include "SystemConfig.h" +#include "Revision.h" class server_commandscript : public CommandScript { @@ -115,7 +115,7 @@ public: std::string uptime = secsToTimeString(sWorld->GetUptime()); uint32 updateTime = sWorld->GetUpdateTime(); - handler->SendSysMessage(_FULLVERSION); + handler->SendSysMessage(Revision::GetFullVersion().c_str()); handler->PSendSysMessage(LANG_CONNECTED_PLAYERS, playersNum, maxPlayersNum); handler->PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); handler->PSendSysMessage(LANG_UPTIME, uptime.c_str()); diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index abc019863b1..d68ddf85ff3 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -91,6 +91,8 @@ add_library(shared STATIC ${shared_STAT_PCH_SRC} ) +add_dependencies(shared revision_data.h) + # Generate precompiled header if (USE_COREPCH) add_cxx_pch(shared ${shared_STAT_PCH_HDR} ${shared_STAT_PCH_SRC}) diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/server/shared/Debugging/WheatyExceptionReport.cpp index 02916ca12d2..80240bb9110 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.cpp +++ b/src/server/shared/Debugging/WheatyExceptionReport.cpp @@ -20,8 +20,7 @@ #include "WheatyExceptionReport.h" #include "Common.h" -#include "SystemConfig.h" -#include "revision.h" +#include "Revision.h" #define CrashFolder _T("Crashes") #pragma comment(linker, "/DEFAULTLIB:dbghelp.lib") @@ -131,10 +130,10 @@ PEXCEPTION_POINTERS pExceptionInfo) SYSTEMTIME systime; GetLocalTime(&systime); sprintf(m_szDumpFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].dmp", - crash_folder_path, _HASH, pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, Revision::GetHash().c_str(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); sprintf(m_szLogFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].txt", - crash_folder_path, _HASH, pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, Revision::GetHash().c_str(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); m_hDumpFile = CreateFile(m_szDumpFileName, GENERIC_WRITE, @@ -440,7 +439,7 @@ PEXCEPTION_POINTERS pExceptionInfo) GetLocalTime(&systime); // Start out with a banner - _tprintf(_T("Revision: %s\r\n"), _FULLVERSION); + _tprintf(_T("Revision: %s\r\n"), Revision::GetFullVersion().c_str()); _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; diff --git a/src/server/shared/PrecompiledHeaders/sharedPCH.h b/src/server/shared/PrecompiledHeaders/sharedPCH.h index d99476bc7a8..f4c18f89ec1 100644 --- a/src/server/shared/PrecompiledHeaders/sharedPCH.h +++ b/src/server/shared/PrecompiledHeaders/sharedPCH.h @@ -8,3 +8,4 @@ #include "TypeList.h" #include "TaskScheduler.h" #include "EventMap.h" +#include "Revision.h" diff --git a/src/server/shared/Revision.cpp b/src/server/shared/Revision.cpp new file mode 100644 index 00000000000..84142316db5 --- /dev/null +++ b/src/server/shared/Revision.cpp @@ -0,0 +1,71 @@ +#include "Revision.h" +#include "CompilerDefs.h" +#include "revision_data.h" + +std::string Revision::GetPackageName() +{ + return "TrinityCore"; +} + +std::string Revision::GetHash() +{ + return _HASH; +} + +std::string Revision::GetDate() +{ + return _DATE; +} + +std::string Revision::GetBranch() +{ + return _BRANCH; +} + +std::string Revision::GetSourceDirectory() +{ + return _SOURCE_DIRECTORY; +} + +std::string Revision::GetMySQLExecutable() +{ + return _MYSQL_EXECUTABLE; +} + +std::string Revision::GetFullDatabase() +{ + return _FULL_DATABASE; +} + +std::string Revision::GetFullVersion() +{ +#if PLATFORM == PLATFORM_WINDOWS +# ifdef _WIN64 + return GetPackageName() + " rev. " + VER_PRODUCTVERSION_STR + " (Win64, " + _BUILD_DIRECTIVE + ")"; +# else + return GetPackageName() + " rev. " + VER_PRODUCTVERSION_STR + " (Win32, " + _BUILD_DIRECTIVE + ")"; +# endif +#else + return GetPackageName() + " rev. " + VER_PRODUCTVERSION_STR + " (Unix, " + _BUILD_DIRECTIVE + ")"; +#endif +} + +std::string GetCompanyNameStr() +{ + return VER_COMPANYNAME_STR; +} + +std::string GetLegalCopyrightStr() +{ + return VER_LEGALCOPYRIGHT_STR; +} + +std::string GetFileVersionStr() +{ + return VER_FILEVERSION_STR; +} + +std::string GetProductVersionStr() +{ + return VER_PRODUCTVERSION_STR; +} diff --git a/src/server/shared/SystemConfig.h b/src/server/shared/Revision.h similarity index 50% rename from src/server/shared/SystemConfig.h rename to src/server/shared/Revision.h index 7c519c7de57..6b80eb2ca46 100644 --- a/src/server/shared/SystemConfig.h +++ b/src/server/shared/Revision.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2015 TrinityCore - * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,29 +15,25 @@ * with this program. If not, see . */ -// THIS FILE IS DEPRECATED +#ifndef __REVISION_H__ +#define __REVISION_H__ -#ifndef TRINITY_SYSTEMCONFIG_H -#define TRINITY_SYSTEMCONFIG_H +#include -#include "Define.h" -#include "revision.h" +namespace Revision +{ + std::string GetPackageName(); + std::string GetHash(); + std::string GetDate(); + std::string GetBranch(); + std::string GetSourceDirectory(); + std::string GetMySQLExecutable(); + std::string GetFullDatabase(); + std::string GetFullVersion(); + std::string GetCompanyNameStr(); + std::string GetLegalCopyrightStr(); + std::string GetFileVersionStr(); + std::string GetProductVersionStr(); +} -#define _PACKAGENAME "TrinityCore" - -#if TRINITY_ENDIAN == TRINITY_BIGENDIAN -# define _ENDIAN_STRING "big-endian" -#else -# define _ENDIAN_STRING "little-endian" -#endif - -#if PLATFORM == PLATFORM_WINDOWS -# ifdef _WIN64 -# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win64, " _BUILD_DIRECTIVE ")" -# else -# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win32, " _BUILD_DIRECTIVE ")" -# endif -#else -# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")" -#endif #endif diff --git a/src/server/shared/Updater/DBUpdater.cpp b/src/server/shared/Updater/DBUpdater.cpp index 7b39062222e..c69d19b11d6 100644 --- a/src/server/shared/Updater/DBUpdater.cpp +++ b/src/server/shared/Updater/DBUpdater.cpp @@ -17,7 +17,7 @@ #include "DBUpdater.h" #include "Log.h" -#include "revision.h" +#include "Revision.h" #include "UpdateFetcher.h" #include "DatabaseLoader.h" #include "Config.h" @@ -40,7 +40,7 @@ std::string DBUpdater::GetSourceDirectory() if (!entry.empty()) return entry; else - return _SOURCE_DIRECTORY; + return Revision::GetSourceDirectory(); } template @@ -50,7 +50,7 @@ std::string DBUpdater::GetMySqlCli() if (!entry.empty()) return entry; else - return _MYSQL_EXECUTABLE; + return Revision::GetMySQLExecutable(); } // Auth Database @@ -95,7 +95,7 @@ std::string DBUpdater::GetTableName() template<> std::string DBUpdater::GetBaseFile() { - return _FULL_DATABASE; + return Revision::GetFullDatabase(); } template<> diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index d3b2eba9698..a6c76977fe2 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -157,8 +157,6 @@ if( NOT WIN32 ) ) endif() -add_dependencies(worldserver revision.h) - if( UNIX AND NOT NOJEM AND NOT APPLE ) set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}") endif() diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 50ed59a22a1..7d102e4606c 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -44,7 +44,7 @@ #include "BattlegroundMgr.h" #include "TCSoap.h" #include "CliRunnable.h" -#include "SystemConfig.h" +#include "Revision.h" #include "WorldSocket.h" #include "WorldSocketMgr.h" #include "DatabaseLoader.h" @@ -125,7 +125,7 @@ extern int main(int argc, char** argv) // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton sLog->Initialize(sConfigMgr->GetBoolDefault("Log.Async.Enable", false) ? &_ioService : nullptr); - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", _FULLVERSION); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", Revision::GetFullVersion().c_str()); TC_LOG_INFO("server.worldserver", " to stop.\n"); TC_LOG_INFO("server.worldserver", " ______ __"); TC_LOG_INFO("server.worldserver", "/\\__ _\\ __ __/\\ \\__"); @@ -234,7 +234,7 @@ extern int main(int argc, char** argv) TC_LOG_INFO("server.worldserver", "Starting up anti-freeze thread (%u seconds max stuck time)...", coreStuckTime); } - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", _FULLVERSION); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", Revision::GetFullVersion().c_str()); sScriptMgr->OnStartup(); @@ -470,7 +470,7 @@ bool StartDB() ClearOnlineAccounts(); ///- Insert version info into DB - WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", _FULLVERSION, _HASH); // One-time query + WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", Revision::GetFullVersion().c_str(), Revision::GetHash().c_str()); // One-time query sWorld->LoadDBVersion(); @@ -536,7 +536,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile } else if (vm.count("version")) { - std::cout << _FULLVERSION << "\n"; + std::cout << Revision::GetFullVersion() << "\n"; } return vm; diff --git a/src/server/worldserver/worldserver.rc b/src/server/worldserver/worldserver.rc index cc5545741d3..9af2db46ce0 100644 --- a/src/server/worldserver/worldserver.rc +++ b/src/server/worldserver/worldserver.rc @@ -17,7 +17,7 @@ */ #include "resource.h" -#include "revision.h" +#include "revision_data.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// From 222eaccc51b8d358c7b60d8def40d6461244ed31 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 16 Aug 2015 18:08:03 +0200 Subject: [PATCH 017/110] Build fix for WheatyExceptionReport, c++ exceptions must not be thrown in SEH handlers --- src/server/authserver/Main.cpp | 2 +- src/server/game/Handlers/CharacterHandler.cpp | 2 +- src/server/game/World/World.cpp | 4 +-- src/server/scripts/Commands/cs_server.cpp | 2 +- .../Debugging/WheatyExceptionReport.cpp | 6 ++-- src/server/shared/Logging/Appender.h | 1 - src/server/shared/Revision.cpp | 35 +++++++++---------- src/server/shared/Revision.h | 23 ++++++------ src/server/worldserver/Main.cpp | 6 ++-- 9 files changed, 38 insertions(+), 43 deletions(-) diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 7342a638958..1568e3acf60 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -103,7 +103,7 @@ int main(int argc, char** argv) sLog->RegisterAppender(); sLog->Initialize(nullptr); - TC_LOG_INFO("server.authserver", "%s (authserver)", Revision::GetFullVersion().c_str()); + TC_LOG_INFO("server.authserver", "%s (authserver)", Revision::GetFullVersion()); TC_LOG_INFO("server.authserver", " to stop.\n"); TC_LOG_INFO("server.authserver", "Using configuration file %s.", configFile.c_str()); TC_LOG_INFO("server.authserver", "Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 940e32d22b2..1a6df09018e 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -827,7 +827,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) // send server info if (sWorld->getIntConfig(CONFIG_ENABLE_SINFO_LOGIN) == 1) - chH.PSendSysMessage(Revision::GetFullVersion().c_str()); + chH.PSendSysMessage(Revision::GetFullVersion()); TC_LOG_DEBUG("network", "WORLD: Sent server info"); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 057f97e0e2b..a6037a7aafd 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1534,7 +1534,7 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Gameobject Data..."); sObjectMgr->LoadGameobjects(); - + TC_LOG_INFO("server.loading", "Loading GameObject Addon Data..."); sObjectMgr->LoadGameObjectAddons(); // must be after LoadGameObjectTemplate() and LoadGameobjects() @@ -1789,7 +1789,7 @@ void World::SetInitialWorldSettings() m_startTime = m_gameTime; LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES(%u, %u, 0, '%s')", - realmID, uint32(m_startTime), Revision::GetFullVersion().c_str()); // One-time query + realmID, uint32(m_startTime), Revision::GetFullVersion()); // One-time query m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 16c5371ffb8..fdc9370c30d 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -115,7 +115,7 @@ public: std::string uptime = secsToTimeString(sWorld->GetUptime()); uint32 updateTime = sWorld->GetUpdateTime(); - handler->SendSysMessage(Revision::GetFullVersion().c_str()); + handler->SendSysMessage(Revision::GetFullVersion()); handler->PSendSysMessage(LANG_CONNECTED_PLAYERS, playersNum, maxPlayersNum); handler->PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); handler->PSendSysMessage(LANG_UPTIME, uptime.c_str()); diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/server/shared/Debugging/WheatyExceptionReport.cpp index 80240bb9110..70aa23a8eed 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.cpp +++ b/src/server/shared/Debugging/WheatyExceptionReport.cpp @@ -130,10 +130,10 @@ PEXCEPTION_POINTERS pExceptionInfo) SYSTEMTIME systime; GetLocalTime(&systime); sprintf(m_szDumpFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].dmp", - crash_folder_path, Revision::GetHash().c_str(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, Revision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); sprintf(m_szLogFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].txt", - crash_folder_path, Revision::GetHash().c_str(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, Revision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); m_hDumpFile = CreateFile(m_szDumpFileName, GENERIC_WRITE, @@ -439,7 +439,7 @@ PEXCEPTION_POINTERS pExceptionInfo) GetLocalTime(&systime); // Start out with a banner - _tprintf(_T("Revision: %s\r\n"), Revision::GetFullVersion().c_str()); + _tprintf(_T("Revision: %s\r\n"), Revision::GetFullVersion()); _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index 17bc8d4e039..7c5aa41924d 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -107,7 +107,6 @@ class Appender uint8 id; std::string name; - AppenderType type; LogLevel level; AppenderFlags flags; }; diff --git a/src/server/shared/Revision.cpp b/src/server/shared/Revision.cpp index 84142316db5..22afb866165 100644 --- a/src/server/shared/Revision.cpp +++ b/src/server/shared/Revision.cpp @@ -2,70 +2,67 @@ #include "CompilerDefs.h" #include "revision_data.h" -std::string Revision::GetPackageName() -{ - return "TrinityCore"; -} - -std::string Revision::GetHash() +char const* Revision::GetHash() { return _HASH; } -std::string Revision::GetDate() +char const* Revision::GetDate() { return _DATE; } -std::string Revision::GetBranch() +char const* Revision::GetBranch() { return _BRANCH; } -std::string Revision::GetSourceDirectory() +char const* Revision::GetSourceDirectory() { return _SOURCE_DIRECTORY; } -std::string Revision::GetMySQLExecutable() +char const* Revision::GetMySQLExecutable() { return _MYSQL_EXECUTABLE; } -std::string Revision::GetFullDatabase() +char const* Revision::GetFullDatabase() { return _FULL_DATABASE; } -std::string Revision::GetFullVersion() +#define _PACKAGENAME "TrinityCore" + +char const* Revision::GetFullVersion() { #if PLATFORM == PLATFORM_WINDOWS # ifdef _WIN64 - return GetPackageName() + " rev. " + VER_PRODUCTVERSION_STR + " (Win64, " + _BUILD_DIRECTIVE + ")"; + return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win64, " _BUILD_DIRECTIVE ")"; # else - return GetPackageName() + " rev. " + VER_PRODUCTVERSION_STR + " (Win32, " + _BUILD_DIRECTIVE + ")"; + return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win32, " _BUILD_DIRECTIVE ")"; # endif #else - return GetPackageName() + " rev. " + VER_PRODUCTVERSION_STR + " (Unix, " + _BUILD_DIRECTIVE + ")"; + return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")"; #endif } -std::string GetCompanyNameStr() +char const* GetCompanyNameStr() { return VER_COMPANYNAME_STR; } -std::string GetLegalCopyrightStr() +char const* GetLegalCopyrightStr() { return VER_LEGALCOPYRIGHT_STR; } -std::string GetFileVersionStr() +char const* GetFileVersionStr() { return VER_FILEVERSION_STR; } -std::string GetProductVersionStr() +char const* GetProductVersionStr() { return VER_PRODUCTVERSION_STR; } diff --git a/src/server/shared/Revision.h b/src/server/shared/Revision.h index 6b80eb2ca46..f3a04540d76 100644 --- a/src/server/shared/Revision.h +++ b/src/server/shared/Revision.h @@ -22,18 +22,17 @@ namespace Revision { - std::string GetPackageName(); - std::string GetHash(); - std::string GetDate(); - std::string GetBranch(); - std::string GetSourceDirectory(); - std::string GetMySQLExecutable(); - std::string GetFullDatabase(); - std::string GetFullVersion(); - std::string GetCompanyNameStr(); - std::string GetLegalCopyrightStr(); - std::string GetFileVersionStr(); - std::string GetProductVersionStr(); + char const* GetHash(); + char const* GetDate(); + char const* GetBranch(); + char const* GetSourceDirectory(); + char const* GetMySQLExecutable(); + char const* GetFullDatabase(); + char const* GetFullVersion(); + char const* GetCompanyNameStr(); + char const* GetLegalCopyrightStr(); + char const* GetFileVersionStr(); + char const* GetProductVersionStr(); } #endif diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 7d102e4606c..03c0b3f5933 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -125,7 +125,7 @@ extern int main(int argc, char** argv) // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton sLog->Initialize(sConfigMgr->GetBoolDefault("Log.Async.Enable", false) ? &_ioService : nullptr); - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", Revision::GetFullVersion().c_str()); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", Revision::GetFullVersion()); TC_LOG_INFO("server.worldserver", " to stop.\n"); TC_LOG_INFO("server.worldserver", " ______ __"); TC_LOG_INFO("server.worldserver", "/\\__ _\\ __ __/\\ \\__"); @@ -234,7 +234,7 @@ extern int main(int argc, char** argv) TC_LOG_INFO("server.worldserver", "Starting up anti-freeze thread (%u seconds max stuck time)...", coreStuckTime); } - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", Revision::GetFullVersion().c_str()); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", Revision::GetFullVersion()); sScriptMgr->OnStartup(); @@ -470,7 +470,7 @@ bool StartDB() ClearOnlineAccounts(); ///- Insert version info into DB - WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", Revision::GetFullVersion().c_str(), Revision::GetHash().c_str()); // One-time query + WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", Revision::GetFullVersion(), Revision::GetHash()); // One-time query sWorld->LoadDBVersion(); From 1f66d719f2cbbcb144b5080c89dd73fcae261798 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sat, 15 Aug 2015 02:19:10 +0200 Subject: [PATCH 018/110] Core/BuildSystem: Merge collision, debugging, threading, utilities and configuration into "common" which does not depend on shared anymore and moved database out of shared library These changes enables to build tools only without even having MySQL installed --- CMakeLists.txt | 1 - src/CMakeLists.txt | 6 +- .../collision => common}/CMakeLists.txt | 68 +++++++++-------- .../Collision}/BoundingIntervalHierarchy.cpp | 0 .../Collision}/BoundingIntervalHierarchy.h | 0 .../BoundingIntervalHierarchyWrapper.h | 0 .../Collision}/DynamicTree.cpp | 0 .../Collision}/DynamicTree.h | 0 .../Collision}/Management/IVMapManager.h | 0 .../Collision}/Management/MMapFactory.cpp | 0 .../Collision}/Management/MMapFactory.h | 0 .../Collision}/Management/MMapManager.cpp | 14 ++-- .../Collision}/Management/MMapManager.h | 0 .../Collision}/Management/VMapFactory.cpp | 0 .../Collision}/Management/VMapFactory.h | 0 .../Collision}/Management/VMapManager2.cpp | 0 .../Collision}/Management/VMapManager2.h | 0 .../Collision}/Maps/MapTree.cpp | 0 .../Collision}/Maps/MapTree.h | 0 .../Collision}/Maps/TileAssembler.cpp | 0 .../Collision}/Maps/TileAssembler.h | 0 .../Collision}/Models/GameObjectModel.cpp | 0 .../Collision}/Models/GameObjectModel.h | 0 .../Collision}/Models/ModelInstance.cpp | 0 .../Collision}/Models/ModelInstance.h | 0 .../Collision}/Models/WorldModel.cpp | 0 .../Collision}/Models/WorldModel.h | 0 .../Collision}/RegularGrid.h | 0 .../Collision}/VMapDefinitions.h | 0 .../Collision}/VMapTools.h | 2 - src/{server/shared => common}/Common.cpp | 0 src/{server/shared => common}/Common.h | 0 src/{server/shared => common}/CompilerDefs.h | 0 .../Configuration/Config.cpp | 0 .../shared => common}/Configuration/Config.h | 0 .../shared => common}/Debugging/Errors.cpp | 0 .../shared => common}/Debugging/Errors.h | 0 .../Debugging/WheatyExceptionReport.cpp | 0 .../Debugging/WheatyExceptionReport.h | 0 src/{server/shared => common}/Define.h | 0 .../shared => common}/Logging/Appender.cpp | 0 .../shared => common}/Logging/Appender.h | 0 .../Logging/AppenderConsole.cpp | 0 .../Logging/AppenderConsole.h | 0 .../Logging/AppenderFile.cpp | 0 .../shared => common}/Logging/AppenderFile.h | 0 src/{server/shared => common}/Logging/Log.cpp | 1 - src/{server/shared => common}/Logging/Log.h | 0 .../Logging/LogOperation.cpp | 0 .../shared => common}/Logging/LogOperation.h | 0 .../shared => common}/Logging/Logger.cpp | 0 .../shared => common}/Logging/Logger.h | 0 src/common/PrecompiledHeaders/commonPCH.cpp | 1 + src/common/PrecompiledHeaders/commonPCH.h | 13 ++++ .../shared => common}/Threading/Callback.h | 0 .../shared => common}/Threading/LockedQueue.h | 0 .../Threading/ProcessPriority.h | 0 .../Threading/ProducerConsumerQueue.h | 0 .../Utilities/ByteConverter.h | 0 .../shared => common}/Utilities/Duration.h | 0 .../shared => common}/Utilities/EventMap.cpp | 0 .../shared => common}/Utilities/EventMap.h | 0 .../Utilities/EventProcessor.cpp | 0 .../Utilities/EventProcessor.h | 0 .../Utilities/StringFormat.h | 0 .../Utilities/TaskScheduler.cpp | 0 .../Utilities/TaskScheduler.h | 0 .../shared => common}/Utilities/Timer.h | 0 .../shared => common}/Utilities/Util.cpp | 0 .../shared => common}/Utilities/Util.h | 0 src/server/CMakeLists.txt | 30 ++++---- src/server/authserver/CMakeLists.txt | 23 ++++-- .../PrecompiledHeaders/collisionPCH.cpp | 1 - .../PrecompiledHeaders/collisionPCH.h | 9 --- src/server/database/CMakeLists.txt | 74 +++++++++++++++++++ .../Database/AdhocStatement.cpp | 0 .../Database/AdhocStatement.h | 0 .../Database/DatabaseEnv.h | 0 .../Database/DatabaseLoader.cpp | 0 .../Database/DatabaseLoader.h | 0 .../Database/DatabaseWorker.cpp | 0 .../Database/DatabaseWorker.h | 0 .../Database/DatabaseWorkerPool.h | 0 .../{shared => database}/Database/Field.cpp | 0 .../{shared => database}/Database/Field.h | 0 .../Implementation/CharacterDatabase.cpp | 0 .../Implementation/CharacterDatabase.h | 0 .../Database/Implementation/LoginDatabase.cpp | 0 .../Database/Implementation/LoginDatabase.h | 0 .../Database/Implementation/WorldDatabase.cpp | 0 .../Database/Implementation/WorldDatabase.h | 0 .../Database/MySQLConnection.cpp | 0 .../Database/MySQLConnection.h | 0 .../Database/MySQLThreading.h | 0 .../Database/PreparedStatement.cpp | 0 .../Database/PreparedStatement.h | 0 .../Database/QueryHolder.cpp | 0 .../Database/QueryHolder.h | 0 .../Database/QueryResult.cpp | 0 .../Database/QueryResult.h | 0 .../Database/SQLOperation.h | 0 .../Database/Transaction.cpp | 0 .../Database/Transaction.h | 0 .../Logging/AppenderDB.cpp | 0 .../{shared => database}/Logging/AppenderDB.h | 0 .../PrecompiledHeaders/databasePCH.cpp | 1 + .../database/PrecompiledHeaders/databasePCH.h | 23 ++++++ .../Updater/DBUpdater.cpp | 0 .../{shared => database}/Updater/DBUpdater.h | 0 .../Updater/UpdateFetcher.cpp | 0 .../Updater/UpdateFetcher.h | 0 src/server/game/CMakeLists.txt | 25 ++++--- src/server/scripts/CMakeLists.txt | 24 +++--- src/server/shared/CMakeLists.txt | 43 +++++------ .../shared/PrecompiledHeaders/sharedPCH.h | 7 -- .../{Utilities => Service}/ServiceWin32.cpp | 0 .../{Utilities => Service}/ServiceWin32.h | 0 src/server/worldserver/CMakeLists.txt | 30 +++++--- src/tools/mmaps_generator/CMakeLists.txt | 16 ++-- src/tools/vmap4_assembler/CMakeLists.txt | 9 ++- 120 files changed, 269 insertions(+), 152 deletions(-) rename src/{server/collision => common}/CMakeLists.txt (59%) rename src/{server/collision => common/Collision}/BoundingIntervalHierarchy.cpp (100%) rename src/{server/collision => common/Collision}/BoundingIntervalHierarchy.h (100%) rename src/{server/collision => common/Collision}/BoundingIntervalHierarchyWrapper.h (100%) rename src/{server/collision => common/Collision}/DynamicTree.cpp (100%) rename src/{server/collision => common/Collision}/DynamicTree.h (100%) rename src/{server/collision => common/Collision}/Management/IVMapManager.h (100%) rename src/{server/collision => common/Collision}/Management/MMapFactory.cpp (100%) rename src/{server/collision => common/Collision}/Management/MMapFactory.h (100%) rename src/{server/collision => common/Collision}/Management/MMapManager.cpp (95%) rename src/{server/collision => common/Collision}/Management/MMapManager.h (100%) rename src/{server/collision => common/Collision}/Management/VMapFactory.cpp (100%) rename src/{server/collision => common/Collision}/Management/VMapFactory.h (100%) rename src/{server/collision => common/Collision}/Management/VMapManager2.cpp (100%) rename src/{server/collision => common/Collision}/Management/VMapManager2.h (100%) rename src/{server/collision => common/Collision}/Maps/MapTree.cpp (100%) rename src/{server/collision => common/Collision}/Maps/MapTree.h (100%) rename src/{server/collision => common/Collision}/Maps/TileAssembler.cpp (100%) rename src/{server/collision => common/Collision}/Maps/TileAssembler.h (100%) rename src/{server/collision => common/Collision}/Models/GameObjectModel.cpp (100%) rename src/{server/collision => common/Collision}/Models/GameObjectModel.h (100%) rename src/{server/collision => common/Collision}/Models/ModelInstance.cpp (100%) rename src/{server/collision => common/Collision}/Models/ModelInstance.h (100%) rename src/{server/collision => common/Collision}/Models/WorldModel.cpp (100%) rename src/{server/collision => common/Collision}/Models/WorldModel.h (100%) rename src/{server/collision => common/Collision}/RegularGrid.h (100%) rename src/{server/collision => common/Collision}/VMapDefinitions.h (100%) rename src/{server/collision => common/Collision}/VMapTools.h (99%) rename src/{server/shared => common}/Common.cpp (100%) rename src/{server/shared => common}/Common.h (100%) rename src/{server/shared => common}/CompilerDefs.h (100%) rename src/{server/shared => common}/Configuration/Config.cpp (100%) rename src/{server/shared => common}/Configuration/Config.h (100%) rename src/{server/shared => common}/Debugging/Errors.cpp (100%) rename src/{server/shared => common}/Debugging/Errors.h (100%) rename src/{server/shared => common}/Debugging/WheatyExceptionReport.cpp (100%) rename src/{server/shared => common}/Debugging/WheatyExceptionReport.h (100%) rename src/{server/shared => common}/Define.h (100%) rename src/{server/shared => common}/Logging/Appender.cpp (100%) rename src/{server/shared => common}/Logging/Appender.h (100%) rename src/{server/shared => common}/Logging/AppenderConsole.cpp (100%) rename src/{server/shared => common}/Logging/AppenderConsole.h (100%) rename src/{server/shared => common}/Logging/AppenderFile.cpp (100%) rename src/{server/shared => common}/Logging/AppenderFile.h (100%) rename src/{server/shared => common}/Logging/Log.cpp (99%) rename src/{server/shared => common}/Logging/Log.h (100%) rename src/{server/shared => common}/Logging/LogOperation.cpp (100%) rename src/{server/shared => common}/Logging/LogOperation.h (100%) rename src/{server/shared => common}/Logging/Logger.cpp (100%) rename src/{server/shared => common}/Logging/Logger.h (100%) create mode 100644 src/common/PrecompiledHeaders/commonPCH.cpp create mode 100644 src/common/PrecompiledHeaders/commonPCH.h rename src/{server/shared => common}/Threading/Callback.h (100%) rename src/{server/shared => common}/Threading/LockedQueue.h (100%) rename src/{server/shared => common}/Threading/ProcessPriority.h (100%) rename src/{server/shared => common}/Threading/ProducerConsumerQueue.h (100%) rename src/{server/shared => common}/Utilities/ByteConverter.h (100%) rename src/{server/shared => common}/Utilities/Duration.h (100%) rename src/{server/shared => common}/Utilities/EventMap.cpp (100%) rename src/{server/shared => common}/Utilities/EventMap.h (100%) rename src/{server/shared => common}/Utilities/EventProcessor.cpp (100%) rename src/{server/shared => common}/Utilities/EventProcessor.h (100%) rename src/{server/shared => common}/Utilities/StringFormat.h (100%) rename src/{server/shared => common}/Utilities/TaskScheduler.cpp (100%) rename src/{server/shared => common}/Utilities/TaskScheduler.h (100%) rename src/{server/shared => common}/Utilities/Timer.h (100%) rename src/{server/shared => common}/Utilities/Util.cpp (100%) rename src/{server/shared => common}/Utilities/Util.h (100%) delete mode 100644 src/server/collision/PrecompiledHeaders/collisionPCH.cpp delete mode 100644 src/server/collision/PrecompiledHeaders/collisionPCH.h create mode 100644 src/server/database/CMakeLists.txt rename src/server/{shared => database}/Database/AdhocStatement.cpp (100%) rename src/server/{shared => database}/Database/AdhocStatement.h (100%) rename src/server/{shared => database}/Database/DatabaseEnv.h (100%) rename src/server/{shared => database}/Database/DatabaseLoader.cpp (100%) rename src/server/{shared => database}/Database/DatabaseLoader.h (100%) rename src/server/{shared => database}/Database/DatabaseWorker.cpp (100%) rename src/server/{shared => database}/Database/DatabaseWorker.h (100%) rename src/server/{shared => database}/Database/DatabaseWorkerPool.h (100%) rename src/server/{shared => database}/Database/Field.cpp (100%) rename src/server/{shared => database}/Database/Field.h (100%) rename src/server/{shared => database}/Database/Implementation/CharacterDatabase.cpp (100%) rename src/server/{shared => database}/Database/Implementation/CharacterDatabase.h (100%) rename src/server/{shared => database}/Database/Implementation/LoginDatabase.cpp (100%) rename src/server/{shared => database}/Database/Implementation/LoginDatabase.h (100%) rename src/server/{shared => database}/Database/Implementation/WorldDatabase.cpp (100%) rename src/server/{shared => database}/Database/Implementation/WorldDatabase.h (100%) rename src/server/{shared => database}/Database/MySQLConnection.cpp (100%) rename src/server/{shared => database}/Database/MySQLConnection.h (100%) rename src/server/{shared => database}/Database/MySQLThreading.h (100%) rename src/server/{shared => database}/Database/PreparedStatement.cpp (100%) rename src/server/{shared => database}/Database/PreparedStatement.h (100%) rename src/server/{shared => database}/Database/QueryHolder.cpp (100%) rename src/server/{shared => database}/Database/QueryHolder.h (100%) rename src/server/{shared => database}/Database/QueryResult.cpp (100%) rename src/server/{shared => database}/Database/QueryResult.h (100%) rename src/server/{shared => database}/Database/SQLOperation.h (100%) rename src/server/{shared => database}/Database/Transaction.cpp (100%) rename src/server/{shared => database}/Database/Transaction.h (100%) rename src/server/{shared => database}/Logging/AppenderDB.cpp (100%) rename src/server/{shared => database}/Logging/AppenderDB.h (100%) create mode 100644 src/server/database/PrecompiledHeaders/databasePCH.cpp create mode 100644 src/server/database/PrecompiledHeaders/databasePCH.h rename src/server/{shared => database}/Updater/DBUpdater.cpp (100%) rename src/server/{shared => database}/Updater/DBUpdater.h (100%) rename src/server/{shared => database}/Updater/UpdateFetcher.cpp (100%) rename src/server/{shared => database}/Updater/UpdateFetcher.h (100%) rename src/server/shared/{Utilities => Service}/ServiceWin32.cpp (100%) rename src/server/shared/{Utilities => Service}/ServiceWin32.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2630ef17da7..11444f93229 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,7 +60,6 @@ find_package(OpenSSL REQUIRED) find_package(Threads REQUIRED) include(ConfigureBoost) -find_package(MySQL REQUIRED) if( UNIX ) find_package(Readline) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e6d31ebbaef..a2c50828d37 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,11 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. add_subdirectory(genrev) -add_subdirectory(server) +add_subdirectory(common) + +if(SERVERS) + add_subdirectory(server) +endif(SERVERS) if(TOOLS) add_subdirectory(tools) diff --git a/src/server/collision/CMakeLists.txt b/src/common/CMakeLists.txt similarity index 59% rename from src/server/collision/CMakeLists.txt rename to src/common/CMakeLists.txt index f394fe791be..0c97fc35fcc 100644 --- a/src/server/collision/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -12,41 +12,48 @@ if( USE_COREPCH ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() -file(GLOB_RECURSE sources_Management Management/*.cpp Management/*.h) -file(GLOB_RECURSE sources_Maps Maps/*.cpp Maps/*.h) -file(GLOB_RECURSE sources_Models Models/*.cpp Models/*.h) +file(GLOB_RECURSE sources_Common Common.cpp Common.h) +file(GLOB_RECURSE sources_Collision Collision/*.cpp Collision/*.h) +file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) +file(GLOB_RECURSE sources_Threading Utilities/*.cpp Utilities/*.h) +file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h) +file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) + +# Manually set sources for Debugging directory as we don't want to include WheatyExceptionReport in common project +# It needs to be included both in authserver and worldserver for the static global variable to be properly initialized +# and to handle crash logs on windows +set(sources_Debugging Debugging/Errors.cpp Debugging/Errors.h) file(GLOB sources_localdir *.cpp *.h) if (USE_COREPCH) - set(collision_STAT_PCH_HDR PrecompiledHeaders/collisionPCH.h) - set(collision_STAT_PCH_SRC PrecompiledHeaders/collisionPCH.cpp) + set(common_STAT_PCH_HDR PrecompiledHeaders/commonPCH.h) + set(common_STAT_PCH_SRC PrecompiledHeaders/commonPCH.cpp) endif () -set(collision_STAT_SRCS - ${collision_STAT_SRCS} - ${sources_Management} - ${sources_Maps} - ${sources_Models} - ${sources_localdir} +set(common_STAT_SRCS + ${common_STAT_SRCS} + ${sources_Common} + ${sources_Collision} + ${sources_Threading} + ${sources_Debugging} + ${sources_Configuration} + ${sources_Logging} ) include_directories( ${CMAKE_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/dep/utf8cpp + ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/g3dlite/include ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores ${CMAKE_SOURCE_DIR}/src/server/game/Addons ${CMAKE_SOURCE_DIR}/src/server/game/Conditions @@ -73,25 +80,26 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Spells ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Management - ${CMAKE_CURRENT_SOURCE_DIR}/Maps - ${CMAKE_CURRENT_SOURCE_DIR}/Models - ${MYSQL_INCLUDE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/Threading + ${CMAKE_CURRENT_SOURCE_DIR}/Debugging + ${CMAKE_CURRENT_SOURCE_DIR}/Collision + ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Management + ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Maps + ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Models + ${CMAKE_CURRENT_SOURCE_DIR}/Utilities + ${CMAKE_CURRENT_SOURCE_DIR}/Configuration + ${CMAKE_CURRENT_SOURCE_DIR}/Logging ${VALGRIND_INCLUDE_DIR} ) GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) -add_library(collision STATIC - ${collision_STAT_SRCS} - ${collision_STAT_PCH_SRC} -) - -target_link_libraries(collision - shared +add_library(common STATIC + ${common_STAT_SRCS} + ${common_STAT_PCH_SRC} ) # Generate precompiled header if (USE_COREPCH) - add_cxx_pch(collision ${collision_STAT_PCH_HDR} ${collision_STAT_PCH_SRC}) + add_cxx_pch(common ${common_STAT_PCH_HDR} ${common_STAT_PCH_SRC}) endif () diff --git a/src/server/collision/BoundingIntervalHierarchy.cpp b/src/common/Collision/BoundingIntervalHierarchy.cpp similarity index 100% rename from src/server/collision/BoundingIntervalHierarchy.cpp rename to src/common/Collision/BoundingIntervalHierarchy.cpp diff --git a/src/server/collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h similarity index 100% rename from src/server/collision/BoundingIntervalHierarchy.h rename to src/common/Collision/BoundingIntervalHierarchy.h diff --git a/src/server/collision/BoundingIntervalHierarchyWrapper.h b/src/common/Collision/BoundingIntervalHierarchyWrapper.h similarity index 100% rename from src/server/collision/BoundingIntervalHierarchyWrapper.h rename to src/common/Collision/BoundingIntervalHierarchyWrapper.h diff --git a/src/server/collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp similarity index 100% rename from src/server/collision/DynamicTree.cpp rename to src/common/Collision/DynamicTree.cpp diff --git a/src/server/collision/DynamicTree.h b/src/common/Collision/DynamicTree.h similarity index 100% rename from src/server/collision/DynamicTree.h rename to src/common/Collision/DynamicTree.h diff --git a/src/server/collision/Management/IVMapManager.h b/src/common/Collision/Management/IVMapManager.h similarity index 100% rename from src/server/collision/Management/IVMapManager.h rename to src/common/Collision/Management/IVMapManager.h diff --git a/src/server/collision/Management/MMapFactory.cpp b/src/common/Collision/Management/MMapFactory.cpp similarity index 100% rename from src/server/collision/Management/MMapFactory.cpp rename to src/common/Collision/Management/MMapFactory.cpp diff --git a/src/server/collision/Management/MMapFactory.h b/src/common/Collision/Management/MMapFactory.h similarity index 100% rename from src/server/collision/Management/MMapFactory.h rename to src/common/Collision/Management/MMapFactory.h diff --git a/src/server/collision/Management/MMapManager.cpp b/src/common/Collision/Management/MMapManager.cpp similarity index 95% rename from src/server/collision/Management/MMapManager.cpp rename to src/common/Collision/Management/MMapManager.cpp index b71b94e3291..c93d4e0e751 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/common/Collision/Management/MMapManager.cpp @@ -18,7 +18,8 @@ #include "MMapManager.h" #include "Log.h" -#include "World.h" +#include "Config.h" +#include "SharedDefines.h" namespace MMAP { @@ -69,9 +70,10 @@ namespace MMAP } // load and init dtNavMesh - read parameters from file - uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i.mmap")+1; + std::string dataDir = sConfigMgr->GetStringDefault("DataDir", "./"); + uint32 pathLen = dataDir.length() + strlen("/mmaps/%03i.mmap") + 1; char *fileName = new char[pathLen]; - snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i.mmap").c_str(), mapId); + snprintf(fileName, pathLen, (dataDir + "/mmaps/%03i.mmap").c_str(), mapId); FILE* file = fopen(fileName, "rb"); if (!file) @@ -118,7 +120,7 @@ namespace MMAP return uint32(x << 16 | y); } - bool MMapManager::loadMap(const std::string& /*basePath*/, uint32 mapId, int32 x, int32 y) + bool MMapManager::loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y) { // make sure the mmap is loaded and ready to load tiles if (!loadMapData(mapId)) @@ -134,10 +136,10 @@ namespace MMAP return false; // load this tile :: mmaps/MMMXXYY.mmtile - uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i%02i%02i.mmtile")+1; + uint32 pathLen = basePath.length() + strlen("/%03i%02i%02i.mmtile") + 1; char *fileName = new char[pathLen]; - snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i%02i%02i.mmtile").c_str(), mapId, x, y); + snprintf(fileName, pathLen, (basePath + "/%03i%02i%02i.mmtile").c_str(), mapId, x, y); FILE* file = fopen(fileName, "rb"); if (!file) diff --git a/src/server/collision/Management/MMapManager.h b/src/common/Collision/Management/MMapManager.h similarity index 100% rename from src/server/collision/Management/MMapManager.h rename to src/common/Collision/Management/MMapManager.h diff --git a/src/server/collision/Management/VMapFactory.cpp b/src/common/Collision/Management/VMapFactory.cpp similarity index 100% rename from src/server/collision/Management/VMapFactory.cpp rename to src/common/Collision/Management/VMapFactory.cpp diff --git a/src/server/collision/Management/VMapFactory.h b/src/common/Collision/Management/VMapFactory.h similarity index 100% rename from src/server/collision/Management/VMapFactory.h rename to src/common/Collision/Management/VMapFactory.h diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/common/Collision/Management/VMapManager2.cpp similarity index 100% rename from src/server/collision/Management/VMapManager2.cpp rename to src/common/Collision/Management/VMapManager2.cpp diff --git a/src/server/collision/Management/VMapManager2.h b/src/common/Collision/Management/VMapManager2.h similarity index 100% rename from src/server/collision/Management/VMapManager2.h rename to src/common/Collision/Management/VMapManager2.h diff --git a/src/server/collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp similarity index 100% rename from src/server/collision/Maps/MapTree.cpp rename to src/common/Collision/Maps/MapTree.cpp diff --git a/src/server/collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h similarity index 100% rename from src/server/collision/Maps/MapTree.h rename to src/common/Collision/Maps/MapTree.h diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/common/Collision/Maps/TileAssembler.cpp similarity index 100% rename from src/server/collision/Maps/TileAssembler.cpp rename to src/common/Collision/Maps/TileAssembler.cpp diff --git a/src/server/collision/Maps/TileAssembler.h b/src/common/Collision/Maps/TileAssembler.h similarity index 100% rename from src/server/collision/Maps/TileAssembler.h rename to src/common/Collision/Maps/TileAssembler.h diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp similarity index 100% rename from src/server/collision/Models/GameObjectModel.cpp rename to src/common/Collision/Models/GameObjectModel.cpp diff --git a/src/server/collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h similarity index 100% rename from src/server/collision/Models/GameObjectModel.h rename to src/common/Collision/Models/GameObjectModel.h diff --git a/src/server/collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp similarity index 100% rename from src/server/collision/Models/ModelInstance.cpp rename to src/common/Collision/Models/ModelInstance.cpp diff --git a/src/server/collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h similarity index 100% rename from src/server/collision/Models/ModelInstance.h rename to src/common/Collision/Models/ModelInstance.h diff --git a/src/server/collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp similarity index 100% rename from src/server/collision/Models/WorldModel.cpp rename to src/common/Collision/Models/WorldModel.cpp diff --git a/src/server/collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h similarity index 100% rename from src/server/collision/Models/WorldModel.h rename to src/common/Collision/Models/WorldModel.h diff --git a/src/server/collision/RegularGrid.h b/src/common/Collision/RegularGrid.h similarity index 100% rename from src/server/collision/RegularGrid.h rename to src/common/Collision/RegularGrid.h diff --git a/src/server/collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h similarity index 100% rename from src/server/collision/VMapDefinitions.h rename to src/common/Collision/VMapDefinitions.h diff --git a/src/server/collision/VMapTools.h b/src/common/Collision/VMapTools.h similarity index 99% rename from src/server/collision/VMapTools.h rename to src/common/Collision/VMapTools.h index fa7bc394ebc..662dc43e9e7 100644 --- a/src/server/collision/VMapTools.h +++ b/src/common/Collision/VMapTools.h @@ -22,8 +22,6 @@ #include #include -#include "NodeValueAccess.h" - /** The Class is mainly taken from G3D/AABSPTree.h but modified to be able to use our internal data structure. This is an iterator that helps us analysing the BSP-Trees. diff --git a/src/server/shared/Common.cpp b/src/common/Common.cpp similarity index 100% rename from src/server/shared/Common.cpp rename to src/common/Common.cpp diff --git a/src/server/shared/Common.h b/src/common/Common.h similarity index 100% rename from src/server/shared/Common.h rename to src/common/Common.h diff --git a/src/server/shared/CompilerDefs.h b/src/common/CompilerDefs.h similarity index 100% rename from src/server/shared/CompilerDefs.h rename to src/common/CompilerDefs.h diff --git a/src/server/shared/Configuration/Config.cpp b/src/common/Configuration/Config.cpp similarity index 100% rename from src/server/shared/Configuration/Config.cpp rename to src/common/Configuration/Config.cpp diff --git a/src/server/shared/Configuration/Config.h b/src/common/Configuration/Config.h similarity index 100% rename from src/server/shared/Configuration/Config.h rename to src/common/Configuration/Config.h diff --git a/src/server/shared/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp similarity index 100% rename from src/server/shared/Debugging/Errors.cpp rename to src/common/Debugging/Errors.cpp diff --git a/src/server/shared/Debugging/Errors.h b/src/common/Debugging/Errors.h similarity index 100% rename from src/server/shared/Debugging/Errors.h rename to src/common/Debugging/Errors.h diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp similarity index 100% rename from src/server/shared/Debugging/WheatyExceptionReport.cpp rename to src/common/Debugging/WheatyExceptionReport.cpp diff --git a/src/server/shared/Debugging/WheatyExceptionReport.h b/src/common/Debugging/WheatyExceptionReport.h similarity index 100% rename from src/server/shared/Debugging/WheatyExceptionReport.h rename to src/common/Debugging/WheatyExceptionReport.h diff --git a/src/server/shared/Define.h b/src/common/Define.h similarity index 100% rename from src/server/shared/Define.h rename to src/common/Define.h diff --git a/src/server/shared/Logging/Appender.cpp b/src/common/Logging/Appender.cpp similarity index 100% rename from src/server/shared/Logging/Appender.cpp rename to src/common/Logging/Appender.cpp diff --git a/src/server/shared/Logging/Appender.h b/src/common/Logging/Appender.h similarity index 100% rename from src/server/shared/Logging/Appender.h rename to src/common/Logging/Appender.h diff --git a/src/server/shared/Logging/AppenderConsole.cpp b/src/common/Logging/AppenderConsole.cpp similarity index 100% rename from src/server/shared/Logging/AppenderConsole.cpp rename to src/common/Logging/AppenderConsole.cpp diff --git a/src/server/shared/Logging/AppenderConsole.h b/src/common/Logging/AppenderConsole.h similarity index 100% rename from src/server/shared/Logging/AppenderConsole.h rename to src/common/Logging/AppenderConsole.h diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp similarity index 100% rename from src/server/shared/Logging/AppenderFile.cpp rename to src/common/Logging/AppenderFile.cpp diff --git a/src/server/shared/Logging/AppenderFile.h b/src/common/Logging/AppenderFile.h similarity index 100% rename from src/server/shared/Logging/AppenderFile.h rename to src/common/Logging/AppenderFile.h diff --git a/src/server/shared/Logging/Log.cpp b/src/common/Logging/Log.cpp similarity index 99% rename from src/server/shared/Logging/Log.cpp rename to src/common/Logging/Log.cpp index 5075815ad54..93b7b9d122e 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -22,7 +22,6 @@ #include "Util.h" #include "AppenderConsole.h" #include "AppenderFile.h" -#include "AppenderDB.h" #include "LogOperation.h" #include diff --git a/src/server/shared/Logging/Log.h b/src/common/Logging/Log.h similarity index 100% rename from src/server/shared/Logging/Log.h rename to src/common/Logging/Log.h diff --git a/src/server/shared/Logging/LogOperation.cpp b/src/common/Logging/LogOperation.cpp similarity index 100% rename from src/server/shared/Logging/LogOperation.cpp rename to src/common/Logging/LogOperation.cpp diff --git a/src/server/shared/Logging/LogOperation.h b/src/common/Logging/LogOperation.h similarity index 100% rename from src/server/shared/Logging/LogOperation.h rename to src/common/Logging/LogOperation.h diff --git a/src/server/shared/Logging/Logger.cpp b/src/common/Logging/Logger.cpp similarity index 100% rename from src/server/shared/Logging/Logger.cpp rename to src/common/Logging/Logger.cpp diff --git a/src/server/shared/Logging/Logger.h b/src/common/Logging/Logger.h similarity index 100% rename from src/server/shared/Logging/Logger.h rename to src/common/Logging/Logger.h diff --git a/src/common/PrecompiledHeaders/commonPCH.cpp b/src/common/PrecompiledHeaders/commonPCH.cpp new file mode 100644 index 00000000000..52c623ca64a --- /dev/null +++ b/src/common/PrecompiledHeaders/commonPCH.cpp @@ -0,0 +1 @@ +#include "PrecompiledHeaders/commonPCH.h" diff --git a/src/common/PrecompiledHeaders/commonPCH.h b/src/common/PrecompiledHeaders/commonPCH.h new file mode 100644 index 00000000000..2d4f1ff4694 --- /dev/null +++ b/src/common/PrecompiledHeaders/commonPCH.h @@ -0,0 +1,13 @@ +#include "Define.h" +#include "Common.h" +#include "BoundingIntervalHierarchy.h" +#include "BoundingIntervalHierarchyWrapper.h" +#include "RegularGrid.h" +#include "Collision/VMapDefinitions.h" +#include "Collision/Maps/MapTree.h" +#include "Collision/Models/WorldModel.h" +#include "Collision/Models/ModelInstance.h" +#include "Collision/Models/GameObjectModel.h" +#include "Threading/ProducerConsumerQueue.h" +#include "Utilities/TaskScheduler.h" +#include "Utilities/EventMap.h" diff --git a/src/server/shared/Threading/Callback.h b/src/common/Threading/Callback.h similarity index 100% rename from src/server/shared/Threading/Callback.h rename to src/common/Threading/Callback.h diff --git a/src/server/shared/Threading/LockedQueue.h b/src/common/Threading/LockedQueue.h similarity index 100% rename from src/server/shared/Threading/LockedQueue.h rename to src/common/Threading/LockedQueue.h diff --git a/src/server/shared/Threading/ProcessPriority.h b/src/common/Threading/ProcessPriority.h similarity index 100% rename from src/server/shared/Threading/ProcessPriority.h rename to src/common/Threading/ProcessPriority.h diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/common/Threading/ProducerConsumerQueue.h similarity index 100% rename from src/server/shared/Threading/ProducerConsumerQueue.h rename to src/common/Threading/ProducerConsumerQueue.h diff --git a/src/server/shared/Utilities/ByteConverter.h b/src/common/Utilities/ByteConverter.h similarity index 100% rename from src/server/shared/Utilities/ByteConverter.h rename to src/common/Utilities/ByteConverter.h diff --git a/src/server/shared/Utilities/Duration.h b/src/common/Utilities/Duration.h similarity index 100% rename from src/server/shared/Utilities/Duration.h rename to src/common/Utilities/Duration.h diff --git a/src/server/shared/Utilities/EventMap.cpp b/src/common/Utilities/EventMap.cpp similarity index 100% rename from src/server/shared/Utilities/EventMap.cpp rename to src/common/Utilities/EventMap.cpp diff --git a/src/server/shared/Utilities/EventMap.h b/src/common/Utilities/EventMap.h similarity index 100% rename from src/server/shared/Utilities/EventMap.h rename to src/common/Utilities/EventMap.h diff --git a/src/server/shared/Utilities/EventProcessor.cpp b/src/common/Utilities/EventProcessor.cpp similarity index 100% rename from src/server/shared/Utilities/EventProcessor.cpp rename to src/common/Utilities/EventProcessor.cpp diff --git a/src/server/shared/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h similarity index 100% rename from src/server/shared/Utilities/EventProcessor.h rename to src/common/Utilities/EventProcessor.h diff --git a/src/server/shared/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h similarity index 100% rename from src/server/shared/Utilities/StringFormat.h rename to src/common/Utilities/StringFormat.h diff --git a/src/server/shared/Utilities/TaskScheduler.cpp b/src/common/Utilities/TaskScheduler.cpp similarity index 100% rename from src/server/shared/Utilities/TaskScheduler.cpp rename to src/common/Utilities/TaskScheduler.cpp diff --git a/src/server/shared/Utilities/TaskScheduler.h b/src/common/Utilities/TaskScheduler.h similarity index 100% rename from src/server/shared/Utilities/TaskScheduler.h rename to src/common/Utilities/TaskScheduler.h diff --git a/src/server/shared/Utilities/Timer.h b/src/common/Utilities/Timer.h similarity index 100% rename from src/server/shared/Utilities/Timer.h rename to src/common/Utilities/Timer.h diff --git a/src/server/shared/Utilities/Util.cpp b/src/common/Utilities/Util.cpp similarity index 100% rename from src/server/shared/Utilities/Util.cpp rename to src/common/Utilities/Util.cpp diff --git a/src/server/shared/Utilities/Util.h b/src/common/Utilities/Util.h similarity index 100% rename from src/server/shared/Utilities/Util.h rename to src/common/Utilities/Util.h diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index fc4bf4328a3..5d3daef05d8 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -12,24 +12,20 @@ # This to stop a few silly crashes that could have been avoided IF people # weren't doing some -O3 psychooptimizations etc. +find_package(MySQL REQUIRED) + if(CMAKE_COMPILER_IS_GNUCXX AND NOT MINGW) add_definitions(-fno-delete-null-pointer-checks) endif() -if( SERVERS ) - set(sources_windows_Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging/WheatyExceptionReport.cpp - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging/WheatyExceptionReport.h - ) - add_subdirectory(shared) - add_subdirectory(game) - add_subdirectory(collision) - add_subdirectory(authserver) - add_subdirectory(scripts) - add_subdirectory(worldserver) -else() - if( TOOLS ) - add_subdirectory(collision) - add_subdirectory(shared) - endif() -endif() +set(sources_windows_Debugging + ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp + ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h +) +add_subdirectory(database) +add_subdirectory(shared) +add_subdirectory(game) +add_subdirectory(authserver) +add_subdirectory(scripts) +add_subdirectory(worldserver) + diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index f6d99de5271..24a2dc35fce 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -45,22 +45,29 @@ include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/process + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging ${CMAKE_SOURCE_DIR}/src/server/shared/Networking - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities + ${CMAKE_SOURCE_DIR}/src/server/shared/Service ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Authentication ${CMAKE_CURRENT_SOURCE_DIR}/Realms ${CMAKE_CURRENT_SOURCE_DIR}/Server + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Logging ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} @@ -80,8 +87,10 @@ if( NOT WIN32 ) endif() target_link_libraries(authserver + common shared format + database ${MYSQL_LIBRARY} ${OPENSSL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/src/server/collision/PrecompiledHeaders/collisionPCH.cpp b/src/server/collision/PrecompiledHeaders/collisionPCH.cpp deleted file mode 100644 index 36eae8e2b0d..00000000000 --- a/src/server/collision/PrecompiledHeaders/collisionPCH.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "collisionPCH.h" diff --git a/src/server/collision/PrecompiledHeaders/collisionPCH.h b/src/server/collision/PrecompiledHeaders/collisionPCH.h deleted file mode 100644 index ece2ef1b8ef..00000000000 --- a/src/server/collision/PrecompiledHeaders/collisionPCH.h +++ /dev/null @@ -1,9 +0,0 @@ -#include "Define.h" -#include "VMapDefinitions.h" -#include "MapTree.h" -#include "WorldModel.h" -#include "ModelInstance.h" -#include "BoundingIntervalHierarchy.h" -#include "RegularGrid.h" -#include "BoundingIntervalHierarchyWrapper.h" -#include "GameObjectModel.h" diff --git a/src/server/database/CMakeLists.txt b/src/server/database/CMakeLists.txt new file mode 100644 index 00000000000..3fa7ed10aaf --- /dev/null +++ b/src/server/database/CMakeLists.txt @@ -0,0 +1,74 @@ +# Copyright (C) 2008-2015 TrinityCore +# +# 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. + +if( USE_COREPCH ) + include_directories(${CMAKE_CURRENT_BINARY_DIR}) +endif() + +file(GLOB_RECURSE sources_Database Database/*.cpp Database/*.h) +file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) +file(GLOB_RECURSE sources_Updater Updater/*.cpp Updater/*.h) + +file(GLOB sources_localdir *.cpp *.h) + +# +# Build shared sourcelist +# + +if (USE_COREPCH) + set(database_STAT_PCH_HDR PrecompiledHeaders/databasePCH.h) + set(database_STAT_PCH_SRC PrecompiledHeaders/databasePCH.cpp) +endif() + +set(database_STAT_SRCS + ${database_STAT_SRCS} + ${sources_Database} + ${sources_Logging} + ${sources_Updater} +) + +include_directories( + ${CMAKE_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour + ${CMAKE_SOURCE_DIR}/dep/SFMT + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/utf8cpp + ${CMAKE_SOURCE_DIR}/dep/process + ${CMAKE_SOURCE_DIR}/src/server + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/Database + ${CMAKE_CURRENT_SOURCE_DIR}/Logging + ${CMAKE_CURRENT_SOURCE_DIR}/Updater + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/server/shared + ${MYSQL_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR} # seems needed for Windows build + ${VALGRIND_INCLUDE_DIR} +) + +GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) + +add_library(database STATIC + ${database_STAT_SRCS} + ${database_STAT_PCH_SRC} +) + +# Generate precompiled header +if (USE_COREPCH) + add_cxx_pch(database ${database_STAT_PCH_HDR} ${database_STAT_PCH_SRC}) +endif () diff --git a/src/server/shared/Database/AdhocStatement.cpp b/src/server/database/Database/AdhocStatement.cpp similarity index 100% rename from src/server/shared/Database/AdhocStatement.cpp rename to src/server/database/Database/AdhocStatement.cpp diff --git a/src/server/shared/Database/AdhocStatement.h b/src/server/database/Database/AdhocStatement.h similarity index 100% rename from src/server/shared/Database/AdhocStatement.h rename to src/server/database/Database/AdhocStatement.h diff --git a/src/server/shared/Database/DatabaseEnv.h b/src/server/database/Database/DatabaseEnv.h similarity index 100% rename from src/server/shared/Database/DatabaseEnv.h rename to src/server/database/Database/DatabaseEnv.h diff --git a/src/server/shared/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp similarity index 100% rename from src/server/shared/Database/DatabaseLoader.cpp rename to src/server/database/Database/DatabaseLoader.cpp diff --git a/src/server/shared/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h similarity index 100% rename from src/server/shared/Database/DatabaseLoader.h rename to src/server/database/Database/DatabaseLoader.h diff --git a/src/server/shared/Database/DatabaseWorker.cpp b/src/server/database/Database/DatabaseWorker.cpp similarity index 100% rename from src/server/shared/Database/DatabaseWorker.cpp rename to src/server/database/Database/DatabaseWorker.cpp diff --git a/src/server/shared/Database/DatabaseWorker.h b/src/server/database/Database/DatabaseWorker.h similarity index 100% rename from src/server/shared/Database/DatabaseWorker.h rename to src/server/database/Database/DatabaseWorker.h diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h similarity index 100% rename from src/server/shared/Database/DatabaseWorkerPool.h rename to src/server/database/Database/DatabaseWorkerPool.h diff --git a/src/server/shared/Database/Field.cpp b/src/server/database/Database/Field.cpp similarity index 100% rename from src/server/shared/Database/Field.cpp rename to src/server/database/Database/Field.cpp diff --git a/src/server/shared/Database/Field.h b/src/server/database/Database/Field.h similarity index 100% rename from src/server/shared/Database/Field.h rename to src/server/database/Database/Field.h diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp similarity index 100% rename from src/server/shared/Database/Implementation/CharacterDatabase.cpp rename to src/server/database/Database/Implementation/CharacterDatabase.cpp diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h similarity index 100% rename from src/server/shared/Database/Implementation/CharacterDatabase.h rename to src/server/database/Database/Implementation/CharacterDatabase.h diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp similarity index 100% rename from src/server/shared/Database/Implementation/LoginDatabase.cpp rename to src/server/database/Database/Implementation/LoginDatabase.cpp diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h similarity index 100% rename from src/server/shared/Database/Implementation/LoginDatabase.h rename to src/server/database/Database/Implementation/LoginDatabase.h diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp similarity index 100% rename from src/server/shared/Database/Implementation/WorldDatabase.cpp rename to src/server/database/Database/Implementation/WorldDatabase.cpp diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h similarity index 100% rename from src/server/shared/Database/Implementation/WorldDatabase.h rename to src/server/database/Database/Implementation/WorldDatabase.h diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp similarity index 100% rename from src/server/shared/Database/MySQLConnection.cpp rename to src/server/database/Database/MySQLConnection.cpp diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h similarity index 100% rename from src/server/shared/Database/MySQLConnection.h rename to src/server/database/Database/MySQLConnection.h diff --git a/src/server/shared/Database/MySQLThreading.h b/src/server/database/Database/MySQLThreading.h similarity index 100% rename from src/server/shared/Database/MySQLThreading.h rename to src/server/database/Database/MySQLThreading.h diff --git a/src/server/shared/Database/PreparedStatement.cpp b/src/server/database/Database/PreparedStatement.cpp similarity index 100% rename from src/server/shared/Database/PreparedStatement.cpp rename to src/server/database/Database/PreparedStatement.cpp diff --git a/src/server/shared/Database/PreparedStatement.h b/src/server/database/Database/PreparedStatement.h similarity index 100% rename from src/server/shared/Database/PreparedStatement.h rename to src/server/database/Database/PreparedStatement.h diff --git a/src/server/shared/Database/QueryHolder.cpp b/src/server/database/Database/QueryHolder.cpp similarity index 100% rename from src/server/shared/Database/QueryHolder.cpp rename to src/server/database/Database/QueryHolder.cpp diff --git a/src/server/shared/Database/QueryHolder.h b/src/server/database/Database/QueryHolder.h similarity index 100% rename from src/server/shared/Database/QueryHolder.h rename to src/server/database/Database/QueryHolder.h diff --git a/src/server/shared/Database/QueryResult.cpp b/src/server/database/Database/QueryResult.cpp similarity index 100% rename from src/server/shared/Database/QueryResult.cpp rename to src/server/database/Database/QueryResult.cpp diff --git a/src/server/shared/Database/QueryResult.h b/src/server/database/Database/QueryResult.h similarity index 100% rename from src/server/shared/Database/QueryResult.h rename to src/server/database/Database/QueryResult.h diff --git a/src/server/shared/Database/SQLOperation.h b/src/server/database/Database/SQLOperation.h similarity index 100% rename from src/server/shared/Database/SQLOperation.h rename to src/server/database/Database/SQLOperation.h diff --git a/src/server/shared/Database/Transaction.cpp b/src/server/database/Database/Transaction.cpp similarity index 100% rename from src/server/shared/Database/Transaction.cpp rename to src/server/database/Database/Transaction.cpp diff --git a/src/server/shared/Database/Transaction.h b/src/server/database/Database/Transaction.h similarity index 100% rename from src/server/shared/Database/Transaction.h rename to src/server/database/Database/Transaction.h diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/database/Logging/AppenderDB.cpp similarity index 100% rename from src/server/shared/Logging/AppenderDB.cpp rename to src/server/database/Logging/AppenderDB.cpp diff --git a/src/server/shared/Logging/AppenderDB.h b/src/server/database/Logging/AppenderDB.h similarity index 100% rename from src/server/shared/Logging/AppenderDB.h rename to src/server/database/Logging/AppenderDB.h diff --git a/src/server/database/PrecompiledHeaders/databasePCH.cpp b/src/server/database/PrecompiledHeaders/databasePCH.cpp new file mode 100644 index 00000000000..f84a52be82a --- /dev/null +++ b/src/server/database/PrecompiledHeaders/databasePCH.cpp @@ -0,0 +1 @@ +#include "PrecompiledHeaders/databasePCH.h" diff --git a/src/server/database/PrecompiledHeaders/databasePCH.h b/src/server/database/PrecompiledHeaders/databasePCH.h new file mode 100644 index 00000000000..d524d52ade0 --- /dev/null +++ b/src/server/database/PrecompiledHeaders/databasePCH.h @@ -0,0 +1,23 @@ +#include "Config.h" +#include "Database/AdhocStatement.h" +#include "Database/DatabaseEnv.h" +#include "Database/DatabaseLoader.h" +#include "Database/DatabaseWorker.h" +#include "Database/DatabaseWorkerPool.h" +#include "Database/Field.h" +#include "Database/MySQLConnection.h" +#include "Database/MySQLThreading.h" +#include "Database/PreparedStatement.h" +#include "Database/QueryHolder.h" +#include "Database/QueryResult.h" +#include "Database/SQLOperation.h" +#include "Database/Transaction.h" +#include "Logging/Appender.h" +#include "Logging/AppenderConsole.h" +#include "Logging/AppenderDB.h" +#include "Logging/AppenderFile.h" +#include "Logging/Log.h" +#include "Logging/LogOperation.h" +#include "Logging/Logger.h" +#include "Updater/DBUpdater.h" +#include "Updater/UpdateFetcher.h" diff --git a/src/server/shared/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp similarity index 100% rename from src/server/shared/Updater/DBUpdater.cpp rename to src/server/database/Updater/DBUpdater.cpp diff --git a/src/server/shared/Updater/DBUpdater.h b/src/server/database/Updater/DBUpdater.h similarity index 100% rename from src/server/shared/Updater/DBUpdater.h rename to src/server/database/Updater/DBUpdater.h diff --git a/src/server/shared/Updater/UpdateFetcher.cpp b/src/server/database/Updater/UpdateFetcher.cpp similarity index 100% rename from src/server/shared/Updater/UpdateFetcher.cpp rename to src/server/database/Updater/UpdateFetcher.cpp diff --git a/src/server/shared/Updater/UpdateFetcher.h b/src/server/database/Updater/UpdateFetcher.h similarity index 100% rename from src/server/shared/Updater/UpdateFetcher.h rename to src/server/database/Updater/UpdateFetcher.h diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 66425ed2dc7..ccc69b3ef68 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -112,25 +112,28 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zlib - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Models - ${CMAKE_SOURCE_DIR}/src/server/collision/Maps + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Database ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging ${CMAKE_SOURCE_DIR}/src/server/shared/Networking ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Accounts ${CMAKE_CURRENT_SOURCE_DIR}/Achievements diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 57f145eb15a..db15ce8c36d 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -52,24 +52,26 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zlib + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Database ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Models + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Logging ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Database ${CMAKE_SOURCE_DIR}/src/server/game/Accounts ${CMAKE_SOURCE_DIR}/src/server/game/Achievements ${CMAKE_SOURCE_DIR}/src/server/game/Addons diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index d68ddf85ff3..1653d605faa 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -12,25 +12,16 @@ if( USE_COREPCH ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() -file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h) file(GLOB_RECURSE sources_Cryptography Cryptography/*.cpp Cryptography/*.h) -file(GLOB_RECURSE sources_Database Database/*.cpp Database/*.h) file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h) file(GLOB_RECURSE sources_Dynamic Dynamic/*.cpp Dynamic/*.h) -file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) file(GLOB_RECURSE sources_Networking Networking/*.cpp Networking/*.h) file(GLOB_RECURSE sources_Packets Packets/*.cpp Packets/*.h) -file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) -file(GLOB_RECURSE sources_Updater Updater/*.cpp Updater/*.h) -file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h) - +if( WIN32 ) + file(GLOB_RECURSE sources_Service Service/*.cpp Service/*.h) +endif( WIN32 ) file(GLOB sources_localdir *.cpp *.h) -# Manually set sources for Debugging directory as we don't want to include WheatyExceptionReport in shared project -# It needs to be included both in authserver and worldserver for the static global variable to be properly initialized -# and to handle crash logs on windows -set(sources_Debugging Debugging/Errors.cpp Debugging/Errors.h) - # # Build shared sourcelist # @@ -42,18 +33,13 @@ endif() set(shared_STAT_SRCS ${shared_STAT_SRCS} - ${sources_Configuration} ${sources_Cryptography} - ${sources_Database} ${sources_DataStores} - ${sources_Debugging} ${sources_Dynamic} - ${sources_Logging} ${sources_Networking} ${sources_Packets} - ${sources_Threading} - ${sources_Updater} ${sources_Utilities} + ${sources_Service} ${sources_localdir} ) @@ -65,20 +51,25 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/utf8cpp ${CMAKE_SOURCE_DIR}/dep/process ${CMAKE_SOURCE_DIR}/src/server + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Configuration ${CMAKE_CURRENT_SOURCE_DIR}/Cryptography - ${CMAKE_CURRENT_SOURCE_DIR}/Database ${CMAKE_CURRENT_SOURCE_DIR}/DataStores - ${CMAKE_CURRENT_SOURCE_DIR}/Debugging ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic - ${CMAKE_CURRENT_SOURCE_DIR}/Logging ${CMAKE_CURRENT_SOURCE_DIR}/Networking ${CMAKE_CURRENT_SOURCE_DIR}/Packets - ${CMAKE_CURRENT_SOURCE_DIR}/Threading - ${CMAKE_CURRENT_SOURCE_DIR}/Utilities - ${CMAKE_CURRENT_SOURCE_DIR}/Updater - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object + ${CMAKE_CURRENT_SOURCE_DIR}/Service + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Logging ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} diff --git a/src/server/shared/PrecompiledHeaders/sharedPCH.h b/src/server/shared/PrecompiledHeaders/sharedPCH.h index f4c18f89ec1..c09b24e6fd9 100644 --- a/src/server/shared/PrecompiledHeaders/sharedPCH.h +++ b/src/server/shared/PrecompiledHeaders/sharedPCH.h @@ -1,11 +1,4 @@ //add here most rarely modified headers to speed up debug build compilation -#include "Common.h" -#include "Log.h" -#include "DatabaseWorker.h" -#include "SQLOperation.h" -#include "Errors.h" #include "TypeList.h" -#include "TaskScheduler.h" -#include "EventMap.h" #include "Revision.h" diff --git a/src/server/shared/Utilities/ServiceWin32.cpp b/src/server/shared/Service/ServiceWin32.cpp similarity index 100% rename from src/server/shared/Utilities/ServiceWin32.cpp rename to src/server/shared/Service/ServiceWin32.cpp diff --git a/src/server/shared/Utilities/ServiceWin32.h b/src/server/shared/Service/ServiceWin32.h similarity index 100% rename from src/server/shared/Utilities/ServiceWin32.h rename to src/server/shared/Service/ServiceWin32.h diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index a6c76977fe2..f513ba0857f 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -49,24 +49,23 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Models + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Configuration ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Database ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging ${CMAKE_SOURCE_DIR}/src/server/shared/Networking ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities + ${CMAKE_SOURCE_DIR}/src/server/shared/Service ${CMAKE_SOURCE_DIR}/src/server/game ${CMAKE_SOURCE_DIR}/src/server/game/Accounts ${CMAKE_SOURCE_DIR}/src/server/game/Achievements @@ -135,6 +134,14 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/World ${CMAKE_SOURCE_DIR}/src/server/authserver/Server ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Logging ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess @@ -165,9 +172,10 @@ set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAG target_link_libraries(worldserver game + common shared + database scripts - collision g3dlib gsoap Detour diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt index 48e30b1c3cf..52a7f5504d6 100644 --- a/src/tools/mmaps_generator/CMakeLists.txt +++ b/src/tools/mmaps_generator/CMakeLists.txt @@ -21,13 +21,15 @@ set(mmap_gen_Includes ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Maps - ${CMAKE_SOURCE_DIR}/src/server/collision/Models + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities ) if( WIN32 ) @@ -42,7 +44,7 @@ include_directories(${mmap_gen_Includes}) add_executable(mmaps_generator ${mmap_gen_sources}) target_link_libraries(mmaps_generator - collision + common g3dlib Recast Detour diff --git a/src/tools/vmap4_assembler/CMakeLists.txt b/src/tools/vmap4_assembler/CMakeLists.txt index dfd6c7d4dd4..4513bdaf316 100644 --- a/src/tools/vmap4_assembler/CMakeLists.txt +++ b/src/tools/vmap4_assembler/CMakeLists.txt @@ -13,9 +13,10 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/g3dlite/include ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Maps - ${CMAKE_SOURCE_DIR}/src/server/collision/Models + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models ${ZLIB_INCLUDE_DIR} ) @@ -26,7 +27,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin") endif() target_link_libraries(vmap4assembler - collision + common g3dlib ${ZLIB_LIBRARIES} ) From 2f92a2f58e171bbfa6dc06d3b2663cbf384a7d38 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 16 Aug 2015 22:29:56 +0200 Subject: [PATCH 019/110] Scripts/Misc: Replace some unsafe WorldObject* class members in scripts with ObjectGuid Replace some unsafe WorldObject* class members and derived types in scripts with ObjectGuid. Code cleanup. --- .../BlackrockDepths/blackrock_depths.cpp | 581 ------------------ .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 3 +- .../TempleOfAhnQiraj/boss_twinemperors.cpp | 3 +- .../boss_faction_champions.cpp | 6 +- .../PitOfSaron/boss_krickandick.cpp | 7 +- .../PitOfSaron/boss_scourgelord_tyrannus.cpp | 7 +- .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 7 +- .../IcecrownCitadel/boss_the_lich_king.cpp | 9 +- .../Nexus/Nexus/boss_keristrasza.cpp | 8 +- .../Ulduar/Ulduar/boss_flame_leviathan.cpp | 12 +- .../Northrend/Ulduar/Ulduar/boss_freya.cpp | 15 +- .../Northrend/Ulduar/Ulduar/boss_ignis.cpp | 6 +- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 14 +- .../Ulduar/Ulduar/boss_yogg_saron.cpp | 9 +- .../scripts/Northrend/zone_storm_peaks.cpp | 4 +- .../boss_morogrim_tidewalker.cpp | 4 +- .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 3 +- 17 files changed, 50 insertions(+), 648 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index dd49f01624b..9c9dfe38349 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -579,105 +579,6 @@ enum DughalQuests #define SAY_DUGHAL_FREE "Thank you, $N! I'm free!!!" #define GOSSIP_DUGHAL "You're free, Dughal! Get out of here!" -/* -class npc_dughal_stormwing : public CreatureScript -{ -public: - npc_dughal_stormwing() : CreatureScript("npc_dughal_stormwing") { } - - CreatureAI* GetAI(Creature* creature) const override - { - npc_dughal_stormwingAI* dughal_stormwingAI = new npc_dughal_stormwingAI(creature); - - dughal_stormwingAI->AddWaypoint(0, 280.42f, -82.86f, -77.12f, 0); - dughal_stormwingAI->AddWaypoint(1, 287.64f, -87.01f, -76.79f, 0); - dughal_stormwingAI->AddWaypoint(2, 354.63f, -64.95f, -67.53f, 0); - - return dughal_stormwingAI; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(false, true, player->GetGUID()); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_IN_PROGRESS); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_JAIL_BREAK) == QUEST_STATUS_INCOMPLETE && instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUGHAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2846, creature->GetGUID()); - } - return true; - } - - struct npc_dughal_stormwingAI : public npc_escortAI - { - npc_dughal_stormwingAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) - { - case 0: - me->Say(SAY_DUGHAL_FREE, LANG_UNIVERSAL, PlayerGUID); - break; - case 1: - instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_OBJECTIVE_COMPLETED); - break; - case 2: - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); - break; - } - } - - void EnterCombat(Unit* who) override { } - void Reset() override { } - - void JustDied(Unit* killer) override - { - if (IsBeingEscorted && killer == me) - { - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); - } - } - - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return; - if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_ENDED) - { - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - else - { - me->SetVisible(true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - npc_escortAI::UpdateAI(diff); - } - }; -}; - - */ - // npc_marshal_windsor #define SAY_WINDSOR_AGGRO1 "You locked up the wrong Marshal. Prepare to be destroyed!" #define SAY_WINDSOR_AGGRO2 "I bet you're sorry now, aren't you !?!!" @@ -694,168 +595,6 @@ enum MarshalWindsor NPC_REGINALD_WINDSOR = 9682 }; -/* -Player* playerStart; -class npc_marshal_windsor : public CreatureScript -{ -public: - npc_marshal_windsor() : CreatureScript("npc_marshal_windsor") { } - - CreatureAI* GetAI(Creature* creature) const override - { - npc_marshal_windsorAI* marshal_windsorAI = new npc_marshal_windsorAI(creature); - - marshal_windsorAI->AddWaypoint(0, 316.336f, -225.528f, -77.7258f, 7000); - marshal_windsorAI->AddWaypoint(1, 316.336f, -225.528f, -77.7258f, 2000); - marshal_windsorAI->AddWaypoint(2, 322.96f, -207.13f, -77.87f, 0); - marshal_windsorAI->AddWaypoint(3, 281.05f, -172.16f, -75.12f, 0); - marshal_windsorAI->AddWaypoint(4, 272.19f, -139.14f, -70.61f, 0); - marshal_windsorAI->AddWaypoint(5, 283.62f, -116.09f, -70.21f, 0); - marshal_windsorAI->AddWaypoint(6, 296.18f, -94.30f, -74.08f, 0); - marshal_windsorAI->AddWaypoint(7, 294.57f, -93.11f, -74.08f, 0); - marshal_windsorAI->AddWaypoint(8, 314.31f, -74.31f, -76.09f, 0); - marshal_windsorAI->AddWaypoint(9, 360.22f, -62.93f, -66.77f, 0); - marshal_windsorAI->AddWaypoint(10, 383.38f, -69.40f, -63.25f, 0); - marshal_windsorAI->AddWaypoint(11, 389.99f, -67.86f, -62.57f, 0); - marshal_windsorAI->AddWaypoint(12, 400.98f, -72.01f, -62.31f, 0); - marshal_windsorAI->AddWaypoint(13, 404.22f, -62.30f, -63.50f, 2300); - marshal_windsorAI->AddWaypoint(14, 404.22f, -62.30f, -63.50f, 1500); - marshal_windsorAI->AddWaypoint(15, 407.65f, -51.86f, -63.96f, 0); - marshal_windsorAI->AddWaypoint(16, 403.61f, -51.71f, -63.92f, 1000); - marshal_windsorAI->AddWaypoint(17, 403.61f, -51.71f, -63.92f, 2000); - marshal_windsorAI->AddWaypoint(18, 403.61f, -51.71f, -63.92f, 1000); - marshal_windsorAI->AddWaypoint(19, 403.61f, -51.71f, -63.92f, 0); - - return marshal_windsorAI; - } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == 4322) - { - PlayerStart = player; - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) - { - CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_IN_PROGRESS); - creature->setFaction(11); - } - } - return false; - } - - struct npc_marshal_windsorAI : public npc_escortAI - { - npc_marshal_windsorAI(Creature* creature) : npc_escortAI(creature) - { - instance = creature->GetInstanceScript(); - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) - { - case 1: - me->Say(SAY_WINDSOR_1, LANG_UNIVERSAL, PlayerGUID); - break; - case 7: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_WINDSOR_4_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold = true; - break; - case 10: - me->setFaction(534); - break; - case 12: - me->Say(SAY_WINDSOR_6, LANG_UNIVERSAL, PlayerGUID); - instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_IN_PROGRESS); - break; - case 13: - me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK - break; - case 14: - instance->SetData(DATA_GATE_SR, 0); - me->setFaction(11); - break; - case 16: - me->Say(SAY_WINDSOR_9, LANG_UNIVERSAL, PlayerGUID); - break; - case 17: - me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK - break; - case 18: - instance->SetData(DATA_GATE_SC, 0); - break; - case 19: - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SummonCreature(NPC_REGINALD_WINDSOR, 403.61f, -51.71f, -63.92f, 3.600434f, TEMPSUMMON_DEAD_DESPAWN, 0); - instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_ENDED); - break; - } - } - - void EnterCombat(Unit* who) override - { - switch (urand(0, 2)) - { - case 0: - me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); - break; - case 1: - me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); - break; - case 2: - me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); - break; - } - } - - void Reset() override { } - - void JustDied(Unit* slayer) override - { - instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_FAILED); - } - - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) - return; - - if (instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) - SetEscortPaused(false); - - if (!instance->GetData(DATA_GATE_D) && instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_NOT_STARTED) - { - me->Say(SAY_WINDSOR_4_2, LANG_UNIVERSAL, PlayerGUID); - instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_BEFORE_START); - } - if (instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) - { - me->Say(SAY_WINDSOR_4_3, LANG_UNIVERSAL, PlayerGUID); - instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED); - } - if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_SUPPLY_ROOM) == ENCOUNTER_STATE_ENDED) - { - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - else - { - me->SetVisible(true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - npc_escortAI::UpdateAI(diff); - } - }; -}; - - */ - // npc_marshal_reginald_windsor #define SAY_REGINALD_WINDSOR_0_1 "Can you feel the power, $N??? It's time to ROCK!" #define SAY_REGINALD_WINDSOR_0_2 "Now we just have to free Tobias and we can get out of here. This way!" @@ -878,320 +617,6 @@ enum MarshalReginaldWindor NPC_CREST_KILLER = 9680 }; -/* -int wp = 0; -class npc_marshal_reginald_windsor : public CreatureScript -{ -public: - npc_marshal_reginald_windsor() : CreatureScript("npc_marshal_reginald_windsor") { } - - CreatureAI* GetAI(Creature* creature) const override - { - npc_marshal_reginald_windsorAI* marshal_reginald_windsorAI = new npc_marshal_reginald_windsorAI(creature); - - marshal_reginald_windsorAI->AddWaypoint(0, 403.61f, -52.71f, -63.92f, 4000); - marshal_reginald_windsorAI->AddWaypoint(1, 403.61f, -52.71f, -63.92f, 4000); - marshal_reginald_windsorAI->AddWaypoint(2, 406.33f, -54.87f, -63.95f, 0); - marshal_reginald_windsorAI->AddWaypoint(3, 407.99f, -73.91f, -62.26f, 0); - marshal_reginald_windsorAI->AddWaypoint(4, 557.03f, -119.71f, -61.83f, 0); - marshal_reginald_windsorAI->AddWaypoint(5, 573.40f, -124.39f, -65.07f, 0); - marshal_reginald_windsorAI->AddWaypoint(6, 593.91f, -130.29f, -69.25f, 0); - marshal_reginald_windsorAI->AddWaypoint(7, 593.21f, -132.16f, -69.25f, 0); - marshal_reginald_windsorAI->AddWaypoint(8, 593.21f, -132.16f, -69.25f, 3000); - marshal_reginald_windsorAI->AddWaypoint(9, 622.81f, -135.55f, -71.92f, 0); - marshal_reginald_windsorAI->AddWaypoint(10, 634.68f, -151.29f, -70.32f, 0); - marshal_reginald_windsorAI->AddWaypoint(11, 635.06f, -153.25f, -70.32f, 0); - marshal_reginald_windsorAI->AddWaypoint(12, 635.06f, -153.25f, -70.32f, 3000); - marshal_reginald_windsorAI->AddWaypoint(13, 635.06f, -153.25f, -70.32f, 1500); - marshal_reginald_windsorAI->AddWaypoint(14, 655.25f, -172.39f, -73.72f, 0); - marshal_reginald_windsorAI->AddWaypoint(15, 654.79f, -226.30f, -83.06f, 0); - marshal_reginald_windsorAI->AddWaypoint(16, 622.85f, -268.85f, -83.96f, 0); - marshal_reginald_windsorAI->AddWaypoint(17, 579.45f, -275.56f, -80.44f, 0); - marshal_reginald_windsorAI->AddWaypoint(18, 561.19f, -266.85f, -75.59f, 0); - marshal_reginald_windsorAI->AddWaypoint(19, 547.91f, -253.92f, -70.34f, 0); - marshal_reginald_windsorAI->AddWaypoint(20, 549.20f, -252.40f, -70.34f, 0); - marshal_reginald_windsorAI->AddWaypoint(21, 549.20f, -252.40f, -70.34f, 4000); - marshal_reginald_windsorAI->AddWaypoint(22, 555.33f, -269.16f, -74.40f, 0); - marshal_reginald_windsorAI->AddWaypoint(23, 554.31f, -270.88f, -74.40f, 0); - marshal_reginald_windsorAI->AddWaypoint(24, 554.31f, -270.88f, -74.40f, 4000); - marshal_reginald_windsorAI->AddWaypoint(25, 536.10f, -249.60f, -67.47f, 0); - marshal_reginald_windsorAI->AddWaypoint(26, 520.94f, -216.65f, -59.28f, 0); - marshal_reginald_windsorAI->AddWaypoint(27, 505.99f, -148.74f, -62.17f, 0); - marshal_reginald_windsorAI->AddWaypoint(28, 484.21f, -56.24f, -62.43f, 0); - marshal_reginald_windsorAI->AddWaypoint(29, 470.39f, -6.01f, -70.10f, 0); - marshal_reginald_windsorAI->AddWaypoint(30, 451.27f, 30.85f, -70.07f, 0); - marshal_reginald_windsorAI->AddWaypoint(31, 452.45f, 29.85f, -70.37f, 1500); - marshal_reginald_windsorAI->AddWaypoint(32, 452.45f, 29.85f, -70.37f, 7000); - marshal_reginald_windsorAI->AddWaypoint(33, 452.45f, 29.85f, -70.37f, 10000); - marshal_reginald_windsorAI->AddWaypoint(34, 451.27f, 31.85f, -70.07f, 0); - - return marshal_reginald_windsorAI; - } - - struct npc_marshal_reginald_windsorAI : public npc_escortAI - { - npc_marshal_reginald_windsorAI(Creature* creature) : npc_escortAI(creature) - { - } - - void WaypointReached(uint32 waypointId) override - { - wp = waypointId; - switch (waypointId) - { - case 0: - me->setFaction(11); - me->Say(SAY_REGINALD_WINDSOR_0_1, LANG_UNIVERSAL, PlayerGUID); - break; - case 1: - me->Say(SAY_REGINALD_WINDSOR_0_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 7: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_5_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 8: - me->Say(SAY_REGINALD_WINDSOR_5_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 11: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_7_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 12: - me->Say(SAY_REGINALD_WINDSOR_7_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 13: - me->Say(SAY_REGINALD_WINDSOR_7_3, LANG_UNIVERSAL, PlayerGUID); - break; - case 20: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_13_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 21: - me->Say(SAY_REGINALD_WINDSOR_13_3, LANG_UNIVERSAL, PlayerGUID); - break; - case 23: - me->HandleEmoteCommand(EMOTE_STATE_POINT); - me->Say(SAY_REGINALD_WINDSOR_14_1, LANG_UNIVERSAL, PlayerGUID); - IsOnHold=true; - break; - case 24: - me->Say(SAY_REGINALD_WINDSOR_14_2, LANG_UNIVERSAL, PlayerGUID); - break; - case 31: - me->Say(SAY_REGINALD_WINDSOR_20_1, LANG_UNIVERSAL, PlayerGUID); - break; - case 32: - me->Say(SAY_REGINALD_WINDSOR_20_2, LANG_UNIVERSAL, PlayerGUID); - PlayerStart->GroupEventHappens(QUEST_JAIL_BREAK, me); - instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED); - break; - } - } - - void MoveInLineOfSight(Unit* who) override - - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - return; - - if (Player* player = who->ToPlayer()) - { - if (player->GetQuestStatus(4322) == QUEST_STATUS_INCOMPLETE) - { - float Radius = 10.0f; - if (me->IsWithinDistInMap(who, Radius)) - { - SetEscortPaused(false); - Start(true, false, who->GetGUID()); - } - } - } - } - - void EnterCombat(Unit* who) override - { - switch (urand(0, 2)) - { - case 0: - me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); - break; - case 1: - me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); - break; - case 2: - me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); - break; - } - } - void Reset() override { } - - void JustDied(Unit* slayer) override - { - instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_FAILED); - } - - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) - return; - - if (wp == 7) - { - if (!instance->GetData(DATA_GATE_J) && instance->GetData(DATA_JAZ) == ENCOUNTER_STATE_NOT_STARTED) - { - instance->SetData(DATA_NPC_JAZ, 1); - instance->SetData(DATA_JAZ, ENCOUNTER_STATE_IN_PROGRESS); - } - if (instance->GetData(DATA_NPC_JAZ) && instance->GetData(DATA_NPC_OGRABISI) && instance->GetData(DATA_JAZ) == ENCOUNTER_STATE_IN_PROGRESS) - { - SetEscortPaused(false); - instance->SetData(DATA_JAZ, ENCOUNTER_STATE_ENDED); - } - } - else if (wp == 11) - { - if (!instance->GetData(DATA_GATE_S) && instance->GetData(DATA_SHILL) == ENCOUNTER_STATE_NOT_STARTED) - { - instance->SetData(DATA_NPC_SHILL, 1); - instance->SetData(DATA_SHILL, ENCOUNTER_STATE_IN_PROGRESS); - } - if (instance->GetData(DATA_NPC_SHILL) && instance->GetData(DATA_SHILL) == ENCOUNTER_STATE_IN_PROGRESS) - { - instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED); - SetEscortPaused(false); - } - } - else if (wp == 20) - { - if (!instance->GetData(DATA_GATE_C) && instance->GetData(DATA_CREST) == ENCOUNTER_STATE_NOT_STARTED) - { - instance->SetData(DATA_NPC_CREST, 1); - me->Say(SAY_REGINALD_WINDSOR_13_2, LANG_UNIVERSAL, PlayerGUID); - instance->SetData(DATA_CREST, ENCOUNTER_STATE_IN_PROGRESS); - } - if (instance->GetData(DATA_NPC_CREST) && instance->GetData(DATA_CREST) == ENCOUNTER_STATE_IN_PROGRESS) - { - SetEscortPaused(false); - instance->SetData(DATA_CREST, ENCOUNTER_STATE_ENDED); - } - } - if (instance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) SetEscortPaused(false); - npc_escortAI::UpdateAI(diff); - } - }; -}; -*/ - -// npc_tobias_seecher -#define SAY_TOBIAS_FREE "Thank you! I will run for safety immediately!" - -/* -class npc_tobias_seecher : public CreatureScript -{ -public: - npc_tobias_seecher() : CreatureScript("npc_tobias_seecher") { } - - CreatureAI* GetAI(Creature* creature) const override - { - npc_tobias_seecherAI* tobias_seecherAI = new npc_tobias_seecherAI(creature); - - tobias_seecherAI->AddWaypoint(0, 549.21f, -281.07f, -75.27f); - tobias_seecherAI->AddWaypoint(1, 554.39f, -267.39f, -73.68f); - tobias_seecherAI->AddWaypoint(2, 533.59f, -249.38f, -67.04f); - tobias_seecherAI->AddWaypoint(3, 519.44f, -217.02f, -59.34f); - tobias_seecherAI->AddWaypoint(4, 506.55f, -153.49f, -62.34f); - - return tobias_seecherAI; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(false, true, player->GetGUID()); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_IN_PROGRESS); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_JAIL_BREAK) == QUEST_STATUS_INCOMPLETE && instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Get out of here, Tobias, you're free!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2847, creature->GetGUID()); - } - return true; - } - - struct npc_tobias_seecherAI : public npc_escortAI - { - npc_tobias_seecherAI(Creature* creature) : npc_escortAI(creature) { } - - void EnterCombat(Unit* who) override { } - void Reset() override { } - - void JustDied(Unit* killer) override - { - if (IsBeingEscorted && killer == me) - { - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED); - } - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) - { - case 0: - me->Say(SAY_TOBIAS_FREE, LANG_UNIVERSAL, PlayerGUID); - break; - case 2: - instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_OBJECTIVE_COMPLETED); - break; - case 4: - me->SetVisible(false); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED); - break; - } - } - - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) - return; - - if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_ENDED) - { - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - else - { - me->SetVisible(true); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - npc_escortAI::UpdateAI(diff); - } - }; -}; - -*/ - // npc_rocknot enum RocknotSays { @@ -1349,10 +774,4 @@ void AddSC_blackrock_depths() new npc_kharan_mighthammer(); new npc_lokhtos_darkbargainer(); new npc_rocknot(); - // Fix us - /*new npc_dughal_stormwing(); - new npc_tobias_seecher(); - new npc_marshal_windsor(); - new npc_marshal_reginald_windsor(); - */ } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 5b338dd8860..f967bd6a217 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -536,8 +536,7 @@ public: void SpawnEyeTentacle(float x, float y) { - Creature* Spawned; - Spawned = DoSpawnCreature(NPC_EYE_TENTACLE, x, y, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 500); + Creature* Spawned = DoSpawnCreature(NPC_EYE_TENTACLE, x, y, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 500); if (Spawned && Spawned->AI()) if (Unit* target = SelectRandomNotStomach()) Spawned->AI()->AttackStart(target); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 65ffb7fd696..b39ce0307a5 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -559,8 +559,7 @@ public: if (ArcaneBurst_Timer <= diff) { - Unit* mvic; - if ((mvic=SelectTarget(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true)) != NULL) + if (Unit* mvic = SelectTarget(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true)) { DoCast(mvic, SPELL_ARCANEBURST); ArcaneBurst_Timer = 5000; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 758b4d25c43..f50a26eae23 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -664,10 +664,9 @@ struct boss_faction_championsAI : public BossAI { std::list const& tList = me->getThreatManager().getThreatList(); std::list::const_iterator iter; - Unit* target; for (iter = tList.begin(); iter!=tList.end(); ++iter) { - target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); + Unit* target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); if (target && target->getPowerType() == POWER_MANA) return target; } @@ -679,10 +678,9 @@ struct boss_faction_championsAI : public BossAI std::list const& tList = me->getThreatManager().getThreatList(); std::list::const_iterator iter; uint32 count = 0; - Unit* target; for (iter = tList.begin(); iter != tList.end(); ++iter) { - target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); + Unit* target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); if (target && me->GetDistance2d(target) < distance) ++count; } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index fd0fff44f66..c19af1cf79d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -137,9 +137,8 @@ class boss_ick : public CreatureScript struct boss_ickAI : public BossAI { - boss_ickAI(Creature* creature) : BossAI(creature, DATA_ICK), _vehicle(creature->GetVehicleKit()) + boss_ickAI(Creature* creature) : BossAI(creature, DATA_ICK) { - ASSERT(_vehicle); _tempThreat = 0; } @@ -177,7 +176,8 @@ class boss_ick : public CreatureScript { if (Creature* krick = GetKrick()) { - _vehicle->RemoveAllPassengers(); + if (Vehicle* _vehicle = me->GetVehicleKit()) + _vehicle->RemoveAllPassengers(); if (krick->AI()) krick->AI()->DoAction(ACTION_OUTRO); } @@ -268,7 +268,6 @@ class boss_ick : public CreatureScript } private: - Vehicle* _vehicle; float _tempThreat; }; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 3384b562860..3e56f9a1753 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -290,9 +290,8 @@ class boss_rimefang : public CreatureScript struct boss_rimefangAI : public ScriptedAI { - boss_rimefangAI(Creature* creature) : ScriptedAI(creature), _vehicle(creature->GetVehicleKit()) + boss_rimefangAI(Creature* creature) : ScriptedAI(creature) { - ASSERT(_vehicle); Initialize(); } @@ -314,7 +313,8 @@ class boss_rimefang : public CreatureScript void JustReachedHome() override { - _vehicle->InstallAllAccessories(false); + if (Vehicle* _vehicle = me->GetVehicleKit()) + _vehicle->InstallAllAccessories(false); } void DoAction(int32 actionId) override @@ -376,7 +376,6 @@ class boss_rimefang : public CreatureScript } private: - Vehicle* _vehicle; ObjectGuid _hoarfrostTargetGUID; EventMap _events; uint8 _currentWaypoint; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 79f9a6e7c61..f3b70f069c4 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -110,9 +110,8 @@ class npc_iceborn_protodrake : public CreatureScript struct npc_iceborn_protodrakeAI: public ScriptedAI { - npc_iceborn_protodrakeAI(Creature* creature) : ScriptedAI(creature), _vehicle(creature->GetVehicleKit()) + npc_iceborn_protodrakeAI(Creature* creature) : ScriptedAI(creature) { - ASSERT(_vehicle); Initialize(); } @@ -128,7 +127,8 @@ class npc_iceborn_protodrake : public CreatureScript void EnterCombat(Unit* /*who*/) override { - _vehicle->RemoveAllPassengers(); + if (Vehicle* _vehicle = me->GetVehicleKit()) + _vehicle->RemoveAllPassengers(); } void UpdateAI(uint32 diff) override @@ -148,7 +148,6 @@ class npc_iceborn_protodrake : public CreatureScript } private: - Vehicle* _vehicle; uint32 _frostBreathCooldown; }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 07816ebbe39..6c512546a24 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -432,20 +432,21 @@ class StartMovementEvent : public BasicEvent { public: StartMovementEvent(Creature* summoner, Creature* owner) - : _summoner(summoner), _owner(owner) + : _summonerGuid(summoner->GetGUID()), _owner(owner) { } bool Execute(uint64 /*time*/, uint32 /*diff*/) { _owner->SetReactState(REACT_AGGRESSIVE); - if (Unit* target = _summoner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(_summoner))) - _owner->AI()->AttackStart(target); + if (Creature* _summoner = ObjectAccessor::GetCreature(*_owner, _summonerGuid)) + if (Unit* target = _summoner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(_summoner))) + _owner->AI()->AttackStart(target); return true; } private: - Creature* _summoner; + ObjectGuid _summonerGuid; Creature* _owner; }; diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 2c9d88eac8a..495cf85b759 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -117,14 +117,12 @@ class boss_keristrasza : public CreatureScript ContainmentSphereGUIDs[1] = instance->GetGuidData(ORMOROKS_CONTAINMET_SPHERE); ContainmentSphereGUIDs[2] = instance->GetGuidData(TELESTRAS_CONTAINMET_SPHERE); - GameObject* ContainmentSpheres[DATA_CONTAINMENT_SPHERES]; - for (uint8 i = 0; i < DATA_CONTAINMENT_SPHERES; ++i) { - ContainmentSpheres[i] = ObjectAccessor::GetGameObject(*me, ContainmentSphereGUIDs[i]); - if (!ContainmentSpheres[i]) + GameObject* ContainmentSphere = ObjectAccessor::GetGameObject(*me, ContainmentSphereGUIDs[i]); + if (!ContainmentSphere) return false; - if (ContainmentSpheres[i]->GetGoState() != GO_STATE_ACTIVE) + if (ContainmentSphere->GetGoState() != GO_STATE_ACTIVE) return false; } if (remove_prison) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index a04c809f893..61d64413178 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -224,7 +224,7 @@ class boss_flame_leviathan : public CreatureScript struct boss_flame_leviathanAI : public BossAI { - boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN), vehicle(creature->GetVehicleKit()) + boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN) { Initialize(); } @@ -244,7 +244,6 @@ class boss_flame_leviathan : public CreatureScript void InitializeAI() override { - ASSERT(vehicle); if (!me->isDead()) Reset(); @@ -256,7 +255,6 @@ class boss_flame_leviathan : public CreatureScript me->SetReactState(REACT_PASSIVE); } - Vehicle* vehicle; uint8 ActiveTowersCount; uint8 Shutdown; bool ActiveTowers; @@ -339,7 +337,7 @@ class boss_flame_leviathan : public CreatureScript void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override { if (spell->Id == SPELL_START_THE_ENGINE) - vehicle->InstallAllAccessories(false); + ASSERT_NOTNULL(me->GetVehicleKit())->InstallAllAccessories(false); if (spell->Id == SPELL_ELECTROSHOCK) me->InterruptSpell(CURRENT_CHANNELED_SPELL); @@ -584,16 +582,14 @@ class boss_flame_leviathan_seat : public CreatureScript struct boss_flame_leviathan_seatAI : public ScriptedAI { - boss_flame_leviathan_seatAI(Creature* creature) : ScriptedAI(creature), vehicle(creature->GetVehicleKit()) + boss_flame_leviathan_seatAI(Creature* creature) : ScriptedAI(creature) { - ASSERT(vehicle); me->SetReactState(REACT_PASSIVE); me->SetDisplayId(me->GetCreatureTemplate()->Modelid2); instance = creature->GetInstanceScript(); } InstanceScript* instance; - Vehicle* vehicle; void PassengerBoarded(Unit* who, int8 seatId, bool apply) override { @@ -628,7 +624,7 @@ class boss_flame_leviathan_seat : public CreatureScript if (apply) return; - if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE)) + if (Unit* device = ASSERT_NOTNULL(me->GetVehicleKit())->GetPassenger(SEAT_DEVICE)) { device->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 05bdb568a2e..818bb0041a9 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -611,17 +611,16 @@ class boss_freya : public CreatureScript me->DespawnOrUnsummon(7500); me->CastSpell(me, SPELL_KNOCK_ON_WOOD_CREDIT, true); - Creature* Elder[3]; for (uint8 n = 0; n < 3; ++n) { - Elder[n] = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_BRIGHTLEAF + n)); - if (Elder[n] && Elder[n]->IsAlive()) + Creature* Elder = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_BRIGHTLEAF + n)); + if (Elder && Elder->IsAlive()) { - Elder[n]->RemoveAllAuras(); - Elder[n]->AttackStop(); - Elder[n]->CombatStop(true); - Elder[n]->DeleteThreatList(); - Elder[n]->GetAI()->DoAction(ACTION_ELDER_FREYA_KILLED); + Elder->RemoveAllAuras(); + Elder->AttackStop(); + Elder->CombatStop(true); + Elder->DeleteThreatList(); + Elder->GetAI()->DoAction(ACTION_ELDER_FREYA_KILLED); } } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index d0b87f728c5..a04b53ac495 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -117,10 +117,9 @@ class boss_ignis : public CreatureScript struct boss_ignis_AI : public BossAI { - boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS), _vehicle(me->GetVehicleKit()) + boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS) { Initialize(); - ASSERT(_vehicle); } void Initialize() @@ -133,7 +132,7 @@ class boss_ignis : public CreatureScript void Reset() override { _Reset(); - if (_vehicle) + if (Vehicle* _vehicle = me->GetVehicleKit()) _vehicle->RemoveAllPassengers(); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT); @@ -284,7 +283,6 @@ class boss_ignis : public CreatureScript private: ObjectGuid _slagPotGUID; - Vehicle* _vehicle; time_t _firstConstructKill; bool _shattered; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index eb9e310b840..92c7d18a065 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -100,11 +100,9 @@ class boss_kologarn : public CreatureScript struct boss_kologarnAI : public BossAI { - boss_kologarnAI(Creature* creature) : BossAI(creature, BOSS_KOLOGARN), vehicle(creature->GetVehicleKit()), + boss_kologarnAI(Creature* creature) : BossAI(creature, BOSS_KOLOGARN), left(false), right(false) { - ASSERT(vehicle); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); @@ -113,7 +111,6 @@ class boss_kologarn : public CreatureScript Reset(); } - Vehicle* vehicle; bool left, right; ObjectGuid eyebeamTarget; @@ -128,9 +125,10 @@ class boss_kologarn : public CreatureScript events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 21000); events.ScheduleEvent(EVENT_ENRAGE, 600000); - for (uint8 i = 0; i < 2; ++i) - if (Unit* arm = vehicle->GetPassenger(i)) - arm->ToCreature()->SetInCombatWithZone(); + if (Vehicle* vehicle = me->GetVehicleKit()) + for (uint8 i = 0; i < 2; ++i) + if (Unit* arm = vehicle->GetPassenger(i)) + arm->ToCreature()->SetInCombatWithZone(); _EnterCombat(); } @@ -283,7 +281,7 @@ class boss_kologarn : public CreatureScript case EVENT_RESPAWN_LEFT_ARM: case EVENT_RESPAWN_RIGHT_ARM: { - if (vehicle) + if (Vehicle* vehicle = me->GetVehicleKit()) { int8 seat = eventId == EVENT_RESPAWN_LEFT_ARM ? 0 : 1; uint32 entry = eventId == EVENT_RESPAWN_LEFT_ARM ? NPC_LEFT_ARM : NPC_RIGHT_ARM; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index d0e4b7be63b..48f28077e00 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -401,20 +401,21 @@ class StartAttackEvent : public BasicEvent { public: StartAttackEvent(Creature* summoner, Creature* owner) - : _summoner(summoner), _owner(owner) + : _summonerGuid(summoner->GetGUID()), _owner(owner) { } bool Execute(uint64 /*time*/, uint32 /*diff*/) { _owner->SetReactState(REACT_AGGRESSIVE); - if (Unit* target = _summoner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f)) - _owner->AI()->AttackStart(target); + if (Creature* _summoner = ObjectAccessor::GetCreature(*_owner, _summonerGuid)) + if (Unit* target = _summoner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f)) + _owner->AI()->AttackStart(target); return true; } private: - Creature* _summoner; + ObjectGuid _summonerGuid; Creature* _owner; }; diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index d5d9f8ae77e..25bf4826000 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -381,7 +381,7 @@ class npc_hyldsmeet_protodrake : public CreatureScript class npc_hyldsmeet_protodrakeAI : public CreatureAI { public: - npc_hyldsmeet_protodrakeAI(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0), _vehicleKit(creature->GetVehicleKit()) { } + npc_hyldsmeet_protodrakeAI(Creature* creature) : CreatureAI(creature), _accessoryRespawnTimer(0) { } void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) override { @@ -396,6 +396,7 @@ class npc_hyldsmeet_protodrake : public CreatureScript { //! We need to manually reinstall accessories because the vehicle itself is friendly to players, //! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable. + Vehicle* _vehicleKit = me->GetVehicleKit(); if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit) { _vehicleKit->InstallAllAccessories(true); @@ -407,7 +408,6 @@ class npc_hyldsmeet_protodrake : public CreatureScript private: uint32 _accessoryRespawnTimer; - Vehicle* _vehicleKit; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp index b76712fc541..a8d65cc096d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp @@ -219,12 +219,12 @@ public: if (WateryGrave_Timer <= diff) { //Teleport 4 players under the waterfalls - Unit* target; GuidSet targets; GuidSet::const_iterator itr; for (uint8 i = 0; i < 4; ++i) { counter = 0; + Unit* target; do { target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50, true); //target players only @@ -257,12 +257,12 @@ public: //WateryGlobules_Timer if (WateryGlobules_Timer <= diff) { - Unit* pGlobuleTarget; GuidSet globules; GuidSet::const_iterator itr; for (uint8 g = 0; g < 4; g++) //one unit can't cast more than one spell per update, so some players have to cast for us XD { counter = 0; + Unit* pGlobuleTarget; do { pGlobuleTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index f5583c0bc53..e0a703d7b31 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -689,10 +689,9 @@ class boss_kaelthas : public CreatureScript //Respawn advisors Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - Creature* Advisor; for (uint8 i = 0; i < MAX_ADVISORS; ++i) { - Advisor = ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[i]); + Creature* Advisor = ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[i]); if (!Advisor) TC_LOG_ERROR("scripts", "SD2: Kael'Thas Advisor %u does not exist. Possibly despawned? Incorrectly Killed?", i); From 0cc3d883e11daf6e2da1fd938c15a6cd060013bc Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sun, 16 Aug 2015 23:08:01 +0200 Subject: [PATCH 020/110] Core/Build: Renamed Revision.h to GitRevision.h to avoid compile failure when old revision.h file is present --- .../Debugging/WheatyExceptionReport.cpp | 8 +++---- src/server/authserver/Main.cpp | 6 ++--- src/server/database/Updater/DBUpdater.cpp | 8 +++---- src/server/game/Entities/Player/Player.cpp | 6 ++--- src/server/game/Handlers/CharacterHandler.cpp | 4 ++-- src/server/game/World/World.cpp | 4 ++-- src/server/scripts/Commands/cs_server.cpp | 4 ++-- .../shared/{Revision.cpp => GitRevision.cpp} | 24 +++++++++---------- .../shared/{Revision.h => GitRevision.h} | 6 ++--- .../shared/PrecompiledHeaders/sharedPCH.h | 2 +- src/server/worldserver/Main.cpp | 10 ++++---- 11 files changed, 41 insertions(+), 41 deletions(-) rename src/server/shared/{Revision.cpp => GitRevision.cpp} (60%) rename src/server/shared/{Revision.h => GitRevision.h} (93%) diff --git a/src/common/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp index 70aa23a8eed..7cf109b4070 100644 --- a/src/common/Debugging/WheatyExceptionReport.cpp +++ b/src/common/Debugging/WheatyExceptionReport.cpp @@ -20,7 +20,7 @@ #include "WheatyExceptionReport.h" #include "Common.h" -#include "Revision.h" +#include "GitRevision.h" #define CrashFolder _T("Crashes") #pragma comment(linker, "/DEFAULTLIB:dbghelp.lib") @@ -130,10 +130,10 @@ PEXCEPTION_POINTERS pExceptionInfo) SYSTEMTIME systime; GetLocalTime(&systime); sprintf(m_szDumpFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].dmp", - crash_folder_path, Revision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, GitRevision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); sprintf(m_szLogFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].txt", - crash_folder_path, Revision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, GitRevision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); m_hDumpFile = CreateFile(m_szDumpFileName, GENERIC_WRITE, @@ -439,7 +439,7 @@ PEXCEPTION_POINTERS pExceptionInfo) GetLocalTime(&systime); // Start out with a banner - _tprintf(_T("Revision: %s\r\n"), Revision::GetFullVersion()); + _tprintf(_T("Revision: %s\r\n"), GitRevision::GetFullVersion()); _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 1568e3acf60..205053c47ee 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -33,7 +33,7 @@ #include "AppenderDB.h" #include "ProcessPriority.h" #include "RealmList.h" -#include "Revision.h" +#include "GitRevision.h" #include "Util.h" #include #include @@ -103,7 +103,7 @@ int main(int argc, char** argv) sLog->RegisterAppender(); sLog->Initialize(nullptr); - TC_LOG_INFO("server.authserver", "%s (authserver)", Revision::GetFullVersion()); + TC_LOG_INFO("server.authserver", "%s (authserver)", GitRevision::GetFullVersion()); TC_LOG_INFO("server.authserver", " to stop.\n"); TC_LOG_INFO("server.authserver", "Using configuration file %s.", configFile.c_str()); TC_LOG_INFO("server.authserver", "Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); @@ -293,7 +293,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile if (variablesMap.count("help")) std::cout << all << "\n"; else if (variablesMap.count("version")) - std::cout << Revision::GetFullVersion() << "\n"; + std::cout << GitRevision::GetFullVersion() << "\n"; return variablesMap; } diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index c69d19b11d6..ebdd6604fef 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -17,7 +17,7 @@ #include "DBUpdater.h" #include "Log.h" -#include "Revision.h" +#include "GitRevision.h" #include "UpdateFetcher.h" #include "DatabaseLoader.h" #include "Config.h" @@ -40,7 +40,7 @@ std::string DBUpdater::GetSourceDirectory() if (!entry.empty()) return entry; else - return Revision::GetSourceDirectory(); + return GitRevision::GetSourceDirectory(); } template @@ -50,7 +50,7 @@ std::string DBUpdater::GetMySqlCli() if (!entry.empty()) return entry; else - return Revision::GetMySQLExecutable(); + return GitRevision::GetMySQLExecutable(); } // Auth Database @@ -95,7 +95,7 @@ std::string DBUpdater::GetTableName() template<> std::string DBUpdater::GetBaseFile() { - return Revision::GetFullDatabase(); + return GitRevision::GetFullDatabase(); } template<> diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index caaadb9422b..362c40a0982 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -60,7 +60,7 @@ #include "Pet.h" #include "QuestDef.h" #include "ReputationMgr.h" -#include "Revision.h" +#include "GitRevision.h" #include "SkillDiscovery.h" #include "SocialMgr.h" #include "Spell.h" @@ -15123,8 +15123,8 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK); stmt->setUInt32(0, quest_id); stmt->setUInt32(1, GetGUIDLow()); - stmt->setString(2, Revision::GetHash()); - stmt->setString(3, Revision::GetDate()); + stmt->setString(2, GitRevision::GetHash()); + stmt->setString(3, GitRevision::GetDate()); // add to Quest Tracker CharacterDatabase.Execute(stmt); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1a6df09018e..11b31d98cc8 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -36,7 +36,7 @@ #include "PlayerDump.h" #include "Player.h" #include "ReputationMgr.h" -#include "Revision.h" +#include "GitRevision.h" #include "ScriptMgr.h" #include "SharedDefines.h" #include "SocialMgr.h" @@ -827,7 +827,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) // send server info if (sWorld->getIntConfig(CONFIG_ENABLE_SINFO_LOGIN) == 1) - chH.PSendSysMessage(Revision::GetFullVersion()); + chH.PSendSysMessage(GitRevision::GetFullVersion()); TC_LOG_DEBUG("network", "WORLD: Sent server info"); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index a6037a7aafd..b29f39809c6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -51,7 +51,7 @@ #include "OutdoorPvPMgr.h" #include "Player.h" #include "PoolMgr.h" -#include "Revision.h" +#include "GitRevision.h" #include "ScriptMgr.h" #include "SkillDiscovery.h" #include "SkillExtraItems.h" @@ -1789,7 +1789,7 @@ void World::SetInitialWorldSettings() m_startTime = m_gameTime; LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES(%u, %u, 0, '%s')", - realmID, uint32(m_startTime), Revision::GetFullVersion()); // One-time query + realmID, uint32(m_startTime), GitRevision::GetFullVersion()); // One-time query m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index fdc9370c30d..6fa84d1bc75 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -28,7 +28,7 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptMgr.h" -#include "Revision.h" +#include "GitRevision.h" class server_commandscript : public CommandScript { @@ -115,7 +115,7 @@ public: std::string uptime = secsToTimeString(sWorld->GetUptime()); uint32 updateTime = sWorld->GetUpdateTime(); - handler->SendSysMessage(Revision::GetFullVersion()); + handler->SendSysMessage(GitRevision::GetFullVersion()); handler->PSendSysMessage(LANG_CONNECTED_PLAYERS, playersNum, maxPlayersNum); handler->PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); handler->PSendSysMessage(LANG_UPTIME, uptime.c_str()); diff --git a/src/server/shared/Revision.cpp b/src/server/shared/GitRevision.cpp similarity index 60% rename from src/server/shared/Revision.cpp rename to src/server/shared/GitRevision.cpp index 22afb866165..0986e13b68f 100644 --- a/src/server/shared/Revision.cpp +++ b/src/server/shared/GitRevision.cpp @@ -1,40 +1,40 @@ -#include "Revision.h" +#include "GitRevision.h" #include "CompilerDefs.h" #include "revision_data.h" -char const* Revision::GetHash() +char const* GitRevision::GetHash() { return _HASH; } -char const* Revision::GetDate() +char const* GitRevision::GetDate() { return _DATE; } -char const* Revision::GetBranch() +char const* GitRevision::GetBranch() { return _BRANCH; } -char const* Revision::GetSourceDirectory() +char const* GitRevision::GetSourceDirectory() { return _SOURCE_DIRECTORY; } -char const* Revision::GetMySQLExecutable() +char const* GitRevision::GetMySQLExecutable() { return _MYSQL_EXECUTABLE; } -char const* Revision::GetFullDatabase() +char const* GitRevision::GetFullDatabase() { return _FULL_DATABASE; } #define _PACKAGENAME "TrinityCore" -char const* Revision::GetFullVersion() +char const* GitRevision::GetFullVersion() { #if PLATFORM == PLATFORM_WINDOWS # ifdef _WIN64 @@ -47,22 +47,22 @@ char const* Revision::GetFullVersion() #endif } -char const* GetCompanyNameStr() +char const* GitRevision::GetCompanyNameStr() { return VER_COMPANYNAME_STR; } -char const* GetLegalCopyrightStr() +char const* GitRevision::GetLegalCopyrightStr() { return VER_LEGALCOPYRIGHT_STR; } -char const* GetFileVersionStr() +char const* GitRevision::GetFileVersionStr() { return VER_FILEVERSION_STR; } -char const* GetProductVersionStr() +char const* GitRevision::GetProductVersionStr() { return VER_PRODUCTVERSION_STR; } diff --git a/src/server/shared/Revision.h b/src/server/shared/GitRevision.h similarity index 93% rename from src/server/shared/Revision.h rename to src/server/shared/GitRevision.h index f3a04540d76..ce941170083 100644 --- a/src/server/shared/Revision.h +++ b/src/server/shared/GitRevision.h @@ -15,12 +15,12 @@ * with this program. If not, see . */ -#ifndef __REVISION_H__ -#define __REVISION_H__ +#ifndef __GITREVISION_H__ +#define __GITREVISION_H__ #include -namespace Revision +namespace GitRevision { char const* GetHash(); char const* GetDate(); diff --git a/src/server/shared/PrecompiledHeaders/sharedPCH.h b/src/server/shared/PrecompiledHeaders/sharedPCH.h index c09b24e6fd9..f864674d5ad 100644 --- a/src/server/shared/PrecompiledHeaders/sharedPCH.h +++ b/src/server/shared/PrecompiledHeaders/sharedPCH.h @@ -1,4 +1,4 @@ //add here most rarely modified headers to speed up debug build compilation #include "TypeList.h" -#include "Revision.h" +#include "GitRevision.h" diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 03c0b3f5933..10c41835a9f 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -44,7 +44,7 @@ #include "BattlegroundMgr.h" #include "TCSoap.h" #include "CliRunnable.h" -#include "Revision.h" +#include "GitRevision.h" #include "WorldSocket.h" #include "WorldSocketMgr.h" #include "DatabaseLoader.h" @@ -125,7 +125,7 @@ extern int main(int argc, char** argv) // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton sLog->Initialize(sConfigMgr->GetBoolDefault("Log.Async.Enable", false) ? &_ioService : nullptr); - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", Revision::GetFullVersion()); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", GitRevision::GetFullVersion()); TC_LOG_INFO("server.worldserver", " to stop.\n"); TC_LOG_INFO("server.worldserver", " ______ __"); TC_LOG_INFO("server.worldserver", "/\\__ _\\ __ __/\\ \\__"); @@ -234,7 +234,7 @@ extern int main(int argc, char** argv) TC_LOG_INFO("server.worldserver", "Starting up anti-freeze thread (%u seconds max stuck time)...", coreStuckTime); } - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", Revision::GetFullVersion()); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", GitRevision::GetFullVersion()); sScriptMgr->OnStartup(); @@ -470,7 +470,7 @@ bool StartDB() ClearOnlineAccounts(); ///- Insert version info into DB - WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", Revision::GetFullVersion(), Revision::GetHash()); // One-time query + WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", GitRevision::GetFullVersion(), GitRevision::GetHash()); // One-time query sWorld->LoadDBVersion(); @@ -536,7 +536,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile } else if (vm.count("version")) { - std::cout << Revision::GetFullVersion() << "\n"; + std::cout << GitRevision::GetFullVersion() << "\n"; } return vm; From f2a1d3152e05a50fca9b4ce26830f95b4cc82d3e Mon Sep 17 00:00:00 2001 From: DDuarte Date: Mon, 17 Aug 2015 02:23:47 +0100 Subject: [PATCH 021/110] Build/Cmake: Fix a typo in common's CMakeLists.txt --- src/common/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 0c97fc35fcc..010a4f9ac43 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -15,7 +15,7 @@ endif() file(GLOB_RECURSE sources_Common Common.cpp Common.h) file(GLOB_RECURSE sources_Collision Collision/*.cpp Collision/*.h) file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) -file(GLOB_RECURSE sources_Threading Utilities/*.cpp Utilities/*.h) +file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h) file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h) file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) @@ -35,9 +35,11 @@ set(common_STAT_SRCS ${sources_Common} ${sources_Collision} ${sources_Threading} + ${sources_Utilities} ${sources_Debugging} ${sources_Configuration} ${sources_Logging} + ${sources_localdir} ) include_directories( From 30fc4f9f63b7a0ce01e5aad4667902991b70e298 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Mon, 17 Aug 2015 23:27:42 +0200 Subject: [PATCH 022/110] Scripts/Ulduar: fixed hodir kill credit Closes #15303 --- src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 098e7aa34be..5b04e4bb0f7 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -396,11 +396,11 @@ class boss_hodir : public CreatureScript me->SetControlled(true, UNIT_STATE_STUNNED); me->CombatStop(true); + DoCastAOE(SPELL_KILL_CREDIT); /// need to be cast before changing boss faction + /// spell will target enemies only me->setFaction(35); me->DespawnOrUnsummon(10000); - DoCastAOE(SPELL_KILL_CREDIT); - _JustDied(); } } From 6051d0c4f8f5161cfe6b63ee3e12f24b4378915f Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Thu, 20 Aug 2015 05:42:16 +0200 Subject: [PATCH 023/110] Core/Build: Fixed bitshift undefined behavior Coverity defect ID: 1193414 --- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 9ba7a62e215..f7491175a50 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1278,8 +1278,14 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const for (Unit::AuraApplicationMap::iterator itr = tAuras.begin(); itr != tAuras.end();) { // Use the new aura to see on what stance the target will be - uint32 newStance = (1<<((newAura ? newAura->GetMiscValue() : 0)-1)); - + uint32 newStance = 0; + if (newAura) + { + if (newAura->GetMiscValue() > 0 && newAura->GetMiscValue() <= 32) //Not null and GetMiscValue is not == FORM_NONE + newStance = 1 << (newAura->GetMiscValue() - 1); + else + TC_LOG_ERROR("spell.aura", "newAura->GetMiscValue() returned value %i for SpellID: %u when it was expecting a value in range [0..31] for a bitshift", newAura->GetMiscValue(), newAura->GetId()); + } // If the stances are not compatible with the spell, remove it if (itr->second->GetBase()->IsRemovedOnShapeLost(target) && !(itr->second->GetBase()->GetSpellInfo()->Stances & newStance)) target->RemoveAura(itr); From 51a2a3fa93702f289cda1e64323f55aba02f1026 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Thu, 20 Aug 2015 15:42:51 +0200 Subject: [PATCH 024/110] Core/Misc: Fix issues reported by static analysis Coverity defect IDs: 1316687, 1316688 --- src/common/Logging/AppenderFile.cpp | 2 ++ src/common/Logging/Log.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/common/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp index d33818626fe..c90c8f6ccea 100644 --- a/src/common/Logging/AppenderFile.cpp +++ b/src/common/Logging/AppenderFile.cpp @@ -50,6 +50,8 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, Ap if (extraArgs.size() > 2) _maxFileSize = atoi(extraArgs[2]); + else + _maxFileSize = 0; _dynamicName = std::string::npos != _fileName.find("%s"); _backup = (flags & APPENDER_FLAGS_MAKE_FILE_BACKUP) != 0; diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp index 93b7b9d122e..57d399a9d96 100644 --- a/src/common/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -27,7 +27,7 @@ #include #include -Log::Log() : _ioService(nullptr), _strand(nullptr) +Log::Log() : AppenderId(0), lowestLogLevel(LOG_LEVEL_FATAL), _ioService(nullptr), _strand(nullptr) { m_logsTimestamp = "_" + GetTimestampStr(); RegisterAppender(); From 424576e098635f947074d26b088790fce62a07d1 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Thu, 20 Aug 2015 16:23:26 +0200 Subject: [PATCH 025/110] Core/Misc: Added checks for procSpell nullptr cases Fixes Coverity Defect ID: 1023036 --- src/server/game/Entities/Unit/Unit.cpp | 61 +++++++++++++++----------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c29b14d9c13..4597f18eedb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5714,7 +5714,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (dummySpell->SpellIconID == 1697) { // only for spells and hit/crit (trigger start always) and not start from self cast spells (5530 Mace Stun Effect for example) - if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == victim) + if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == victim) return false; // Need stun or root mechanic if (!(procSpell->GetAllEffectsMechanicMask() & ((1<IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000) + if (!victim || !victim->IsAlive() || !procSpell || procSpell->SpellFamilyFlags[1] & 0x80000) return false; // heal amount @@ -5925,7 +5925,9 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 40438: { // Shadow Word: Pain - if (procSpell->SpellFamilyFlags[0] & 0x8000) + if (!procSpell) + return false; + else if (procSpell->SpellFamilyFlags[0] & 0x8000) triggered_spell_id = 40441; // Renew else if (procSpell->SpellFamilyFlags[0] & 0x40) @@ -5989,7 +5991,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Priest T10 Healer 2P Bonus case 70770: // Flash Heal - if (procSpell->SpellFamilyFlags[0] & 0x800) + if (procSpell && procSpell->SpellFamilyFlags[0] & 0x800) { triggered_spell_id = 70772; SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id); @@ -6008,7 +6010,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Glyph of Innervate case 54832: { - if (procSpell->SpellIconID != 62) + if (!procSpell || procSpell->SpellIconID != 62) return false; int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue(); @@ -6058,7 +6060,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Glyph of Rake case 54821: { - if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3) + if (procSpell && procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3) { if (target && target->GetTypeId() == TYPEID_UNIT) { @@ -6088,10 +6090,13 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Healing Touch (Dreamwalker Raiment set) case 28719: { - // mana back - basepoints0 = int32(CalculatePct(procSpell->ManaCost, 30)); - target = this; - triggered_spell_id = 28742; + if (procSpell) + { + // mana back + basepoints0 = int32(CalculatePct(procSpell->ManaCost, 30)); + target = this; + triggered_spell_id = 28742; + } break; } // Glyph of Rejuvenation @@ -6123,8 +6128,10 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere { float chance; + if (!procSpell) + return false; // Starfire - if (procSpell->SpellFamilyFlags[0] & 0x4) + else if (procSpell->SpellFamilyFlags[0] & 0x4) { triggered_spell_id = 40445; chance = 25.0f; @@ -6161,7 +6168,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 70723: { // Wrath & Starfire - if ((procSpell->SpellFamilyFlags[0] & 0x5) && (procEx & PROC_EX_CRITICAL_HIT)) + if (procSpell && (procSpell->SpellFamilyFlags[0] & 0x5) && (procEx & PROC_EX_CRITICAL_HIT)) { triggered_spell_id = 71023; SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); @@ -6177,7 +6184,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 70664: { // Proc only from normal Rejuvenation - if (procSpell->SpellVisual[0] != 32) + if (!procSpell || procSpell->SpellVisual[0] != 32) return false; Player* caster = ToPlayer(); @@ -6308,7 +6315,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 3560: // Rapid Recuperation { // This effect only from Rapid Killing (mana regen) - if (!(procSpell->SpellFamilyFlags[1] & 0x01000000)) + if (!procSpell || !(procSpell->SpellFamilyFlags[1] & 0x01000000)) return false; target = this; @@ -6350,7 +6357,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Light's Beacon - Beacon of Light if (dummySpell->Id == 53651) { - if (!victim) + if (!victim || !procSpell) return false; triggered_spell_id = 0; Unit* beaconTarget = NULL; @@ -6511,9 +6518,9 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere return false; // At melee attack or Hammer of the Righteous spell damage considered as melee attack - bool stacker = !procSpell || procSpell->Id == 53595; + bool stacker = procSpell ? procSpell->Id == 53595 : true; // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements - bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39)); + bool damager = procSpell ? (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39)) : false; if (!stacker && !damager) return false; @@ -6543,9 +6550,9 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere return false; // At melee attack or Hammer of the Righteous spell damage considered as melee attack - bool stacker = !procSpell || procSpell->Id == 53595; + bool stacker = procSpell ? procSpell->Id == 53595 : true; // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements - bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39)); + bool damager = procSpell ? (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39)) : false; if (!stacker && !damager) return false; @@ -6892,7 +6899,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 67228: { // Lava Burst - if (procSpell->SpellFamilyFlags[1] & 0x1000) + if (procSpell && procSpell->SpellFamilyFlags[1] & 0x1000) { triggered_spell_id = 71824; SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); @@ -6906,7 +6913,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 70808: { // Chain Heal - if ((procSpell->SpellFamilyFlags[0] & 0x100) && (procEx & PROC_EX_CRITICAL_HIT)) + if (procSpell && (procSpell->SpellFamilyFlags[0] & 0x100) && (procEx & PROC_EX_CRITICAL_HIT)) { triggered_spell_id = 70809; SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id); @@ -6942,7 +6949,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } case 63280: // Glyph of Totem of Wrath { - if (procSpell->SpellIconID != 2019) + if (!procSpell || procSpell->SpellIconID != 2019) return false; if (Creature* totem = GetMap()->GetCreature(m_SummonSlot[1])) // Fire totem summon slot @@ -7034,7 +7041,9 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Default chance for Healing Wave and Riptide float chance = (float)triggeredByAura->GetAmount(); - if (procSpell->SpellFamilyFlags[0] & 0x80) + if (!procSpell) + return false; //This is the same than putting chance *= 0.0f; + else if (procSpell->SpellFamilyFlags[0] & 0x80) // Lesser Healing Wave - 0.6 of default chance *= 0.6f; else if (procSpell->SpellFamilyFlags[0] & 0x100) @@ -7289,7 +7298,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (dummySpell->Id == 61257) { // only for spells and hit/crit (trigger start always) and not start from self cast spells - if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == victim) + if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == victim) return false; // Need snare or root mechanic if (!(procSpell->GetAllEffectsMechanicMask() & ((1<Id == 17619) + if (procSpell && dummySpell->Id == 17619) { if (procSpell->SpellFamilyName == SPELLFAMILY_POTION) { @@ -7380,7 +7389,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Guard Dog case 201: { - if (!victim) + if (!victim || !procSpell) return false; triggered_spell_id = 54445; From 1a553b780b160deb8fdb6bd948c7d7999e19798f Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 19 Aug 2015 17:16:33 +0200 Subject: [PATCH 026/110] Build fixes Conflicts: src/server/game/Handlers/ItemHandler.cpp --- src/common/Logging/Appender.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/common/Logging/Appender.h b/src/common/Logging/Appender.h index 7c5aa41924d..6382399a0b4 100644 --- a/src/common/Logging/Appender.h +++ b/src/common/Logging/Appender.h @@ -126,9 +126,7 @@ Appender* CreateAppender(uint8 id, std::string const& name, LogLevel level, Appe class InvalidAppenderArgsException : public std::length_error { public: - using std::length_error::length_error; - - explicit InvalidAppenderArgsException(std::string const& message) : length_error(message) { } + explicit InvalidAppenderArgsException(std::string const& message) : std::length_error(message) { } }; #endif From 1047014c9796522ad76b5f198bf6c82b4c156082 Mon Sep 17 00:00:00 2001 From: Dr-J Date: Fri, 21 Aug 2015 14:54:13 +0100 Subject: [PATCH 027/110] DB/Misc: Add a missing item to loot of Bag of Fishing Treasures http://www.wowhead.com/item=54469/blank-slate#contained-in-item --- sql/updates/world/2015_08_21_00_world.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 sql/updates/world/2015_08_21_00_world.sql diff --git a/sql/updates/world/2015_08_21_00_world.sql b/sql/updates/world/2015_08_21_00_world.sql new file mode 100644 index 00000000000..05192c5a98d --- /dev/null +++ b/sql/updates/world/2015_08_21_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `reference_loot_template` WHERE `Entry`=10018 AND `Item`=54469; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(10018, 54469, 0, 5, 0, 1, 3, 1, 1, NULL); From 5e1722c2f497ac7df8fed5ebe01e352965884584 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 16 Aug 2015 16:39:02 +0200 Subject: [PATCH 028/110] Script/Commands: Add new "debug loadcells" command Closes #15292 --- sql/base/auth_database.sql | 4 ++-- sql/updates/auth/2015_08_21_00_auth.sql | 5 +++++ sql/updates/world/2015_08_21_01_world.sql | 2 ++ src/server/game/Accounts/RBAC.h | 2 ++ src/server/scripts/Commands/cs_debug.cpp | 26 +++++++++++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 sql/updates/auth/2015_08_21_00_auth.sql create mode 100644 sql/updates/world/2015_08_21_01_world.sql diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 5f2448049d0..9f461eccc71 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -375,7 +375,7 @@ CREATE TABLE `rbac_linked_permissions` ( LOCK TABLES `rbac_linked_permissions` WRITE; /*!40000 ALTER TABLE `rbac_linked_permissions` DISABLE KEYS */; -INSERT INTO `rbac_linked_permissions` VALUES (192,21),(192,42),(192,43),(192,193),(192,196),(192,778),(192,779),(192,780),(192,781),(192,782),(192,783),(192,784),(192,785),(192,786),(192,787),(192,788),(192,789),(192,790),(192,791),(192,792),(192,793),(192,794),(192,795),(192,796),(193,48),(193,194),(193,197),(194,1),(194,2),(194,11),(194,13),(194,14),(194,15),(194,16),(194,17),(194,18),(194,19),(194,20),(194,22),(194,23),(194,25),(194,26),(194,27),(194,28),(194,29),(194,30),(194,31),(194,32),(194,33),(194,34),(194,35),(194,36),(194,37),(194,38),(194,39),(194,40),(194,41),(194,44),(194,46),(194,47),(194,51),(194,195),(194,198),(194,632),(194,798),(195,3),(195,4),(195,5),(195,6),(195,24),(195,49),(195,199),(196,200),(196,201),(196,226),(196,227),(196,230),(196,231),(196,233),(196,234),(196,235),(196,238),(196,239),(196,240),(196,241),(196,242),(196,243),(196,244),(196,245),(196,246),(196,247),(196,248),(196,249),(196,250),(196,251),(196,252),(196,253),(196,254),(196,255),(196,256),(196,257),(196,258),(196,259),(196,260),(196,261),(196,262),(196,264),(196,265),(196,266),(196,267),(196,268),(196,269),(196,270),(196,271),(196,272),(196,279),(196,280),(196,283),(196,287),(196,288),(196,289),(196,290),(196,291),(196,292),(196,293),(196,294),(196,295),(196,296),(196,297),(196,298),(196,299),(196,302),(196,303),(196,304),(196,305),(196,306),(196,307),(196,308),(196,309),(196,310),(196,313),(196,314),(196,319),(196,320),(196,321),(196,322),(196,323),(196,324),(196,325),(196,326),(196,327),(196,328),(196,329),(196,330),(196,331),(196,332),(196,333),(196,334),(196,335),(196,336),(196,337),(196,338),(196,339),(196,340),(196,341),(196,342),(196,343),(196,344),(196,345),(196,346),(196,347),(196,348),(196,349),(196,350),(196,351),(196,352),(196,353),(196,354),(196,355),(196,356),(196,357),(196,358),(196,359),(196,360),(196,361),(196,362),(196,363),(196,364),(196,365),(196,366),(196,373),(196,375),(196,400),(196,401),(196,402),(196,403),(196,404),(196,405),(196,406),(196,407),(196,417),(196,418),(196,419),(196,420),(196,421),(196,422),(196,423),(196,424),(196,425),(196,426),(196,427),(196,428),(196,429),(196,434),(196,435),(196,436),(196,437),(196,438),(196,439),(196,440),(196,441),(196,442),(196,443),(196,444),(196,445),(196,446),(196,447),(196,448),(196,449),(196,450),(196,451),(196,452),(196,453),(196,454),(196,455),(196,456),(196,457),(196,458),(196,459),(196,461),(196,463),(196,464),(196,465),(196,472),(196,473),(196,474),(196,475),(196,476),(196,477),(196,478),(196,488),(196,489),(196,491),(196,492),(196,493),(196,495),(196,497),(196,498),(196,499),(196,500),(196,502),(196,503),(196,505),(196,508),(196,511),(196,513),(196,514),(196,516),(196,519),(196,522),(196,523),(196,526),(196,527),(196,529),(196,530),(196,533),(196,535),(196,536),(196,537),(196,538),(196,539),(196,540),(196,541),(196,556),(196,581),(196,582),(196,592),(196,593),(196,596),(196,602),(196,603),(196,604),(196,605),(196,606),(196,607),(196,608),(196,609),(196,610),(196,611),(196,612),(196,613),(196,614),(196,615),(196,616),(196,617),(196,618),(196,619),(196,620),(196,621),(196,622),(196,623),(196,624),(196,625),(196,626),(196,627),(196,628),(196,629),(196,630),(196,631),(196,633),(196,634),(196,635),(196,636),(196,637),(196,638),(196,639),(196,640),(196,641),(196,642),(196,643),(196,644),(196,645),(196,646),(196,647),(196,648),(196,649),(196,650),(196,651),(196,652),(196,653),(196,654),(196,655),(196,656),(196,657),(196,658),(196,659),(196,660),(196,661),(196,662),(196,663),(196,664),(196,665),(196,666),(196,667),(196,668),(196,669),(196,670),(196,671),(196,672),(196,673),(196,674),(196,675),(196,676),(196,677),(196,678),(196,679),(196,680),(196,681),(196,682),(196,683),(196,684),(196,685),(196,686),(196,687),(196,688),(196,689),(196,690),(196,691),(196,692),(196,693),(196,694),(196,695),(196,696),(196,697),(196,698),(196,699),(196,700),(196,701),(196,702),(196,703),(196,704),(196,705),(196,706),(196,707),(196,708),(196,709),(196,710),(196,711),(196,712),(196,713),(196,714),(196,715),(196,716),(196,717),(196,718),(196,719),(196,721),(196,722),(196,723),(196,724),(196,725),(196,726),(196,727),(196,728),(196,729),(196,730),(196,733),(196,734),(196,735),(196,736),(196,738),(196,739),(196,748),(196,753),(196,757),(196,773),(196,777),(197,232),(197,236),(197,237),(197,273),(197,274),(197,275),(197,276),(197,277),(197,284),(197,285),(197,286),(197,301),(197,311),(197,387),(197,388),(197,389),(197,390),(197,391),(197,392),(197,393),(197,394),(197,395),(197,396),(197,397),(197,398),(197,399),(197,479),(197,480),(197,481),(197,482),(197,485),(197,486),(197,487),(197,494),(197,506),(197,509),(197,510),(197,517),(197,518),(197,521),(197,542),(197,543),(197,550),(197,558),(197,568),(197,571),(197,572),(197,573),(197,574),(197,575),(197,576),(197,577),(197,578),(197,579),(197,580),(197,583),(197,584),(197,585),(197,586),(197,587),(197,588),(197,589),(197,590),(197,591),(197,594),(197,595),(197,601),(197,743),(197,750),(197,758),(197,761),(197,762),(197,763),(197,764),(197,765),(197,766),(197,767),(197,768),(197,769),(197,770),(197,771),(197,772),(197,774),(198,218),(198,300),(198,312),(198,315),(198,316),(198,317),(198,318),(198,367),(198,368),(198,369),(198,370),(198,371),(198,372),(198,374),(198,376),(198,377),(198,378),(198,379),(198,380),(198,381),(198,382),(198,383),(198,384),(198,385),(198,386),(198,408),(198,409),(198,410),(198,411),(198,412),(198,413),(198,414),(198,415),(198,416),(198,430),(198,431),(198,432),(198,433),(198,462),(198,466),(198,467),(198,468),(198,469),(198,470),(198,471),(198,483),(198,484),(198,490),(198,504),(198,512),(198,515),(198,520),(198,524),(198,528),(198,531),(198,532),(198,544),(198,545),(198,546),(198,547),(198,548),(198,549),(198,551),(198,552),(198,553),(198,554),(198,555),(198,557),(198,559),(198,560),(198,561),(198,562),(198,563),(198,564),(198,565),(198,566),(198,567),(198,569),(198,570),(198,597),(198,598),(198,599),(198,600),(198,737),(198,740),(198,741),(198,742),(198,744),(198,745),(198,746),(198,747),(198,749),(198,751),(198,752),(198,754),(198,755),(198,756),(198,759),(198,760),(199,217),(199,221),(199,222),(199,223),(199,225),(199,263),(199,496),(199,501),(199,507),(199,525),(199,534),(199,797); +INSERT INTO `rbac_linked_permissions` VALUES (192,21),(192,42),(192,43),(192,193),(192,196),(192,778),(192,779),(192,780),(192,781),(192,782),(192,783),(192,784),(192,785),(192,786),(192,787),(192,788),(192,789),(192,790),(192,791),(192,792),(192,793),(192,794),(192,795),(192,796),(192,835),(193,48),(193,194),(193,197),(194,1),(194,2),(194,11),(194,13),(194,14),(194,15),(194,16),(194,17),(194,18),(194,19),(194,20),(194,22),(194,23),(194,25),(194,26),(194,27),(194,28),(194,29),(194,30),(194,31),(194,32),(194,33),(194,34),(194,35),(194,36),(194,37),(194,38),(194,39),(194,40),(194,41),(194,44),(194,46),(194,47),(194,51),(194,195),(194,198),(194,632),(194,798),(195,3),(195,4),(195,5),(195,6),(195,24),(195,49),(195,199),(196,200),(196,201),(196,226),(196,227),(196,230),(196,231),(196,233),(196,234),(196,235),(196,238),(196,239),(196,240),(196,241),(196,242),(196,243),(196,244),(196,245),(196,246),(196,247),(196,248),(196,249),(196,250),(196,251),(196,252),(196,253),(196,254),(196,255),(196,256),(196,257),(196,258),(196,259),(196,260),(196,261),(196,262),(196,264),(196,265),(196,266),(196,267),(196,268),(196,269),(196,270),(196,271),(196,272),(196,279),(196,280),(196,283),(196,287),(196,288),(196,289),(196,290),(196,291),(196,292),(196,293),(196,294),(196,295),(196,296),(196,297),(196,298),(196,299),(196,302),(196,303),(196,304),(196,305),(196,306),(196,307),(196,308),(196,309),(196,310),(196,313),(196,314),(196,319),(196,320),(196,321),(196,322),(196,323),(196,324),(196,325),(196,326),(196,327),(196,328),(196,329),(196,330),(196,331),(196,332),(196,333),(196,334),(196,335),(196,336),(196,337),(196,338),(196,339),(196,340),(196,341),(196,342),(196,343),(196,344),(196,345),(196,346),(196,347),(196,348),(196,349),(196,350),(196,351),(196,352),(196,353),(196,354),(196,355),(196,356),(196,357),(196,358),(196,359),(196,360),(196,361),(196,362),(196,363),(196,364),(196,365),(196,366),(196,373),(196,375),(196,400),(196,401),(196,402),(196,403),(196,404),(196,405),(196,406),(196,407),(196,417),(196,418),(196,419),(196,420),(196,421),(196,422),(196,423),(196,424),(196,425),(196,426),(196,427),(196,428),(196,429),(196,434),(196,435),(196,436),(196,437),(196,438),(196,439),(196,440),(196,441),(196,442),(196,443),(196,444),(196,445),(196,446),(196,447),(196,448),(196,449),(196,450),(196,451),(196,452),(196,453),(196,454),(196,455),(196,456),(196,457),(196,458),(196,459),(196,461),(196,463),(196,464),(196,465),(196,472),(196,473),(196,474),(196,475),(196,476),(196,477),(196,478),(196,488),(196,489),(196,491),(196,492),(196,493),(196,495),(196,497),(196,498),(196,499),(196,500),(196,502),(196,503),(196,505),(196,508),(196,511),(196,513),(196,514),(196,516),(196,519),(196,522),(196,523),(196,526),(196,527),(196,529),(196,530),(196,533),(196,535),(196,536),(196,537),(196,538),(196,539),(196,540),(196,541),(196,556),(196,581),(196,582),(196,592),(196,593),(196,596),(196,602),(196,603),(196,604),(196,605),(196,606),(196,607),(196,608),(196,609),(196,610),(196,611),(196,612),(196,613),(196,614),(196,615),(196,616),(196,617),(196,618),(196,619),(196,620),(196,621),(196,622),(196,623),(196,624),(196,625),(196,626),(196,627),(196,628),(196,629),(196,630),(196,631),(196,633),(196,634),(196,635),(196,636),(196,637),(196,638),(196,639),(196,640),(196,641),(196,642),(196,643),(196,644),(196,645),(196,646),(196,647),(196,648),(196,649),(196,650),(196,651),(196,652),(196,653),(196,654),(196,655),(196,656),(196,657),(196,658),(196,659),(196,660),(196,661),(196,662),(196,663),(196,664),(196,665),(196,666),(196,667),(196,668),(196,669),(196,670),(196,671),(196,672),(196,673),(196,674),(196,675),(196,676),(196,677),(196,678),(196,679),(196,680),(196,681),(196,682),(196,683),(196,684),(196,685),(196,686),(196,687),(196,688),(196,689),(196,690),(196,691),(196,692),(196,693),(196,694),(196,695),(196,696),(196,697),(196,698),(196,699),(196,700),(196,701),(196,702),(196,703),(196,704),(196,705),(196,706),(196,707),(196,708),(196,709),(196,710),(196,711),(196,712),(196,713),(196,714),(196,715),(196,716),(196,717),(196,718),(196,719),(196,721),(196,722),(196,723),(196,724),(196,725),(196,726),(196,727),(196,728),(196,729),(196,730),(196,733),(196,734),(196,735),(196,736),(196,738),(196,739),(196,748),(196,753),(196,757),(196,773),(196,777),(197,232),(197,236),(197,237),(197,273),(197,274),(197,275),(197,276),(197,277),(197,284),(197,285),(197,286),(197,301),(197,311),(197,387),(197,388),(197,389),(197,390),(197,391),(197,392),(197,393),(197,394),(197,395),(197,396),(197,397),(197,398),(197,399),(197,479),(197,480),(197,481),(197,482),(197,485),(197,486),(197,487),(197,494),(197,506),(197,509),(197,510),(197,517),(197,518),(197,521),(197,542),(197,543),(197,550),(197,558),(197,568),(197,571),(197,572),(197,573),(197,574),(197,575),(197,576),(197,577),(197,578),(197,579),(197,580),(197,583),(197,584),(197,585),(197,586),(197,587),(197,588),(197,589),(197,590),(197,591),(197,594),(197,595),(197,601),(197,743),(197,750),(197,758),(197,761),(197,762),(197,763),(197,764),(197,765),(197,766),(197,767),(197,768),(197,769),(197,770),(197,771),(197,772),(197,774),(198,218),(198,300),(198,312),(198,315),(198,316),(198,317),(198,318),(198,367),(198,368),(198,369),(198,370),(198,371),(198,372),(198,374),(198,376),(198,377),(198,378),(198,379),(198,380),(198,381),(198,382),(198,383),(198,384),(198,385),(198,386),(198,408),(198,409),(198,410),(198,411),(198,412),(198,413),(198,414),(198,415),(198,416),(198,430),(198,431),(198,432),(198,433),(198,462),(198,466),(198,467),(198,468),(198,469),(198,470),(198,471),(198,483),(198,484),(198,490),(198,504),(198,512),(198,515),(198,520),(198,524),(198,528),(198,531),(198,532),(198,544),(198,545),(198,546),(198,547),(198,548),(198,549),(198,551),(198,552),(198,553),(198,554),(198,555),(198,557),(198,559),(198,560),(198,561),(198,562),(198,563),(198,564),(198,565),(198,566),(198,567),(198,569),(198,570),(198,597),(198,598),(198,599),(198,600),(198,737),(198,740),(198,741),(198,742),(198,744),(198,745),(198,746),(198,747),(198,749),(198,751),(198,752),(198,754),(198,755),(198,756),(198,759),(198,760),(199,217),(199,221),(199,222),(199,223),(199,225),(199,263),(199,496),(199,501),(199,507),(199,525),(199,534),(199,797); /*!40000 ALTER TABLE `rbac_linked_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -399,7 +399,7 @@ CREATE TABLE `rbac_permissions` ( LOCK TABLES `rbac_permissions` WRITE; /*!40000 ALTER TABLE `rbac_permissions` DISABLE KEYS */; -INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'),(49,'Forces to enter the email for confirmation on password change'),(50,'Allow user to check his own email with .account'),(51,'Allow trading between factions'),(192,'Role: Sec Level Administrator'),(193,'Role: Sec Level Gamemaster'),(194,'Role: Sec Level Moderator'),(195,'Role: Sec Level Player'),(196,'Role: Administrator Commands'),(197,'Role: Gamemaster Commands'),(198,'Role: Moderator Commands'),(199,'Role: Player Commands'),(200,'Command: rbac'),(201,'Command: rbac account'),(202,'Command: rbac account list'),(203,'Command: rbac account grant'),(204,'Command: rbac account deny'),(205,'Command: rbac account revoke'),(206,'Command: rbac list'),(217,'Command: account'),(218,'Command: account addon'),(219,'Command: account create'),(220,'Command: account delete'),(221,'Command: account lock'),(222,'Command: account lock country'),(223,'Command: account lock ip'),(224,'Command: account onlinelist'),(225,'Command: account password'),(226,'Command: account set'),(227,'Command: account set addon'),(228,'Command: account set gmlevel'),(229,'Command: account set password'),(230,'Command: achievement'),(231,'Command: achievement add'),(232,'Command: arena'),(233,'Command: arena captain'),(234,'Command: arena create'),(235,'Command: arena disband'),(236,'Command: arena info'),(237,'Command: arena lookup'),(238,'Command: arena rename'),(239,'Command: ban'),(240,'Command: ban account'),(241,'Command: ban character'),(242,'Command: ban ip'),(243,'Command: ban playeraccount'),(244,'Command: baninfo'),(245,'Command: baninfo account'),(246,'Command: baninfo character'),(247,'Command: baninfo ip'),(248,'Command: banlist'),(249,'Command: banlist account'),(250,'Command: banlist character'),(251,'Command: banlist ip'),(252,'Command: unban'),(253,'Command: unban account'),(254,'Command: unban character'),(255,'Command: unban ip'),(256,'Command: unban playeraccount'),(257,'Command: bf'),(258,'Command: bf start'),(259,'Command: bf stop'),(260,'Command: bf switch'),(261,'Command: bf timer'),(262,'Command: bf enable'),(263,'Command: account email'),(264,'Command: account set sec'),(265,'Command: account set sec email'),(266,'Command: account set sec regmail'),(267,'Command: cast'),(268,'Command: cast back'),(269,'Command: cast dist'),(270,'Command: cast self'),(271,'Command: cast target'),(272,'Command: cast dest'),(273,'Command: character'),(274,'Command: character customize'),(275,'Command: character changefaction'),(276,'Command: character changerace'),(277,'Command: character deleted'),(279,'Command: character deleted list'),(280,'Command: character deleted restore'),(283,'Command: character level'),(284,'Command: character rename'),(285,'Command: character reputation'),(286,'Command: character titles'),(287,'Command: levelup'),(288,'Command: pdump'),(289,'Command: pdump load'),(290,'Command: pdump write'),(291,'Command: cheat'),(292,'Command: cheat casttime'),(293,'Command: cheat cooldown'),(294,'Command: cheat explore'),(295,'Command: cheat god'),(296,'Command: cheat power'),(297,'Command: cheat status'),(298,'Command: cheat taxi'),(299,'Command: cheat waterwalk'),(300,'Command: debug'),(301,'Command: debug anim'),(302,'Command: debug areatriggers'),(303,'Command: debug arena'),(304,'Command: debug bg'),(305,'Command: debug entervehicle'),(306,'Command: debug getitemstate'),(307,'Command: debug getitemvalue'),(308,'Command: debug getvalue'),(309,'Command: debug hostil'),(310,'Command: debug itemexpire'),(311,'Command: debug lootrecipient'),(312,'Command: debug los'),(313,'Command: debug mod32value'),(314,'Command: debug moveflags'),(315,'Command: debug play'),(316,'Command: debug play cinematics'),(317,'Command: debug play movie'),(318,'Command: debug play sound'),(319,'Command: debug send'),(320,'Command: debug send buyerror'),(321,'Command: debug send channelnotify'),(322,'Command: debug send chatmessage'),(323,'Command: debug send equiperror'),(324,'Command: debug send largepacket'),(325,'Command: debug send opcode'),(326,'Command: debug send qinvalidmsg'),(327,'Command: debug send qpartymsg'),(328,'Command: debug send sellerror'),(329,'Command: debug send setphaseshift'),(330,'Command: debug send spellfail'),(331,'Command: debug setaurastate'),(332,'Command: debug setbit'),(333,'Command: debug setitemvalue'),(334,'Command: debug setvalue'),(335,'Command: debug setvid'),(336,'Command: debug spawnvehicle'),(337,'Command: debug threat'),(338,'Command: debug update'),(339,'Command: debug uws'),(340,'Command: wpgps'),(341,'Command: deserter'),(342,'Command: deserter bg'),(343,'Command: deserter bg add'),(344,'Command: deserter bg remove'),(345,'Command: deserter instance'),(346,'Command: deserter instance add'),(347,'Command: deserter instance remove'),(348,'Command: disable'),(349,'Command: disable add'),(350,'Command: disable add achievement_criteria'),(351,'Command: disable add battleground'),(352,'Command: disable add map'),(353,'Command: disable add mmap'),(354,'Command: disable add outdoorpvp'),(355,'Command: disable add quest'),(356,'Command: disable add spell'),(357,'Command: disable add vmap'),(358,'Command: disable remove'),(359,'Command: disable remove achievement_criteria'),(360,'Command: disable remove battleground'),(361,'Command: disable remove map'),(362,'Command: disable remove mmap'),(363,'Command: disable remove outdoorpvp'),(364,'Command: disable remove quest'),(365,'Command: disable remove spell'),(366,'Command: disable remove vmap'),(367,'Command: event'),(368,'Command: event activelist'),(369,'Command: event start'),(370,'Command: event stop'),(371,'Command: gm'),(372,'Command: gm chat'),(373,'Command: gm fly'),(374,'Command: gm ingame'),(375,'Command: gm list'),(376,'Command: gm visible'),(377,'Command: go'),(378,'Command: go creature'),(379,'Command: go graveyard'),(380,'Command: go grid'),(381,'Command: go object'),(382,'Command: go taxinode'),(383,'Command: go ticket'),(384,'Command: go trigger'),(385,'Command: go xyz'),(386,'Command: go zonexy'),(387,'Command: gobject'),(388,'Command: gobject activate'),(389,'Command: gobject add'),(390,'Command: gobject add temp'),(391,'Command: gobject delete'),(392,'Command: gobject info'),(393,'Command: gobject move'),(394,'Command: gobject near'),(395,'Command: gobject set'),(396,'Command: gobject set phase'),(397,'Command: gobject set state'),(398,'Command: gobject target'),(399,'Command: gobject turn'),(400,'debug transport'),(401,'Command: guild'),(402,'Command: guild create'),(403,'Command: guild delete'),(404,'Command: guild invite'),(405,'Command: guild uninvite'),(406,'Command: guild rank'),(407,'Command: guild rename'),(408,'Command: honor'),(409,'Command: honor add'),(410,'Command: honor add kill'),(411,'Command: honor update'),(412,'Command: instance'),(413,'Command: instance listbinds'),(414,'Command: instance unbind'),(415,'Command: instance stats'),(416,'Command: instance savedata'),(417,'Command: learn'),(418,'Command: learn all'),(419,'Command: learn all my'),(420,'Command: learn all my class'),(421,'Command: learn all my pettalents'),(422,'Command: learn all my spells'),(423,'Command: learn all my talents'),(424,'Command: learn all gm'),(425,'Command: learn all crafts'),(426,'Command: learn all default'),(427,'Command: learn all lang'),(428,'Command: learn all recipes'),(429,'Command: unlearn'),(430,'Command: lfg'),(431,'Command: lfg player'),(432,'Command: lfg group'),(433,'Command: lfg queue'),(434,'Command: lfg clean'),(435,'Command: lfg options'),(436,'Command: list'),(437,'Command: list creature'),(438,'Command: list item'),(439,'Command: list object'),(440,'Command: list auras'),(441,'Command: list mail'),(442,'Command: lookup'),(443,'Command: lookup area'),(444,'Command: lookup creature'),(445,'Command: lookup event'),(446,'Command: lookup faction'),(447,'Command: lookup item'),(448,'Command: lookup itemset'),(449,'Command: lookup object'),(450,'Command: lookup quest'),(451,'Command: lookup player'),(452,'Command: lookup player ip'),(453,'Command: lookup player account'),(454,'Command: lookup player email'),(455,'Command: lookup skill'),(456,'Command: lookup spell'),(457,'Command: lookup spell id'),(458,'Command: lookup taxinode'),(459,'Command: lookup tele'),(460,'Command: lookup title'),(461,'Command: lookup map'),(462,'Command: announce'),(463,'Command: channel'),(464,'Command: channel set'),(465,'Command: channel set ownership'),(466,'Command: gmannounce'),(467,'Command: gmnameannounce'),(468,'Command: gmnotify'),(469,'Command: nameannounce'),(470,'Command: notify'),(471,'Command: whispers'),(472,'Command: group'),(473,'Command: group leader'),(474,'Command: group disband'),(475,'Command: group remove'),(476,'Command: group join'),(477,'Command: group list'),(478,'Command: group summon'),(479,'Command: pet'),(480,'Command: pet create'),(481,'Command: pet learn'),(482,'Command: pet unlearn'),(483,'Command: send'),(484,'Command: send items'),(485,'Command: send mail'),(486,'Command: send message'),(487,'Command: send money'),(488,'Command: additem'),(489,'Command: additemset'),(490,'Command: appear'),(491,'Command: aura'),(492,'Command: bank'),(493,'Command: bindsight'),(494,'Command: combatstop'),(495,'Command: cometome'),(496,'Command: commands'),(497,'Command: cooldown'),(498,'Command: damage'),(499,'Command: dev'),(500,'Command: die'),(501,'Command: dismount'),(502,'Command: distance'),(503,'Command: flusharenapoints'),(504,'Command: freeze'),(505,'Command: gps'),(506,'Command: guid'),(507,'Command: help'),(508,'Command: hidearea'),(509,'Command: itemmove'),(510,'Command: kick'),(511,'Command: linkgrave'),(512,'Command: listfreeze'),(513,'Command: maxskill'),(514,'Command: movegens'),(515,'Command: mute'),(516,'Command: neargrave'),(517,'Command: pinfo'),(518,'Command: playall'),(519,'Command: possess'),(520,'Command: recall'),(521,'Command: repairitems'),(522,'Command: respawn'),(523,'Command: revive'),(524,'Command: saveall'),(525,'Command: save'),(526,'Command: setskill'),(527,'Command: showarea'),(528,'Command: summon'),(529,'Command: unaura'),(530,'Command: unbindsight'),(531,'Command: unfreeze'),(532,'Command: unmute'),(533,'Command: unpossess'),(534,'Command: unstuck'),(535,'Command: wchange'),(536,'Command: mmap'),(537,'Command: mmap loadedtiles'),(538,'Command: mmap loc'),(539,'Command: mmap path'),(540,'Command: mmap stats'),(541,'Command: mmap testarea'),(542,'Command: morph'),(543,'Command: demorph'),(544,'Command: modify'),(545,'Command: modify arenapoints'),(546,'Command: modify bit'),(547,'Command: modify drunk'),(548,'Command: modify energy'),(549,'Command: modify faction'),(550,'Command: modify gender'),(551,'Command: modify honor'),(552,'Command: modify hp'),(553,'Command: modify mana'),(554,'Command: modify money'),(555,'Command: modify mount'),(556,'Command: modify phase'),(557,'Command: modify rage'),(558,'Command: modify reputation'),(559,'Command: modify runicpower'),(560,'Command: modify scale'),(561,'Command: modify speed'),(562,'Command: modify speed all'),(563,'Command: modify speed backwalk'),(564,'Command: modify speed fly'),(565,'Command: modify speed walk'),(566,'Command: modify speed swim'),(567,'Command: modify spell'),(568,'Command: modify standstate'),(569,'Command: modify talentpoints'),(570,'Command: npc'),(571,'Command: npc add'),(572,'Command: npc add formation'),(573,'Command: npc add item'),(574,'Command: npc add move'),(575,'Command: npc add temp'),(576,'Command: npc add delete'),(577,'Command: npc add delete item'),(578,'Command: npc add follow'),(579,'Command: npc add follow stop'),(580,'Command: npc set'),(581,'Command: npc set allowmove'),(582,'Command: npc set entry'),(583,'Command: npc set factionid'),(584,'Command: npc set flag'),(585,'Command: npc set level'),(586,'Command: npc set link'),(587,'Command: npc set model'),(588,'Command: npc set movetype'),(589,'Command: npc set phase'),(590,'Command: npc set spawndist'),(591,'Command: npc set spawntime'),(592,'Command: npc set data'),(593,'Command: npc info'),(594,'Command: npc near'),(595,'Command: npc move'),(596,'Command: npc playemote'),(597,'Command: npc say'),(598,'Command: npc textemote'),(599,'Command: npc whisper'),(600,'Command: npc yell'),(601,'Command: npc tame'),(602,'Command: quest'),(603,'Command: quest add'),(604,'Command: quest complete'),(605,'Command: quest remove'),(606,'Command: quest reward'),(607,'Command: reload'),(608,'Command: reload access_requirement'),(609,'Command: reload achievement_criteria_data'),(610,'Command: reload achievement_reward'),(611,'Command: reload all'),(612,'Command: reload all achievement'),(613,'Command: reload all area'),(614,'Command: broadcast_text'),(615,'Command: reload all gossips'),(616,'Command: reload all item'),(617,'Command: reload all locales'),(618,'Command: reload all loot'),(619,'Command: reload all npc'),(620,'Command: reload all quest'),(621,'Command: reload all scripts'),(622,'Command: reload all spell'),(623,'Command: reload areatrigger_involvedrelation'),(624,'Command: reload areatrigger_tavern'),(625,'Command: reload areatrigger_teleport'),(626,'Command: reload auctions'),(627,'Command: reload autobroadcast'),(628,'Command: reload command'),(629,'Command: reload conditions'),(630,'Command: reload config'),(631,'Command: reload battleground_template'),(632,'Command: .mutehistory'),(633,'Command: reload creature_linked_respawn'),(634,'Command: reload creature_loot_template'),(635,'Command: reload creature_onkill_reputation'),(636,'Command: reload creature_questender'),(637,'Command: reload creature_queststarter'),(638,'Command: reload creature_summon_groups'),(639,'Command: reload creature_template'),(640,'Command: reload creature_text'),(641,'Command: reload disables'),(642,'Command: reload disenchant_loot_template'),(643,'Command: reload event_scripts'),(644,'Command: reload fishing_loot_template'),(645,'Command: reload game_graveyard_zone'),(646,'Command: reload game_tele'),(647,'Command: reload gameobject_questender'),(648,'Command: reload gameobject_loot_template'),(649,'Command: reload gameobject_queststarter'),(650,'Command: reload gm_tickets'),(651,'Command: reload gossip_menu'),(652,'Command: reload gossip_menu_option'),(653,'Command: reload item_enchantment_template'),(654,'Command: reload item_loot_template'),(655,'Command: reload item_set_names'),(656,'Command: reload lfg_dungeon_rewards'),(657,'Command: reload locales_achievement_reward'),(658,'Command: reload locales_creature'),(659,'Command: reload locales_creature_text'),(660,'Command: reload locales_gameobject'),(661,'Command: reload locales_gossip_menu_option'),(662,'Command: reload locales_item'),(663,'Command: reload locales_item_set_name'),(664,'Command: reload locales_npc_text'),(665,'Command: reload locales_page_text'),(666,'Command: reload locales_points_of_interest'),(667,'Command: reload locales_quest'),(668,'Command: reload mail_level_reward'),(669,'Command: reload mail_loot_template'),(670,'Command: reload milling_loot_template'),(671,'Command: reload npc_spellclick_spells'),(672,'Command: reload npc_trainer'),(673,'Command: reload npc_vendor'),(674,'Command: reload page_text'),(675,'Command: reload pickpocketing_loot_template'),(676,'Command: reload points_of_interest'),(677,'Command: reload prospecting_loot_template'),(678,'Command: reload quest_poi'),(679,'Command: reload quest_template'),(680,'Command: reload rbac'),(681,'Command: reload reference_loot_template'),(682,'Command: reload reserved_name'),(683,'Command: reload reputation_reward_rate'),(684,'Command: reload reputation_spillover_template'),(685,'Command: reload skill_discovery_template'),(686,'Command: reload skill_extra_item_template'),(687,'Command: reload skill_fishing_base_level'),(688,'Command: reload skinning_loot_template'),(689,'Command: reload smart_scripts'),(690,'Command: reload spell_required'),(691,'Command: reload spell_area'),(692,'Command: reload spell_bonus_data'),(693,'Command: reload spell_group'),(694,'Command: reload spell_learn_spell'),(695,'Command: reload spell_loot_template'),(696,'Command: reload spell_linked_spell'),(697,'Command: reload spell_pet_auras'),(698,'Command: reload spell_proc_event'),(699,'Command: reload spell_proc'),(700,'Command: reload spell_scripts'),(701,'Command: reload spell_target_position'),(702,'Command: reload spell_threats'),(703,'Command: reload spell_group_stack_rules'),(704,'Command: reload trinity_string'),(705,'Command: reload warden_action'),(706,'Command: reload waypoint_scripts'),(707,'Command: reload waypoint_data'),(708,'Command: reload vehicle_accessory'),(709,'Command: reload vehicle_template_accessory'),(710,'Command: reset'),(711,'Command: reset achievements'),(712,'Command: reset honor'),(713,'Command: reset level'),(714,'Command: reset spells'),(715,'Command: reset stats'),(716,'Command: reset talents'),(717,'Command: reset all'),(718,'Command: server'),(719,'Command: server corpses'),(720,'Command: server exit'),(721,'Command: server idlerestart'),(722,'Command: server idlerestart cancel'),(723,'Command: server idleshutdown'),(724,'Command: server idleshutdown cancel'),(725,'Command: server info'),(726,'Command: server plimit'),(727,'Command: server restart'),(728,'Command: server restart cancel'),(729,'Command: server set'),(730,'Command: server set closed'),(731,'Command: server set difftime'),(732,'Command: server set loglevel'),(733,'Command: server set motd'),(734,'Command: server shutdown'),(735,'Command: server shutdown cancel'),(736,'Command: server motd'),(737,'Command: tele'),(738,'Command: tele add'),(739,'Command: tele del'),(740,'Command: tele name'),(741,'Command: tele group'),(742,'Command: ticket'),(743,'Command: ticket assign'),(744,'Command: ticket close'),(745,'Command: ticket closedlist'),(746,'Command: ticket comment'),(747,'Command: ticket complete'),(748,'Command: ticket delete'),(749,'Command: ticket escalate'),(750,'Command: ticket escalatedlist'),(751,'Command: ticket list'),(752,'Command: ticket onlinelist'),(753,'Command: ticket reset'),(754,'Command: ticket response'),(755,'Command: ticket response append'),(756,'Command: ticket response appendln'),(757,'Command: ticket togglesystem'),(758,'Command: ticket unassign'),(759,'Command: ticket viewid'),(760,'Command: ticket viewname'),(761,'Command: titles'),(762,'Command: titles add'),(763,'Command: titles current'),(764,'Command: titles remove'),(765,'Command: titles set'),(766,'Command: titles set mask'),(767,'Command: wp'),(768,'Command: wp add'),(769,'Command: wp event'),(770,'Command: wp load'),(771,'Command: wp modify'),(772,'Command: wp unload'),(773,'Command: wp reload'),(774,'Command: wp show'),(777,'Command: mailbox'),(778,'Command: ahbot'),(779,'Command: ahbot items'),(780,'Command: ahbot items gray'),(781,'Command: ahbot items white'),(782,'Command: ahbot items green'),(783,'Command: ahbot items blue'),(784,'Command: ahbot items purple'),(785,'Command: ahbot items orange'),(786,'Command: ahbot items yellow'),(787,'Command: ahbot ratio'),(788,'Command: ahbot ratio alliance'),(789,'Command: ahbot ratio horde'),(790,'Command: ahbot ratio neutral'),(791,'Command: ahbot rebuild'),(792,'Command: ahbot reload'),(793,'Command: ahbot status'),(794,'Command: .guild info'),(795,'Command: .instance setbossstate'),(796,'Command: instance getbossstate'),(797,'Command: pvpstats'),(798,'Command: .mod xp'); +INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'),(49,'Forces to enter the email for confirmation on password change'),(50,'Allow user to check his own email with .account'),(51,'Allow trading between factions'),(192,'Role: Sec Level Administrator'),(193,'Role: Sec Level Gamemaster'),(194,'Role: Sec Level Moderator'),(195,'Role: Sec Level Player'),(196,'Role: Administrator Commands'),(197,'Role: Gamemaster Commands'),(198,'Role: Moderator Commands'),(199,'Role: Player Commands'),(200,'Command: rbac'),(201,'Command: rbac account'),(202,'Command: rbac account list'),(203,'Command: rbac account grant'),(204,'Command: rbac account deny'),(205,'Command: rbac account revoke'),(206,'Command: rbac list'),(217,'Command: account'),(218,'Command: account addon'),(219,'Command: account create'),(220,'Command: account delete'),(221,'Command: account lock'),(222,'Command: account lock country'),(223,'Command: account lock ip'),(224,'Command: account onlinelist'),(225,'Command: account password'),(226,'Command: account set'),(227,'Command: account set addon'),(228,'Command: account set gmlevel'),(229,'Command: account set password'),(230,'Command: achievement'),(231,'Command: achievement add'),(232,'Command: arena'),(233,'Command: arena captain'),(234,'Command: arena create'),(235,'Command: arena disband'),(236,'Command: arena info'),(237,'Command: arena lookup'),(238,'Command: arena rename'),(239,'Command: ban'),(240,'Command: ban account'),(241,'Command: ban character'),(242,'Command: ban ip'),(243,'Command: ban playeraccount'),(244,'Command: baninfo'),(245,'Command: baninfo account'),(246,'Command: baninfo character'),(247,'Command: baninfo ip'),(248,'Command: banlist'),(249,'Command: banlist account'),(250,'Command: banlist character'),(251,'Command: banlist ip'),(252,'Command: unban'),(253,'Command: unban account'),(254,'Command: unban character'),(255,'Command: unban ip'),(256,'Command: unban playeraccount'),(257,'Command: bf'),(258,'Command: bf start'),(259,'Command: bf stop'),(260,'Command: bf switch'),(261,'Command: bf timer'),(262,'Command: bf enable'),(263,'Command: account email'),(264,'Command: account set sec'),(265,'Command: account set sec email'),(266,'Command: account set sec regmail'),(267,'Command: cast'),(268,'Command: cast back'),(269,'Command: cast dist'),(270,'Command: cast self'),(271,'Command: cast target'),(272,'Command: cast dest'),(273,'Command: character'),(274,'Command: character customize'),(275,'Command: character changefaction'),(276,'Command: character changerace'),(277,'Command: character deleted'),(279,'Command: character deleted list'),(280,'Command: character deleted restore'),(283,'Command: character level'),(284,'Command: character rename'),(285,'Command: character reputation'),(286,'Command: character titles'),(287,'Command: levelup'),(288,'Command: pdump'),(289,'Command: pdump load'),(290,'Command: pdump write'),(291,'Command: cheat'),(292,'Command: cheat casttime'),(293,'Command: cheat cooldown'),(294,'Command: cheat explore'),(295,'Command: cheat god'),(296,'Command: cheat power'),(297,'Command: cheat status'),(298,'Command: cheat taxi'),(299,'Command: cheat waterwalk'),(300,'Command: debug'),(301,'Command: debug anim'),(302,'Command: debug areatriggers'),(303,'Command: debug arena'),(304,'Command: debug bg'),(305,'Command: debug entervehicle'),(306,'Command: debug getitemstate'),(307,'Command: debug getitemvalue'),(308,'Command: debug getvalue'),(309,'Command: debug hostil'),(310,'Command: debug itemexpire'),(311,'Command: debug lootrecipient'),(312,'Command: debug los'),(313,'Command: debug mod32value'),(314,'Command: debug moveflags'),(315,'Command: debug play'),(316,'Command: debug play cinematics'),(317,'Command: debug play movie'),(318,'Command: debug play sound'),(319,'Command: debug send'),(320,'Command: debug send buyerror'),(321,'Command: debug send channelnotify'),(322,'Command: debug send chatmessage'),(323,'Command: debug send equiperror'),(324,'Command: debug send largepacket'),(325,'Command: debug send opcode'),(326,'Command: debug send qinvalidmsg'),(327,'Command: debug send qpartymsg'),(328,'Command: debug send sellerror'),(329,'Command: debug send setphaseshift'),(330,'Command: debug send spellfail'),(331,'Command: debug setaurastate'),(332,'Command: debug setbit'),(333,'Command: debug setitemvalue'),(334,'Command: debug setvalue'),(335,'Command: debug setvid'),(336,'Command: debug spawnvehicle'),(337,'Command: debug threat'),(338,'Command: debug update'),(339,'Command: debug uws'),(340,'Command: wpgps'),(341,'Command: deserter'),(342,'Command: deserter bg'),(343,'Command: deserter bg add'),(344,'Command: deserter bg remove'),(345,'Command: deserter instance'),(346,'Command: deserter instance add'),(347,'Command: deserter instance remove'),(348,'Command: disable'),(349,'Command: disable add'),(350,'Command: disable add achievement_criteria'),(351,'Command: disable add battleground'),(352,'Command: disable add map'),(353,'Command: disable add mmap'),(354,'Command: disable add outdoorpvp'),(355,'Command: disable add quest'),(356,'Command: disable add spell'),(357,'Command: disable add vmap'),(358,'Command: disable remove'),(359,'Command: disable remove achievement_criteria'),(360,'Command: disable remove battleground'),(361,'Command: disable remove map'),(362,'Command: disable remove mmap'),(363,'Command: disable remove outdoorpvp'),(364,'Command: disable remove quest'),(365,'Command: disable remove spell'),(366,'Command: disable remove vmap'),(367,'Command: event'),(368,'Command: event activelist'),(369,'Command: event start'),(370,'Command: event stop'),(371,'Command: gm'),(372,'Command: gm chat'),(373,'Command: gm fly'),(374,'Command: gm ingame'),(375,'Command: gm list'),(376,'Command: gm visible'),(377,'Command: go'),(378,'Command: go creature'),(379,'Command: go graveyard'),(380,'Command: go grid'),(381,'Command: go object'),(382,'Command: go taxinode'),(383,'Command: go ticket'),(384,'Command: go trigger'),(385,'Command: go xyz'),(386,'Command: go zonexy'),(387,'Command: gobject'),(388,'Command: gobject activate'),(389,'Command: gobject add'),(390,'Command: gobject add temp'),(391,'Command: gobject delete'),(392,'Command: gobject info'),(393,'Command: gobject move'),(394,'Command: gobject near'),(395,'Command: gobject set'),(396,'Command: gobject set phase'),(397,'Command: gobject set state'),(398,'Command: gobject target'),(399,'Command: gobject turn'),(400,'debug transport'),(401,'Command: guild'),(402,'Command: guild create'),(403,'Command: guild delete'),(404,'Command: guild invite'),(405,'Command: guild uninvite'),(406,'Command: guild rank'),(407,'Command: guild rename'),(408,'Command: honor'),(409,'Command: honor add'),(410,'Command: honor add kill'),(411,'Command: honor update'),(412,'Command: instance'),(413,'Command: instance listbinds'),(414,'Command: instance unbind'),(415,'Command: instance stats'),(416,'Command: instance savedata'),(417,'Command: learn'),(418,'Command: learn all'),(419,'Command: learn all my'),(420,'Command: learn all my class'),(421,'Command: learn all my pettalents'),(422,'Command: learn all my spells'),(423,'Command: learn all my talents'),(424,'Command: learn all gm'),(425,'Command: learn all crafts'),(426,'Command: learn all default'),(427,'Command: learn all lang'),(428,'Command: learn all recipes'),(429,'Command: unlearn'),(430,'Command: lfg'),(431,'Command: lfg player'),(432,'Command: lfg group'),(433,'Command: lfg queue'),(434,'Command: lfg clean'),(435,'Command: lfg options'),(436,'Command: list'),(437,'Command: list creature'),(438,'Command: list item'),(439,'Command: list object'),(440,'Command: list auras'),(441,'Command: list mail'),(442,'Command: lookup'),(443,'Command: lookup area'),(444,'Command: lookup creature'),(445,'Command: lookup event'),(446,'Command: lookup faction'),(447,'Command: lookup item'),(448,'Command: lookup itemset'),(449,'Command: lookup object'),(450,'Command: lookup quest'),(451,'Command: lookup player'),(452,'Command: lookup player ip'),(453,'Command: lookup player account'),(454,'Command: lookup player email'),(455,'Command: lookup skill'),(456,'Command: lookup spell'),(457,'Command: lookup spell id'),(458,'Command: lookup taxinode'),(459,'Command: lookup tele'),(460,'Command: lookup title'),(461,'Command: lookup map'),(462,'Command: announce'),(463,'Command: channel'),(464,'Command: channel set'),(465,'Command: channel set ownership'),(466,'Command: gmannounce'),(467,'Command: gmnameannounce'),(468,'Command: gmnotify'),(469,'Command: nameannounce'),(470,'Command: notify'),(471,'Command: whispers'),(472,'Command: group'),(473,'Command: group leader'),(474,'Command: group disband'),(475,'Command: group remove'),(476,'Command: group join'),(477,'Command: group list'),(478,'Command: group summon'),(479,'Command: pet'),(480,'Command: pet create'),(481,'Command: pet learn'),(482,'Command: pet unlearn'),(483,'Command: send'),(484,'Command: send items'),(485,'Command: send mail'),(486,'Command: send message'),(487,'Command: send money'),(488,'Command: additem'),(489,'Command: additemset'),(490,'Command: appear'),(491,'Command: aura'),(492,'Command: bank'),(493,'Command: bindsight'),(494,'Command: combatstop'),(495,'Command: cometome'),(496,'Command: commands'),(497,'Command: cooldown'),(498,'Command: damage'),(499,'Command: dev'),(500,'Command: die'),(501,'Command: dismount'),(502,'Command: distance'),(503,'Command: flusharenapoints'),(504,'Command: freeze'),(505,'Command: gps'),(506,'Command: guid'),(507,'Command: help'),(508,'Command: hidearea'),(509,'Command: itemmove'),(510,'Command: kick'),(511,'Command: linkgrave'),(512,'Command: listfreeze'),(513,'Command: maxskill'),(514,'Command: movegens'),(515,'Command: mute'),(516,'Command: neargrave'),(517,'Command: pinfo'),(518,'Command: playall'),(519,'Command: possess'),(520,'Command: recall'),(521,'Command: repairitems'),(522,'Command: respawn'),(523,'Command: revive'),(524,'Command: saveall'),(525,'Command: save'),(526,'Command: setskill'),(527,'Command: showarea'),(528,'Command: summon'),(529,'Command: unaura'),(530,'Command: unbindsight'),(531,'Command: unfreeze'),(532,'Command: unmute'),(533,'Command: unpossess'),(534,'Command: unstuck'),(535,'Command: wchange'),(536,'Command: mmap'),(537,'Command: mmap loadedtiles'),(538,'Command: mmap loc'),(539,'Command: mmap path'),(540,'Command: mmap stats'),(541,'Command: mmap testarea'),(542,'Command: morph'),(543,'Command: demorph'),(544,'Command: modify'),(545,'Command: modify arenapoints'),(546,'Command: modify bit'),(547,'Command: modify drunk'),(548,'Command: modify energy'),(549,'Command: modify faction'),(550,'Command: modify gender'),(551,'Command: modify honor'),(552,'Command: modify hp'),(553,'Command: modify mana'),(554,'Command: modify money'),(555,'Command: modify mount'),(556,'Command: modify phase'),(557,'Command: modify rage'),(558,'Command: modify reputation'),(559,'Command: modify runicpower'),(560,'Command: modify scale'),(561,'Command: modify speed'),(562,'Command: modify speed all'),(563,'Command: modify speed backwalk'),(564,'Command: modify speed fly'),(565,'Command: modify speed walk'),(566,'Command: modify speed swim'),(567,'Command: modify spell'),(568,'Command: modify standstate'),(569,'Command: modify talentpoints'),(570,'Command: npc'),(571,'Command: npc add'),(572,'Command: npc add formation'),(573,'Command: npc add item'),(574,'Command: npc add move'),(575,'Command: npc add temp'),(576,'Command: npc add delete'),(577,'Command: npc add delete item'),(578,'Command: npc add follow'),(579,'Command: npc add follow stop'),(580,'Command: npc set'),(581,'Command: npc set allowmove'),(582,'Command: npc set entry'),(583,'Command: npc set factionid'),(584,'Command: npc set flag'),(585,'Command: npc set level'),(586,'Command: npc set link'),(587,'Command: npc set model'),(588,'Command: npc set movetype'),(589,'Command: npc set phase'),(590,'Command: npc set spawndist'),(591,'Command: npc set spawntime'),(592,'Command: npc set data'),(593,'Command: npc info'),(594,'Command: npc near'),(595,'Command: npc move'),(596,'Command: npc playemote'),(597,'Command: npc say'),(598,'Command: npc textemote'),(599,'Command: npc whisper'),(600,'Command: npc yell'),(601,'Command: npc tame'),(602,'Command: quest'),(603,'Command: quest add'),(604,'Command: quest complete'),(605,'Command: quest remove'),(606,'Command: quest reward'),(607,'Command: reload'),(608,'Command: reload access_requirement'),(609,'Command: reload achievement_criteria_data'),(610,'Command: reload achievement_reward'),(611,'Command: reload all'),(612,'Command: reload all achievement'),(613,'Command: reload all area'),(614,'Command: broadcast_text'),(615,'Command: reload all gossips'),(616,'Command: reload all item'),(617,'Command: reload all locales'),(618,'Command: reload all loot'),(619,'Command: reload all npc'),(620,'Command: reload all quest'),(621,'Command: reload all scripts'),(622,'Command: reload all spell'),(623,'Command: reload areatrigger_involvedrelation'),(624,'Command: reload areatrigger_tavern'),(625,'Command: reload areatrigger_teleport'),(626,'Command: reload auctions'),(627,'Command: reload autobroadcast'),(628,'Command: reload command'),(629,'Command: reload conditions'),(630,'Command: reload config'),(631,'Command: reload battleground_template'),(632,'Command: .mutehistory'),(633,'Command: reload creature_linked_respawn'),(634,'Command: reload creature_loot_template'),(635,'Command: reload creature_onkill_reputation'),(636,'Command: reload creature_questender'),(637,'Command: reload creature_queststarter'),(638,'Command: reload creature_summon_groups'),(639,'Command: reload creature_template'),(640,'Command: reload creature_text'),(641,'Command: reload disables'),(642,'Command: reload disenchant_loot_template'),(643,'Command: reload event_scripts'),(644,'Command: reload fishing_loot_template'),(645,'Command: reload game_graveyard_zone'),(646,'Command: reload game_tele'),(647,'Command: reload gameobject_questender'),(648,'Command: reload gameobject_loot_template'),(649,'Command: reload gameobject_queststarter'),(650,'Command: reload gm_tickets'),(651,'Command: reload gossip_menu'),(652,'Command: reload gossip_menu_option'),(653,'Command: reload item_enchantment_template'),(654,'Command: reload item_loot_template'),(655,'Command: reload item_set_names'),(656,'Command: reload lfg_dungeon_rewards'),(657,'Command: reload locales_achievement_reward'),(658,'Command: reload locales_creature'),(659,'Command: reload locales_creature_text'),(660,'Command: reload locales_gameobject'),(661,'Command: reload locales_gossip_menu_option'),(662,'Command: reload locales_item'),(663,'Command: reload locales_item_set_name'),(664,'Command: reload locales_npc_text'),(665,'Command: reload locales_page_text'),(666,'Command: reload locales_points_of_interest'),(667,'Command: reload locales_quest'),(668,'Command: reload mail_level_reward'),(669,'Command: reload mail_loot_template'),(670,'Command: reload milling_loot_template'),(671,'Command: reload npc_spellclick_spells'),(672,'Command: reload npc_trainer'),(673,'Command: reload npc_vendor'),(674,'Command: reload page_text'),(675,'Command: reload pickpocketing_loot_template'),(676,'Command: reload points_of_interest'),(677,'Command: reload prospecting_loot_template'),(678,'Command: reload quest_poi'),(679,'Command: reload quest_template'),(680,'Command: reload rbac'),(681,'Command: reload reference_loot_template'),(682,'Command: reload reserved_name'),(683,'Command: reload reputation_reward_rate'),(684,'Command: reload reputation_spillover_template'),(685,'Command: reload skill_discovery_template'),(686,'Command: reload skill_extra_item_template'),(687,'Command: reload skill_fishing_base_level'),(688,'Command: reload skinning_loot_template'),(689,'Command: reload smart_scripts'),(690,'Command: reload spell_required'),(691,'Command: reload spell_area'),(692,'Command: reload spell_bonus_data'),(693,'Command: reload spell_group'),(694,'Command: reload spell_learn_spell'),(695,'Command: reload spell_loot_template'),(696,'Command: reload spell_linked_spell'),(697,'Command: reload spell_pet_auras'),(698,'Command: reload spell_proc_event'),(699,'Command: reload spell_proc'),(700,'Command: reload spell_scripts'),(701,'Command: reload spell_target_position'),(702,'Command: reload spell_threats'),(703,'Command: reload spell_group_stack_rules'),(704,'Command: reload trinity_string'),(705,'Command: reload warden_action'),(706,'Command: reload waypoint_scripts'),(707,'Command: reload waypoint_data'),(708,'Command: reload vehicle_accessory'),(709,'Command: reload vehicle_template_accessory'),(710,'Command: reset'),(711,'Command: reset achievements'),(712,'Command: reset honor'),(713,'Command: reset level'),(714,'Command: reset spells'),(715,'Command: reset stats'),(716,'Command: reset talents'),(717,'Command: reset all'),(718,'Command: server'),(719,'Command: server corpses'),(720,'Command: server exit'),(721,'Command: server idlerestart'),(722,'Command: server idlerestart cancel'),(723,'Command: server idleshutdown'),(724,'Command: server idleshutdown cancel'),(725,'Command: server info'),(726,'Command: server plimit'),(727,'Command: server restart'),(728,'Command: server restart cancel'),(729,'Command: server set'),(730,'Command: server set closed'),(731,'Command: server set difftime'),(732,'Command: server set loglevel'),(733,'Command: server set motd'),(734,'Command: server shutdown'),(735,'Command: server shutdown cancel'),(736,'Command: server motd'),(737,'Command: tele'),(738,'Command: tele add'),(739,'Command: tele del'),(740,'Command: tele name'),(741,'Command: tele group'),(742,'Command: ticket'),(743,'Command: ticket assign'),(744,'Command: ticket close'),(745,'Command: ticket closedlist'),(746,'Command: ticket comment'),(747,'Command: ticket complete'),(748,'Command: ticket delete'),(749,'Command: ticket escalate'),(750,'Command: ticket escalatedlist'),(751,'Command: ticket list'),(752,'Command: ticket onlinelist'),(753,'Command: ticket reset'),(754,'Command: ticket response'),(755,'Command: ticket response append'),(756,'Command: ticket response appendln'),(757,'Command: ticket togglesystem'),(758,'Command: ticket unassign'),(759,'Command: ticket viewid'),(760,'Command: ticket viewname'),(761,'Command: titles'),(762,'Command: titles add'),(763,'Command: titles current'),(764,'Command: titles remove'),(765,'Command: titles set'),(766,'Command: titles set mask'),(767,'Command: wp'),(768,'Command: wp add'),(769,'Command: wp event'),(770,'Command: wp load'),(771,'Command: wp modify'),(772,'Command: wp unload'),(773,'Command: wp reload'),(774,'Command: wp show'),(777,'Command: mailbox'),(778,'Command: ahbot'),(779,'Command: ahbot items'),(780,'Command: ahbot items gray'),(781,'Command: ahbot items white'),(782,'Command: ahbot items green'),(783,'Command: ahbot items blue'),(784,'Command: ahbot items purple'),(785,'Command: ahbot items orange'),(786,'Command: ahbot items yellow'),(787,'Command: ahbot ratio'),(788,'Command: ahbot ratio alliance'),(789,'Command: ahbot ratio horde'),(790,'Command: ahbot ratio neutral'),(791,'Command: ahbot rebuild'),(792,'Command: ahbot reload'),(793,'Command: ahbot status'),(794,'Command: .guild info'),(795,'Command: .instance setbossstate'),(796,'Command: instance getbossstate'),(797,'Command: pvpstats'),(798,'Command: .mod xp'),(835,'Command: debug loadcells'); /*!40000 ALTER TABLE `rbac_permissions` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/2015_08_21_00_auth.sql b/sql/updates/auth/2015_08_21_00_auth.sql new file mode 100644 index 00000000000..4b30d4678a1 --- /dev/null +++ b/sql/updates/auth/2015_08_21_00_auth.sql @@ -0,0 +1,5 @@ +DELETE FROM `rbac_permissions` WHERE `id` = 835; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (835, 'Command: debug loadcells'); + +DELETE FROM `rbac_linked_permissions` WHERE `id` = 192 AND `linkedId` = 835; +INSERT INTO `rbac_linked_permissions` (`ìd`, `linkedId`) VALUES (192, 835); diff --git a/sql/updates/world/2015_08_21_01_world.sql b/sql/updates/world/2015_08_21_01_world.sql new file mode 100644 index 00000000000..794e03cd0d3 --- /dev/null +++ b/sql/updates/world/2015_08_21_01_world.sql @@ -0,0 +1,2 @@ +DELETE FROM `command` WHERE `name` = 'debug loadcells'; +INSERT INTO `command` (`name`, `permission`, `help`) VALUES ('debug loadcells', 835, 'Syntax: .debug loadcells [mapId]\nLoads all cells for debugging purposes'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index bf28d76ab9c..805f613155d 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -694,6 +694,8 @@ enum RBACPermissions RBAC_PERM_COMMAND_INSTANCE_GET_BOSS_STATE = 796, RBAC_PERM_COMMAND_PVPSTATS = 797, RBAC_PERM_COMMAND_MODIFY_XP = 798, + // 799 - 834 6.x only + RBAC_PERM_COMMAND_DEBUG_LOADCELLS = 835, // custom permissions 1000+ RBAC_PERM_MAX diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index ccd82aa3ef9..7c2ce1a13ec 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -33,6 +33,7 @@ EndScriptData */ #include "GossipDef.h" #include "Transport.h" #include "Language.h" +#include "MapManager.h" #include @@ -93,6 +94,7 @@ public: { "los", rbac::RBAC_PERM_COMMAND_DEBUG_LOS, false, &HandleDebugLoSCommand, "", NULL }, { "moveflags", rbac::RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS, false, &HandleDebugMoveflagsCommand, "", NULL }, { "transport", rbac::RBAC_PERM_COMMAND_DEBUG_TRANSPORT, false, &HandleDebugTransportCommand, "", NULL }, + { "loadcells", rbac::RBAC_PERM_COMMAND_DEBUG_LOADCELLS, false, &HandleDebugLoadCellsCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = @@ -1391,6 +1393,30 @@ public: handler->PSendSysMessage("Transport %s %s", transport->GetName().c_str(), start ? "started" : "stopped"); return true; } + + static bool HandleDebugLoadCellsCommand(ChatHandler* handler, char const* args) + { + Player* player = handler->GetSession()->GetPlayer(); + if (!player) + return false; + + Map* map = nullptr; + + if (*args) + { + int32 mapId = atoi(args); + map = sMapMgr->FindBaseNonInstanceMap(mapId); + } + if (!map) + map = player->GetMap(); + + for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++) + for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++) + map->LoadGrid((cellX + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL, (cellY + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL); + + handler->PSendSysMessage("Cells loaded (mapId: %u)", map->GetId()); + return true; + } }; void AddSC_debug_commandscript() From fe07614916405464169d0fa3d4a62466308114e2 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Fri, 21 Aug 2015 22:57:29 -0300 Subject: [PATCH 029/110] Scripts/TheEye: Update Kael'thas Sunstrider's script Closes #4180 Closes #4181 Closes #8479 Updates #1885 --- sql/updates/world/2015_08_21_02_world.sql | 10 + .../Outland/TempestKeep/Eye/boss_kaelthas.cpp | 1483 ++++++++--------- .../TempestKeep/Eye/instance_the_eye.cpp | 42 +- .../scripts/Outland/TempestKeep/Eye/the_eye.h | 21 +- 4 files changed, 713 insertions(+), 843 deletions(-) create mode 100644 sql/updates/world/2015_08_21_02_world.sql diff --git a/sql/updates/world/2015_08_21_02_world.sql b/sql/updates/world/2015_08_21_02_world.sql new file mode 100644 index 00000000000..8ce0d658242 --- /dev/null +++ b/sql/updates/world/2015_08_21_02_world.sql @@ -0,0 +1,10 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` = 35941 AND `ScriptName` = 'spell_kael_gravity_lapse'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (35941, 'spell_kael_gravity_lapse'); + +UPDATE `gameobject_template` SET `flags` = `flags`|33 WHERE `entry` = 184069; + +UPDATE `creature` SET `spawntimesecs` = 604800 WHERE `guid` IN (12567, 12568, 12569, 12570); + +DELETE FROM `creature_text` WHERE `entry` = 19622 AND `groupid` = 14; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(19622, 14, 0, '%s begins to cast Pyroblast!', 41, 0, 100, 0, 0, 0, 20775, 0, 'kaelthas EMOTE_PYROBLAST'); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index e0a703d7b31..12d4421b8c4 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -25,115 +25,235 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "Spell.h" #include "the_eye.h" -#include "WorldPacket.h" -#include "Opcodes.h" enum Yells { // Kael'thas Speech - SAY_INTRO = 0, - SAY_INTRO_CAPERNIAN = 1, - SAY_INTRO_TELONICUS = 2, - SAY_INTRO_THALADRED = 3, - SAY_INTRO_SANGUINAR = 4, - SAY_PHASE2_WEAPON = 5, - SAY_PHASE3_ADVANCE = 6, - SAY_PHASE4_INTRO2 = 7, - SAY_PHASE5_NUTS = 8, - SAY_SLAY = 9, - SAY_MINDCONTROL = 10, - SAY_GRAVITYLAPSE = 11, - SAY_SUMMON_PHOENIX = 12, - SAY_DEATH = 13, + SAY_INTRO = 0, + SAY_INTRO_CAPERNIAN = 1, + SAY_INTRO_TELONICUS = 2, + SAY_INTRO_THALADRED = 3, + SAY_INTRO_SANGUINAR = 4, + SAY_PHASE2_WEAPON = 5, + SAY_PHASE3_ADVANCE = 6, + SAY_PHASE4_INTRO2 = 7, + SAY_PHASE5_NUTS = 8, + SAY_SLAY = 9, + SAY_MIND_CONTROL = 10, + SAY_GRAVITY_LAPSE = 11, + SAY_SUMMON_PHOENIX = 12, + SAY_DEATH = 13, + EMOTE_PYROBLAST = 14, // Thaladred the Darkener speech - SAY_THALADRED_AGGRO = 0, - SAY_THALADRED_DEATH = 1, - EMOTE_THALADRED_GAZE = 2, + SAY_THALADRED_AGGRO = 0, + SAY_THALADRED_DEATH = 1, + EMOTE_THALADRED_GAZE = 2, //Lord Sanguinar speech - SAY_SANGUINAR_AGGRO = 0, - SAY_SANGUINAR_DEATH = 1, + SAY_SANGUINAR_AGGRO = 0, + SAY_SANGUINAR_DEATH = 1, // Grand Astromancer Capernian speech - SAY_CAPERNIAN_AGGRO = 0, - SAY_CAPERNIAN_DEATH = 1, + SAY_CAPERNIAN_AGGRO = 0, + SAY_CAPERNIAN_DEATH = 1, // Master Engineer Telonicus speech - SAY_TELONICUS_AGGRO = 0, - SAY_TELONICUS_DEATH = 1 + SAY_TELONICUS_AGGRO = 0, + SAY_TELONICUS_DEATH = 1 }; enum Spells { // Phase 2 spells - SPELL_SUMMON_WEAPONS = 36976, - SPELL_SUMMON_WEAPONA = 36958, - SPELL_SUMMON_WEAPONB = 36959, - SPELL_SUMMON_WEAPONC = 36960, - SPELL_SUMMON_WEAPOND = 36961, - SPELL_SUMMON_WEAPONE = 36962, - SPELL_SUMMON_WEAPONF = 36963, - SPELL_SUMMON_WEAPONG = 36964, - SPELL_RES_VISUAL = 24171, + SPELL_SUMMON_WEAPONS = 36976, + SPELL_SUMMON_WEAPONA = 36958, + SPELL_SUMMON_WEAPONB = 36959, + SPELL_SUMMON_WEAPONC = 36960, + SPELL_SUMMON_WEAPOND = 36961, + SPELL_SUMMON_WEAPONE = 36962, + SPELL_SUMMON_WEAPONF = 36963, + SPELL_SUMMON_WEAPONG = 36964, + SPELL_RESSURECTION = 36450, // Phase 4 spells - SPELL_FIREBALL = 22088, //wrong but works with CastCustomSpell - SPELL_PYROBLAST = 36819, - SPELL_FLAME_STRIKE = 36735, - SPELL_FLAME_STRIKE_VIS = 36730, - SPELL_FLAME_STRIKE_DMG = 36731, - SPELL_ARCANE_DISRUPTION = 36834, - SPELL_SHOCK_BARRIER = 36815, - SPELL_PHOENIX_ANIMATION = 36723, - SPELL_MIND_CONTROL = 32830, + SPELL_FIREBALL = 36805, + SPELL_PYROBLAST = 36819, + SPELL_FLAME_STRIKE = 36735, + SPELL_FLAME_STRIKE_VIS = 36730, + SPELL_FLAME_STRIKE_DMG = 36731, + SPELL_ARCANE_DISRUPTION = 36834, + SPELL_SHOCK_BARRIER = 36815, + SPELL_PHOENIX_ANIMATION = 36723, + //SPELL_MIND_CONTROL = 32830, + SPELL_MIND_CONTROL = 36797, + SPELL_BANISH = 40370, // Cast on Phoenix // Phase 5 spells - SPELL_EXPLODE = 36092, - SPELL_FULLPOWER = 36187, - SPELL_KNOCKBACK = 11027, - SPELL_GRAVITY_LAPSE = 34480, - SPELL_GRAVITY_LAPSE_AURA = 39432, - SPELL_NETHER_BEAM = 35873, + SPELL_KAEL_GAINING_POWER = 36091, + SPELL_KAEL_EXPLODES = 36373, + SPELL_KAEL_EXPLODES2 = 36375, + SPELL_KAEL_EXPLODES3 = 36092, + SPELL_KAEL_EXPLODES4 = 36354, + SPELL_KAEL_STUNNED = 36185, + SPELL_FULLPOWER = 36187, + SPELL_NETHER_BEAM = 35873, + SPELL_PURE_NETHER_BEAM = 36196, + SPELL_SUMMON_NETHER_VAPOR = 35865, + + // Visual, phase transition spells + SPELL_NETHER_BEAM_VISUAL = 36089, // Channeled by trigger on Kael'thas. + SPELL_NETHER_BEAM_VISUAL2 = 36090, // Channeled by trigger on Kael'thas. + SPELL_NETHER_BEAM_VISUAL3 = 36364, // Cast by Kael'thas on himself, purple glowing effect. + + // Gravity Lapse spells + SPELL_GRAVITY_LAPSE = 35941, + SPELL_GRAVITY_LAPSE_PERIODIC = 34480, + SPELL_GRAVITY_LAPSE_FLIGHT_AURA = 39432, // Cast by players on themselves, allows flight + + // 25 teleport spells, one for each raid member... + SPELL_GRAVITY_LAPSE_TELE_FRONT = 35966, + SPELL_GRAVITY_LAPSE_TELE_FRONT_RIGHT = 35967, + SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT = 35968, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT = 35969, + SPELL_GRAVITY_LAPSE_TELE_BACK = 35970, + SPELL_GRAVITY_LAPSE_TELE_TO_CASTER = 35971, + SPELL_GRAVITY_LAPSE_TELE_BACK_LEFT = 35972, + SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT2 = 35973, + SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT = 35974, + SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT2 = 35975, + SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT3 = 35976, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_LEFT = 35977, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT = 35978, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK = 35979, + SPELL_GRAVITY_LAPSE_TELE_FRONT_RIGHT2 = 35980, + SPELL_GRAVITY_LAPSE_TELE_CASTER_RIGHT = 35981, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT_RIGHT = 35982, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT2 = 35983, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT_LEFT = 35984, + SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT3 = 35985, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_LEFT2 = 35986, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK2 = 35987, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT2 = 35988, + SPELL_GRAVITY_LAPSE_TELE_CASTER_RIGHT2 = 35989, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT3 = 35990, // Thaladred the Darkener spells - SPELL_PSYCHIC_BLOW = 10689, - SPELL_SILENCE = 30225, + SPELL_PSYCHIC_BLOW = 10689, + SPELL_SILENCE = 30225, // Lord Sanguinar spells - SPELL_BELLOWING_ROAR = 40636, + SPELL_BELLOWING_ROAR = 40636, // Grand Astromancer Capernian spells - SPELL_CAPERNIAN_FIREBALL = 36971, - SPELL_CONFLAGRATION = 37018, - SPELL_ARCANE_EXPLOSION = 36970, + SPELL_CAPERNIAN_FIREBALL = 36971, + SPELL_CONFLAGRATION = 37018, + SPELL_ARCANE_EXPLOSION = 36970, //Master Engineer Telonicus spells - SPELL_BOMB = 37036, - SPELL_REMOTE_TOY = 37027, + SPELL_BOMB = 37036, + SPELL_REMOTE_TOY = 37027, //Nether Vapor spell - SPELL_NETHER_VAPOR = 35859, + SPELL_NETHER_VAPOR = 35859, //Phoenix spell - SPELL_BURN = 36720, - SPELL_EMBER_BLAST = 34341, - SPELL_REBIRTH = 41587 + SPELL_BURN = 36720, + SPELL_EMBER_BLAST = 34341, + SPELL_REBIRTH = 41587 }; enum Creatures { - NPC_PHOENIX = 21362, - NPC_PHOENIX_EGG = 21364 + NPC_PHOENIX = 21362, + NPC_PHOENIX_EGG = 21364 }; enum Models { //Phoenix egg and phoenix model - MODEL_ID_PHOENIX = 19682, - MODEL_ID_PHOENIX_EGG = 20245 + MODEL_ID_PHOENIX = 19682, + MODEL_ID_PHOENIX_EGG = 20245 }; -enum Misc +enum Actions { - MAX_ADVISORS = 4 + ACTION_START_ENCOUNTER, + ACTION_REVIVE_ADVISORS, + ACTION_PREPARE_ADVISORS, + ACTION_ACTIVE_ADVISOR, + ACTION_SCHEDULE_COMBAT_EVENTS +}; + +enum Advisors +{ + ADVISOR_THALADRED, + ADVISOR_SANGUINAR, + ADVISOR_CAPERNIAN, + ADVISOR_TELONICUS, + MAX_ADVISORS = 4, + + MAX_DEFEATED_ADVISORS = 4, + MAX_KILLED_ADVISORS = 8 +}; + +enum Events +{ + EVENT_START_ENCOUNTER = 1, + EVENT_ACTIVE_ADVISOR, + EVENT_SUMMON_WEAPONS, + EVENT_REVIVE_ADVISORS, + EVENT_ENGAGE_COMBAT, + EVENT_FULL_POWER, + EVENT_FIREBALL, + EVENT_ARCANE_DISRUPTION, + EVENT_FLAMESTRIKE, + EVENT_MIND_CONTROL, + EVENT_SUMMON_PHOENIX, + EVENT_SHOCK_BARRIER, + EVENT_PYROBLAST, + EVENT_PYROBLAST_CAST, + EVENT_GAINING_POWER, + EVENT_END_TRANSITION, + EVENT_GRAVITY_LAPSE, + EVENT_NETHER_BEAM, + + // Movement updates + EVENT_TRANSITION_1, + EVENT_TRANSITION_2, + EVENT_TRANSITION_3, + EVENT_TRANSITION_4, + EVENT_TRANSITION_5, + EVENT_TRANSITION_6, + + // Phase transition + EVENT_SIZE_INCREASE, + EVENT_EXPLODE, + EVENT_RESUME_COMBAT, + + // Advisors + EVENT_DELAYED_RESSURECTION, + + // Event groups + EVENT_GROUP_COMBAT = 1, // Default abilities + EVENT_GROUP_SPECIAL = 2 // Special abilities (Pyroblast, Nether Beam, Shock Barrier) +}; + +enum Phases +{ + PHASE_NONE, + PHASE_INTRO, + PHASE_REVIVED_ADVISORS, + PHASE_COMBAT, + PHASE_TRANSITION +}; + +enum MovementPoints +{ + POINT_START_TRANSITION = 1, + POINT_TRANSITION_CENTER_ASCENDING = 2, + POINT_TRANSITION_HALFWAY_ASCENDING = 3, + POINT_TRANSITION_TOP = 4, + POINT_TRANSITION_HALFWAY_DESCENDING = 5, + POINT_END_TRANSITION = 6 }; uint32 m_auiSpellSummonWeapon[]= @@ -142,61 +262,83 @@ uint32 m_auiSpellSummonWeapon[]= SPELL_SUMMON_WEAPONE, SPELL_SUMMON_WEAPONF, SPELL_SUMMON_WEAPONG }; +uint32 GravityLapseSpells[] = +{ + SPELL_GRAVITY_LAPSE_TELE_FRONT, + SPELL_GRAVITY_LAPSE_TELE_FRONT_RIGHT, + SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT, + SPELL_GRAVITY_LAPSE_TELE_BACK, + SPELL_GRAVITY_LAPSE_TELE_TO_CASTER, + SPELL_GRAVITY_LAPSE_TELE_BACK_LEFT, + SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT2, + SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT3, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_LEFT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK, + SPELL_GRAVITY_LAPSE_TELE_FRONT_RIGHT2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_RIGHT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT_RIGHT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT_LEFT, + SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT3, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_LEFT2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_RIGHT2, + SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT3 +}; + const float CAPERNIAN_DISTANCE = 20.0f; //she casts away from the target //const float KAEL_VISIBLE_RANGE = 50.0f; -const float afGravityPos[3] = {795.0f, 0.0f, 70.0f}; +Position const afGravityPos = {795.0f, 0.0f, 70.0f}; -#define TIME_PHASE_2_3 120000 -#define TIME_PHASE_3_4 180000 +Position const TransitionPos[6] = +{ + // First two values are not static, they seem to differ on each sniff. + { 794.0522f, -0.96732f, 48.97848f, 0.0f }, + { 796.641f, -0.5888171f, 48.72847f, 3.176499f }, + { 795.007f, -0.471827f, 75.0f, 0.0f }, + { 795.007f, -0.471827f, 75.0f, 3.133458f }, + { 792.419f, -0.504778f, 50.0505f, 0.0f }, + { 792.419f, -0.504778f, 50.0505f, 3.130386f } +}; -//Base AI for Advisors struct advisorbase_ai : public ScriptedAI { advisorbase_ai(Creature* creature) : ScriptedAI(creature) { Initialize(); instance = creature->GetInstanceScript(); - m_bDoubled_Health = false; } void Initialize() { - FakeDeath = false; - DelayRes_Timer = 0; + _hasRessurrected = false; + _inFakeDeath = false; DelayRes_Target.Clear(); } - InstanceScript* instance; - bool FakeDeath; - bool m_bDoubled_Health; - uint32 DelayRes_Timer; - ObjectGuid DelayRes_Target; - void Reset() override { - if (m_bDoubled_Health) - { - me->SetMaxHealth(me->GetMaxHealth() / 2); - m_bDoubled_Health = false; - } - Initialize(); me->SetStandState(UNIT_STAND_STATE_STAND); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); //reset encounter - if (instance->GetData(DATA_KAELTHASEVENT) == 1 || instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance->GetBossState(DATA_KAELTHAS) == IN_PROGRESS) if (Creature* Kaelthas = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KAELTHAS))) Kaelthas->AI()->EnterEvadeMode(); } void MoveInLineOfSight(Unit* who) override - { - if (!who || FakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + if (!who || _inFakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return; ScriptedAI::MoveInLineOfSight(who); @@ -204,69 +346,61 @@ struct advisorbase_ai : public ScriptedAI void AttackStart(Unit* who) override { - if (!who || FakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + if (!who || _inFakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return; ScriptedAI::AttackStart(who); } - void Revive(Unit* /*Target*/) + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - // double health for phase 3 - me->SetMaxHealth(me->GetMaxHealth() * 2); - m_bDoubled_Health = true; - me->SetFullHealth(); - me->SetStandState(UNIT_STAND_STATE_STAND); - - DoCast(me, SPELL_RES_VISUAL, false); - DelayRes_Timer = 2000; + if (spell->Id == SPELL_RESSURECTION) + { + _hasRessurrected = true; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); + me->SetStandState(UNIT_STAND_STATE_STAND); + events.ScheduleEvent(EVENT_DELAYED_RESSURECTION, 2000); + } } void DamageTaken(Unit* killer, uint32 &damage) override { - if (damage < me->GetHealth()) - return; - - //Prevent glitch if in fake death - if (FakeDeath && instance->GetData(DATA_KAELTHASEVENT) != 0) - { - damage = 0; - return; - } - - //Don't really die in phase 1 & 3, only die after that - if (instance->GetData(DATA_KAELTHASEVENT) != 0) + if (damage >= me->GetHealth() && !_inFakeDeath && !_hasRessurrected) { //prevent death damage = 0; - FakeDeath = true; + _inFakeDeath = true; me->InterruptNonMeleeSpells(false); me->SetHealth(0); - me->StopMoving(); me->ClearComboPointHolders(); me->RemoveAllAurasOnDeath(); me->ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false); me->ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->ClearAllReactives(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); me->SetTarget(ObjectGuid::Empty); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); me->SetStandState(UNIT_STAND_STATE_DEAD); + me->GetMotionMaster()->Clear(); JustDied(killer); } } + void JustDied(Unit* /*killer*/) override + { + if (Creature* kael = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KAELTHAS))) + kael->AI()->DoAction(ACTION_ACTIVE_ADVISOR); + } + void UpdateAI(uint32 diff) override { - if (DelayRes_Timer) + if (_hasRessurrected) + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - if (DelayRes_Timer <= diff) + if (eventId == EVENT_DELAYED_RESSURECTION) { - DelayRes_Timer = 0; - FakeDeath = false; + _inFakeDeath = false; Unit* Target = ObjectAccessor::GetUnit(*me, DelayRes_Target); if (!Target) @@ -277,9 +411,15 @@ struct advisorbase_ai : public ScriptedAI me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(Target); me->AddThreat(Target, 0.0f); - } else DelayRes_Timer -= diff; + } } } + public: + EventMap events; + InstanceScript* instance; + bool _hasRessurrected; + bool _inFakeDeath; + ObjectGuid DelayRes_Target; }; class boss_kaelthas : public CreatureScript @@ -293,150 +433,199 @@ class boss_kaelthas : public CreatureScript boss_kaelthasAI(Creature* creature) : BossAI(creature, DATA_KAELTHAS) { Initialize(); - PhaseSubphase = 0; - Phase_Timer = 0; } void Initialize() { - Fireball_Timer = 5000 + rand32() % 10000; - ArcaneDisruption_Timer = 45000; - MindControl_Timer = 40000; - Phoenix_Timer = 50000; - ShockBarrier_Timer = 60000; - FlameStrike_Timer = 30000; - GravityLapse_Timer = 20000; - GravityLapse_Phase = 0; - NetherBeam_Timer = 8000; - NetherVapor_Timer = 10000; - PyrosCast = 0; - Phase = 0; - InGravityLapse = false; - IsCastingFireball = false; - ChainPyros = false; + _advisorCounter = 0; + _pyrosCast = 0; + _netherbeamsCast = 0; + _phase = PHASE_NONE; + _scaleStage = 0; + _hasFullPower = false; } - uint32 Fireball_Timer; - uint32 ArcaneDisruption_Timer; - uint32 Phoenix_Timer; - uint32 ShockBarrier_Timer; - uint32 GravityLapse_Timer; - uint32 GravityLapse_Phase; - uint32 NetherBeam_Timer; - uint32 NetherVapor_Timer; - uint32 FlameStrike_Timer; - uint32 MindControl_Timer; - uint32 Phase; - uint32 PhaseSubphase; //generic - uint32 Phase_Timer; //generic timer - uint32 PyrosCast; - - bool InGravityLapse; - bool IsCastingFireball; - bool ChainPyros; - - ObjectGuid m_auiAdvisorGuid[MAX_ADVISORS]; - void Reset() override { Initialize(); - - if (me->IsInCombat()) - PrepareAdvisors(); - - _Reset(); - + DoAction(ACTION_PREPARE_ADVISORS); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - instance->SetData(DATA_KAELTHASEVENT, 0); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->SetDisableGravity(false); + me->SetTarget(ObjectGuid::Empty); + me->SetObjectScale(1.0f); + BossAI::Reset(); } - void PrepareAdvisors() + void JustReachedHome() override { - for (uint8 i = 0; i < MAX_ADVISORS; ++i) - { - if (Creature* creature = ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[i])) - { - creature->Respawn(); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - creature->setFaction(me->getFaction()); - creature->AI()->EnterEvadeMode(); - } - } + BossAI::JustReachedHome(); + + // Rebuild the surrounding environment. + if (GameObject* statue = instance->GetGameObject(DATA_KAEL_STATUE_LEFT)) + statue->ResetDoorOrButton(); + + if (GameObject* statue = instance->GetGameObject(DATA_KAEL_STATUE_RIGHT)) + statue->ResetDoorOrButton(); + + if (GameObject* window = instance->GetGameObject(DATA_TEMPEST_BRIDGE_WINDOW)) + window->ResetDoorOrButton(); } - void StartEvent() + void DoAction(int32 action) override { - m_auiAdvisorGuid[0] = instance->GetGuidData(DATA_THALADREDTHEDARKENER); - m_auiAdvisorGuid[1] = instance->GetGuidData(DATA_LORDSANGUINAR); - m_auiAdvisorGuid[2] = instance->GetGuidData(DATA_GRANDASTROMANCERCAPERNIAN); - m_auiAdvisorGuid[3] = instance->GetGuidData(DATA_MASTERENGINEERTELONICUS); - - if (!m_auiAdvisorGuid[0] || !m_auiAdvisorGuid[1] || !m_auiAdvisorGuid[2] || !m_auiAdvisorGuid[3]) + switch (action) { - TC_LOG_ERROR("scripts", "Kael'Thas One or more advisors missing, Skipping Phases 1-3"); + case ACTION_START_ENCOUNTER: + Talk(SAY_INTRO); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Talk(SAY_PHASE4_INTRO2); + _advisorGuid[ADVISOR_THALADRED] = instance->GetGuidData(DATA_THALADREDTHEDARKENER); + _advisorGuid[ADVISOR_SANGUINAR] = instance->GetGuidData(DATA_LORDSANGUINAR); + _advisorGuid[ADVISOR_CAPERNIAN] = instance->GetGuidData(DATA_GRANDASTROMANCERCAPERNIAN); + _advisorGuid[ADVISOR_TELONICUS] = instance->GetGuidData(DATA_MASTERENGINEERTELONICUS); - Phase = 4; + _phase = PHASE_INTRO; + instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS); + events.ScheduleEvent(EVENT_START_ENCOUNTER, 23000); + break; + case ACTION_PREPARE_ADVISORS: + for (uint8 i = 0; i < MAX_ADVISORS; ++i) + { + if (Creature* creature = ObjectAccessor::GetCreature(*me, _advisorGuid[i])) + { + creature->Respawn(true); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + creature->AI()->EnterEvadeMode(); + } + } + break; + case ACTION_ACTIVE_ADVISOR: + // They have already been active, so we are not handling new ones, just counting their death. + if (_phase == PHASE_REVIVED_ADVISORS) + ++_advisorCounter; - instance->SetData(DATA_KAELTHASEVENT, 4); - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - } - else - { - PrepareAdvisors(); - - Talk(SAY_INTRO); - - instance->SetData(DATA_KAELTHASEVENT, 1); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - PhaseSubphase = 0; - Phase_Timer = 23000; - Phase = 1; + switch (_advisorCounter) + { + case ADVISOR_THALADRED: + Talk(SAY_INTRO_THALADRED); + events.ScheduleEvent(EVENT_ACTIVE_ADVISOR, 7000); + break; + case ADVISOR_SANGUINAR: + Talk(SAY_INTRO_SANGUINAR); + events.ScheduleEvent(EVENT_ACTIVE_ADVISOR, 12500); + break; + case ADVISOR_CAPERNIAN: + Talk(SAY_INTRO_CAPERNIAN); + events.ScheduleEvent(EVENT_ACTIVE_ADVISOR, 7000); + break; + case ADVISOR_TELONICUS: + Talk(SAY_INTRO_TELONICUS); + events.ScheduleEvent(EVENT_ACTIVE_ADVISOR, 8400); + break; + case MAX_DEFEATED_ADVISORS: + // Every advisor defeated - Phase 2 starts. + Talk(SAY_PHASE2_WEAPON); + events.ScheduleEvent(EVENT_SUMMON_WEAPONS, 3500); + break; + case MAX_KILLED_ADVISORS: + // Every advisor killed - Phase 3 starts. + events.ScheduleEvent(EVENT_ENGAGE_COMBAT, 5000); + break; + default: + break; + } + break; + case ACTION_SCHEDULE_COMBAT_EVENTS: + _phase = PHASE_COMBAT; + events.SetPhase(PHASE_COMBAT); + events.ScheduleEvent(EVENT_FIREBALL, 1000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + events.ScheduleEvent(EVENT_ARCANE_DISRUPTION, 45000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + events.ScheduleEvent(EVENT_FLAMESTRIKE, 30000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + events.ScheduleEvent(EVENT_MIND_CONTROL, 40000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + events.ScheduleEvent(EVENT_SUMMON_PHOENIX, 50000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + default: + break; } } void MoveInLineOfSight(Unit* who) override { - if (!me->HasUnitState(UNIT_STATE_STUNNED) && me->CanCreatureAttack(who)) + if (_phase == PHASE_NONE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 30.0f)) { - if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) - return; - - float attackRadius = me->GetAttackDistance(who); - if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who)) - { - if (!me->GetVictim() && Phase >= 4) - { - who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); - AttackStart(who); - } - else if (me->GetMap()->IsDungeon()) - { - if (!instance->GetData(DATA_KAELTHASEVENT) && !Phase) - StartEvent(); - - who->SetInCombatWith(me); - me->AddThreat(who, 0.0f); - } - } + DoAction(ACTION_START_ENCOUNTER); + who->SetInCombatWith(me); + me->AddThreat(who, 0.0f); + me->SetTarget(who->GetGUID()); } } - void EnterCombat(Unit* /*who*/) override + void DamageTaken(Unit* attacker, uint32& damage) override { - if (!instance->GetData(DATA_KAELTHASEVENT) && !Phase) - StartEvent(); + if (_phase == PHASE_NONE) + { + DoAction(ACTION_START_ENCOUNTER); + me->SetTarget(attacker->GetGUID()); + } - instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS); + if (!_hasFullPower && me->HealthBelowPctDamaged(50, damage)) + { + _hasFullPower = true; + me->AttackStop(); + me->InterruptNonMeleeSpells(false); + events.CancelEventGroup(EVENT_GROUP_COMBAT); + events.CancelEventGroup(EVENT_GROUP_SPECIAL); + events.SetPhase(PHASE_TRANSITION); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(POINT_START_TRANSITION, TransitionPos[0]); + } + } + + void MovementInform(uint32 type, uint32 point) override + { + if (type != POINT_MOTION_TYPE) + return; + + switch (point) + { + case POINT_START_TRANSITION: + events.ScheduleEvent(EVENT_TRANSITION_1, 1000); + break; + case POINT_TRANSITION_CENTER_ASCENDING: + me->SetFacingTo(float(M_PI)); + Talk(SAY_PHASE5_NUTS); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetDisableGravity(true); + //me->SetHover(true); -- Set in sniffs, but breaks his visual. + events.ScheduleEvent(EVENT_TRANSITION_2, 2000); + events.ScheduleEvent(EVENT_SIZE_INCREASE, 5000); + break; + case POINT_TRANSITION_HALFWAY_ASCENDING: + DoCast(me, SPELL_NETHER_BEAM_VISUAL3, true); + events.ScheduleEvent(EVENT_TRANSITION_3, 1000); + break; + case POINT_TRANSITION_TOP: + events.ScheduleEvent(EVENT_EXPLODE, 10000); + break; + case POINT_TRANSITION_HALFWAY_DESCENDING: + events.ScheduleEvent(EVENT_TRANSITION_5, 2000); + break; + case POINT_END_TRANSITION: + me->SetReactState(REACT_AGGRESSIVE); + me->InterruptNonMeleeSpells(false); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveAurasDueToSpell(SPELL_FULLPOWER); + + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + AttackStart(target); + + DoAction(ACTION_SCHEDULE_COMBAT_EVENTS); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE, 10000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + default: + break; + } } void KilledUnit(Unit* /*victim*/) override @@ -456,556 +645,224 @@ class boss_kaelthas : public CreatureScript } } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Talk(SAY_DEATH); - - instance->SetData(DATA_KAELTHASEVENT, 0); - - for (uint8 i = 0; i < MAX_ADVISORS; ++i) - { - if (Unit* pAdvisor = ObjectAccessor::GetUnit(*me, m_auiAdvisorGuid[i])) - pAdvisor->Kill(pAdvisor); - } - _JustDied(); + BossAI::JustDied(killer); } void UpdateAI(uint32 diff) override { - //Phase 1 - switch (Phase) + if (_phase == PHASE_COMBAT) + if (!UpdateVictim()) + return; + + events.Update(diff); + + // SPELL_KAEL_GAINING_POWER and SPELL_KAEL_STUNNED are channeling spells that need to be interrupted during his transition. + if (me->HasUnitState(UNIT_STATE_CASTING) && !me->FindCurrentSpellBySpellId(SPELL_KAEL_GAINING_POWER) && !me->FindCurrentSpellBySpellId(SPELL_KAEL_STUNNED)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - case 1: + switch (eventId) { - Unit* target = NULL; - Creature* Advisor = NULL; - - //Subphase switch - switch (PhaseSubphase) - { - //Subphase 1 - Start - case 0: - if (Phase_Timer <= diff) - { - Talk(SAY_INTRO_THALADRED); - - //start advisor within 7 seconds - Phase_Timer = 7000; - ++PhaseSubphase; - } else Phase_Timer -= diff; - break; - - //Subphase 1 - Unlock advisor - case 1: - if (Phase_Timer <= diff) - { - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[0])); - - if (Advisor) - { - Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Advisor->setFaction(me->getFaction()); - - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - Advisor->AI()->AttackStart(target); - } - - ++PhaseSubphase; - } else Phase_Timer -= diff; - break; - - //Subphase 2 - Start - case 2: - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[0])); - - if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) - { - Talk(SAY_INTRO_SANGUINAR); - - //start advisor within 12.5 seconds - Phase_Timer = 12500; - ++PhaseSubphase; - } - break; - - //Subphase 2 - Unlock advisor - case 3: - if (Phase_Timer <= diff) - { - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[1])); - - if (Advisor) - { - Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Advisor->setFaction(me->getFaction()); - - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - Advisor->AI()->AttackStart(target); - } - - ++PhaseSubphase; - } else Phase_Timer -= diff; - break; - - //Subphase 3 - Start - case 4: - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[1])); - - if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) - { - Talk(SAY_INTRO_CAPERNIAN); - - //start advisor within 7 seconds - Phase_Timer = 7000; - ++PhaseSubphase; - } - break; - - //Subphase 3 - Unlock advisor - case 5: - if (Phase_Timer <= diff) - { - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[2])); - - if (Advisor) - { - Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Advisor->setFaction(me->getFaction()); - - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - Advisor->AI()->AttackStart(target); - } - - ++PhaseSubphase; - } else Phase_Timer -= diff; - break; - - //Subphase 4 - Start - case 6: - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[2])); - - if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) - { - Talk(SAY_INTRO_TELONICUS); - - //start advisor within 8.4 seconds - Phase_Timer = 8400; - ++PhaseSubphase; - } - break; - - //Subphase 4 - Unlock advisor - case 7: - if (Phase_Timer <= diff) - { - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[3])); - - if (Advisor) - { - Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Advisor->setFaction(me->getFaction()); - - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) - Advisor->AI()->AttackStart(target); - } - - Phase_Timer = 3000; - ++PhaseSubphase; - } else Phase_Timer -= diff; - break; - - //End of phase 1 - case 8: - Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[3])); - - if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) - { - Phase = 2; - instance->SetData(DATA_KAELTHASEVENT, 2); - - Talk(SAY_PHASE2_WEAPON); - - PhaseSubphase = 0; - Phase_Timer = 3500; - DoCast(me, SPELL_SUMMON_WEAPONS); - } - break; - } - } - break; - - case 2: - { - if (PhaseSubphase == 0) - { - if (Phase_Timer <= diff) + case EVENT_START_ENCOUNTER: + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + DoAction(ACTION_ACTIVE_ADVISOR); + break; + case EVENT_ACTIVE_ADVISOR: + if (Creature* advisor = ObjectAccessor::GetCreature(*me, _advisorGuid[_advisorCounter])) { - PhaseSubphase = 1; - } - else - Phase_Timer -= diff; - } + advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - //Spawn weapons - if (PhaseSubphase == 1) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + advisor->AI()->AttackStart(target); + } + ++_advisorCounter; + break; + case EVENT_SUMMON_WEAPONS: { DoCast(me, SPELL_SUMMON_WEAPONS, false); - uint8 uiMaxWeapon = sizeof(m_auiSpellSummonWeapon)/sizeof(uint32); + uint8 uiMaxWeapon = sizeof(m_auiSpellSummonWeapon) / sizeof(uint32); for (uint32 i = 0; i < uiMaxWeapon; ++i) DoCast(me, m_auiSpellSummonWeapon[i], true); - PhaseSubphase = 2; - Phase_Timer = TIME_PHASE_2_3; + events.ScheduleEvent(EVENT_REVIVE_ADVISORS, 120000); + break; } - - if (PhaseSubphase == 2) - { - if (Phase_Timer <= diff) - { - Talk(SAY_PHASE3_ADVANCE); - instance->SetData(DATA_KAELTHASEVENT, 3); - Phase = 3; - PhaseSubphase = 0; - } - else - Phase_Timer -= diff; - } - } - break; - - case 3: - { - if (PhaseSubphase == 0) - { - //Respawn advisors - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - - for (uint8 i = 0; i < MAX_ADVISORS; ++i) - { - Creature* Advisor = ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[i]); - - if (!Advisor) - TC_LOG_ERROR("scripts", "SD2: Kael'Thas Advisor %u does not exist. Possibly despawned? Incorrectly Killed?", i); - else - ENSURE_AI(advisorbase_ai, Advisor->AI())->Revive(target); - } - - PhaseSubphase = 1; - Phase_Timer = TIME_PHASE_3_4; - } - - if (Phase_Timer <= diff) - { + case EVENT_REVIVE_ADVISORS: + _phase = PHASE_REVIVED_ADVISORS; + Talk(SAY_PHASE3_ADVANCE); + DoCast(me, SPELL_RESSURECTION); + break; + case EVENT_ENGAGE_COMBAT: Talk(SAY_PHASE4_INTRO2); - Phase = 4; - - instance->SetData(DATA_KAELTHASEVENT, 4); // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael. DoResetThreat(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) AttackStart(target); - Phase_Timer = 30000; - } - else - Phase_Timer -= diff; - } - break; + DoAction(ACTION_SCHEDULE_COMBAT_EVENTS); + events.ScheduleEvent(EVENT_PYROBLAST, 60000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_FIREBALL: + DoCastVictim(SPELL_FIREBALL); + events.ScheduleEvent(EVENT_FIREBALL, 2500, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_ARCANE_DISRUPTION: + DoCastVictim(SPELL_ARCANE_DISRUPTION, true); + events.ScheduleEvent(EVENT_ARCANE_DISRUPTION, 60000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_FLAMESTRIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FLAME_STRIKE); - case 4: - case 5: - case 6: - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //Fireball_Timer - if (!InGravityLapse && !ChainPyros && Phase != 5) - { - if (Fireball_Timer <= diff) - { - if (!IsCastingFireball) - { - if (!me->IsNonMeleeSpellCast(false)) - { - //interruptable - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); - int32 dmg = 20000 + rand32() % 5000; - me->CastCustomSpell(me->GetVictim(), SPELL_FIREBALL, &dmg, 0, 0, false); - IsCastingFireball = true; - Fireball_Timer = 2500; - } - } - else - { - //apply resistance - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); - IsCastingFireball = false; - Fireball_Timer = 5000 + rand32() % 10000; - } - } - else - Fireball_Timer -= diff; - - //ArcaneDisruption_Timer - if (ArcaneDisruption_Timer <= diff) - { - DoCastVictim(SPELL_ARCANE_DISRUPTION, true); - ArcaneDisruption_Timer = 60000; - } - else - ArcaneDisruption_Timer -= diff; - - if (FlameStrike_Timer <= diff) - { - if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(unit, SPELL_FLAME_STRIKE); - - FlameStrike_Timer = 30000; - } - else - FlameStrike_Timer -= diff; - - if (MindControl_Timer <= diff) - { - if (me->getThreatManager().getThreatList().size() >= 2) - for (uint32 i = 0; i < 3; ++i) - { - TC_LOG_DEBUG("scripts", "Kael'Thas mind control not supported."); - //DoCast(unit, SPELL_MIND_CONTROL); - } - - MindControl_Timer = 60000; - } - else - MindControl_Timer -= diff; - } - - //Phoenix_Timer - if (Phoenix_Timer <= diff) - { + events.ScheduleEvent(EVENT_FLAMESTRIKE, 30000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_MIND_CONTROL: + Talk(SAY_MIND_CONTROL); + DoCastAOE(SPELL_MIND_CONTROL, true); + events.ScheduleEvent(EVENT_MIND_CONTROL, 60000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_SUMMON_PHOENIX: DoCast(me, SPELL_PHOENIX_ANIMATION); Talk(SAY_SUMMON_PHOENIX); - - Phoenix_Timer = 60000; - } - else - Phoenix_Timer -= diff; - - //Phase 4 specific spells - if (Phase == 4) - { - if (HealthBelowPct(50)) + events.ScheduleEvent(EVENT_SUMMON_PHOENIX, urand(45000, 60000), EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_END_TRANSITION: + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + DoCast(SPELL_FULLPOWER); + events.ScheduleEvent(EVENT_TRANSITION_4, 2000); + break; + case EVENT_PYROBLAST: + _pyrosCast = 0; + Talk(EMOTE_PYROBLAST); + DoCast(me, SPELL_SHOCK_BARRIER); + events.DelayEvents(10000, EVENT_GROUP_COMBAT); + events.ScheduleEvent(EVENT_PYROBLAST_CAST, 1000, EVENT_GROUP_SPECIAL, PHASE_COMBAT); + break; + case EVENT_PYROBLAST_CAST: + if (_pyrosCast < 3) { - instance->SetData(DATA_KAELTHASEVENT, 4); - Phase = 5; - Phase_Timer = 10000; - - Talk(SAY_PHASE5_NUTS); - - me->StopMoving(); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); - me->SetPosition(afGravityPos[0], afGravityPos[1], afGravityPos[2], 0); - me->MonsterMoveWithSpeed(afGravityPos[0], afGravityPos[1], afGravityPos[2], 1); - - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_FULLPOWER); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } - - //ShockBarrier_Timer - if (ShockBarrier_Timer <= diff) - { - DoCast(me, SPELL_SHOCK_BARRIER); - ChainPyros = true; - PyrosCast = 0; - ShockBarrier_Timer = 60000; + DoCastVictim(SPELL_PYROBLAST); + events.ScheduleEvent(EVENT_PYROBLAST_CAST, 3000); + _pyrosCast++; } else - ShockBarrier_Timer -= diff; - - //Chain Pyros (3 of them max) - if (ChainPyros && !me->IsNonMeleeSpellCast(false)) + events.ScheduleEvent(EVENT_PYROBLAST, 60000, EVENT_GROUP_COMBAT, PHASE_COMBAT); + break; + case EVENT_GRAVITY_LAPSE: + Talk(SAY_GRAVITY_LAPSE); + DoCastAOE(SPELL_GRAVITY_LAPSE); + DoCast(me, SPELL_NETHER_VAPOR); + events.DelayEvents(24000, EVENT_GROUP_COMBAT); + events.ScheduleEvent(EVENT_NETHER_BEAM, 3000, EVENT_GROUP_SPECIAL, PHASE_COMBAT); + events.ScheduleEvent(EVENT_SHOCK_BARRIER, 1000, EVENT_GROUP_SPECIAL, PHASE_COMBAT); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE, 30000, EVENT_GROUP_SPECIAL, PHASE_COMBAT); + break; + case EVENT_NETHER_BEAM: + if (_netherbeamsCast <= 8) { - if (PyrosCast < 3) - { - DoCastVictim(SPELL_PYROBLAST); - ++PyrosCast; - } - else - { - ChainPyros = false; - Fireball_Timer = 2500; - ArcaneDisruption_Timer = 60000; - } - } - } + if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(unit, SPELL_NETHER_BEAM); - if (Phase == 5) - { - if (Phase_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - me->RemoveAurasDueToSpell(SPELL_FULLPOWER); - - DoCast(me, SPELL_EXPLODE); - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Phase = 6; - AttackStart(me->GetVictim()); + _netherbeamsCast++; + events.ScheduleEvent(EVENT_NETHER_BEAM, 3000); } else - Phase_Timer -= diff; - } + _netherbeamsCast = 0; + break; + case EVENT_TRANSITION_1: + me->GetMotionMaster()->MovePoint(POINT_TRANSITION_CENTER_ASCENDING, TransitionPos[1]); + break; + case EVENT_TRANSITION_2: + DoCast(me, SPELL_KAEL_GAINING_POWER); + me->GetMotionMaster()->Clear(); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); + me->GetMotionMaster()->MovePoint(POINT_TRANSITION_HALFWAY_ASCENDING, TransitionPos[2], false); + break; + case EVENT_TRANSITION_3: + me->GetMotionMaster()->MovePoint(POINT_TRANSITION_TOP, TransitionPos[3], false); + break; + case EVENT_TRANSITION_4: + me->GetMotionMaster()->MovePoint(POINT_TRANSITION_HALFWAY_DESCENDING, TransitionPos[4], false); + break; + case EVENT_TRANSITION_5: + me->GetMotionMaster()->MovePoint(POINT_END_TRANSITION, TransitionPos[5], false); + break; + case EVENT_EXPLODE: + me->InterruptNonMeleeSpells(false); + me->RemoveAurasDueToSpell(SPELL_NETHER_BEAM_VISUAL3); + DoCast(me, SPELL_KAEL_EXPLODES3, true); + DoCast(me, SPELL_KAEL_STUNNED); // Core doesn't handle the emote properly while flying. + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DROWNED); - //Phase 5 - if (Phase == 6) - { - //GravityLapse_Timer - if (GravityLapse_Timer <= diff) + // Destroy the surrounding environment. + if (GameObject* statue = instance->GetGameObject(DATA_KAEL_STATUE_LEFT)) + statue->UseDoorOrButton(); + + if (GameObject* statue = instance->GetGameObject(DATA_KAEL_STATUE_RIGHT)) + statue->UseDoorOrButton(); + + if (GameObject* window = instance->GetGameObject(DATA_TEMPEST_BRIDGE_WINDOW)) + window->UseDoorOrButton(); + + events.ScheduleEvent(EVENT_END_TRANSITION, 10000); + break; + case EVENT_SIZE_INCREASE: + switch (_scaleStage) { - ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); - ThreatContainer::StorageType::const_iterator i = threatlist.begin(); - - switch (GravityLapse_Phase) - { - case 0: - me->StopMoving(); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); - me->SetPosition(afGravityPos[0], afGravityPos[1], afGravityPos[2], 0); - me->MonsterMoveWithSpeed(afGravityPos[0], afGravityPos[1], afGravityPos[2], 0); - - // 1) Kael'thas will portal the whole raid right into his body - for (i = threatlist.begin(); i != threatlist.end(); ++i) - { - Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); - if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) - { - //Use work around packet to prevent player from being dropped from combat - DoTeleportPlayer(unit, afGravityPos[0], afGravityPos[1], afGravityPos[2], unit->GetOrientation()); - } - } - - GravityLapse_Timer = 500; - ++GravityLapse_Phase; - InGravityLapse = true; - ShockBarrier_Timer = 1000; - NetherBeam_Timer = 5000; - break; - - case 1: - Talk(SAY_GRAVITYLAPSE); - - // 2) At that point he will put a Gravity Lapse debuff on everyone - for (i = threatlist.begin(); i != threatlist.end(); ++i) - { - if (Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) - { - DoCast(unit, SPELL_KNOCKBACK, true); - //Gravity lapse - needs an exception in Spell system to work - - unit->CastSpell(unit, SPELL_GRAVITY_LAPSE, true, 0, 0, me->GetGUID()); - unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_AURA, true, 0, 0, me->GetGUID()); - - //Using packet workaround - WorldPacket data(SMSG_MOVE_SET_CAN_FLY, 12); - data << unit->GetPackGUID(); - data << uint32(0); - unit->SendMessageToSet(&data, true); - } - } - GravityLapse_Timer = 10000; - ++GravityLapse_Phase; - break; - - case 2: - //Cast nether vapor aura on self - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_NETHER_VAPOR); - - GravityLapse_Timer = 20000; - ++GravityLapse_Phase; - break; - - case 3: - //Remove flight - for (i = threatlist.begin(); i != threatlist.end(); ++i) - { - if (Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) - { - //Using packet workaround - WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY, 12); - data << unit->GetPackGUID(); - data << uint32(0); - unit->SendMessageToSet(&data, true); - } - } - - me->RemoveAurasDueToSpell(SPELL_NETHER_VAPOR); - InGravityLapse = false; - GravityLapse_Timer = 60000; - GravityLapse_Phase = 0; - AttackStart(me->GetVictim()); - break; - } + case 0: + me->SetObjectScale(1.4f); + events.ScheduleEvent(EVENT_SIZE_INCREASE, 5000); + break; + case 1: + me->SetObjectScale(1.8f); + events.ScheduleEvent(EVENT_SIZE_INCREASE, 3000); + break; + case 2: + me->SetObjectScale(2.0f); + events.ScheduleEvent(EVENT_SIZE_INCREASE, 1000); + break; + case 3: + me->SetObjectScale(2.2f); + break; + default: + break; } - else - GravityLapse_Timer -= diff; - - if (InGravityLapse) - { - //ShockBarrier_Timer - if (ShockBarrier_Timer <= diff) - { - DoCast(me, SPELL_SHOCK_BARRIER); - ShockBarrier_Timer = 20000; - } - else - ShockBarrier_Timer -= diff; - - //NetherBeam_Timer - if (NetherBeam_Timer <= diff) - { - if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(unit, SPELL_NETHER_BEAM); - - NetherBeam_Timer = 4000; - } - else - NetherBeam_Timer -= diff; - } - } - - if (!InGravityLapse) - DoMeleeAttackIfReady(); + ++_scaleStage; + break; + default: + break; } } + + if (events.IsInPhase(PHASE_COMBAT)) + DoMeleeAttackIfReady(); } + private: + uint8 _advisorCounter; + uint8 _phase; + uint8 _pyrosCast; + uint8 _scaleStage; + uint8 _netherbeamsCast; + bool _hasFullPower; + ObjectGuid _advisorGuid[MAX_ADVISORS]; }; + CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); } }; -//Thaladred the Darkener AI class boss_thaladred_the_darkener : public CreatureScript { public: @@ -1039,32 +896,23 @@ class boss_thaladred_the_darkener : public CreatureScript void EnterCombat(Unit* who) override { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (!who || FakeDeath) - return; - Talk(SAY_THALADRED_AGGRO); me->AddThreat(who, 5000000.0f); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { - if (instance->GetData(DATA_KAELTHASEVENT) == 3) + if (_hasRessurrected) Talk(SAY_THALADRED_DEATH); + + advisorbase_ai::JustDied(killer); } void UpdateAI(uint32 diff) override { advisorbase_ai::UpdateAI(diff); - //Faking death, don't do anything - if (FakeDeath) - return; - - //Return since we have no target - if (!UpdateVictim()) + if (!UpdateVictim() || _inFakeDeath) return; //Gaze_Timer @@ -1109,7 +957,6 @@ class boss_thaladred_the_darkener : public CreatureScript } }; -//Lord Sanguinar AI class boss_lord_sanguinar : public CreatureScript { public: @@ -1136,33 +983,24 @@ class boss_lord_sanguinar : public CreatureScript advisorbase_ai::Reset(); } - void EnterCombat(Unit* who) override + void EnterCombat(Unit* /*who*/) override { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (!who || FakeDeath) - return; - Talk(SAY_SANGUINAR_AGGRO); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { - if (instance->GetData(DATA_KAELTHASEVENT) == 3) + if (_hasRessurrected) Talk(SAY_SANGUINAR_DEATH); + + advisorbase_ai::JustDied(killer); } void UpdateAI(uint32 diff) override { advisorbase_ai::UpdateAI(diff); - //Faking death, don't do anything - if (FakeDeath) - return; - - //Return since we have no target - if (!UpdateVictim()) + if (!UpdateVictim() || _inFakeDeath) return; //Fear_Timer @@ -1182,7 +1020,7 @@ class boss_lord_sanguinar : public CreatureScript return GetInstanceAI(creature); } }; -//Grand Astromancer Capernian AI + class boss_grand_astromancer_capernian : public CreatureScript { public: @@ -1218,15 +1056,17 @@ class boss_grand_astromancer_capernian : public CreatureScript advisorbase_ai::Reset(); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { - if (instance->GetData(DATA_KAELTHASEVENT) == 3) + if (_hasRessurrected) Talk(SAY_CAPERNIAN_DEATH); + + advisorbase_ai::JustDied(killer); } void AttackStart(Unit* who) override { - if (!who || FakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + if (!who || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return; if (me->Attack(who, true)) @@ -1239,39 +1079,18 @@ class boss_grand_astromancer_capernian : public CreatureScript } } - void EnterCombat(Unit* who) override + void EnterCombat(Unit* /*who*/) override { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (!who || FakeDeath) - return; + Talk(SAY_CAPERNIAN_AGGRO); } void UpdateAI(uint32 diff) override { advisorbase_ai::UpdateAI(diff); - //Faking Death, don't do anything - if (FakeDeath) + if (!UpdateVictim() || _inFakeDeath) return; - //Return since we have no target - if (!UpdateVictim()) - return; - - //Yell_Timer - if (!Yell) - { - if (Yell_Timer <= diff) - { - Talk(SAY_CAPERNIAN_AGGRO); - Yell = true; - } - else - Yell_Timer -= diff; - } - //Fireball_Timer if (Fireball_Timer <= diff) { @@ -1333,7 +1152,6 @@ class boss_grand_astromancer_capernian : public CreatureScript } }; -//Master Engineer Telonicus AI class boss_master_engineer_telonicus : public CreatureScript { public: @@ -1363,20 +1181,16 @@ class boss_master_engineer_telonicus : public CreatureScript advisorbase_ai::Reset(); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { - if (instance->GetData(DATA_KAELTHASEVENT) == 3) + if (_hasRessurrected) Talk(SAY_TELONICUS_DEATH); + + advisorbase_ai::JustDied(killer); } - void EnterCombat(Unit* who) override + void EnterCombat(Unit* /*who*/) override { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (!who || FakeDeath) - return; - Talk(SAY_TELONICUS_AGGRO); } @@ -1384,12 +1198,7 @@ class boss_master_engineer_telonicus : public CreatureScript { advisorbase_ai::UpdateAI(diff); - //Faking Death, do nothing - if (FakeDeath) - return; - - //Return since we have no target - if (!UpdateVictim()) + if (!UpdateVictim() || _inFakeDeath) return; //Bomb_Timer @@ -1422,7 +1231,6 @@ class boss_master_engineer_telonicus : public CreatureScript } }; -//Flame Strike AI class npc_kael_flamestrike : public CreatureScript { public: @@ -1493,7 +1301,6 @@ class npc_kael_flamestrike : public CreatureScript } }; -//Phoenix AI class npc_phoenix_tk : public CreatureScript { public: @@ -1553,7 +1360,6 @@ class npc_phoenix_tk : public CreatureScript } }; -//Phoenix Egg AI class npc_phoenix_egg_tk : public CreatureScript { public: @@ -1620,6 +1426,54 @@ class npc_phoenix_egg_tk : public CreatureScript } }; +// 35941 - Gravity Lapse +class spell_kael_gravity_lapse : public SpellScriptLoader +{ + public: + spell_kael_gravity_lapse() : SpellScriptLoader("spell_kael_gravity_lapse") { } + + class spell_kael_gravity_lapse_SpellScript : public SpellScript + { + PrepareSpellScript(spell_kael_gravity_lapse_SpellScript); + + public: + spell_kael_gravity_lapse_SpellScript() + { + _targetCount = 0; + } + + bool Validate(SpellInfo const* /*spell*/) override + { + for (uint8 i = 0; i < 25; ++i) + if (!sSpellMgr->GetSpellInfo(GravityLapseSpells[i])) + return false; + + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), GravityLapseSpells[_targetCount], true); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GRAVITY_LAPSE_PERIODIC, true); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GRAVITY_LAPSE_FLIGHT_AURA, true); + _targetCount++; + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_kael_gravity_lapse_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + private: + uint8 _targetCount; + }; + + SpellScript* GetSpellScript() const override + { + return new spell_kael_gravity_lapse_SpellScript(); + } +}; + void AddSC_boss_kaelthas() { new boss_kaelthas(); @@ -1630,4 +1484,5 @@ void AddSC_boss_kaelthas() new npc_kael_flamestrike(); new npc_phoenix_tk(); new npc_phoenix_egg_tk(); + new spell_kael_gravity_lapse(); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp index c421b9974ce..173e0596bea 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp @@ -34,6 +34,21 @@ EndScriptData */ 3 - Void Reaver event */ +DoorData const doorData[] = +{ + { GO_ARCANE_DOOR_LEFT, DATA_KAELTHAS, DOOR_TYPE_ROOM, BOUNDARY_SW }, + { GO_ARCANE_DOOR_RIGHT, DATA_KAELTHAS, DOOR_TYPE_ROOM, BOUNDARY_SE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; + +ObjectData const gameObjectData[] = +{ + { GO_KAEL_STATUE_RIGHT, DATA_KAEL_STATUE_RIGHT }, + { GO_KAEL_STATUE_LEFT, DATA_KAEL_STATUE_LEFT }, + { GO_TEMPEST_BRIDDGE_WINDOW, DATA_TEMPEST_BRIDGE_WINDOW }, + { 0, 0 } // END +}; + class instance_the_eye : public InstanceMapScript { public: @@ -45,8 +60,8 @@ class instance_the_eye : public InstanceMapScript { SetHeaders(DataHeader); SetBossNumber(EncounterCount); - - KaelthasEventPhase = 0; + LoadDoorData(doorData); + LoadObjectData(nullptr, gameObjectData); } ObjectGuid ThaladredTheDarkener; @@ -56,7 +71,6 @@ class instance_the_eye : public InstanceMapScript ObjectGuid Kaelthas; ObjectGuid Astromancer; ObjectGuid Alar; - uint8 KaelthasEventPhase; void OnCreatureCreate(Creature* creature) override { @@ -102,28 +116,6 @@ class instance_the_eye : public InstanceMapScript } return ObjectGuid::Empty; } - - void SetData(uint32 type, uint32 data) override - { - switch (type) - { - case DATA_KAELTHASEVENT: - KaelthasEventPhase = data; - break; - default: - break; - } - } - - uint32 GetData(uint32 type) const override - { - switch (type) - { - case DATA_KAELTHASEVENT: - return KaelthasEventPhase; - } - return 0; - } }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h index c46fe408274..ca60e14e923 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h +++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h @@ -33,10 +33,14 @@ enum DataTypes DATA_ASTROMANCER = 4, DATA_GRANDASTROMANCERCAPERNIAN = 5, - DATA_KAELTHASEVENT = 6, - DATA_LORDSANGUINAR = 7, - DATA_MASTERENGINEERTELONICUS = 8, - DATA_THALADREDTHEDARKENER = 9 + DATA_LORDSANGUINAR = 6, + DATA_MASTERENGINEERTELONICUS = 7, + DATA_THALADREDTHEDARKENER = 8, + + // Additional Data + DATA_KAEL_STATUE_LEFT = 9, + DATA_KAEL_STATUE_RIGHT = 10, + DATA_TEMPEST_BRIDGE_WINDOW = 11 }; enum CreatureIds @@ -50,4 +54,13 @@ enum CreatureIds NPC_ALAR = 19514 }; +enum GameObjectIds +{ + GO_TEMPEST_BRIDDGE_WINDOW = 184069, + GO_KAEL_STATUE_RIGHT = 184596, + GO_KAEL_STATUE_LEFT = 184597, + GO_ARCANE_DOOR_LEFT = 184324, + GO_ARCANE_DOOR_RIGHT = 184325 +}; + #endif From 8b27b6197848f84a8fe86a6c36c6669f8f006e8d Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Fri, 21 Aug 2015 23:20:45 -0300 Subject: [PATCH 030/110] Scripts\MoltenCore: Disable Ragnaros' combat movement --- .../BlackrockMountain/MoltenCore/boss_ragnaros.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 9fd81b6a0f6..e2202a7e526 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -86,6 +86,7 @@ class boss_ragnaros : public CreatureScript _introState = 0; me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + SetCombatMovement(false); } void Initialize() From 32f4f9718ff1eee6e801dc16c7b9205b0b2aa5e9 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sat, 22 Aug 2015 04:40:21 +0200 Subject: [PATCH 031/110] DB/Misc: Typo fix --- sql/updates/auth/2015_08_21_00_auth.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/updates/auth/2015_08_21_00_auth.sql b/sql/updates/auth/2015_08_21_00_auth.sql index 4b30d4678a1..f4396cc68c0 100644 --- a/sql/updates/auth/2015_08_21_00_auth.sql +++ b/sql/updates/auth/2015_08_21_00_auth.sql @@ -2,4 +2,4 @@ DELETE FROM `rbac_permissions` WHERE `id` = 835; INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (835, 'Command: debug loadcells'); DELETE FROM `rbac_linked_permissions` WHERE `id` = 192 AND `linkedId` = 835; -INSERT INTO `rbac_linked_permissions` (`ìd`, `linkedId`) VALUES (192, 835); +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES (192, 835); From b28849003c881d0a05624195d435ea903c13d4f8 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Sat, 22 Aug 2015 00:14:46 -0300 Subject: [PATCH 032/110] Scripts/OnyxiasLair: Force Onyxia to enter evade mode if pulled out of her room --- .../scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 76fe8819716..65d6565ad9a 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -316,9 +316,20 @@ public: MovePoint = iTemp; } + bool CheckInRoom() override + { + if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 95.0f) + { + EnterEvadeMode(); + return false; + } + + return true; + } + void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) + if (!UpdateVictim() || !CheckInRoom()) return; //Common to PHASE_START && PHASE_END From 68e6c95f16dc978066bb957407a1c3bfd4cb8505 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sat, 22 Aug 2015 21:05:37 +0200 Subject: [PATCH 033/110] Core/Scripts: Fix noPCH compile --- src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 12d4421b8c4..0dc75ff8efa 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "Spell.h" +#include "SpellScript.h" #include "the_eye.h" enum Yells From c14b66c24c3c0afe222a0401171e882d4a1f98d9 Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Sun, 23 Aug 2015 10:47:16 +0100 Subject: [PATCH 034/110] Core/Players: Improve rest state handling, allow several rest states to be active Fixes https://github.com/TrinityCore/TrinityCore/issues/15325 --- src/server/game/Entities/Player/Player.cpp | 109 ++++++++++----------- src/server/game/Entities/Player/Player.h | 35 ++----- src/server/game/Handlers/MiscHandler.cpp | 4 +- 3 files changed, 61 insertions(+), 87 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 362c40a0982..d531bac2a84 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -749,7 +749,6 @@ Player::Player(WorldSession* session): Unit(true) m_MirrorTimerFlagsLast = UNDERWATER_NONE; m_isInWater = false; m_drunkTimer = 0; - m_restTime = 0; m_deathTimer = 0; m_deathExpireTime = 0; @@ -780,10 +779,10 @@ Player::Player(WorldSession* session): Unit(true) m_lastpetnumber = 0; ////////////////////Rest System///////////////////// - time_inn_enter = 0; + _restTime = 0; inn_triggerId = 0; m_rest_bonus = 0; - rest_type = REST_TYPE_NO; + _restFlagMask = 0; ////////////////////Rest System///////////////////// m_mailsLoaded = false; @@ -1723,15 +1722,20 @@ void Player::Update(uint32 p_time) if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) { - if (roll_chance_i(3) && GetTimeInnEnter() > 0) // freeze update + if (roll_chance_i(3) && _restTime > 0) // freeze update { - time_t time_inn = time(NULL)-GetTimeInnEnter(); - if (time_inn >= 10) // freeze update + time_t currTime = time(nullptr); + time_t timeDiff = currTime - _restTime; + if (timeDiff >= 10) // freeze update { - float bubble = 0.125f*sWorld->getRate(RATE_REST_INGAME); - // speed collect rest bonus (section/in hour) - SetRestBonus(GetRestBonus()+ time_inn*((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP)/72000)*bubble); - UpdateInnerTime(time(NULL)); + _restTime = currTime; + + float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME); + float extraPerSec = ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) * bubble; + + // speed collect rest bonus (section/in hour) + float currRestBonus = GetRestBonus(); + SetRestBonus(currRestBonus + timeDiff * extraPerSec); } } } @@ -1749,14 +1753,11 @@ void Player::Update(uint32 p_time) if (p_time >= m_zoneUpdateTimer) { // On zone update tick check if we are still in an inn if we are supposed to be in one - if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) && GetRestType() == REST_TYPE_IN_TAVERN) + if (HasRestFlag(REST_FLAG_IN_TAVERN)) { AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(GetInnTriggerId()); if (!atEntry || !IsInAreaTriggerRadius(atEntry)) - { - RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - SetRestType(REST_TYPE_NO); - } + RemoveRestFlag(REST_FLAG_IN_TAVERN); } uint32 newzone, newarea; @@ -1949,12 +1950,6 @@ void Player::setDeathState(DeathState s) SetUInt32Value(PLAYER_SELF_RES_SPELL, 0); } -void Player::InnEnter(time_t time, uint32 triggerId) -{ - inn_triggerId = triggerId; - time_inn_enter = time; -} - bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) { // 0 1 2 3 4 5 6 7 @@ -7341,7 +7336,7 @@ void Player::UpdateArea(uint32 newArea) { // FFA_PVP flags are area and not zone id dependent // so apply them accordingly - m_areaUpdateId = newArea; + m_areaUpdateId = newArea; AreaTableEntry const* area = GetAreaEntryByAreaID(newArea); pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA); @@ -7363,16 +7358,9 @@ void Player::UpdateArea(uint32 newArea) uint32 const areaRestFlag = (GetTeam() == ALLIANCE) ? AREA_FLAG_REST_ZONE_ALLIANCE : AREA_FLAG_REST_ZONE_HORDE; if (area && area->flags & areaRestFlag) - { - SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - SetRestType(REST_TYPE_IN_FACTION_AREA); - InnEnter(time(nullptr), 0); - } - else if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) && GetRestType() == REST_TYPE_IN_FACTION_AREA) - { - RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - SetRestType(REST_TYPE_NO); - } + SetRestFlag(REST_FLAG_IN_FACTION_AREA); + else + RemoveRestFlag(REST_FLAG_IN_FACTION_AREA); } void Player::UpdateZone(uint32 newZone, uint32 newArea) @@ -7438,36 +7426,12 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city { if (!pvpInfo.IsHostile || zone->IsSanctuary()) - { - SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - SetRestType(REST_TYPE_IN_CITY); - InnEnter(time(nullptr), 0); - } + SetRestFlag(REST_FLAG_IN_CITY); + pvpInfo.IsInNoPvPArea = true; } else - { - if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) - { - if (GetRestType() == REST_TYPE_IN_TAVERN) // Still inside a tavern or has recently left - { - // check that we are still inside the tavern (in areatrigger radius) - - AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(GetInnTriggerId()); - if (!atEntry || !IsInAreaTriggerRadius(atEntry)) - { - RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - SetRestType(REST_TYPE_NO); - } - } - else if (GetRestType() != REST_TYPE_IN_FACTION_AREA) // handled in UpdateArea - { - // Recently left a capital city - RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - SetRestType(REST_TYPE_NO); - } - } - } + RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city UpdatePvPState(); @@ -26588,3 +26552,30 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha return true; } + +void Player::SetRestFlag(RestFlag restFlag, uint32 triggerId /*= 0*/) +{ + uint32 oldRestMask = _restFlagMask; + _restFlagMask |= restFlag; + + if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state + { + _restTime = time(nullptr); + SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); + } + + if (triggerId) + inn_triggerId = triggerId; +} + +void Player::RemoveRestFlag(RestFlag restFlag) +{ + uint32 oldRestMask = _restFlagMask; + _restFlagMask &= ~restFlag; + + if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove + { + _restTime = 0; + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); + } +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 42fa6dc2ea3..a031840a1d8 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -737,12 +737,11 @@ enum ArenaTeamInfoType class InstanceSave; -enum RestType +enum RestFlag { - REST_TYPE_NO = 0, - REST_TYPE_IN_TAVERN = 1, - REST_TYPE_IN_CITY = 2, - REST_TYPE_IN_FACTION_AREA = 3 // used with AREA_FLAG_REST_ZONE_* + REST_FLAG_IN_TAVERN = 0x1, + REST_FLAG_IN_CITY = 0x2, + REST_FLAG_IN_FACTION_AREA = 0x4, // used with AREA_FLAG_REST_ZONE_* }; enum TeleportToOptions @@ -1187,19 +1186,16 @@ class Player : public Unit, public GridObject void setDeathState(DeathState s) override; // overwrite Unit::setDeathState - void InnEnter(time_t time, uint32 triggerId); - float GetRestBonus() const { return m_rest_bonus; } void SetRestBonus(float rest_bonus_new); - RestType GetRestType() const { return rest_type; } - void SetRestType(RestType n_r_type) { rest_type = n_r_type; } + bool HasRestFlag(RestFlag restFlag) const { return (_restFlagMask & restFlag) != 0; } + void SetRestFlag(RestFlag restFlag, uint32 triggerId = 0); + void RemoveRestFlag(RestFlag restFlag); + uint32 GetXPRestBonus(uint32 xp); uint32 GetInnTriggerId() const { return inn_triggerId; } - time_t GetTimeInnEnter() const { return time_inn_enter; } - void UpdateInnerTime (time_t time) { time_inn_enter = time; } - Pet* GetPet() const; Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 despwtime); void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false); @@ -2071,15 +2067,6 @@ class Player : public Unit, public GridObject // returns true if the player is in active state for outdoor pvp objective capturing, false otherwise bool IsOutdoorPvPActive(); - /*********************************************************/ - /*** REST SYSTEM ***/ - /*********************************************************/ - - bool isRested() const { return GetRestTime() >= 10*IN_MILLISECONDS; } - uint32 GetXPRestBonus(uint32 xp); - uint32 GetRestTime() const { return m_restTime;} - void SetRestTime(uint32 v) { m_restTime = v;} - /*********************************************************/ /*** ENVIROMENTAL SYSTEM ***/ /*********************************************************/ @@ -2515,8 +2502,6 @@ class Player : public Unit, public GridObject uint32 m_deathTimer; time_t m_deathExpireTime; - uint32 m_restTime; - uint32 m_WeaponProficiency; uint32 m_ArmorProficiency; bool m_canParry; @@ -2526,10 +2511,10 @@ class Player : public Unit, public GridObject float m_ammoDPS; ////////////////////Rest System///////////////////// - time_t time_inn_enter; + time_t _restTime; uint32 inn_triggerId; float m_rest_bonus; - RestType rest_type; + uint32 _restFlagMask; ////////////////////Rest System///////////////////// uint32 m_resetTalentsCost; time_t m_resetTalentsTime; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 683b77e7aa0..7a9760ecf80 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -844,9 +844,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recvData) if (sObjectMgr->IsTavernAreaTrigger(triggerId)) { // set resting flag we are in the inn - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); - player->InnEnter(time(nullptr), atEntry->id); - player->SetRestType(REST_TYPE_IN_TAVERN); + player->SetRestFlag(REST_FLAG_IN_TAVERN, atEntry->id); if (sWorld->IsFFAPvPRealm()) player->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); From df21162fe44d2ff29c201a9004586f560789c38b Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sun, 23 Aug 2015 14:43:11 +0200 Subject: [PATCH 035/110] Scripts/VioletHold: rewrote the whole instance thanks @MitchesD for help --- sql/updates/world/2015_08_23_00_world.sql | 157 ++ .../game/AI/ScriptedAI/ScriptedCreature.cpp | 16 +- .../game/AI/ScriptedAI/ScriptedCreature.h | 4 + .../game/AI/ScriptedAI/ScriptedEscortAI.h | 4 +- src/server/game/Entities/Player/Player.cpp | 11 + src/server/game/Instances/InstanceScript.cpp | 5 + src/server/game/Instances/InstanceScript.h | 2 + src/server/game/Movement/MotionMaster.cpp | 18 + src/server/game/Movement/MotionMaster.h | 1 + src/server/game/Spells/SpellMgr.cpp | 13 + .../EasternKingdoms/Gnomeregan/gnomeregan.cpp | 2 +- .../EasternKingdoms/zone_hinterlands.cpp | 2 +- .../scripts/Kalimdor/zone_the_barrens.cpp | 2 +- .../scripts/Kalimdor/zone_winterspring.cpp | 2 +- .../RubySanctum/boss_general_zarithrian.cpp | 2 +- .../Northrend/Gundrak/instance_gundrak.cpp | 3 +- .../IcecrownCitadel/icecrown_citadel.cpp | 2 +- .../instance_icecrown_citadel.cpp | 4 +- .../Ulduar/HallsOfStone/halls_of_stone.cpp | 2 +- .../HallsOfStone/instance_halls_of_stone.cpp | 3 +- .../Northrend/VioletHold/boss_cyanigosa.cpp | 188 +- .../Northrend/VioletHold/boss_erekem.cpp | 518 ++--- .../Northrend/VioletHold/boss_ichoron.cpp | 785 +++---- .../Northrend/VioletHold/boss_lavanthor.cpp | 164 +- .../Northrend/VioletHold/boss_moragg.cpp | 260 +-- .../Northrend/VioletHold/boss_xevozz.cpp | 467 ++-- .../Northrend/VioletHold/boss_zuramat.cpp | 309 ++- .../VioletHold/instance_violet_hold.cpp | 1419 +++++++----- .../Northrend/VioletHold/violet_hold.cpp | 2053 ++++++++--------- .../Northrend/VioletHold/violet_hold.h | 114 +- .../scripts/Northrend/zone_borean_tundra.cpp | 2 +- .../scripts/Northrend/zone_howling_fjord.cpp | 2 +- .../boss_ambassador_hellmaw.cpp | 2 +- 33 files changed, 3262 insertions(+), 3276 deletions(-) create mode 100644 sql/updates/world/2015_08_23_00_world.sql diff --git a/sql/updates/world/2015_08_23_00_world.sql b/sql/updates/world/2015_08_23_00_world.sql new file mode 100644 index 00000000000..1dbdab1278f --- /dev/null +++ b/sql/updates/world/2015_08_23_00_world.sql @@ -0,0 +1,157 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=58694; + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_cyanigosa_arcane_vacuum', +'spell_ichoron_splatter', +'spell_ichoron_protective_bubble', +'spell_ichoron_drained', +'spell_ichoron_merge', +'spell_moragg_ray', +'spell_moragg_ray_of_pain', +'spell_moragg_ray_of_suffering', +'spell_xevozz_summon_ethereal_sphere', +'spell_violet_hold_destroy_door_seal', +'spell_violet_hold_portal_periodic', +'spell_violet_hold_teleport_player', +'spell_crystal_activation' +); +INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) values +(58694,'spell_cyanigosa_arcane_vacuum'), +(54259,'spell_ichoron_splatter'), +(54306,'spell_ichoron_protective_bubble'), +(59820,'spell_ichoron_drained'), +(54269,'spell_ichoron_merge'), +(54438,'spell_moragg_ray'), +(54442,'spell_moragg_ray'), +(59523,'spell_moragg_ray'), +(59524,'spell_moragg_ray'), +(58040,'spell_violet_hold_destroy_door_seal'), +(58008,'spell_violet_hold_portal_periodic'), +(62138,'spell_violet_hold_teleport_player'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 and `SourceEntry` IN (57912, 57930, 58152, 54258, 54264, 54265, 54266, 54267, 54269); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,57912,0,0,31,0,3,29425,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,57930,0,0,31,0,3,30857,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,0,31,0,3,30661,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,1,31,0,3,30662,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,2,31,0,3,30663,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,3,31,0,3,30664,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,4,31,0,3,30665,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,5,31,0,3,30666,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,6,31,0,3,30667,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,7,31,0,3,30668,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,8,31,0,3,30918,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,9,31,0,3,30961,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,10,31,0,3,30962,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,11,31,0,3,30963,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,12,31,0,3,31007,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,13,31,0,3,31008,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,14,31,0,3,31009,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,15,31,0,3,31010,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,16,31,0,3,31118,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,17,31,0,3,32191,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,54258,0,0,31,0,3,29326,102906,0,0,0,'','Ichoron - Water Globule'), +(13,1,54264,0,0,31,0,3,29326,102905,0,0,0,'','Ichoron - Water Globule'), +(13,1,54265,0,0,31,0,3,29326,102904,0,0,0,'','Ichoron - Water Globule'), +(13,1,54266,0,0,31,0,3,29326,102901,0,0,0,'','Ichoron - Water Globule'), +(13,1,54267,0,0,31,0,3,29326,102902,0,0,0,'','Ichoron - Water Globule'), +(13,1,54269,0,0,31,0,3,29313,0,0,0,0,'','Ichoron - Merge'); + +UPDATE `creature_template` SET `gossip_menu_id`=9997 WHERE `entry`=30658; + +UPDATE `gossip_menu_option` SET `action_menu_id`=9998 WHERE `menu_id`=9997; + +UPDATE `creature_template` SET `ScriptName`='npc_violet_hold_teleportation_portal' WHERE `entry`=30679; +UPDATE `creature_template` SET `ScriptName`='npc_violet_hold_teleportation_portal_elite' WHERE `entry`=32174; +UPDATE `creature_template` SET `ScriptName`='npc_violet_hold_teleportation_portal_intro' WHERE `entry`=31011; + +UPDATE `creature_template` SET `ScriptName`='npc_violet_hold_defense_system' WHERE `entry`=30837; + +UPDATE `creature_template` SET `unit_flags`=832 WHERE `entry` IN (31134, 31506); -- Cyanigosa + +UPDATE `creature_template` SET `speed_walk`=2.22222/2.5, `speed_run`=8.0/7.0, `unit_flags`=768 WHERE `entry` IN (31079, 31492); -- Azure Saboteur + +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=12.0/7.0, `unit_flags`=832 WHERE `entry` IN (29266, 31511, 32231, 32552); -- Xevozz +UPDATE `creature_template` SET `speed_walk`=3.0/2.5, `speed_run`=3.0/7.0 WHERE `entry` IN (29271, 31514, 32582, 32583); -- Ethereal Sphere +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=12.0/7.0, `unit_flags`=832 WHERE `entry` IN (29312, 31509, 32237, 32553); -- Lavanthor +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=12.0/7.0, `unit_flags`=832 WHERE `entry` IN (29313, 31508, 32234, 32554); -- Ichoron +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=4.0/7.0, `unit_flags`=33587200 WHERE `entry` IN (29321, 31515); -- Ichor Globule +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=12.0/7.0, `unit_flags`=832 WHERE `entry` IN (29314, 31512, 32230, 32555); -- Zuramat +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=10.0/7.0, `unit_flags`=33600 WHERE `entry` IN (29315, 31507, 32226, 32550); -- Erekem +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=10.0/7.0, `unit_flags`=33600 WHERE `entry` IN (29395, 31513, 32228, 32549); -- Erekem Guard +UPDATE `creature_template` SET `speed_walk`=4.0/2.5, `speed_run`=12.0/7.0, `unit_flags`=33600 WHERE `entry` IN (29316, 31510, 32235, 32551); -- Moragg + +UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `ScriptName`='boss_xevozz' WHERE `entry`=32231; -- Xevozz +UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `ScriptName`='boss_lavanthor' WHERE `entry`=32237; -- Lavanthor +UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `ScriptName`='boss_ichoron' WHERE `entry`=32234; -- Ichoron +UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `ScriptName`='boss_zuramat' WHERE `entry`=32230; -- Zuramat +UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `ScriptName`='boss_erekem' WHERE `entry`=32226; -- Erekem +UPDATE `creature_template` SET `minlevel`=76, `maxlevel`=76, `ScriptName`='npc_erekem_guard' WHERE `entry`=32228; -- Erekem Guard +UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `ScriptName`='boss_moragg' WHERE `entry`=32235; -- Moragg + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (29364, 29365); -- Void Sentry +UPDATE `creature_template` SET `flags_extra`=0, `AIName`='', `ScriptName`='npc_void_sentry' WHERE `entry`=29364; -- Void Sentry +UPDATE `creature_template` SET `AIName`='' WHERE `entry`=29365; -- Void Sentry +UPDATE `creature_template` SET `unit_flags`=0, `unit_flags2`=0 WHERE `entry` IN (29364, 31518); +UPDATE `creature_template` SET `unit_flags`=33554432, `unit_flags2`=2080 WHERE `entry` IN (29365, 31519); -- Void Sentry + +UPDATE `creature_template` SET `flags_extra`=`flags_extra`|0x1 WHERE `entry` IN (32552, 32553, 32554, 32555, 32550, 32551); +UPDATE `creature_template` SET `mechanic_immune_mask`=536941137 WHERE `entry` IN (32231, 32552, 32237, 32553, 32234, 32554, 32230, 32555, 32226, 32550, 32228, 32549, 32235, 32551); + +UPDATE `creature_template` SET `InhabitType`=4, `flags_extra`=128 WHERE `entry`=30837; +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (29326, 30896); +UPDATE `creature` SET `modelid`=0, `spawndist`=0, `MovementType`=0 WHERE `id` IN (29326, 30896); + +UPDATE `creature_template` SET `AIName`='' WHERE `entry` IN (32226,32228,32230,32231,32234,32235,32237); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (32226,32228,32230,32231,32234,32235,32237); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (30837, 30896, 31079, 29364, 29365, 31518, 31519); +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(30837, 0, 0x3000000, 0x1, '57886 57887'), +(30896, 0, 0x3000000, 0x1, ''), +(31079, 0, 0x0, 0x1, '31635'), +(29364, 0, 0x0, 0x1, '54351 54341'), +(29365, 0, 0x0, 0x1, '54351 54342'), +(31518, 0, 0x0, 0x1, '54351 54341'), +(31519, 0, 0x0, 0x1, '54351 59747'); + +DELETE FROM `creature_text` WHERE `entry` IN (30658, 32204, 29271); +DELETE FROM `creature_text` WHERE `entry`=29313 AND `groupid`=7; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(30658, 0, 0, 'Prison guards, we are leaving! These adventurers are taking over! Go go go!', 14, 0, 100, 5, 0, 0, 31474, 3, 'Lieutenant Sinclari - Intro 1'), +(30658, 1, 0, 'I''m locking the door. Good luck, and thank you for doing this.', 12, 0, 100, 396, 0, 0, 31475, 3, 'Lieutenant Sinclari - Intro 2'), +(30658, 2, 0, 'You did it! You held the Blue Dragonflight back and defeated their commander. Amazing work!', 12, 0, 100, 396, 0, 0, 31694, 3, 'Lieutenant Sinclari - Outro'), + +(32204, 0, 0, 'An elite Blue Dragonflight squad appears from the portal!', 41, 0, 100, 0, 0, 0, 32994, 3, 'Lieutenant Sinclari - Blue Dragonflight squad'), +(32204, 1, 0, 'A Portal Guardian defends the new portal!', 41, 0, 100, 0, 0, 0, 32995, 3, 'Lieutenant Sinclari - Portal Guardian'), +(32204, 2, 0, 'A Portal Keeper emerges from the portal!', 41, 0, 100, 0, 0, 0, 32996, 3, 'Lieutenant Sinclari - Portal Keeper'), +(32204, 3, 0, 'Adventurers, the door is beginning to weaken!', 14, 0, 100, 0, 0, 0, 32557, 3, 'Lieutenant Sinclari - Door weaken'), +(32204, 4, 0, 'Only half of the door seal''s strength remains! You must fight on!', 14, 0, 100, 0, 0, 0, 32558, 3, 'Lieutenant Sinclari - Half Door Seal reains'), +(32204, 5, 0, 'The door seal is about to collapse! All is lost if the Blue Dragonflight breaks through the door!', 14, 0, 100, 0, 0, 0, 32559, 3, 'Lieutenant Sinclari - Door Seal broken'), + +(29313, 7, 0, '%s''s Protective Bubble shatters!', 41, 0, 100, 0, 0, 0, 30086, 0, 'Ichoron - Emote Shatter'), + +(29271, 0, 0, '%s begins to summon!', 41, 0, 100, 0, 0, 0, 30087, 3, 'Ethereal Sphere'); + +UPDATE `creature_text` SET `sound`=14499 WHERE `entry`=29266 AND `groupid`=0; +UPDATE `creature_text` SET `emote`=396 WHERE `entry`=29266 AND `groupid`=3; +UPDATE `creature_text` SET `emote`=15 WHERE `entry`=29315 AND `groupid`=3; +UPDATE `creature_text` SET `emote`=396 WHERE `entry`=31134 AND `groupid`=3; + +DELETE FROM `spell_target_position` WHERE `ID` IN (54102, 54137, 54138, 61337, 61338, 61339, 62139); +INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES +(54102, 0, 608, 1854.36, 802.65, 44.3, 12340), +(54137, 0, 608, 1899.18, 824.7, 38.72333, 12340), +(54138, 0, 608, 1891.42, 788.04, 38.64, 12340), +(61337, 0, 608, 1854.36, 802.65, 44.3, 12340), +(61338, 0, 608, 1899.18, 824.7, 38.72333, 12340), +(61339, 0, 608, 1891.42, 788.04, 38.64, 12340), +(62139, 0, 608, 1857.24, 803.877, 44.0085, 12340); + +-- 3.3.5 only +DELETE FROM `spelldifficulty_dbc` WHERE `spellid0` IN (54102, 54137, 54138, 54207, 54438, 54442); +INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES +(54207, 54207, 59476), +(54438, 54438, 59523), +(54442, 54442, 59524); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index aa7ec3b847f..f1ba985458e 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -457,7 +457,13 @@ BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature), instance(creature->GetInstanceScript()), summons(creature), _boundary(instance ? instance->GetBossBoundary(bossId) : NULL), - _bossId(bossId) { } + _bossId(bossId) +{ + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); +} void BossAI::_Reset() { @@ -467,6 +473,7 @@ void BossAI::_Reset() me->ResetLootMode(); events.Reset(); summons.DespawnAll(); + scheduler.CancelAll(); if (instance) instance->SetBossState(_bossId, NOT_STARTED); } @@ -475,14 +482,13 @@ void BossAI::_JustDied() { events.Reset(); summons.DespawnAll(); + scheduler.CancelAll(); if (instance) instance->SetBossState(_bossId, DONE); } void BossAI::_EnterCombat() { - me->setActive(true); - DoZoneInCombat(); if (instance) { // bosses do not respawn, check only on enter combat @@ -493,6 +499,10 @@ void BossAI::_EnterCombat() } instance->SetBossState(_bossId, IN_PROGRESS); } + + me->setActive(true); + DoZoneInCombat(); + ScheduleTasks(); } void BossAI::TeleportCheaters() diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 1a4c3064a59..7d7811d9e75 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -23,6 +23,7 @@ #include "CreatureAI.h" #include "CreatureAIImpl.h" #include "InstanceScript.h" +#include "TaskScheduler.h" #define CAST_AI(a, b) (dynamic_cast(b)) #define ENSURE_AI(a,b) (EnsureAI(b)) @@ -359,6 +360,8 @@ class BossAI : public ScriptedAI // is supposed to run more than once virtual void ExecuteEvent(uint32 /*eventId*/) { } + virtual void ScheduleTasks() { } + void Reset() override { _Reset(); } void EnterCombat(Unit* /*who*/) override { _EnterCombat(); } void JustDied(Unit* /*killer*/) override { _JustDied(); } @@ -384,6 +387,7 @@ class BossAI : public ScriptedAI EventMap events; SummonList summons; + TaskScheduler scheduler; private: BossBoundaryMap const* const _boundary; diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h index 1d71652c948..deabd1dc484 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h @@ -68,8 +68,8 @@ struct npc_escortAI : public ScriptedAI void EnterEvadeMode() override; - void UpdateAI(uint32 diff) override; //the "internal" update, calls UpdateEscortAI() - virtual void UpdateEscortAI(uint32 const diff); //used when it's needed to add code in update (abilities, scripted events, etc) + void UpdateAI(uint32 diff) override; // the "internal" update, calls UpdateEscortAI() + virtual void UpdateEscortAI(uint32 diff); // used when it's needed to add code in update (abilities, scripted events, etc) void MovementInform(uint32, uint32) override; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 362c40a0982..5e1d1d37950 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -9590,6 +9590,17 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER } break; + // Violet Hold + case 4415: + if (instance && mapid == 608) + instance->FillInitialWorldStates(data); + else + { + data << uint32(3816) << uint32(0); // 9 WORLD_STATE_VH_SHOW + data << uint32(3815) << uint32(100); // 10 WORLD_STATE_VH_PRISON_STATE + data << uint32(3810) << uint32(0); // 11 WORLD_STATE_VH_WAVE_COUNT + } + break; // Halls of Refection case 4820: if (instance && mapid == 668) diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index da806e5b038..5d44f3ec696 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -319,6 +319,11 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state) return false; } +bool InstanceScript::_SkipCheckRequiredBosses(Player const* player /*= nullptr*/) const +{ + return player && player->GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES); +} + void InstanceScript::Load(char const* data) { if (!data) diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index be05a9f4495..3e90e430590 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -273,6 +273,8 @@ class InstanceScript : public ZoneScript void WriteSaveDataBossStates(std::ostringstream& data); virtual void WriteSaveDataMore(std::ostringstream& /*data*/) { } + bool _SkipCheckRequiredBosses(Player const* player = nullptr) const; + private: static void LoadObjectData(ObjectData const* creatureData, ObjectInfoMap& objectInfo); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 2b323e196a7..b69322f5720 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -423,6 +423,24 @@ void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool init.Launch(); } +void MotionMaster::MoveSmoothPath(uint32 pointId, G3D::Vector3 const* pathPoints, size_t pathSize, bool walk) +{ + Movement::PointsArray path(pathPoints, pathPoints + pathSize); + + Movement::MoveSplineInit init(_owner); + init.MovebyPath(path); + init.SetSmooth(); + init.SetWalk(walk); + init.Launch(); + + // This code is not correct + // EffectMovementGenerator does not affect UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE + // need to call PointMovementGenerator with various pointIds + Mutate(new EffectMovementGenerator(pointId), MOTION_SLOT_ACTIVE); + //Position pos(pathPoints[pathSize - 1].x, pathPoints[pathSize - 1].y, pathPoints[pathSize - 1].z); + //MovePoint(EVENT_CHARGE_PREPATH, pos, false); +} + void MotionMaster::MoveFall(uint32 id /*=0*/) { // use larger distance for vmap height search than in most other cases diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index c8da50364ba..9a8950de9f7 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -185,6 +185,7 @@ class MotionMaster //: private std::stack { MoveJump(pos.m_positionX, pos.m_positionY, pos.m_positionZ, speedXY, speedZ, id); } void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP); void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount); + void MoveSmoothPath(uint32 pointId, G3D::Vector3 const* pathPoints, size_t pathSize, bool walk); void MoveFall(uint32 id = 0); void MoveSeekAssistance(float x, float y, float z); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index d9f24a9010a..f27f9220aaa 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3355,6 +3355,19 @@ void SpellMgr::LoadSpellInfoCorrections() //! HACK: This spell break quest complete for alliance and on retail not used °_O spellInfo->Effects[EFFECT_0].Effect = 0; break; + // VIOLET HOLD SPELLS + // + case 54258: // Water Globule (Ichoron) + case 54264: // Water Globule (Ichoron) + case 54265: // Water Globule (Ichoron) + case 54266: // Water Globule (Ichoron) + case 54267: // Water Globule (Ichoron) + // in 3.3.5 there is only one radius in dbc which is 0 yards in this case + // use max radius from 4.3.4 + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); + break; + // ENDOF VIOLET HOLD + // // ULDUAR SPELLS // case 62374: // Pursued (Flame Leviathan) diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index 5ad5a3782ae..64513fece8b 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -365,7 +365,7 @@ public: } } - void UpdateEscortAI(const uint32 uiDiff) override + void UpdateEscortAI(uint32 uiDiff) override { if (uiPhase) { diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index de2bcc5561e..e0612a5ec78 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -272,7 +272,7 @@ public: } } - void UpdateEscortAI(const uint32 diff) override + void UpdateEscortAI(uint32 diff) override { //Check if we have a current target if (!UpdateVictim()) diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index eab104d8df2..bb54ae08d77 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -612,7 +612,7 @@ public: summoned->AI()->AttackStart(me); } - void UpdateEscortAI(const uint32 Diff) override + void UpdateEscortAI(uint32 Diff) override { if (!UpdateVictim()) { diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index 5cb6e78b399..53eadd4a38b 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -568,7 +568,7 @@ public: } - void UpdateEscortAI(const uint32 diff) override + void UpdateEscortAI(uint32 diff) override { DialogueUpdate(diff); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index eb6230fabfc..eb004505bab 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -263,7 +263,7 @@ class npc_onyx_flamecaller : public CreatureScript } } - void UpdateEscortAI(uint32 const diff) override + void UpdateEscortAI(uint32 diff) override { if (!UpdateVictim()) return; diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index 5111247b84c..4438c4ab199 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -18,7 +18,6 @@ #include "InstanceScript.h" #include "Player.h" #include "ScriptMgr.h" -#include "WorldSession.h" #include "gundrak.h" #include "EventMap.h" @@ -191,7 +190,7 @@ class instance_gundrak : public InstanceMapScript bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override { - if (player && player->GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) + if (_SkipCheckRequiredBosses(player)) return true; switch (bossId) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 8c1befe72ff..ab1450a87ea 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -1140,7 +1140,7 @@ class npc_crok_scourgebane : public CreatureScript } } - void UpdateEscortAI(uint32 const diff) override + void UpdateEscortAI(uint32 diff) override { if (_wipeCheckTimer <= diff) _wipeCheckTimer = 0; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 1b823b4a452..992ca0b4d74 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -17,7 +17,6 @@ #include "AccountMgr.h" #include "InstanceScript.h" -#include "Map.h" #include "ObjectMgr.h" #include "Player.h" #include "PoolMgr.h" @@ -26,7 +25,6 @@ #include "Transport.h" #include "TransportMgr.h" #include "WorldPacket.h" -#include "WorldSession.h" #include "icecrown_citadel.h" enum EventIds @@ -1121,7 +1119,7 @@ class instance_icecrown_citadel : public InstanceMapScript bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override { - if (player && player->GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) + if (_SkipCheckRequiredBosses(player)) return true; switch (bossId) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 6233c7e8953..86dbe6c16fb 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -437,7 +437,7 @@ public: return 0; } - void UpdateEscortAI(const uint32 uiDiff) override + void UpdateEscortAI(uint32 uiDiff) override { if (uiPhaseTimer <= uiDiff) { diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index c67e31c4cc0..227b9c208cc 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -18,7 +18,6 @@ #include "InstanceScript.h" #include "Player.h" #include "ScriptMgr.h" -#include "WorldSession.h" #include "halls_of_stone.h" DoorData const doorData[] = @@ -172,7 +171,7 @@ class instance_halls_of_stone : public InstanceMapScript bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override { - if (player && player->GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) + if (_SkipCheckRequiredBosses(player)) return true; switch (bossId) diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index dc923e534b0..26e55c46def 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -21,6 +21,7 @@ enum Spells { + SPELL_SUMMON_PLAYER = 21150, SPELL_ARCANE_VACUUM = 58694, SPELL_BLIZZARD = 58693, SPELL_MANA_DESTRUCTION = 59374, @@ -42,119 +43,91 @@ enum Yells class boss_cyanigosa : public CreatureScript { -public: - boss_cyanigosa() : CreatureScript("boss_cyanigosa") { } + public: + boss_cyanigosa() : CreatureScript("boss_cyanigosa") { } - struct boss_cyanigosaAI : public BossAI - { - boss_cyanigosaAI(Creature* creature) : BossAI(creature, DATA_CYANIGOSA) + struct boss_cyanigosaAI : public BossAI { - Initialize(); - } + boss_cyanigosaAI(Creature* creature) : BossAI(creature, DATA_CYANIGOSA) { } - void Initialize() - { - uiArcaneVacuumTimer = 10000; - uiBlizzardTimer = 15000; - uiManaDestructionTimer = 30000; - uiTailSweepTimer = 20000; - uiUncontrollableEnergyTimer = 25000; - } - - uint32 uiArcaneVacuumTimer; - uint32 uiBlizzardTimer; - uint32 uiManaDestructionTimer; - uint32 uiTailSweepTimer; - uint32 uiUncontrollableEnergyTimer; - - void Reset() override - { - Initialize(); - BossAI::Reset(); - } - - void EnterCombat(Unit* who) override - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - } - - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_REMOVE_NPC) == 1) + void EnterCombat(Unit* who) override { - me->DespawnOrUnsummon(); - instance->SetData(DATA_REMOVE_NPC, 0); + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); } - if (!UpdateVictim()) - return; - - if (uiArcaneVacuumTimer <= diff) + void KilledUnit(Unit* victim) override { - DoCastAOE(SPELL_ARCANE_VACUUM); - uiArcaneVacuumTimer = 10000; - } else uiArcaneVacuumTimer -= diff; + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - if (uiBlizzardTimer <= diff) + void JustDied(Unit* killer) override { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_BLIZZARD); - uiBlizzardTimer = 15000; - } else uiBlizzardTimer -= diff; + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } - if (uiTailSweepTimer <= diff) - { - DoCastVictim(SPELL_TAIL_SWEEP); - uiTailSweepTimer = 20000; - } else uiTailSweepTimer -= diff; + void MoveInLineOfSight(Unit* /*who*/) override { } - if (uiUncontrollableEnergyTimer <= diff) + void UpdateAI(uint32 diff) override { - DoCastVictim(SPELL_UNCONTROLLABLE_ENERGY); - uiUncontrollableEnergyTimer = 25000; - } else uiUncontrollableEnergyTimer -= diff; + if (!UpdateVictim()) + return; - if (IsHeroic()) + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); + } + + void ScheduleTasks() override { - if (uiManaDestructionTimer <= diff) + scheduler.Schedule(Seconds(10), [this](TaskContext task) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_MANA_DESTRUCTION); - uiManaDestructionTimer = 30000; - } else uiManaDestructionTimer -= diff; + DoCastAOE(SPELL_ARCANE_VACUUM); + task.Repeat(); + }); + + scheduler.Schedule(Seconds(15), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) + DoCast(target, SPELL_BLIZZARD); + task.Repeat(); + }); + + scheduler.Schedule(Seconds(20), [this](TaskContext task) + { + DoCastVictim(SPELL_TAIL_SWEEP); + task.Repeat(); + }); + + scheduler.Schedule(Seconds(25), [this](TaskContext task) + { + DoCastVictim(SPELL_UNCONTROLLABLE_ENERGY); + task.Repeat(); + }); + + if (IsHeroic()) + { + scheduler.Schedule(Seconds(30), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + DoCast(target, SPELL_MANA_DESTRUCTION); + task.Repeat(); + }); + } } + }; - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* killer) override + CreatureAI* GetAI(Creature* creature) const override { - BossAI::JustDied(killer); - Talk(SAY_DEATH); + return GetVioletHoldAI(creature); } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class achievement_defenseless : public AchievementCriteriaScript { public: - achievement_defenseless() : AchievementCriteriaScript("achievement_defenseless") - { - } + achievement_defenseless() : AchievementCriteriaScript("achievement_defenseless") { } bool OnCheck(Player* /*player*/, Unit* target) override { @@ -165,10 +138,40 @@ class achievement_defenseless : public AchievementCriteriaScript if (!instance) return false; - if (!instance->GetData(DATA_DEFENSELESS)) - return false; + return instance->GetData(DATA_DEFENSELESS) != 0; + } +}; - return true; +class spell_cyanigosa_arcane_vacuum : public SpellScriptLoader +{ + public: + spell_cyanigosa_arcane_vacuum() : SpellScriptLoader("spell_cyanigosa_arcane_vacuum") { } + + class spell_cyanigosa_arcane_vacuum_SpellScript : public SpellScript + { + PrepareSpellScript(spell_cyanigosa_arcane_vacuum_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_PLAYER)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_PLAYER, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_cyanigosa_arcane_vacuum_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_cyanigosa_arcane_vacuum_SpellScript(); } }; @@ -176,4 +179,5 @@ void AddSC_boss_cyanigosa() { new boss_cyanigosa(); new achievement_defenseless(); + new spell_cyanigosa_arcane_vacuum(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 8ead8ab559e..a7de2cab9d5 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -41,269 +41,207 @@ enum Yells SAY_BOTH_ADDS_KILLED = 5 }; -enum ErekemEvents -{ - EVENT_EARTH_SHIELD = 1, - EVENT_CHAIN_HEAL, - EVENT_BLOODLUST, - EVENT_LIGHTNING_BOLT, - EVENT_EARTH_SHOCK, - EVENT_WINDFURY, - EVENT_STORMSTRIKE -}; - class boss_erekem : public CreatureScript { -public: - boss_erekem() : CreatureScript("boss_erekem") { } + public: + boss_erekem() : CreatureScript("boss_erekem") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } - - struct boss_erekemAI : public ScriptedAI - { - boss_erekemAI(Creature* creature) : ScriptedAI(creature) + struct boss_erekemAI : public BossAI { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - phase = 0; - breakBondsCd = 0; - } - - void Reset() override - { - Initialize(); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + boss_erekemAI(Creature* creature) : BossAI(creature, DATA_EREKEM) { - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) - pGuard1->DespawnOrUnsummon(); - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - pGuard2->DespawnOrUnsummon(); - } - else - { - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) - { - if (!pGuard1->IsAlive()) - pGuard1->Respawn(); - } - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - { - if (!pGuard2->IsAlive()) - pGuard2->Respawn(); - } + Initialize(); } - events.Reset(); - } - - void JustReachedHome() override - { - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) - pGuard1->Respawn(); - - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - pGuard2->Respawn(); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) + void Initialize() { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); - - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) - { - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - if (!pGuard1->GetVictim() && pGuard1->AI()) - pGuard1->AI()->AttackStart(who); - } - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - { - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - if (!pGuard2->GetVictim() && pGuard2->AI()) - pGuard2->AI()->AttackStart(who); - } + _phase = 0; } - } - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - DoCast(me, SPELL_EARTH_SHIELD); + void Reset() override + { + Initialize(); + BossAI::Reset(); + me->SetCanDualWield(false); + } - if (GameObject* door = instance->GetGameObject(DATA_EREKEM_CELL)) - if (door->GetGoState() == GO_STATE_READY) + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + DoCast(me, SPELL_EARTH_SHIELD); + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type == EFFECT_MOTION_TYPE && pointId == POINT_INTRO) + me->SetFacingTo(4.921828f); + } + + void JustReachedHome() override + { + BossAI::JustReachedHome(); + instance->SetData(DATA_HANDLE_CELLS, DATA_EREKEM); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + bool CheckGuardAuras(Creature* guard) const + { + static uint32 const MechanicImmunityList = + (1 << MECHANIC_SNARE) + | (1 << MECHANIC_ROOT) + | (1 << MECHANIC_FEAR) + | (1 << MECHANIC_STUN) + | (1 << MECHANIC_SLEEP) + | (1 << MECHANIC_CHARM) + | (1 << MECHANIC_SAPPED) + | (1 << MECHANIC_HORROR) + | (1 << MECHANIC_POLYMORPH) + | (1 << MECHANIC_DISORIENTED) + | (1 << MECHANIC_FREEZE) + | (1 << MECHANIC_TURN); + + static std::list const AuraImmunityList = { - EnterEvadeMode(); + SPELL_AURA_MOD_STUN, + SPELL_AURA_MOD_DECREASE_SPEED, + SPELL_AURA_MOD_ROOT, + SPELL_AURA_MOD_CONFUSE, + SPELL_AURA_MOD_FEAR + }; + + if (guard->HasAuraWithMechanic(MechanicImmunityList)) + return true; + + for (AuraType type : AuraImmunityList) + if (guard->HasAuraType(type)) + return true; + + return false; + } + + bool CheckGuardAlive() const + { + for (uint32 i = DATA_EREKEM_GUARD_1; i <= DATA_EREKEM_GUARD_2; ++i) + { + if (Creature* guard = ObjectAccessor::GetCreature(*me, instance->GetGuidData(i))) + if (guard->IsAlive()) + return true; + } + + return false; + } + + Unit* GetChainHealTarget() const + { + if (HealthBelowPct(85)) + return me; + + for (uint32 i = DATA_EREKEM_GUARD_1; i <= DATA_EREKEM_GUARD_2; ++i) + { + if (Creature* guard = ObjectAccessor::GetCreature(*me, instance->GetGuidData(i))) + if (guard->IsAlive() && !guard->HealthAbovePct(75)) + return guard; + } + + return nullptr; + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC); - - events.ScheduleEvent(EVENT_EARTH_SHIELD, 20000); - events.ScheduleEvent(EVENT_BLOODLUST, 15000); - events.ScheduleEvent(EVENT_CHAIN_HEAL, 10000); - events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2000); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (phase == 0) - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + if (_phase == 0 && !CheckGuardAlive()) { - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - { - if (!pGuard1->IsAlive() && !pGuard2->IsAlive()) - { - phase = 1; - DoCastVictim(SPELL_STORMSTRIKE); - DoCast(SPELL_WINDFURY); - events.Reset(); - events.ScheduleEvent(EVENT_EARTH_SHOCK, urand(2000, 8000)); - events.ScheduleEvent(EVENT_WINDFURY, urand(1500, 2000)); - events.ScheduleEvent(EVENT_STORMSTRIKE, urand(1500, 2000)); - } - } + _phase = 1; + me->SetCanDualWield(true); + DoCast(me, SPELL_WINDFURY, true); } - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (breakBondsCd <= 0) - { - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + scheduler.Update(diff, [this] { - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - { - if (pGuard1->IsAlive()) - { - if (pGuard1->HasAuraType(SPELL_AURA_MOD_STUN) || pGuard1->HasAuraType(SPELL_AURA_MOD_ROOT) - || pGuard1->HasAuraType(SPELL_AURA_MOD_CONFUSE) || pGuard1->HasAuraType(SPELL_AURA_MOD_PACIFY) - || pGuard1->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED)) - { - DoCast(SPELL_BREAK_BONDS); - breakBondsCd = 10000; - return; - } - } - if (pGuard2->IsAlive()) - { - if (pGuard2->HasAuraType(SPELL_AURA_MOD_STUN) || pGuard2->HasAuraType(SPELL_AURA_MOD_ROOT) - || pGuard2->HasAuraType(SPELL_AURA_MOD_CONFUSE) || pGuard2->HasAuraType(SPELL_AURA_MOD_PACIFY) - || pGuard2->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED)) - { - DoCast(SPELL_BREAK_BONDS); - breakBondsCd = 10000; - return; - } - } - } - } + if (_phase == 1) + DoSpellAttackIfReady(SPELL_STORMSTRIKE); + else + DoMeleeAttackIfReady(); + }); } - else - breakBondsCd -= diff; - switch (events.ExecuteEvent()) + void ScheduleTasks() override { - case EVENT_EARTH_SHIELD: + scheduler.Schedule(Seconds(20), [this](TaskContext task) + { if (Unit* ally = DoSelectLowestHpFriendly(30.0f)) DoCast(ally, SPELL_EARTH_SHIELD); - events.ScheduleEvent(EVENT_EARTH_SHIELD, 20000); - break; - case EVENT_BLOODLUST: + + task.Repeat(Seconds(20)); + }); + + scheduler.Schedule(Seconds(2), [this](TaskContext task) + { DoCast(SPELL_BLOODLUST); - events.ScheduleEvent(EVENT_BLOODLUST, urand(35000, 45000)); - break; - case EVENT_LIGHTNING_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + task.Repeat(Seconds(35), Seconds(45)); + }); + + scheduler.Schedule(Seconds(2), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f)) DoCast(target, SPELL_LIGHTNING_BOLT); - events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2500); - break; - case EVENT_CHAIN_HEAL: + + task.Repeat(Milliseconds(2500)); + }); + + scheduler.Schedule(Seconds(10), [this](TaskContext task) + { if (Unit* ally = DoSelectLowestHpFriendly(40.0f)) DoCast(ally, SPELL_CHAIN_HEAL); - { - Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); - Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); - events.ScheduleEvent(EVENT_CHAIN_HEAL, ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive()) ? 3000 : 8000 + rand() % 3000)); - } - break; - case EVENT_EARTH_SHOCK: + + task.Repeat(!CheckGuardAlive() ? Seconds(3) : (Seconds(8), Seconds(11))); + }); + + scheduler.Schedule(Seconds(2), Seconds(8), [this](TaskContext task) + { DoCastVictim(SPELL_EARTH_SHOCK); - events.ScheduleEvent(EVENT_EARTH_SHOCK, urand(8000, 13000)); - break; - case EVENT_WINDFURY: - DoCast(SPELL_WINDFURY); - events.ScheduleEvent(EVENT_WINDFURY, urand(1500, 2000)); - break; - case EVENT_STORMSTRIKE: - DoCastVictim(SPELL_STORMSTRIKE); - events.ScheduleEvent(EVENT_STORMSTRIKE, urand(1500, 2000)); - break; - default: - break; + task.Repeat(Seconds(8), Seconds(13)); + }); + + scheduler.Schedule(Seconds(0), [this](TaskContext task) + { + for (uint32 i = DATA_EREKEM_GUARD_1; i <= DATA_EREKEM_GUARD_2; ++i) + { + Creature* guard = ObjectAccessor::GetCreature(*me, instance->GetGuidData(i)); + + if (guard && guard->IsAlive() && CheckGuardAuras(guard)) + { + DoCastAOE(SPELL_BREAK_BONDS); + task.Repeat(Seconds(10)); + return; + } + } + task.Repeat(Milliseconds(500)); + }); } - DoMeleeAttackIfReady(); - } + private: + uint8 _phase; + }; - private: - EventMap events; - InstanceScript* instance; - uint8 phase; - int32 breakBondsCd; - }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); + } }; enum GuardSpells @@ -315,85 +253,61 @@ enum GuardSpells class npc_erekem_guard : public CreatureScript { -public: - npc_erekem_guard() : CreatureScript("npc_erekem_guard") { } + public: + npc_erekem_guard() : CreatureScript("npc_erekem_guard") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } - - struct npc_erekem_guardAI : public ScriptedAI - { - npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature) + struct npc_erekem_guardAI : public ScriptedAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature) { } - void Initialize() - { - uiStrikeTimer = urand(4000, 8000); - uiHowlingScreechTimer = urand(8000, 13000); - uiGushingWoundTimer = urand(1000, 3000); - } - - uint32 uiGushingWoundTimer; - uint32 uiHowlingScreechTimer; - uint32 uiStrikeTimer; - - InstanceScript* instance; - - void Reset() override - { - Initialize(); - - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) + void Reset() override { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); + scheduler.CancelAll(); } - } - void MoveInLineOfSight(Unit* /*who*/) override { } + void EnterCombat(Unit* /*who*/) override + { + DoZoneInCombat(); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + scheduler.Update(diff, + std::bind(&ScriptedAI::DoMeleeAttackIfReady, this)); + } + + void ScheduledTasks() + { + scheduler.Schedule(Seconds(4), Seconds(8), [this](TaskContext task) + { + DoCastVictim(SPELL_STRIKE); + task.Repeat(Seconds(4), Seconds(8)); + }); + + scheduler.Schedule(Seconds(8), Seconds(13), [this](TaskContext task) + { + DoCastAOE(SPELL_HOWLING_SCREECH); + task.Repeat(Seconds(8), Seconds(13)); + }); + + scheduler.Schedule(Seconds(1), Seconds(3), [this](TaskContext task) + { + DoCastVictim(SPELL_GUSHING_WOUND); + task.Repeat(Seconds(7), Seconds(12)); + }); + } + + private: + TaskScheduler scheduler; + }; + + CreatureAI* GetAI(Creature* creature) const override { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - - if (uiStrikeTimer <= diff) - { - DoCastVictim(SPELL_STRIKE); - uiStrikeTimer = urand(4000, 8000); - } else uiStrikeTimer -= diff; - - if (uiHowlingScreechTimer <= diff) - { - DoCastVictim(SPELL_HOWLING_SCREECH); - uiHowlingScreechTimer = urand(8000, 13000); - } else uiHowlingScreechTimer -= diff; - - if (uiGushingWoundTimer <= diff) - { - DoCastVictim(SPELL_GUSHING_WOUND); - uiGushingWoundTimer = urand(7000, 12000); - } else uiGushingWoundTimer -= diff; + return GetVioletHoldAI(creature); } - }; }; void AddSC_boss_erekem() diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index caf1392ea38..3c29cc1123c 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -17,26 +17,32 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" #include "violet_hold.h" enum Spells { - SPELL_DRAINED = 59820, - SPELL_FRENZY = 54312, - SPELL_PROTECTIVE_BUBBLE = 54306, SPELL_WATER_BLAST = 54237, SPELL_WATER_BOLT_VOLLEY = 54241, - SPELL_SPLASH = 59516, + SPELL_SPLATTER = 54259, + SPELL_PROTECTIVE_BUBBLE = 54306, + SPELL_FRENZY = 54312, SPELL_BURST = 54379, - SPELL_WATER_GLOBULE = 54268, - SPELL_MERGE = 54269, - SPELL_WATER_GLOBULE_VISUAL = 54260 -}; + SPELL_DRAINED = 59820, + SPELL_THREAT_PROC = 61732, + SPELL_SHRINK = 54297, -enum IchoronCreatures -{ - NPC_ICHOR_GLOBULE = 29321, - NPC_ICHORON_SUMMON_TARGET = 29326 + SPELL_WATER_GLOBULE_SUMMON_1 = 54258, + SPELL_WATER_GLOBULE_SUMMON_2 = 54264, + SPELL_WATER_GLOBULE_SUMMON_3 = 54265, + SPELL_WATER_GLOBULE_SUMMON_4 = 54266, + SPELL_WATER_GLOBULE_SUMMON_5 = 54267, + SPELL_WATER_GLOBULE_TRANSFORM = 54268, + SPELL_WATER_GLOBULE_VISUAL = 54260, + + SPELL_MERGE = 54269, + SPELL_SPLASH = 59516 }; enum Yells @@ -47,483 +53,412 @@ enum Yells SAY_SPAWN = 3, SAY_ENRAGE = 4, SAY_SHATTER = 5, - SAY_BUBBLE = 6 + SAY_BUBBLE = 6, + EMOTE_SHATTER = 7 }; enum Actions { - ACTION_WATER_ELEMENT_HIT = 1 -}; - -enum IchoronEvents -{ - EVENT_WATER_BLAST = 1, - EVENT_WATER_BOLT_VOLLEY -}; - -enum GlobuleEvents -{ - EVENT_GLOBULE_MOVE = 1 + ACTION_WATER_GLOBULE_HIT = 1, + ACTION_PROTECTIVE_BUBBLE_SHATTERED = 2, + ACTION_DRAINED = 3 }; enum Misc { - DATA_GLOBULE_PATH = 0, DATA_DEHYDRATION = 1 }; - -#define MAX_GLOBULE_PATHS 10 - -Position const globulePaths[MAX_GLOBULE_PATHS] = -{ - // first target - { 1861.357f, 804.039f, 44.008f, 6.268f }, - { 1869.375f, 803.976f, 38.781f, 0.009f }, - // second target - { 1888.063f, 763.488f, 47.667f, 1.744f }, - { 1882.865f, 776.385f, 38.824f, 1.882f }, - // third target - { 1935.140f, 817.752f, 52.181f, 1.885f }, - { 1916.642f, 826.337f, 39.139f, 2.851f }, - // fourth target - { 1930.257f, 833.053f, 46.906f, 4.579f }, - { 1916.642f, 826.337f, 39.139f, 2.851f }, - // fifth target - { 1878.248f, 841.883f, 43.334f, 4.717f }, - { 1879.438f, 834.443f, 38.699f, 4.831f } -}; - class boss_ichoron : public CreatureScript { -public: - boss_ichoron() : CreatureScript("boss_ichoron") { } + public: + boss_ichoron() : CreatureScript("boss_ichoron") { } - struct boss_ichoronAI : public ScriptedAI - { - boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature) + struct boss_ichoronAI : public BossAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + boss_ichoronAI(Creature* creature) : BossAI(creature, DATA_ICHORON) + { + Initialize(); - void Initialize() - { - bIsExploded = false; - bIsFrenzy = false; - bIsDrained = false; - dehydration = true; - drainedTimer = 50; - burstTimer = 15000; - } + /// for some reason ichoron can't walk back to it's water basin on evade + me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING); + } - void Reset() override - { - Initialize(); + void Initialize() + { + _isFrenzy = false; + _dehydration = true; + } - events.Reset(); - me->SetVisible(true); - DespawnWaterElements(); + void Reset() override + { + Initialize(); + BossAI::Reset(); - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + DoCast(me, SPELL_THREAT_PROC, true); + } - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + } - DoCast(me, SPELL_PROTECTIVE_BUBBLE); + void JustReachedHome() override + { + BossAI::JustReachedHome(); + instance->SetData(DATA_HANDLE_CELLS, DATA_ICHORON); + } - if (GameObject* door = instance->GetGameObject(DATA_ICHORON_CELL)) - if (door->GetGoState() == GO_STATE_READY) + void DoAction(int32 actionId) override + { + switch (actionId) { - EnterEvadeMode(); - return; - } + case ACTION_WATER_GLOBULE_HIT: + if (!me->IsAlive()) + break; - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - - events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); - events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) - { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); - } - } - - void DoAction(int32 param) override - { - if (!me->IsAlive()) - return; - - switch (param) - { - case ACTION_WATER_ELEMENT_HIT: - { - if (bIsExploded) - DoExplodeCompleted(); - - me->SetHealth(me->GetHealth() + me->CountPctFromMaxHealth(3)); - dehydration = false; - } - break; - } - } - - void DespawnWaterElements() - { - m_waterElements.DespawnAll(); - } - - // call when explode shall stop. - // either when "hit" by a bubble, or when there is no bubble left. - void DoExplodeCompleted() - { - bIsExploded = false; - bIsDrained = false; - - if (!HealthBelowPct(25)) - { - Talk(SAY_BUBBLE); - DoCast(me, SPELL_PROTECTIVE_BUBBLE, true); - } - - me->SetVisible(true); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } - - uint32 GetData(uint32 type) const override - { - if (type == DATA_DEHYDRATION) - return dehydration ? 1 : 0; - - return 0; - } - - void MoveInLineOfSight(Unit* who) override - { - if (!who->ToCreature()) - return; - - if (who->GetEntry() != NPC_ICHOR_GLOBULE) - return; - - if (!me->IsWithinDist(who, 4.0f, false)) - return; - - if (who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) - return; - - who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - who->CastSpell(who, SPELL_MERGE); - DoAction(ACTION_WATER_ELEMENT_HIT); - who->ToCreature()->DespawnOrUnsummon(1000); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - if (bIsExploded) - { - bIsExploded = false; - me->SetVisible(true); - } - - DespawnWaterElements(); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } - } - - void JustSummoned(Creature* summoned) override - { - summoned->SetSpeed(MOVE_RUN, 0.3f); - m_waterElements.Summon(summoned); - - instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); - } - - void SummonedCreatureDespawn(Creature* summoned) override - { - m_waterElements.Despawn(summoned); - - if (m_waterElements.empty() && bIsExploded) - { - me->RemoveAllAuras(); - DoExplodeCompleted(); - } - - instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (!bIsFrenzy && HealthBelowPct(25) && !bIsExploded) - { - Talk(SAY_ENRAGE); - DoCast(me, SPELL_FRENZY, true); - bIsFrenzy = true; - } - - if (!bIsFrenzy) - { - if (!bIsExploded) - { - if (!me->HasAura(SPELL_PROTECTIVE_BUBBLE)) + me->ModifyHealth(int32(me->CountPctFromMaxHealth(3))); + _dehydration = false; + break; + case ACTION_PROTECTIVE_BUBBLE_SHATTERED: { - bIsExploded = true; Talk(SAY_SHATTER); - DoCast(SPELL_BURST); - me->RemoveAllAuras(); - burstTimer = 15000; + Talk(EMOTE_SHATTER); - std::list summonTargets; - GetCreatureListWithEntryInGrid(summonTargets, me, NPC_ICHORON_SUMMON_TARGET, 200.0f); - std::list::iterator itr = summonTargets.begin(); + DoCastAOE(SPELL_SPLATTER, true); + DoCastAOE(SPELL_BURST, true); + DoCast(me, SPELL_DRAINED, true); - for (uint8 i = 0; i < MAX_GLOBULE_PATHS; i++) - { - std::advance(itr, urand(0, summonTargets.size() - 1)); // I take a random minion in the list - Position targetPos = (*itr)->GetRandomNearPosition(10.0f); - itr = summonTargets.begin(); - TempSummon* globule = me->SummonCreature(NPC_ICHOR_GLOBULE, targetPos, TEMPSUMMON_CORPSE_DESPAWN); - DoCast(globule, SPELL_WATER_GLOBULE_VISUAL); - - float minDistance = 1000.0f; - uint8 nextPath = 0; - // I move the globules to next position. the 10 positions are in couples, defined in globulePaths, so i have to increase by 2. - for (uint8 gpath = 0; gpath < MAX_GLOBULE_PATHS; gpath += 2) - { - if (globule->GetDistance(globulePaths[gpath]) < minDistance) - { - minDistance = globule->GetDistance(globulePaths[gpath]); - nextPath = gpath; - } - } - - globule->GetAI()->SetData(DATA_GLOBULE_PATH, nextPath); - } - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - events.Update(diff); - - switch (events.ExecuteEvent()) - { - case EVENT_WATER_BLAST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_WATER_BLAST); - events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); - break; - case EVENT_WATER_BOLT_VOLLEY: - DoCast(SPELL_WATER_BOLT_VOLLEY); - events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); - break; - } - - DoMeleeAttackIfReady(); - } - else if (!bIsDrained) - { - if (drainedTimer <= 0) - { - bIsDrained = true; - drainedTimer = 50; uint32 damage = me->CountPctFromMaxHealth(30); - if (me->GetHealth() < damage) - me->SetHealth(me->CountPctFromMaxHealth(1)); - else + me->LowerPlayerDamageReq(damage); + me->ModifyHealth(-std::min(damage, me->GetHealth() - 1)); + + scheduler.DelayAll(Seconds(15)); + break; + } + case ACTION_DRAINED: + if (HealthAbovePct(30)) { - me->SetHealth(me->GetHealth() - damage); - me->LowerPlayerDamageReq(damage); + Talk(SAY_BUBBLE); + DoCast(me, SPELL_PROTECTIVE_BUBBLE, true); } - DoCast(SPELL_DRAINED); - me->SetVisible(false); - me->AttackStop(); - } - else - drainedTimer -= diff; - } - else if (bIsDrained) - { - if (burstTimer <= 0) - { - DoExplodeCompleted(); - } - else - burstTimer -= diff; + break; + default: + break; } } - else + + uint32 GetData(uint32 type) const override { - if (me->HasUnitState(UNIT_STATE_CASTING)) + if (type == DATA_DEHYDRATION) + return _dehydration ? 1 : 0; + return 0; + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + + if (summon->GetEntry() == NPC_ICHOR_GLOBULE) + DoCast(summon, SPELL_WATER_GLOBULE_VISUAL); + } + + void SummonedCreatureDespawn(Creature* summon) override + { + BossAI::SummonedCreatureDespawn(summon); + + if (summons.empty()) + me->RemoveAurasDueToSpell(SPELL_DRAINED, ObjectGuid::Empty, 0, AURA_REMOVE_BY_EXPIRE); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - events.Update(diff); - - switch (events.ExecuteEvent()) + if (!_isFrenzy && HealthBelowPct(25) && !me->HasAura(SPELL_DRAINED)) { - case EVENT_WATER_BLAST: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_WATER_BLAST); - events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); - break; - case EVENT_WATER_BOLT_VOLLEY: - DoCast(SPELL_WATER_BOLT_VOLLEY); - events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); - break; + Talk(SAY_ENRAGE); + DoCast(me, SPELL_FRENZY, true); + _isFrenzy = true; } - DoMeleeAttackIfReady(); + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); } + + void ScheduleTasks() override + { + scheduler.Async([this] + { + DoCast(me, SPELL_SHRINK); + DoCast(me, SPELL_PROTECTIVE_BUBBLE); + }); + + scheduler.Schedule(Seconds(10), Seconds(15), [this](TaskContext task) + { + DoCastAOE(SPELL_WATER_BOLT_VOLLEY); + task.Repeat(Seconds(10), Seconds(15)); + }); + + scheduler.Schedule(Seconds(6), Seconds(9), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f)) + DoCast(target, SPELL_WATER_BLAST); + task.Repeat(Seconds(6), Seconds(9)); + }); + } + + private: + bool _isFrenzy; + bool _dehydration; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - - private: - InstanceScript* instance; - SummonList m_waterElements; - EventMap events; - bool bIsExploded; - bool bIsFrenzy; - bool bIsDrained; - bool dehydration; - int32 drainedTimer; - int32 burstTimer; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_ichor_globule : public CreatureScript { -public: - npc_ichor_globule() : CreatureScript("npc_ichor_globule") { } + public: + npc_ichor_globule() : CreatureScript("npc_ichor_globule") { } - struct npc_ichor_globuleAI : public ScriptedAI - { - npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature) + struct npc_ichor_globuleAI : public ScriptedAI { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - pathId = 0; - } - - void Reset() override - { - Initialize(); - events.Reset(); - DoCast(SPELL_WATER_GLOBULE); - me->SetReactState(REACT_PASSIVE); - } - - void SetData(uint32 id, uint32 data) override - { - if (id == DATA_GLOBULE_PATH) + npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature) { - pathId = data; - me->GetMotionMaster()->MovePoint(0, globulePaths[pathId]); + _instance = creature->GetInstanceScript(); + creature->SetReactState(REACT_PASSIVE); } - } - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE) - return; - - switch (id) + void SpellHit(Unit* caster, SpellInfo const* spellInfo) override { - case 0: - me->GetMotionMaster()->Clear(); - events.ScheduleEvent(EVENT_GLOBULE_MOVE, 500); - break; - case 1: - me->GetMotionMaster()->Clear(); - if (Creature* ichoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) - me->GetMotionMaster()->MoveFollow(ichoron, 0.0f, 0.0f); - break; + if (spellInfo->Id == SPELL_WATER_GLOBULE_VISUAL) + { + DoCast(me, SPELL_WATER_GLOBULE_TRANSFORM); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->GetMotionMaster()->MoveFollow(caster, 0.0f, 0.0f); + } } - } - // on retail spell casted on a creature's death are not casted after death but keeping mob at 1 health, casting it and then letting the mob die. - // this feature should be still implemented - void DamageTaken(Unit* /*attacker*/, uint32 &damage) override + void MovementInform(uint32 type, uint32 id) override + { + if (type != FOLLOW_MOTION_TYPE) + return; + + if (_instance->GetObjectGuid(DATA_ICHORON).GetCounter() != id) + return; + + me->CastSpell(me, SPELL_MERGE); + me->DespawnOrUnsummon(1); + } + + // on retail spell casted on a creature's death are not casted after death but keeping mob at 1 health, casting it and then letting the mob die. + // this feature should be still implemented + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + DoCastAOE(SPELL_SPLASH); + } + + void UpdateAI(uint32 /*diff*/) override { } + + private: + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override { - int32 actualHp = me->GetHealth(); - actualHp -= damage; - - if (actualHp <= 0) - DoCast(SPELL_SPLASH); + return GetVioletHoldAI(creature); } +}; - void UpdateAI(uint32 diff) override +// 59820 - Drained +class spell_ichoron_drained : public SpellScriptLoader +{ + public: + spell_ichoron_drained() : SpellScriptLoader("spell_ichoron_drained") { } + + class spell_ichoron_drained_AuraScript : public AuraScript { - events.Update(diff); + PrepareAuraScript(spell_ichoron_drained_AuraScript); - if (events.ExecuteEvent() == EVENT_GLOBULE_MOVE) - me->GetMotionMaster()->MovePoint(1, globulePaths[pathId + 1]); + bool Load() override + { + return GetOwner()->GetEntry() == NPC_ICHORON || GetOwner()->GetEntry() == NPC_DUMMY_ICHORON; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_31); + GetTarget()->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_31); + GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + if (GetTarget()->IsAIEnabled) + GetTarget()->GetAI()->DoAction(ACTION_DRAINED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_ichoron_drained_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_ichoron_drained_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_ichoron_drained_AuraScript(); } +}; - private: - InstanceScript* instance; - EventMap events; - uint8 pathId; - }; +// 54269 - Merge +class spell_ichoron_merge : public SpellScriptLoader +{ + public: + spell_ichoron_merge() : SpellScriptLoader("spell_ichoron_merge") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } + class spell_ichoron_merge_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ichoron_merge_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHRINK)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Creature* target = GetHitCreature()) + { + if (Aura* aura = target->GetAura(SPELL_SHRINK)) + aura->ModStackAmount(-1); + + target->AI()->DoAction(ACTION_WATER_GLOBULE_HIT); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_ichoron_merge_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_ichoron_merge_SpellScript(); + } +}; + +// 54306 - Protective Bubble +class spell_ichoron_protective_bubble : public SpellScriptLoader +{ + public: + spell_ichoron_protective_bubble() : SpellScriptLoader("spell_ichoron_protective_bubble") { } + + class spell_ichoron_protective_bubble_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ichoron_protective_bubble_AuraScript); + + bool Load() override + { + return GetOwner()->GetEntry() == NPC_ICHORON || GetOwner()->GetEntry() == NPC_DUMMY_ICHORON; + } + + void HandleShatter(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + //if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) + if (GetAura()->GetCharges() <= 1) + if (GetTarget()->IsAIEnabled) + GetTarget()->GetAI()->DoAction(ACTION_PROTECTIVE_BUBBLE_SHATTERED); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_ichoron_protective_bubble_AuraScript::HandleShatter, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_ichoron_protective_bubble_AuraScript(); + } +}; + +// 54259 - Splatter +class spell_ichoron_splatter : public SpellScriptLoader +{ + public: + spell_ichoron_splatter() : SpellScriptLoader("spell_ichoron_splatter") { } + + class spell_ichoron_splatter_AuraScript : public AuraScript + { + PrepareAuraScript(spell_ichoron_splatter_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WATER_GLOBULE_SUMMON_1) + || !sSpellMgr->GetSpellInfo(SPELL_WATER_GLOBULE_SUMMON_2) + || !sSpellMgr->GetSpellInfo(SPELL_WATER_GLOBULE_SUMMON_3) + || !sSpellMgr->GetSpellInfo(SPELL_WATER_GLOBULE_SUMMON_4) + || !sSpellMgr->GetSpellInfo(SPELL_WATER_GLOBULE_SUMMON_5) + || !sSpellMgr->GetSpellInfo(SPELL_SHRINK)) + return false; + return true; + } + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), RAND(SPELL_WATER_GLOBULE_SUMMON_1, SPELL_WATER_GLOBULE_SUMMON_2, SPELL_WATER_GLOBULE_SUMMON_3, SPELL_WATER_GLOBULE_SUMMON_4, SPELL_WATER_GLOBULE_SUMMON_5), true); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + if (Aura* aura = GetTarget()->GetAura(SPELL_SHRINK)) + aura->ModStackAmount(10); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ichoron_splatter_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_ichoron_splatter_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_ichoron_splatter_AuraScript(); + } }; class achievement_dehydration : public AchievementCriteriaScript { public: - achievement_dehydration() : AchievementCriteriaScript("achievement_dehydration") - { - } + achievement_dehydration() : AchievementCriteriaScript("achievement_dehydration") { } bool OnCheck(Player* /*player*/, Unit* target) override { @@ -542,5 +477,9 @@ void AddSC_boss_ichoron() { new boss_ichoron(); new npc_ichor_globule(); + new spell_ichoron_drained(); + new spell_ichoron_merge(); + new spell_ichoron_protective_bubble(); + new spell_ichoron_splatter(); new achievement_dehydration(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index 8b77b512ca4..c3b617f8199 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -27,130 +27,82 @@ enum Spells SPELL_LAVA_BURN = 54249 }; -enum LavanthorEvents -{ - EVENT_CAUTERIZING_FLAMES = 1, - EVENT_FIREBOLT, - EVENT_FLAME_BREATH, - EVENT_LAVA_BURN -}; - class boss_lavanthor : public CreatureScript { -public: - boss_lavanthor() : CreatureScript("boss_lavanthor") { } + public: + boss_lavanthor() : CreatureScript("boss_lavanthor") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } - - struct boss_lavanthorAI : public ScriptedAI - { - boss_lavanthorAI(Creature* creature) : ScriptedAI(creature) + struct boss_lavanthorAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_lavanthorAI(Creature* creature) : BossAI(creature, DATA_LAVANTHOR) { } - void Reset() override - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); + void Reset() override + { + BossAI::Reset(); + } - events.Reset(); - } + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + } - void EnterCombat(Unit* /*who*/) override - { - if (GameObject* door = instance->GetGameObject(DATA_LAVANTHOR_CELL)) - if (door->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); + void JustReachedHome() override + { + BossAI::JustReachedHome(); + instance->SetData(DATA_HANDLE_CELLS, DATA_LAVANTHOR); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - events.ScheduleEvent(EVENT_FIREBOLT, 1000); - events.ScheduleEvent(EVENT_FLAME_BREATH, 5000); - events.ScheduleEvent(EVENT_LAVA_BURN, 10000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_CAUTERIZING_FLAMES, 3000); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) - { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); } - } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) + void ScheduleTasks() override { - case EVENT_FIREBOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + scheduler.Schedule(Seconds(1), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) DoCast(target, SPELL_FIREBOLT); - events.ScheduleEvent(EVENT_FIREBOLT, urand(5000, 13000)); - break; - case EVENT_FLAME_BREATH: - DoCast(SPELL_FLAME_BREATH); - events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 15000)); - break; - case EVENT_LAVA_BURN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + task.Repeat(Seconds(5), Seconds(13)); + }); + + scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastVictim(SPELL_FLAME_BREATH); + task.Repeat(Seconds(10), Seconds(15)); + }); + + scheduler.Schedule(Seconds(10), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f)) DoCast(target, SPELL_LAVA_BURN); - events.ScheduleEvent(EVENT_LAVA_BURN, urand(15000, 23000)); - break; - case EVENT_CAUTERIZING_FLAMES: - DoCast(SPELL_CAUTERIZING_FLAMES); - events.ScheduleEvent(EVENT_CAUTERIZING_FLAMES, urand(10000, 16000)); - break; - default: - break; + task.Repeat(Seconds(15), Seconds(23)); + }); + + if (IsHeroic()) + { + scheduler.Schedule(Seconds(3), [this](TaskContext task) + { + DoCastAOE(SPELL_CAUTERIZING_FLAMES); + task.Repeat(Seconds(10), Seconds(16)); + }); + } } + }; - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override + CreatureAI* GetAI(Creature* creature) const override { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + return GetVioletHoldAI(creature); } - - private: - EventMap events; - InstanceScript* instance; - }; }; void AddSC_boss_lavanthor() diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index e9ee996b65b..41542416468 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -25,8 +25,8 @@ enum Spells { SPELL_CORROSIVE_SALIVA = 54527, SPELL_OPTIC_LINK = 54396, - SPELL_RAY_OF_PAIN = 54438, // NYI missing spelldifficulty - SPELL_RAY_OF_SUFFERING = 54442, // NYI missing spelldifficulty + SPELL_RAY_OF_PAIN = 54438, + SPELL_RAY_OF_SUFFERING = 54442, // Visual SPELL_OPTIC_LINK_LEVEL_1 = 54393, @@ -34,191 +34,107 @@ enum Spells SPELL_OPTIC_LINK_LEVEL_3 = 54395 }; -enum MoraggEvents -{ - EVENT_CORROSIVE_SALIVA = 1, - EVENT_OPTIC_LINK -}; - class boss_moragg : public CreatureScript { -public: - boss_moragg() : CreatureScript("boss_moragg") { } + public: + boss_moragg() : CreatureScript("boss_moragg") { } - struct boss_moraggAI : public ScriptedAI - { - boss_moraggAI(Creature* creature) : ScriptedAI(creature) + struct boss_moraggAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_moraggAI(Creature* creature) : BossAI(creature, DATA_MORAGG) { } - void Reset() override - { - events.Reset(); + void Reset() override + { + BossAI::Reset(); + } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + } - void EnterCombat(Unit* /*who*/) override - { - if (GameObject* door = instance->GetGameObject(DATA_MORAGG_CELL)) - if (door->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); + void JustReachedHome() override + { + BossAI::JustReachedHome(); + instance->SetData(DATA_HANDLE_CELLS, DATA_MORAGG); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - - me->SetInCombatWithZone(); - - DoCast(SPELL_RAY_OF_PAIN); - DoCast(SPELL_RAY_OF_SUFFERING); - events.ScheduleEvent(EVENT_OPTIC_LINK, 15000); - events.ScheduleEvent(EVENT_CORROSIVE_SALIVA, 5000); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) - { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); } - } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) + void ScheduleTasks() override { - case EVENT_OPTIC_LINK: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + scheduler.Async([this] + { + DoCast(me, SPELL_RAY_OF_PAIN); + DoCast(me, SPELL_RAY_OF_SUFFERING); + }); + + scheduler.Schedule(Seconds(15), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) DoCast(target, SPELL_OPTIC_LINK); - events.ScheduleEvent(EVENT_OPTIC_LINK, 25000); - break; - case EVENT_CORROSIVE_SALIVA: + task.Repeat(Seconds(25)); + }); + + scheduler.Schedule(Seconds(5), [this](TaskContext task) + { DoCastVictim(SPELL_CORROSIVE_SALIVA); - events.ScheduleEvent(EVENT_CORROSIVE_SALIVA, 10000); - break; - default: - break; + task.Repeat(Seconds(10)); + }); } + }; - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override + CreatureAI* GetAI(Creature* creature) const override { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + return GetVioletHoldAI(creature); } - - private: - EventMap events; - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; -class spell_moragg_ray_of_suffering : public SpellScriptLoader +class spell_moragg_ray : public SpellScriptLoader { -public: - spell_moragg_ray_of_suffering() : SpellScriptLoader("spell_moragg_ray_of_suffering") { } + public: + spell_moragg_ray() : SpellScriptLoader("spell_moragg_ray") { } - class spell_moragg_ray_of_suffering_AuraScript : public AuraScript - { - PrepareAuraScript(spell_moragg_ray_of_suffering_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) + class spell_moragg_ray_AuraScript : public AuraScript { - PreventDefaultAction(); - std::list players = GetTarget()->getThreatManager().getThreatList(); - if (!players.empty()) + PrepareAuraScript(spell_moragg_ray_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) { - std::list::iterator itr = players.begin(); - std::advance(itr, urand(0, players.size() - 1)); + PreventDefaultAction(); - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_MAX_TARGETS, 1, (*itr)->getTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + if (!GetTarget()->IsAIEnabled) + return; + + if (Unit* target = GetTarget()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) + { + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + GetTarget()->CastSpell(target, triggerSpell, TRIGGERED_FULL_MASK, nullptr, aurEff); + } } - } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_of_suffering_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_moragg_ray_of_suffering_AuraScript(); - } -}; - -class spell_moragg_ray_of_pain : public SpellScriptLoader -{ -public: - spell_moragg_ray_of_pain() : SpellScriptLoader("spell_moragg_ray_of_pain") { } - - class spell_moragg_ray_of_pain_AuraScript : public AuraScript - { - PrepareAuraScript(spell_moragg_ray_of_pain_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - std::list players = GetTarget()->getThreatManager().getThreatList(); - if (!players.empty()) + void Register() override { - std::list::iterator itr = players.begin(); - std::advance(itr, urand(0, players.size() - 1)); - - uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_MAX_TARGETS, 1, (*itr)->getTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } - } + }; - void Register() override + AuraScript* GetAuraScript() const override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_of_pain_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + return new spell_moragg_ray_AuraScript(); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_moragg_ray_of_pain_AuraScript(); - } }; class spell_moragg_optic_link : public SpellScriptLoader @@ -232,30 +148,15 @@ public: void OnPeriodic(AuraEffect const* aurEff) { - switch (aurEff->GetTickNumber()) // Different visual based on tick + if (Unit* caster = GetCaster()) { - case 1: - case 2: - case 3: - GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); - break; - case 4: - case 5: - case 6: - case 7: - GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); - GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_2, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); - break; - case 8: - case 9: - case 10: - case 11: - GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); - GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_2, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); - GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_3, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); - break; - default: - break; + if (aurEff->GetTickNumber() >= 8) + caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_3, TRIGGERED_FULL_MASK, nullptr, aurEff); + + if (aurEff->GetTickNumber() >= 4) + caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_2, TRIGGERED_FULL_MASK, nullptr, aurEff); + + caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_1, TRIGGERED_FULL_MASK, nullptr, aurEff); } } @@ -293,7 +194,6 @@ public: void AddSC_boss_moragg() { new boss_moragg(); - new spell_moragg_ray_of_suffering(); - new spell_moragg_ray_of_pain(); + new spell_moragg_ray(); new spell_moragg_optic_link(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index fe0f161cc27..5e3c7014239 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -22,25 +22,34 @@ #include "Player.h" #include "violet_hold.h" +/* + * TODO: + * - Implement Ethereal Summon Target + */ + enum Spells { SPELL_ARCANE_BARRAGE_VOLLEY = 54202, SPELL_ARCANE_BUFFET = 54226, - SPELL_SUMMON_ETHEREAL_SPHERE_1 = 54102, - SPELL_SUMMON_ETHEREAL_SPHERE_2 = 61337, - SPELL_SUMMON_ETHEREAL_SPHERE_3 = 54138 + SPELL_SUMMON_TARGET_VISUAL = 54111 }; +static uint32 const EtherealSphereCount = 3; +static uint32 const EtherealSphereSummonSpells[EtherealSphereCount] = { 54102, 54137, 54138 }; +static uint32 const EtherealSphereHeroicSummonSpells[EtherealSphereCount] = { 54102, 54137, 54138 }; + enum NPCs { NPC_ETHEREAL_SPHERE = 29271, - NPC_ETHEREAL_SPHERE2 = 32582 + NPC_ETHEREAL_SPHERE2 = 32582, + NPC_ETHEREAL_SUMMON_TARGET = 29276 }; enum CreatureSpells { SPELL_ARCANE_POWER = 54160, H_SPELL_ARCANE_POWER = 59474, + SPELL_MAGIC_PULL = 50770, SPELL_SUMMON_PLAYERS = 54164, SPELL_POWER_BALL_VISUAL = 54141, SPELL_POWER_BALL_DAMAGE_TRIGGER = 54207 @@ -48,24 +57,17 @@ enum CreatureSpells enum Yells { + // Xevozz SAY_AGGRO = 0, SAY_SLAY = 1, SAY_DEATH = 2, SAY_SPAWN = 3, SAY_CHARGED = 4, SAY_REPEAT_SUMMON = 5, - SAY_SUMMON_ENERGY = 6 -}; + SAY_SUMMON_ENERGY = 6, -enum XevozzEvents -{ - EVENT_ARCANE_BARRAGE = 1, - EVENT_ARCANE_BUFFET, - EVENT_SUMMON_SPHERE, - EVENT_SUMMON_SPHERE_2, - EVENT_RANGE_CHECK, - EVENT_SUMMON_PLAYERS, - EVENT_DESPAWN_SPHERE + // Ethereal Sphere + SAY_ETHEREAL_SPHERE_SUMMON = 0 }; enum SphereActions @@ -75,319 +77,213 @@ enum SphereActions class boss_xevozz : public CreatureScript { -public: - boss_xevozz() : CreatureScript("boss_xevozz") { } + public: + boss_xevozz() : CreatureScript("boss_xevozz") { } - struct boss_xevozzAI : public ScriptedAI - { - boss_xevozzAI(Creature* creature) : ScriptedAI(creature) + struct boss_xevozzAI : public BossAI { - instance = creature->GetInstanceScript(); - } + boss_xevozzAI(Creature* creature) : BossAI(creature, DATA_XEVOZZ) { } - void Reset() override - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - - DespawnSphere(); - events.Reset(); - } - - void DespawnSphere() - { - std::list assistList; - GetCreatureListWithEntryInGrid(assistList, me, NPC_ETHEREAL_SPHERE, 150.0f); - GetCreatureListWithEntryInGrid(assistList, me, NPC_ETHEREAL_SPHERE2, 150.0f); - - if (assistList.empty()) - return; - - for (std::list::const_iterator iter = assistList.begin(); iter != assistList.end(); ++iter) + void Reset() override { - if (Creature* pSphere = *iter) - pSphere->Kill(pSphere, false); + BossAI::Reset(); } - } - void JustSummoned(Creature* summoned) override - { - summoned->SetSpeed(MOVE_RUN, 0.5f); - summoned->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) + void EnterCombat(Unit* who) override { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); } - } - void EnterCombat(Unit* /*who*/) override - { - if (GameObject* door = instance->GetGameObject(DATA_XEVOZZ_CELL)) - if (door->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); + void JustReachedHome() override + { + BossAI::JustReachedHome(); + instance->SetData(DATA_HANDLE_CELLS, DATA_XEVOZZ); + } + + void JustSummoned(Creature* summon) override + { + BossAI::JustSummoned(summon); + summon->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void SpellHit(Unit* /*who*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_ARCANE_POWER || spell->Id == H_SPELL_ARCANE_POWER) + Talk(SAY_SUMMON_ENERGY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - } - Talk(SAY_AGGRO); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - - events.ScheduleEvent(EVENT_SUMMON_SPHERE, 5000); - events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(8000, 10000)); - events.ScheduleEvent(EVENT_ARCANE_BUFFET, urand(10000, 11000)); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - DespawnSphere(); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) + + void ScheduleTasks() override { - instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - instance->SetData(DATA_WAVE_COUNT, 13); - } - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void SpellHit(Unit* who, const SpellInfo* spell) override - { - if (!who->ToCreature()) - return; - - if ((spell->Id == SPELL_ARCANE_POWER) || (spell->Id == H_SPELL_ARCANE_POWER)) - Talk(SAY_SUMMON_ENERGY); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ARCANE_BARRAGE: - DoCast(SPELL_ARCANE_BARRAGE_VOLLEY); - events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(8000, 10000)); - break; - case EVENT_ARCANE_BUFFET: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_ARCANE_BUFFET); - events.ScheduleEvent(EVENT_ARCANE_BUFFET, urand(15000, 20000)); - break; - case EVENT_SUMMON_SPHERE: - Talk(SAY_REPEAT_SUMMON); - DoCast(SPELL_SUMMON_ETHEREAL_SPHERE_1); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_SPHERE_2, 2500); - events.ScheduleEvent(EVENT_SUMMON_PLAYERS, urand(33000, 35000)); - events.ScheduleEvent(EVENT_SUMMON_SPHERE, urand(45000, 47000)); - break; - case EVENT_SUMMON_SPHERE_2: - Talk(SAY_REPEAT_SUMMON); - DoCast(SPELL_SUMMON_ETHEREAL_SPHERE_2); - break; - case EVENT_SUMMON_PLAYERS: + scheduler.Schedule(Seconds(8), Seconds(10), [this](TaskContext task) { - Creature* sphere = me->FindNearestCreature(NPC_ETHEREAL_SPHERE, 150.0f); - if (!sphere) - sphere = me->FindNearestCreature(NPC_ETHEREAL_SPHERE2, 150.0f); - if (sphere) - sphere->GetAI()->DoAction(ACTION_SUMMON); - break; - } - default: - break; + DoCastAOE(SPELL_ARCANE_BARRAGE_VOLLEY); + task.Repeat(Seconds(8), Seconds(10)); + }); + + scheduler.Schedule(Seconds(10), Seconds(11), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) + DoCast(target, SPELL_ARCANE_BUFFET); + task.Repeat(Seconds(15), Seconds(20)); + }); + + scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + Talk(SAY_REPEAT_SUMMON); + + std::list summonSpells = { 0, 1, 2 }; + + auto it = summonSpells.begin(); + std::advance(it, urand(0, summonSpells.size() - 1)); + DoCast(me, EtherealSphereSummonSpells[*it]); + it = summonSpells.erase(it); + + if (IsHeroic()) + { + task.Schedule(Milliseconds(2500), [this, &it, &summonSpells](TaskContext /*task*/) + { + it = summonSpells.begin(); + std::advance(it, urand(0, summonSpells.size() - 1)); + DoCast(me, EtherealSphereHeroicSummonSpells[*it]); + it = summonSpells.erase(it); + }); + } + + task.Schedule(Seconds(33), Seconds(35), [this](TaskContext /*task*/) + { + DummyEntryCheckPredicate pred; + summons.DoAction(ACTION_SUMMON, pred); + }); + + task.Repeat(Seconds(45), Seconds(47)); + }); } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - - private: - InstanceScript* instance; - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_ethereal_sphere : public CreatureScript { -public: - npc_ethereal_sphere() : CreatureScript("npc_ethereal_sphere") { } + public: + npc_ethereal_sphere() : CreatureScript("npc_ethereal_sphere") { } - struct npc_ethereal_sphereAI : public ScriptedAI - { - npc_ethereal_sphereAI(Creature* creature) : ScriptedAI(creature) + struct npc_ethereal_sphereAI : public ScriptedAI { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - arcanePower = false; - } - - void Reset() override - { - Initialize(); - events.Reset(); - DoCast(SPELL_POWER_BALL_VISUAL); - DoCast(SPELL_POWER_BALL_DAMAGE_TRIGGER); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->setFaction(16); - events.ScheduleEvent(EVENT_DESPAWN_SPHERE, 40000); - events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); - } - - void DoAction(int32 action) override - { - if (action == ACTION_SUMMON) - DoCast(SPELL_SUMMON_PLAYERS); - } - - void UpdateAI(uint32 diff) override - { - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) + npc_ethereal_sphereAI(Creature* creature) : ScriptedAI(creature) { - case EVENT_RANGE_CHECK: - if (Creature* xevozz = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XEVOZZ))) + instance = creature->GetInstanceScript(); + } + + void Reset() override + { + scheduler.CancelAll(); + ScheduledTasks(); + + DoCast(me, SPELL_POWER_BALL_VISUAL); + DoCast(me, SPELL_POWER_BALL_DAMAGE_TRIGGER); + + me->DespawnOrUnsummon(40000); + } + + void DoAction(int32 action) override + { + if (action == ACTION_SUMMON) + { + Talk(SAY_ETHEREAL_SPHERE_SUMMON); + DoCastAOE(SPELL_SUMMON_PLAYERS); + } + } + + void UpdateAI(uint32 diff) override + { + scheduler.Update(diff); + } + + void ScheduledTasks() + { + scheduler.Schedule(Seconds(1), [this](TaskContext task) + { + if (Creature* xevozz = instance->GetCreature(DATA_XEVOZZ)) { - if (me->IsWithinDist(xevozz, 3.0f) && !arcanePower) + if (me->IsWithinDist(xevozz, 3.0f)) { - DoCast(SPELL_ARCANE_POWER); - arcanePower = true; - events.ScheduleEvent(EVENT_DESPAWN_SPHERE, 8000); + DoCastAOE(SPELL_ARCANE_POWER); + me->DespawnOrUnsummon(8000); + return; } } - events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); - break; - case EVENT_DESPAWN_SPHERE: - me->DespawnOrUnsummon(); - break; + task.Repeat(); + }); } + + private: + InstanceScript* instance; + TaskScheduler scheduler; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - - private: - InstanceScript* instance; - EventMap events; - bool arcanePower; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class spell_xevozz_summon_players : public SpellScriptLoader { -public: - spell_xevozz_summon_players() : SpellScriptLoader("spell_xevozz_summon_players") { } + public: + spell_xevozz_summon_players() : SpellScriptLoader("spell_xevozz_summon_players") { } - class spell_xevozz_summon_players_SpellScript : public SpellScript - { - PrepareSpellScript(spell_xevozz_summon_players_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) + class spell_xevozz_summon_players_SpellScript : public SpellScript { - Unit* target = GetHitUnit(); + PrepareSpellScript(spell_xevozz_summon_players_SpellScript); - if (target) + bool Validate(SpellInfo const* /*spellInfo*/) override { - Position pos = GetOriginalCaster()->GetPosition(); - - target->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_xevozz_summon_players_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_xevozz_summon_players_SpellScript(); - } -}; - -class spell_xevozz_summon_ethereal_sphere : public SpellScriptLoader -{ -public: - spell_xevozz_summon_ethereal_sphere() : SpellScriptLoader("spell_xevozz_summon_ethereal_sphere") { } - - class spell_xevozz_summon_ethereal_sphere_SpellScript : public SpellScript - { - PrepareSpellScript(spell_xevozz_summon_ethereal_sphere_SpellScript); - - void HandleScript(SpellDestination& target) - { - Unit* caster = GetOriginalCaster(); - Position pos; - float distance = 0.0f; - - while (distance < 20.0f) - { - pos = caster->GetRandomNearPosition(60.0f); - distance = caster->GetDistance(pos); + if (!sSpellMgr->GetSpellInfo(SPELL_MAGIC_PULL)) + return false; + return true; } - target.Relocate(pos); - } + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGIC_PULL, true); + } - void Register() override + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_xevozz_summon_players_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_xevozz_summon_ethereal_sphere_SpellScript::HandleScript, EFFECT_0, TARGET_DEST_DB); + return new spell_xevozz_summon_players_SpellScript(); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_xevozz_summon_ethereal_sphere_SpellScript(); - } }; void AddSC_boss_xevozz() @@ -395,5 +291,4 @@ void AddSC_boss_xevozz() new boss_xevozz(); new npc_ethereal_sphere(); new spell_xevozz_summon_players(); - new spell_xevozz_summon_ethereal_sphere(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index 5b3f06c9e40..14d7b5fcd95 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -25,6 +25,10 @@ enum Spells SPELL_SUMMON_VOID_SENTRY = 54369, SPELL_VOID_SHIFT = 54361, SPELL_VOID_SHIFTED = 54343, + SPELL_ZURAMAT_ADD = 54341, + SPELL_ZURAMAT_ADD_2 = 54342, + SPELL_ZURAMAT_ADD_DUMMY = 54351, + SPELL_SUMMON_VOID_SENTRY_BALL = 58650 }; enum Yells @@ -39,188 +43,172 @@ enum Yells enum Misc { + ACTION_DESPAWN_VOID_SENTRY_BALL = 1, DATA_VOID_DANCE = 2153 }; -enum ZuramatEvents -{ - EVENT_VOID_SHIFT = 1, - EVENT_SUMMON_VOID, - EVENT_SHROUD_OF_DARKNESS -}; - class boss_zuramat : public CreatureScript { -public: - boss_zuramat() : CreatureScript("boss_zuramat") { } + public: + boss_zuramat() : CreatureScript("boss_zuramat") { } - struct boss_zuramatAI : public ScriptedAI - { - boss_zuramatAI(Creature* creature) : ScriptedAI(creature), sentries(me) + struct boss_zuramatAI : public BossAI { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - voidDance = true; - } - - void DespawnSentries() - { - sentries.DespawnAll(); - std::list sentrylist; - GetCreatureListWithEntryInGrid(sentrylist, me, NPC_VOID_SENTRY_BALL, 200.0f); - if (!sentrylist.empty()) - for (std::list::const_iterator itr = sentrylist.begin(); itr != sentrylist.end(); ++itr) - (*itr)->DespawnOrUnsummon(); - } - - void Reset() override - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - - Initialize(); - events.Reset(); - DespawnSentries(); - } - - void AttackStart(Unit* who) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (me->Attack(who, true)) + boss_zuramatAI(Creature* creature) : BossAI(creature, DATA_ZURAMAT) { - me->AddThreat(who, 0.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); - DoStartMovement(who); + Initialize(); } - } - void EnterCombat(Unit* /*who*/) override - { - if (GameObject* door = instance->GetGameObject(DATA_ZURAMAT_CELL)) - if (door->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); + void Initialize() + { + _voidDance = true; + } + + void Reset() override + { + BossAI::Reset(); + Initialize(); + } + + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + } + + void JustReachedHome() override + { + BossAI::JustReachedHome(); + instance->SetData(DATA_HANDLE_CELLS, DATA_ZURAMAT); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*who*/) override + { + if (summon->GetEntry() == NPC_VOID_SENTRY) + _voidDance = false; + } + + void SummonedCreatureDespawn(Creature* summon) override + { + if (summon->GetEntry() == NPC_VOID_SENTRY) + summon->AI()->DoAction(ACTION_DESPAWN_VOID_SENTRY_BALL); + BossAI::SummonedCreatureDespawn(summon); + } + + uint32 GetData(uint32 type) const override + { + if (type == DATA_VOID_DANCE) + return _voidDance ? 1 : 0; + + return 0; + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - } - Talk(SAY_AGGRO); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - - me->SetInCombatWithZone(); - events.ScheduleEvent(EVENT_SHROUD_OF_DARKNESS, urand(18000, 20000)); - events.ScheduleEvent(EVENT_VOID_SHIFT, 9000); - events.ScheduleEvent(EVENT_SUMMON_VOID, 4000); - } - - void JustSummoned(Creature* summon) override - { - sentries.Summon(summon); - } - - void SummonedCreatureDies(Creature* summoned, Unit* /*who*/) override - { - if (summoned->GetEntry() == NPC_VOID_SENTRY) - voidDance = false; - } - - uint32 GetData(uint32 type) const override - { - if (type == DATA_VOID_DANCE) - return voidDance ? 1 : 0; - - return 0; - } - - void JustDied(Unit* /*killer*/) override - { - instance->SetData(DATA_ZURAMAT, 1); - - Talk(SAY_DEATH); - - DespawnSentries(); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON_VOID: - DoCast(SPELL_SUMMON_VOID_SENTRY); - events.ScheduleEvent(EVENT_SUMMON_VOID, urand(7000, 10000)); - break; - case EVENT_VOID_SHIFT: - if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(unit, SPELL_VOID_SHIFT); - events.ScheduleEvent(EVENT_VOID_SHIFT, 15000); - break; - case EVENT_SHROUD_OF_DARKNESS: - DoCast(SPELL_SHROUD_OF_DARKNESS); - events.ScheduleEvent(EVENT_SHROUD_OF_DARKNESS, urand(18000, 20000)); - break; - default: - break; + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); } - DoMeleeAttackIfReady(); + void ScheduleTasks() override + { + scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + DoCast(me, SPELL_SUMMON_VOID_SENTRY); + task.Repeat(Seconds(7), Seconds(10)); + }); + + scheduler.Schedule(Seconds(9), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) + DoCast(target, SPELL_VOID_SHIFT); + task.Repeat(Seconds(15)); + }); + + scheduler.Schedule(Seconds(18), Seconds(20), [this](TaskContext task) + { + DoCast(me, SPELL_SHROUD_OF_DARKNESS); + task.Repeat(Seconds(18), Seconds(20)); + }); + } + + private: + bool _voidDance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } +}; - private: - InstanceScript* instance; - EventMap events; - SummonList sentries; - bool voidDance; - }; +class npc_void_sentry : public CreatureScript +{ + public: + npc_void_sentry() : CreatureScript("npc_void_sentry") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } + struct npc_void_sentryAI : public ScriptedAI + { + npc_void_sentryAI(Creature* creature) : ScriptedAI(creature), _summons(creature) + { + me->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + me->CastSpell(me, SPELL_SUMMON_VOID_SENTRY_BALL, true); + } + + void JustSummoned(Creature* summon) override + { + _summons.Summon(summon); + summon->SetReactState(REACT_PASSIVE); + } + + void SummonedCreatureDespawn(Creature* summon) override + { + _summons.Despawn(summon); + } + + void DoAction(int32 actionId) override + { + if (actionId == ACTION_DESPAWN_VOID_SENTRY_BALL) + _summons.DespawnAll(); + } + + void JustDied(Unit* /*killer*/) override + { + DoAction(ACTION_DESPAWN_VOID_SENTRY_BALL); + } + + private: + SummonList _summons; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); + } }; class achievement_void_dance : public AchievementCriteriaScript { public: - achievement_void_dance() : AchievementCriteriaScript("achievement_void_dance") - { - } + achievement_void_dance() : AchievementCriteriaScript("achievement_void_dance") { } bool OnCheck(Player* /*player*/, Unit* target) override { @@ -238,5 +226,6 @@ class achievement_void_dance : public AchievementCriteriaScript void AddSC_boss_zuramat() { new boss_zuramat(); + new npc_void_sentry(); new achievement_void_dance(); } diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 652b4815be0..2294c51e59f 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -20,80 +20,147 @@ #include "InstanceScript.h" #include "violet_hold.h" #include "Player.h" -#include "TemporarySummon.h" -/* Violet Hold encounters: -0 - First boss -1 - Second boss -2 - Cyanigosa*/ +/* + * TODO: + * - replace bosses by dummy npcs also after grid unload + */ -/* Violet hold bosses: -1 - Moragg -2 - Erekem -3 - Ichoron -4 - Lavanthor -5 - Xevozz -6 - Zuramat -7 - Cyanigosa */ +Position const DefenseSystemLocation = { 1888.146f, 803.382f, 58.60389f, 3.071779f }; // sniff -enum AzureSaboteurSpells +Position const CyanigosaSpawnLocation = { 1922.109f, 804.4493f, 52.49254f, 3.176499f }; // sniff +Position const CyanigosaJumpLocation = { 1888.32f, 804.473f, 38.3578f, 0.0f }; // sniff + +Position const SaboteurSpawnLocation = { 1886.251f, 803.0743f, 38.42326f, 3.211406f }; // sniff + +uint32 const PortalPositionsSize = 5; +Position const PortalPositions[PortalPositionsSize] = // sniff { - SABOTEUR_SHIELD_DISRUPTION = 58291, - SABOTEUR_SHIELD_EFFECT = 45775 + { 1877.523f, 850.1788f, 45.36822f, 4.34587f }, // 0 + { 1890.679f, 753.4202f, 48.771f, 1.675516f }, // 1 + { 1936.09f, 803.1875f, 54.09715f, 3.054326f }, // 2 + { 1858.243f, 770.2379f, 40.42146f, 0.9075712f }, // 3 + { 1907.288f, 831.1111f, 40.22015f, 3.560472f } // 4 }; -enum CrystalSpells +uint32 const PortalElitePositionsSize = 3; +Position const PortalElitePositions[PortalElitePositionsSize] = // sniff { - SPELL_ARCANE_LIGHTNING = 57930 + { 1911.281f, 800.9722f, 39.91673f, 3.01942f }, // 5 + { 1926.516f, 763.6616f, 52.35725f, 2.251475f }, // 6 + { 1922.464f, 847.0699f, 48.50161f, 3.961897f } // 7 }; -Position const PortalLocation[] = +uint32 const PortalIntroPositionsSize = 5; +Position const PortalIntroPositions[PortalIntroPositionsSize] = // sniff { - {1877.51f, 850.104f, 44.6599f, 4.7822f }, // WP 1 - {1918.37f, 853.437f, 47.1624f, 4.12294f}, // WP 2 - {1936.07f, 803.198f, 53.3749f, 3.12414f}, // WP 3 - {1927.61f, 758.436f, 51.4533f, 2.20891f}, // WP 4 - {1890.64f, 753.471f, 48.7224f, 1.71042f}, // WP 5 - {1908.31f, 809.657f, 38.7037f, 3.08701f} // WP 6 + { 1877.51f, 850.1042f, 44.65989f, 4.782202f }, // 0 - Intro + { 1890.637f, 753.4705f, 48.72239f, 1.710423f }, // 1 - Intro + { 1936.073f, 803.1979f, 53.37491f, 3.124139f }, // 2 - Intro + { 1886.545f, 803.2014f, 40.40931f, 3.159046f }, // 3 - Boss 1/2 + { 1924.096f, 804.3707f, 54.29256f, 3.228859f } // 4 - Boss 3 }; -Position const ArcaneSphere = {1887.060059f, 806.151001f, 61.321602f, 0.0f}; -Position const BossStartMove1 = {1894.684448f, 739.390503f, 47.668003f, 0.0f}; -Position const BossStartMove2 = {1875.173950f, 860.832703f, 43.333565f, 0.0f}; -Position const BossStartMove21 = {1858.854614f, 855.071411f, 43.333565f, 0.0f}; -Position const BossStartMove22 = {1891.926636f, 863.388977f, 43.333565f, 0.0f}; -Position const BossStartMove3 = {1916.138062f, 778.152222f, 35.772308f, 0.0f}; -Position const BossStartMove4 = {1853.618286f, 758.557617f, 38.657505f, 0.0f}; -Position const BossStartMove5 = {1906.683960f, 842.348022f, 38.637459f, 0.0f}; -Position const BossStartMove6 = {1928.207031f, 852.864441f, 47.200813f, 0.0f}; +uint32 const EncouterPortalsCount = PortalPositionsSize + PortalElitePositionsSize; -Position const CyanigosasSpawnLocation = {1930.281250f, 804.407715f, 52.410946f, 3.139621f}; -Position const MiddleRoomLocation = {1892.291260f, 805.696838f, 38.438862f, 3.139621f}; -Position const MiddleRoomPortalSaboLocation = {1896.622925f, 804.854126f, 38.504772f, 3.139621f}; +uint32 const MoraggPathSize = 3; +G3D::Vector3 const MoraggPath[MoraggPathSize] = // sniff +{ + { 1893.895f, 728.1261f, 47.75016f }, + { 1892.997f, 738.4987f, 47.66684f }, + { 1889.76f, 758.1089f, 47.66684f } +}; + +uint32 const ErekemPathSize = 3; +G3D::Vector3 const ErekemPath[ErekemPathSize] = // sniff +{ + { 1871.456f, 871.0361f, 43.41524f }, + { 1874.948f, 859.5452f, 43.33349f }, + { 1877.245f, 851.967f, 43.3335f } +}; + +uint32 const ErekemGuardLeftPathSize = 3; +G3D::Vector3 const ErekemGuardLeftPath[ErekemGuardLeftPathSize] = // sniff +{ + { 1853.752f, 862.4528f, 43.41614f }, + { 1866.931f, 854.577f, 43.3335f }, + { 1872.973f, 850.7875f, 43.3335f } +}; + +uint32 const ErekemGuardRightPathSize = 3; +G3D::Vector3 const ErekemGuardRightPath[ErekemGuardRightPathSize] = // sniff +{ + { 1892.418f, 872.2831f, 43.41563f }, + { 1885.639f, 859.0245f, 43.3335f }, + { 1882.432f, 852.2423f, 43.3335f } +}; + +uint32 const IchoronPathSize = 5; +G3D::Vector3 const IchoronPath[IchoronPathSize] = // sniff +{ + { 1942.041f, 749.5228f, 30.95229f }, + { 1930.571f, 762.9065f, 31.98814f }, + { 1923.657f, 770.6718f, 34.07256f }, + { 1910.631f, 784.4096f, 37.09015f }, + { 1906.595f, 788.3828f, 37.99429f } +}; + +uint32 const LavanthorPathSize = 3; +G3D::Vector3 const LavanthorPath[LavanthorPathSize] = // sniff +{ + { 1844.557f, 748.7083f, 38.74205f }, + { 1854.618f, 761.5295f, 38.65631f }, + { 1862.17f, 773.2255f, 38.74879f } +}; + +uint32 const XevozzPathSize = 3; +G3D::Vector3 const XevozzPath[XevozzPathSize] = // sniff +{ + { 1908.417f, 845.8502f, 38.71947f }, + { 1905.557f, 841.3157f, 38.65529f }, + { 1899.453f, 832.533f, 38.70752f } +}; + +uint32 const ZuramatPathSize = 3; +G3D::Vector3 const ZuramatPath[ZuramatPathSize] = // sniff +{ + { 1934.151f, 860.9463f, 47.29499f }, + { 1927.085f, 852.1342f, 47.19214f }, + { 1923.226f, 847.3297f, 47.15541f } +}; -// Cyanigosa's prefight event data enum Yells { - CYANIGOSA_SAY_SPAWN = 0 + SAY_CYANIGOSA_SPAWN = 3, + SAY_XEVOZZ_SPAWN = 3, + SAY_EREKEM_SPAWN = 3, + SAY_ICHORON_SPAWN = 3, + SAY_ZURAMAT_SPAWN = 3, + + SOUND_MORAGG_SPAWN = 10112 }; enum Spells { - CYANIGOSA_SPELL_TRANSFORM = 58668, - CYANIGOSA_BLUE_AURA = 47759, + SPELL_CYANIGOSA_TRANSFORM = 58668, + SPELL_CYANIGOSA_ARCANE_POWER_STATE = 49411, + SPELL_MORAGG_EMOTE_ROAR = 48350, + SPELL_LAVANTHOR_SPECIAL_UNARMED = 33334, + SPELL_ZURAMAT_COSMETIC_CHANNEL_OMNI = 57552 }; ObjectData const creatureData[] = { - { NPC_XEVOZZ, DATA_XEVOZZ }, - { NPC_LAVANTHOR, DATA_LAVANTHOR }, - { NPC_ICHORON, DATA_ICHORON }, - { NPC_ZURAMAT, DATA_ZURAMAT }, - { NPC_EREKEM, DATA_EREKEM }, - { NPC_MORAGG, DATA_MORAGG }, - { NPC_CYANIGOSA, DATA_CYANIGOSA }, - { NPC_SINCLARI, DATA_SINCLARI }, - { 0, 0 } // END + { NPC_XEVOZZ, DATA_XEVOZZ }, + { NPC_LAVANTHOR, DATA_LAVANTHOR }, + { NPC_ICHORON, DATA_ICHORON }, + { NPC_ZURAMAT, DATA_ZURAMAT }, + { NPC_EREKEM, DATA_EREKEM }, + { NPC_MORAGG, DATA_MORAGG }, + { NPC_CYANIGOSA, DATA_CYANIGOSA }, + { NPC_SINCLARI, DATA_SINCLARI }, + { NPC_SINCLARI_TRIGGER, DATA_SINCLARI_TRIGGER }, + { 0, 0 } // END }; ObjectData const gameObjectData[] = @@ -110,598 +177,770 @@ ObjectData const gameObjectData[] = { 0, 0 } // END }; +MinionData const minionData[] = +{ + { NPC_EREKEM_GUARD, DATA_EREKEM }, + { 0, 0, } // END +}; + class instance_violet_hold : public InstanceMapScript { -public: - instance_violet_hold() : InstanceMapScript("instance_violet_hold", 608) { } + public: + instance_violet_hold() : InstanceMapScript(VioletHoldScriptName, 608) { } - struct instance_violet_hold_InstanceMapScript : public InstanceScript - { - instance_violet_hold_InstanceMapScript(Map* map) : InstanceScript(map) + struct instance_violet_hold_InstanceMapScript : public InstanceScript { - SetHeaders(DataHeader); - SetBossNumber(EncounterCount); - LoadObjectData(creatureData, gameObjectData); - - uiRemoveNpc = 0; - - uiDoorIntegrity = 100; - - uiWaveCount = 0; - uiLocation = urand(0, 5); - uiFirstBoss = 0; - uiSecondBoss = 0; - uiCountErekemGuards = 0; - uiCountActivationCrystals = 0; - uiCyanigosaEventPhase = 1; - - uiActivationTimer = 5000; - uiDoorSpellTimer = 2000; - uiCyanigosaEventTimer = 3 * IN_MILLISECONDS; - - bActive = false; - bWiped = false; - bIsDoorSpellCast = false; - bCrystalActivated = false; - defenseless = true; - uiMainEventPhase = NOT_STARTED; - zuramatDead = false; - } - - ObjectGuid uiErekemGuard[2]; - - ObjectGuid uiTeleportationPortal; - ObjectGuid uiSaboteurPortal; - - ObjectGuid uiActivationCrystal[4]; - - uint32 uiActivationTimer; - uint32 uiCyanigosaEventTimer; - uint32 uiDoorSpellTimer; - - GuidSet trashMobs; // to kill with crystal - - uint8 uiWaveCount; - uint8 uiLocation; - uint8 uiFirstBoss; - uint8 uiSecondBoss; - uint8 uiRemoveNpc; - - uint8 uiDoorIntegrity; - - uint8 uiCountErekemGuards; - uint8 uiCountActivationCrystals; - uint8 uiCyanigosaEventPhase; - uint8 uiMainEventPhase; // SPECIAL: pre event animations, IN_PROGRESS: event itself - - bool bActive; - bool bWiped; - bool bIsDoorSpellCast; - bool bCrystalActivated; - bool defenseless; - bool zuramatDead; - - std::list NpcAtDoorCastingList; - - void OnCreatureCreate(Creature* creature) override - { - InstanceScript::OnCreatureCreate(creature); - - switch (creature->GetEntry()) + instance_violet_hold_InstanceMapScript(Map* map) : InstanceScript(map) { - case NPC_EREKEM_GUARD: - if (uiCountErekemGuards < 2) - { - uiErekemGuard[uiCountErekemGuards++] = creature->GetGUID(); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); - } - break; - case NPC_CYANIGOSA: - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); - break; - default: - break; - case NPC_VOID_SENTRY: - if (zuramatDead) - { - creature->DespawnOrUnsummon(); - zuramatDead = false; - } - break; + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, gameObjectData); + LoadMinionData(minionData); + + FirstBossId = 0; + SecondBossId = 0; + + DoorIntegrity = 100; + WaveCount = 0; + EventState = NOT_STARTED; + + LastPortalLocation = urand(0, EncouterPortalsCount - 1); + + Defenseless = true; } - if (creature->GetGUID() == uiFirstBoss || creature->GetGUID() == uiSecondBoss) + void OnCreatureCreate(Creature* creature) override { - creature->AllLootRemovedFromCorpse(); - creature->RemoveLootMode(1); - } - } + InstanceScript::OnCreatureCreate(creature); - void OnGameObjectCreate(GameObject* go) override - { - InstanceScript::OnGameObjectCreate(go); - - switch (go->GetEntry()) - { - case GO_ACTIVATION_CRYSTAL: - if (uiCountActivationCrystals < 4) - uiActivationCrystal[uiCountActivationCrystals++] = go->GetGUID(); - break; - default: - break; - } - } - - bool SetBossState(uint32 type, EncounterState state) override - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - switch (type) - { - case DATA_1ST_BOSS_EVENT: - if (state == DONE) - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_EREKEM, nullptr); - break; - case DATA_2ND_BOSS_EVENT: - if (state == DONE) - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_MORAGG, nullptr); - break; - case DATA_CYANIGOSA: - if (state == DONE) - { - uiMainEventPhase = DONE; - if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) - mainDoor->SetGoState(GO_STATE_ACTIVE); - } - break; - default: - break; - } - - return true; - } - - void SetData(uint32 type, uint32 data) override - { - switch (type) - { - case DATA_WAVE_COUNT: - uiWaveCount = data; - bActive = true; - break; - case DATA_REMOVE_NPC: - uiRemoveNpc = data; - break; - case DATA_PORTAL_LOCATION: - uiLocation = (uint8)data; - break; - case DATA_DOOR_INTEGRITY: - uiDoorIntegrity = data; - defenseless = false; - DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, uiDoorIntegrity); - break; - case DATA_NPC_PRESENCE_AT_DOOR_ADD: - NpcAtDoorCastingList.push_back(data); - break; - case DATA_NPC_PRESENCE_AT_DOOR_REMOVE: - if (!NpcAtDoorCastingList.empty()) - NpcAtDoorCastingList.pop_back(); - break; - case DATA_MAIN_DOOR: - if (GameObject* mainDoor = GetGameObject(type)) - mainDoor->SetGoState(GOState(data)); - break; - case DATA_START_BOSS_ENCOUNTER: - switch (uiWaveCount) - { - case 6: - StartBossEncounter(uiFirstBoss); - break; - case 12: - StartBossEncounter(uiSecondBoss); - break; - } - break; - case DATA_ACTIVATE_CRYSTAL: - ActivateCrystal(); - break; - case DATA_MAIN_EVENT_PHASE: - uiMainEventPhase = data; - if (data == IN_PROGRESS) // Start event - { - if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) - mainDoor->SetGoState(GO_STATE_READY); - uiWaveCount = 1; - bActive = true; - for (int i = 0; i < 4; ++i) - if (GameObject* crystal = instance->GetGameObject(uiActivationCrystal[i])) - crystal->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - uiRemoveNpc = 0; // might not have been reset after a wipe on a boss. - } - break; - case DATA_ZURAMAT: - zuramatDead = true; - break; - } - } - - void SetGuidData(uint32 type, ObjectGuid data) override - { - switch (type) - { - case DATA_ADD_TRASH_MOB: - trashMobs.insert(data); - break; - case DATA_DEL_TRASH_MOB: - trashMobs.erase(data); - break; - } - } - - uint32 GetData(uint32 type) const override - { - switch (type) - { - case DATA_WAVE_COUNT: return uiWaveCount; - case DATA_REMOVE_NPC: return uiRemoveNpc; - case DATA_PORTAL_LOCATION: return uiLocation; - case DATA_DOOR_INTEGRITY: return uiDoorIntegrity; - case DATA_NPC_PRESENCE_AT_DOOR: return NpcAtDoorCastingList.size(); - case DATA_FIRST_BOSS: return uiFirstBoss; - case DATA_SECOND_BOSS: return uiSecondBoss; - case DATA_MAIN_EVENT_PHASE: return uiMainEventPhase; - case DATA_DEFENSELESS: return defenseless ? 1 : 0; - } - - return 0; - } - - ObjectGuid GetGuidData(uint32 type) const override - { - switch (type) - { - case DATA_EREKEM_GUARD_1: return uiErekemGuard[0]; - case DATA_EREKEM_GUARD_2: return uiErekemGuard[1]; - case DATA_TELEPORTATION_PORTAL: return uiTeleportationPortal; - case DATA_SABOTEUR_PORTAL: return uiSaboteurPortal; - } - - return InstanceScript::GetGuidData(type); - } - - void SpawnPortal() - { - SetData(DATA_PORTAL_LOCATION, (GetData(DATA_PORTAL_LOCATION) + urand(1, 5))%6); - if (Creature* sinclari = GetCreature(DATA_SINCLARI)) - if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocation[GetData(DATA_PORTAL_LOCATION)], TEMPSUMMON_CORPSE_DESPAWN)) - uiTeleportationPortal = portal->GetGUID(); - } - - void StartBossEncounter(uint8 uiBoss, bool bForceRespawn = true) - { - Creature* boss = nullptr; - - switch (uiBoss) - { - case BOSS_MORAGG: - HandleGameObject(GetObjectGuid(DATA_MORAGG_CELL), bForceRespawn); - boss = GetCreature(DATA_MORAGG); - if (boss) - boss->GetMotionMaster()->MovePoint(0, BossStartMove1); - break; - case BOSS_EREKEM: - HandleGameObject(GetObjectGuid(DATA_EREKEM_CELL), bForceRespawn); - HandleGameObject(GetObjectGuid(DATA_EREKEM_LEFT_GUARD_CELL), bForceRespawn); - HandleGameObject(GetObjectGuid(DATA_EREKEM_RIGHT_GUARD_CELL), bForceRespawn); - - boss = GetCreature(DATA_EREKEM); - if (boss) - boss->GetMotionMaster()->MovePoint(0, BossStartMove2); - - if (Creature* pGuard1 = instance->GetCreature(uiErekemGuard[0])) - { - if (bForceRespawn) - { - pGuard1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); - pGuard1->GetMotionMaster()->MovePoint(0, BossStartMove21); - } - else - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - } - - if (Creature* pGuard2 = instance->GetCreature(uiErekemGuard[1])) - { - if (bForceRespawn) - { - pGuard2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pGuard2->GetMotionMaster()->MovePoint(0, BossStartMove22); - } - else - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - } - break; - case BOSS_ICHORON: - HandleGameObject(GetObjectGuid(DATA_ICHORON_CELL), bForceRespawn); - boss = GetCreature(DATA_ICHORON); - if (boss) - boss->GetMotionMaster()->MovePoint(0, BossStartMove3); - break; - case BOSS_LAVANTHOR: - HandleGameObject(GetObjectGuid(DATA_LAVANTHOR_CELL), bForceRespawn); - boss = GetCreature(DATA_LAVANTHOR); - if (boss) - boss->GetMotionMaster()->MovePoint(0, BossStartMove4); - break; - case BOSS_XEVOZZ: - HandleGameObject(GetObjectGuid(DATA_XEVOZZ_CELL), bForceRespawn); - boss = GetCreature(DATA_XEVOZZ); - if (boss) - boss->GetMotionMaster()->MovePoint(0, BossStartMove5); - break; - case BOSS_ZURAMAT: - HandleGameObject(GetObjectGuid(DATA_ZURAMAT_CELL), bForceRespawn); - boss = GetCreature(DATA_ZURAMAT); - if (boss) - boss->GetMotionMaster()->MovePoint(0, BossStartMove6); - break; - } - - // generic boss state changes - if (boss) - { - boss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - boss->SetReactState(REACT_AGGRESSIVE); - - if (!bForceRespawn) + switch (creature->GetEntry()) { - if (boss->isDead()) - { - // respawn but avoid to be looted again - boss->Respawn(); - boss->RemoveLootMode(1); - } - else - boss->GetMotionMaster()->MoveTargetedHome(); - - boss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - uiWaveCount = 0; + case NPC_EREKEM_GUARD: + for (uint8 i = 0; i < ErekemGuardCount; ++i) + if (ErekemGuardGUIDs[i].IsEmpty()) + { + ErekemGuardGUIDs[i] = creature->GetGUID(); + break; + } + break; + default: + break; } } - } - void AddWave() - { - DoUpdateWorldState(WORLD_STATE_VH, 1); - DoUpdateWorldState(WORLD_STATE_VH_WAVE_COUNT, uiWaveCount); - - switch (uiWaveCount) + void OnCreatureRemove(Creature* creature) override { - case 6: - if (uiFirstBoss == 0) - uiFirstBoss = urand(1, 6); - if (Creature* sinclari = GetCreature(DATA_SINCLARI)) - { - if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) - uiSaboteurPortal = portal->GetGUID(); - if (Creature* azureSaboteur = sinclari->SummonCreature(NPC_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) - azureSaboteur->CastSpell(azureSaboteur, SABOTEUR_SHIELD_EFFECT, false); - } - break; - case 12: - if (uiSecondBoss == 0) - do - { - uiSecondBoss = urand(1, 6); - } while (uiSecondBoss == uiFirstBoss); - if (Creature* sinclari = GetCreature(DATA_SINCLARI)) - { - if (Creature* pPortal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) - uiSaboteurPortal = pPortal->GetGUID(); - if (Creature* pAzureSaboteur = sinclari->SummonCreature(NPC_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) - pAzureSaboteur->CastSpell(pAzureSaboteur, SABOTEUR_SHIELD_EFFECT, false); - } - break; - case 18: - if (Creature* sinclari = GetCreature(DATA_SINCLARI)) - sinclari->SummonCreature(NPC_CYANIGOSA, CyanigosasSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); - break; - case 1: + InstanceScript::OnCreatureRemove(creature); + + switch (creature->GetEntry()) { - if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) - mainDoor->SetGoState(GO_STATE_READY); - DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, 100); - // no break + case NPC_EREKEM_GUARD: + for (uint8 i = 0; i < ErekemGuardCount; ++i) + if (ErekemGuardGUIDs[i] == creature->GetGUID()) + { + ErekemGuardGUIDs[i].Clear(); + break; + } + break; + default: + break; } - default: - SpawnPortal(); - break; } - } - void WriteSaveDataMore(std::ostringstream& data) override - { - data << uiFirstBoss << ' ' << uiSecondBoss; - } - - void ReadSaveDataMore(std::istringstream& data) override - { - data >> uiFirstBoss; - data >> uiSecondBoss; - } - - bool CheckWipe() - { - Map::PlayerList const &players = instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + void OnGameObjectCreate(GameObject* go) override { - Player* player = itr->GetSource(); - if (player->IsGameMaster()) - continue; + InstanceScript::OnGameObjectCreate(go); - if (player->IsAlive()) + switch (go->GetEntry()) + { + case GO_ACTIVATION_CRYSTAL: + for (uint8 i = 0; i < ActivationCrystalCount; ++i) + if (ActivationCrystalGUIDs[i].IsEmpty()) + { + ActivationCrystalGUIDs[i] = go->GetGUID(); + break; + } + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) override + { + InstanceScript::OnGameObjectRemove(go); + + switch (go->GetEntry()) + { + case GO_ACTIVATION_CRYSTAL: + for (uint8 i = 0; i < ActivationCrystalCount; ++i) + if (ActivationCrystalGUIDs[i] == go->GetGUID()) + { + ActivationCrystalGUIDs[i].Clear(); + break; + } + break; + default: + break; + } + } + + void FillInitialWorldStates(WorldPacket& data) override + { + data << uint32(WORLD_STATE_VH_SHOW) << uint32(EventState == IN_PROGRESS ? 1 : 0); + data << uint32(WORLD_STATE_VH_PRISON_STATE) << uint32(DoorIntegrity); + data << uint32(WORLD_STATE_VH_WAVE_COUNT) << uint32(WaveCount); + } + + bool CheckRequiredBosses(uint32 bossId, Player const* player = nullptr) const override + { + if (_SkipCheckRequiredBosses(player)) + return true; + + switch (bossId) + { + case DATA_MORAGG: + case DATA_EREKEM: + case DATA_ICHORON: + case DATA_LAVANTHOR: + case DATA_XEVOZZ: + case DATA_ZURAMAT: + /// old code used cell door state to check this + if (!(WaveCount == 6 && FirstBossId == bossId) && !(WaveCount == 12 && SecondBossId == bossId)) + return false; + break; + case DATA_CYANIGOSA: + if (WaveCount < 18) + return false; + break; + default: + break; + } + + return true; + } + + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) return false; - } - zuramatDead = false; - return true; - } - - void Update(uint32 diff) override - { - if (!instance->HavePlayers()) - return; - - // portals should spawn if other portal is dead and doors are closed - if (bActive && uiMainEventPhase == IN_PROGRESS) - { - if (uiActivationTimer < diff) + switch (type) { - AddWave(); - bActive = false; - // 1 minute waiting time after each boss fight - uiActivationTimer = (uiWaveCount == 6 || uiWaveCount == 12) ? 60000 : 5000; - } else uiActivationTimer -= diff; + case DATA_1ST_BOSS: + if (state == DONE) + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_EREKEM, nullptr); + break; + case DATA_2ND_BOSS: + if (state == DONE) + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_MORAGG, nullptr); + break; + case DATA_CYANIGOSA: + if (state == DONE) + SetData(DATA_MAIN_EVENT_STATE, DONE); + break; + case DATA_MORAGG: + case DATA_EREKEM: + case DATA_ICHORON: + case DATA_LAVANTHOR: + case DATA_XEVOZZ: + case DATA_ZURAMAT: + // this won't work correctly because bossstate was initializd with TO_BE_DECIDED + if (WaveCount == 6) + SetBossState(DATA_1ST_BOSS, state); + else if (WaveCount == 12) + SetBossState(DATA_2ND_BOSS, state); + + if (state == DONE) + SetData(DATA_WAVE_COUNT, WaveCount + 1); + break; + default: + break; + } + + return true; } - // if main event is in progress and players have wiped then reset instance - if (uiMainEventPhase == IN_PROGRESS && CheckWipe()) + void SetData(uint32 type, uint32 data) override { - SetData(DATA_REMOVE_NPC, 1); - StartBossEncounter(uiFirstBoss, false); - StartBossEncounter(uiSecondBoss, false); + switch (type) + { + case DATA_WAVE_COUNT: + WaveCount = data; + if (WaveCount) + { + Scheduler.Schedule(Seconds(IsBossWave(WaveCount - 1) ? 45 : 5), [this](TaskContext /*task*/) + { + AddWave(); + }); + } + break; + case DATA_DOOR_INTEGRITY: + DoorIntegrity = data; + Defenseless = false; + DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, DoorIntegrity); + break; + case DATA_START_BOSS_ENCOUNTER: + switch (WaveCount) + { + case 6: + StartBossEncounter(FirstBossId); + break; + case 12: + StartBossEncounter(SecondBossId); + break; + } + break; + case DATA_MAIN_EVENT_STATE: + EventState = data; + if (data == IN_PROGRESS) // Start event + { + DoUpdateWorldState(WORLD_STATE_VH_WAVE_COUNT, WaveCount); + DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, DoorIntegrity); + DoUpdateWorldState(WORLD_STATE_VH_SHOW, 1); - SetData(DATA_MAIN_DOOR, GO_STATE_ACTIVE); - SetData(DATA_WAVE_COUNT, 0); - uiMainEventPhase = NOT_STARTED; - uiActivationTimer = 5000; + WaveCount = 1; + Scheduler.Async(std::bind(&instance_violet_hold_InstanceMapScript::AddWave, this)); - for (int i = 0; i < 4; ++i) - if (GameObject* crystal = instance->GetGameObject(uiActivationCrystal[i])) - crystal->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + for (uint8 i = 0; i < ActivationCrystalCount; ++i) + if (GameObject* crystal = instance->GetGameObject(ActivationCrystalGUIDs[i])) + crystal->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + else if (data == NOT_STARTED) + { + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) + { + mainDoor->SetGoState(GO_STATE_ACTIVE); + mainDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + } + DoUpdateWorldState(WORLD_STATE_VH_SHOW, 0); + DoUpdateWorldState(WORLD_STATE_VH_WAVE_COUNT, WaveCount); + DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, DoorIntegrity); + + for (uint8 i = 0; i < ActivationCrystalCount; ++i) + if (GameObject* crystal = instance->GetGameObject(ActivationCrystalGUIDs[i])) + crystal->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + else if (data == DONE) + { + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) + { + mainDoor->SetGoState(GO_STATE_ACTIVE); + mainDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + } + + DoUpdateWorldState(WORLD_STATE_VH_SHOW, 0); + + for (uint8 i = 0; i < ActivationCrystalCount; ++i) + if (GameObject* crystal = instance->GetGameObject(ActivationCrystalGUIDs[i])) + crystal->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + sinclari->AI()->DoAction(ACTION_SINCLARI_OUTRO); + } + break; + case DATA_HANDLE_CELLS: + HandleCells(data, false); + break; + } + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_1ST_BOSS: + return FirstBossId; + case DATA_2ND_BOSS: + return SecondBossId; + case DATA_MAIN_EVENT_STATE: + return EventState; + case DATA_WAVE_COUNT: + return WaveCount; + case DATA_DOOR_INTEGRITY: + return DoorIntegrity; + case DATA_DEFENSELESS: + return Defenseless ? 1 : 0; + default: + break; + } + + return 0; + } + + ObjectGuid GetGuidData(uint32 type) const override + { + switch (type) + { + case DATA_EREKEM_GUARD_1: + case DATA_EREKEM_GUARD_2: + return ErekemGuardGUIDs[type - DATA_EREKEM_GUARD_1]; + default: + break; + } + + return InstanceScript::GetGuidData(type); + } + + void SpawnPortal() + { + LastPortalLocation = (LastPortalLocation + urand(1, EncouterPortalsCount - 1)) % (EncouterPortalsCount); if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - sinclari->SetVisible(true); - - std::list GuardList; - sinclari->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); - if (!GuardList.empty()) + if (LastPortalLocation < PortalPositionsSize) { - for (Creature* guard : GuardList) + if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalPositions[LastPortalLocation], TEMPSUMMON_CORPSE_DESPAWN)) + portal->AI()->SetData(DATA_PORTAL_LOCATION, LastPortalLocation); + } + else + { + if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL_ELITE, PortalElitePositions[LastPortalLocation - PortalPositionsSize], TEMPSUMMON_CORPSE_DESPAWN)) + portal->AI()->SetData(DATA_PORTAL_LOCATION, LastPortalLocation); + } + } + } + + void HandleCells(uint8 bossId, bool open = true) + { + switch (bossId) + { + case DATA_MORAGG: + HandleGameObject(GetObjectGuid(DATA_MORAGG_CELL), open); + break; + case DATA_EREKEM: + HandleGameObject(GetObjectGuid(DATA_EREKEM_CELL), open); + HandleGameObject(GetObjectGuid(DATA_EREKEM_LEFT_GUARD_CELL), open); + HandleGameObject(GetObjectGuid(DATA_EREKEM_RIGHT_GUARD_CELL), open); + break; + case DATA_ICHORON: + HandleGameObject(GetObjectGuid(DATA_ICHORON_CELL), open); + break; + case DATA_LAVANTHOR: + HandleGameObject(GetObjectGuid(DATA_LAVANTHOR_CELL), open); + break; + case DATA_XEVOZZ: + HandleGameObject(GetObjectGuid(DATA_XEVOZZ_CELL), open); + break; + case DATA_ZURAMAT: + HandleGameObject(GetObjectGuid(DATA_ZURAMAT_CELL), open); + break; + default: + break; + } + } + + void StartBossEncounter(uint8 bossId) + { + switch (bossId) + { + case DATA_MORAGG: + Scheduler.Schedule(Seconds(2), [this](TaskContext task) { - guard->SetVisible(true); - guard->SetReactState(REACT_AGGRESSIVE); - guard->GetMotionMaster()->MovePoint(1, guard->GetHomePosition()); + if (Creature* moragg = GetCreature(DATA_MORAGG)) + { + moragg->PlayDirectSound(SOUND_MORAGG_SPAWN); + moragg->CastSpell(moragg, SPELL_MORAGG_EMOTE_ROAR); + } + + task.Schedule(Seconds(3), [this](TaskContext task) + { + if (Creature* moragg = GetCreature(DATA_MORAGG)) + moragg->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, MoraggPath, MoraggPathSize, true); + + task.Schedule(Seconds(8), [this](TaskContext /*task*/) + { + if (Creature* moragg = GetCreature(DATA_MORAGG)) + { + moragg->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + moragg->AI()->DoZoneInCombat(moragg, 200.0f); + } + }); + }); + }); + break; + case DATA_EREKEM: + Scheduler.Schedule(Seconds(3), [this](TaskContext task) + { + if (Creature* erekem = GetCreature(DATA_EREKEM)) + erekem->AI()->Talk(SAY_EREKEM_SPAWN); + + task.Schedule(Seconds(5), [this](TaskContext task) + { + if (Creature* erekem = GetCreature(DATA_EREKEM)) + erekem->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, ErekemPath, ErekemPathSize, true); + + if (Creature* guard = instance->GetCreature(GetGuidData(DATA_EREKEM_GUARD_1))) + guard->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, ErekemGuardLeftPath, ErekemGuardLeftPathSize, true); + if (Creature* guard = instance->GetCreature(GetGuidData(DATA_EREKEM_GUARD_2))) + guard->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, ErekemGuardRightPath, ErekemGuardRightPathSize, true); + + task.Schedule(Seconds(6), [this](TaskContext task) + { + if (Creature* erekem = GetCreature(DATA_EREKEM)) + erekem->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + + task.Schedule(Seconds(1), [this](TaskContext /*task*/) + { + for (uint32 i = DATA_EREKEM_GUARD_1; i <= DATA_EREKEM_GUARD_2; ++i) + { + if (Creature* guard = instance->GetCreature(GetGuidData(i))) + guard->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + + if (Creature* erekem = GetCreature(DATA_EREKEM)) + { + erekem->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + erekem->AI()->DoZoneInCombat(erekem, 200.0f); + } + }); + }); + }); + }); + break; + case DATA_ICHORON: + Scheduler.Schedule(Seconds(2), [this](TaskContext task) + { + if (Creature* ichoron = GetCreature(DATA_ICHORON)) + ichoron->AI()->Talk(SAY_ICHORON_SPAWN); + + task.Schedule(Seconds(3), [this](TaskContext task) + { + if (Creature* ichoron = GetCreature(DATA_ICHORON)) + ichoron->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, IchoronPath, IchoronPathSize, true); + + task.Schedule(Seconds(14), [this](TaskContext /*task*/) + { + if (Creature* ichoron = GetCreature(DATA_ICHORON)) + { + ichoron->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + ichoron->AI()->DoZoneInCombat(ichoron, 200.0f); + } + }); + }); + }); + break; + case DATA_LAVANTHOR: + Scheduler.Schedule(Seconds(1), [this](TaskContext task) + { + if (Creature* lavanthor = GetCreature(DATA_LAVANTHOR)) + lavanthor->CastSpell(lavanthor, SPELL_LAVANTHOR_SPECIAL_UNARMED); + + task.Schedule(Seconds(3), [this](TaskContext task) + { + if (Creature* lavanthor = GetCreature(DATA_LAVANTHOR)) + lavanthor->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, LavanthorPath, LavanthorPathSize, true); + + task.Schedule(Seconds(8), [this](TaskContext /*task*/) + { + if (Creature* lavanthor = GetCreature(DATA_LAVANTHOR)) + { + lavanthor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + lavanthor->AI()->DoZoneInCombat(lavanthor, 200.0f); + } + }); + }); + }); + break; + case DATA_XEVOZZ: + Scheduler.Schedule(Seconds(2), [this](TaskContext task) + { + if (Creature* xevozz = GetCreature(DATA_XEVOZZ)) + xevozz->AI()->Talk(SAY_XEVOZZ_SPAWN); + + task.Schedule(Seconds(3), [this](TaskContext task) + { + if (Creature* xevozz = GetCreature(DATA_XEVOZZ)) + xevozz->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); + + task.Schedule(Seconds(4), [this](TaskContext task) + { + if (Creature* xevozz = GetCreature(DATA_XEVOZZ)) + xevozz->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, XevozzPath, XevozzPathSize, true); + + task.Schedule(Seconds(4), [this](TaskContext /*task*/) + { + if (Creature* xevozz = GetCreature(DATA_XEVOZZ)) + { + xevozz->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + xevozz->AI()->DoZoneInCombat(xevozz, 200.0f); + } + }); + }); + }); + }); + break; + case DATA_ZURAMAT: + Scheduler.Schedule(Seconds(2), [this](TaskContext task) + { + if (Creature* zuramat = GetCreature(DATA_ZURAMAT)) + { + zuramat->CastSpell(zuramat, SPELL_ZURAMAT_COSMETIC_CHANNEL_OMNI); + zuramat->AI()->Talk(SAY_ZURAMAT_SPAWN); + } + + task.Schedule(Seconds(6), [this](TaskContext task) + { + if (Creature* zuramat = GetCreature(DATA_ZURAMAT)) + zuramat->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, ZuramatPath, ZuramatPathSize, true); + + task.Schedule(Seconds(4), [this](TaskContext /*task*/) + { + if (Creature* zuramat = GetCreature(DATA_ZURAMAT)) + { + zuramat->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + zuramat->AI()->DoZoneInCombat(zuramat, 200.0f); + } + }); + }); + }); + break; + default: + return; + } + + HandleCells(bossId); + } + + void ResetBossEncounter(uint8 bossId) + { + if (bossId < DATA_CYANIGOSA || bossId > DATA_ZURAMAT) + return; + + Creature* boss = GetCreature(bossId); + if (!boss) + return; + + switch (bossId) + { + case DATA_CYANIGOSA: + boss->DespawnOrUnsummon(); + break; + case DATA_EREKEM: + for (uint32 i = DATA_EREKEM_GUARD_1; i <= DATA_EREKEM_GUARD_2; ++i) + { + if (Creature* guard = instance->GetCreature(GetGuidData(i))) + { + if (guard->isDead()) + guard->Respawn(); + + if (GetBossState(bossId) == DONE) + UpdateKilledBoss(guard); + + guard->GetMotionMaster()->MoveTargetedHome(); + guard->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } } - } - sinclari->GetMotionMaster()->MovePoint(1, sinclari->GetHomePosition()); - sinclari->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + // no break + default: + if (boss->isDead()) + { + // respawn and update to a placeholder npc to avoid be looted again + boss->Respawn(); + UpdateKilledBoss(boss); + } + + boss->GetMotionMaster()->MoveTargetedHome(); + boss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + break; } } - // Cyanigosa is spawned but not tranformed, prefight event - Creature* cyanigosa = GetCreature(DATA_CYANIGOSA); - if (cyanigosa && !cyanigosa->HasAura(CYANIGOSA_SPELL_TRANSFORM)) + void AddWave() { - if (uiCyanigosaEventTimer <= diff) + DoUpdateWorldState(WORLD_STATE_VH_WAVE_COUNT, WaveCount); + + switch (WaveCount) { - switch (uiCyanigosaEventPhase) + case 6: + if (FirstBossId == 0) + FirstBossId = urand(DATA_MORAGG, DATA_ZURAMAT); + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + { + sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL_INTRO, PortalIntroPositions[3], TEMPSUMMON_TIMED_DESPAWN, 3000); + sinclari->SummonCreature(NPC_SABOTEOUR, SaboteurSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); + } + break; + case 12: + if (SecondBossId == 0) + do + { + SecondBossId = urand(DATA_MORAGG, DATA_ZURAMAT); + } while (SecondBossId == FirstBossId); + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + { + sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL_INTRO, PortalIntroPositions[3], TEMPSUMMON_TIMED_DESPAWN, 3000); + sinclari->SummonCreature(NPC_SABOTEOUR, SaboteurSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); + } + break; + case 18: + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + { + sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL_INTRO, PortalIntroPositions[4], TEMPSUMMON_TIMED_DESPAWN, 6000); + if (Creature* cyanigosa = sinclari->SummonCreature(NPC_CYANIGOSA, CyanigosaSpawnLocation, TEMPSUMMON_DEAD_DESPAWN)) + cyanigosa->CastSpell(cyanigosa, SPELL_CYANIGOSA_ARCANE_POWER_STATE, true); + ScheduleCyanigosaIntro(); + } + break; + default: + SpawnPortal(); + break; + } + } + + void WriteSaveDataMore(std::ostringstream& data) override + { + data << FirstBossId << ' ' << SecondBossId; + } + + void ReadSaveDataMore(std::istringstream& data) override + { + data >> FirstBossId; + data >> SecondBossId; + } + + bool CheckWipe() const + { + Map::PlayerList const& players = instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + Player* player = itr->GetSource(); + if (player->IsGameMaster()) + continue; + + if (player->IsAlive()) + return false; + } + + return true; + } + + void UpdateKilledBoss(Creature* boss) + { + switch (boss->GetEntry()) + { + case NPC_XEVOZZ: + boss->UpdateEntry(NPC_DUMMY_XEVOZZ); + break; + case NPC_LAVANTHOR: + boss->UpdateEntry(NPC_DUMMY_LAVANTHOR); + break; + case NPC_ICHORON: + boss->UpdateEntry(NPC_DUMMY_ICHORON); + break; + case NPC_ZURAMAT: + boss->UpdateEntry(NPC_DUMMY_ZURAMAT); + break; + case NPC_EREKEM: + boss->UpdateEntry(NPC_DUMMY_EREKEM); + break; + case NPC_MORAGG: + boss->UpdateEntry(NPC_DUMMY_MORAGG); + break; + case NPC_EREKEM_GUARD: + boss->UpdateEntry(NPC_DUMMY_EREKEM_GUARD); + break; + default: + break; + } + } + + void Update(uint32 diff) override + { + if (!instance->HavePlayers()) + return; + + // if main event is in progress and players have wiped then reset instance + if ((EventState == IN_PROGRESS && CheckWipe()) || EventState == FAIL) + { + ResetBossEncounter(FirstBossId); + ResetBossEncounter(SecondBossId); + ResetBossEncounter(DATA_CYANIGOSA); + + WaveCount = 0; + DoorIntegrity = 100; + Defenseless = true; + SetData(DATA_MAIN_EVENT_STATE, NOT_STARTED); + + Scheduler.CancelAll(); + + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + sinclari->AI()->EnterEvadeMode(); + } + + Scheduler.Update(diff); + + if (EventState == IN_PROGRESS) + { + // if door is destroyed, event is failed + if (!GetData(DATA_DOOR_INTEGRITY)) + EventState = FAIL; + } + } + + void ScheduleCyanigosaIntro() + { + Scheduler.Schedule(Seconds(2), [this](TaskContext task) + { + if (Creature* cyanigosa = GetCreature(DATA_CYANIGOSA)) + cyanigosa->AI()->Talk(SAY_CYANIGOSA_SPAWN); + + task.Schedule(Seconds(6), [this](TaskContext task) { - case 1: - cyanigosa->CastSpell(cyanigosa, CYANIGOSA_BLUE_AURA, false); - cyanigosa->AI()->Talk(CYANIGOSA_SAY_SPAWN); - uiCyanigosaEventTimer = 7*IN_MILLISECONDS; - ++uiCyanigosaEventPhase; - break; - case 2: - cyanigosa->GetMotionMaster()->MoveJump(MiddleRoomLocation.GetPositionX(), MiddleRoomLocation.GetPositionY(), MiddleRoomLocation.GetPositionZ(), 10.0f, 20.0f); - cyanigosa->CastSpell(cyanigosa, CYANIGOSA_BLUE_AURA, false); - uiCyanigosaEventTimer = 7*IN_MILLISECONDS; - ++uiCyanigosaEventPhase; - break; - case 3: - cyanigosa->RemoveAurasDueToSpell(CYANIGOSA_BLUE_AURA); - cyanigosa->CastSpell(cyanigosa, CYANIGOSA_SPELL_TRANSFORM, 0); - cyanigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - cyanigosa->SetReactState(REACT_AGGRESSIVE); - uiCyanigosaEventTimer = 2*IN_MILLISECONDS; - ++uiCyanigosaEventPhase; - break; - case 4: - uiCyanigosaEventPhase = 0; - break; - } - } else uiCyanigosaEventTimer -= diff; + if (Creature* cyanigosa = GetCreature(DATA_CYANIGOSA)) + cyanigosa->GetMotionMaster()->MoveJump(CyanigosaJumpLocation, 10.0f, 27.44744f); + + task.Schedule(Seconds(7), [this](TaskContext /*task*/) + { + if (Creature* cyanigosa = GetCreature(DATA_CYANIGOSA)) + { + cyanigosa->RemoveAurasDueToSpell(SPELL_CYANIGOSA_ARCANE_POWER_STATE); + cyanigosa->CastSpell(cyanigosa, SPELL_CYANIGOSA_TRANSFORM, true); + cyanigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + } + }); + }); + }); } - // if there are NPCs in front of the prison door, which are casting the door seal spell and doors are active - if (GetData(DATA_NPC_PRESENCE_AT_DOOR) && uiMainEventPhase == IN_PROGRESS) + void ProcessEvent(WorldObject* /*go*/, uint32 eventId) override { - // if door integrity is > 0 then decrase it's integrity state - if (GetData(DATA_DOOR_INTEGRITY)) + if (eventId == EVENT_ACTIVATE_CRYSTAL) { - if (uiDoorSpellTimer < diff) - { - SetData(DATA_DOOR_INTEGRITY, GetData(DATA_DOOR_INTEGRITY)-1); - uiDoorSpellTimer =2000; - } else uiDoorSpellTimer -= diff; - } - // else set door state to active (means door will open and group have failed to sustain mob invasion on the door) - else - { - SetData(DATA_MAIN_DOOR, GO_STATE_ACTIVE); - uiMainEventPhase = FAIL; + instance->SummonCreature(NPC_DEFENSE_SYSTEM, DefenseSystemLocation); + Defenseless = false; } } - } - void ActivateCrystal() - { - // just to make things easier we'll get the gameobject from the map - GameObject* invoker = instance->GetGameObject(uiActivationCrystal[0]); - if (!invoker) - return; - - SpellInfo const* spellInfoLightning = sSpellMgr->GetSpellInfo(SPELL_ARCANE_LIGHTNING); - if (!spellInfoLightning) - return; - - // the orb - TempSummon* trigger = invoker->SummonCreature(NPC_DEFENSE_SYSTEM, ArcaneSphere, TEMPSUMMON_MANUAL_DESPAWN, 0); - if (!trigger) - return; - - // visuals - trigger->CastSpell(trigger, spellInfoLightning, true, 0, 0, trigger->GetGUID()); - - // Kill all mobs registered with SetGuidData(ADD_TRASH_MOB) - for (GuidSet::const_iterator itr = trashMobs.begin(); itr != trashMobs.end();) + static bool IsBossWave(uint8 wave) { - Creature* creature = instance->GetCreature(*itr); - // Increment the iterator before killing the creature because the kill will remove itr from trashMobs - ++itr; - if (creature && creature->IsAlive()) - trigger->Kill(creature); + return wave && ((wave % 6) == 0); } - } - void ProcessEvent(WorldObject* /*go*/, uint32 uiEventId) override + protected: + TaskScheduler Scheduler; + + static uint8 const ErekemGuardCount = 2; + ObjectGuid ErekemGuardGUIDs[ErekemGuardCount]; + + static uint8 const ActivationCrystalCount = 5; + ObjectGuid ActivationCrystalGUIDs[ActivationCrystalCount]; + + uint32 FirstBossId; + uint32 SecondBossId; + + uint8 DoorIntegrity; + uint8 WaveCount; + uint8 EventState; + uint8 LastPortalLocation; + + bool Defenseless; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override { - switch (uiEventId) - { - case EVENT_ACTIVATE_CRYSTAL: - bCrystalActivated = true; // Activation by player's will throw event signal - ActivateCrystal(); - break; - } + return new instance_violet_hold_InstanceMapScript(map); } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_violet_hold_InstanceMapScript(map); - } }; void AddSC_instance_violet_hold() diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index b05da4b994c..fdb4c4dc3fc 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -15,36 +15,41 @@ * with this program. If not, see . */ +#include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" -#include "violet_hold.h" -#include "Player.h" -#include "SpellAuras.h" #include "SpellAuraEffects.h" #include "SpellScript.h" +#include "violet_hold.h" -#define GOSSIP_START_EVENT "Get your people to safety, we'll keep the Blue Dragonflight's forces at bay." -#define GOSSIP_ITEM_1 "Activate the crystals when we get in trouble, right" -#define GOSSIP_I_WANT_IN "I'm not fighting, so send me in now!" -#define SAY_EVENT_LOCK "I'm locking the door. Good luck, and thank you for doing this." -#define SPAWN_TIME 20000 +/* + * TODO: + * - add missing trash emotes + */ -enum PortalCreatures +enum PortalCreatureIds { NPC_AZURE_INVADER_1 = 30661, - NPC_AZURE_INVADER_2 = 30961, NPC_AZURE_SPELLBREAKER_1 = 30662, - NPC_AZURE_SPELLBREAKER_2 = 30962, NPC_AZURE_BINDER_1 = 30663, - NPC_AZURE_BINDER_2 = 30918, NPC_AZURE_MAGE_SLAYER_1 = 30664, + NPC_VETERAN_MAGE_HUNTER = 30665, + NPC_AZURE_CAPTAIN_1 = 30666, + NPC_AZURE_SORCEROR_1 = 30667, + NPC_AZURE_RAIDER_1 = 30668, + + NPC_AZURE_BINDER_2 = 30918, + NPC_AZURE_INVADER_2 = 30961, + NPC_AZURE_SPELLBREAKER_2 = 30962, NPC_AZURE_MAGE_SLAYER_2 = 30963, - NPC_AZURE_CAPTAIN = 30666, - NPC_AZURE_SORCEROR = 30667, - NPC_AZURE_RAIDER = 30668, - NPC_AZURE_STALKER = 32191 + NPC_AZURE_BINDER_3 = 31007, + NPC_AZURE_INVADER_3 = 31008, + NPC_AZURE_SPELLBREAKER_3 = 31009, + NPC_AZURE_MAGE_SLAYER_3 = 31010, + NPC_AZURE_RAIDER_2 = 31118, + NPC_AZURE_STALKER_1 = 32191 }; enum AzureInvaderSpells @@ -103,8 +108,8 @@ enum AzureStalkerSpells enum AzureSaboteurSpells { - SABOTEUR_SHIELD_DISRUPTION = 58291, - SABOTEUR_SHIELD_EFFECT = 45775 + SPELL_SHIELD_DISRUPTION = 58291, + SPELL_TELEPORT_VISUAL = 51347 }; enum TrashDoorSpell @@ -112,19 +117,45 @@ enum TrashDoorSpell SPELL_DESTROY_DOOR_SEAL = 58040 }; -enum Spells +enum DefenseSystemSpells { - SPELL_PORTAL_CHANNEL = 58012, - SPELL_CRYSTAL_ACTIVATION = 57804, // visual effect - SPELL_ARCANE_SPHERE_PASSIVE = 44263 + SPELL_ARCANE_LIGHTNING_DAMAGE = 57912, + SPELL_ARCANE_LIGHTNING_INSTAKILL = 58152, + SPELL_ARCANE_LIGHTNING_DUMMY = 57930 +}; + +enum MiscSpells +{ + SPELL_PORTAL_PERIODIC = 58008, + SPELL_PORTAL_CHANNEL = 58012, + SPELL_CRYSTAL_ACTIVATION = 57804, + + SPELL_TELEPORT_PLAYER = 62138, + SPELL_TELEPORT_PLAYER_EFFECT = 62139 +}; + +enum MiscData +{ + DATA_PORTAL_PERIODIC_TICK = 1 }; enum Sinclari { - SAY_SINCLARI_1 = 0 + // Sinclari + SAY_SINCLARI_INTRO_1 = 0, + SAY_SINCLARI_INTRO_2 = 1, + SAY_SINCLARI_OUTRO = 2, + + GOSSIP_MENU_START_ENCOUNTER = 9998, + GOSSIP_MENU_SEND_ME_IN = 10275, + + // Sinclari Trigger + SAY_SINCLARI_ELITE_SQUAD = 0, + SAY_SINCLARI_PORTAL_GUARDIAN = 1, + SAY_SINCLARI_PORTAL_KEEPER = 2 }; -float FirstPortalWPs [6][3] = +G3D::Vector3 const FirstPortalWPs[6] = { {1877.670288f, 842.280273f, 43.333591f}, {1877.338867f, 834.615356f, 38.762287f}, @@ -135,7 +166,7 @@ float FirstPortalWPs [6][3] = //{1825.736084f, 807.305847f, 44.363785f} }; -float SecondPortalFirstWPs [9][3] = +G3D::Vector3 const SecondPortalFirstWPs[9] = { {1902.561401f, 853.334656f, 47.106117f}, {1895.486084f, 855.376404f, 44.334591f}, @@ -149,7 +180,7 @@ float SecondPortalFirstWPs [9][3] = //{1825.736084f, 807.305847f, 44.363785f} }; -float SecondPortalSecondWPs [8][3] = +G3D::Vector3 const SecondPortalSecondWPs[8] = { {1929.392212f, 837.614990f, 47.136166f}, {1928.290649f, 824.750427f, 45.474411f}, @@ -162,7 +193,7 @@ float SecondPortalSecondWPs [8][3] = //{1825.736084f, 807.305847f, 44.363785f} }; -float ThirdPortalWPs [8][3] = +G3D::Vector3 const ThirdPortalWPs[8] = { {1934.049438f, 815.778503f, 52.408699f}, {1928.290649f, 824.750427f, 45.474411f}, @@ -175,7 +206,7 @@ float ThirdPortalWPs [8][3] = //{1825.736084f, 807.305847f, 44.363785f} }; -float FourthPortalWPs [9][3] = +G3D::Vector3 const FourthPortalWPs[9] = { {1921.658447f, 761.657043f, 50.866741f}, {1910.559814f, 755.780457f, 47.701447f}, @@ -189,7 +220,7 @@ float FourthPortalWPs [9][3] = //{1827.100342f, 801.605957f, 44.363358f} }; -float FifthPortalWPs [6][3] = +G3D::Vector3 const FifthPortalWPs[6] = { {1887.398804f, 763.633240f, 47.666851f}, {1879.020386f, 775.396973f, 38.705990f}, @@ -200,7 +231,7 @@ float FifthPortalWPs [6][3] = //{1827.100342f, 801.605957f, 44.363358f} }; -float SixthPoralWPs [4][3] = +G3D::Vector3 const SixthPoralWPs[4] = { {1888.861084f, 805.074768f, 38.375790f}, {1869.793823f, 804.135804f, 38.647018f}, @@ -209,1308 +240,1188 @@ float SixthPoralWPs [4][3] = //{1826.889648f, 803.929993f, 44.363239f} }; -const float SaboteurFinalPos1[3][3] = +G3D::Vector3 const DefaultPortalWPs[1] = { - {1892.502319f, 777.410767f, 38.630402f}, - {1891.165161f, 762.969421f, 47.666920f}, - {1893.168091f, 740.919189f, 47.666920f} -}; -const float SaboteurFinalPos2[3][3] = -{ - {1882.242676f, 834.818726f, 38.646786f}, - {1879.220825f, 842.224854f, 43.333641f}, - {1873.842896f, 863.892456f, 43.333641f} -}; -const float SaboteurFinalPos3[2][3] = -{ - {1904.298340f, 792.400391f, 38.646782f}, - {1935.716919f, 758.437073f, 30.627895f} -}; -const float SaboteurFinalPos4[3] = -{ - 1855.006104f, 760.641724f, 38.655266f -}; -const float SaboteurFinalPos5[3] = -{ - 1906.667358f, 841.705566f, 38.637894f -}; -const float SaboteurFinalPos6[5][3] = -{ - {1911.437012f, 821.289246f, 38.684128f}, - {1920.734009f, 822.978027f, 41.525414f}, - {1928.262939f, 830.836609f, 44.668266f}, - {1929.338989f, 837.593933f, 47.137596f}, - {1931.063354f, 848.468445f, 47.190434f} - }; - -const Position PortalLocation[] = -{ - { 1877.51f, 850.104f, 44.6599f, 4.7822f }, // WP 1 - { 1936.07f, 803.198f, 53.3749f, 3.12414f }, // WP 3 - { 1890.64f, 753.471f, 48.7224f, 1.71042f }, // WP 5 + { 1843.567017f, 804.288208f, 44.139091f } }; -#define MAX_PRE_EVENT_PORTAL 3 +uint32 const SaboteurMoraggPathSize = 5; +G3D::Vector3 const SaboteurMoraggPath[SaboteurMoraggPathSize] = // sniff +{ + { 1886.251f, 803.0743f, 38.42326f }, + { 1885.71f, 799.8929f, 38.37241f }, + { 1889.505f, 762.3288f, 47.66684f }, + { 1894.542f, 742.1829f, 47.66684f }, + { 1894.603f, 739.9231f, 47.66684f }, +}; -ObjectGuid preEventPortalGUID[MAX_PRE_EVENT_PORTAL] = { ObjectGuid::Empty }; +uint32 const SaboteurErekemPathSize = 5; +G3D::Vector3 const SaboteurErekemPath[SaboteurErekemPathSize] = // sniff +{ + { 1886.251f, 803.0743f, 38.42326f }, + { 1881.047f, 829.6866f, 38.64856f }, + { 1877.585f, 844.6685f, 38.49014f }, + { 1876.085f, 851.6685f, 42.99014f }, + { 1873.747f, 864.1373f, 43.33349f } +}; -const Position MovePosition = { 1806.955566f, 803.851807f, 44.363323f, 0.0f }; -const Position playerTeleportPosition = { 1830.531006f, 803.939758f, 44.340508f, 6.281611f }; -const Position sinclariOutsidePosition = { 1820.429810f, 804.066040f, 44.363998f, 0.0f }; -const Position sinclariCrystalPosition = { 1828.868286f, 798.468811f, 44.363998f, 3.890467f }; +uint32 const SaboteurIchoronPathSize = 3; +G3D::Vector3 const SaboteurIchoronPath[SaboteurIchoronPathSize] = // sniff +{ + { 1886.251f, 803.0743f, 38.42326f }, + { 1888.672f, 801.2348f, 38.42305f }, + { 1901.987f, 793.3254f, 38.65126f } +}; + +uint32 const SaboteurLavanthorPathSize = 3; +G3D::Vector3 const SaboteurLavanthorPath[SaboteurLavanthorPathSize] = // sniff +{ + { 1886.251f, 803.0743f, 38.42326f }, + { 1867.925f, 778.8035f, 38.64702f }, + { 1853.304f, 759.0161f, 38.65761f } +}; + +uint32 const SaboteurXevozzPathSize = 4; +G3D::Vector3 const SaboteurXevozzPath[SaboteurXevozzPathSize] = // sniff +{ + { 1886.251f, 803.0743f, 38.42326f }, + { 1889.096f, 810.0487f, 38.43871f }, + { 1896.547f, 823.5473f, 38.72863f }, + { 1906.666f, 842.3111f, 38.63351f } +}; + +uint32 const SaboteurZuramatPathSize = 7; +G3D::Vector3 const SaboteurZuramatPath[SaboteurZuramatPathSize] = // sniff +{ + { 1886.251f, 803.0743f, 38.42326f }, + { 1889.69f, 807.0032f, 38.39914f }, + { 1906.91f, 818.2574f, 38.86596f }, + { 1929.03f, 824.2713f, 46.09165f }, + { 1928.441f, 842.8891f, 47.15078f }, + { 1927.454f, 851.6091f, 47.19094f }, + { 1927.947f, 852.2986f, 47.19637f } +}; + +Position const SinclariPositions[] = // sniff +{ + { 1829.142f, 798.219f, 44.36212f, 0.122173f }, // 0 - Crystal + { 1820.12f, 803.916f, 44.36466f, 0.0f }, // 1 - Outside + { 1816.185f, 804.0629f, 44.44799f, 3.176499f }, // 2 - Second Spawn Point + { 1827.886f, 804.0555f, 44.36467f, 0.0f } // 3 - Outro +}; + +Position const GuardsMovePosition = { 1802.099f, 803.7724f, 44.36466f, 0.0f }; // sniff class npc_sinclari_vh : public CreatureScript { -public: - npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { } + public: + npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) + bool OnGossipHello(Player* player, Creature* creature) override { - case GOSSIP_ACTION_INFO_DEF+1: - player->CLOSE_GOSSIP_MENU(); - ENSURE_AI(npc_sinclari_vh::npc_sinclariAI, creature->AI())->uiPhase = 1; - if (InstanceScript* instance = creature->GetInstanceScript()) - instance->SetData(DATA_MAIN_EVENT_PHASE, SPECIAL); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->SEND_GOSSIP_MENU(13854, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->NearTeleportTo(playerTeleportPosition.GetPositionX(), playerTeleportPosition.GetPositionY(), playerTeleportPosition.GetPositionZ(), playerTeleportPosition.GetOrientation(), true); - player->CLOSE_GOSSIP_MENU(); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(DATA_MAIN_EVENT_PHASE)) + // override default gossip + if (InstanceScript* instance = creature->GetInstanceScript()) { - case NOT_STARTED: - case FAIL: // Allow to start event if not started or wiped - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(13853, creature->GetGUID()); - break; - case IN_PROGRESS: // Allow to teleport inside if event is in progress - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_I_WANT_IN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->SEND_GOSSIP_MENU(13853, creature->GetGUID()); - break; - default: - player->SEND_GOSSIP_MENU(13910, creature->GetGUID()); - } - } - return true; - } - - struct npc_sinclariAI : public ScriptedAI - { - npc_sinclariAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - uiPhase = 0; - uiTimer = 0; - } - - InstanceScript* instance; - - uint8 uiPhase; - uint32 uiTimer; - - void Reset() override - { - Initialize(); - - me->SetReactState(REACT_AGGRESSIVE); - for (uint8 i = 0; i < MAX_PRE_EVENT_PORTAL; i++) - if (TempSummon* summon = me->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocation[i], TEMPSUMMON_MANUAL_DESPAWN)) - preEventPortalGUID[i] = summon->GetGUID(); - - std::list GuardList; - me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); - if (!GuardList.empty()) - { - for (std::list::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + switch (instance->GetData(DATA_MAIN_EVENT_STATE)) { - if (Creature* pGuard = *itr) - { - pGuard->DisappearAndDie(); - pGuard->Respawn(); - pGuard->SetVisible(true); - pGuard->SetReactState(REACT_AGGRESSIVE); - } + case IN_PROGRESS: + player->PrepareGossipMenu(creature, GOSSIP_MENU_SEND_ME_IN, true); + player->SendPreparedGossip(creature); + return true; + case DONE: + return true; // NYI + case NOT_STARTED: + case FAIL: + default: + break; } } + + // load default gossip + return false; } - void UpdateAI(uint32 uiDiff) override + struct npc_sinclariAI : public ScriptedAI { - if (uiPhase) + npc_sinclariAI(Creature* creature) : ScriptedAI(creature), _summons(creature) { - if (uiTimer <= uiDiff) + _instance = creature->GetInstanceScript(); + } + + void Reset() override + { + _summons.DespawnAll(); + for (uint8 i = 0; i < PortalIntroCount; ++i) + if (Creature* summon = me->SummonCreature(NPC_TELEPORTATION_PORTAL_INTRO, PortalIntroPositions[i], TEMPSUMMON_MANUAL_DESPAWN)) + summon->AI()->SetData(DATA_PORTAL_LOCATION, i); + + me->SetVisible(true); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + + std::list guardList; + me->GetCreatureListWithEntryInGrid(guardList, NPC_VIOLET_HOLD_GUARD, 100.0f); + for (Creature* guard : guardList) { - switch (uiPhase) + guard->Respawn(true); + guard->SetVisible(true); + guard->SetReactState(REACT_AGGRESSIVE); + guard->AI()->EnterEvadeMode(); + } + } + + void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0) + { + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + _instance->SetData(DATA_MAIN_EVENT_STATE, SPECIAL); + ScheduleIntro(); + player->PlayerTalkClass->SendCloseGossip(); + } + else if (menuId == GOSSIP_MENU_SEND_ME_IN && gossipListId == 0) + { + me->CastSpell(player, SPELL_TELEPORT_PLAYER, true); + player->PlayerTalkClass->SendCloseGossip(); + } + } + + void DoAction(int32 actionId) override + { + if (actionId == ACTION_SINCLARI_OUTRO) + { + me->SetVisible(true); + ScheduleOutro(); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + + void ScheduleIntro() + { + _scheduler.Schedule(Seconds(1), [this](TaskContext task) + { + switch (task.GetRepeatCounter()) { - case 1: + case 0: me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, sinclariCrystalPosition); - uiTimer = 1000; - uiPhase = 6; + me->GetMotionMaster()->MovePoint(0, SinclariPositions[0]); + task.Repeat(Seconds(1)); + break; + case 1: + me->HandleEmoteCommand(EMOTE_ONESHOT_USE_STANDING); + me->GetMap()->SummonCreature(NPC_DEFENSE_SYSTEM, DefenseSystemLocation); + task.Repeat(Seconds(3)); break; case 2: - { - me->SetFacingTo(me->GetOrientation() - 3.14f); - Talk(SAY_SINCLARI_1); - uiTimer = 1500; - uiPhase = 7; - break; - } - case 3: - { - std::list GuardList; - me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); - if (!GuardList.empty()) - for (std::list::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + me->SetFacingTo(SinclariPositions[0].GetOrientation()); + Talk(SAY_SINCLARI_INTRO_1); + + task.Schedule(Seconds(1), [this](TaskContext /*task*/) + { + std::list guardList; + me->GetCreatureListWithEntryInGrid(guardList, NPC_VIOLET_HOLD_GUARD, 100.0f); + for (Creature* guard : guardList) { - if (Creature* pGuard = *itr) - { - pGuard->SetVisible(false); - } + guard->SetReactState(REACT_PASSIVE); + guard->SetWalk(false); + guard->GetMotionMaster()->MovePoint(0, GuardsMovePosition); } - uiTimer = 2000; - uiPhase = 4; + }); + + task.Repeat(Seconds(2)); + break; + case 3: + me->GetMotionMaster()->MovePoint(0, SinclariPositions[1]); + _summons.DespawnAll(); + task.Repeat(Seconds(5)); break; - } case 4: - me->GetMotionMaster()->MovePoint(0, sinclariOutsidePosition); - uiTimer = 4000; - uiPhase = 5; + me->SetFacingTo(SinclariPositions[1].GetOrientation()); + + task.Schedule(Seconds(1), [this](TaskContext /*task*/) + { + std::list guardList; + me->GetCreatureListWithEntryInGrid(guardList, NPC_VIOLET_HOLD_GUARD, 100.0f); + for (Creature* guard : guardList) + guard->SetVisible(false); + }); + + task.Repeat(Seconds(6)); break; case 5: - me->SetFacingTo(0.006673f); - me->Say(SAY_EVENT_LOCK, LANG_UNIVERSAL, me); // need to change to db say - me->SetReactState(REACT_PASSIVE); - uiTimer = 3000; - uiPhase = 8; + Talk(SAY_SINCLARI_INTRO_2); + task.Repeat(Seconds(4)); break; case 6: - me->GetMotionMaster()->MovementExpired(); - me->HandleEmoteCommand(EMOTE_STATE_USE_STANDING); - uiTimer = 2000; - uiPhase = 2; + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK_NO_SHEATHE); + task.Repeat(Seconds(1)); break; case 7: - { - std::list creatures; - GetCreatureListWithEntryInGrid(creatures, me, NPC_TELEPORTATION_PORTAL, 200.0f); - GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_BINDER_1, 200.0f); - GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_MAGE_SLAYER_1, 200.0f); - GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_INVADER_1, 200.0f); - DoCast(SPELL_CRYSTAL_ACTIVATION); - if (!creatures.empty()) + if (GameObject* mainDoor = _instance->GetGameObject(DATA_MAIN_DOOR)) { - for (std::list::iterator itr = creatures.begin(); itr != creatures.end(); ++itr) - (*itr)->DisappearAndDie(); + mainDoor->SetGoState(GO_STATE_READY); + mainDoor->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } - uiTimer = 500; - uiPhase = 9; - } - break; + task.Repeat(Seconds(5)); + break; case 8: - instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); - uiTimer = 0; - uiPhase = 0; + me->SetVisible(false); + task.Repeat(Seconds(1)); break; case 9: - { - std::list GuardList; - me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); - if (!GuardList.empty()) - for (std::list::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) - { - if (Creature* pGuard = *itr) - { - pGuard->SetReactState(REACT_PASSIVE); - pGuard->SetWalk(false); - pGuard->GetMotionMaster()->MovePoint(0, MovePosition); - } - } - uiTimer = 4000; - uiPhase = 3; - } - break; + _instance->SetData(DATA_MAIN_EVENT_STATE, IN_PROGRESS); + // [1] GUID: Full: 0xF1300077C202E6DD Type: Creature Entry: 30658 Low: 190173 + break; + default: + break; } - } - else uiTimer -= uiDiff; + }); } - if (!UpdateVictim()) - return; + void ScheduleOutro() + { + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + Talk(SAY_SINCLARI_OUTRO); + me->GetMotionMaster()->MovePoint(0, SinclariPositions[3]); - DoMeleeAttackIfReady(); + task.Schedule(Seconds(10), [this](TaskContext /*task*/) + { + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + }); + }); + } + + void JustSummoned(Creature* summon) override + { + ScriptedAI::JustSummoned(summon); + _summons.Summon(summon); + } + + void SummonedCreatureDespawn(Creature* summon) override + { + _summons.Despawn(summon); + ScriptedAI::SummonedCreatureDespawn(summon); + } + + private: + InstanceScript* _instance; + TaskScheduler _scheduler; + + SummonList _summons; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_saboteur : public CreatureScript { -public: - npc_azure_saboteur() : CreatureScript("npc_azure_saboteur") { } + public: + npc_azure_saboteur() : CreatureScript("npc_azure_saboteur") { } - struct npc_azure_saboteurAI : public npc_escortAI - { - npc_azure_saboteurAI(Creature* creature) : npc_escortAI(creature) + struct npc_azure_saboteurAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - bHasGotMovingPoints = false; - uiBoss = 0; - Reset(); - } - - InstanceScript* instance; - bool bHasGotMovingPoints; - uint32 uiBoss; - - void Reset() override - { - if (!uiBoss) - uiBoss = instance->GetData(DATA_WAVE_COUNT) == 6 ? instance->GetData(DATA_FIRST_BOSS) : instance->GetData(DATA_SECOND_BOSS); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void WaypointReached(uint32 waypointId) override - { - switch (uiBoss) + npc_azure_saboteurAI(Creature* creature) : ScriptedAI(creature) { - case 1: - if (waypointId == 2) - FinishPointReached(); - break; - case 2: - if (waypointId == 2) - FinishPointReached(); - break; - case 3: - if (waypointId == 1) - FinishPointReached(); - break; - case 4: - if (waypointId == 0) - FinishPointReached(); - break; - case 5: - if (waypointId == 0) - FinishPointReached(); - break; - case 6: - if (waypointId == 4) - FinishPointReached(); - break; + _instance = creature->GetInstanceScript(); + + if (_instance->GetData(DATA_WAVE_COUNT) == 6) + _bossId = _instance->GetData(DATA_1ST_BOSS); + else + _bossId = _instance->GetData(DATA_2ND_BOSS); } - } - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) - me->CastStop(); - - npc_escortAI::UpdateAI(diff); - - if (!bHasGotMovingPoints) + void StartMovement() { - bHasGotMovingPoints = true; - switch (uiBoss) + uint32 pathSize = 0; + G3D::Vector3 const* path = nullptr; + + switch (_bossId) { - case 1: - for (int i=0;i<3;i++) - AddWaypoint(i, SaboteurFinalPos1[i][0], SaboteurFinalPos1[i][1], SaboteurFinalPos1[i][2], 0); - me->SetHomePosition(SaboteurFinalPos1[2][0], SaboteurFinalPos1[2][1], SaboteurFinalPos1[2][2], 4.762346f); + case DATA_MORAGG: + pathSize = SaboteurMoraggPathSize; + path = SaboteurMoraggPath; break; - case 2: - for (int i=0;i<3;i++) - AddWaypoint(i, SaboteurFinalPos2[i][0], SaboteurFinalPos2[i][1], SaboteurFinalPos2[i][2], 0); - me->SetHomePosition(SaboteurFinalPos2[2][0], SaboteurFinalPos2[2][1], SaboteurFinalPos2[2][2], 1.862674f); + case DATA_EREKEM: + pathSize = SaboteurErekemPathSize; + path = SaboteurErekemPath; break; - case 3: - for (int i=0;i<2;i++) - AddWaypoint(i, SaboteurFinalPos3[i][0], SaboteurFinalPos3[i][1], SaboteurFinalPos3[i][2], 0); - me->SetHomePosition(SaboteurFinalPos3[1][0], SaboteurFinalPos3[1][1], SaboteurFinalPos3[1][2], 5.500638f); + case DATA_ICHORON: + pathSize = SaboteurIchoronPathSize; + path = SaboteurIchoronPath; break; - case 4: - AddWaypoint(0, SaboteurFinalPos4[0], SaboteurFinalPos4[1], SaboteurFinalPos4[2], 0); - me->SetHomePosition(SaboteurFinalPos4[0], SaboteurFinalPos4[1], SaboteurFinalPos4[2], 3.991108f); + case DATA_LAVANTHOR: + pathSize = SaboteurLavanthorPathSize; + path = SaboteurLavanthorPath; break; - case 5: - AddWaypoint(0, SaboteurFinalPos5[0], SaboteurFinalPos5[1], SaboteurFinalPos5[2], 0); - me->SetHomePosition(SaboteurFinalPos5[0], SaboteurFinalPos5[1], SaboteurFinalPos5[2], 1.100841f); + case DATA_XEVOZZ: + pathSize = SaboteurXevozzPathSize; + path = SaboteurXevozzPath; break; - case 6: - for (int i=0;i<5;i++) - AddWaypoint(i, SaboteurFinalPos6[i][0], SaboteurFinalPos6[i][1], SaboteurFinalPos6[i][2], 0); - me->SetHomePosition(SaboteurFinalPos6[4][0], SaboteurFinalPos6[4][1], SaboteurFinalPos6[4][2], 0.983031f); + case DATA_ZURAMAT: + pathSize = SaboteurZuramatPathSize; + path = SaboteurZuramatPath; break; } - SetDespawnAtEnd(false); - Start(true, true); + if (path) + me->GetMotionMaster()->MoveSmoothPath(POINT_INTRO, path, pathSize, false); } - } - void FinishPointReached() + void Reset() override + { + _scheduler.CancelAll(); + _scheduler.Schedule(Seconds(2), [this](TaskContext /*task*/) + { + StartMovement(); + }); + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type == EFFECT_MOTION_TYPE && pointId == POINT_INTRO) + { + _scheduler.Schedule(Seconds(0), [this](TaskContext task) + { + me->CastSpell(me, SPELL_SHIELD_DISRUPTION, false); + + if (task.GetRepeatCounter() < 2) + task.Repeat(Seconds(1)); + else + { + task.Schedule(Seconds(2), [this](TaskContext /*task*/) + { + _instance->SetData(DATA_START_BOSS_ENCOUNTER, 1); + me->CastSpell(me, SPELL_TELEPORT_VISUAL, false); + me->DespawnOrUnsummon(1000); + }); + } + }); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + + private: + InstanceScript* _instance; + TaskScheduler _scheduler; + + uint32 _bossId; + }; + + CreatureAI* GetAI(Creature* creature) const override { - me->CastSpell(me, SABOTEUR_SHIELD_DISRUPTION, false); - me->DisappearAndDie(); - if (Creature* pSaboPort = ObjectAccessor::GetCreature((*me), instance->GetGuidData(DATA_SABOTEUR_PORTAL))) - pSaboPort->DisappearAndDie(); - instance->SetData(DATA_START_BOSS_ENCOUNTER, 1); + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; -class npc_teleportation_portal_vh : public CreatureScript +struct npc_violet_hold_teleportation_portal_commonAI : public ScriptedAI { -public: - npc_teleportation_portal_vh() : CreatureScript("npc_teleportation_portal_vh") { } - - struct npc_teleportation_portalAI : public ScriptedAI + npc_violet_hold_teleportation_portal_commonAI(Creature* creature) : ScriptedAI(creature), _summons(me) { - npc_teleportation_portalAI(Creature* creature) : ScriptedAI(creature), listOfMobs(me) + _instance = creature->GetInstanceScript(); + _portalLocation = 0; + } + + void InitializeAI() override + { + ScriptedAI::InitializeAI(); + ScheduleTasks(); + } + + void SetData(uint32 type, uint32 data) override + { + if (type == DATA_PORTAL_LOCATION) + _portalLocation = uint8(data); + } + + void MoveInLineOfSight(Unit* /*who*/) override { } + + void EnterCombat(Unit* /*who*/) override { } + + void JustSummoned(Creature* summon) override + { + _summons.Summon(summon); + summon->AI()->SetData(DATA_PORTAL_LOCATION, _portalLocation); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + _summons.Despawn(summon); + } + + virtual void ScheduleTasks() { } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +protected: + InstanceScript* _instance; + SummonList _summons; + TaskScheduler _scheduler; + uint8 _portalLocation; +}; + +class npc_violet_hold_teleportation_portal : public CreatureScript +{ + public: + npc_violet_hold_teleportation_portal() : CreatureScript("npc_violet_hold_teleportation_portal") { } + + struct npc_violet_hold_teleportation_portalAI : public npc_violet_hold_teleportation_portal_commonAI { - Initialize(); - instance = creature->GetInstanceScript(); - uiTypeOfMobsPortal = urand(0, 1); // 0 - elite mobs 1 - portal guardian or portal keeper with regular mobs - - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == NOT_STARTED) - uiTypeOfMobsPortal = 2; - } - - void Initialize() - { - uiSpawnTimer = 10000; - bPortalGuardianOrKeeperOrEliteSpawn = false; - } - - uint32 uiSpawnTimer; - bool bPortalGuardianOrKeeperOrEliteSpawn; - uint8 uiTypeOfMobsPortal; - - SummonList listOfMobs; - - InstanceScript* instance; - - void Reset() override - { - Initialize(); - } - - void EnterCombat(Unit* /*who*/) override { } - - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + npc_violet_hold_teleportation_portalAI(Creature* creature) : npc_violet_hold_teleportation_portal_commonAI(creature) { - if (instance->GetData(DATA_REMOVE_NPC) == 1) - { - me->DespawnOrUnsummon(); - instance->SetData(DATA_REMOVE_NPC, 0); - } } - uint8 uiWaveCount = instance->GetData(DATA_WAVE_COUNT); - if ((uiWaveCount == 6) || (uiWaveCount == 12)) //Don't spawn mobs on boss encounters - return; - - switch (uiTypeOfMobsPortal) + void InitializeAI() override { - // spawn elite mobs and then set portals visibility to make it look like it dissapeard - case 0: - if (!bPortalGuardianOrKeeperOrEliteSpawn) + npc_violet_hold_teleportation_portal_commonAI::InitializeAI(); + me->CastSpell(me, SPELL_PORTAL_PERIODIC, true); + } + + void SetData(uint32 type, uint32 data) override + { + npc_violet_hold_teleportation_portal_commonAI::SetData(type, data); + + if (type == DATA_PORTAL_PERIODIC_TICK) + { + if (data == 1) { - if (uiSpawnTimer <= diff) + uint32 entry = RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER); + if (Creature* portalKeeper = DoSummon(entry, me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) + me->CastSpell(portalKeeper, SPELL_PORTAL_CHANNEL, false); + + if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER)) { - bPortalGuardianOrKeeperOrEliteSpawn = true; - uint8 k = uiWaveCount < 12 ? 2 : 3; - for (uint8 i = 0; i < k; ++i) - { - uint32 entry = RAND(NPC_AZURE_CAPTAIN, NPC_AZURE_RAIDER, NPC_AZURE_STALKER, NPC_AZURE_SORCEROR); - DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); - } - me->SetVisible(false); - } else uiSpawnTimer -= diff; + if (entry == NPC_PORTAL_GUARDIAN) + sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_GUARDIAN); + else if (entry == NPC_PORTAL_KEEPER) + sinclariTrigger->AI()->Talk(SAY_SINCLARI_PORTAL_KEEPER); + } } else { - // if all spawned elites have died kill portal - if (listOfMobs.empty()) + uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4; + while (k--) { - me->Kill(me, false); - me->RemoveCorpse(); + uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2); + DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } } - break; - // spawn portal guardian or portal keeper with regular mobs - case 1: - if (uiSpawnTimer <= diff) - { - if (bPortalGuardianOrKeeperOrEliteSpawn) - { - uint8 k = instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4; - for (uint8 i = 0; i < k; ++i) - { - uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2); - DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); - } - } - else - { - bPortalGuardianOrKeeperOrEliteSpawn = true; - uint32 entry = RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER); - if (Creature* pPortalKeeper = DoSummon(entry, me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) - me->CastSpell(pPortalKeeper, SPELL_PORTAL_CHANNEL, false); - } - uiSpawnTimer = SPAWN_TIME; - } else uiSpawnTimer -= diff; + } + } - if (bPortalGuardianOrKeeperOrEliteSpawn && !me->IsNonMeleeSpellCast(false)) + void SummonedCreatureDies(Creature* summon, Unit* killer) override + { + npc_violet_hold_teleportation_portal_commonAI::SummonedCreatureDies(summon, killer); + + if (summon->GetEntry() == NPC_PORTAL_GUARDIAN || summon->GetEntry() == NPC_PORTAL_KEEPER) + { + _instance->SetData(DATA_WAVE_COUNT, _instance->GetData(DATA_WAVE_COUNT) + 1); + me->DespawnOrUnsummon(); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); + } +}; + +class npc_violet_hold_teleportation_portal_elite : public CreatureScript +{ + public: + npc_violet_hold_teleportation_portal_elite() : CreatureScript("npc_violet_hold_teleportation_portal_elite") { } + + struct npc_violet_hold_teleportation_portal_eliteAI : public npc_violet_hold_teleportation_portal_commonAI + { + npc_violet_hold_teleportation_portal_eliteAI(Creature* creature) : npc_violet_hold_teleportation_portal_commonAI(creature) + { + } + + void ScheduleTasks() override + { + _scheduler.Schedule(Seconds(15), [this](TaskContext task) + { + uint8 k = _instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4; + while (k--) { - me->Kill(me, false); - me->RemoveCorpse(); - } - break; - case 2: // Pre-event - if (uiSpawnTimer <= diff) - { - uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1); + uint32 entry = RAND(NPC_AZURE_CAPTAIN_1, NPC_AZURE_RAIDER_1, NPC_AZURE_STALKER_1, NPC_AZURE_SORCEROR_1); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); - uiSpawnTimer = SPAWN_TIME; - } else uiSpawnTimer -= diff; - break; + } + + if (Creature* sinclariTrigger = _instance->GetCreature(DATA_SINCLARI_TRIGGER)) + sinclariTrigger->AI()->Talk(SAY_SINCLARI_ELITE_SQUAD); + + task.Schedule(Seconds(1), [this](TaskContext /*task*/) + { + me->SetVisible(false); + }); + }); } - } - void JustDied(Unit* /*killer*/) override - { - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) - instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT) + 1); - } - - void JustSummoned(Creature* summoned) override - { - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + void SummonedCreatureDies(Creature* summon, Unit* killer) override { - listOfMobs.Summon(summoned); - instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); - } - } + npc_violet_hold_teleportation_portal_commonAI::SummonedCreatureDies(summon, killer); - void SummonedCreatureDies(Creature* summoned, Unit* /*killer*/) override + if (_summons.empty()) + { + _instance->SetData(DATA_WAVE_COUNT, _instance->GetData(DATA_WAVE_COUNT) + 1); + me->DespawnOrUnsummon(); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) - { - listOfMobs.Despawn(summoned); - instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); - } + return GetVioletHoldAI(creature); } - }; +}; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } +class npc_violet_hold_teleportation_portal_intro : public CreatureScript +{ + public: + npc_violet_hold_teleportation_portal_intro() : CreatureScript("npc_violet_hold_teleportation_portal_intro") { } + + struct npc_violet_hold_teleportation_portal_introAI : public npc_violet_hold_teleportation_portal_commonAI + { + npc_violet_hold_teleportation_portal_introAI(Creature* creature) : npc_violet_hold_teleportation_portal_commonAI(creature) + { + } + + void ScheduleTasks() override + { + if (_instance->GetData(DATA_MAIN_EVENT_STATE) != NOT_STARTED) + return; + + _scheduler.Schedule(Seconds(15), [this](TaskContext task) + { + uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1); + DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); + + task.Repeat(); + }); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); + } }; struct violet_hold_trashAI : public npc_escortAI { violet_hold_trashAI(Creature* creature) : npc_escortAI(creature) { - instance = creature->GetInstanceScript(); - bHasGotMovingPoints = false; + _instance = creature->GetInstanceScript(); + _lastWaypointId = 0; - if (instance->GetData(DATA_MAIN_EVENT_PHASE) == NOT_STARTED) + SetDespawnAtEnd(false); + + _scheduler.SetValidator([this] { - if (Creature* portal = me->FindNearestCreature(NPC_TELEPORTATION_PORTAL, 10.0f)) - { - ObjectGuid portalGUID = portal->GetGUID(); - for (uint8 i = 0; i < MAX_PRE_EVENT_PORTAL; i++) - if (portalGUID == preEventPortalGUID[i]) - portalLocationID = i * 2; - } - } - else - { - portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); - Reset(); - } + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } - public: - InstanceScript* instance; - bool bHasGotMovingPoints; - uint32 portalLocationID; - uint32 secondPortalRouteID; - - void WaypointReached(uint32 waypointId) override + void Reset() override { - switch (portalLocationID) - { - case 0: - if (waypointId == 5) - CreatureStartAttackDoor(); - break; - case 1: - if ((waypointId == 8 && secondPortalRouteID == 0) || (waypointId == 7 && secondPortalRouteID == 1)) - CreatureStartAttackDoor(); - break; - case 2: - if (waypointId == 7) - CreatureStartAttackDoor(); - break; - case 3: - if (waypointId == 8) - CreatureStartAttackDoor(); - break; - case 4: - if (waypointId == 5) - CreatureStartAttackDoor(); - break; - case 5: - if (waypointId == 3) - CreatureStartAttackDoor(); - break; - } + _scheduler.CancelAll(); } - void UpdateAI(uint32 diff) override + void SetData(uint32 type, uint32 data) override { - if (instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) - me->CastStop(); - - if (!bHasGotMovingPoints) + if (type == DATA_PORTAL_LOCATION) { - bHasGotMovingPoints = true; - switch (portalLocationID) + G3D::Vector3 const* path = nullptr; + + switch (data) { case 0: - for (int i=0;i<6;i++) - AddWaypoint(i, FirstPortalWPs[i][0]+irand(-1, 1), FirstPortalWPs[i][1]+irand(-1, 1), FirstPortalWPs[i][2]+irand(-1, 1), 0); - me->SetHomePosition(FirstPortalWPs[5][0], FirstPortalWPs[5][1], FirstPortalWPs[5][2], 3.149439f); + _lastWaypointId = 5; + path = FirstPortalWPs; break; - case 1: - secondPortalRouteID = urand(0, 1); - switch (secondPortalRouteID) + case 7: + switch (urand(0, 1)) { case 0: - for (int i=0;i<9;i++) - AddWaypoint(i, SecondPortalFirstWPs[i][0]+irand(-1, 1), SecondPortalFirstWPs[i][1]+irand(-1, 1), SecondPortalFirstWPs[i][2], 0); - me->SetHomePosition(SecondPortalFirstWPs[8][0]+irand(-1, 1), SecondPortalFirstWPs[8][1]+irand(-1, 1), SecondPortalFirstWPs[8][2]+irand(-1, 1), 3.149439f); + _lastWaypointId = 8; + path = SecondPortalFirstWPs; break; case 1: - for (int i=0;i<8;i++) - AddWaypoint(i, SecondPortalSecondWPs[i][0]+irand(-1, 1), SecondPortalSecondWPs[i][1]+irand(-1, 1), SecondPortalSecondWPs[i][2], 0); - me->SetHomePosition(SecondPortalSecondWPs[7][0], SecondPortalSecondWPs[7][1], SecondPortalSecondWPs[7][2], 3.149439f); + _lastWaypointId = 7; + path = SecondPortalSecondWPs; break; } break; case 2: - for (int i=0;i<8;i++) - AddWaypoint(i, ThirdPortalWPs[i][0]+irand(-1, 1), ThirdPortalWPs[i][1]+irand(-1, 1), ThirdPortalWPs[i][2], 0); - me->SetHomePosition(ThirdPortalWPs[7][0], ThirdPortalWPs[7][1], ThirdPortalWPs[7][2], 3.149439f); + _lastWaypointId = 7; + path = ThirdPortalWPs; break; - case 3: - for (int i=0;i<9;i++) - AddWaypoint(i, FourthPortalWPs[i][0]+irand(-1, 1), FourthPortalWPs[i][1]+irand(-1, 1), FourthPortalWPs[i][2], 0); - me->SetHomePosition(FourthPortalWPs[8][0], FourthPortalWPs[8][1], FourthPortalWPs[8][2], 3.149439f); + case 6: + _lastWaypointId = 8; + path = FourthPortalWPs; break; - case 4: - for (int i=0;i<6;i++) - AddWaypoint(i, FifthPortalWPs[i][0]+irand(-1, 1), FifthPortalWPs[i][1]+irand(-1, 1), FifthPortalWPs[i][2], 0); - me->SetHomePosition(FifthPortalWPs[5][0], FifthPortalWPs[5][1], FifthPortalWPs[5][2], 3.149439f); + case 1: + _lastWaypointId = 5; + path = FifthPortalWPs; break; case 5: - for (int i=0;i<4;i++) - AddWaypoint(i, SixthPoralWPs[i][0]+irand(-1, 1), SixthPoralWPs[i][1]+irand(-1, 1), SixthPoralWPs[i][2], 0); - me->SetHomePosition(SixthPoralWPs[3][0], SixthPoralWPs[3][1], SixthPoralWPs[3][2], 3.149439f); + _lastWaypointId = 3; + path = SixthPoralWPs; + break; + default: + _lastWaypointId = 0; + path = DefaultPortalWPs; break; } - SetDespawnAtEnd(false); + + if (path) + { + for (uint32 i = 0; i <= _lastWaypointId; i++) + AddWaypoint(i, path[i].x + irand(-1, 1), path[i].y + irand(-1, 1), path[i].z, 0); + me->SetHomePosition(path[_lastWaypointId].x, path[_lastWaypointId].y, path[_lastWaypointId].z, float(M_PI)); + } + Start(true, true); } - - npc_escortAI::UpdateAI(diff); } - void JustDied(Unit* /*killer*/) override + void WaypointReached(uint32 waypointId) override { - instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_REMOVE, 1); + if (waypointId == _lastWaypointId) + CreatureStartAttackDoor(); } + void EnterCombat(Unit* who) override + { + npc_escortAI::EnterCombat(who); + ScheduledTasks(); + } + + void UpdateEscortAI(uint32 diff) override + { + if (_instance->GetData(DATA_MAIN_EVENT_STATE) != IN_PROGRESS) + me->CastStop(); + + if (!UpdateVictim()) + return; + + _scheduler.Update(diff, + std::bind(&npc_escortAI::DoMeleeAttackIfReady, this)); + } + + virtual void ScheduledTasks() { } + void CreatureStartAttackDoor() { - me->SetReactState(REACT_PASSIVE); - DoCast(SPELL_DESTROY_DOOR_SEAL); - instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_ADD, 1); + me->SetReactState(REACT_DEFENSIVE); + DoCastAOE(SPELL_DESTROY_DOOR_SEAL); } + +protected: + InstanceScript* _instance; + TaskScheduler _scheduler; + + uint32 _lastWaypointId; }; class npc_azure_invader : public CreatureScript { -public: - npc_azure_invader() : CreatureScript("npc_azure_invader") { } + public: + npc_azure_invader() : CreatureScript("npc_azure_invader") { } - struct npc_azure_invaderAI : public violet_hold_trashAI - { - npc_azure_invaderAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_invaderAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_invaderAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiCleaveTimer = 5000; - uiImpaleTimer = 4000; - uiBrutalStrikeTimer = 5000; - uiSunderArmorTimer = 4000; - } - - uint32 uiCleaveTimer; - uint32 uiImpaleTimer; - uint32 uiBrutalStrikeTimer; - uint32 uiSunderArmorTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (me->GetEntry() == NPC_AZURE_INVADER_1) + void ScheduledTasks() override { - if (uiCleaveTimer <= diff) + if (me->GetEntry() == NPC_AZURE_INVADER_1) { - DoCastVictim(SPELL_CLEAVE); - uiCleaveTimer = 5000; - } else uiCleaveTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastVictim(SPELL_CLEAVE); + task.Repeat(); + }); - if (uiImpaleTimer <= diff) + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + DoCastVictim(SPELL_IMPALE); + task.Repeat(); + }); + } + else if (me->GetEntry() == NPC_AZURE_INVADER_2) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_IMPALE); - uiImpaleTimer = 4000; - } else uiImpaleTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastVictim(SPELL_BRUTAL_STRIKE); + task.Repeat(); + }); + + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + DoCastVictim(SPELL_SUNDER_ARMOR); + task.Repeat(Seconds(8), Seconds(10)); + }); + } } + }; - if (me->GetEntry() == NPC_AZURE_INVADER_2) - { - if (uiBrutalStrikeTimer <= diff) - { - DoCastVictim(SPELL_BRUTAL_STRIKE); - uiBrutalStrikeTimer = 5000; - } else uiBrutalStrikeTimer -= diff; - - if (uiSunderArmorTimer <= diff) - { - DoCastVictim(SPELL_SUNDER_ARMOR); - uiSunderArmorTimer = urand(8000, 10000); - } else uiSunderArmorTimer -= diff; - - DoMeleeAttackIfReady(); - } - - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_binder : public CreatureScript { -public: - npc_azure_binder() : CreatureScript("npc_azure_binder") { } + public: + npc_azure_binder() : CreatureScript("npc_azure_binder") { } - struct npc_azure_binderAI : public violet_hold_trashAI - { - npc_azure_binderAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_binderAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_binderAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiArcaneExplosionTimer = 5000; - uiArcainBarrageTimer = 4000; - uiFrostNovaTimer = 5000; - uiFrostboltTimer = 4000; - } - - uint32 uiArcaneExplosionTimer; - uint32 uiArcainBarrageTimer; - uint32 uiFrostNovaTimer; - uint32 uiFrostboltTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (me->GetEntry() == NPC_AZURE_BINDER_1) + void ScheduledTasks() override { - if (uiArcaneExplosionTimer <= diff) + if (me->GetEntry() == NPC_AZURE_BINDER_1) { - DoCast(SPELL_ARCANE_EXPLOSION); - uiArcaneExplosionTimer = 5000; - } else uiArcaneExplosionTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastAOE(SPELL_ARCANE_EXPLOSION); + task.Repeat(); + }); - if (uiArcainBarrageTimer <= diff) + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) + DoCast(target, SPELL_ARCANE_BARRAGE); + task.Repeat(Seconds(6)); + }); + } + else if (me->GetEntry() == NPC_AZURE_BINDER_2) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_ARCANE_BARRAGE); - uiArcainBarrageTimer = 6000; - } else uiArcainBarrageTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastAOE(SPELL_FROST_NOVA); + task.Repeat(); + }); + + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f)) + DoCast(target, SPELL_FROSTBOLT); + task.Repeat(Seconds(6)); + }); + } } + }; - if (me->GetEntry() == NPC_AZURE_BINDER_2) - { - if (uiFrostNovaTimer <= diff) - { - DoCast(SPELL_FROST_NOVA); - uiFrostNovaTimer = 5000; - } else uiFrostNovaTimer -= diff; - - if (uiFrostboltTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_FROSTBOLT); - uiFrostboltTimer = 6000; - } else uiFrostboltTimer -= diff; - } - - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_mage_slayer : public CreatureScript { -public: - npc_azure_mage_slayer() : CreatureScript("npc_azure_mage_slayer") { } + public: + npc_azure_mage_slayer() : CreatureScript("npc_azure_mage_slayer") { } - struct npc_azure_mage_slayerAI : public violet_hold_trashAI - { - npc_azure_mage_slayerAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_mage_slayerAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_mage_slayerAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiArcaneEmpowermentTimer = 5000; - uiSpellLockTimer = 5000; - } - - uint32 uiArcaneEmpowermentTimer; - uint32 uiSpellLockTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_1) + void ScheduledTasks() override { - if (uiArcaneEmpowermentTimer <= diff) + if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_1) { - DoCast(me, SPELL_ARCANE_EMPOWERMENT); - uiArcaneEmpowermentTimer = 14000; - } else uiArcaneEmpowermentTimer -= diff; - } - - if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2) - { - if (uiSpellLockTimer <= diff) + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCast(me, SPELL_ARCANE_EMPOWERMENT); + task.Repeat(Seconds(14)); + }); + } + else if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_SPELL_LOCK); - uiSpellLockTimer = 9000; - } else uiSpellLockTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + // wrong spellid? + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) + DoCast(target, SPELL_SPELL_LOCK); + task.Repeat(Seconds(9)); + }); + } } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_raider : public CreatureScript { -public: - npc_azure_raider() : CreatureScript("npc_azure_raider") { } + public: + npc_azure_raider() : CreatureScript("npc_azure_raider") { } - struct npc_azure_raiderAI : public violet_hold_trashAI - { - npc_azure_raiderAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_raiderAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_raiderAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiConcussionBlowTimer = 5000; - uiMagicReflectionTimer = 8000; - } - - uint32 uiConcussionBlowTimer; - uint32 uiMagicReflectionTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (uiConcussionBlowTimer <= diff) + void ScheduledTasks() override { - DoCastVictim(SPELL_CONCUSSION_BLOW); - uiConcussionBlowTimer = 5000; - } else uiConcussionBlowTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastVictim(SPELL_CONCUSSION_BLOW); + task.Repeat(); + }); - if (uiMagicReflectionTimer <= diff) - { - DoCast(SPELL_MAGIC_REFLECTION); - uiMagicReflectionTimer = urand(10000, 15000); - } else uiMagicReflectionTimer -= diff; + _scheduler.Schedule(Seconds(8), [this](TaskContext task) + { + DoCast(me, SPELL_MAGIC_REFLECTION); + task.Repeat(Seconds(10), Seconds(15)); + }); + } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_stalker : public CreatureScript { -public: - npc_azure_stalker() : CreatureScript("npc_azure_stalker") { } + public: + npc_azure_stalker() : CreatureScript("npc_azure_stalker") { } - struct npc_azure_stalkerAI : public violet_hold_trashAI - { - npc_azure_stalkerAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_stalkerAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_stalkerAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - _backstabTimer = 1300; - _tacticalBlinkTimer = 8000; - _tacticalBlinkCast = false; - } - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (!_tacticalBlinkCast) + void ScheduledTasks() override { - if (_tacticalBlinkTimer <= diff) + _scheduler.Schedule(Seconds(8), [this](TaskContext task) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f)) DoCast(target, SPELL_TACTICAL_BLINK); - _tacticalBlinkTimer = 6000; - _tacticalBlinkCast = true; - } else _tacticalBlinkTimer -= diff; - } - else - { - if (_backstabTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 10, true)) - DoCast(target, SPELL_BACKSTAB); - _tacticalBlinkCast = false; - _backstabTimer =1300; - } else _backstabTimer -= diff; - } + task.Schedule(Milliseconds(1300), [this](TaskContext /*task*/) + { + if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 5.0f)) + DoCast(target, SPELL_BACKSTAB); + }); - DoMeleeAttackIfReady(); + task.Repeat(); + }); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - - private: - uint32 _backstabTimer; - uint32 _tacticalBlinkTimer; - bool _tacticalBlinkCast; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_spellbreaker : public CreatureScript { -public: - npc_azure_spellbreaker() : CreatureScript("npc_azure_spellbreaker") { } + public: + npc_azure_spellbreaker() : CreatureScript("npc_azure_spellbreaker") { } - struct npc_azure_spellbreakerAI : public violet_hold_trashAI - { - npc_azure_spellbreakerAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_spellbreakerAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_spellbreakerAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiArcaneBlastTimer = 5000; - uiSlowTimer = 4000; - uiChainsOfIceTimer = 5000; - uiConeOfColdTimer = 4000; - } - - uint32 uiArcaneBlastTimer; - uint32 uiSlowTimer; - uint32 uiChainsOfIceTimer; - uint32 uiConeOfColdTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_1) + void ScheduledTasks() override { - if (uiArcaneBlastTimer <= diff) + if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_1) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_ARCANE_BLAST); - uiArcaneBlastTimer = 6000; - } else uiArcaneBlastTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) + DoCast(target, SPELL_ARCANE_BLAST); + task.Repeat(Seconds(6)); + }); - if (uiSlowTimer <= diff) + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) + DoCast(target, SPELL_SLOW); + task.Repeat(Seconds(5)); + }); + } + else if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_SLOW); - uiSlowTimer = 5000; - } else uiSlowTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f)) + DoCast(target, SPELL_CHAINS_OF_ICE); + task.Repeat(Seconds(7)); + }); + + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + DoCast(me, SPELL_CONE_OF_COLD); + task.Repeat(Seconds(5)); + }); + } } + }; - if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2) - { - if (uiChainsOfIceTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_CHAINS_OF_ICE); - uiChainsOfIceTimer = 7000; - } else uiChainsOfIceTimer -= diff; - - if (uiConeOfColdTimer <= diff) - { - DoCast(SPELL_CONE_OF_COLD); - uiConeOfColdTimer = 5000; - } else uiConeOfColdTimer -= diff; - } - - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_captain : public CreatureScript { -public: - npc_azure_captain() : CreatureScript("npc_azure_captain") { } + public: + npc_azure_captain() : CreatureScript("npc_azure_captain") { } - struct npc_azure_captainAI : public violet_hold_trashAI - { - npc_azure_captainAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_captainAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_captainAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiMortalStrikeTimer = 5000; - uiWhirlwindTimer = 8000; - } - - uint32 uiMortalStrikeTimer; - uint32 uiWhirlwindTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (uiMortalStrikeTimer <= diff) + void ScheduledTasks() override { - DoCastVictim(SPELL_MORTAL_STRIKE); - uiMortalStrikeTimer = 5000; - } else uiMortalStrikeTimer -= diff; + _scheduler.Schedule(Seconds(5), [this](TaskContext task) + { + DoCastVictim(SPELL_MORTAL_STRIKE); + task.Repeat(); + }); - if (uiWhirlwindTimer <= diff) - { - DoCast(me, SPELL_WHIRLWIND_OF_STEEL); - uiWhirlwindTimer = 8000; - } else uiWhirlwindTimer -= diff; + _scheduler.Schedule(Seconds(8), [this](TaskContext task) + { + DoCast(me, SPELL_WHIRLWIND_OF_STEEL); + task.Repeat(); + }); + } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; class npc_azure_sorceror : public CreatureScript { -public: - npc_azure_sorceror() : CreatureScript("npc_azure_sorceror") { } + public: + npc_azure_sorceror() : CreatureScript("npc_azure_sorceror") { } - struct npc_azure_sorcerorAI : public violet_hold_trashAI - { - npc_azure_sorcerorAI(Creature* creature) : violet_hold_trashAI(creature) + struct npc_azure_sorcerorAI : public violet_hold_trashAI { - Initialize(); - instance = creature->GetInstanceScript(); - } + npc_azure_sorcerorAI(Creature* creature) : violet_hold_trashAI(creature) { } - void Initialize() - { - uiArcaneStreamTimer = 4000; - uiArcaneStreamTimerStartingValueHolder = uiArcaneStreamTimer; - uiManaDetonationTimer = 5000; - } - - uint32 uiArcaneStreamTimer; - uint32 uiArcaneStreamTimerStartingValueHolder; - uint32 uiManaDetonationTimer; - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - violet_hold_trashAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (uiArcaneStreamTimer <= diff) + void ScheduledTasks() override { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_ARCANE_STREAM); - uiArcaneStreamTimer = urand(0, 5000)+5000; - uiArcaneStreamTimerStartingValueHolder = uiArcaneStreamTimer; - } else uiArcaneStreamTimer -= diff; + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f)) + DoCast(target, SPELL_ARCANE_STREAM); + task.Repeat(Seconds(5), Seconds(10)); + }); - if (uiManaDetonationTimer <= diff && uiArcaneStreamTimer >=1500 && uiArcaneStreamTimer <= uiArcaneStreamTimerStartingValueHolder/2) - { - DoCast(SPELL_MANA_DETONATION); - uiManaDetonationTimer = urand(2000, 6000); - } else uiManaDetonationTimer -= diff; + _scheduler.Schedule(Seconds(), Seconds(), [this](TaskContext task) + { + DoCastAOE(SPELL_MANA_DETONATION); + task.Repeat(Seconds(2), Seconds(6)); + }); + } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetVioletHoldAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } }; -class npc_violet_hold_arcane_sphere : public CreatureScript +class npc_violet_hold_defense_system : public CreatureScript { -public: - npc_violet_hold_arcane_sphere() : CreatureScript("npc_violet_hold_arcane_sphere") { } + public: + npc_violet_hold_defense_system() : CreatureScript("npc_violet_hold_defense_system") { } - struct npc_violet_hold_arcane_sphereAI : public ScriptedAI - { - npc_violet_hold_arcane_sphereAI(Creature* creature) : ScriptedAI(creature) + struct npc_violet_hold_defense_systemAI : public ScriptedAI { - Initialize(); - } + npc_violet_hold_defense_systemAI(Creature* creature) : ScriptedAI(creature) { } - void Initialize() + void Reset() override + { + ScheduledTasks(); + me->DespawnOrUnsummon(7000); + } + + void ScheduledTasks() + { + _scheduler.Schedule(Seconds(4), [this](TaskContext task) + { + DoCastAOE(SPELL_ARCANE_LIGHTNING_DAMAGE); + DoCastAOE(SPELL_ARCANE_LIGHTNING_DUMMY); + if (task.GetRepeatCounter() == 2) + DoCastAOE(SPELL_ARCANE_LIGHTNING_INSTAKILL); + else + task.Repeat(Seconds(1)); + }); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + + private: + TaskScheduler _scheduler; + }; + + CreatureAI* GetAI(Creature* creature) const override { - DespawnTimer = 3000; + return new npc_violet_hold_defense_systemAI(creature); } - - uint32 DespawnTimer; - - void Reset() override - { - Initialize(); - - me->SetDisableGravity(true); - DoCast(me, SPELL_ARCANE_SPHERE_PASSIVE, true); - } - - void EnterCombat(Unit * /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (DespawnTimer <= diff) - me->Kill(me); - else - DespawnTimer -= diff; - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_violet_hold_arcane_sphereAI(creature); - } }; class go_activation_crystal : public GameObjectScript { -public: - go_activation_crystal() : GameObjectScript("go_activation_crystal") { } + public: + go_activation_crystal() : GameObjectScript("go_activation_crystal") { } - bool OnGossipHello(Player * /*player*/, GameObject* go) override - { - go->EventInform(EVENT_ACTIVATE_CRYSTAL); - return false; - } + bool OnGossipHello(Player* player, GameObject* /*go*/) override + { + player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); + return false; + } }; -class spell_crystal_activation : public SpellScriptLoader +// 58040 - Destroy Door Seal +class spell_violet_hold_destroy_door_seal : public SpellScriptLoader { -public: - spell_crystal_activation() : SpellScriptLoader("spell_crystal_activation") { } + public: + spell_violet_hold_destroy_door_seal() : SpellScriptLoader("spell_violet_hold_destroy_door_seal") { } - class spell_crystal_activation_SpellScript : public SpellScript - { - PrepareSpellScript(spell_crystal_activation_SpellScript); - - void HandleSendEvent(SpellEffIndex effIndex) + class spell_violet_hold_destroy_door_seal_AuraScript : public AuraScript { - if (GetHitUnit()->GetEntry() == NPC_VIOLET_HOLD_GUARD) - PreventHitDefaultEffect(effIndex); - } + PrepareAuraScript(spell_violet_hold_destroy_door_seal_AuraScript); - void Register() override + bool Load() override + { + _instance = GetUnitOwner()->GetInstanceScript(); + return _instance != nullptr; + } + + void PeriodicTick(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (uint32 integrity = _instance->GetData(DATA_DOOR_INTEGRITY)) + _instance->SetData(DATA_DOOR_INTEGRITY, integrity - 1); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_violet_hold_destroy_door_seal_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + + private: + InstanceScript* _instance = nullptr; + }; + + AuraScript* GetAuraScript() const override { - OnEffectHitTarget += SpellEffectFn(spell_crystal_activation_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + return new spell_violet_hold_destroy_door_seal_AuraScript(); } - }; +}; - SpellScript* GetSpellScript() const override - { - return new spell_crystal_activation_SpellScript(); - } +// 58008 - Portal Periodic +class spell_violet_hold_portal_periodic : public SpellScriptLoader +{ + public: + spell_violet_hold_portal_periodic() : SpellScriptLoader("spell_violet_hold_portal_periodic") { } + + class spell_violet_hold_portal_periodic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_violet_hold_portal_periodic_AuraScript); + + void PeriodicTick(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (GetTarget()->IsAIEnabled) + GetTarget()->GetAI()->SetData(DATA_PORTAL_PERIODIC_TICK, aurEff->GetTickNumber()); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_violet_hold_portal_periodic_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_violet_hold_portal_periodic_AuraScript(); + } +}; + +// 62138 - Teleport to Inside Violet Hold +class spell_violet_hold_teleport_player : public SpellScriptLoader +{ + public: + spell_violet_hold_teleport_player() : SpellScriptLoader("spell_violet_hold_teleport_player") { } + + class spell_violet_hold_teleport_player_SpellScript : public SpellScript + { + PrepareSpellScript(spell_violet_hold_teleport_player_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_TELEPORT_PLAYER_EFFECT)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_TELEPORT_PLAYER_EFFECT, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_violet_hold_teleport_player_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_violet_hold_teleport_player_SpellScript(); + } }; void AddSC_violet_hold() { new npc_sinclari_vh(); - new npc_teleportation_portal_vh(); + new npc_violet_hold_teleportation_portal(); + new npc_violet_hold_teleportation_portal_elite(); + new npc_violet_hold_teleportation_portal_intro(); new npc_azure_invader(); new npc_azure_spellbreaker(); new npc_azure_binder(); @@ -1520,7 +1431,9 @@ void AddSC_violet_hold() new npc_azure_raider(); new npc_azure_stalker(); new npc_azure_saboteur(); - new npc_violet_hold_arcane_sphere(); + new npc_violet_hold_defense_system(); new go_activation_crystal(); - new spell_crystal_activation(); + new spell_violet_hold_destroy_door_seal(); + new spell_violet_hold_portal_periodic(); + new spell_violet_hold_teleport_player(); } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 2bd90672024..113a3c46ea0 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -15,44 +15,56 @@ * with this program. If not, see . */ -#ifndef DEF_VIOLET_HOLD_H -#define DEF_VIOLET_HOLD_H +#ifndef VIOLET_HOLD_H_ +#define VIOLET_HOLD_H_ +#define VioletHoldScriptName "instance_violet_hold" #define DataHeader "VH" -uint32 const EncounterCount = 3; +uint32 const EncounterCount = 3 + 6; + +// Defined in instance_violet_hold.cpp +extern Position const DefenseSystemLocation; +uint8 const PortalIntroCount = 3; +extern Position const PortalIntroPositions[]; + +/* + * Violet hold bosses: + * + * 1 - Moragg + * 2 - Erekem + * 3 - Ichoron + * 4 - Lavanthor + * 5 - Xevozz + * 6 - Zuramat + * 7 - Cyanigosa + */ enum Data { // Main encounters - DATA_1ST_BOSS_EVENT, - DATA_2ND_BOSS_EVENT, - DATA_CYANIGOSA, + DATA_1ST_BOSS = 0, + DATA_2ND_BOSS = 1, + DATA_CYANIGOSA = 2, + // Bosses + DATA_MORAGG = 3, + DATA_EREKEM = 4, + DATA_ICHORON = 5, + DATA_LAVANTHOR = 6, + DATA_XEVOZZ = 7, + DATA_ZURAMAT = 8, // Misc + DATA_MAIN_EVENT_STATE, DATA_WAVE_COUNT, - DATA_REMOVE_NPC, - DATA_PORTAL_LOCATION, DATA_DOOR_INTEGRITY, - DATA_NPC_PRESENCE_AT_DOOR, - DATA_NPC_PRESENCE_AT_DOOR_ADD, - DATA_NPC_PRESENCE_AT_DOOR_REMOVE, + DATA_PORTAL_LOCATION, DATA_START_BOSS_ENCOUNTER, - DATA_FIRST_BOSS, - DATA_SECOND_BOSS, - DATA_ACTIVATE_CRYSTAL, - DATA_MAIN_EVENT_PHASE, DATA_DEFENSELESS, // Bosses - DATA_MORAGG, - DATA_EREKEM, DATA_EREKEM_GUARD_1, DATA_EREKEM_GUARD_2, - DATA_ICHORON, - DATA_LAVANTHOR, - DATA_XEVOZZ, - DATA_ZURAMAT, // Cells DATA_MORAGG_CELL, @@ -67,43 +79,43 @@ enum Data // Misc DATA_MAIN_DOOR, DATA_SINCLARI, - DATA_TELEPORTATION_PORTAL, - DATA_SABOTEUR_PORTAL, - DATA_ADD_TRASH_MOB, - DATA_DEL_TRASH_MOB -}; - -enum Bosses -{ - BOSS_NONE, // 0 used as marker for not yet randomized - BOSS_MORAGG, - BOSS_EREKEM, - BOSS_ICHORON, - BOSS_LAVANTHOR, - BOSS_XEVOZZ, - BOSS_ZURAMAT, - BOSS_CYANIGOSA + DATA_SINCLARI_TRIGGER, + DATA_HANDLE_CELLS }; enum CreaturesIds { - NPC_TELEPORTATION_PORTAL = 31011, + NPC_TELEPORTATION_PORTAL = 30679, + NPC_TELEPORTATION_PORTAL_ELITE = 32174, + NPC_TELEPORTATION_PORTAL_INTRO = 31011, NPC_PORTAL_GUARDIAN = 30660, NPC_PORTAL_KEEPER = 30695, NPC_XEVOZZ = 29266, NPC_LAVANTHOR = 29312, NPC_ICHORON = 29313, + NPC_ICHOR_GLOBULE = 29321, + NPC_ICHORON_SUMMON_TARGET = 29326, NPC_ZURAMAT = 29314, + NPC_VOID_SENTRY = 29364, + NPC_VOID_SENTRY_BALL = 29365, NPC_EREKEM = 29315, NPC_EREKEM_GUARD = 29395, NPC_MORAGG = 29316, + + NPC_DUMMY_XEVOZZ = 32231, + NPC_DUMMY_LAVANTHOR = 32237, + NPC_DUMMY_ICHORON = 32234, + NPC_DUMMY_ZURAMAT = 32230, + NPC_DUMMY_EREKEM = 32226, + NPC_DUMMY_EREKEM_GUARD = 32228, + NPC_DUMMY_MORAGG = 32235, + NPC_CYANIGOSA = 31134, NPC_SINCLARI = 30658, + NPC_SINCLARI_TRIGGER = 32204, NPC_SABOTEOUR = 31079, NPC_VIOLET_HOLD_GUARD = 30659, - NPC_DEFENSE_SYSTEM = 30837, - NPC_VOID_SENTRY = 29364, - NPC_VOID_SENTRY_BALL = 29365 + NPC_DEFENSE_SYSTEM = 30837 }; enum GameObjectIds @@ -117,13 +129,13 @@ enum GameObjectIds GO_EREKEM_GUARD_1_DOOR = 191563, GO_EREKEM_GUARD_2_DOOR = 191562, GO_MORAGG_DOOR = 191606, - GO_INTRO_ACTIVATION_CRYSTAL = 193615, - GO_ACTIVATION_CRYSTAL = 193611 + GO_ACTIVATION_CRYSTAL = 193611, + GO_INTRO_ACTIVATION_CRYSTAL = 193615 }; enum WorldStateIds { - WORLD_STATE_VH = 3816, + WORLD_STATE_VH_SHOW = 3816, WORLD_STATE_VH_PRISON_STATE = 3815, WORLD_STATE_VH_WAVE_COUNT = 3810, }; @@ -133,4 +145,16 @@ enum Events EVENT_ACTIVATE_CRYSTAL = 20001 }; -#endif +enum InstanceMisc +{ + ACTION_SINCLARI_OUTRO = 1, + POINT_INTRO = 1 +}; + +template +inline AI* GetVioletHoldAI(Creature* creature) +{ + return GetInstanceAI(creature, VioletHoldScriptName); +} + +#endif // VIOLET_HOLD_H_ diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 280a94aa21f..6069c0d8be7 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -1819,7 +1819,7 @@ public: player->FailQuest(QUEST_GET_ME_OUTA_HERE); } - void UpdateEscortAI(const uint32 /*diff*/) override + void UpdateEscortAI(uint32 /*diff*/) override { if (GetAttack() && UpdateVictim()) { diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index fe72a2cedf7..ba69a1385d5 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -98,7 +98,7 @@ public: player->FailQuest(QUEST_TRAIL_OF_FIRE); } - void UpdateEscortAI(const uint32 diff) override + void UpdateEscortAI(uint32 diff) override { if (HealthBelowPct(75)) { diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp index 9667b4e3bb0..80cc2028cb3 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp @@ -136,7 +136,7 @@ class boss_ambassador_hellmaw : public CreatureScript Talk(SAY_DEATH); } - void UpdateEscortAI(uint32 const diff) override + void UpdateEscortAI(uint32 diff) override { if (!UpdateVictim()) return; From 3a4f54197c05ce4209c7e659acfd382896607265 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sun, 23 Aug 2015 16:43:44 +0200 Subject: [PATCH 036/110] Scripts/Build: Fixed noPCH compile --- src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp | 1 + src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index 26e55c46def..d3868b8df9c 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "SpellScript.h" #include "ScriptedCreature.h" #include "violet_hold.h" diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 2294c51e59f..14c3ac58b1f 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -18,6 +18,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "InstanceScript.h" +#include "WorldPacket.h" #include "violet_hold.h" #include "Player.h" From 405f823f68621352e48810c33f1f9dbd36904ff8 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sun, 23 Aug 2015 23:20:09 +0200 Subject: [PATCH 037/110] Core/BuildSystem: Merged crypto and gitrevision into common, cleaned include directory lists (to mimic 6.x buildsystem) --- revision_data.h.in.cmake | 2 + src/CMakeLists.txt | 1 - src/common/CMakeLists.txt | 64 +++++-------- .../Collision/Management/MMapManager.cpp | 2 +- src/common/Collision/Maps/MapDefines.h | 36 +++++++ .../shared => common}/Cryptography/ARC4.cpp | 0 .../shared => common}/Cryptography/ARC4.h | 0 .../Cryptography/Authentication/AuthCrypt.cpp | 0 .../Cryptography/Authentication/AuthCrypt.h | 0 .../Cryptography/BigNumber.cpp | 0 .../Cryptography/BigNumber.h | 0 .../Cryptography/HMACSHA1.cpp | 0 .../shared => common}/Cryptography/HMACSHA1.h | 0 .../Cryptography/OpenSSLCrypto.cpp | 0 .../Cryptography/OpenSSLCrypto.h | 0 .../shared => common}/Cryptography/SHA1.cpp | 0 .../shared => common}/Cryptography/SHA1.h | 0 .../Cryptography/WardenKeyGeneration.h | 0 src/{server/shared => common}/GitRevision.cpp | 10 ++ src/{server/shared => common}/GitRevision.h | 2 + src/server/CMakeLists.txt | 1 - src/server/authserver/CMakeLists.txt | 30 +++--- src/server/database/CMakeLists.txt | 31 +++--- src/server/game/CMakeLists.txt | 71 ++++++-------- src/server/game/Miscellaneous/SharedDefines.h | 29 ------ src/server/game/Movement/PathGenerator.h | 2 +- src/server/scripts/CMakeLists.txt | 47 +++------ src/server/shared/CMakeLists.txt | 25 +---- src/server/worldserver/CMakeLists.txt | 95 ++++++------------- 29 files changed, 176 insertions(+), 272 deletions(-) create mode 100644 src/common/Collision/Maps/MapDefines.h rename src/{server/shared => common}/Cryptography/ARC4.cpp (100%) rename src/{server/shared => common}/Cryptography/ARC4.h (100%) rename src/{server/shared => common}/Cryptography/Authentication/AuthCrypt.cpp (100%) rename src/{server/shared => common}/Cryptography/Authentication/AuthCrypt.h (100%) rename src/{server/shared => common}/Cryptography/BigNumber.cpp (100%) rename src/{server/shared => common}/Cryptography/BigNumber.h (100%) rename src/{server/shared => common}/Cryptography/HMACSHA1.cpp (100%) rename src/{server/shared => common}/Cryptography/HMACSHA1.h (100%) rename src/{server/shared => common}/Cryptography/OpenSSLCrypto.cpp (100%) rename src/{server/shared => common}/Cryptography/OpenSSLCrypto.h (100%) rename src/{server/shared => common}/Cryptography/SHA1.cpp (100%) rename src/{server/shared => common}/Cryptography/SHA1.h (100%) rename src/{server/shared => common}/Cryptography/WardenKeyGeneration.h (100%) rename src/{server/shared => common}/GitRevision.cpp (88%) rename src/{server/shared => common}/GitRevision.h (94%) diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index d3ddf99bc37..cd9d06c0e6d 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -12,4 +12,6 @@ #define VER_FILEVERSION_STR "@rev_hash@ @rev_date@ (@rev_branch@ branch)" #define VER_PRODUCTVERSION VER_FILEVERSION #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR + #define COMPILER_C_FLAGS "@CMAKE_C_FLAGS@" + #define COMPILER_CXX_FLAGS "@CMAKE_CXX_FLAGS@" #endif // __REVISION_DATA_H__ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a2c50828d37..914ad31ad06 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,4 +18,3 @@ endif(SERVERS) if(TOOLS) add_subdirectory(tools) endif(TOOLS) - diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 010a4f9ac43..2339399e022 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -18,6 +18,9 @@ file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h) file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h) file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) +if (SERVERS) + file(GLOB_RECURSE sources_Cryptography Cryptography/*.cpp Cryptography/*.h) +endif (SERVERS) # Manually set sources for Debugging directory as we don't want to include WheatyExceptionReport in common project # It needs to be included both in authserver and worldserver for the static global variable to be properly initialized @@ -28,7 +31,7 @@ file(GLOB sources_localdir *.cpp *.h) if (USE_COREPCH) set(common_STAT_PCH_HDR PrecompiledHeaders/commonPCH.h) set(common_STAT_PCH_SRC PrecompiledHeaders/commonPCH.cpp) -endif () +endif (USE_COREPCH) set(common_STAT_SRCS ${common_STAT_SRCS} @@ -39,58 +42,37 @@ set(common_STAT_SRCS ${sources_Debugging} ${sources_Configuration} ${sources_Logging} + ${sources_Cryptography} ${sources_localdir} ) +# Do NOT add any extra include directory here, as we don't want the common +# library to depend on anything else than TC deps, and itself. +# This way we ensure that if either a PR does that without modifying this file, +# a compile error will be generated, either this file will be modified so it +# is detected more easily. +# While it is OK to include files from other libs as long as they don't require +# linkage (enums, defines...) it is discouraged to do so unless necessary, as it will pullute +# include_directories leading to further unnoticed dependency aditions +# Linker Depencency requirements: none include_directories( ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/utf8cpp - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/src/server/database - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/game/Addons - ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit - ${CMAKE_SOURCE_DIR}/src/server/game/Combat - ${CMAKE_SOURCE_DIR}/src/server/game/Loot - ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous - ${CMAKE_SOURCE_DIR}/src/server/game/Grids - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers - ${CMAKE_SOURCE_DIR}/src/server/game/Maps - ${CMAKE_SOURCE_DIR}/src/server/game/DataStores - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline - ${CMAKE_SOURCE_DIR}/src/server/game/Movement - ${CMAKE_SOURCE_DIR}/src/server/game/Server - ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol - ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_SOURCE_DIR}/src/server/game/Spells - ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Threading - ${CMAKE_CURRENT_SOURCE_DIR}/Debugging ${CMAKE_CURRENT_SOURCE_DIR}/Collision ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Management ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Maps ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Models - ${CMAKE_CURRENT_SOURCE_DIR}/Utilities ${CMAKE_CURRENT_SOURCE_DIR}/Configuration + ${CMAKE_CURRENT_SOURCE_DIR}/Cryptography + ${CMAKE_CURRENT_SOURCE_DIR}/Debugging ${CMAKE_CURRENT_SOURCE_DIR}/Logging + ${CMAKE_CURRENT_SOURCE_DIR}/Utilities + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include + ${CMAKE_SOURCE_DIR}/dep/SFMT + ${CMAKE_SOURCE_DIR}/dep/utf8cpp + ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} ) diff --git a/src/common/Collision/Management/MMapManager.cpp b/src/common/Collision/Management/MMapManager.cpp index c93d4e0e751..a5685c65d9c 100644 --- a/src/common/Collision/Management/MMapManager.cpp +++ b/src/common/Collision/Management/MMapManager.cpp @@ -19,7 +19,7 @@ #include "MMapManager.h" #include "Log.h" #include "Config.h" -#include "SharedDefines.h" +#include "MapDefines.h" namespace MMAP { diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h new file mode 100644 index 00000000000..538a78a38d4 --- /dev/null +++ b/src/common/Collision/Maps/MapDefines.h @@ -0,0 +1,36 @@ +#ifndef _MAPDEFINES_H +#define _MAPDEFINES_H + +#include "Define.h" +#include "DetourNavMesh.h" + +const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP' +#define MMAP_VERSION 5 + +struct MmapTileHeader +{ + uint32 mmapMagic; + uint32 dtVersion; + uint32 mmapVersion; + uint32 size; + bool usesLiquids : 1; + + MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION), + mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) { } +}; + +enum NavTerrain +{ + NAV_EMPTY = 0x00, + NAV_GROUND = 0x01, + NAV_MAGMA = 0x02, + NAV_SLIME = 0x04, + NAV_WATER = 0x08, + NAV_UNUSED1 = 0x10, + NAV_UNUSED2 = 0x20, + NAV_UNUSED3 = 0x40, + NAV_UNUSED4 = 0x80 + // we only have 8 bits +}; + +#endif diff --git a/src/server/shared/Cryptography/ARC4.cpp b/src/common/Cryptography/ARC4.cpp similarity index 100% rename from src/server/shared/Cryptography/ARC4.cpp rename to src/common/Cryptography/ARC4.cpp diff --git a/src/server/shared/Cryptography/ARC4.h b/src/common/Cryptography/ARC4.h similarity index 100% rename from src/server/shared/Cryptography/ARC4.h rename to src/common/Cryptography/ARC4.h diff --git a/src/server/shared/Cryptography/Authentication/AuthCrypt.cpp b/src/common/Cryptography/Authentication/AuthCrypt.cpp similarity index 100% rename from src/server/shared/Cryptography/Authentication/AuthCrypt.cpp rename to src/common/Cryptography/Authentication/AuthCrypt.cpp diff --git a/src/server/shared/Cryptography/Authentication/AuthCrypt.h b/src/common/Cryptography/Authentication/AuthCrypt.h similarity index 100% rename from src/server/shared/Cryptography/Authentication/AuthCrypt.h rename to src/common/Cryptography/Authentication/AuthCrypt.h diff --git a/src/server/shared/Cryptography/BigNumber.cpp b/src/common/Cryptography/BigNumber.cpp similarity index 100% rename from src/server/shared/Cryptography/BigNumber.cpp rename to src/common/Cryptography/BigNumber.cpp diff --git a/src/server/shared/Cryptography/BigNumber.h b/src/common/Cryptography/BigNumber.h similarity index 100% rename from src/server/shared/Cryptography/BigNumber.h rename to src/common/Cryptography/BigNumber.h diff --git a/src/server/shared/Cryptography/HMACSHA1.cpp b/src/common/Cryptography/HMACSHA1.cpp similarity index 100% rename from src/server/shared/Cryptography/HMACSHA1.cpp rename to src/common/Cryptography/HMACSHA1.cpp diff --git a/src/server/shared/Cryptography/HMACSHA1.h b/src/common/Cryptography/HMACSHA1.h similarity index 100% rename from src/server/shared/Cryptography/HMACSHA1.h rename to src/common/Cryptography/HMACSHA1.h diff --git a/src/server/shared/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp similarity index 100% rename from src/server/shared/Cryptography/OpenSSLCrypto.cpp rename to src/common/Cryptography/OpenSSLCrypto.cpp diff --git a/src/server/shared/Cryptography/OpenSSLCrypto.h b/src/common/Cryptography/OpenSSLCrypto.h similarity index 100% rename from src/server/shared/Cryptography/OpenSSLCrypto.h rename to src/common/Cryptography/OpenSSLCrypto.h diff --git a/src/server/shared/Cryptography/SHA1.cpp b/src/common/Cryptography/SHA1.cpp similarity index 100% rename from src/server/shared/Cryptography/SHA1.cpp rename to src/common/Cryptography/SHA1.cpp diff --git a/src/server/shared/Cryptography/SHA1.h b/src/common/Cryptography/SHA1.h similarity index 100% rename from src/server/shared/Cryptography/SHA1.h rename to src/common/Cryptography/SHA1.h diff --git a/src/server/shared/Cryptography/WardenKeyGeneration.h b/src/common/Cryptography/WardenKeyGeneration.h similarity index 100% rename from src/server/shared/Cryptography/WardenKeyGeneration.h rename to src/common/Cryptography/WardenKeyGeneration.h diff --git a/src/server/shared/GitRevision.cpp b/src/common/GitRevision.cpp similarity index 88% rename from src/server/shared/GitRevision.cpp rename to src/common/GitRevision.cpp index 0986e13b68f..d0719c09959 100644 --- a/src/server/shared/GitRevision.cpp +++ b/src/common/GitRevision.cpp @@ -66,3 +66,13 @@ char const* GitRevision::GetProductVersionStr() { return VER_PRODUCTVERSION_STR; } + +char const* GitRevision::GetCompilerCFlags() +{ + return COMPILER_C_FLAGS; +} + +char const* GitRevision::GetCompilerCXXFlags() +{ + return COMPILER_CXX_FLAGS; +} diff --git a/src/server/shared/GitRevision.h b/src/common/GitRevision.h similarity index 94% rename from src/server/shared/GitRevision.h rename to src/common/GitRevision.h index ce941170083..d9b292031f6 100644 --- a/src/server/shared/GitRevision.h +++ b/src/common/GitRevision.h @@ -33,6 +33,8 @@ namespace GitRevision char const* GetLegalCopyrightStr(); char const* GetFileVersionStr(); char const* GetProductVersionStr(); + char const* GetCompilerCFlags(); + char const* GetCompilerCXXFlags(); } #endif diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 5d3daef05d8..e89a33c4376 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -28,4 +28,3 @@ add_subdirectory(game) add_subdirectory(authserver) add_subdirectory(scripts) add_subdirectory(worldserver) - diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index 24a2dc35fce..a8e35a8d9ef 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -43,31 +43,23 @@ endif() include_directories( ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server/database - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/database/Logging - ${CMAKE_SOURCE_DIR}/src/server/database/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Networking - ${CMAKE_SOURCE_DIR}/src/server/shared/Service - ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Authentication ${CMAKE_CURRENT_SOURCE_DIR}/Realms ${CMAKE_CURRENT_SOURCE_DIR}/Server + ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/src/common/ - ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management - ${CMAKE_SOURCE_DIR}/src/common/Collision/Models - ${CMAKE_SOURCE_DIR}/src/common/Debugging - ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/common/Threading ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Debugging ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/shared/Networking + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets + ${CMAKE_SOURCE_DIR}/src/server/shared/Service ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} diff --git a/src/server/database/CMakeLists.txt b/src/server/database/CMakeLists.txt index 3fa7ed10aaf..2375f18d7b5 100644 --- a/src/server/database/CMakeLists.txt +++ b/src/server/database/CMakeLists.txt @@ -8,6 +8,8 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +find_package(MySQL REQUIRED) + if( USE_COREPCH ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() @@ -34,30 +36,29 @@ set(database_STAT_SRCS ${sources_Updater} ) +# Do NOT add any extra include directory unless it does not create unneeded extra dependencies, +# and specially, not add any dependency to neither of these: shared, game, scripts +# This way we ensure that if either a PR does that without modifying this file, +# a compile error will be generated, either this file will be modified so it +# is detected more easily. +# While it is OK to include files from other libs as long as they don't require +# linkage (enums, defines...) it is discouraged to do so unless necessary, as it will pullute +# include_directories leading to further unnoticed dependency aditions +# Linker Depencency requirements: common include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/utf8cpp - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Database - ${CMAKE_CURRENT_SOURCE_DIR}/Logging ${CMAKE_CURRENT_SOURCE_DIR}/Updater + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/process ${CMAKE_SOURCE_DIR}/src/common/ - ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management - ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Configuration ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging ${CMAKE_SOURCE_DIR}/src/common/Threading ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/common/Configuration - ${CMAKE_SOURCE_DIR}/src/common/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared ${MYSQL_INCLUDE_DIR} - ${OPENSSL_INCLUDE_DIR} # seems needed for Windows build + ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} ) diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index ccc69b3ef68..6455e3a7e29 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -103,38 +103,6 @@ set(game_STAT_SRCS ) include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/zlib - ${CMAKE_SOURCE_DIR}/src/common - ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management - ${CMAKE_SOURCE_DIR}/src/common/Collision/Models - ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps - ${CMAKE_SOURCE_DIR}/src/common/Debugging - ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/common/Threading - ${CMAKE_SOURCE_DIR}/src/common/Configuration - ${CMAKE_SOURCE_DIR}/src/common/Logging - ${CMAKE_SOURCE_DIR}/src/server/database - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/database/Logging - ${CMAKE_SOURCE_DIR}/src/server/database/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Networking - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Accounts ${CMAKE_CURRENT_SOURCE_DIR}/Achievements ${CMAKE_CURRENT_SOURCE_DIR}/Addons @@ -155,9 +123,8 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Conditions ${CMAKE_CURRENT_SOURCE_DIR}/DataStores ${CMAKE_CURRENT_SOURCE_DIR}/DungeonFinding - ${CMAKE_CURRENT_SOURCE_DIR}/Entities - ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Creature ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Corpse + ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Creature ${CMAKE_CURRENT_SOURCE_DIR}/Entities/DynamicObject ${CMAKE_CURRENT_SOURCE_DIR}/Entities/GameObject ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Item @@ -167,14 +134,14 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Pet ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Player ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Totem + ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Transport ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Unit ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Vehicle - ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Transport ${CMAKE_CURRENT_SOURCE_DIR}/Events ${CMAKE_CURRENT_SOURCE_DIR}/Globals + ${CMAKE_CURRENT_SOURCE_DIR}/Grids ${CMAKE_CURRENT_SOURCE_DIR}/Grids/Cells ${CMAKE_CURRENT_SOURCE_DIR}/Grids/Notifiers - ${CMAKE_CURRENT_SOURCE_DIR}/Grids ${CMAKE_CURRENT_SOURCE_DIR}/Groups ${CMAKE_CURRENT_SOURCE_DIR}/Guilds ${CMAKE_CURRENT_SOURCE_DIR}/Handlers @@ -184,28 +151,50 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Maps ${CMAKE_CURRENT_SOURCE_DIR}/Miscellaneous ${CMAKE_CURRENT_SOURCE_DIR}/Movement - ${CMAKE_CURRENT_SOURCE_DIR}/Movement/Spline ${CMAKE_CURRENT_SOURCE_DIR}/Movement/MovementGenerators + ${CMAKE_CURRENT_SOURCE_DIR}/Movement/Spline ${CMAKE_CURRENT_SOURCE_DIR}/Movement/Waypoints ${CMAKE_CURRENT_SOURCE_DIR}/OutdoorPvP ${CMAKE_CURRENT_SOURCE_DIR}/Pools - ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders ${CMAKE_CURRENT_SOURCE_DIR}/Quests ${CMAKE_CURRENT_SOURCE_DIR}/Reputation ${CMAKE_CURRENT_SOURCE_DIR}/Scripting - ${CMAKE_CURRENT_SOURCE_DIR}/Server/Protocol ${CMAKE_CURRENT_SOURCE_DIR}/Server + ${CMAKE_CURRENT_SOURCE_DIR}/Server/Protocol ${CMAKE_CURRENT_SOURCE_DIR}/Skills ${CMAKE_CURRENT_SOURCE_DIR}/Spells ${CMAKE_CURRENT_SOURCE_DIR}/Spells/Auras ${CMAKE_CURRENT_SOURCE_DIR}/Texts - ${CMAKE_CURRENT_SOURCE_DIR}/Tools ${CMAKE_CURRENT_SOURCE_DIR}/Tickets + ${CMAKE_CURRENT_SOURCE_DIR}/Tools ${CMAKE_CURRENT_SOURCE_DIR}/Warden ${CMAKE_CURRENT_SOURCE_DIR}/Warden/Modules ${CMAKE_CURRENT_SOURCE_DIR}/Weather ${CMAKE_CURRENT_SOURCE_DIR}/World - ${CMAKE_SOURCE_DIR}/src/server/scripts/PrecompiledHeaders + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include + ${CMAKE_SOURCE_DIR}/dep/zlib + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference + ${CMAKE_SOURCE_DIR}/src/server/shared/Networking + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 06c58a408da..ac16a83e6a7 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -3560,35 +3560,6 @@ enum PartyResult ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 30 }; -const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP' -#define MMAP_VERSION 5 - -struct MmapTileHeader -{ - uint32 mmapMagic; - uint32 dtVersion; - uint32 mmapVersion; - uint32 size; - bool usesLiquids : 1; - - MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION), - mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) { } -}; - -enum NavTerrain -{ - NAV_EMPTY = 0x00, - NAV_GROUND = 0x01, - NAV_MAGMA = 0x02, - NAV_SLIME = 0x04, - NAV_WATER = 0x08, - NAV_UNUSED1 = 0x10, - NAV_UNUSED2 = 0x20, - NAV_UNUSED3 = 0x40, - NAV_UNUSED4 = 0x80 - // we only have 8 bits -}; - enum DiminishingLevels { DIMINISHING_LEVEL_1 = 0, diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h index a9a13c37251..71e0e88f0b2 100644 --- a/src/server/game/Movement/PathGenerator.h +++ b/src/server/game/Movement/PathGenerator.h @@ -19,7 +19,7 @@ #ifndef _PATH_GENERATOR_H #define _PATH_GENERATOR_H -#include "SharedDefines.h" +#include "MapDefines.h" #include "DetourNavMesh.h" #include "DetourNavMeshQuery.h" #include "MoveSplineInitArgs.h" diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index db15ce8c36d..3668a2b0dac 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -43,35 +43,20 @@ message(STATUS "SCRIPT PREPARATION COMPLETE") message("") include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/zlib - ${CMAKE_SOURCE_DIR}/src/server/database - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/database/Logging - ${CMAKE_SOURCE_DIR}/src/server/database/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include ${CMAKE_SOURCE_DIR}/src/common/ ${CMAKE_SOURCE_DIR}/src/common/Collision ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps ${CMAKE_SOURCE_DIR}/src/common/Collision/Models - ${CMAKE_SOURCE_DIR}/src/common/Debugging - ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/common/Threading ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Debugging ${CMAKE_SOURCE_DIR}/src/common/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database/Database ${CMAKE_SOURCE_DIR}/src/server/game/Accounts ${CMAKE_SOURCE_DIR}/src/server/game/Achievements ${CMAKE_SOURCE_DIR}/src/server/game/Addons @@ -85,20 +70,18 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield/Zones ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones - ${CMAKE_SOURCE_DIR}/src/server/game/Calendar ${CMAKE_SOURCE_DIR}/src/server/game/Chat ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels - ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/game/Combat + ${CMAKE_SOURCE_DIR}/src/server/game/Conditions ${CMAKE_SOURCE_DIR}/src/server/game/DataStores ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature ${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject + ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item/Container - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Pet @@ -115,19 +98,16 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Guilds ${CMAKE_SOURCE_DIR}/src/server/game/Handlers ${CMAKE_SOURCE_DIR}/src/server/game/Instances - ${CMAKE_SOURCE_DIR}/src/server/game/LookingForGroup ${CMAKE_SOURCE_DIR}/src/server/game/Loot ${CMAKE_SOURCE_DIR}/src/server/game/Mails - ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous ${CMAKE_SOURCE_DIR}/src/server/game/Maps + ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous ${CMAKE_SOURCE_DIR}/src/server/game/Movement ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/Opcodes ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP ${CMAKE_SOURCE_DIR}/src/server/game/Pools - ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders ${CMAKE_SOURCE_DIR}/src/server/game/Quests ${CMAKE_SOURCE_DIR}/src/server/game/Reputation ${CMAKE_SOURCE_DIR}/src/server/game/Scripting @@ -140,10 +120,13 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Tickets ${CMAKE_SOURCE_DIR}/src/server/game/Tools ${CMAKE_SOURCE_DIR}/src/server/game/Warden - ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules ${CMAKE_SOURCE_DIR}/src/server/game/Weather ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders + ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${MYSQL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} ) diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index 1653d605faa..b43abb60481 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -12,7 +12,6 @@ if( USE_COREPCH ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() -file(GLOB_RECURSE sources_Cryptography Cryptography/*.cpp Cryptography/*.h) file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h) file(GLOB_RECURSE sources_Dynamic Dynamic/*.cpp Dynamic/*.h) file(GLOB_RECURSE sources_Networking Networking/*.cpp Networking/*.h) @@ -33,7 +32,6 @@ endif() set(shared_STAT_SRCS ${shared_STAT_SRCS} - ${sources_Cryptography} ${sources_DataStores} ${sources_Dynamic} ${sources_Networking} @@ -44,32 +42,13 @@ set(shared_STAT_SRCS ) include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/utf8cpp - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server - ${CMAKE_SOURCE_DIR}/src/server/database - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/database/Logging - ${CMAKE_SOURCE_DIR}/src/server/database/Updater - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Cryptography - ${CMAKE_CURRENT_SOURCE_DIR}/DataStores ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic ${CMAKE_CURRENT_SOURCE_DIR}/Networking - ${CMAKE_CURRENT_SOURCE_DIR}/Packets - ${CMAKE_CURRENT_SOURCE_DIR}/Service + ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/src/common/ - ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management - ${CMAKE_SOURCE_DIR}/src/common/Collision/Models ${CMAKE_SOURCE_DIR}/src/common/Debugging - ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/common/Configuration ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Utilities ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index f513ba0857f..78f39e077a1 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -41,72 +41,48 @@ endif() include_directories( ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/gsoap - ${CMAKE_SOURCE_DIR}/dep/sockets/include - ${CMAKE_SOURCE_DIR}/dep/SFMT + ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine + ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess + ${CMAKE_CURRENT_SOURCE_DIR}/TCSoap ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server/database - ${CMAKE_SOURCE_DIR}/src/server/database/Database - ${CMAKE_SOURCE_DIR}/src/server/database/Logging - ${CMAKE_SOURCE_DIR}/src/server/database/Updater + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/gsoap + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include + ${CMAKE_SOURCE_DIR}/src/common/ ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management ${CMAKE_SOURCE_DIR}/src/common/Collision/Models ${CMAKE_SOURCE_DIR}/src/common/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Networking - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Service + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms + ${CMAKE_SOURCE_DIR}/src/server/database/ + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging ${CMAKE_SOURCE_DIR}/src/server/game ${CMAKE_SOURCE_DIR}/src/server/game/Accounts - ${CMAKE_SOURCE_DIR}/src/server/game/Achievements ${CMAKE_SOURCE_DIR}/src/server/game/Addons - ${CMAKE_SOURCE_DIR}/src/server/game/AI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts - ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse - ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse/AuctionHouseBot ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds - ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones - ${CMAKE_SOURCE_DIR}/src/server/game/Calendar ${CMAKE_SOURCE_DIR}/src/server/game/Chat - ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels ${CMAKE_SOURCE_DIR}/src/server/game/Combat ${CMAKE_SOURCE_DIR}/src/server/game/Conditions ${CMAKE_SOURCE_DIR}/src/server/game/DataStores - ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding - ${CMAKE_SOURCE_DIR}/src/server/game/Entities - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse + ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature ${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item/Container ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Pet - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Player - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Totem ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Transport - ${CMAKE_SOURCE_DIR}/src/server/game/Events ${CMAKE_SOURCE_DIR}/src/server/game/Globals - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers ${CMAKE_SOURCE_DIR}/src/server/game/Grids - ${CMAKE_SOURCE_DIR}/src/server/game/Groups - ${CMAKE_SOURCE_DIR}/src/server/game/Guilds + ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells ${CMAKE_SOURCE_DIR}/src/server/game/Handlers ${CMAKE_SOURCE_DIR}/src/server/game/Instances ${CMAKE_SOURCE_DIR}/src/server/game/Loot @@ -114,38 +90,21 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Maps ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous ${CMAKE_SOURCE_DIR}/src/server/game/Movement - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP - ${CMAKE_SOURCE_DIR}/src/server/game/Pools - ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders ${CMAKE_SOURCE_DIR}/src/server/game/Quests - ${CMAKE_SOURCE_DIR}/src/server/game/Reputation ${CMAKE_SOURCE_DIR}/src/server/game/Scripting - ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol ${CMAKE_SOURCE_DIR}/src/server/game/Server - ${CMAKE_SOURCE_DIR}/src/server/game/Skills - ${CMAKE_SOURCE_DIR}/src/server/game/Spells + ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras - ${CMAKE_SOURCE_DIR}/src/server/game/Tools - ${CMAKE_SOURCE_DIR}/src/server/game/Warden - ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules ${CMAKE_SOURCE_DIR}/src/server/game/Weather ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_SOURCE_DIR}/src/server/authserver/Server - ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms - ${CMAKE_SOURCE_DIR}/src/common/ - ${CMAKE_SOURCE_DIR}/src/common/Collision - ${CMAKE_SOURCE_DIR}/src/common/Collision/Management - ${CMAKE_SOURCE_DIR}/src/common/Collision/Models - ${CMAKE_SOURCE_DIR}/src/common/Debugging - ${CMAKE_SOURCE_DIR}/src/common/Utilities - ${CMAKE_SOURCE_DIR}/src/common/Threading - ${CMAKE_SOURCE_DIR}/src/common/Logging - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine - ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess - ${CMAKE_CURRENT_SOURCE_DIR}/TCSoap + ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference + ${CMAKE_SOURCE_DIR}/src/server/shared/Networking + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets + ${CMAKE_SOURCE_DIR}/src/server/shared/Service ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} From f50df728201849ee7185d33c5a061c91e781c8de Mon Sep 17 00:00:00 2001 From: jackpoz Date: Mon, 24 Aug 2015 14:52:03 +0200 Subject: [PATCH 038/110] Scripts/VioletHold: Fix crash in Xevozz boss fight Fix crash happening during Xevozz boss fight caused by passing a local list by reference to a lambda expression Closes #15345 --- .../scripts/Northrend/VioletHold/boss_xevozz.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index 5e3c7014239..93e74aaca71 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -155,19 +155,16 @@ class boss_xevozz : public CreatureScript std::list summonSpells = { 0, 1, 2 }; - auto it = summonSpells.begin(); - std::advance(it, urand(0, summonSpells.size() - 1)); - DoCast(me, EtherealSphereSummonSpells[*it]); - it = summonSpells.erase(it); + uint8 spell = Trinity::Containers::SelectRandomContainerElement(summonSpells); + DoCast(me, EtherealSphereSummonSpells[spell]); + summonSpells.remove(spell); if (IsHeroic()) { - task.Schedule(Milliseconds(2500), [this, &it, &summonSpells](TaskContext /*task*/) + spell = Trinity::Containers::SelectRandomContainerElement(summonSpells); + task.Schedule(Milliseconds(2500), [this, spell](TaskContext /*task*/) { - it = summonSpells.begin(); - std::advance(it, urand(0, summonSpells.size() - 1)); - DoCast(me, EtherealSphereHeroicSummonSpells[*it]); - it = summonSpells.erase(it); + DoCast(me, EtherealSphereHeroicSummonSpells[spell]); }); } From 70f029fd0abf28ce7d1b2c0abc3db7a541d8c448 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Mon, 24 Aug 2015 16:00:38 +0200 Subject: [PATCH 039/110] Core/Unit: Do not remove aura with interrupt flag AURA_INTERRUPT_FLAG_NOT_UNDERWATER when already flying --- src/server/game/Entities/Unit/Unit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4597f18eedb..fdfa62ea78e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3192,7 +3192,7 @@ bool Unit::IsUnderWater() const void Unit::UpdateUnderwaterState(Map* m, float x, float y, float z) { - if (!IsPet() && !IsVehicle()) + if (IsFlying() || (!IsPet() && !IsVehicle())) return; LiquidData liquid_status; From 95bae7143f0f4bb7d5975f8a61daa3c533f48225 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Mon, 24 Aug 2015 22:37:59 +0200 Subject: [PATCH 040/110] Scripts/VioletHold: Fix issue reported by static analysis Coverity defect IDs: 1318019 --- src/server/scripts/Northrend/VioletHold/boss_erekem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index a7de2cab9d5..9b5a75c08b6 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -208,7 +208,7 @@ class boss_erekem : public CreatureScript if (Unit* ally = DoSelectLowestHpFriendly(40.0f)) DoCast(ally, SPELL_CHAIN_HEAL); - task.Repeat(!CheckGuardAlive() ? Seconds(3) : (Seconds(8), Seconds(11))); + task.Repeat(!CheckGuardAlive() ? Seconds(3) : Seconds(8), Seconds(11)); }); scheduler.Schedule(Seconds(2), Seconds(8), [this](TaskContext task) From 5406f82044e7bd6ceb024a67f33c1674400cdc1f Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Tue, 25 Aug 2015 13:20:48 +0200 Subject: [PATCH 041/110] Scripts/VioletHold: Fix correct boss erekem repeat time interval Updates coverity issue #1318019 --- src/server/scripts/Northrend/VioletHold/boss_erekem.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 9b5a75c08b6..cc27bf52118 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -208,7 +208,10 @@ class boss_erekem : public CreatureScript if (Unit* ally = DoSelectLowestHpFriendly(40.0f)) DoCast(ally, SPELL_CHAIN_HEAL); - task.Repeat(!CheckGuardAlive() ? Seconds(3) : Seconds(8), Seconds(11)); + if (!CheckGuardAlive()) + task.Repeat(Seconds(3)); + else + task.Repeat(Seconds(8), Seconds(11)); }); scheduler.Schedule(Seconds(2), Seconds(8), [this](TaskContext task) From e94d03130cb63eb337e82c57610fbb073442d7c6 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Tue, 25 Aug 2015 22:16:00 +0200 Subject: [PATCH 042/110] DB/Creature: Ulduar - Seeping Essence does not deal damage on 10man difficulty By LuqJensen, closes #15165 --- sql/updates/world/2015_08_25_00_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_08_25_00_world.sql diff --git a/sql/updates/world/2015_08_25_00_world.sql b/sql/updates/world/2015_08_25_00_world.sql new file mode 100644 index 00000000000..18619957efe --- /dev/null +++ b/sql/updates/world/2015_08_25_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` = 34098; From f2aa95c3503fe936f08d9fcc3c7f76f8bfcd8b36 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Tue, 25 Aug 2015 22:18:19 +0200 Subject: [PATCH 043/110] DB/Misc: Enable achievement The Culling of Time By sirikfoll. --- sql/updates/world/2015_08_25_01_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_08_25_01_world.sql diff --git a/sql/updates/world/2015_08_25_01_world.sql b/sql/updates/world/2015_08_25_01_world.sql new file mode 100644 index 00000000000..f261acf71e7 --- /dev/null +++ b/sql/updates/world/2015_08_25_01_world.sql @@ -0,0 +1,2 @@ +-- Achievement The Culling of Time +DELETE FROM `disables` WHERE `entry`=7494 AND `sourceType`=4; From 558ce7d877d5a192a98065a5a9eea694b48477b7 Mon Sep 17 00:00:00 2001 From: duhow Date: Sun, 12 Jul 2015 23:59:24 +0200 Subject: [PATCH 044/110] Scripts/Commands: Add taxinodes cheat status to * Some cleanup Closes #15065 --- sql/updates/world/2015_08_26_00_world.sql | 2 ++ src/server/game/Miscellaneous/Language.h | 3 +- src/server/scripts/Commands/cs_cheat.cpp | 41 +++++++++-------------- 3 files changed, 20 insertions(+), 26 deletions(-) create mode 100644 sql/updates/world/2015_08_26_00_world.sql diff --git a/sql/updates/world/2015_08_26_00_world.sql b/sql/updates/world/2015_08_26_00_world.sql new file mode 100644 index 00000000000..2bb55b8bfc7 --- /dev/null +++ b/sql/updates/world/2015_08_26_00_world.sql @@ -0,0 +1,2 @@ +DELETE FROM `trinity_string` WHERE `entry` = 364; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES (364, 'Taxinodes: %s.'); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 63390ad61da..a4ba9866064 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -379,7 +379,8 @@ enum TrinityStrings LANG_COMMAND_CHEAT_POWER = 361, LANG_COMMAND_CHEAT_WW = 362, LANG_COMMAND_WHISPEROFFPLAYER = 363, - // Room for more level 2 364-399 not used + LANG_COMMAND_CHEAT_TAXINODES = 364, + // Room for more level 2 365-399 not used // level 3 chat LANG_SCRIPTS_RELOADED = 400, diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp index 54ae72c3d8a..78ba5a4dc74 100644 --- a/src/server/scripts/Commands/cs_cheat.cpp +++ b/src/server/scripts/Commands/cs_cheat.cpp @@ -24,7 +24,6 @@ EndScriptData */ #include "Chat.h" #include "Language.h" -#include "ObjectMgr.h" #include "Player.h" #include "ScriptMgr.h" @@ -166,8 +165,8 @@ public: { Player* player = handler->GetSession()->GetPlayer(); - const char* enabled = "enabled"; - const char* disabled = "disabled"; + const char* enabled = "ON"; + const char* disabled = "OFF"; handler->SendSysMessage(LANG_COMMAND_CHEAT_STATUS); handler->PSendSysMessage(LANG_COMMAND_CHEAT_GOD, player->GetCommandStatus(CHEAT_GOD) ? enabled : disabled); @@ -175,6 +174,8 @@ public: handler->PSendSysMessage(LANG_COMMAND_CHEAT_CT, player->GetCommandStatus(CHEAT_CASTTIME) ? enabled : disabled); handler->PSendSysMessage(LANG_COMMAND_CHEAT_POWER, player->GetCommandStatus(CHEAT_POWER) ? enabled : disabled); handler->PSendSysMessage(LANG_COMMAND_CHEAT_WW, player->GetCommandStatus(CHEAT_WATERWALK) ? enabled : disabled); + handler->PSendSysMessage(LANG_COMMAND_CHEAT_TAXINODES, player->isTaxiCheater() ? enabled : disabled); + return true; } @@ -186,13 +187,7 @@ public: std::string argstr = (char*)args; if (!*args) - { argstr = (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) ? "off" : "on"; - if (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) - argstr = "off"; - else - argstr = "on"; - } if (argstr == "off") { @@ -214,15 +209,7 @@ public: static bool HandleTaxiCheatCommand(ChatHandler* handler, const char* args) { - if (!*args) - { - handler->SendSysMessage(LANG_USE_BOL); - handler->SetSentErrorMessage(true); - return false; - } - std::string argstr = (char*)args; - Player* chr = handler->getSelectedPlayer(); if (!chr) @@ -230,13 +217,9 @@ public: else if (handler->HasLowerSecurity(chr, ObjectGuid::Empty)) // check online security return false; - if (argstr == "on") + if (!*args) { - chr->SetTaxiCheater(true); - handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str()); - if (handler->needReportToTarget(chr)) - ChatHandler(chr->GetSession()).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str()); - return true; + argstr = (chr->isTaxiCheater()) ? "off" : "on"; } if (argstr == "off") @@ -245,7 +228,14 @@ public: handler->PSendSysMessage(LANG_YOU_REMOVE_TAXIS, handler->GetNameLink(chr).c_str()); if (handler->needReportToTarget(chr)) ChatHandler(chr->GetSession()).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, handler->GetNameLink().c_str()); - + return true; + } + else if (argstr == "on") + { + chr->SetTaxiCheater(true); + handler->PSendSysMessage(LANG_YOU_GIVE_TAXIS, handler->GetNameLink(chr).c_str()); + if (handler->needReportToTarget(chr)) + ChatHandler(chr->GetSession()).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, handler->GetNameLink().c_str()); return true; } @@ -259,10 +249,11 @@ public: if (!*args) return false; + // std::int flag = (char*)args; int flag = atoi((char*)args); Player* chr = handler->getSelectedPlayer(); - if (chr == NULL) + if (!chr) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); From 562e82928f3a57c60bcace69ca73246afc0f1805 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Wed, 26 Aug 2015 22:55:21 +0200 Subject: [PATCH 045/110] Core/Battleground: Fix "Call to Arms: Isle of Conquest!" not giving Holiday Weekend honor --- sql/updates/world/2015_08_26_01_world.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 sql/updates/world/2015_08_26_01_world.sql diff --git a/sql/updates/world/2015_08_26_01_world.sql b/sql/updates/world/2015_08_26_01_world.sql new file mode 100644 index 00000000000..ded18be8a7b --- /dev/null +++ b/sql/updates/world/2015_08_26_01_world.sql @@ -0,0 +1 @@ +UPDATE `game_event_battleground_holiday` SET `bgflag` = 1073741824 WHERE `eventEntry` = 54 ; From c67118f909fee1ed489e3125cb85f3a8179c1a43 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Wed, 26 Aug 2015 22:59:03 +0200 Subject: [PATCH 046/110] Core/Battleground: Fix issue reported by static analysis Coverity defect IDs: 1193415 --- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 8e5766407f1..5bdaf0e661d 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -821,7 +821,8 @@ void BattlegroundMgr::ToggleArenaTesting() void BattlegroundMgr::SetHolidayWeekends(uint32 mask) { - for (uint32 bgtype = 1; bgtype < MAX_BATTLEGROUND_TYPE_ID; ++bgtype) + // The current code supports battlegrounds up to BattlegroundTypeId(31) + for (uint32 bgtype = 1; bgtype < MAX_BATTLEGROUND_TYPE_ID && bgtype < 32; ++bgtype) if (Battleground* bg = GetBattlegroundTemplate(BattlegroundTypeId(bgtype))) bg->SetHoliday((mask & (1 << bgtype)) != 0); } From 494007210202124c51cce3a59f7ecee569ce24be Mon Sep 17 00:00:00 2001 From: jackpoz Date: Thu, 27 Aug 2015 20:41:57 +0200 Subject: [PATCH 047/110] Core/Spells: Skip spell category additional cooldown check added in 43e8c841f5357a6cf41cdb8ed5e496019f14a16a for SPELL_CATEGORY_FOOD. Workaround for #15278 till spell cooldown system properly supports spells with spell category triggering spells with same spell category. Fixes #15278. --- src/server/game/Globals/ObjectMgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index d67d7446d41..42fe92999e9 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2755,7 +2755,8 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Spells[j].SpellId = 0; } - if (spellInfo && itemTemplate.Spells[j].SpellCategory) + if (spellInfo && itemTemplate.Spells[j].SpellCategory + && itemTemplate.Spells[j].SpellCategory != SPELL_CATEGORY_FOOD) { bool added = sSpellsByCategoryStore[itemTemplate.Spells[j].SpellCategory].insert(itemTemplate.Spells[j].SpellId).second; if (added) From 234d0c17d6400fb5d395f3c640846967e4ec2e3a Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Thu, 27 Aug 2015 17:29:54 -0300 Subject: [PATCH 048/110] DB/Conditions: Missing spell target conditions for Kael'thas advisor Ressurection spell --- sql/updates/world/2015_08_27_00_world.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 sql/updates/world/2015_08_27_00_world.sql diff --git a/sql/updates/world/2015_08_27_00_world.sql b/sql/updates/world/2015_08_27_00_world.sql new file mode 100644 index 00000000000..3bc4f9e043b --- /dev/null +++ b/sql/updates/world/2015_08_27_00_world.sql @@ -0,0 +1,10 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 36450; +INSERT INTO `conditions`(`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`,`ConditionValue2`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 36450, 0, 0, 31, 0, 3, 20060, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Lord Sanguinar'), +(13, 1, 36450, 0, 1, 31, 0, 3, 20062, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Grand Astromancer Capernian'), +(13, 1, 36450, 0, 2, 31, 0, 3, 20063, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Master Engineer Telonicus'), +(13, 1, 36450, 0, 3, 31, 0, 3, 20064, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Thaladred the Darkener'), +(13, 2, 36450, 0, 0, 31, 0, 3, 20060, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Lord Sanguinar'), +(13, 2, 36450, 0, 1, 31, 0, 3, 20062, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Grand Astromancer Capernian'), +(13, 2, 36450, 0, 2, 31, 0, 3, 20063, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Master Engineer Telonicus'), +(13, 2, 36450, 0, 3, 31, 0, 3, 20064, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Thaladred the Darkener'); From 5c97594a1691b78ab881437985dc5eeebb31a979 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Thu, 27 Aug 2015 18:52:30 -0300 Subject: [PATCH 049/110] DB/Conditions: Simplify the conditions for Kael'thas Ressurection spell Sorry for the oversight, thanks @joschiwald --- sql/updates/world/2015_08_27_00_world.sql | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/sql/updates/world/2015_08_27_00_world.sql b/sql/updates/world/2015_08_27_00_world.sql index 3bc4f9e043b..a0519693f9e 100644 --- a/sql/updates/world/2015_08_27_00_world.sql +++ b/sql/updates/world/2015_08_27_00_world.sql @@ -1,10 +1,6 @@ DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 36450; INSERT INTO `conditions`(`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`,`ConditionValue2`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES -(13, 1, 36450, 0, 0, 31, 0, 3, 20060, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Lord Sanguinar'), -(13, 1, 36450, 0, 1, 31, 0, 3, 20062, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Grand Astromancer Capernian'), -(13, 1, 36450, 0, 2, 31, 0, 3, 20063, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Master Engineer Telonicus'), -(13, 1, 36450, 0, 3, 31, 0, 3, 20064, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_0 hit only Thaladred the Darkener'), -(13, 2, 36450, 0, 0, 31, 0, 3, 20060, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Lord Sanguinar'), -(13, 2, 36450, 0, 1, 31, 0, 3, 20062, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Grand Astromancer Capernian'), -(13, 2, 36450, 0, 2, 31, 0, 3, 20063, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Master Engineer Telonicus'), -(13, 2, 36450, 0, 3, 31, 0, 3, 20064, 0, 0, 0, '', 'Kael\'thas Ressurection EFFECT_1 hit only Thaladred the Darkener'); +(13, 3, 36450, 0, 0, 31, 0, 3, 20060, 0, 0, 0, '', 'Kael\'thas Ressurection hit only Lord Sanguinar'), +(13, 3, 36450, 0, 1, 31, 0, 3, 20062, 0, 0, 0, '', 'Kael\'thas Ressurection hit only Grand Astromancer Capernian'), +(13, 3, 36450, 0, 2, 31, 0, 3, 20063, 0, 0, 0, '', 'Kael\'thas Ressurection hit only Master Engineer Telonicus'), +(13, 3, 36450, 0, 3, 31, 0, 3, 20064, 0, 0, 0, '', 'Kael\'thas Ressurection hit only Thaladred the Darkener'); From ac2845ee77d0f3e838267ad424fbcf4894040333 Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sat, 29 Aug 2015 00:40:05 +0200 Subject: [PATCH 050/110] Core/Vehicles: Fix CanEnterOrExit by implying that if a vehicle seat have anim for enter/ride means it can be entered/exited even in cases where it lacks VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT flag Fixes issues #13298, #8195, #7468, #1290 --- src/server/game/DataStores/DBCStructure.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 5ccd5d2b7e5..c680494cd72 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -2072,7 +2072,12 @@ struct VehicleSeatEntry uint32 m_flagsB; // 45 // 46-57 added in 3.1, floats mostly - bool CanEnterOrExit() const { return (m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0; } + bool CanEnterOrExit() const + { + return ((m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0 || + //If it has anmation for enter/ride, means it can be entered/exited by logic + (m_flags & (VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_ENTER | VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_RIDE)) != 0); + } bool CanSwitchFromSeat() const { return (m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH) != 0; } bool IsUsableByOverride() const { return (m_flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18) || (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | From e27588fdbaf79e949829d8480813360e5f4edb35 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 29 Aug 2015 01:25:37 +0200 Subject: [PATCH 051/110] DB/quest: The Ancient Armor of the Kvaldir closes #11154 Vehicle issue fixed on #15376 By @StormBytePP --- sql/updates/world/2015_08_29_00_world.sql | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 sql/updates/world/2015_08_29_00_world.sql diff --git a/sql/updates/world/2015_08_29_00_world.sql b/sql/updates/world/2015_08_29_00_world.sql new file mode 100644 index 00000000000..59bf0e2bfcf --- /dev/null +++ b/sql/updates/world/2015_08_29_00_world.sql @@ -0,0 +1,37 @@ +-- +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (32682, 27932); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (32682, 27932) AND `source_type`=0; +UPDATE `creature_template` SET `InhabitType`=4, `speed_run`=2.5 WHERE `entry` IN (32682, 27932); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(32682, 0, 0, 0, 27, 0, 100, 1, 0, 0, 0, 0, 53, 1, 32682, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,0,'Harry''s Bomber- On passeger rided - Start wp'), +(27932, 0, 0, 0, 27, 0, 100, 1, 0, 0, 0, 0, 53, 1, 27932, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,0,'Harry''s Bomber- On passeger rided - Start wp'), +(32682, 0, 1, 0, 58, 0, 100, 1, 9, 32682, 0, 0, 11, 50630, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,0,'Harry''s Bomber- On waypoint ended - Eject passengers'), +(27932, 0, 1, 0, 58, 0, 100, 1, 9, 27932, 0, 0, 11, 50630, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,0,'Harry''s Bomber- On passeger ended - Eject passengers'); + +UPDATE `smart_scripts` SET `action_type`=85 WHERE `entryorguid`=28277 AND `source_type`=0 AND `id`=0; +DELETE FROM `waypoints` WHERE `entry` IN (32682, 27932); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(32682, 1, 61.83957, -6228.992, 19.07242, 'Harry''s Bomber'), +(32682, 2, -64.6518, -5908.95, 29.8502, 'Harry''s Bomber'), +(32682, 3, -158.0859, -5631.193, 29.8502, 'Harry''s Bomber'), +(32682, 4, -436.5865, -5223.862, 32.1002, 'Harry''s Bomber'), +(32682, 5, -412.989, -5012.779, 45.7391, 'Harry''s Bomber'), +(32682, 6, -75.09814, -4341.288, 64.29379, 'Harry''s Bomber'), +(32682, 7, -51.86116, -4023.003, 70.12712, 'Harry''s Bomber'), +(32682, 8, -136.1673, -3716.832, 59.96046, 'Harry''s Bomber'), +(32682, 9, -170.8945, -3578.378, 4.988236, 'Harry''s Bomber'), +(27932, 1, -136.1673, -3716.832, 59.96046, 'Harry''s Bomber'), +(27932, 2, -51.86116, -4023.003, 70.12712, 'Harry''s Bomber'), +(27932, 3, -75.09814, -4341.288, 64.29379, 'Harry''s Bomber'), +(27932, 4, -412.989, -5012.779, 45.7391, 'Harry''s Bomber'), +(27932, 5, -436.5865, -5223.862, 32.1002, 'Harry''s Bomber'), +(27932, 6, -158.0859, -5631.193, 29.8502, 'Harry''s Bomber'), +(27932, 7, -64.6518, -5908.95, 29.8502, 'Harry''s Bomber'), +(27932, 8, 61.83957, -6228.992, 19.07242, 'Harry''s Bomber'), +(27932, 9, 89.63259, -6287.430, -0.739605, 'Harry''s Bomber'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=10218; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`Scriptname`,`Comment`) VALUES +(15,10218,0,0,0,23,0,495,0,0,0,0 ,'' , 'Harry''s Bomber - Show gossip option if the npc is in the area 495'), +(15,10218,0,0,0,9,0,11567,0,0,0,0 ,'' , 'Harry''s Bomber - Show gossip option if player has taken quest 11567'), +(15,10218,0,0,1,28,0,11567,0,0,0,0 ,'' , 'Harry''s Bomber - Show gossip option if player has quest 11567 completed'); From 4ada913d02bb5376914e46843873b3285116154f Mon Sep 17 00:00:00 2001 From: StormBytePP Date: Sat, 29 Aug 2015 02:35:17 +0200 Subject: [PATCH 052/110] Core/Unit: Prevent AoE damage to have effect in some cases when faction is unfriendly but they don't attack you and you don't have at war enabled (Example, Sporaggar faction) Fixes #15374 --- src/server/game/Entities/Unit/Unit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index fdfa62ea78e..d02a22d43f4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11947,9 +11947,9 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo || target->GetReactionTo(this) > REP_NEUTRAL) return false; - // Not all neutral creatures can be attacked + // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar) if (GetReactionTo(target) == REP_NEUTRAL && - target->GetReactionTo(this) == REP_NEUTRAL) + target->GetReactionTo(this) <= REP_NEUTRAL) { if (!(target->GetTypeId() == TYPEID_PLAYER && GetTypeId() == TYPEID_PLAYER) && !(target->GetTypeId() == TYPEID_UNIT && GetTypeId() == TYPEID_UNIT)) From 2b21fbb58e6b213cf26706dd0dd368b2ea4a92b3 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sat, 29 Aug 2015 16:23:09 +0200 Subject: [PATCH 053/110] Scripts/Ulduar: fixed sara get killed by guardians of yogg saron --- .../Northrend/Ulduar/Ulduar/boss_hodir.cpp | 4 ++-- .../Ulduar/Ulduar/boss_yogg_saron.cpp | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 5b04e4bb0f7..4b60107a182 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -396,8 +396,8 @@ class boss_hodir : public CreatureScript me->SetControlled(true, UNIT_STATE_STUNNED); me->CombatStop(true); - DoCastAOE(SPELL_KILL_CREDIT); /// need to be cast before changing boss faction - /// spell will target enemies only + DoCastAOE(SPELL_KILL_CREDIT, true); /// need to be cast before changing boss faction + /// spell will target enemies only me->setFaction(35); me->DespawnOrUnsummon(10000); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 48f28077e00..59c28cd3a5a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -696,19 +696,22 @@ class boss_sara : public CreatureScript void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (_events.IsInPhase(PHASE_ONE) && damage >= me->GetHealth()) + if (damage >= me->GetHealth()) { - damage = 0; + damage = me->GetHealth() - 1; - if (Creature* voice = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VOICE_OF_YOGG_SARON))) - voice->AI()->DoAction(ACTION_PHASE_TRANSFORM); + if (_events.IsInPhase(PHASE_ONE)) + { + if (Creature* voice = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VOICE_OF_YOGG_SARON))) + voice->AI()->DoAction(ACTION_PHASE_TRANSFORM); - Talk(SAY_SARA_TRANSFORM_1); - _events.SetPhase(PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_1, 4700, 0, PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_2, 9500, 0, PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_3, 14300, 0, PHASE_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_4, 14500, 0, PHASE_TRANSFORM); + Talk(SAY_SARA_TRANSFORM_1); + _events.SetPhase(PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_1, 4700, 0, PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_2, 9500, 0, PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_3, 14300, 0, PHASE_TRANSFORM); + _events.ScheduleEvent(EVENT_TRANSFORM_4, 14500, 0, PHASE_TRANSFORM); + } } } From bc67016e7bfe8ffcd7220897c44e4d49d1392834 Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Sat, 29 Aug 2015 17:16:51 +0200 Subject: [PATCH 054/110] DB/World schema backport: sort quest_template fields 6.x style --- sql/updates/world/2015_08_29_01_world_335.sql | 28 +++++++++++++++++++ src/server/game/Globals/ObjectMgr.cpp | 14 ++++------ src/server/game/Quests/QuestDef.cpp | 28 +++++++++---------- 3 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 sql/updates/world/2015_08_29_01_world_335.sql diff --git a/sql/updates/world/2015_08_29_01_world_335.sql b/sql/updates/world/2015_08_29_01_world_335.sql new file mode 100644 index 00000000000..c2454f69c0c --- /dev/null +++ b/sql/updates/world/2015_08_29_01_world_335.sql @@ -0,0 +1,28 @@ +-- RewardItem(s) and RewardAmount(s) [4x2 fields] +ALTER TABLE `quest_template` + CHANGE COLUMN `RewardAmount1` `RewardAmount1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardItem1`, + CHANGE COLUMN `RewardAmount2` `RewardAmount2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardItem2`, + CHANGE COLUMN `RewardAmount3` `RewardAmount3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardItem3`, + CHANGE COLUMN `RewardAmount4` `RewardAmount4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardItem4`; + +-- RewardChoiceItemID(s) and RewardChoiceItemQuantity(s) [6x2 fields] +ALTER TABLE `quest_template` + CHANGE COLUMN `RewardChoiceItemQuantity1` `RewardChoiceItemQuantity1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemID1`, + CHANGE COLUMN `RewardChoiceItemQuantity2` `RewardChoiceItemQuantity2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemID2`, + CHANGE COLUMN `RewardChoiceItemQuantity3` `RewardChoiceItemQuantity3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemID3`, + CHANGE COLUMN `RewardChoiceItemQuantity4` `RewardChoiceItemQuantity4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemID4`, + CHANGE COLUMN `RewardChoiceItemQuantity5` `RewardChoiceItemQuantity5` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemID5`, + CHANGE COLUMN `RewardChoiceItemQuantity6` `RewardChoiceItemQuantity6` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemID6`; + +-- RewardFactionID(s), RewardFactionValue(s) and RewardFactionOverride(s) [5x3 fields] +ALTER TABLE `quest_template` + CHANGE COLUMN `RewardFactionValue1` `RewardFactionValue1` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionID1`, + CHANGE COLUMN `RewardFactionOverride1` `RewardFactionOverride1` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionValue1`, + CHANGE COLUMN `RewardFactionValue2` `RewardFactionValue2` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionID2`, + CHANGE COLUMN `RewardFactionOverride2` `RewardFactionOverride2` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionValue2`, + CHANGE COLUMN `RewardFactionValue3` `RewardFactionValue3` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionID3`, + CHANGE COLUMN `RewardFactionOverride3` `RewardFactionOverride3` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionValue3`, + CHANGE COLUMN `RewardFactionValue4` `RewardFactionValue4` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionID4`, + CHANGE COLUMN `RewardFactionOverride4` `RewardFactionOverride4` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionValue4`, + CHANGE COLUMN `RewardFactionValue5` `RewardFactionValue5` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionID5`, + CHANGE COLUMN `RewardFactionOverride5` `RewardFactionOverride5` MEDIUMINT(8) NOT NULL DEFAULT '0' AFTER `RewardFactionValue5`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index d67d7446d41..3cb818eeac0 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3973,14 +3973,12 @@ void ObjectMgr::LoadQuests() "NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, " // 21 22 23 24 25 26 "SourceItemId, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, " - // 27 28 29 30 31 32 33 34 - "RewardItem1, RewardItem2, RewardItem3, RewardItem4, RewardAmount1, RewardAmount2, RewardAmount3, RewardAmount4, " - // 35 36 37 38 39 40 41 42 43 44 45 46 - "RewardChoiceItemID1, RewardChoiceItemID2, RewardChoiceItemID3, RewardChoiceItemID4, RewardChoiceItemID5, RewardChoiceItemID6, RewardChoiceItemQuantity1, RewardChoiceItemQuantity2, RewardChoiceItemQuantity3, RewardChoiceItemQuantity4, RewardChoiceItemQuantity5, RewardChoiceItemQuantity6, " - // 47 48 49 50 51 52 53 54 55 56 - "RewardFactionID1, RewardFactionID2, RewardFactionID3, RewardFactionID4, RewardFactionID5, RewardFactionValue1, RewardFactionValue2, RewardFactionValue3, RewardFactionValue4, RewardFactionValue5, " - // 57 58 59 60 61 - "RewardFactionOverride1, RewardFactionOverride2, RewardFactionOverride3, RewardFactionOverride4, RewardFactionOverride5, " + // 27 28 29 30 31 32 33 34 + "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, " + // 35 36 37 38 39 40 41 42 43 44 45 46 + "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, " + // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 + "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5," // 62 63 64 65 "PointMapId, PointX, PointY, PointOption, " // 66 67 68 69 70 71 72 diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index d1dcfd0f693..4582c93b673 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -51,25 +51,23 @@ Quest::Quest(Field* questRecord) RewardArenaPoints = questRecord[26].GetUInt16(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewardItemId[i] = questRecord[27+i].GetUInt32(); - - for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewardItemIdCount[i] = questRecord[31+i].GetUInt16(); + { + RewardItemId[i] = questRecord[27+i*2].GetUInt32(); + RewardItemIdCount[i] = questRecord[28+i*2].GetUInt16(); + } for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewardChoiceItemId[i] = questRecord[35+i].GetUInt32(); - - for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewardChoiceItemCount[i] = questRecord[41+i].GetUInt16(); + { + RewardChoiceItemId[i] = questRecord[35+i*2].GetUInt32(); + RewardChoiceItemCount[i] = questRecord[36+i*2].GetUInt16(); + } for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionId[i] = questRecord[47+i].GetUInt16(); - - for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionValueId[i] = questRecord[52+i].GetInt32(); - - for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionValueIdOverride[i] = questRecord[57+i].GetInt32(); + { + RewardFactionId[i] = questRecord[47+i*3].GetUInt16(); + RewardFactionValueId[i] = questRecord[48+i*3].GetInt32(); + RewardFactionValueIdOverride[i] = questRecord[49+i*3].GetInt32(); + } PointMapId = questRecord[62].GetUInt16(); PointX = questRecord[63].GetFloat(); From 64959cd9d0ba9c1f8f62cedd09eb4fdcb81e2d8a Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 29 Aug 2015 18:10:20 +0200 Subject: [PATCH 055/110] DB/Misc: Add missing spawns on Howling Fjord Improve some vehicles behavior Improve some SAI Thanks to @Pitcrawler for the scripts --- sql/updates/world/2015_08_29_01_world.sql | 104 ++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 sql/updates/world/2015_08_29_01_world.sql diff --git a/sql/updates/world/2015_08_29_01_world.sql b/sql/updates/world/2015_08_29_01_world.sql new file mode 100644 index 00000000000..05aa1774d18 --- /dev/null +++ b/sql/updates/world/2015_08_29_01_world.sql @@ -0,0 +1,104 @@ +-- +DELETE FROM `creature_template_addon` WHERE `entry` IN (30477, 30487); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(30477, 0, 0, 33554432, 0, 0, '55971'), +(30487, 0, 0, 33554432, 0, 0, '55971'); +UPDATE `creature_template` SET `vehicleid`=110 WHERE `entry`=28192; +UPDATE `creature_template` SET `Inhabittype`=4 WHERE `entry`=24767; + +UPDATE `creature_template` SET `InhabitType`=4, `speed_run`=2.14286, `unit_flags`=33288 WHERE `entry`=27923; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (27923) AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(27923,0,0,0,54,0,100,0,0,0,0,0,1,0,2000,0,0,0,0,7,0,0,0,0,0,0,0,'Lou the Cabin Boy - On summon - Say line'), +(27923,0,1,0,52,0,100,0,0,27923,0,0,53,1,27923,0,0,0,0,1,0,0,0,0,0,0,0,'Lou the Cabin Boy - On text over - Start WP movement'), +(27923,0,3,0,40,0,100,0,13,27923,0,0,1,1,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Lou the Cabin Boy - On WP 13 reached - Say line'), +(27923,0,4,0,52,0,100,0,1,27923,0,0,28,46598,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lou the Cabin Boy - On text over - Remove aura Ride Vehicle Hardcoded'); + +DELETE FROM `creature_template_addon` WHERE `entry`=23982; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(23982,0,0,1,0,0,'29266'); + +SET @CGUID=88474; +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+11; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@CGUID+0,0,0,1,0,0,'45319'), +(@CGUID+1,0,0,1,0,0,'45319'), +(@CGUID+2,0,0,1,0,0,'45319'), +(@CGUID+3,0,0,1,0,0,'45319'), +(@CGUID+4,0,0,1,0,0,'45319'), +(@CGUID+5,0,0,1,0,0,'45319'), +(@CGUID+6,0,0,1,0,0,'45319'), +(@CGUID+7,0,0,1,0,0,'45319'), +(@CGUID+8,0,0,1,0,0,'45319'), +(@CGUID+9,0,0,1,0,0,'45319'), +(@CGUID+10,0,0,1,0,0,'45319'), +(@CGUID+11,0,0,1,0,0,'45319'); + +DELETE FROM `creature` WHERE `id`=23982; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+64; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@CGUID+0,23033,571,1,1,0,0,121.0426,-6350.602,0.2506703,0.2617994,300,0,0,42,0,0,0,0,0), +(@CGUID+1,23033,571,1,1,0,0,105.1841,-6356.575,7.529881,2.234021,300,0,0,42,0,0,0,0,0), +(@CGUID+2,23033,571,1,1,0,0,122.4542,-6349.216,13.51903,0.06981317,300,0,0,42,0,0,0,0,0), +(@CGUID+3,23033,571,1,1,0,0,137.363,-6341.455,0.6397853,4.712389,300,0,0,42,0,0,0,0,0), +(@CGUID+4,23033,571,1,1,0,0,134.3599,-6343.983,18.43672,4.13643,300,0,0,42,0,0,0,0,0), +(@CGUID+5,23033,571,1,1,0,0,132.2583,-6350.229,0.2506703,0.9075712,300,0,0,42,0,0,0,0,0), +(@CGUID+6,23033,571,1,1,0,0,126.0219,-6359.624,13.29924,0.8552113,300,0,0,42,0,0,0,0,0), +(@CGUID+7,23033,571,1,1,0,0,100.9148,-6372.519,0.2711143,1.850049,300,0,0,42,0,0,0,0,0), +(@CGUID+8,23033,571,1,1,0,0,112.8128,-6370.394,0.2509333,5.323254,300,0,0,42,0,0,0,0,0), +(@CGUID+9,23033,571,1,1,0,0,108.9089,-6372.98,7.581032,1.151917,300,0,0,42,0,0,0,0,0), +(@CGUID+10,23033,571,1,1,0,0,102.7771,-6374.673,18.44771,1.48353,300,0,0,42,0,0,0,0,0), +(@CGUID+11,23033,571,1,1,0,0,102.7771,-6374.673,18.44771,1.48353,300,0,0,42,0,0,0,0,0), +(@CGUID+12,23982,571,1,1,0,0,86.46146,-6311.128,3.060588,4.537856,300,0,0,20958,0,0,0,0,0), +(@CGUID+13,23982,571,1,1,0,0,90.35403,-6339.574,7.16617,4.712389,300,0,0,20958,0,0,0,0,0), +(@CGUID+14,23982,571,1,1,0,0,83.55727,-6293.268,2.560132,5.270895,300,0,0,20958,0,0,0,0,0), +(@CGUID+15,23982,571,1,1,0,0,97.12625,-6329.794,6.238928,5.375614,300,0,0,20958,0,0,0,0,0), +(@CGUID+16,23982,571,1,1,0,0,70.93034,-6330.428,3.54416,2.844887,300,0,0,20958,0,0,0,0,0), +(@CGUID+17,23982,571,1,1,0,0,51.70757,-6311.947,3.161455,5.77704,300,0,0,20958,0,0,0,0,0), +(@CGUID+18,23982,571,1,1,0,0,98.56985,-6344.554,7.688509,2.86234,300,0,0,20958,0,0,0,0,0), +(@CGUID+19,23982,571,1,1,0,0,131.832,-6340.606,12.63307,0.8203048,300,0,0,20958,0,0,0,0,0), +(@CGUID+20,23982,571,1,1,0,0,129.1864,-6345.83,0.2506703,5.5676,300,0,0,20958,0,0,0,0,0), +(@CGUID+21,23982,571,1,1,0,0,120.3932,-6350.105,13.38886,4.153883,300,0,0,20958,0,0,0,0,0), +(@CGUID+22,23982,571,1,1,0,0,104.8288,-6357.471,7.574474,5.235988,300,0,0,20958,0,0,0,0,0), +(@CGUID+23,23982,571,1,1,0,0,133.6459,-6343.107,18.42958,1.48353,300,0,0,20958,0,0,0,0,0), +(@CGUID+24,23982,571,1,1,0,0,138.9828,-6343.52,0.6380893,2.792527,300,0,0,20958,0,0,0,0,0), +(@CGUID+25,23982,571,1,1,0,0,129.1845,-6351.269,0.2506703,3.490659,300,0,0,20958,0,0,0,0,0), +(@CGUID+26,23982,571,1,1,0,0,119.9491,-6359.686,13.22697,5.201081,300,0,0,20958,0,0,0,0,0), +(@CGUID+27,23982,571,1,1,0,0,115.4752,-6363.241,0.2506703,2.408554,300,0,0,20958,0,0,0,0,0), +(@CGUID+28,23982,571,1,1,0,0,103.771,-6368.571,0.2564183,2.094395,300,0,0,20958,0,0,0,0,0), +(@CGUID+29,23982,571,1,1,0,0,110.5545,-6371.233,7.581059,1.27409,300,0,0,20958,0,0,0,0,0), +(@CGUID+30,23982,571,1,1,0,0,100.0265,-6375.111,18.99801,2.600541,300,0,0,20958,0,0,0,0,0), +(@CGUID+31,23982,571,1,1,0,0,96.01752,-6378.461,4.325503,5.532694,300,0,0,20958,0,0,0,0,0), +(@CGUID+32, 23982, 571, 1, 1, 0, 0, 1545.82, -6573.38, 13.7573, 0.366519, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+33, 23982, 571, 1, 1, 0, 0, 1555.81, -6473.45, 8.12772, 1.8326, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+34, 23982, 571, 1, 1, 0, 0, 1556.01, -6468.7, 1.18524, 0.296706, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+35, 23982, 571, 1, 1, 0, 0, 1557.06, -6466.08, 19.1378, 0.191986, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+36, 23982, 571, 1, 1, 0, 0, 1560.88, -6554.92, 7.85555, 4.7822, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+37, 23982, 571, 1, 1, 0, 0, 1562.99, -6467.94, 11.5577, 0.872665, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+38, 23982, 571, 1, 1, 0, 0, 1566.2, -6453.87, 8.1297, 5.20108, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+39, 23982, 571, 1, 1, 0, 0, 1569.21, -6459.58, 0.798187, 0.959931, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+40, 23982, 571, 1, 1, 0, 0, 1571.11, -6554.08, 19.5447, 4.2237, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+41, 23982, 571, 1, 1, 0, 0, 1571.94, -6444.88, 13.4798, 4.64258, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+42, 23982, 571, 1, 1, 0, 0, 1572.78, -6465.26, 13.9275, 2.02458, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+43, 23982, 571, 1, 1, 0, 0, 1585.26, -6439.69, 8.1282, 5.74213, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+44, 23982, 571, 1, 1, 0, 0, 1585.64, -6442.62, 0.80031, 0.907571, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+45, 23982, 571, 1, 1, 0, 0, 1592.84, -6430.96, 20.0984, 4.57276, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+46, 23982, 571, 1, 1, 0, 0, 1595.97, -6429.72, 4.87117, 5.88176, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+47, 23982, 571, 1, 1, 0, 0, 1608.47, -6469.64, 11.9444, 2.3911, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+48, 23982, 571, 1, 1, 0, 0, 1633.75, -6476.69, 5.27008, 3.26377, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+49, 23982, 571, 1, 1, 0, 0, 1641.51, -6496.98, 19.3894, 2.49582, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+50, 23982, 571, 1, 1, 0, 0, 1648.43, -6518.75, 7.92241, 2.6529, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+51, 23982, 571, 1, 1, 0, 0, 1648.63, -6515.61, 0.981542, 0.0349066, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+52, 23982, 571, 1, 1, 0, 0, 1654.91, -6506.14, 16.7789, 0.734061, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+53, 23982, 571, 1, 1, 0, 0, 1659.26, -6516.77, 12.9779, 1.02974, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+54, 23982, 571, 1, 1, 0, 0, 1660.06, -6516.17, 18.1532, 0.401426, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+55, 23982, 571, 1, 1, 0, 0, 1661.93, -6510.17, 0.595421, 1.41372, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+56, 23982, 571, 1, 1, 0, 0, 1664.66, -6497.61, 7.92616, 0.349066, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+57, 23982, 571, 1, 1, 0, 0, 1667.07, -6513.15, 7.92516, 1.44862, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+58, 23982, 571, 1, 1, 0, 0, 1667.19, -6503.34, 13.7694, 4.50295, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+59, 23982, 571, 1, 1, 0, 0, 1676.57, -6488.01, 7.84255, 0.599511, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+60, 23982, 571, 1, 1, 0, 0, 1678.84, -6484.38, 7.92603, 5.16617, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+61, 23982, 571, 1, 1, 0, 0, 1680.69, -6489.71, 15.3545, 4.69494, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+62, 23982, 571, 1, 1, 0, 0, 1683.73, -6489.54, 0.600268, 3.38594, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+63, 23982, 571, 1, 1, 0, 0, 1693.21, -6481.45, 20.3186, 4.32842, 300, 0, 0, 20958, 0, 0, 0,0,0), +(@CGUID+64, 23982, 571, 1, 1, 0, 0, 1693.28, -6480.37, 4.67026, 2.49582, 300, 0, 0, 20958, 0, 0, 0,0,0); From 05429b35937b02ef1f191a39d2654a68ab5c4241 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sat, 29 Aug 2015 18:19:53 +0200 Subject: [PATCH 056/110] Scripts/BWL: cleanup instancescript --- .../BlackwingLair/blackwing_lair.h | 41 +-- .../boss_broodlord_lashlayer.cpp | 8 +- .../BlackwingLair/boss_chromaggus.cpp | 7 +- .../BlackwingLair/boss_ebonroc.cpp | 7 +- .../BlackwingLair/boss_firemaw.cpp | 7 +- .../BlackwingLair/boss_flamegor.cpp | 7 +- .../BlackwingLair/boss_nefarian.cpp | 6 +- .../BlackwingLair/boss_razorgore.cpp | 4 +- .../BlackwingLair/boss_vaelastrasz.cpp | 2 +- .../BlackwingLair/instance_blackwing_lair.cpp | 233 +++++++----------- 10 files changed, 123 insertions(+), 199 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index c79a57d0746..12798833a3f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -25,14 +25,18 @@ uint32 const EncounterCount = 8; enum BWLEncounter { - BOSS_RAZORGORE = 0, - BOSS_VAELASTRAZ = 1, - BOSS_BROODLORD = 2, - BOSS_FIREMAW = 3, - BOSS_EBONROC = 4, - BOSS_FLAMEGOR = 5, - BOSS_CHROMAGGUS = 6, - BOSS_NEFARIAN = 7 + // Encounter States/Boss GUIDs + DATA_RAZORGORE_THE_UNTAMED = 0, + DATA_VAELASTRAZ_THE_CORRUPT = 1, + DATA_BROODLORD_LASHLAYER = 2, + DATA_FIREMAW = 3, + DATA_EBONROC = 4, + DATA_FLAMEGOR = 5, + DATA_CHROMAGGUS = 6, + DATA_NEFARIAN = 7, + + // Additional Data + DATA_LORD_VICTOR_NEFARIUS = 8 }; enum CreatureIds @@ -44,7 +48,7 @@ enum CreatureIds NPC_BLACKWING_WARLOCK = 12459, NPC_VAELASTRAZ = 13020, NPC_BROODLORD = 12017, - NPC_FIRENAW = 11983, + NPC_FIREMAW = 11983, NPC_EBONROC = 14601, NPC_FLAMEGOR = 11981, NPC_CHROMAGGUS = 14020, @@ -52,17 +56,14 @@ enum CreatureIds NPC_NEFARIAN = 11583 }; -enum BWLData64 +enum GameObjectIds { - DATA_RAZORGORE_THE_UNTAMED = 1, - DATA_VAELASTRAZ_THE_CORRUPT, - DATA_BROODLORD_LASHLAYER, - DATA_FIRENAW, - DATA_EBONROC, - DATA_FLAMEGOR, - DATA_CHROMAGGUS, - DATA_LORD_VICTOR_NEFARIUS, - DATA_NEFARIAN + GO_BLACK_DRAGON_EGG = 177807, + GO_BOSSGATE01 = 175946, + GO_DRAKE_RIDER_PORTCULLIS = 175185, + GO_ALTERAC_VALLEY_GATE = 180424, + GO_GATE = 185483, + GO_VACCUUM_EXIT_GATE = 181125 }; enum BWLEvents @@ -79,4 +80,4 @@ enum BWLMisc DATA_EGG_EVENT }; -#endif \ No newline at end of file +#endif diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp index 2609cf5fdf8..5ba933005ec 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp @@ -50,16 +50,10 @@ public: struct boss_broodlordAI : public BossAI { - boss_broodlordAI(Creature* creature) : BossAI(creature, BOSS_BROODLORD) { } + boss_broodlordAI(Creature* creature) : BossAI(creature, DATA_BROODLORD_LASHLAYER) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_VAELASTRAZ) != DONE) - { - EnterEvadeMode(); - return; - } - _EnterCombat(); Talk(SAY_AGGRO); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 61d6c052cdf..9a49b96e68e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -71,7 +71,7 @@ public: struct boss_chromaggusAI : public BossAI { - boss_chromaggusAI(Creature* creature) : BossAI(creature, BOSS_CHROMAGGUS) + boss_chromaggusAI(Creature* creature) : BossAI(creature, DATA_CHROMAGGUS) { Initialize(); @@ -193,11 +193,6 @@ public: void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_FLAMEGOR) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHIMMER, 0); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index 8bd3ae0ebce..7a7e30f7913 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -41,15 +41,10 @@ public: struct boss_ebonrocAI : public BossAI { - boss_ebonrocAI(Creature* creature) : BossAI(creature, BOSS_EBONROC) { } + boss_ebonrocAI(Creature* creature) : BossAI(creature, DATA_EBONROC) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp index e41153796e5..3dcdbfe01df 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp @@ -41,15 +41,10 @@ public: struct boss_firemawAI : public BossAI { - boss_firemawAI(Creature* creature) : BossAI(creature, BOSS_FIREMAW) { } + boss_firemawAI(Creature* creature) : BossAI(creature, DATA_FIREMAW) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp index 011c695b61f..20e69211da2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp @@ -46,15 +46,10 @@ public: struct boss_flamegorAI : public BossAI { - boss_flamegorAI(Creature* creature) : BossAI(creature, BOSS_FLAMEGOR) { } + boss_flamegorAI(Creature* creature) : BossAI(creature, DATA_FLAMEGOR) { } void EnterCombat(Unit* /*who*/) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } _EnterCombat(); events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 1ff18b845a1..51e1bf67f16 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -166,7 +166,7 @@ public: struct boss_victor_nefariusAI : public BossAI { - boss_victor_nefariusAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) + boss_victor_nefariusAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { Initialize(); } @@ -394,7 +394,7 @@ public: struct boss_nefarianAI : public BossAI { - boss_nefarianAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) + boss_nefarianAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { Initialize(); } @@ -458,7 +458,7 @@ public: { if (canDespawn && DespawnTimer <= diff) { - instance->SetBossState(BOSS_NEFARIAN, FAIL); + instance->SetBossState(DATA_NEFARIAN, FAIL); std::list constructList; me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 8d660fc17d1..1d66964ce6b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -68,7 +68,7 @@ public: struct boss_razorgoreAI : public BossAI { - boss_razorgoreAI(Creature* creature) : BossAI(creature, BOSS_RAZORGORE) + boss_razorgoreAI(Creature* creature) : BossAI(creature, DATA_RAZORGORE_THE_UNTAMED) { Initialize(); } @@ -175,7 +175,7 @@ public: { if (InstanceScript* instance = go->GetInstanceScript()) if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razor = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_RAZORGORE_THE_UNTAMED))) + if (Creature* razor = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) { razor->Attack(player, true); player->CastSpell(razor, SPELL_MINDCONTROL); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 0a2a245ece6..636554a0ae4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -68,7 +68,7 @@ public: struct boss_vaelAI : public BossAI { - boss_vaelAI(Creature* creature) : BossAI(creature, BOSS_VAELASTRAZ) + boss_vaelAI(Creature* creature) : BossAI(creature, DATA_VAELASTRAZ_THE_CORRUPT) { Initialize(); creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index 7e38a9265f7..97646b774eb 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -15,23 +15,36 @@ * with this program. If not, see . */ -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "PassiveAI.h" -#include "blackwing_lair.h" #include "Player.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" +#include "blackwing_lair.h" -/* -Blackwing Lair Encounter: -1 - boss_razorgore.cpp -2 - boss_vaelastrasz.cpp -3 - boss_broodlord_lashlayer.cpp -4 - boss_firemaw.cpp -5 - boss_ebonroc.cpp -6 - boss_flamegor.cpp -7 - boss_chromaggus.cpp -8 - boss_nefarian.cpp -*/ +DoorData const doorData[] = +{ + { GO_BOSSGATE01, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_DRAKE_RIDER_PORTCULLIS, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_ALTERAC_VALLEY_GATE, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GATE, DATA_FIREMAW, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GATE, DATA_EBONROC, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GATE, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_VACCUUM_EXIT_GATE, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; + +ObjectData const creatureData[] = +{ + { NPC_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED }, + { NPC_VAELASTRAZ, DATA_VAELASTRAZ_THE_CORRUPT }, + { NPC_BROODLORD, DATA_BROODLORD_LASHLAYER }, + { NPC_FIREMAW, DATA_FIREMAW }, + { NPC_EBONROC, DATA_EBONROC }, + { NPC_FLAMEGOR, DATA_FLAMEGOR }, + { NPC_CHROMAGGUS, DATA_CHROMAGGUS }, + { NPC_NEFARIAN, DATA_NEFARIAN }, + { NPC_VICTOR_NEFARIUS, DATA_LORD_VICTOR_NEFARIUS }, + { 0, 0 } // END +}; Position const SummonPosition[8] = { @@ -57,92 +70,84 @@ public: instance_blackwing_lair_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + LoadObjectData(creatureData, nullptr); + // Razorgore EggCount = 0; EggEvent = 0; - SetBossNumber(EncounterCount); } void OnCreatureCreate(Creature* creature) override { + InstanceScript::OnCreatureCreate(creature); + switch (creature->GetEntry()) { - case NPC_RAZORGORE: - RazorgoreTheUntamedGUID = creature->GetGUID(); - break; case NPC_BLACKWING_DRAGON: case NPC_BLACKWING_TASKMASTER: case NPC_BLACKWING_LEGIONAIRE: case NPC_BLACKWING_WARLOCK: - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = GetCreature(DATA_RAZORGORE_THE_UNTAMED)) razor->AI()->JustSummoned(creature); break; - case NPC_VAELASTRAZ: - VaelastraszTheCorruptGUID = creature->GetGUID(); - break; - case NPC_BROODLORD: - BroodlordLashlayerGUID = creature->GetGUID(); - break; - case NPC_FIRENAW: - FiremawGUID = creature->GetGUID(); - break; - case NPC_EBONROC: - EbonrocGUID = creature->GetGUID(); - break; - case NPC_FLAMEGOR: - FlamegorGUID = creature->GetGUID(); - break; - case NPC_CHROMAGGUS: - ChromaggusGUID = creature->GetGUID(); - break; - case NPC_VICTOR_NEFARIUS: - LordVictorNefariusGUID = creature->GetGUID(); - break; - case NPC_NEFARIAN: - NefarianGUID = creature->GetGUID(); + default: break; } } void OnGameObjectCreate(GameObject* go) override { - switch (go->GetEntry()) + InstanceScript::OnGameObjectCreate(go); + + if (go->GetEntry() == GO_BLACK_DRAGON_EGG) { - case 177807: // Egg - if (GetBossState(BOSS_FIREMAW) == DONE) - go->SetPhaseMask(2, true); - else - EggList.push_back(go->GetGUID()); - break; - case 175946: // Door - RazorgoreDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_RAZORGORE) == DONE, go); - break; - case 175185: // Door - VaelastraszDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_VAELASTRAZ) == DONE, go); - break; - case 180424: // Door - BroodlordDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_BROODLORD) == DONE, go); - break; - case 185483: // Door - ChrommagusDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_FIREMAW) == DONE && GetBossState(BOSS_EBONROC) == DONE && GetBossState(BOSS_FLAMEGOR) == DONE, go); - break; - case 181125: // Door - NefarianDoorGUID = go->GetGUID(); - HandleGameObject(ObjectGuid::Empty, GetBossState(BOSS_CHROMAGGUS) == DONE, go); - break; + if (GetBossState(DATA_FIREMAW) == DONE) + go->SetPhaseMask(2, true); + else + EggList.push_back(go->GetGUID()); } } void OnGameObjectRemove(GameObject* go) override { - if (go->GetEntry() == 177807) // Egg + InstanceScript::OnGameObjectRemove(go); + + if (go->GetEntry() == GO_BLACK_DRAGON_EGG) EggList.remove(go->GetGUID()); } + bool CheckRequiredBosses(uint32 bossId, Player const* player /*= nullptr*/) const override + { + if (_SkipCheckRequiredBosses(player)) + return true; + + switch (bossId) + { + case DATA_BROODLORD_LASHLAYER: + if (GetBossState(DATA_VAELASTRAZ_THE_CORRUPT) != DONE) + return false; + break; + case DATA_FIREMAW: + case DATA_EBONROC: + case DATA_FLAMEGOR: + if (GetBossState(DATA_BROODLORD_LASHLAYER) != DONE) + return false; + break; + case DATA_CHROMAGGUS: + if (GetBossState(DATA_FIREMAW) != DONE + || GetBossState(DATA_EBONROC) != DONE + || GetBossState(DATA_FLAMEGOR) != DONE) + return false; + break; + default: + break; + } + + return true; + } + bool SetBossState(uint32 type, EncounterState state) override { if (!InstanceScript::SetBossState(type, state)) @@ -150,40 +155,25 @@ public: switch (type) { - case BOSS_RAZORGORE: - HandleGameObject(RazorgoreDoorGUID, state == DONE); + case DATA_RAZORGORE_THE_UNTAMED: if (state == DONE) { for (GuidList::const_iterator itr = EggList.begin(); itr != EggList.end(); ++itr) - if (GameObject* egg = instance->GetGameObject((*itr))) + if (GameObject* egg = instance->GetGameObject(*itr)) egg->SetPhaseMask(2, true); } SetData(DATA_EGG_EVENT, NOT_STARTED); break; - case BOSS_VAELASTRAZ: - HandleGameObject(VaelastraszDoorGUID, state == DONE); - break; - case BOSS_BROODLORD: - HandleGameObject(BroodlordDoorGUID, state == DONE); - break; - case BOSS_FIREMAW: - case BOSS_EBONROC: - case BOSS_FLAMEGOR: - HandleGameObject(ChrommagusDoorGUID, GetBossState(BOSS_FIREMAW) == DONE && GetBossState(BOSS_EBONROC) == DONE && GetBossState(BOSS_FLAMEGOR) == DONE); - break; - case BOSS_CHROMAGGUS: - HandleGameObject(NefarianDoorGUID, state == DONE); - break; - case BOSS_NEFARIAN: + case DATA_NEFARIAN: switch (state) { case NOT_STARTED: - if (Creature* nefarian = instance->GetCreature(NefarianGUID)) + if (Creature* nefarian = GetCreature(DATA_NEFARIAN)) nefarian->DespawnOrUnsummon(); break; case FAIL: - _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15*IN_MILLISECONDS*MINUTE); - SetBossState(BOSS_NEFARIAN, NOT_STARTED); + _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15 * IN_MILLISECONDS * MINUTE); + SetBossState(DATA_NEFARIAN, NOT_STARTED); break; default: break; @@ -193,24 +183,6 @@ public: return true; } - ObjectGuid GetGuidData(uint32 id) const override - { - switch (id) - { - case DATA_RAZORGORE_THE_UNTAMED: return RazorgoreTheUntamedGUID; - case DATA_VAELASTRAZ_THE_CORRUPT: return VaelastraszTheCorruptGUID; - case DATA_BROODLORD_LASHLAYER: return BroodlordLashlayerGUID; - case DATA_FIRENAW: return FiremawGUID; - case DATA_EBONROC: return EbonrocGUID; - case DATA_FLAMEGOR: return FlamegorGUID; - case DATA_CHROMAGGUS: return ChromaggusGUID; - case DATA_LORD_VICTOR_NEFARIUS: return LordVictorNefariusGUID; - case DATA_NEFARIAN: return NefarianGUID; - } - - return ObjectGuid::Empty; - } - void SetData(uint32 type, uint32 data) override { if (type == DATA_EGG_EVENT) @@ -218,7 +190,7 @@ public: switch (data) { case IN_PROGRESS: - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45*IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45 * IN_MILLISECONDS); EggEvent = data; EggCount = 0; break; @@ -230,13 +202,13 @@ public: case SPECIAL: if (++EggCount == 15) { - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = GetCreature(DATA_RAZORGORE_THE_UNTAMED)) { SetData(DATA_EGG_EVENT, DONE); razor->RemoveAurasDueToSpell(42013); // MindControl DoRemoveAurasDueToSpellOnPlayers(42013); } - _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, 1 * IN_MILLISECONDS); _events.CancelEvent(EVENT_RAZOR_SPAWN); } if (EggEvent == NOT_STARTED) @@ -249,8 +221,8 @@ public: void OnUnitDeath(Unit* unit) override { //! HACK, needed because of buggy CreatureAI after charm - if (unit->GetEntry() == NPC_RAZORGORE && GetBossState(BOSS_RAZORGORE) != DONE) - SetBossState(BOSS_RAZORGORE, DONE); + if (unit->GetEntry() == NPC_RAZORGORE && GetBossState(DATA_RAZORGORE_THE_UNTAMED) != DONE) + SetBossState(DATA_RAZORGORE_THE_UNTAMED, DONE); } void Update(uint32 diff) override @@ -268,15 +240,15 @@ public: for (uint8 i = urand(2, 5); i > 0 ; --i) if (Creature* summon = instance->SummonCreature(Entry[urand(0, 4)], SummonPosition[urand(0, 7)])) summon->SetInCombatWithZone(); - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, urand(12, 17)*IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, urand(12, 17) * IN_MILLISECONDS); break; case EVENT_RAZOR_PHASE_TWO: _events.CancelEvent(EVENT_RAZOR_SPAWN); - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = GetCreature(DATA_RAZORGORE_THE_UNTAMED)) razor->AI()->DoAction(ACTION_PHASE_TWO); break; case EVENT_RESPAWN_NEFARIUS: - if (Creature* nefarius = instance->GetCreature(LordVictorNefariusGUID)) + if (Creature* nefarius = GetCreature(DATA_LORD_VICTOR_NEFARIUS)) { nefarius->SetPhaseMask(1, true); nefarius->setActive(true); @@ -291,34 +263,11 @@ public: protected: // Misc EventMap _events; + // Razorgore uint8 EggCount; uint32 EggEvent; - ObjectGuid RazorgoreTheUntamedGUID; - ObjectGuid RazorgoreDoorGUID; GuidList EggList; - - // Vaelastrasz the Corrupt - ObjectGuid VaelastraszTheCorruptGUID; - ObjectGuid VaelastraszDoorGUID; - - // Broodlord Lashlayer - ObjectGuid BroodlordLashlayerGUID; - ObjectGuid BroodlordDoorGUID; - - // 3 Dragons - ObjectGuid FiremawGUID; - ObjectGuid EbonrocGUID; - ObjectGuid FlamegorGUID; - ObjectGuid ChrommagusDoorGUID; - - // Chormaggus - ObjectGuid ChromaggusGUID; - ObjectGuid NefarianDoorGUID; - - // Nefarian - ObjectGuid LordVictorNefariusGUID; - ObjectGuid NefarianGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override From f7c7b92ef3c7f600276495f6d28061716fba0c23 Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Wed, 26 Aug 2015 18:44:44 +0200 Subject: [PATCH 057/110] DB/World schema backport: quest_details, quest_request_items and quest_offer_reward tables --- sql/updates/world/2015_08_26_01_world_335.sql | 80 +++++++++++++++++ src/server/game/Globals/ObjectMgr.cpp | 85 +++++++++++++++++-- src/server/game/Quests/QuestDef.cpp | 64 ++++++++------ src/server/game/Quests/QuestDef.h | 3 + 4 files changed, 196 insertions(+), 36 deletions(-) create mode 100644 sql/updates/world/2015_08_26_01_world_335.sql diff --git a/sql/updates/world/2015_08_26_01_world_335.sql b/sql/updates/world/2015_08_26_01_world_335.sql new file mode 100644 index 00000000000..e211aea30e6 --- /dev/null +++ b/sql/updates/world/2015_08_26_01_world_335.sql @@ -0,0 +1,80 @@ +-- quest_details +DROP TABLE IF EXISTS `quest_details`; +CREATE TABLE `quest_details` ( + `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', + `Emote1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `Emote2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `Emote3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `Emote4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay1` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay2` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay3` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay4` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `VerifiedBuild` SMALLINT(5) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) +SELECT `ID`, `DetailsEmote1`, `DetailsEmote2`, `DetailsEmote3`, `DetailsEmote4`, `DetailsEmoteDelay1`, `DetailsEmoteDelay2`, `DetailsEmoteDelay3`, `DetailsEmoteDelay4`, `VerifiedBuild` FROM `quest_template` +WHERE `DetailsEmote1`!=0 OR `DetailsEmote2`!=0 OR `DetailsEmote3`!=0 OR `DetailsEmote4`!=0 OR `DetailsEmoteDelay1`!=0 OR `DetailsEmoteDelay2`!=0 OR `DetailsEmoteDelay3`!=0 OR `DetailsEmoteDelay4`!=0; + + +-- quest_request_items +DROP TABLE IF EXISTS `quest_request_items`; +CREATE TABLE `quest_request_items` ( + `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', + `EmoteOnComplete` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `EmoteOnIncomplete` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `CompletionText` TEXT, + `VerifiedBuild` SMALLINT(5) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `quest_request_items` (`ID`, `EmoteOnComplete`, `EmoteOnIncomplete`, `CompletionText`, `VerifiedBuild`) +SELECT `ID`, `EmoteOnComplete`, `EmoteOnIncomplete`, `RequestItemsText`, `VerifiedBuild` FROM `quest_template` +WHERE `EmoteOnComplete`!=0 OR `EmoteOnIncomplete`!=0 OR `RequestItemsText`!=''; + + +-- quest_offer_reward +DROP TABLE IF EXISTS `quest_offer_reward`; +CREATE TABLE `quest_offer_reward` ( + `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', + `Emote1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `Emote2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `Emote3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `Emote4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay1` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay2` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay3` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `EmoteDelay4` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `RewardText` TEXT, + `VerifiedBuild` SMALLINT(5) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `quest_offer_reward` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `RewardText`, `VerifiedBuild`) +SELECT `ID`, `OfferRewardEmote1`, `OfferRewardEmote2`, `OfferRewardEmote3`, `OfferRewardEmote4`, `OfferRewardEmoteDelay1`, `OfferRewardEmoteDelay2`, `OfferRewardEmoteDelay3`, `OfferRewardEmoteDelay4`, `OfferRewardText`, `VerifiedBuild` FROM `quest_template` +WHERE `OfferRewardEmote1`!=0 OR `OfferRewardEmote2`!=0 OR `OfferRewardEmote3`!=0 OR `OfferRewardEmote4`!=0 OR `OfferRewardEmoteDelay1`!=0 OR `OfferRewardEmoteDelay2`!=0 OR `OfferRewardEmoteDelay3`!=0 OR `OfferRewardEmoteDelay4`!=0 OR `OfferRewardText`!=''; + +-- delete old fields +ALTER TABLE `quest_template` + DROP `DetailsEmote1`, + DROP `DetailsEmote2`, + DROP `DetailsEmote3`, + DROP `DetailsEmote4`, + DROP `DetailsEmoteDelay1`, + DROP `DetailsEmoteDelay2`, + DROP `DetailsEmoteDelay3`, + DROP `DetailsEmoteDelay4`, + DROP `EmoteOnIncomplete`, + DROP `EmoteOnComplete`, + DROP `RequestItemsText`, + DROP `OfferRewardEmote1`, + DROP `OfferRewardEmote2`, + DROP `OfferRewardEmote3`, + DROP `OfferRewardEmote4`, + DROP `OfferRewardEmoteDelay1`, + DROP `OfferRewardEmoteDelay2`, + DROP `OfferRewardEmoteDelay3`, + DROP `OfferRewardEmoteDelay4`, + DROP `OfferRewardText`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index d67d7446d41..d9753433235 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3983,18 +3983,16 @@ void ObjectMgr::LoadQuests() "RewardFactionOverride1, RewardFactionOverride2, RewardFactionOverride3, RewardFactionOverride4, RewardFactionOverride5, " // 62 63 64 65 "PointMapId, PointX, PointY, PointOption, " - // 66 67 68 69 70 71 72 - "LogTitle, LogDescription, QuestDescription, EndText, OfferRewardText, RequestItemsText, QuestCompletionLog, " - // 73 74 75 76 77 78 79 80 + // 66 67 68 69 70 + "LogTitle, LogDescription, QuestDescription, EndText, QuestCompletionLog, " + // 71 72 73 74 75 76 77 78 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, " - // 81 82 83 84 85 86 87 88 + // 79 80 81 82 83 84 85 86 "RequiredSourceItemId1, RequiredSourceItemId2, RequiredSourceItemId3, RequiredSourceItemId4, RequiredSourceItemCount1, RequiredSourceItemCount2, RequiredSourceItemCount3, RequiredSourceItemCount4, " - // 89 90 91 92 93 94 95 96 97 98 99 100 + // 87 88 89 90 91 92 93 94 95 96 97 98 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, " - // 101 102 103 104 105 106 107 108 109 110 111 112 113 - "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, " - // 114 115 116 117 118 119 120 121 122 123 - "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4" + // 99 100 101 102 103 + "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4" " FROM quest_template"); if (!result) { @@ -4014,6 +4012,75 @@ void ObjectMgr::LoadQuests() } while (result->NextRow()); std::map usedMailTemplates; + + // Load `quest_details` + // 0 1 2 3 4 5 6 7 8 + result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestDetails(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_details` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } + + // Load `quest_request_items` + // 0 1 2 3 + result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestRequestItems(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_request_items` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } + + // Load `quest_offer_reward` + // 0 1 2 3 4 5 6 7 8 9 + result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestOfferReward(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_offer_reward` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } // Load `quest_template_addon` // 0 1 2 3 4 5 6 7 8 diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index d1dcfd0f693..ac9759d31cd 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -79,49 +79,32 @@ Quest::Quest(Field* questRecord) Objectives = questRecord[67].GetString(); Details = questRecord[68].GetString(); EndText = questRecord[69].GetString(); - OfferRewardText = questRecord[70].GetString(); - RequestItemsText = questRecord[71].GetString(); - CompletedText = questRecord[72].GetString(); + CompletedText = questRecord[70].GetString(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGo[i] = questRecord[73+i].GetInt32(); + RequiredNpcOrGo[i] = questRecord[71+i].GetInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGoCount[i] = questRecord[77+i].GetUInt16(); + RequiredNpcOrGoCount[i] = questRecord[75+i].GetUInt16(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemId[i] = questRecord[81+i].GetUInt32(); + RequiredSourceItemId[i] = questRecord[79+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemCount[i] = questRecord[85+i].GetUInt16(); + RequiredSourceItemCount[i] = questRecord[83+i].GetUInt16(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemId[i] = questRecord[89+i].GetUInt32(); + RequiredItemId[i] = questRecord[87+i].GetUInt32(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemCount[i] = questRecord[95+i].GetUInt16(); + RequiredItemCount[i] = questRecord[93+i].GetUInt16(); - // int8 Unknown0 = questRecord[101].GetUInt8(); + // int8 Unknown0 = questRecord[99].GetUInt8(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ObjectiveText[i] = questRecord[102+i].GetString(); + ObjectiveText[i] = questRecord[100+i].GetString(); - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = questRecord[106+i].GetUInt16(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmoteDelay[i] = questRecord[110+i].GetUInt32(); - - EmoteOnIncomplete = questRecord[114].GetUInt16(); - EmoteOnComplete = questRecord[115].GetUInt16(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = questRecord[116+i].GetInt16(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmoteDelay[i] = questRecord[120+i].GetInt32(); - - //int32 VerifiedBuild = questRecord[124].GetInt32(); + //int32 VerifiedBuild = questRecord[104].GetInt32(); _reqItemsCount = 0; _reqCreatureOrGOcount = 0; @@ -145,6 +128,33 @@ Quest::Quest(Field* questRecord) ++_rewChoiceItemsCount; } +void Quest::LoadQuestDetails(Field* fields) +{ + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + DetailsEmote[i] = fields[1+i].GetUInt16(); + + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + DetailsEmoteDelay[i] = fields[5+i].GetUInt32(); +} + +void Quest::LoadQuestRequestItems(Field* fields) +{ + EmoteOnComplete = fields[1].GetUInt16(); + EmoteOnIncomplete = fields[2].GetUInt16(); + RequestItemsText = fields[3].GetString(); +} + +void Quest::LoadQuestOfferReward(Field* fields) +{ + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + OfferRewardEmote[i] = fields[1+i].GetUInt16(); + + for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + OfferRewardEmoteDelay[i] = fields[5+i].GetUInt32(); + + OfferRewardText = fields[9].GetString(); +} + void Quest::LoadQuestTemplateAddon(Field* fields) { MaxLevel = fields[1].GetUInt8(); diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index fdfb2a8e8b9..78fd065e9bd 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -195,6 +195,9 @@ class Quest friend class ObjectMgr; public: Quest(Field* questRecord); + void LoadQuestDetails(Field* fields); + void LoadQuestRequestItems(Field* fields); + void LoadQuestOfferReward(Field* fields); void LoadQuestTemplateAddon(Field* fields); uint32 XPValue(Player* player) const; From 7cbce97ae4c5aeb53b58981607dd219311be07f6 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 29 Aug 2015 19:07:48 +0200 Subject: [PATCH 058/110] DB/Quest: The Brothers Bronzebeard Closes #9889 Thanks to @StormBytePP for fixing the Vehicle issue on https://github.com/TrinityCore/TrinityCore/commit/ac2845ee77d0f3e838267ad424fbcf4894040333 --- sql/updates/world/2015_08_29_02_world.sql | 345 ++++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 sql/updates/world/2015_08_29_02_world.sql diff --git a/sql/updates/world/2015_08_29_02_world.sql b/sql/updates/world/2015_08_29_02_world.sql new file mode 100644 index 00000000000..44ec964d97f --- /dev/null +++ b/sql/updates/world/2015_08_29_02_world.sql @@ -0,0 +1,345 @@ +-- +SET @CGUID := 144155; -- 80 free guid set by TC +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+79; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 30136, 571, 1, 2, 7443.688, -997.967, 791.5563, 5.77704, 0, 0, 0), +(@CGUID+1, 30136, 571, 1, 2, 7464.026, -982.6368, 796.7954, 5.445427, 0, 0, 0), +(@CGUID+2, 30136, 571, 1, 2, 7439.698, -1004.994, 791.5581, 5.88176, 0, 0, 0), +(@CGUID+3, 30136, 571, 1, 2, 7432.88, -996.9908, 538.754, 5.8294, 0, 0, 0), +(@CGUID+4, 30136, 571, 1, 2, 7440.099, -971.4941, 596.7019, 5.5676, 0, 0, 0), +(@CGUID+5, 30136, 571, 1, 2, 7443.239, -957.6465, 704.6074, 5.445427, 0, 0, 0), +(@CGUID+6, 30136, 571, 1, 2, 7436.259, -995.6957, 538.7682, 5.794493, 0, 0, 0), +(@CGUID+7, 30136, 571, 1, 2, 7453.724, -975.0106, 538.7589, 5.480334, 0, 0, 0), +(@CGUID+8, 30136, 571, 1, 2, 7453.564, -978.4579, 538.7731, 5.51524, 0, 0, 0), +(@CGUID+9, 30136, 571, 1, 2, 7432.952, -993.7203, 594.6988, 5.794493, 0, 0, 0), +(@CGUID+10, 30136, 571, 1, 2, 7470.03, -953.4771, 538.7057, 5.183628, 0, 0, 0), +(@CGUID+11, 30136, 571, 1, 2, 7509.529, -942.8323, 596.5732, 4.747295, 0, 0, 0), +(@CGUID+12, 30136, 571, 1, 2, 7512.031, -952.4295, 793.3883, 4.729842, 0, 0, 0), +(@CGUID+13, 30136, 571, 1, 2, 7522.184, -944.5262, 538.7827, 4.590216, 0, 0, 0), +(@CGUID+14, 30136, 571, 1, 2, 7567.444, -977.0383, 595.8424, 3.944444, 0, 0, 0), +(@CGUID+15, 30136, 571, 1, 2, 7587.854, -1034.644, 711.9574, 3.159046, 0, 0, 0), +(@CGUID+16, 30136, 571, 1, 2, 7496.645, -940.393, 538.7007, 4.886922, 0, 0, 0), +(@CGUID+17, 30136, 571, 1, 2, 7530.056, -967.2031, 689.8135, 4.45059, 0, 0, 0), +(@CGUID+18, 30136, 571, 1, 2, 7536.476, -957.3798, 594.0485, 4.39823, 0, 0, 0), +(@CGUID+19, 30136, 571, 1, 2, 7518.525, -943.5374, 538.7671, 4.642576, 0, 0, 0), +(@CGUID+20, 30136, 571, 1, 2, 7524.424, -965.8981, 688.9619, 4.537856, 0, 0, 0), +(@CGUID+21, 30136, 571, 1, 2, 7480.429, -1015.052, 738.4304, 5.707227, 0, 0, 0), +(@CGUID+22, 30136, 571, 1, 2, 7562.215, -946.9121, 816.2698, 4.18879, 0, 0, 0), +(@CGUID+23, 30136, 571, 1, 2, 7493.477, -944.535, 596.1667, 4.921828, 0, 0, 0), +(@CGUID+24, 30136, 571, 1, 2, 7594.04, -1016.391, 710.2169, 3.368485, 0, 0, 0), +(@CGUID+25, 30136, 571, 1, 2, 7561.688, -985.4562, 696.1497, 3.926991, 0, 0, 0), +(@CGUID+26, 30493, 571, 1, 2, 7258.688, -865.7031, 924.9865, 5.602507, 0, 0, 0), +(@CGUID+27, 30502, 571, 1, 2, 7246.357, -866.1553, 924.8257, 0.03490658, 0, 0, 0), +(@CGUID+28, 30502, 571, 1, 2, 7329.806, -1027.244, 908.9823, 1.902409, 0, 0, 0), +(@CGUID+29, 30502, 571, 1, 2, 7258.124, -851.6719, 926.1149, 4.869469, 0, 0, 0), +(@CGUID+30, 30502, 571, 1, 2, 7379.61, -910.0995, 908.1426, 2.670354, 0, 0, 0), +(@CGUID+31, 30502, 571, 1, 2, 7360.499, -1137.121, 907.58, 1.937315, 0, 0, 0), +(@CGUID+32, 30502, 571, 1, 2, 7518.664, -1240.335, 913.9808, 3.822271, 0, 0, 0), +(@CGUID+33, 30502, 571, 1, 2, 7369.898, -1214.435, 904.9849, 0.2268928, 0, 0, 0), +(@CGUID+34, 30502, 571, 1, 2, 7283.155, -1084.717, 939.2233, 1.762783, 0, 0, 0), +(@CGUID+35, 30502, 571, 1, 2, 7451.647, -843.4373, 917.2958, 3.246312, 0, 0, 0), +(@CGUID+36, 30502, 571, 1, 2, 7261.373, -1013.67, 918.5519, 1.413717, 0, 0, 0), +(@CGUID+37, 30502, 571, 1, 2, 7606.527, -1225.569, 929.4883, 4.29351, 0, 0, 0), +(@CGUID+38, 30502, 571, 1, 2, 7554.601, -1320.671, 930.3687, 4.660029, 0, 0, 0), +(@CGUID+39, 30502, 571, 1, 2, 7430.659, -1318.579, 911.7595, 4.468043, 0, 0, 0), +(@CGUID+40, 30502, 571, 1, 2, 7283.702, -1305.297, 909.7721, 5.88176, 0, 0, 0), +(@CGUID+41, 30064, 571, 1, 2, 7260.882, -1363.916, 911.7665, 0.4014257, 0, 0, 0), +(@CGUID+42, 30064, 571, 1, 2, 7294.543, -1239.342, 910.2243, 6.126106, 0, 0, 0), +(@CGUID+43, 30064, 571, 1, 2, 7447.73, -1222.154, 906.4549, 3.979351, 0, 0, 0), +(@CGUID+44, 30064, 571, 1, 2, 7021.103, -1281.485, 925.2195, 5.751715, 0, 0, 0), +(@CGUID+45, 30064, 571, 1, 2, 7366.789, -921.5516, 908.176, 1.151917, 0, 0, 0), +(@CGUID+46, 30064, 571, 1, 2, 7366.549, -1167.878, 907.7737, 4.276057, 0, 0, 0), +(@CGUID+47, 30064, 571, 1, 2, 7266.572, -1061.63, 941.623, 3.45743, 0, 0, 0), +(@CGUID+48, 30064, 571, 1, 2, 7274.531, -973.0413, 919.6902, 3.892084, 0, 0, 0), +(@CGUID+49, 30064, 571, 1, 2, 7344.521, -1002.784, 907.9092, 1.370535, 0, 0, 0), +(@CGUID+50, 30504, 571, 1, 2, 7264.177, -1064.293, 941.6094, 1.58825, 0, 0, 0), +(@CGUID+51, 30504, 571, 1, 2, 7261.539, -1060.268, 942.1428, 1.58825, 0, 0, 0), +(@CGUID+52, 30504, 571, 1, 2, 7258.846, -1064.966, 941.6843, 1.570796, 0, 0, 0), +(@CGUID+53, 30504, 571, 1, 2, 7285.515, -995.3761, 915.2917, 1.780236, 0, 0, 0), +(@CGUID+54, 30504, 571, 1, 2, 7291.571, -993.6209, 915.0613, 1.832596, 0, 0, 0), +(@CGUID+55, 30504, 571, 1, 2, 7284.015, -942.5671, 919.7255, 1.884956, 0, 0, 0), +(@CGUID+56, 30504, 571, 1, 2, 7295.979, -986.884, 915.3113, 1.867502, 0, 0, 0), +(@CGUID+57, 30504, 571, 1, 2, 7297.396, -992.0636, 914.5924, 1.867502, 0, 0, 0), +(@CGUID+58, 30504, 571, 1, 2, 7290.535, -988.4466, 915.6047, 1.832596, 0, 0, 0), +(@CGUID+59, 30504, 571, 1, 2, 7288.845, -939.8006, 919.2185, 1.954769, 0, 0, 0), +(@CGUID+60, 30504, 571, 1, 2, 7284.822, -936.735, 920.152, 1.919862, 0, 0, 0), +(@CGUID+61, 30504, 571, 1, 2, 7284.391, -990.1196, 915.7115, 1.780236, 0, 0, 0), +(@CGUID+62, 30504, 571, 1, 2, 7347.897, -934.4936, 908.6702, 2.478368, 0, 0, 0), +(@CGUID+63, 30504, 571, 1, 2, 7352.746, -928.9537, 908.5024, 2.548181, 0, 0, 0), +(@CGUID+64, 30504, 571, 1, 2, 7345.77, -927.7479, 909.7731, 2.513274, 0, 0, 0), +(@CGUID+65, 30504, 571, 1, 2, 7278.971, -906.7933, 926.6701, 2.042035, 0, 0, 0), +(@CGUID+66, 30504, 571, 1, 2, 7328.465, -894.0953, 920.5985, 2.75762, 0, 0, 0), +(@CGUID+67, 30504, 571, 1, 2, 7271.211, -905.6917, 927.1619, 1.902409, 0, 0, 0), +(@CGUID+68, 30504, 571, 1, 2, 7326.755, -908.373, 917.7892, 2.583087, 0, 0, 0), +(@CGUID+69, 30504, 571, 1, 2, 7330.237, -902.4053, 918.4761, 2.670354, 0, 0, 0), +(@CGUID+70, 30504, 571, 1, 2, 7281.855, -898.8499, 926.4277, 2.199115, 0, 0, 0), +(@CGUID+71, 30504, 571, 1, 2, 7284.128, -903.6423, 926.1991, 2.181662, 0, 0, 0), +(@CGUID+72, 30504, 571, 1, 2, 7273.202, -910.2079, 927.0142, 1.902409, 0, 0, 0), +(@CGUID+73, 30504, 571, 1, 2, 7321.779, -905.3262, 919.6216, 2.583087, 0, 0, 0), +(@CGUID+74, 30504, 571, 1, 2, 7276.896, -902.2155, 926.9134, 2.059489, 0, 0, 0), +(@CGUID+75, 30504, 571, 1, 2, 7333.466, -896.3923, 918.7648, 2.75762, 0, 0, 0), +(@CGUID+76, 30382, 571, 1, 1, 7525.702, -971.7235, 478.799, 5.637414, 0, 0, 0), +(@CGUID+77, 30383, 571, 1, 1, 7515.811, -975.2843, 467.4983, 3.857178, 0, 0, 0), +(@CGUID+78, 30401, 571, 1, 1, 6647.1733, -310.2567, 989.5303, 1.2511, 0, 0, 0), +(@CGUID+79, 30504, 571, 1, 2, 7325.687, -899.111, 920.3403, 2.758484, 0, 0, 0); + +DELETE FROM `creature_template_addon` WHERE `entry`=30493; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(30493, 0, 0, 0, 0, 0, '29266'); + +DELETE FROM `creature_addon` WHERE `guid`=@CGUID+78; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(@CGUID+78, 0, 0, 0, 0, 0, '54503'); -- quest invisibility + +DELETE FROM `spell_area` WHERE `spell`=55782 AND `area`=4432; +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(55782, 4432, 12973, 0, 0, 0, 2, 1, 74, 0); + +DELETE FROM `spell_area` WHERE `spell`=54504 AND `area`=4428; +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(54504, 4428, 12973, 0, 0, 0, 2, 1, 10, 0); + +SET @Brann := 30107; +SET @Brann1 := 30382; -- Brann 60888 cosmetic movement +SET @Brann2 := 30405; +SET @Machine := 30134; -- Machine +SET @Soldier := 30136; -- Stormforged Soldier +Set @Yorg := 30408; -- Yorg Stormheart spell to summon=56676 +Set @Magni := 30411; -- Magni Bronzebeard spell to summon=56697 +SET @SPELL1 := 56603; +SET @Machine2 := 30383; -- Machine static + +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Soldier AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann1 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann1*100 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann2 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann2*100 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann*100 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Brann*100+1 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Machine AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Machine*100 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Machine2 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Yorg AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Yorg*100 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Yorg*100+1 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Magni AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Magni*100 AND `source_type` = 9; +DELETE FROM `smart_scripts` WHERE `entryorguid` = @Magni*100+1 AND `source_type` = 9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@Brann1, 0, 0, 0, 19, 0, 100, 0, 12973, 0, 0, 0, 80, @Brann1*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Brann - On Quest Accept - action list'), +(@Brann1*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 56558, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Brann - action liste - cast spell to invoque'), +(@brann1*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, @Machine2, 20, 0, 0, 0, 0, 0, 'Brann - On ActionList - despawn'), +(@brann1*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 44, 3, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Brann - On ActionList - Set phase 3'), +(@brann1*100, 9, 3, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Brann - On ActionList - despawn'), +(@Brann1, 0, 1, 0, 1, 0, 100, 0, 4000, 4000, 4000, 7000, 11, 60888, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Brann - Ooc - Cast cosmetic movement'), +(@Machine, 0, 16, 0, 63, 0, 100, 0, 0, 0, 0, 0, 44, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - Just created - Set phase 3'), +(@Machine, 0, 0, 0, 27, 0, 100, 0, 0, 0, 0, 0, 80, @Machine*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - On passeger boarded - action list'), +(@Machine*100, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 53, 1, @Machine, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - action list - start wp'), +(@Machine*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 19, @Brann, 10, 0, 0, 0, 0, 0, 'Brann - On Script - Set React Passive'), +(@Machine*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - On Script - Set React Passive'), +(@Machine*100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 131072, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - On Script - set PACIFIED'), +(@Soldier, 0, 0, 0, 0, 0, 100, 0, 3000, 3000, 4000, 4000, 11, 56621, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0,0,'Stormforged Soldier - In Combat - Cast Thunder Orb'), +(@Machine, 0, 1, 0, 40, 0, 100, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 2, 0, 40, 0, 100, 0, 4, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 3, 0, 40, 0, 100, 0, 7, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 4, 0, 40, 0, 100, 0, 22, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 5, 0, 40, 0, 100, 0, 27, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 6, 0, 40, 0, 100, 0, 31, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 7, 0, 40, 0, 100, 0, 35, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 8, 0, 40, 0, 100, 0, 36, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 9, 0, 40, 0, 100, 0, 41, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 19, @brann, 10, 0, 0, 0, 0, 0, 'Machine - On waypoint - talk'), +(@Machine, 0, 10, 11, 40, 0, 100, 0, 42, 0, 0, 0, 11, 68576, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - On waypoint - Eject passengenrs'), +(@Machine, 0, 11, 12, 61, 0, 100, 0, 0, 0, 0, 0, 85, 56675, 0, 0, 0, 0, 0, 21, 20, 0, 0, 0, 0, 0, 0, 'Machine - On waypoint - Invoker cast to Spawn Brann'), +(@Machine, 0, 12, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - On waypoint - Despawn'), +(@Machine, 0, 13, 0, 1, 0, 100, 0, 3000, 3000, 3000, 3000, 86, 56622, 1, 9, @Soldier, 5, 50, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - OOC - CROSSCAST'), +(@Machine, 0, 14, 0, 1, 0, 100, 0, 3000, 3000, 3000, 3000, 86, 55089, 1, 19, @Soldier, 40, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Machine - OOC - CROSSCAST'), +(@brann2, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 83, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - Just created - Remove npcflag'), +(@brann2, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, @brann2*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - Has aura - action list'), +(@brann2*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - set run off'), +(@brann2*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6696.584473, -301.435760, 989.392761, 3.094404, 'brann - ActionList - move to pos'), +(@brann2*100, 9, 2, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 11, 56676, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList- spawn Yorg'), +(@brann2*100, 9, 3, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 4, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 5, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 6, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 7, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 8, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 9, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 10, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 11, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 12, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 13, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 14, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 56697, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - spawn Magni'), +(@brann2*100, 9, 15, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 16, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 66, 2.662433, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6696.584473, -301.435760, 989.392761, 2.662433, 'brann - ActionList - Set orientation'), +(@brann2*100, 9, 17, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 18, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 19, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 20, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 21, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 8, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 22, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 9, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 23, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 24, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 25, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 10, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 26, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 27, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 11, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 28, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 29, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 12, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 30, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 31, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 32, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 13, 0, 0, 0, 0, 0, 19, @Yorg, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 33, 0, 0, 0, 100, 0, 0, 0, 0, 0, 75, 71385, 0, 0, 0, 0, 0, 11, @Yorg, 20, 0, 0, 0, 0, 0, 'brann - ActionList - add aura'), +(@brann2*100, 9, 34, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 1, 8, 0, 0, 0, 0, 0, 19, @Magni, 10, 0, 0, 0, 0, 0, 'brann - ActionList - talk'), +(@brann2*100, 9, 35, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 75, 71385, 0, 0, 0, 0, 0, 11, @Magni, 20, 0, 0, 0, 0, 0, 'brann - ActionList - add aura'), +(@brann2*100, 9, 36, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 56742, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 'brann - ActionList - Cast credit spell'), +(@brann2*100, 9, 37, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6740.549316, -293.961212, 993.427979, 3.559861, 'brann - ActionList - move to pos'), +(@brann2*100, 9, 38, 0, 0, 0, 100, 0, 15000, 15000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Brann - On ActionList - despawn'), +(@Yorg, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 80, @Yorg*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Yorg - On spawn - ActionList'), +(@Yorg*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Yorg - ActionList - set run off'), +(@Yorg*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6692.118164, -301.678192, 989.427734, 6.194374, 'Yorg - ActionList - go to pos'), +(@Yorg*100, 9, 2, 0, 0, 0, 100, 0, 90000, 90000, 0, 0, 66, 0.579558, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6692.118164, -301.678192, 989.427734, 0.579558, 'Yorg - ActionList - Set orientation'), +(@Yorg, 0, 1, 0, 23, 0, 100, 1, 71385, 1, 0, 0, 80, @Yorg*100+1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Yorg - call timed actionlist when has aura'), +(@Yorg*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6608.733887, -282.180756, 986.123230, 3.491027, 'Yorg - ActionList - move to pos'), +(@Yorg*100+1, 9, 1, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Yorg - ActionList - despawn'), +(@Magni, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 80, @Magni*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magni - On Spawn - ActionList'), +(@Magni*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6694.134766, -297.678925, 989.207092, 4.757878, 'Magni - ActionList - Go to pos'), +(@Magni*100, 9, 1, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magni - ActionList - talk'), +(@Magni*100, 9, 2, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magni - ActionList - talk'), +(@Magni*100, 9, 3, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 66, 4.757878, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6694.134766, -297.678925, 989.207092, 4.757878, 'Magni - ActionList - Set orientation'), +(@Magni, 0, 1, 0, 23, 0, 100, 1, 71385, 1, 0, 0, 80, @Magni*100+1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magni - call timed actionlist when has aura'), +(@Magni*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magni - ActionList - Set run off'), +(@Magni*100+1, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 6740.549316, -293.961212, 993.427979, 3.559861, 'Magni - ActionList - Go to pos'), +(@Magni*100+1, 9, 2, 0, 0, 0, 100, 0, 15000, 15000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magni - ActionList - despawn'); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`in (@Brann, @Brann1, @Brann2, @Magni, @Yorg, @Machine, @Machine2); +UPDATE `creature_template` SET `faction`=2102, `AIName`='SmartAI' WHERE `entry`=@Soldier; +UPDATE `creature_template` SET `faction`=35, `npcflag`=16777216, `type_flags`=2048, `speed_run`=2.14, `VehicleId`=219, `InhabitType`=4, `RegenHealth`=0 WHERE `entry`=@Machine; +UPDATE `creature_template` SET `unit_flags`=537166144, `dynamicflags`=32 WHERE `entry`=30493; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56621; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,56621,0,0,31,0,3,@Soldier,0,1,0,0,'','Only the Machine is a target for the spell.'); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56622; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,56622,0,0,31,0,3,@Soldier,0,1,0,0,'','Only the Machine is a target for the spell.'); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=@Machine; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,@Machine,0,0,9,0,12973,0,0,0,0,'','Vehicle flying machine require quest 12973'); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=55089; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,55089,0,0,31,0,3,@Machine,0,0,0,0,'','Only the flying machine is a target for the spell.'); + +DELETE FROM `vehicle_template_accessory` where `entry`= @Machine; +INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`) +VALUES(@Machine,@Brann,0,1,'Brann flying machine',8,0); + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` = @Machine; +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(@Machine, 43671, 1, 1), +(@Machine, @SPELL1, 1, 0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceEntry` IN (@SPELL1, 43671); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(18,@Machine,@SPELL1,0,0,9,0,12973,0,0,0,0,'','Required quest active for spellclick'), +(18,@Machine,43671,0,0,31,0,3,0,0,0,0,'','Only npc for spellclick'); + +DELETE FROM `spell_target_position` WHERE `id`=56558; +INSERT INTO `spell_target_position` (`id`,`mapid`,`positionx`,`positiony`,`positionz`,`orientation`) VALUES +(56558, 571, 7515.810059, -975.283997, 478.508027, 3.883507); +DELETE FROM `spell_target_position` WHERE `id`=56676; +INSERT INTO `spell_target_position` (`id`,`mapid`,`positionx`,`positiony`,`positionz`,`orientation`) VALUES +(56676, 571, 6668.243164, -300.716309, 989.048035, 0.049131); +DELETE FROM `spell_target_position` WHERE `id`=56697; +INSERT INTO `spell_target_position` (`id`,`mapid`,`positionx`,`positiony`,`positionz`,`orientation`) VALUES +(56697, 571, 6646.655762, -292.56268, 982.318909, 6.077349); + +DELETE FROM `waypoints` WHERE entry=@Machine; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(@Machine,1,7482.256, -1010.183, 480.4727,'Brann flying machine'), +(@Machine,2,7487.624, -1073.279, 486.6947,'Brann flying machine'), +(@Machine,3,7554.068, -1073.744, 504.4724,'Brann flying machine'), +(@Machine,4,7540.521, -994.4729, 521.6666,'Brann flying machine'), +(@Machine,5,7476.892, -979.5384, 539.4715,'Brann flying machine'), +(@Machine,6,7441.698, -1035.954, 552.1108,'Brann flying machine'), +(@Machine,7,7471.937, -1091.025, 565.5829,'Brann flying machine'), +(@Machine,8,7510.604, -1098.736, 585.0275,'Brann flying machine'), +(@Machine,9,7560.741, -1064.01, 596.1101,'Brann flying machine'), +(@Machine,10,7558.652, -991.4143, 606.4708,'Brann flying machine'), +(@Machine,11,7481.208, -966.8239, 614.276,'Brann flying machine'), +(@Machine,12,7430.998, -1039.164, 622.7203,'Brann flying machine'), +(@Machine,13,7464.418, -1092.93, 634.8871,'Brann flying machine'), +(@Machine,14,7535.688, -1088.016, 651.7204,'Brann flying machine'), +(@Machine,15,7563.452, -1036.534, 661.0538,'Brann flying machine'), +(@Machine,16,7516.293, -977.355, 676.6924,'Brann flying machine'), +(@Machine,17,7455.716, -999.9194, 689.1921,'Brann flying machine'), +(@Machine,18,7447.983, -1050.863, 710.22,'Brann flying machine'), +(@Machine,19,7518.54, -1090.449, 733.2756,'Brann flying machine'), +(@Machine,20,7565.333, -1038.004, 745.6921,'Brann flying machine'), +(@Machine,21,7532.994, -979.3826, 757.9145,'Brann flying machine'), +(@Machine,22,7434.272, -1013.309, 756.1094,'Brann flying machine'), +(@Machine,23,7460.686, -1081.453, 775.8036,'Brann flying machine'), +(@Machine,24,7518.524, -1091.506, 800.887,'Brann flying machine'), +(@Machine,25,7563.83, -1015.821, 824.6927,'Brann flying machine'), +(@Machine,26,7485.566, -970.3575, 842.8317,'Brann flying machine'), +(@Machine,27,7446.667, -1061.756, 867.8871,'Brann flying machine'), +(@Machine,28,7479.346, -1108.014, 896.2759,'Brann flying machine'), +(@Machine,29,7534.174, -1115.574, 932.2327,'Brann flying machine'), +(@Machine,30,7583.952, -1166.912, 949.7326,'Brann flying machine'), +(@Machine,31,7569.052, -1238.047, 949.7327,'Brann flying machine'), +(@Machine,32,7505.558, -1260.738, 959.0381,'Brann flying machine'), +(@Machine,33,7425.231, -1227.18, 965.1213,'Brann flying machine'), +(@Machine,34,7358.262, -1154.908, 965.1213,'Brann flying machine'), +(@Machine,35,7316.554, -1004.713, 969.5936,'Brann flying machine'), +(@Machine,36,7273.263, -897.3846, 973.7048,'Brann flying machine'), +(@Machine,37,7216.268, -811.6398, 984.3438,'Brann flying machine'), +(@Machine,38,7148.946, -634.7748, 984.3438,'Brann flying machine'), +(@Machine,39,7051.731, -506.0969, 984.3438,'Brann flying machine'), +(@Machine,40,6928.087, -372.7923, 1013.677,'Brann flying machine'), +(@Machine,41,6820.645, -310.3642, 1017.538,'Brann flying machine'), +(@Machine,42,6741.966, -291.7396, 996.2623,'Brann flying machine'); + +DELETE FROM `creature_text` WHERE `entry` IN (@Brann, @Yorg, @Magni, @Brann2) ; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(@Brann, 0, 0, 'I can''t thank you enough for all of your help in putting together the keystone. Great things will come of this, I assure you.', 12, 0, 100, 0, 0, 0, 'Brann', 31023), +(@Brann, 1, 0, 'Iron dwarves... everywhere.... they''re making their way down from the top. They certainly are persistent.', 12, 0, 100, 0, 0, 0, 'Brann', 31024), +(@Brann, 2, 0, 'They''re trying to take down the plane! I can''t pull up any steeper... you need to keep them off of us!', 12, 0, 100, 0, 0, 0, 'Brann', 31025), +(@Brann, 3, 0, 'There are more just ahead - keep at it!', 12, 0, 100, 0, 0, 0, 'Brann', 31026), +(@Brann, 4, 0, 'We''re almost out... just a little bit further.', 12, 0, 100, 0, 0, 0, 'Brann', 31027), +(@Brann, 5, 0, 'Barring stray boulders from those giants, we should be clear... it seems a mess from down there though.', 12, 0, 100, 0, 0, 0, 'Brann', 31028), +(@Brann, 6, 0, 'Their numbers are unbelievable... I''m glad to hear King Stormheart came to your aid. I only hear good things of him - I think it''s high time we meet.', 12, 0, 100, 0, 0, 0, 'Brann', 31029), +(@Brann, 7, 0, 'Poor Creteus. He was a good keeper... I''m glad he at least got to see his task to completion, I imagine that''s all that really mattered to him.', 12, 0, 100, 0, 0, 0, 'Brann', 31030), +(@Brann, 8, 0, 'We''re coming up on Frosthold. I would be very appreciative if you would introduce me to King Stormeheart before you go. I believe we are both very much in his debt.', 12, 0, 100, 0, 0, 0, 'Brann', 31031), +(@Brann2, 0, 0, 'By all the gods... it can''t be... Muradin?', 12, 0, 100, 0, 0, 0, 'Brann', 31032), +(@Brann2, 1, 0, 'Come on boy, there''s no mistak''n it - it''s definately you. Don''t ya recognize your younger brother?', 12, 0, 100, 0, 0, 0, 'Brann', 31033), +(@Brann2, 2, 0, 'I can''t believe this! You were dead! All accounts said so... what happened, Muradin. How did you get here?', 12, 0, 100, 0, 0, 0, 'Brann', 31034), +(@Brann2, 3, 0, 'Indeed! Magni will be so happy to see you too! He''s gotten nothing but bad news for a long time now, but this changes everything!', 12, 0, 100, 0, 0, 0, 'Brann', 31035), +(@Brann2, 4, 0, 'He''s here in Northrend, brother, looking for you. A seer in Wintergarde brought word that you were not dead, and he left Ironforge immediately to come find you.', 12, 0, 100, 0, 0, 0, 'Brann', 31036), +(@Brann2, 5, 0, 'Speaking of which...', 12, 0, 100, 0, 0, 0, 'Brann', 31087), +(@Brann2, 6, 0, 'That''s in the past, Muradin. Regrets won''t change anything.', 12, 0, 100, 0, 0, 0, 'Brann', 31096), +(@Brann2, 7, 0, 'Aye, be safe Muradin. I''d join you, but I''m on top of the most amazing discovery the world has yet seen. I can''t abandon it now.', 12, 0, 100, 0, 0, 0, 'Brann', 31102), +(@Yorg, 0, 0, 'What''s that? You talkin'' to me, lad?', 12, 0, 100, 0, 0, 0, 'Yorg', 31037), +(@Yorg, 1, 0, 'My brother... yes... I do have brothers...', 12, 0, 100, 0, 0, 0, 'Yorg', 31038), +(@Yorg, 2, 0, 'Muradin clutches his head and reels for a moment as the memories rush back to him.', 16, 0, 100, 0, 0, 0, 'Yorg', 31039), +(@Yorg, 3, 0, '...Brann?', 12, 0, 100, 0, 0, 0, 'Yorg', 31040), +(@Yorg, 4, 0, 'I... I dunno, Brann. I''ve been ''ere a long time... all I ''ave of me life before this place are flashes and nightmares.', 12, 0, 100, 0, 0, 0, 'Yorg', 31042), +(@Yorg, 5, 0, 'It''s good te see you though, brother. More than words can say.', 12, 0, 100, 0, 0, 0, 'Yorg', 31043), +(@Yorg, 6, 0, 'Magn! Forgive me, the memories are comin'' back slowly, brother.', 12, 0, 100, 0, 0, 0, 'Yorg', 31045), +(@Yorg, 7, 0, 'The frostborn have been very good to me. They''re strong people.', 12, 0, 100, 0, 0, 0, 'Yorg', 31048), +(@Yorg, 8, 0, 'Not much, Magni. I''ve had nightmares of a human... tall... light hair... death black armor. His name rests on the tip of me tongue, but...', 12, 0, 100, 0, 0, 0, 'Yorg', 31089), +(@Yorg, 9, 0, '...Arthas.', 12, 0, 100, 0, 0, 0, 'Yorg', 31091), +(@Yorg, 10, 0, 'Aye, I know. I watched him turn... I watched him give up all that was right and I didn''t lift a hand... I didn''t even consider it until it was too late.', 12, 0, 100, 0, 0, 0, 'Yorg', 31094), +(@Yorg, 11, 0, 'No... no they won''t. But I can make this right. I have te. I''m goin'' after the boy. I''ll make''m answer for everything he''s done.', 12, 0, 100, 0, 0, 0, 'Yorg', 31097), +(@Yorg, 12, 0, 'I''m sure, Magni. I''ll see this through, don''t ya worry.', 12, 0, 100, 0, 0, 0, 'Yorg', 31100), +(@Yorg, 13, 0, 'Go Brann. Bring back an epic tale when we meet again. Farewell for now, brothers...', 12, 0, 100, 0, 0, 0, 'Yorg', 31103), +(@Magni, 0, 0, 'Look, Lagnus, I consider you a capable man, but my patience is wearing thin. I know that Muradin is here, can you point me to him or not?', 14, 0, 100, 0, 0, 0, 'Magni', 31084), +(@Magni, 1, 0, 'Brother! There you are! I can barely believe my eyes... you''re alive!', 14, 0, 100, 0, 0, 0, 'Magni', 31085), +(@Magni, 2, 0, 'It''s so good to see you again, Muradin. And what''s this I heard about you being a King in your own right now? The Bronzebeards were always destined to greatness.', 12, 0, 100, 0, 0, 0, 'Magni', 31086), +(@Magni, 3, 0, 'So it seems! And you haven''t lost any muscle yourself. Do you remember anything of what happened, Muradin? Fate as turned ill in your absence.', 12, 0, 100, 0, 0, 0, 'Magni', 31088), +(@Magni, 4, 0, 'Magni nods.', 16, 0, 100, 0, 0, 0, 'Magni', 31092), +(@Magni, 5, 0, 'He''s not the boy of your memories anymore, Muradin. He''s become something else entirely.', 12, 0, 100, 0, 0, 0, 'Magni', 31093), +(@Magni, 6, 0, 'Are you sure Muradin? I just got you back after years of thinking you were dead. I do not want to lose you again.', 12, 0, 100, 0, 0, 0, 'Magni', 31099), +(@Magni, 7, 0, 'So be it then. I have to return to my people, brothers. Come back to me in one piece.', 12, 0, 100, 0, 0, 0, 'Magni', 31101), +(@Magni, 8, 0, '...farewell brother.', 12, 0, 100, 0, 0, 0, 'Magni', 31129); + +UPDATE `gameobject` SET `phaseMask`=7 WHERE id=195308; From aacd388e30500ff80566c912beaf63ba43639406 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 29 Aug 2015 21:39:42 +0200 Subject: [PATCH 059/110] DB/Misc: Fix Rookery Whelp unit flag Fix Crazed Mana Surge casting Loose Mana on death Fix PrevQuest for Replenishing the Healing Crystals Add some missing spawns to Ghostlands Fix some issues on Utgarde Pinnacle Disable health regen for Guard Roberts Closes #15276 Closes #15286 Closes #15343 Closes #15348 Update #15362 Closes #15355 Thanks to @Pirricli @KiHeij @jududdar @pete318 @Tauriella @MrSmite --- sql/updates/world/2015_08_29_03_world.sql | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 sql/updates/world/2015_08_29_03_world.sql diff --git a/sql/updates/world/2015_08_29_03_world.sql b/sql/updates/world/2015_08_29_03_world.sql new file mode 100644 index 00000000000..7d520664422 --- /dev/null +++ b/sql/updates/world/2015_08_29_03_world.sql @@ -0,0 +1,49 @@ +-- +DELETE FROM `creature` WHERE `guid`=126052; +DELETE FROM `creature_addon` WHERE `guid`=126052; +DELETE FROM `linked_respawn` WHERE `guid`=126052 AND `linkedGuid`=126103; +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (26668, 30810); +UPDATE `smart_scripts` SET `action_param6`=2 WHERE `entryorguid`=-126160 AND `id`=0; + +UPDATE `creature_template` SET `RegenHealth`=0 WHERE `entry`=12423; + +-- Spawn some missing 'Ghostclaw Ravager' and 'Greater Spindleweb' in Ghostlands +SET @CGUID := 130434; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID AND @CGUID+23; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 16349, 530, 1, 1, 6949.108, -6818.657, 48.41008, 2.161509, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+1, 16352, 530, 1, 1, 6933.826, -6715.566, 23.84517, 3.122064, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+2, 16352, 530, 1, 1, 6968.374, -6953.108, 51.54251, 2.980778, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+3, 16352, 530, 1, 1, 6890.797, -6722.461, 39.58191, 2.24407, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+4, 16352, 530, 1, 1, 6853.69, -6851.976, 69.60109, 2.738199, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+5, 16349, 530, 1, 1, 6950.041, -6888.719, 49.80816, 3.477853, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+6, 16352, 530, 1, 1, 6878.636, -6864.466, 62.72943, 2.882877, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+7, 16349, 530, 1, 1, 6895.033, -6912.371, 47.20905, 4.118551, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+8, 16349, 530, 1, 1, 6922.021, -7040.709, 43.90837, 4.415325, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+9, 16352, 530, 1, 1, 6885.669, -7022.219, 48.7115, 1.793493, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+10, 16349, 530, 1, 1, 6897.135, -6971.594, 47.17694, 2.724053, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+11, 16352, 530, 1, 1, 6978.319, -7000.734, 51.0767, 4.078644, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+12, 16352, 530, 1, 1, 6942.256, -7020.499, 45.66068, 0.1648275, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+13, 16349, 530, 1, 1, 6984.509, -7047.863, 51.65011, 1.124614, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+14, 16349, 530, 1, 1, 6963.142, -7082.294, 49.01252, 6.261704, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+15, 16352, 530, 1, 1, 6890.896, -7106.758, 45.10302, 1.95221, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+16, 16349, 530, 1, 1, 6836.949, -6998.213, 89.5099, 3.035898, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+17, 16349, 530, 1, 1, 6963.359, -7153.403, 47.53667, 3.969122, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+18, 16352, 530, 1, 1, 6966.125, -7145.214, 49.57573, 5.950935, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+19, 16349, 530, 1, 1, 7039.774, -6724.048, 31.42106, 0.8247696, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+20, 16349, 530, 1, 1, 6894.136, -6637.756, 22.16779, 4.740626, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+21, 16352, 530, 1, 1, 6892.136, -6687.743, 33.33307, 6.265609, 120, 5, 1), -- 16352 (Area: 3433) +(@CGUID+22, 16349, 530, 1, 1, 6862.79, -6653.266, 29.21497, 0.1569574, 120, 5, 1), -- 16349 (Area: 3433) +(@CGUID+23, 16349, 530, 1, 1, 6795.933, -6674.067, 43.69128, 2.761438, 120, 5, 1); -- 16349 (Area: 3433) + +-- Set all of these creatures to roam 5 yards, and random movement type +UPDATE `creature` SET `spawndist`=5, `MovementType`=1 WHERE id IN (16349,16352); + +UPDATE `quest_template_addon` SET `PrevQuestID`=0 WHERE `id`=9369; + +UPDATE `creature_template` SET `unit_flags`=537166656, `unit_flags2`=2048 WHERE `entry` IN (26737); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (26737) AND `source_type`=0 AND `id`=6; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(26737,0,6,0,6,0,100,0,0,0,0,0,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0,"Crazed Mana-Surge - On Just Died - Remove unit flag immune to pc"); + +UPDATE `creature_template` SET `unit_flags`=0 WHERE `entry`=10161; From 6fedea54ef3f1c678f0869807ac38b1db72351fd Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 29 Aug 2015 23:30:04 +0200 Subject: [PATCH 060/110] DB/Conditions: Fix conditions for Mortar and Fire Cannon Author: @joschiwald Closes #15080 --- sql/updates/world/2015_08_29_04_world.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 sql/updates/world/2015_08_29_04_world.sql diff --git a/sql/updates/world/2015_08_29_04_world.sql b/sql/updates/world/2015_08_29_04_world.sql new file mode 100644 index 00000000000..b0ffc1fb0c5 --- /dev/null +++ b/sql/updates/world/2015_08_29_04_world.sql @@ -0,0 +1,11 @@ +-- +-- Removed useless conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (62290,62307,62357,62489,62635); +-- Adjusted incorrect conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (62363,65044,65045); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition` ,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,2,62363,0,0,31,0,3,33214,0,0,0,'','Flame Leviathan - Anti-Air Rocket'), +(13,1,65044,0,0,32,0,0x18, 0,0,0,0,'','Flame Leviathan - Flames'), -- should hit everything +(13,2,65044,0,0,31,0,3,33090,0,0,0,'','Flame Leviathan - Flames'), +(13,1,65045,0,0,32,0,0x18, 0,0,0,0,'','Flame Leviathan - Flames'), -- should hit everything +(13,2,65045,0,0,31,0,3,33090,0,0,0,'','Flame Leviathan - Flames'); From 3748dddaa4607275d67c3a810ee9a27411c40ffe Mon Sep 17 00:00:00 2001 From: Incorrect Date: Sun, 30 Aug 2015 03:43:27 +0300 Subject: [PATCH 061/110] Core/Scripts: Remove duplicate code --- src/server/scripts/World/npcs_special.cpp | 122 +++++++--------------- 1 file changed, 36 insertions(+), 86 deletions(-) diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index d1d2ddc8a80..57346443390 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -942,6 +942,28 @@ public: { npc_garments_of_questsAI(Creature* creature) : npc_escortAI(creature) { + switch (me->GetEntry()) + { + case ENTRY_SHAYA: + quest = QUEST_MOON; + break; + case ENTRY_ROBERTS: + quest = QUEST_LIGHT_1; + break; + case ENTRY_DOLF: + quest = QUEST_LIGHT_2; + break; + case ENTRY_KORJA: + quest = QUEST_SPIRIT; + break; + case ENTRY_DG_KEL: + quest = QUEST_DARKNESS; + break; + default: + quest = 0; + break; + } + Reset(); } @@ -951,6 +973,7 @@ public: bool CanRun; uint32 RunAwayTimer; + uint32 quest; void Reset() override { @@ -982,93 +1005,20 @@ public: if (Player* player = caster->ToPlayer()) { - switch (me->GetEntry()) + if (quest && player->GetQuestStatus(quest) == QUEST_STATUS_INCOMPLETE) { - case ENTRY_SHAYA: - if (player->GetQuestStatus(QUEST_MOON) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_ROBERTS: - if (player->GetQuestStatus(QUEST_LIGHT_1) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_DOLF: - if (player->GetQuestStatus(QUEST_LIGHT_2) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_KORJA: - if (player->GetQuestStatus(QUEST_SPIRIT) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; - case ENTRY_DG_KEL: - if (player->GetQuestStatus(QUEST_DARKNESS) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, caster); - CanRun = true; - } - else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = caster->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, caster); - IsHealed = true; - } - } - break; + if (IsHealed && !CanRun && spell->Id == SPELL_FORTITUDE_R1) + { + Talk(SAY_THANKS, caster); + CanRun = true; + } + else if (!IsHealed && spell->Id == SPELL_LESSER_HEAL_R2) + { + CasterGUID = caster->GetGUID(); + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_HEALED, caster); + IsHealed = true; + } } // give quest credit, not expect any special quest objectives From 2bcd9c543f1f8866a2af5a5a68de3688afb3afc7 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sun, 30 Aug 2015 17:45:57 +0200 Subject: [PATCH 062/110] DB/Misc: Move some wotlk spawns to proper range --- sql/updates/world/2015_08_30_00_world.sql | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 sql/updates/world/2015_08_30_00_world.sql diff --git a/sql/updates/world/2015_08_30_00_world.sql b/sql/updates/world/2015_08_30_00_world.sql new file mode 100644 index 00000000000..02a247bdd6d --- /dev/null +++ b/sql/updates/world/2015_08_30_00_world.sql @@ -0,0 +1,33 @@ +-- +SET @CGUID := 84210; +SET @OLDCGUID := 370474; +SET @OLDCGUID2 := 325984; + +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+15; +DELETE FROM `creature` WHERE `guid` BETWEEN @OLDCGUID+0 AND @OLDCGUID+15; +DELETE FROM `creature` WHERE `guid` BETWEEN @OLDCGUID2+0 AND @OLDCGUID2+1; +INSERT INTO `creature` (`guid`, `id`, `map`, `SpawnMask`, `modelid`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 20212, 642, 3, 0, 7.305609, -0.095246, 34.51022, 3.159046, 7200, 0, 0), +(@CGUID+1, 20213, 641, 3, 0, 11.69965, 0.034146, 20.62076, 3.211406, 7200, 0, 0); + +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+2, 37543, 530, 1, 1, 9633.195, -7136.578, 30.51368, 0, 120, 0, 0), -- 37543 (Area: 3665) 3.3.5a +(@CGUID+3, 37543, 530, 1, 1, 9648.338, -7119.096, 28.47594, 0, 120, 0, 0), -- 37543 (Area: 3665) 3.3.5a +(@CGUID+4, 37543, 530, 1, 1, 9665.38, -7136.049, 28.58942, 0, 120, 0, 0), -- 37543 (Area: 3665) 3.3.5a +(@CGUID+5, 37574, 530, 1, 1, 9568.38, -7194.522, 24.68986, 4.660029, 120, 0, 0), -- 37574 (Area: 0) 3.3.5a +(@CGUID+6, 37574, 530, 1, 1, 9530.643, -7189.838, 31.87009, 4.660029, 120, 0, 0), -- 37574 (Area: 0) 3.3.5a +(@CGUID+7, 37543, 530, 1, 1, 9530.571, -7220.372, 30.44205, 1.22173, 120, 0, 0), -- 37543 (Area: 0) 3.3.5a +(@CGUID+8, 37574, 530, 1, 1, 9520.098, -7188.818, 31.84313, 4.660029, 120, 0, 0), -- 37574 (Area: 0) 3.3.5a +(@CGUID+9, 37574, 530, 1, 1, 9676.034, -7346.333, 22.96401, 4.660029, 120, 0, 0), -- 37574 (Area: 3482) 3.3.5a +(@CGUID+10, 37574, 530, 1, 1, 9683.437, -7394.599, 24.14162, 4.660029, 120, 0, 0), -- 37574 (Area: 3482) 3.3.5a +(@CGUID+11, 37574, 530, 1, 1, 9532.216, -7239.835, 24.74386, 4.660029, 120, 0, 0), -- 37574 (Area: 3482) 3.3.5a +(@CGUID+12, 37574, 530, 1, 1, 9574.714, -7221.677, 23.17951, 4.660029, 120, 0, 0), -- 37574 (Area: 3482) 3.3.5a +(@CGUID+13, 37543, 530, 1, 1, 9648.606, -7151.55, 28.7944, 0, 120, 0, 0), -- 37543 (Area: 3482) 3.3.5a +(@CGUID+14, 37543, 530, 1, 1, 9467.849, -7269.604, 34.85052, 0, 120, 0, 0), -- 37543 (Area: 3482) 3.3.5a +(@CGUID+15, 37543, 530, 1, 1, 9467.499, -7287.613, 36.13566, 0, 120, 0, 0); -- 37543 (Area: 3482) 3.3.5a + +DELETE FROM `creature_addon` WHERE `guid` IN (@CGUID, @CGUID+1); +DELETE FROM `creature_addon` WHERE `guid` IN (@OLDCGUID2, @OLDCGUID2+1); +INSERT INTO `creature_addon` (`guid`, `auras`) VALUES +(@CGUID+0, 66656), -- Parachute +(@CGUID+1, 66656); -- Parachute From 0cdf3b7a73d8d4769c790a9042b2305f4741f044 Mon Sep 17 00:00:00 2001 From: Killyana Date: Mon, 31 Aug 2015 16:19:37 +0200 Subject: [PATCH 063/110] DB/Creature: Kvaldir Raider Closes #15390 --- sql/updates/world/2015_08_31_01_world.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 sql/updates/world/2015_08_31_01_world.sql diff --git a/sql/updates/world/2015_08_31_01_world.sql b/sql/updates/world/2015_08_31_01_world.sql new file mode 100644 index 00000000000..c3a5bc4cdfd --- /dev/null +++ b/sql/updates/world/2015_08_31_01_world.sql @@ -0,0 +1,17 @@ +-- +-- Kvaldir Raider SAI +SET @ENTRY := 25760; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,1,2000,2000,4000,4000,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Raider - OOC - React passif"), +(@ENTRY,0,1,0,1,0,100,1,3000,5000,4000,4000,17,375,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Raider - OOC - Emote"), +(@ENTRY,0,2,0,1,0,100,1,3000,3000,4000,4000,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Raider - OOC - React Aggressif"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup` IN (1,2,3) AND `SourceEntry`=@ENTRY; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`,`NegativeCondition`) VALUES +(22,1,@ENTRY,0,0,1,1,43671,1,0,0,"","Only Run script if the npc has the aura 43671",0), +(22,2,@ENTRY,0,0,1,1,43671,1,0,0,"","Only Run script if the npc hasn't the aura 43671",1), +(22,3,@ENTRY,0,0,1,1,43671,1,0,0,"","Only Run script if the npc hasn't the aura 43671",1); + +UPDATE `creature_template_addon` SET `emote`=0 WHERE `entry`=@ENTRY; From 1e71aba2ee656a8407dec63a69d0879e16a070e2 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Mon, 31 Aug 2015 22:45:45 +0200 Subject: [PATCH 064/110] Core/Dungeon Finder: Add LFG roles of group members in LFG logs This changes logs like "(1|18)" to "(1 Healer, Dps|18 Tank, Healer, Dps)" --- src/server/game/DungeonFinding/LFGQueue.cpp | 69 +++++++++++++++++---- src/server/game/DungeonFinding/LFGQueue.h | 1 + 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index 6ac20541574..d2140a96a46 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -80,6 +80,49 @@ char const* GetCompatibleString(LfgCompatibility compatibles) } } +std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) +{ + if (check.empty()) + return ""; + + // need the guids in order to avoid duplicates + GuidSet guids(check.begin(), check.end()); + + std::ostringstream o; + + GuidSet::const_iterator it = guids.begin(); + o << it->GetRawValue(); + LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(*it); + if (itQueue == QueueDataStore.end()) + { + TC_LOG_ERROR("lfg.queue.data.details", "Queue data not found for [%s]", it->ToString().c_str()); + o << ' ' << GetRolesString(PLAYER_ROLE_NONE); + } + else + { + // skip leader flag, log only dps/tank/healer + o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); + } + + for (++it; it != guids.end(); ++it) + { + o << '|' << it->GetRawValue(); + itQueue = QueueDataStore.find(*it); + if (itQueue == QueueDataStore.end()) + { + TC_LOG_ERROR("lfg.queue.data.details", "Queue data not found for [%s]", it->ToString().c_str()); + o << ' ' << GetRolesString(PLAYER_ROLE_NONE); + } + else + { + // skip leader flag, log only dps/tank/healer + o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); + } + } + + return o.str(); +} + void LFGQueue::AddToQueue(ObjectGuid guid) { LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(guid); @@ -278,13 +321,13 @@ LfgCompatibility LFGQueue::FindNewGroups(GuidList& check, GuidList& all) std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); - TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s): %s - all(%s)", strGuids.c_str(), GetCompatibleString(compatibles), ConcatenateGuids(all).c_str()); + TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s): %s - all(%s)", GetDetailedMatchRoles(check).c_str(), GetCompatibleString(compatibles), GetDetailedMatchRoles(all).c_str()); if (compatibles == LFG_COMPATIBILITY_PENDING) // Not previously cached, calculate compatibles = CheckCompatibility(check); if (compatibles == LFG_COMPATIBLES_BAD_STATES && sLFGMgr->AllQueued(check)) { - TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s) compatibles (cached) changed from bad states to match", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s) compatibles (cached) changed from bad states to match", GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_MATCH); return LFG_COMPATIBLES_MATCH; } @@ -322,7 +365,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Check for correct size if (check.size() > MAXGROUPSIZE || check.empty()) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s): Size wrong - Not compatibles", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s): Size wrong - Not compatibles", GetDetailedMatchRoles(check).c_str()); return LFG_INCOMPATIBLES_WRONG_GROUP_SIZE; } @@ -336,7 +379,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) LfgCompatibility child_compatibles = CheckCompatibility(check); if (child_compatibles < LFG_COMPATIBLES_WITH_LESS_PLAYERS) // Group not compatible { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) child %s not compatibles", strGuids.c_str(), ConcatenateGuids(check).c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) child %s not compatibles", strGuids.c_str(), GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, child_compatibles); return child_compatibles; } @@ -374,7 +417,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Group with less that MAXGROUPSIZE members always compatible if (check.size() == 1 && numPlayers != MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", GetDetailedMatchRoles(check).c_str()); LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(check.front()); LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS); @@ -388,14 +431,14 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (numLfgGroups > 1) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) More than one Lfggroup (%u)", strGuids.c_str(), numLfgGroups); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) More than one Lfggroup (%u)", GetDetailedMatchRoles(check).c_str(), numLfgGroups); SetCompatibles(strGuids, LFG_INCOMPATIBLES_MULTIPLE_LFG_GROUPS); return LFG_INCOMPATIBLES_MULTIPLE_LFG_GROUPS; } if (numPlayers > MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Too much players (%u)", strGuids.c_str(), numPlayers); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Too much players (%u)", GetDetailedMatchRoles(check).c_str(), numPlayers); SetCompatibles(strGuids, LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS); return LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS; } @@ -423,7 +466,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (uint8 playersize = numPlayers - proposalRoles.size()) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) not compatible, %u players are ignoring each other", strGuids.c_str(), playersize); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) not compatible, %u players are ignoring each other", GetDetailedMatchRoles(check).c_str(), playersize); SetCompatibles(strGuids, LFG_INCOMPATIBLES_HAS_IGNORES); return LFG_INCOMPATIBLES_HAS_IGNORES; } @@ -435,7 +478,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) for (LfgRolesMap::const_iterator it = debugRoles.begin(); it != debugRoles.end(); ++it) o << ", " << it->first.GetRawValue() << ": " << GetRolesString(it->second); - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Roles not compatible%s", strGuids.c_str(), o.str().c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Roles not compatible%s", GetDetailedMatchRoles(check).c_str(), o.str().c_str()); SetCompatibles(strGuids, LFG_INCOMPATIBLES_NO_ROLES); return LFG_INCOMPATIBLES_NO_ROLES; } @@ -455,7 +498,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (proposalDungeons.empty()) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) No compatible dungeons%s", strGuids.c_str(), o.str().c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) No compatible dungeons%s", GetDetailedMatchRoles(check).c_str(), o.str().c_str()); SetCompatibles(strGuids, LFG_INCOMPATIBLES_NO_DUNGEONS); return LFG_INCOMPATIBLES_NO_DUNGEONS; } @@ -472,7 +515,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) // Enough players? if (numPlayers != MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Compatibles but not enough players(%u)", strGuids.c_str(), numPlayers); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Compatibles but not enough players(%u)", GetDetailedMatchRoles(check).c_str(), numPlayers); LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS); data.roles = proposalRoles; @@ -489,7 +532,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (!sLFGMgr->AllQueued(check)) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Group MATCH but can't create proposal!", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Group MATCH but can't create proposal!", GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_BAD_STATES); return LFG_COMPATIBLES_BAD_STATES; } @@ -531,7 +574,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) sLFGMgr->AddProposal(proposal); - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) MATCH! Group formed", strGuids.c_str()); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) MATCH! Group formed", GetDetailedMatchRoles(check).c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_MATCH); return LFG_COMPATIBLES_MATCH; } diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h index 9bf8ee64b78..77683614d49 100644 --- a/src/server/game/DungeonFinding/LFGQueue.h +++ b/src/server/game/DungeonFinding/LFGQueue.h @@ -88,6 +88,7 @@ class LFGQueue public: // Add/Remove from queue + std::string GetDetailedMatchRoles(GuidList const& check); void AddToQueue(ObjectGuid guid); void RemoveFromQueue(ObjectGuid guid); void AddQueueData(ObjectGuid guid, time_t joinTime, LfgDungeonSet const& dungeons, LfgRolesMap const& rolesMap); From fc17d1a9410d96437151b4139a1757e35a7fb635 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Tue, 1 Sep 2015 16:48:45 +0200 Subject: [PATCH 065/110] DB/Misc: Fix some phasemask --- sql/updates/world/2015_09_01_00_world_335.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_01_00_world_335.sql diff --git a/sql/updates/world/2015_09_01_00_world_335.sql b/sql/updates/world/2015_09_01_00_world_335.sql new file mode 100644 index 00000000000..a14e8633c7a --- /dev/null +++ b/sql/updates/world/2015_09_01_00_world_335.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature` SET `phaseMask`=1 WHERE `phaseMask`=65535; From b7f9836d223925802115f45ad2c2c7eeb9bb00a4 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Tue, 1 Sep 2015 22:33:55 +0200 Subject: [PATCH 066/110] Core/Dungeon Finder: Remove disconnected players from LFG queue Fix LFG queue issues by removing disconnected players from LFG queue and their party with them. --- src/server/game/DungeonFinding/LFGMgr.cpp | 4 ++-- src/server/game/DungeonFinding/LFGMgr.h | 2 +- src/server/game/DungeonFinding/LFGScripts.cpp | 2 ++ src/server/game/Server/WorldSession.h | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 59eedaaffed..1f52623461c 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -585,7 +585,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const @param[in] guid Player or group guid */ -void LFGMgr::LeaveLfg(ObjectGuid guid) +void LFGMgr::LeaveLfg(ObjectGuid guid, bool disconnected) { ObjectGuid gguid = guid.IsGroup() ? guid : GetGroup(guid); @@ -646,7 +646,7 @@ void LFGMgr::LeaveLfg(ObjectGuid guid) break; case LFG_STATE_DUNGEON: case LFG_STATE_FINISHED_DUNGEON: - if (guid != gguid) // Player + if (guid != gguid && !disconnected) // Player SetState(guid, LFG_STATE_NONE); break; } diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index fda9a8b7ce9..90fbc36a114 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -399,7 +399,7 @@ class LFGMgr /// Join Lfg with selected roles, dungeons and comment void JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, std::string const& comment); /// Leaves lfg - void LeaveLfg(ObjectGuid guid); + void LeaveLfg(ObjectGuid guid, bool disconnected = false); // LfgQueue /// Get last lfg state (NONE, DUNGEON or FINISHED_DUNGEON) diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 852eb7d8c5f..b1ae61cef11 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -44,6 +44,8 @@ void LFGPlayerScript::OnLogout(Player* player) player->GetSession()->SendLfgLfrList(false); sLFGMgr->LeaveLfg(player->GetGUID()); } + else if (player->GetSession()->PlayerDisconnected()) + sLFGMgr->LeaveLfg(player->GetGUID(), true); } void LFGPlayerScript::OnLogin(Player* player, bool /*loginFirst*/) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 87a40657e24..3753f796768 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -256,6 +256,7 @@ class WorldSession bool PlayerLogout() const { return m_playerLogout; } bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; } bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } + bool PlayerDisconnected() const { return !m_Socket; } void ReadAddonsInfo(WorldPacket& data); void SendAddonsInfo(); From a83437af3dd03cc2227947ff229da3bf2d5421f0 Mon Sep 17 00:00:00 2001 From: treeston Date: Wed, 2 Sep 2015 02:02:34 +0100 Subject: [PATCH 067/110] Script/BoreanTundra: Fix dialog and final waypoint for quest 11570: "Escape from the Winterfin Caverns" This fixes the following bugs: Escortee NPC quotes are out of order (see #15396 (comment)) Final escort waypoint is located incorrectly and causes the escorted NPC to drop all the way to the bottom of the ocean before quest completion is awarded. Closes #15396 Signed-off-by: DDuarte --- sql/updates/world/2015_09_02_00_world.sql | 7 +++++++ src/server/scripts/Northrend/zone_borean_tundra.cpp | 10 ++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 sql/updates/world/2015_09_02_00_world.sql diff --git a/sql/updates/world/2015_09_02_00_world.sql b/sql/updates/world/2015_09_02_00_world.sql new file mode 100644 index 00000000000..c83de23b06a --- /dev/null +++ b/sql/updates/world/2015_09_02_00_world.sql @@ -0,0 +1,7 @@ +-- Waypoint fix for quest "Escape from the Winterfin Caverns" (11570) +UPDATE `script_waypoint` SET `location_x`=4279.54, `location_y`=6187.932, `location_z`=0.294670 WHERE `entry`=25208 AND `pointid`=41; + +-- Swap 1st and 2nd text +UPDATE `creature_text` SET `groupid` = 99 WHERE `entry` = 25208 AND `groupid` = 0 AND `id` = 0; +UPDATE `creature_text` SET `groupid` = 0 WHERE `entry` = 25208 AND `groupid` = 1 AND `id` = 0; +UPDATE `creature_text` SET `groupid` = 1 WHERE `entry` = 25208 AND `groupid` = 99 AND `id` = 0; diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 6069c0d8be7..4cdfa653224 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -596,12 +596,13 @@ public: switch (IntroPhase) { case 1: - Talk(SAY_START_1); + if (Player* player = GetPlayerForEscort()) + Talk(SAY_START_1, player); IntroPhase = 2; IntroTimer = 7500; break; case 2: - Talk(SAY_END_1); + Talk(SAY_START_2); IntroPhase = 3; IntroTimer = 7500; break; @@ -611,12 +612,13 @@ public: IntroTimer = 0; break; case 4: - Talk(SAY_START_2); + Talk(SAY_END_1); IntroPhase = 5; IntroTimer = 8000; break; case 5: - Talk(SAY_END_2); + if (Player* player = GetPlayerForEscort()) + Talk(SAY_END_2, player); IntroPhase = 6; IntroTimer = 2500; break; From 0ba33ce8def1390aac474101dbc3b25288afd63e Mon Sep 17 00:00:00 2001 From: Killyana Date: Wed, 2 Sep 2015 04:54:03 +0200 Subject: [PATCH 068/110] DB/Spell: Add missing visual spell in Gortok Palehoof encounter Cosmetic channeling spell casted by the red Orb to wake up the npcs --- sql/updates/world/2015_09_02_01_world.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sql/updates/world/2015_09_02_01_world.sql diff --git a/sql/updates/world/2015_09_02_01_world.sql b/sql/updates/world/2015_09_02_01_world.sql new file mode 100644 index 00000000000..1b58aed1abc --- /dev/null +++ b/sql/updates/world/2015_09_02_01_world.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=47669; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `Comment`) VALUES +(13, 1, 47669, 0, 1, 0, 48048, 0,0, "Awaken Subboss"); + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 48048; +INSERT INTO `spell_linked_spell` VALUES (48048, 47669, 0, 'Awaken Subboss'); From 470c3e84206096705f43bb3f151086822488d8bd Mon Sep 17 00:00:00 2001 From: DDuarte Date: Wed, 2 Sep 2015 15:21:24 +0100 Subject: [PATCH 069/110] SQL renames after PR merge --- .../{2015_08_26_01_world_335.sql => 2015_09_02_02_world_335.sql} | 0 .../{2015_08_29_01_world_335.sql => 2015_09_02_03_world_335.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename sql/updates/world/{2015_08_26_01_world_335.sql => 2015_09_02_02_world_335.sql} (100%) rename sql/updates/world/{2015_08_29_01_world_335.sql => 2015_09_02_03_world_335.sql} (100%) diff --git a/sql/updates/world/2015_08_26_01_world_335.sql b/sql/updates/world/2015_09_02_02_world_335.sql similarity index 100% rename from sql/updates/world/2015_08_26_01_world_335.sql rename to sql/updates/world/2015_09_02_02_world_335.sql diff --git a/sql/updates/world/2015_08_29_01_world_335.sql b/sql/updates/world/2015_09_02_03_world_335.sql similarity index 100% rename from sql/updates/world/2015_08_29_01_world_335.sql rename to sql/updates/world/2015_09_02_03_world_335.sql From 24a624b38c5d436341a4b87eef6fbe66afc4bfb6 Mon Sep 17 00:00:00 2001 From: Killyana Date: Wed, 2 Sep 2015 17:53:38 +0200 Subject: [PATCH 070/110] DB/Creature: Remove a Duplicate spawn for Overseer Deathgaze Add a cosmetic channeling spell for Decrepit Necromancer and remove a wrong emote. Closes #15404 --- sql/updates/world/2015_09_02_04_world.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 sql/updates/world/2015_09_02_04_world.sql diff --git a/sql/updates/world/2015_09_02_04_world.sql b/sql/updates/world/2015_09_02_04_world.sql new file mode 100644 index 00000000000..2a66eb3390f --- /dev/null +++ b/sql/updates/world/2015_09_02_04_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `creature` WHERE `guid`=118724 AND `id`=27122; +UPDATE `creature` SET `equipment_id`=1 WHERE `guid`=52290; +UPDATE `creature_template_addon` SET `emote`=0 WHERE `entry`=26942; +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=45491, `target_type`=19, `target_param1`=27180, `target_param2`=10, `comment`="Decrepit Necromancer - Out of Combat - Cast Necrotic Purple Beam" WHERE `entryorguid`=26942 AND `source_type`=0 AND `id`=0; From 1d7ba7bab3931867dafaa7d9d26edf4ebc5d3d4a Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 3 Sep 2015 07:57:25 +0200 Subject: [PATCH 071/110] DB/Misc: Delete duplicate spawn --- sql/updates/world/2015_09_03_00_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_00_world.sql diff --git a/sql/updates/world/2015_09_03_00_world.sql b/sql/updates/world/2015_09_03_00_world.sql new file mode 100644 index 00000000000..90eeee2e0ee --- /dev/null +++ b/sql/updates/world/2015_09_03_00_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=137997 AND `id`=10319; From fad26ed88b43163b22a8c1d8b29f7a660303faeb Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 3 Sep 2015 08:03:17 +0200 Subject: [PATCH 072/110] DB/Misc: Delete another duplicate spawn --- sql/updates/world/2015_09_03_01_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_01_world.sql diff --git a/sql/updates/world/2015_09_03_01_world.sql b/sql/updates/world/2015_09_03_01_world.sql new file mode 100644 index 00000000000..0f1a0348ef1 --- /dev/null +++ b/sql/updates/world/2015_09_03_01_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=208775 AND `id`=25958; From a5fdf5635e83b1cd21ca583a8aabe06b0d4fd777 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 3 Sep 2015 09:56:27 +0200 Subject: [PATCH 073/110] DB/Misc: Delete more duplicated spawns --- sql/updates/world/2015_09_03_02_world.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sql/updates/world/2015_09_03_02_world.sql diff --git a/sql/updates/world/2015_09_03_02_world.sql b/sql/updates/world/2015_09_03_02_world.sql new file mode 100644 index 00000000000..3baa80fbac1 --- /dev/null +++ b/sql/updates/world/2015_09_03_02_world.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `creature` WHERE `guid`=201508 AND `id`=37824; +DELETE FROM `creature` WHERE `guid`=201460 AND `id`=38228; +DELETE FROM `creature` WHERE `guid`=201661 AND `id`=38228; +DELETE FROM `creature` WHERE `guid`=201442 AND `id`=38231; +DELETE FROM `creature` WHERE `guid`=201490 AND `id`=38232; +DELETE FROM `creature` WHERE `guid`=201539 AND `id`=38232; From b8f075a1ab36277070d1c3c73943e20a822fd042 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 3 Sep 2015 10:06:59 +0200 Subject: [PATCH 074/110] DB/Misc: Delete another duplicate spawn --- sql/updates/world/2015_09_03_03_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_03_world.sql diff --git a/sql/updates/world/2015_09_03_03_world.sql b/sql/updates/world/2015_09_03_03_world.sql new file mode 100644 index 00000000000..8e717422930 --- /dev/null +++ b/sql/updates/world/2015_09_03_03_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=88282 AND `id`=18700; From 9a1301df4698f4eb6c34145a1c8d3254a1ae5b85 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 3 Sep 2015 11:42:10 +0200 Subject: [PATCH 075/110] DB/Misc: Delete another duplicate spawn --- sql/updates/world/2015_09_03_04_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_04_world.sql diff --git a/sql/updates/world/2015_09_03_04_world.sql b/sql/updates/world/2015_09_03_04_world.sql new file mode 100644 index 00000000000..9c4d4d98828 --- /dev/null +++ b/sql/updates/world/2015_09_03_04_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=28649 AND `id`=17148; From b41e0156dbc084ec35603cb30492e0410eb697dd Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Thu, 3 Sep 2015 13:45:52 +0200 Subject: [PATCH 076/110] DB/World: fix bad field rename introduced in 6b43e72f019b6a91be812f4e4da58a4dae7c21a6 --- sql/updates/world/2015_09_03_05_world_335.sql | 3 +++ src/server/game/Globals/ObjectMgr.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 sql/updates/world/2015_09_03_05_world_335.sql diff --git a/sql/updates/world/2015_09_03_05_world_335.sql b/sql/updates/world/2015_09_03_05_world_335.sql new file mode 100644 index 00000000000..eed2d862803 --- /dev/null +++ b/sql/updates/world/2015_09_03_05_world_335.sql @@ -0,0 +1,3 @@ +ALTER TABLE `quest_template` + CHANGE COLUMN `Method` `QuestType` TINYINT(3) UNSIGNED NOT NULL DEFAULT '2' AFTER `ID`, + CHANGE COLUMN `QuestType` `QuestInfoID` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `QuestSortID`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a568409d918..71b06c1a308 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3966,8 +3966,8 @@ void ObjectMgr::LoadQuests() mExclusiveQuestGroups.clear(); QueryResult result = WorldDatabase.Query("SELECT " - //0 1 2 3 4 5 6 7 8 - "ID, Method, QuestLevel, MinLevel, QuestSortID, QuestType, SuggestedGroupNum, LimitTime, RequiredRaces," + //0 1 2 3 4 5 6 7 8 + "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, LimitTime, RequiredRaces," // 9 10 11 12 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, " // 13 14 15 16 17 18 19 20 From 82f69b5bea09f4bb3e977817324dac733d632752 Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 3 Sep 2015 20:20:44 +0200 Subject: [PATCH 077/110] DB/Quest: Magic Carpet Ride Remove a wrong spell used to ride the carpet Closes #15418 --- sql/updates/world/2015_09_03_06_world.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 sql/updates/world/2015_09_03_06_world.sql diff --git a/sql/updates/world/2015_09_03_06_world.sql b/sql/updates/world/2015_09_03_06_world.sql new file mode 100644 index 00000000000..3444afe1d77 --- /dev/null +++ b/sql/updates/world/2015_09_03_06_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=2546000 AND `source_type`=9 AND `id`=0 AND `action_type`=11; +UPDATE `smart_scripts` SET `id`=0 WHERE `entryorguid`=2546000 AND `source_type`=9 AND `id`=1 AND `action_type`=53; + +DELETE FROM `creature_addon` WHERE `guid`=137997; -- fix a DB error From 381285865cdd1fc5904a2f8694dd3a115d1e842f Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 3 Sep 2015 20:37:02 +0200 Subject: [PATCH 078/110] DB/NPC: Blue Crashin' Thrashin' Racer and Crashin' Thrashin' Racer Add missing auras and a spell. By: @sirikfoll Closes #15407 --- sql/updates/world/2015_09_03_07_world.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 sql/updates/world/2015_09_03_07_world.sql diff --git a/sql/updates/world/2015_09_03_07_world.sql b/sql/updates/world/2015_09_03_07_world.sql new file mode 100644 index 00000000000..28736bdf787 --- /dev/null +++ b/sql/updates/world/2015_09_03_07_world.sql @@ -0,0 +1,6 @@ +-- +UPDATE `creature_template` SET `spell1`=49297 WHERE `entry` IN (27664,40281); +DELETE FROM `creature_template_addon` WHERE `entry` IN (27664,40281); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(27664,0,0,0,0,0,'49384'), +(40281,0,0,0,0,0,'75110'); From 2df70fd1a748e70582caeda203179dd485f9d82d Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 3 Sep 2015 20:44:06 +0200 Subject: [PATCH 079/110] DB/Item: Girdle of the Warrior Magi Fix socket bonus By: @Rochet2 Closes #15311 --- sql/updates/world/2015_09_03_08_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_08_world.sql diff --git a/sql/updates/world/2015_09_03_08_world.sql b/sql/updates/world/2015_09_03_08_world.sql new file mode 100644 index 00000000000..9331944eb09 --- /dev/null +++ b/sql/updates/world/2015_09_03_08_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `item_template` SET `socketcolor_1` = 4 WHERE `entry` = 44176; From b14f04c485f6dde7be2257086eab863b5b78d6b3 Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 3 Sep 2015 20:48:00 +0200 Subject: [PATCH 080/110] DB/NPC: Skyguard Scout Add cosmetic mount Closes #15305 --- sql/updates/world/2015_09_03_09_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_09_world.sql diff --git a/sql/updates/world/2015_09_03_09_world.sql b/sql/updates/world/2015_09_03_09_world.sql new file mode 100644 index 00000000000..516d2245f3c --- /dev/null +++ b/sql/updates/world/2015_09_03_09_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template_addon` SET `mount`=21158 WHERE `entry`=22980; From 32e719eb2fb1baca322fd1b032989cbca0e7218d Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 3 Sep 2015 21:00:24 +0200 Subject: [PATCH 081/110] DB/Item: Comet's Trail FIx internal cooldown By @Keader Closes #15096 --- sql/updates/world/2015_09_03_10_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_03_10_world.sql diff --git a/sql/updates/world/2015_09_03_10_world.sql b/sql/updates/world/2015_09_03_10_world.sql new file mode 100644 index 00000000000..5394299e737 --- /dev/null +++ b/sql/updates/world/2015_09_03_10_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `spell_proc_event` SET `Cooldown`=45 WHERE `entry`=64786; From 9f2f56afc90acb73e0c2389899f1e2efd64555c7 Mon Sep 17 00:00:00 2001 From: Killyana Date: Thu, 3 Sep 2015 21:35:22 +0200 Subject: [PATCH 082/110] DB/Quest: Therylune Fix npc behavior Thanks to @Rushor and @CreshandKesh Closes #14763 --- sql/updates/world/2015_09_03_11_world.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 sql/updates/world/2015_09_03_11_world.sql diff --git a/sql/updates/world/2015_09_03_11_world.sql b/sql/updates/world/2015_09_03_11_world.sql new file mode 100644 index 00000000000..c499b5a71c6 --- /dev/null +++ b/sql/updates/world/2015_09_03_11_world.sql @@ -0,0 +1,10 @@ +-- +SET @ENTRY := 3584; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`>=5; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,5,7,61,0,100,0,945,0,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,"Therylune - On Quest 'Therylune's Escape' Taken - Set Faction 250"), +(@ENTRY,0,6,8,11,0,100,0,0,0,0,0,2,124,0,0,0,0,0,1,0,0,0,0,0,0,0,"Therylune - On Respawn - Set Faction 124"), +(@ENTRY,0,7,9,61,0,100,0,0,0,0,0,19,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Therylune - On Quest 'Therylune's Escape' Taken - Remove Flags Immune To NPC's"), +(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,18,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Therylune - On Respawn - Set Flags Immune To NPC's"), +(@ENTRY,0,9,0,61,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Therylune - On Quest 'Therylune's Escape' Taken - Remove npc flag"); +UPDATE `smart_scripts` SET `link`=5 WHERE `entryorguid`=3584 AND `source_type`=0 AND `id`=1 AND `link`=0; From 6306531566bd35503dfbb0b0c7d8b1c4ee72af78 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Fri, 4 Sep 2015 09:36:11 +0200 Subject: [PATCH 083/110] DB/Creature: Delete duplicate spawn --- sql/updates/world/2015_09_04_00_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_04_00_world.sql diff --git a/sql/updates/world/2015_09_04_00_world.sql b/sql/updates/world/2015_09_04_00_world.sql new file mode 100644 index 00000000000..2e67495733c --- /dev/null +++ b/sql/updates/world/2015_09_04_00_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=151994 AND `id`=32475; From 959fe73410809f5889ba0a3ea60307af48b3e932 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Fri, 4 Sep 2015 09:54:43 +0200 Subject: [PATCH 084/110] DB/Creature: Delete duplicate spawn --- sql/updates/world/2015_09_04_01_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_04_01_world.sql diff --git a/sql/updates/world/2015_09_04_01_world.sql b/sql/updates/world/2015_09_04_01_world.sql new file mode 100644 index 00000000000..e9c3f9884ad --- /dev/null +++ b/sql/updates/world/2015_09_04_01_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=134518 AND `id`=23810; From df8809c6f06bf1112da4ada1a60c6ff4ee11cfbc Mon Sep 17 00:00:00 2001 From: Aokromes Date: Fri, 4 Sep 2015 10:07:22 +0200 Subject: [PATCH 085/110] DB/Creature: Delete duplicate spawn --- sql/updates/world/2015_09_04_02_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_04_02_world.sql diff --git a/sql/updates/world/2015_09_04_02_world.sql b/sql/updates/world/2015_09_04_02_world.sql new file mode 100644 index 00000000000..9b96e3a43fa --- /dev/null +++ b/sql/updates/world/2015_09_04_02_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `guid`=123124 AND `id`=32769; From 1403d5d0bb3f061777356cd8e1564588f8663820 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Fri, 4 Sep 2015 10:11:07 +0200 Subject: [PATCH 086/110] DB/Creature: Delete duplicated spawns --- sql/updates/world/2015_09_04_03_world.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 sql/updates/world/2015_09_04_03_world.sql diff --git a/sql/updates/world/2015_09_04_03_world.sql b/sql/updates/world/2015_09_04_03_world.sql new file mode 100644 index 00000000000..33509c700c6 --- /dev/null +++ b/sql/updates/world/2015_09_04_03_world.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `creature` WHERE `guid`=120833 AND `id`=32769; +DELETE FROM `creature` WHERE `guid`=120831 AND `id`=32769; From 02d014c69d53a4298db1747e9c848d10b84e91d2 Mon Sep 17 00:00:00 2001 From: MitchesD Date: Fri, 14 Aug 2015 22:50:28 +0200 Subject: [PATCH 087/110] Core/SmartScripts: SMART_ACTION_TALK - added action param 3 to set target as talk target (used for $vars in texts and whisper target) * by default (action param 3 is 0), it will try to trigger talk of the target (cherry picked from commit 7b491046e94af498b2428ebe7decf6353cbb61a2) --- src/server/game/AI/SmartScripts/SmartScript.cpp | 9 +++++++-- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 9fa2269fd8b..dadffe735d2 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -123,13 +123,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u ObjectList* targets = GetTargets(e, unit); Creature* talker = me; Player* targetPlayer = NULL; + Unit* talkTarget = NULL; + if (targets) { for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { if (IsCreature(*itr) && !(*itr)->ToCreature()->IsPet()) // Prevented sending text to pets. { - talker = (*itr)->ToCreature(); + if (e.action.talk.useTalkTarget) + talkTarget = (*itr)->ToCreature(); + else + talker = (*itr)->ToCreature(); break; } else if (IsPlayer(*itr)) @@ -148,7 +153,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u mTalkerEntry = talker->GetEntry(); mLastTextID = e.action.talk.textGroupID; mTextTimer = e.action.talk.duration; - Unit* talkTarget = NULL; + if (IsPlayer(GetLastInvoker())) // used for $vars in texts and whisper target talkTarget = GetLastInvoker(); else if (targetPlayer) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 8565c5d3497..60a4ce5e8ed 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -426,7 +426,7 @@ enum SMART_SCRIPT_RESPAWN_CONDITION enum SMART_ACTION { SMART_ACTION_NONE = 0, // No action - SMART_ACTION_TALK = 1, // groupID from creature_text, duration to wait before TEXT_OVER event is triggered + SMART_ACTION_TALK = 1, // groupID from creature_text, duration to wait before TEXT_OVER event is triggered, useTalkTarget (0/1) - use target as talk target SMART_ACTION_SET_FACTION = 2, // FactionId (or 0 for default) SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL = 3, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to demorph) SMART_ACTION_SOUND = 4, // SoundId, onlySelf @@ -553,6 +553,7 @@ struct SmartAction { uint32 textGroupID; uint32 duration; + uint32 useTalkTarget; } talk; struct From 7c91984a64c2f78ad17153018a42926dfcf0ae59 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 5 Sep 2015 13:54:44 +0200 Subject: [PATCH 088/110] Core/Chat: Allow to sanitize | characters when sending messages to clients Add an optional parameter "escapeCharacters" to ChatHandler::SendSysMessage() to properly escape | character, otherwise it might freeze the client. --- src/server/game/Chat/Chat.cpp | 28 ++++++++++++++++++++++++---- src/server/game/Chat/Chat.h | 4 ++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 5a74ad05b66..0d6816fc80d 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -186,13 +186,33 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part) return true; } -void ChatHandler::SendSysMessage(const char *str) +void ChatHandler::SendSysMessage(const char *str, bool escapeCharacters) { WorldPacket data; // need copy to prevent corruption by strtok call in LineFromMessage original string - char* buf = strdup(str); - char* pos = buf; + char* buf; + char* pos; + + if (escapeCharacters && strchr(str, '|')) + { + size_t startPos = 0; + std::ostringstream o; + while (const char* charPos = strchr(str + startPos, '|')) + { + o.write(str + startPos, charPos - str - startPos); + o << "||"; + startPos = charPos - str + 1; + } + o.write(str + startPos, strlen(str) - startPos); + buf = strdup(o.str().c_str()); + } + else + { + buf = strdup(str); + } + + pos = buf; while (char* line = LineFromMessage(pos)) { @@ -1223,7 +1243,7 @@ bool CliHandler::isAvailable(ChatCommand const& cmd) const return cmd.AllowConsole; } -void CliHandler::SendSysMessage(const char *str) +void CliHandler::SendSysMessage(const char *str, bool /*escapeCharacters*/) { m_print(m_callbackArg, str); m_print(m_callbackArg, "\r\n"); diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 1b095534ad0..72d80aba7e6 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -66,7 +66,7 @@ class ChatHandler // function with different implementation for chat/console virtual char const* GetTrinityString(uint32 entry) const; - virtual void SendSysMessage(char const* str); + virtual void SendSysMessage(char const* str, bool escapeCharacters = false); void SendSysMessage(uint32 entry); @@ -166,7 +166,7 @@ class CliHandler : public ChatHandler char const* GetTrinityString(uint32 entry) const override; bool isAvailable(ChatCommand const& cmd) const override; bool HasPermission(uint32 /*permission*/) const override { return true; } - void SendSysMessage(const char *str) override; + void SendSysMessage(const char *str, bool escapeCharacters) override; std::string GetNameLink() const override; bool needReportToTarget(Player* chr) const override; LocaleConstant GetSessionDbcLocale() const override; From 16e9882aa86186d85bb2cb9d2b8fbb6165c2fe96 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 5 Sep 2015 17:08:37 +0200 Subject: [PATCH 089/110] Core/Dungeon Finder: Improve ".lfg queue debug" command Log roles of every combinations in ".lfg queue debug" output --- src/server/game/DungeonFinding/LFGQueue.cpp | 36 ++++++++++++--------- src/server/scripts/Commands/cs_lfg.cpp | 2 +- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index d2140a96a46..f4974e0938b 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -72,7 +72,7 @@ char const* GetCompatibleString(LfgCompatibility compatibles) case LFG_INCOMPATIBLES_NO_ROLES: return "Incompatible roles"; case LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS: - return "Too much players"; + return "Too many players"; case LFG_INCOMPATIBLES_WRONG_GROUP_SIZE: return "Wrong group size"; default: @@ -93,12 +93,7 @@ std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) GuidSet::const_iterator it = guids.begin(); o << it->GetRawValue(); LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(*it); - if (itQueue == QueueDataStore.end()) - { - TC_LOG_ERROR("lfg.queue.data.details", "Queue data not found for [%s]", it->ToString().c_str()); - o << ' ' << GetRolesString(PLAYER_ROLE_NONE); - } - else + if (itQueue != QueueDataStore.end()) { // skip leader flag, log only dps/tank/healer o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); @@ -108,12 +103,7 @@ std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) { o << '|' << it->GetRawValue(); itQueue = QueueDataStore.find(*it); - if (itQueue == QueueDataStore.end()) - { - TC_LOG_ERROR("lfg.queue.data.details", "Queue data not found for [%s]", it->ToString().c_str()); - o << ' ' << GetRolesString(PLAYER_ROLE_NONE); - } - else + if (itQueue != QueueDataStore.end()) { // skip leader flag, log only dps/tank/healer o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); @@ -438,7 +428,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check) if (numPlayers > MAXGROUPSIZE) { - TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Too much players (%u)", GetDetailedMatchRoles(check).c_str(), numPlayers); + TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) Too many players (%u)", GetDetailedMatchRoles(check).c_str(), numPlayers); SetCompatibles(strGuids, LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS); return LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS; } @@ -666,7 +656,23 @@ std::string LFGQueue::DumpCompatibleInfo(bool full /* = false */) const o << "Compatible Map size: " << CompatibleMapStore.size() << "\n"; if (full) for (LfgCompatibleContainer::const_iterator itr = CompatibleMapStore.begin(); itr != CompatibleMapStore.end(); ++itr) - o << "(" << itr->first << "): " << GetCompatibleString(itr->second.compatibility) << "\n"; + { + o << "(" << itr->first << "): " << GetCompatibleString(itr->second.compatibility); + if (!itr->second.roles.empty()) + { + o << " ("; + bool first = true; + for (const auto& role : itr->second.roles) + { + if (!first) + o << "|"; + o << role.first.GetRawValue() << " " << GetRolesString(role.second & uint8(~PLAYER_ROLE_LEADER)); + first = false; + } + o << ")"; + } + o << "\n"; + } return o.str(); } diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp index d1662f3a97c..8bb64a454d2 100644 --- a/src/server/scripts/Commands/cs_lfg.cpp +++ b/src/server/scripts/Commands/cs_lfg.cpp @@ -150,7 +150,7 @@ public: static bool HandleLfgQueueInfoCommand(ChatHandler* handler, char const* args) { - handler->SendSysMessage(sLFGMgr->DumpQueueInfo(*args != '\0').c_str()); + handler->SendSysMessage(sLFGMgr->DumpQueueInfo(*args != '\0').c_str(), true); return true; } From 053209562376d4f0eb9fdaf8c66cfe18d73a849c Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 5 Sep 2015 19:19:59 +0200 Subject: [PATCH 090/110] DB/NPC: Add Lady Medley Crew Closes #13911 --- sql/updates/world/2015_09_05_00_world.sql | 335 ++++++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 sql/updates/world/2015_09_05_00_world.sql diff --git a/sql/updates/world/2015_09_05_00_world.sql b/sql/updates/world/2015_09_05_00_world.sql new file mode 100644 index 00000000000..a259ae99f23 --- /dev/null +++ b/sql/updates/world/2015_09_05_00_world.sql @@ -0,0 +1,335 @@ +-- +SET @GUID := 52011; -- 11 FREE CGUID SET BY TC +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID + 10; +INSERT INTO `creature` (`guid`, `id`, `map`, `modelid`, `position_x`, `position_y`, `position_z`, `orientation`, `curhealth`) VALUES +(@GUID + 0, 24833, 584, 22659, 26.68381, 5.156456, 11.14973, 1.562181, 1474), -- Captain "Stash" Torgoley - 75958 +(@GUID + 1, 24834, 584, 22660, 17.73618, -7.963644, 6.181007, 1.658063, 1474), -- Galley Chief Grace - 75959 +(@GUID + 2, 24835, 584, 22661, 24.61499, 5.468628, 16.04766, 3.176499, 1358), -- First Mate Kowalski - 75960 +(@GUID + 3, 24836, 584, 262, -4.359131, 3.349854, 6.099176, 1.576669, 312), -- Abe the Cabin Boy - 75961 +(@GUID + 4, 24837, 584, 22662, 19.20459, -7.213135, 6.097228, 3.667171, 867), -- Navigator Mehran - 75962 +(@GUID + 5, 24838, 584, 22663, -27.50586, -3.588379, 21.17929, 2.405203, 804), -- Sailor Henders - 75963 +(@GUID + 6, 24839, 584, 22664, 6.123779, 10.77246, 11.47038, 1.539951, 804), -- Sailor Wicks - 75964 +(@GUID + 7, 24840, 584, 22665, 28.74146, 6.708008, 6.096051, 1.087228, 804), -- Sailor Vines - 75965 +(@GUID + 8, 24841, 584, 1858, -9.322998, -1.669921, 6.09808, 0.01745319, 10236), -- Marine Halters - 75966 +(@GUID + 9, 24842, 584, 22666, 14.44629, 0.1442871, 12.0214, 3.309605, 10236), -- Marine Anderson - 75967 +(@GUID + 10, 24843, 584, 22667, 6.350558, 8.718207, 6.180843, 5.427974, 928); -- Engineer Combs - 75968 + +-- Pathing for Entry: 24833 'TDB FORMAT' +SET @NPC := @GUID; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=37.03026,`position_y`=4.622362,`position_z`=6.176411, `orientation`=1.00 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,1,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,37.03026,4.622362,6.176411,1.00,35000,0,0,100,0), +(@PATH,2,33.79711,3.379296,6.136233,0,0,0,0,100,0), +(@PATH,3,30.11437,1.977602,6.346729,0,0,0,0,100,0), +(@PATH,4,28.86437,2.977602,6.346729,0,0,0,0,100,0), +(@PATH,5,26.34205,5.299405,6.347331,0,0,0,0,100,0), +(@PATH,6,23.84205,5.299405,6.347331,0,0,0,0,100,0), +(@PATH,7,17.09205,5.049405,6.347331,0,0,0,0,100,0), +(@PATH,8,10.25663,4.995337,6.348217,0,0,0,0,100,0), +(@PATH,9,7.917565,0.5690584,6.348763,0,0,0,0,100,0), +(@PATH,10,8.917565,-0.9309416,6.348763,0,0,0,0,100,0), +(@PATH,11,11.10869,-4.599314,6.348672,0,0,0,0,100,0), +(@PATH,12,18.60869,-4.849314,6.348672,0,0,0,0,100,0), +(@PATH,13,24.60869,-5.099314,6.348672,0,0,0,0,100,0), +(@PATH,14,26.69126,-5.140297,6.623405,0,0,0,0,100,0), +(@PATH,15,26.69126,-3.640297,6.623405,0,0,0,0,100,0), +(@PATH,16,26.69126,3.859703,11.3734,0,0,0,0,100,0), +(@PATH,17,26.56619,3.997062,11.49595,0,0,0,0,100,0), +(@PATH,18,26.56619,5.497062,11.49595,0,0,0,0,100,0), +(@PATH,19,24.06619,5.497062,11.49595,0,0,0,0,100,0), +(@PATH,20,22.81619,5.497062,11.99595,0,0,0,0,100,0), +(@PATH,21,21.56619,5.497062,12.24595,0,0,0,0,100,0), +(@PATH,22,5.473877,5.844482,11.85669,0,25000,0,0,100,0), +(@PATH,23,7.723877,-1.405518,11.85669,0,0,0,0,100,0), +(@PATH,24,10.47388,-6.155518,11.85669,0,0,0,0,100,0), +(@PATH,25,10.43553,-5.953337,11.88334,0,0,0,0,100,0), +(@PATH,26,10.93553,-6.953337,11.88334,0,0,0,0,100,0), +(@PATH,27,5.371088,-7.016384,11.77661,0,0,0,0,100,0), +(@PATH,28,2.413238,-4.390701,11.56228,0,0,0,0,100,0), +(@PATH,29,1.163238,-4.390701,11.31228,0,0,0,0,100,0), +(@PATH,30,-3.086762,-5.140701,6.562281,0,0,0,0,100,0); +-- 0x1C15A0002018404000004000006049B5 .go 37.03026 4.622362 6.176411 + +-- Pathing for Entry: 24835 'TDB FORMAT' +SET @NPC := @GUID + 2; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=24.61543,`position_y`=5.468647,`position_z`=16.12396 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,24.61543,5.468647,16.12396,3.246287,0,0,0,100,0), +(@PATH,2,24.59153,3.553659,16.31282,0,0,0,0,100,0), +(@PATH,3,24.59153,0.05365944,16.31282,0,0,0,0,100,0), +(@PATH,4,24.59153,-3.446341,16.06282,0,0,0,0,100,0), +(@PATH,5,24.57548,-5.133168,16.0891,0,0,0,0,100,0), +(@PATH,6,23.32548,-5.383168,16.0891,0,0,0,0,100,0), +(@PATH,7,20.07548,-5.883168,12.5891,0,0,0,0,100,0), +(@PATH,8,19.97622,-5.8692,12.62369,0,0,0,0,100,0), +(@PATH,9,19.22622,-5.8692,12.62369,0,0,0,0,100,0), +(@PATH,10,18.97622,-4.6192,12.62369,0,0,0,0,100,0), +(@PATH,11,17.54005,-0.2464206,12.32892,0,0,0,0,100,0), +(@PATH,12,18.04005,3.753579,12.32892,0,0,0,0,100,0), +(@PATH,13,18.07397,3.926754,12.37037,0,0,0,0,100,0), +(@PATH,14,18.32397,5.676754,12.12037,0,0,0,0,100,0), +(@PATH,15,20.28442,3.827637,12.37757,0,0,0,0,100,0), +(@PATH,16,19.53442,-0.1723633,12.37757,0,0,0,0,100,0), +(@PATH,17,19.03442,-4.672363,12.12757,0,0,0,0,100,0), +(@PATH,18,18.88482,-4.669163,12.44052,0,0,0,0,100,0), +(@PATH,19,18.88482,-5.669163,12.44052,0,0,0,0,100,0), +(@PATH,20,20.13482,-5.669163,12.69052,0,0,0,0,100,0), +(@PATH,21,23.13482,-5.169163,15.94052,0,0,0,0,100,0), +(@PATH,22,25.75478,-4.782483,16.3373,0,0,0,0,100,0), +(@PATH,23,25.75478,-3.282483,16.3373,0,0,0,0,100,0), +(@PATH,24,26.00478,-0.03248262,16.5873,0,0,0,0,100,0), +(@PATH,25,26.25478,3.467517,16.5873,0,0,0,0,100,0), +(@PATH,26,24.61548,5.46875,16.04771,0,0,0,0,100,0), +(@PATH,27,24.61548,5.46875,16.04771,3.176499,80000,0,0,100,0); +-- 0x1C15A000201840C000004000006048CF .go 24.61543 5.468647 16.12396 + +-- Pathing for Entry: 24836 'TDB FORMAT' +SET @NPC := @GUID + 3; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2.233398,`position_y`=2.553833,`position_z`=6.099016 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-2.233398,2.553833,6.099016,0,0,0,0,100,0), +(@PATH,2,-2.233398,2.553833,6.099016,2.059489,0,0,0,100,0), +(@PATH,3,1.698853,3.417053,6.348891,0,0,0,0,100,0), +(@PATH,4,3.448853,4.167053,6.348891,0,0,0,0,100,0), +(@PATH,5,7.448853,-0.5829468,6.348891,0,0,0,0,100,0), +(@PATH,6,9.774704,-2.902952,6.349678,0,0,0,0,100,0), +(@PATH,7,9.800768,-3.249776,6.348591,0,0,0,0,100,0), +(@PATH,8,13.55077,-3.999776,6.348591,0,0,0,0,100,0), +(@PATH,9,18.30077,-4.749776,6.348591,0,0,0,0,100,0), +(@PATH,10,20.13506,-5.121357,6.347137,0,0,0,0,100,0), +(@PATH,11,24.38506,-5.371357,6.347137,0,0,0,0,100,0), +(@PATH,12,24.58777,-5.452598,6.623333,0,0,0,0,100,0), +(@PATH,13,26.83777,-5.702598,6.623333,0,0,0,0,100,0), +(@PATH,14,26.58777,-3.452598,6.623333,0,0,0,0,100,0), +(@PATH,15,26.58777,3.797402,11.37333,0,0,0,0,100,0), +(@PATH,16,26.85096,4.066658,11.19734,0,0,0,0,100,0), +(@PATH,17,26.85096,5.566658,11.19734,0,0,0,0,100,0), +(@PATH,18,26.86504,5.718296,11.3996,0,0,0,0,100,0), +(@PATH,19,30.61504,5.718296,11.3996,0,0,0,0,100,0), +(@PATH,20,30.61504,3.718296,11.3996,0,0,0,0,100,0), +(@PATH,21,29.54675,3.707764,11.3996,0,0,0,0,100,0), +(@PATH,22,28.29675,4.207764,11.3996,0,0,0,0,100,0), +(@PATH,23,24.39871,5.605234,11.61975,0,0,0,0,100,0), +(@PATH,24,23.39871,5.605234,11.61975,0,0,0,0,100,0), +(@PATH,25,22.14871,5.605234,12.11975,0,0,0,0,100,0), +(@PATH,26,21.82304,5.810547,12.27328,0,0,0,0,100,0), +(@PATH,27,20.07304,5.810547,12.27328,0,0,0,0,100,0), +(@PATH,28,17.32304,3.810547,12.27328,0,0,0,0,100,0), +(@PATH,29,17.06653,3.683082,12.10866,0,0,0,0,100,0), +(@PATH,30,14.56653,1.933082,12.10866,0,0,0,0,100,0), +(@PATH,31,13.06653,-1.066918,12.10866,0,0,0,0,100,0), +(@PATH,32,9.639757,-6.127687,11.82736,0,0,0,0,100,0), +(@PATH,33,3.298409,-6.022044,11.54611,0,0,0,0,100,0), +(@PATH,34,2.798409,-4.272044,11.54611,0,0,0,0,100,0), +(@PATH,35,1.048409,-4.522044,11.29611,0,0,0,0,100,0), +(@PATH,36,-2.951591,-5.022044,6.546112,0,0,0,0,100,0), +(@PATH,37,-4.002031,-4.848095,6.186443,0,0,0,0,100,0), +(@PATH,38,-4.002031,-0.0980947,6.186443,0,0,0,0,100,0), +(@PATH,39,-2.233643,2.553955,6.099016,0,0,0,0,100,0); +-- 0x1C15A0000018410000002F0000604858 .go -2.233398 2.553833 6.099016 + +-- Pathing for Entry: 24837 'TDB FORMAT' +SET @NPC := @GUID + 4; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=21.28821,`position_y`=-6.498474,`position_z`=6.346781 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,21.28821,-6.498474,6.346781,0,0,0,0,100,0), +(@PATH,2,24.28821,-6.248474,6.346781,0,0,0,0,100,0), +(@PATH,3,24.5675,-5.887867,6.623326,0,0,0,0,100,0), +(@PATH,4,26.3175,-5.637867,6.623326,0,0,0,0,100,0), +(@PATH,5,26.5675,-3.637867,6.623326,0,0,0,0,100,0), +(@PATH,6,26.8175,3.862133,11.37333,0,0,0,0,100,0), +(@PATH,7,27.0207,5.456285,11.61129,0,0,0,0,100,0), +(@PATH,8,24.0207,5.456285,11.61129,0,0,0,0,100,0), +(@PATH,9,22.7707,5.706285,11.86129,0,0,0,0,100,0), +(@PATH,10,21.5207,5.706285,12.36129,0,0,0,0,100,0), +(@PATH,11,21.19737,5.743245,12.28643,0,0,0,0,100,0), +(@PATH,12,19.69737,5.743245,12.28643,0,0,0,0,100,0), +(@PATH,13,18.44737,3.743245,12.28643,0,0,0,0,100,0), +(@PATH,14,16.32088,0.3530575,12.37261,0,0,0,0,100,0), +(@PATH,15,18.57088,-4.646943,12.37261,0,0,0,0,100,0), +(@PATH,16,18.82599,-4.72204,12.55197,0,0,0,0,100,0), +(@PATH,17,19.32599,-5.72204,12.55197,0,0,0,0,100,0), +(@PATH,18,23.32599,-5.22204,16.05197,0,0,0,0,100,0), +(@PATH,19,24.89713,-4.957284,16.51354,0,0,0,0,100,0), +(@PATH,20,27.89713,-4.707284,17.01354,0,0,0,0,100,0), +(@PATH,21,35.14713,-3.957284,18.26354,0,0,0,0,100,0), +(@PATH,22,35.03859,-3.71197,18.26312,0,0,0,0,100,0), +(@PATH,23,35.53859,-3.71197,18.51312,0,0,0,0,100,0), +(@PATH,24,36.03859,-2.71197,18.51312,0,0,0,0,100,0), +(@PATH,25,36.78859,-1.21197,18.51312,0,0,0,0,100,0), +(@PATH,26,36.83167,-1.03315,18.61353,0,0,0,0,100,0), +(@PATH,27,37.33167,-0.0331502,18.61353,0,0,0,0,100,0), +(@PATH,28,35.83167,-0.0331502,18.36353,0,0,0,0,100,0), +(@PATH,29,33.81982,0.05114746,18.28621,0,80000,0,0,100,0); +-- 0x1C15A0000018414000002F0000604858 .go 21.28821 -6.498474 6.346781 + +-- Pathing for Entry: 24838 'TDB FORMAT' +SET @NPC := @GUID + 5; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-27.21704,`position_y`=-0.001220703,`position_z`=21.58302 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-27.21704,-0.001220703,21.58302,3.141593,15000,0,0,100,0), +(@PATH,2,-26.7854,3.492676,21.49658,0,0,0,0,100,0), +(@PATH,3,-27.21509,0.02246094,21.582,0,0,0,0,100,0), +(@PATH,4,-27.21509,0.02246094,21.582,3.141593,15000,0,0,100,0), +(@PATH,5,-27.31982,-3.39917,21.29024,0,0,0,0,100,0), +(@PATH,6,-23.06238,-6.165868,20.58522,0,0,0,0,100,0); +-- 0x1C15A0000018418000002F0000604859 .go -27.21704 -0.001220703 21.58302 + +-- Pathing for Entry: 24839 'TDB FORMAT' +SET @NPC := @GUID + 6; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=9.595876,`position_y`=-1.214922,`position_z`=11.80095 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,9.595876,-1.214922,11.80095,0,10000,0,0,100,0), +(@PATH,2,10.84588,3.285078,12.05095,0,0,0,0,100,0), +(@PATH,3,10.78306,3.165822,11.99681,0,0,0,0,100,0), +(@PATH,4,11.03306,4.415822,11.99681,0,0,0,0,100,0), +(@PATH,5,9.130737,-1.28125,11.96241,0,0,0,0,100,0), +(@PATH,6,9.877741,-6.322785,11.91132,0,0,0,0,100,0), +(@PATH,7,6.444749,-7.275679,11.82178,0,0,0,0,100,0), +(@PATH,8,6.444749,-9.525679,11.57178,0,0,0,0,100,0), +(@PATH,9,7.006714,-9.58252,11.59527,0,0,0,0,100,0), +(@PATH,10,8.256714,-8.08252,11.84527,0,10000,0,0,100,0), +(@PATH,11,9.506714,-6.58252,11.84527,0,0,0,0,100,0), +(@PATH,12,9.757862,-6.227444,12.01764,0,0,0,0,100,0), +(@PATH,13,10.25786,-5.227444,11.76764,0,0,0,0,100,0), +(@PATH,14,11.50786,-1.227444,12.01764,0,0,0,0,100,0), +(@PATH,15,10.53357,-1.442627,12.06874,0,0,0,0,100,0), +(@PATH,16,9.107422,-2.769531,11.71875,3.385939,10000,0,0,100,0), +(@PATH,17,9.595581,-1.214111,11.99324,0,0,0,0,100,0), +(@PATH,18,10.84558,3.285889,11.99324,0,0,0,0,100,0), +(@PATH,19,10.78296,3.167067,11.99682,0,0,0,0,100,0), +(@PATH,20,11.03296,4.417067,11.99682,0,10000,0,0,100,0); +-- 0x1C15A000201841C000004000006049B5 .go 9.595876 -1.214922 11.80095 + +-- Pathing for Entry: 24840 'TDB FORMAT' +SET @NPC := @GUID + 7; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-12.18092,`position_y`=5.488965,`position_z`=6.140242 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-12.18092,5.488965,6.140242,0,0,0,0,100,0), +(@PATH,2,-11.93092,4.238965,6.140242,0,0,0,0,100,0), +(@PATH,3,1.66333,3.382568,6.347836,0,0,0,0,100,0), +(@PATH,4,3.41333,4.132568,6.347836,0,0,0,0,100,0), +(@PATH,5,16.41333,5.132568,6.347836,0,0,0,0,100,0), +(@PATH,6,23.91333,5.632568,6.347836,0,0,0,0,100,0), +(@PATH,7,27.02629,5.782645,6.348631,0,0,0,0,100,0), +(@PATH,8,28.7417,6.706543,6.096051,0,0,0,0,100,0), +(@PATH,9,23.86475,6.410645,6.347143,0,0,0,0,100,0), +(@PATH,10,18.36475,6.160645,6.347143,0,0,0,0,100,0), +(@PATH,11,16.61475,5.910645,6.347143,0,0,0,0,100,0), +(@PATH,12,15.36475,5.910645,6.347143,0,0,0,0,100,0), +(@PATH,13,3.364746,5.410645,6.347143,0,0,0,0,100,0), +(@PATH,14,3.131845,5.415648,6.349216,0,0,0,0,100,0), +(@PATH,15,1.881845,5.415648,6.349216,0,0,0,0,100,0), +(@PATH,16,-8.868155,6.665648,6.349216,0,0,0,0,100,0), +(@PATH,17,-9.868155,6.915648,6.349216,0,0,0,0,100,0), +(@PATH,18,-12.56714,7.07666,6.098746,0,0,0,0,100,0), +(@PATH,19,-12.56714,7.07666,6.098746,3.525565,0,0,0,100,0), +(@PATH,20,-12.18091,5.489014,6.348577,0,0,0,0,100,0), +(@PATH,21,-11.93091,4.239014,6.348577,0,0,0,0,100,0), +(@PATH,22,1.663208,3.382813,6.347836,0,0,0,0,100,0), +(@PATH,23,3.413208,4.132813,6.347836,0,0,0,0,100,0), +(@PATH,24,16.41321,5.132813,6.347836,0,0,0,0,100,0), +(@PATH,25,23.91321,5.632813,6.347836,0,0,0,0,100,0); +-- 0x1C15A0002018420000004000006049B5 .go -12.18092 5.488965 6.140242 + +-- Pathing for Entry: 24842 'TDB FORMAT' +SET @NPC := @GUID + 9; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=20.11769,`position_y`=-6.318613,`position_z`=6.388871 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,20.11769,-6.318613,6.388871,0,0,0,0,100,0), +(@PATH,2,24.36769,-6.068613,6.138871,0,0,0,0,100,0), +(@PATH,3,26.54725,-5.752126,6.622897,0,0,0,0,100,0), +(@PATH,4,26.54725,-3.502126,6.622897,0,0,0,0,100,0), +(@PATH,5,26.79725,3.747874,11.3729,0,0,0,0,100,0), +(@PATH,6,26.79725,5.497874,11.3729,0,0,0,0,100,0), +(@PATH,7,26.84597,3.878396,11.42881,0,0,0,0,100,0), +(@PATH,8,26.84597,5.378396,11.42881,0,0,0,0,100,0), +(@PATH,9,26.84597,6.128396,11.42881,0,0,0,0,100,0), +(@PATH,10,24.09597,5.878396,11.42881,0,0,0,0,100,0), +(@PATH,11,22.59597,5.878396,11.92881,0,0,0,0,100,0), +(@PATH,12,21.59597,5.878396,12.42881,0,0,0,0,100,0), +(@PATH,13,21.2122,5.86385,12.2945,0,0,0,0,100,0), +(@PATH,14,18.7122,5.61385,12.2945,0,0,0,0,100,0), +(@PATH,15,17.7122,3.61385,12.2945,0,0,0,0,100,0), +(@PATH,16,14.01855,0.09912109,12.00374,0,0,0,0,100,0), +(@PATH,17,15.29224,0.3544922,12.05542,0,0,0,0,100,0), +(@PATH,18,14.146,0.02685547,12.00965,0,0,0,0,100,0), +(@PATH,19,20.63428,3.088379,12.32969,0,0,0,0,100,0), +(@PATH,20,21.63428,4.088379,12.07969,0,0,0,0,100,0), +(@PATH,21,23.38428,4.838379,11.57969,0,0,0,0,100,0), +(@PATH,22,26.57771,5.543217,11.23778,0,0,0,0,100,0), +(@PATH,23,26.57771,3.793216,11.23778,0,0,0,0,100,0), +(@PATH,24,26.32771,-3.456784,6.487778,0,0,0,0,100,0), +(@PATH,25,26.43777,-3.82635,6.296148,0,0,0,0,100,0), +(@PATH,26,26.43777,-5.32635,6.296148,0,0,0,0,100,0), +(@PATH,27,24.43777,-5.32635,6.296148,0,0,0,0,100,0), +(@PATH,28,19.93777,-5.57635,6.296148,0,0,0,0,100,0), +(@PATH,29,6.767334,-6.272217,6.347435,0,0,0,0,100,0), +(@PATH,30,6.116943,-6.608887,6.097135,2.286381,10000,0,0,100,0); +-- 0x1C15A0002018428000004000006049B5 .go 20.11769 -6.318613 6.388871 + +SET @Sailor := 24838; +SET @Kowalski := 24835; +SET @Mehran := 24837; +SET @Stash := 24833; +-- Add text +DELETE FROM `creature_text` WHERE `entry` IN (@Sailor, @Kowalski, @Mehran, @Stash); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(@Sailor, 0, 0, 'Land ho, Mr. Kowalski! Port is in sight, sir!', 12, 7, 100, 0, 0, 0, 'Sailor Henders', 23941), +(@Kowalski, 0, 0, 'Thank you, Mr. Henders.', 12, 7, 100, 0, 0, 0, 'First Mate Kowalski', 23942), +(@Kowalski, 1, 0, 'Bring us into port, please, Mr. Mehran.', 12, 7, 100, 0, 0, 0, 'First Mate Kowalski', 23943), +(@Mehran, 0, 0, 'Aye aye, Mr. Kowalski.', 12, 0, 100, 0, 0, 0, 'Navigator Mehran', 23951), +(@Kowalski, 2, 0, 'Captain Stash! We''ll be arriving shortly, sir!', 12, 7, 100, 0, 0, 0, 'First Mate Kowalski', 23944), +(@Stash, 0, 0, 'Thank you, Mr. Kowalski! You may return to your post to oversee docking!', 12, 7, 100, 0, 0, 0, 'Captain "Stash" Torgoley', 23945), +(@Stash, 1, 0, 'Well done, all. Please bring us safely to our next port. ', 12, 7, 100, 0, 0, 0, 'Captain "Stash" Torgoley', 23946); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@Sailor, @Kowalski, @Mehran, @Stash); +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Sailor AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Stash AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Kowalski AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Stash*100 AND `source_type`=9; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@Kowalski*100 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@Sailor,0,0,0,25,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sailor - on reset - Say Line 0"), +(@Stash,0,0,0,25,0,100,0,0,0,0,0,80,@Stash*100,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stash - on reset - action list"), +(@Stash*100,9,0,0,0,0,100,0,36000,36000,0,0,91,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stash - action list - Stand up"), +(@Stash*100,9,1,0,0,0,100,0,49000,49000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stash - action list - Say Line 1"), +(@Stash*100,9,2,0,0,0,100,0,0,0,0,0,5,21,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stash - action list - Play emote applaud"), +(@Kowalski,0,0,0,25,0,100,0,0,0,0,0,80,@Kowalski*100,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kowalski - On reset - Action list"), +(@Kowalski*100,9,0,0,0,0,100,0,4000,4000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kowalski- ooc los - Say Line 0"), +(@Kowalski*100,9,1,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,40,0,0,0,0,0,"Kowalski - ooc los - Say Line 1"), +(@Kowalski*100,9,2,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,19,@Mehran,40,0,0,0,0,0,"Kowalski- ooc los - Say Line 0"), +(@Kowalski*100,9,3,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kowalski - ooc los - Say Line 2"), +(@Kowalski*100,9,4,0,0,0,100,0,4000,4000,0,0,1,0,0,0,0,0,0,19,@Stash,40,0,0,0,0,0,"Kowalski - ooc los - Say Line 0"); From 2044cd7c12a361ac9e6b2c962525752d83986f98 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 5 Sep 2015 19:23:00 +0200 Subject: [PATCH 091/110] DB/Quest: Fix credit for Infiltrating Dragonmaw Fortress Closes #15432 --- sql/updates/world/2015_09_05_01_world.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 sql/updates/world/2015_09_05_01_world.sql diff --git a/sql/updates/world/2015_09_05_01_world.sql b/sql/updates/world/2015_09_05_01_world.sql new file mode 100644 index 00000000000..cabdd4b9057 --- /dev/null +++ b/sql/updates/world/2015_09_05_01_world.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=21719 AND `source_type`=0 AND `id`=15; +DELETE FROM `smart_scripts` WHERE `entryorguid`=21720 AND `source_type`=0 AND `id`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=21717 AND `source_type`=0 AND `id`=3; +DELETE FROM `smart_scripts` WHERE `entryorguid`=21718 AND `source_type`=0 AND `id`=13; +DELETE FROM `smart_scripts` WHERE `entryorguid`=22331 AND `source_type`=0 AND `id`=20; From 83b7b619b141f307786bd7ef4a560b8c12d63f29 Mon Sep 17 00:00:00 2001 From: Killyana Date: Sat, 5 Sep 2015 19:32:35 +0200 Subject: [PATCH 092/110] DB/Quest: Freedom for all creatures Closes #4823 --- sql/updates/world/2015_09_05_02_world_335.sql | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 sql/updates/world/2015_09_05_02_world_335.sql diff --git a/sql/updates/world/2015_09_05_02_world_335.sql b/sql/updates/world/2015_09_05_02_world_335.sql new file mode 100644 index 00000000000..20d2a79a63a --- /dev/null +++ b/sql/updates/world/2015_09_05_02_world_335.sql @@ -0,0 +1,110 @@ +-- +UPDATE `creature` SET `spawntimesecs`=60 WHERE `guid`=50005; + +-- Kindal Moonweaver SAI +SET @ENTRY := 7956; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=795601 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,19,0,100,0,2969,0,0,0,29,4,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Start Follow Invoker"), +(@ENTRY,0,1,2,61,0,100,0,0,0,0,0,90,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Remove Flag Standstate Kneel"), +(@ENTRY,0,2,3,61,0,100,0,0,0,0,0,2,774,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Set Faction 774"), +(@ENTRY,0,3,4,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Say Line 0"), +(@ENTRY,0,4,5,61,0,100,0,0,0,0,0,19,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Remove unit flag 512"), +(@ENTRY,0,5,6,61,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Remove npcflag 2"), +(@ENTRY,0,6,7,61,0,100,0,0,0,0,0,8,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - React def"), +(@ENTRY,0,7,8,61,0,100,0,0,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Store target"), +(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,41,360000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Quest 'Freedom for All Creatures' Taken - Despawn In 360000 ms"), +(@ENTRY,0,9,0,4,0,100,0,0,0,0,0,1,1,0,1,0,0,0,7,0,0,0,0,0,0,0,"Kindal Moonweaver - On Aggro - Say Line 1"), +(@ENTRY,0,10,0,38,0,100,1,1,1,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Data Set 1 1 - Action list"), +(@ENTRY,0,11,0,7,0,100,0,0,0,0,0,90,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Evade - Set stand state"), +(@ENTRY,0,12,0,77,0,100,0,1,5,0,0,80,795601,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On counter=5 - Action ist"), +(795601,9,0,0,0,0,100,0,1000,1000,0,0,1,3,0,0,0,0,0,12,1,0,0,0,0,0,0,"Kindal Moonweaver - On Script - Say Line 3"), +(795601,9,1,0,0,0,100,0,0,0,0,0,6,2969,0,0,0,0,0,18,20,0,0,0,0,0,0,"Kindal Moonweaver - On Script - Quest fails"), +(795601,9,2,0,0,0,100,0,3000,3000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Script - Despawn"); + +-- Actionlist SAI +SET @ENTRY := 795600; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,1000,1000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Script - Say Line 2"), +(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,15,2969,0,0,0,0,0,18,20,0,0,0,0,0,0,"Kindal Moonweaver - On Script - Quest Credit 'Freedom for All Creatures'"), +(@ENTRY,9,2,0,0,0,100,0,5000,5000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kindal Moonweaver - On Script - Despawn In 3000 ms"); + +/* Script for the Door, it will start the event for the creatures */ +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=143979; +DELETE FROM `smart_scripts` WHERE `entryorguid`=143979; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(143979, 1, 0, 0, 70, 0, 100, 0, 2, 0, 0, 0, 80, 143979*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'bambus door - On activate - start script'); +-- Actionlist SAI +SET @ENTRY := 14397900; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,11,7997,20,0,0,0,0,0,"On Script - Set Data 1 1"); + +-- Captured Sprite Darter SAI +SET @ENTRY := 7997; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,38,0,100,0,1,1,0,0,80,@ENTRY*100,2,0,0,0,0,1,0,0,0,0,0,0,0,"Captured Sprite Darter - On Data Set 1 1 - Run Script"), +(@ENTRY,0,1,2,40,0,100,0,13,7997,0,0,45,1,1,0,0,0,0,19,7956,50,0,0,0,0,0,"Captured Sprite Darter - On Waypoint 13 Reached - Set Data 1 1"), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captured Sprite Darter - On Waypoint 13 Reached - Despawn In 3s"), +(@ENTRY,0,3,0,11,0,100,0,0,0,0,0,2,534,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captured Sprite Darter - On Respawn - Set Faction 534"), +(@ENTRY,0,4,0,6,0,100,0,0,0,0,0,63,1,1,0,0,0,0,19,7956,50,0,0,0,0,0,"Captured Sprite Darter - On Death - set counter"); + +/* Call script for waypoint-start */ + +-- Actionlist SAI +SET @ENTRY := 799700; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,2000,2000,0,0,53,0,7997,0,0,0,1,1,0,0,0,0,0,0,0,"On Script - Start Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,100,100,0,0,2,774,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captured Sprite Darter - On Script - Set Faction 774"); + +/* Texts for Kindal Moonweaver */ +DELETE FROM `creature_text` WHERE `entry` in (7956); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES +(7956, 0, 0, 'I''m ready when you are, $n. Lead the way!', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4079), +(7956, 1, 0, 'Die, $n. Elune will not have you harm her creatures any longer!', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4123), +(7956, 1, 1, 'You dare touch me?!', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4125), +(7956, 1, 2, 'Death to you, $n. How dare you come within a bow''s shot of me!', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4124), +(7956, 1, 3, 'Quickly! $n attacks!', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4122), +(7956, 2, 0, 'We\'ve done it! Meet me back by Jer\'kai above the Grim Totem camp.', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4080), +(7956, 3, 0, 'No! The faerie dragons aren''t making it, $n! I must return to Jer''kai to make sure she hasn''t been found. Elune be with you.', 12, 0, 100, 0, 0, 0, 'Kindal Moonweaver', 4081); + +/* Waypoints for Captured Sprite Darter */ +DELETE FROM `waypoints` WHERE `entry`=7997; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(7997, 1, -4532.19, 807.833, 59.9749, 'Captured Sprite Darter'), +(7997, 2, -4526.04, 799.328, 59.4271, 'Captured Sprite Darter'), +(7997, 3, -4518.87, 786.24, 59.9261, 'Captured Sprite Darter'), +(7997, 4, -4516.6, 766.617, 60.6654, 'Captured Sprite Darter'), +(7997, 5, -4516.79, 749.124, 60.4805, 'Captured Sprite Darter'), +(7997, 6, -4517.52, 731.643, 60.9822, 'Captured Sprite Darter'), +(7997, 7, -4522.3, 710.707, 60.8061, 'Captured Sprite Darter'), +(7997, 8, -4530.08, 695.036, 60.6917, 'Captured Sprite Darter'), +(7997, 9, -4537.26, 679.979, 60.5726, 'Captured Sprite Darter'), +(7997, 10, -4541.54, 655.429, 58.551, 'Captured Sprite Darter'), +(7997, 11, -4539.33, 649.443, 57.9488, 'Captured Sprite Darter'), +(7997, 12, -4526.54, 639.678, 56.2069, 'Captured Sprite Darter'), +(7997, 13, -4507.92, 627.417, 55.6034, 'Captured Sprite Darter'); + +UPDATE `creature_template_addon` SET `auras`= "" WHERE entry=7726; +SET @ENTRY := 7726; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,4,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - On Aggro - Set Event Phase 1 (No Repeat)"), +(@ENTRY,0,1,0,4,1,100,1,0,0,0,0,11,9739,0,0,0,0,0,2,0,0,0,0,0,0,0,"Grimtotem Naturalist - On Aggro - Cast 'Wrath' (Phase 1) (No Repeat)"), +(@ENTRY,0,2,0,9,1,100,0,0,40,3400,4700,11,9739,0,0,0,0,0,2,0,0,0,0,0,0,0,"Grimtotem Naturalist - Within 0-40 Range - Cast 'Wrath' (Phase 1)"), +(@ENTRY,0,3,0,3,1,100,0,0,15,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - Between 0-15% Mana - Set Event Phase 2 (Phase 1)"), +(@ENTRY,0,4,0,3,2,100,0,30,100,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - Between 30-100% Mana - Set Event Phase 1 (Phase 2)"), +(@ENTRY,0,5,0,7,1,100,1,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - On Evade - Set Event Phase 0 (Phase 1) (No Repeat)"), +(@ENTRY,0,6,7,2,0,100,1,0,50,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - Between 0-50% Health - Set Event Phase 3 (Phase 1) (No Repeat)"), +(@ENTRY,0,7,0,61,0,100,1,0,50,0,0,11,19030,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - Between 0-50% Health - Cast 'Bear Form' (Phase 1) (No Repeat)"), +(@ENTRY,0,8,0,0,4,100,0,3000,4500,12000,13000,11,12161,0,0,0,0,0,2,0,0,0,0,0,0,0,"Grimtotem Naturalist - In Combat - Cast 'Maul' (Phase 4)"), +(@ENTRY,0,9,0,0,4,100,0,8000,9000,25000,26000,11,15727,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - In Combat - Cast 'Demoralizing Roar' (Phase 4)"), +(@ENTRY,0,10,0,7,4,100,1,0,0,0,0,28,19030,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - On Evade - Remove Aura (Phase 4) (No Repeat)"), +(@ENTRY,0,11,0,7,4,100,1,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grimtotem Naturalist - On Evade - Set Event Phase 0 (Phase 4) (No Repeat)"); +DELETE FROM `smart_scripts` WHERE `entryorguid`=22331 AND `source_type`=0 AND `id`=20; From 42a71133fa32a1414dc52241c99430178b24422e Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 5 Sep 2015 21:18:52 +0200 Subject: [PATCH 093/110] Core/Dungeon Finder: Fix groups queuing broken by 1e71aba2ee656a8407dec63a69d0879e16a070e2 Fix queuing in LFG with 5-men groups leaving the party in queue forever, caused by group GUID being added to list of party members. --- src/server/game/DungeonFinding/LFGQueue.cpp | 12 ++++++++---- src/server/game/DungeonFinding/LFGQueue.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index f4974e0938b..86b010a9ace 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -80,7 +80,7 @@ char const* GetCompatibleString(LfgCompatibility compatibles) } } -std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) +std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) const { if (check.empty()) return ""; @@ -92,11 +92,13 @@ std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) GuidSet::const_iterator it = guids.begin(); o << it->GetRawValue(); - LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(*it); + LfgQueueDataContainer::const_iterator itQueue = QueueDataStore.find(*it); if (itQueue != QueueDataStore.end()) { // skip leader flag, log only dps/tank/healer - o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); + auto role = itQueue->second.roles.find(*it); + if (role != itQueue->second.roles.end()) + o << ' ' << GetRolesString(itQueue->second.roles.at(*it) & uint8(~PLAYER_ROLE_LEADER)); } for (++it; it != guids.end(); ++it) @@ -106,7 +108,9 @@ std::string LFGQueue::GetDetailedMatchRoles(GuidList const& check) if (itQueue != QueueDataStore.end()) { // skip leader flag, log only dps/tank/healer - o << ' ' << GetRolesString(itQueue->second.roles[*it] & uint8(~PLAYER_ROLE_LEADER)); + auto role = itQueue->second.roles.find(*it); + if (role != itQueue->second.roles.end()) + o << ' ' << GetRolesString(itQueue->second.roles.at(*it) & uint8(~PLAYER_ROLE_LEADER)); } } diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h index 77683614d49..f72e9b4fd6d 100644 --- a/src/server/game/DungeonFinding/LFGQueue.h +++ b/src/server/game/DungeonFinding/LFGQueue.h @@ -88,7 +88,7 @@ class LFGQueue public: // Add/Remove from queue - std::string GetDetailedMatchRoles(GuidList const& check); + std::string GetDetailedMatchRoles(GuidList const& check) const; void AddToQueue(ObjectGuid guid); void RemoveFromQueue(ObjectGuid guid); void AddQueueData(ObjectGuid guid, time_t joinTime, LfgDungeonSet const& dungeons, LfgRolesMap const& rolesMap); From 166e66cc06d418b94e14abb30dea6a76ba9edce2 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 5 Sep 2015 22:45:15 +0200 Subject: [PATCH 094/110] Core/Spells: Fix crash happening when using items to cast spells Fix a crash happening when using items casting spells like Item ID 37198 Fix #14900 --- src/server/game/Entities/Player/Player.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 88d7dfa6381..25531760b69 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8335,9 +8335,6 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 return; } - // use triggered flag only for items with many spell casts and for not first cast - uint8 count = 0; - // item spells cast at use for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) { @@ -8358,13 +8355,12 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 continue; } - Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); + Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE); spell->m_CastItem = item; spell->m_cast_count = cast_count; // set count of casts spell->m_glyphIndex = glyphIndex; // glyph index spell->prepare(&targets); - - ++count; + return; } // Item enchantments spells cast at use @@ -8386,13 +8382,12 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 continue; } - Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); + Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE); spell->m_CastItem = item; spell->m_cast_count = cast_count; // set count of casts spell->m_glyphIndex = glyphIndex; // glyph index spell->prepare(&targets); - - ++count; + return; } } } From a32793ffd371db0f64d30e8a5dbfd4a58d09ae45 Mon Sep 17 00:00:00 2001 From: Dr-J Date: Sun, 6 Sep 2015 18:40:41 +0100 Subject: [PATCH 095/110] DB/Quest: The Booterang: A Cure For The Common Worthless Peon * Update original script for this adding missing auras also the spell so booterang gets returned to player (visual only). * Add more Disobedient Dragonmaw Peon, we now have 45 including the 10 which we already had in db. --- sql/updates/world/2015_09_06_00_world.sql | 73 +++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 sql/updates/world/2015_09_06_00_world.sql diff --git a/sql/updates/world/2015_09_06_00_world.sql b/sql/updates/world/2015_09_06_00_world.sql new file mode 100644 index 00000000000..79f9ae687c0 --- /dev/null +++ b/sql/updates/world/2015_09_06_00_world.sql @@ -0,0 +1,73 @@ +SET @CGUID := 136178; + +DELETE FROM `creature` WHERE `id`=23311; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 23311, 530, 1, 1, -5076.106, 25.09657, 80.35052, 6.236346, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+1, 23311, 530, 1, 1, -5233.175, 64.53071, 64.41123, 0.7679449, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40732 - 40732) (possible waypoints or random movement) +(@CGUID+2, 23311, 530, 1, 1, -5185.78, 143.9119, 71.66191, 1.692969, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40732 - 40732) +(@CGUID+3, 23311, 530, 1, 1, -5275.489, 149.1322, 58.53136, 2.443461, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+4, 23311, 530, 1, 1, -5091.079, -114.7144, 64.35689, 1.239184, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+5, 23311, 530, 1, 1, -4979.629, -99.6888, 42.13466, 4.049164, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40735 - 40735) (possible waypoints or random movement) +(@CGUID+6, 23311, 530, 1, 1, -5214.68, 221.5429, 72.53944, 4.380776, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40732 - 40732) (possible waypoints or random movement) +(@CGUID+7, 23311, 530, 1, 1, -5227.612, 271.558, 70.12395, 0.3334433, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+8, 23311, 530, 1, 1, -5286.284, 241.2294, 67.83147, 4.598778, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+9, 23311, 530, 1, 1, -5269.888, 303.3626, 73.55891, 0.05235988, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+10, 23311, 530, 1, 1, -5285.691, 388.9862, 54.89359, 5.131268, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40732 - 40732) +(@CGUID+11, 23311, 530, 1, 1, -5329.144, 192.1793, 52.40875, 0.5977584, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40714 - 40714) +(@CGUID+12, 23311, 530, 1, 1, -5313.125, 170.9132, 54.45731, 2.199115, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40732 - 40732) +(@CGUID+13, 23311, 530, 1, 1, -4988.237, 135.2316, 79.1295, 4.974188, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40735 - 40735) (possible waypoints or random movement) +(@CGUID+14, 23311, 530, 1, 1, -4926.947, 217.0098, 65.26778, 3.333579, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40735 - 40735) (possible waypoints or random movement) +(@CGUID+15, 23311, 530, 1, 1, -4922.614, 151.7855, 56.78815, 1.780236, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40732 - 40732) +(@CGUID+16, 23311, 530, 1, 1, -4993.667, 235.146, 80.8679, 5.72468, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40732 - 40732) (possible waypoints or random movement) +(@CGUID+17, 23311, 530, 1, 1, -4991.519, 300.2075, 82.21542, 4.956735, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40732 - 40732) (possible waypoints or random movement) +(@CGUID+18, 23311, 530, 1, 1, -4849.121, 450.1942, 60.71572, 1.780236, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+19, 23311, 530, 1, 1, -4982.719, -33.12109, 69.65373, 2.86234, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40735 - 40735) (possible waypoints or random movement) +(@CGUID+20, 23311, 530, 1, 1, -5073.178, 478.2025, 84.05375, 0.4363323, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40735 - 40735) (possible waypoints or random movement) +(@CGUID+21, 23311, 530, 1, 1, -5037.911, 538.4877, 88.20789, 5.393067, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+22, 23311, 530, 1, 1, -4993.51, 508.6491, 85.82965, 5.986479, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40732 - 40732) +(@CGUID+23, 23311, 530, 1, 1, -4962.048, 525.7373, 79.19551, 3.764333, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+24, 23311, 530, 1, 1, -5005.264, 532.8912, 87.46109, 4.386611, 120, 10, 1), -- 23311 (Area: -1) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+25, 23311, 530, 1, 1, -4892.17, 276.9066, 64.75311, 0.4014257, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40732 - 40732) +(@CGUID+26, 23311, 530, 1, 1, -5141.98, 473.9572, 78.60102, 0.4886922, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+27, 23311, 530, 1, 1, -5200.688, 589.4948, 60.42498, 2.792527, 120, 0, 0), -- 23311 (Area: -1) (Auras: 40735 - 40735) +(@CGUID+28, 23311, 530, 1, 1, -5281.205, 653.8297, 41.3046, 4.782202, 120, 0, 0), -- 23311 (Area: 3759) (Auras: 40735 - 40735) +(@CGUID+29, 23311, 530, 1, 1, -5221.946, 685.913, 60.32657, 4.27563, 120, 10, 1), -- 23311 (Area: 3759) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+30, 23311, 530, 1, 1, -5148.24, 737.8401, 73.05395, 4.782202, 120, 0, 0), -- 23311 (Area: 3965) (Auras: 40732 - 40732) +(@CGUID+31, 23311, 530, 1, 1, -5013.051, 702.1115, 82.42272, 3.435459, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+32, 23311, 530, 1, 1, -4969.671, 576.4045, 77.05217, 0.5155401, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+33, 23311, 530, 1, 1, -4876.813, 515.5291, 60.59084, 5.581461, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+34, 23311, 530, 1, 1, -4943.457, 693.7371, 71.826, 1.425557, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +-- Below are what existed in TC previously +(@CGUID+35, 23311, 530, 1, 1, -5241.89, 110.241, 58.1161, 5.43882, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+36, 23311, 530, 1, 1, -5231.88, 73.5107, 64.2172, 2.70563, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+37, 23311, 530, 1, 1, -5223.67, 41.7543, 68.7341, 5.06183, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+38, 23311, 530, 1, 1, -5315.02, 241.323, 59.5668, 4.75553, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+39, 23311, 530, 1, 1, -5135.13, 472.366, 78.4078, 3.1219, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+40, 23311, 530, 1, 1, -5172.18, 449.631, 76.6452, 4.06438, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+41, 23311, 530, 1, 1, -5200.65, 414.947, 74.4594, 4.13114, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+42, 23311, 530, 1, 1, -5248.11, 369.244, 68.7189, 3.43999, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+43, 23311, 530, 1, 1, -5289.96, 304.915, 67.6901, 3.63634, 120, 10, 1), -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) +(@CGUID+44, 23311, 530, 1, 1, -5043.44, 498.824, 86.5357, 3.86411, 120, 10, 1); -- 23311 (Area: 3965) (Auras: 40714 - 40714) (possible waypoints or random movement) + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=23311; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN(2331100,2331101,2331102); + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(23311, 0, 0, 1, 8, 0, 100, 1, 40742, 0, 0, 0, 33, 23311, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - On Spell Hit (Booterang) - Give Kill Credit'), +(23311, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 28, 40714, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Remove Aura Dazed and Confused'), +(23311, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 28, 40732, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Remove Aura Lazy and Good for Nothing'), +(23311, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 28, 40735, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Remove Aura Defiant and Enraged'), +(23311, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Say'), +(23311, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Set Run'), +(23311, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 19, 23308, 200, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Move to closest Dragonmaw Peon Work Node'), +(23311, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 11, 39160, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Cast Booterang'), +(23311, 0, 8, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 30000, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Despawn After 30 seconds'), +(23311, 0, 9, 10, 38, 0, 100, 0, 1, 1, 0, 0, 45, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - On Data Set - Set Data'), +(23311, 0, 10, 0, 61, 0, 100, 0, 0, 0, 0, 0, 5, 233, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Play emote'), +(23311, 0, 11, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, 2331100, 2331101, 2331102, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - On Spawn - Run Random Script'), +(2331100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 75, 40714, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 1 - Add Aura Dazed and Confused'), +(2331101, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 75, 40732, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 2 - Add Aura Lazy and Good for Nothing'), +(2331102, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 75, 40735, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 3 - Add Aura Defiant and Enraged'); + + + From 06fa7af6c56d74362c504902ac07de92370a0155 Mon Sep 17 00:00:00 2001 From: Killyana Date: Mon, 7 Sep 2015 00:33:54 +0200 Subject: [PATCH 096/110] DB/Quest: Forging a Head Attempts to salvage Stormforged Eyes from an Iron Giant's corpse will provide 2 Stormforged Eyes or will spawn 3 Iron Dwarfs. --- sql/updates/world/2015_09_07_00_world.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 sql/updates/world/2015_09_07_00_world.sql diff --git a/sql/updates/world/2015_09_07_00_world.sql b/sql/updates/world/2015_09_07_00_world.sql new file mode 100644 index 00000000000..46c7c4a66bd --- /dev/null +++ b/sql/updates/world/2015_09_07_00_world.sql @@ -0,0 +1,10 @@ +-- +UPDATE `smart_scripts` SET `action_param2`=2 WHERE `entryorguid` IN (2991401) AND `source_type`=9 AND `id`=0; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (30208); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (30208) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (2991401, 2991400) AND `source_type`=9 AND id>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`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(2991400,9,2,0,0,0,100,0,0,0,0,0,11,56230,0,0,0,0,0,7,0,0,0,0,0,0,0,"Dead Iron Giant - On Script - Cast 'Create Fireforged Eyes'"), +(2991401,9,2,0,0,0,100,0,0,0,0,0,11,56243,2,0,0,0,0,1,0,0,0,0,0,0,0,"Dead Iron Giant - On Script - Cast 'Summon Iron Dwarf'"), +(2991401,9,3,0,0,0,100,0,0,0,0,0,11,56243,2,0,0,0,0,1,0,0,0,0,0,0,0,"Dead Iron Giant - On Script - Cast 'Summon Iron Dwarf'"), +(30208,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,30,0,0,0,0,0,0,"Stormforged Ambusher - Just summoned - Start attack"); From 53e9e43d3c45d27c86cc00fa47a6d32477052306 Mon Sep 17 00:00:00 2001 From: Dr-J Date: Mon, 7 Sep 2015 12:08:01 +0100 Subject: [PATCH 097/110] DB/Quest: The Booterang: A Cure For The Common Worthless Peon More updates, 1) remove random movement and spawn dist from creature as only peons with dazed & confused should have random movement 2) Peons with Lazy and Good for nothing and Dazed and Confused are friendly to players only peons which are defiant and enraged are hostile and attackable by players. --- sql/updates/world/2015_09_07_01_world.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sql/updates/world/2015_09_07_01_world.sql diff --git a/sql/updates/world/2015_09_07_01_world.sql b/sql/updates/world/2015_09_07_01_world.sql new file mode 100644 index 00000000000..ae43bc753ed --- /dev/null +++ b/sql/updates/world/2015_09_07_01_world.sql @@ -0,0 +1,7 @@ +UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `id`=23311; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN(2331100,2331101,2331102) AND `id`>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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2331100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 1 - Set Faction'), +(2331100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 89, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 1 - Set Random Movement'), +(2331101, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 2 - Set Faction'); From c2ac6d7178148c5608ebb68d62a582172b8d2b3c Mon Sep 17 00:00:00 2001 From: Killyana Date: Mon, 7 Sep 2015 17:58:51 +0200 Subject: [PATCH 098/110] Quest: Threat from Above Fix double credit. By: @Saben65 Clloses #15457 --- sql/updates/world/2015_09_07_02_world.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 sql/updates/world/2015_09_07_02_world.sql diff --git a/sql/updates/world/2015_09_07_02_world.sql b/sql/updates/world/2015_09_07_02_world.sql new file mode 100644 index 00000000000..3edb064e696 --- /dev/null +++ b/sql/updates/world/2015_09_07_02_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=22143 AND `source_type`=0 AND `id`=4; +DELETE FROM `smart_scripts` WHERE `entryorguid`=22144 AND `source_type`=0 AND `id`=4; +DELETE FROM `smart_scripts` WHERE `entryorguid`=22148 AND `source_type`=0 AND `id`=2; +DELETE FROM `smart_scripts` WHERE `entryorguid`=23022 AND `source_type`=0 AND `id`=12; From d42a4980631ddaf0a4dbf7f93ef87408c3238f84 Mon Sep 17 00:00:00 2001 From: treeston Date: Sun, 6 Sep 2015 22:48:23 +0200 Subject: [PATCH 099/110] Allow mounting while under transformations that can be cast while mounted. Closes #12042. Credit to @SeTM for base code used. --- src/server/game/Entities/Unit/Unit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d02a22d43f4..0978adc1814 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13171,6 +13171,10 @@ bool Unit::IsInFeralForm() const bool Unit::IsInDisallowedMountForm() const { + if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm())) + if (transformSpellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)) + return false; + if (ShapeshiftForm form = GetShapeshiftForm()) { SpellShapeshiftEntry const* shapeshift = sSpellShapeshiftStore.LookupEntry(form); From 6c5d473369511c84951f37f13f4898a3f92b0343 Mon Sep 17 00:00:00 2001 From: Killyana Date: Mon, 7 Sep 2015 19:15:14 +0200 Subject: [PATCH 100/110] DB/Quest: "Where Kings Walk" and "Warchief's Blessing" By: @Rushor @xfurry @Grz3s Closes #15246 --- sql/updates/world/2015_09_07_03_world.sql | 163 ++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 sql/updates/world/2015_09_07_03_world.sql diff --git a/sql/updates/world/2015_09_07_03_world.sql b/sql/updates/world/2015_09_07_03_world.sql new file mode 100644 index 00000000000..495d42c3136 --- /dev/null +++ b/sql/updates/world/2015_09_07_03_world.sql @@ -0,0 +1,163 @@ +-- +-- DK Faction Endquest - Implement Reaction for Orgrimmar and Alliance Guards + +DELETE FROM `creature_text` WHERE `entry` IN (68,1756,1976,3296) AND `groupid`>1; +DELETE FROM `creature_text` WHERE `entry` IN (14304); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(68, 2, 0, '%s throws a rotten apple at $n.', 16, 0, 100, 0, 0, 0, 31671, 'Stormwind City Guard'), +(68, 3, 0, '%s throws rotten banana on $n.', 16, 0, 100, 0, 0, 0, 31672, 'Stormwind City Guard'), +(68, 4, 0, '%s spits on $n.', 16, 0, 100, 0, 0, 0, 31673, 'Stormwind City Guard'), +(68, 5, 0, 'Monster!', 12, 0, 100, 0, 0, 0, 31662, 'Stormwind City Guard'), +(68, 5, 1, 'Murderer!', 12, 0, 100, 0, 0, 0, 31679, 'Stormwind City Guard'), +(68, 5, 2, 'GET A ROPE!', 12, 0, 100, 0, 0, 0, 31669, 'Stormwind City Guard'), +(68, 5, 3, 'How dare you set foot in our city!', 12, 0, 100, 0, 0, 0, 31684, 'Stormwind City Guard'), +(68, 5, 4, 'You disgust me.', 12, 0, 100, 0, 0, 0, 31680, 'Stormwind City Guard'), +(68, 5, 5, 'Looks like we''re going to have ourselves an execution.', 12, 0, 100, 0, 0, 0, 31682, 'Stormwind City Guard'), +(68, 5, 6, 'Traitorous dog.', 12, 0, 100, 0, 0, 0, 31665, 'Stormwind City Guard'), +(68, 5, 7, 'My family was wiped out by the Scourge! MONSTER!', 12, 0, 100, 0, 0, 0, 31667, 'Stormwind City Guard'), +(14304, 2, 0, '%s throws a rotten apple at $n.', 16, 0, 100, 0, 0, 0, 31671, 'Kor''kron Elite'), +(14304, 3, 0, '%s throws rotten banana on $n.', 16, 0, 100, 0, 0, 0, 31672, 'Kor''kron Elite'), +(14304, 4, 0, '%s spits on $n.', 16, 0, 100, 0, 0, 0, 31673, 'Kor''kron Elite'), +(14304, 5, 0, 'Monster!', 12, 0, 100, 0, 0, 0, 31662, 'Kor''kron Elite'), +(14304, 5, 1, 'Murderer!', 12, 0, 100, 0, 0, 0, 31679, 'Kor''kron Elite'), +(14304, 5, 2, 'GET A ROPE!', 12, 0, 100, 0, 0, 0, 31669, 'Kor''kron Elite'), +(14304, 5, 3, 'How dare you set foot in our city!', 12, 0, 100, 0, 0, 0, 31684, 'Kor''kron Elite'), +(14304, 5, 4, 'You disgust me.', 12, 0, 100, 0, 0, 0, 31680, 'Kor''kron Elite'), +(14304, 5, 5, 'Looks like we''re going to have ourselves an execution.', 12, 0, 100, 0, 0, 0, 31682, 'Kor''kron Elite'), +(14304, 5, 6, 'Traitorous dog.', 12, 0, 100, 0, 0, 0, 31665, 'Kor''kron Elite'), +(14304, 5, 7, 'My family was wiped out by the Scourge! MONSTER!', 12, 0, 100, 0, 0, 0, 31667, 'Kor''kron Elite'), +(1756, 2, 0, '%s throws a rotten apple at $n.', 16, 0, 100, 0, 0, 0, 31671, 'Stormwind Royal Guard'), +(1756, 3, 0, '%s throws rotten banana on $n.', 16, 0, 100, 0, 0, 0, 31672, 'Stormwind Royal Guard'), +(1756, 4, 0, '%s spits on $n.', 16, 0, 100, 0, 0, 0, 31673, 'Stormwind Royal Guard'), +(1756, 5, 0, 'Monster!', 12, 0, 100, 0, 0, 0, 31662, 'Stormwind Royal Guard'), +(1756, 5, 1, 'Murderer!', 12, 0, 100, 0, 0, 0, 31679, 'Stormwind Royal Guard'), +(1756, 5, 2, 'GET A ROPE!', 12, 0, 100, 0, 0, 0, 31669, 'Stormwind Royal Guard'), +(1756, 5, 3, 'How dare you set foot in our city!', 12, 0, 100, 0, 0, 0, 31684, 'Stormwind Royal Guard'), +(1756, 5, 4, 'You disgust me.', 12, 0, 100, 0, 0, 0, 31680, 'Stormwind Royal Guard'), +(1756, 5, 5, 'Looks like we''re going to have ourselves an execution.', 12, 0, 100, 0, 0, 0, 31682, 'Stormwind Royal Guard'), +(1756, 5, 6, 'Traitorous dog.', 12, 0, 100, 0, 0, 0, 31665, 'Stormwind Royal Guard'), +(1756, 5, 7, 'My family was wiped out by the Scourge! MONSTER!', 12, 0, 100, 0, 0, 0, 31667, 'Stormwind Royal Guard'), +(1976, 2, 0, '%s throws a rotten apple at $n.', 16, 0, 100, 0, 0, 0, 31671, 'Stormwind City Patroller'), +(1976, 3, 0, '%s throws rotten banana on $n.', 16, 0, 100, 0, 0, 0, 31672, 'Stormwind City Patroller'), +(1976, 4, 0, '%s spits on $n.', 16, 0, 100, 0, 0, 0, 31673, 'Stormwind City Patroller'), +(1976, 5, 0, 'Monster!', 12, 0, 100, 0, 0, 0, 31662, 'Stormwind City Patroller'), +(1976, 5, 1, 'Murderer!', 12, 0, 100, 0, 0, 0, 31679, 'Stormwind City Patroller'), +(1976, 5, 2, 'GET A ROPE!', 12, 0, 100, 0, 0, 0, 31669, 'Stormwind City Patroller'), +(1976, 5, 3, 'How dare you set foot in our city!', 12, 0, 100, 0, 0, 0, 31684, 'Stormwind City Patroller'), +(1976, 5, 4, 'You disgust me.', 12, 0, 100, 0, 0, 0, 31680, 'Stormwind City Patroller'), +(1976, 5, 5, 'Looks like we''re going to have ourselves an execution.', 12, 0, 100, 0, 0, 0, 31682, 'Stormwind City Patroller'), +(1976, 5, 6, 'Traitorous dog.', 12, 0, 100, 0, 0, 0, 31665, 'Stormwind City Patroller'), +(1976, 5, 7, 'My family was wiped out by the Scourge! MONSTER!', 12, 0, 100, 0, 0, 0, 31667, 'Stormwind City Patroller'), +(3296, 2, 0, '%s throws a rotten apple at $n.', 16, 0, 100, 0, 0, 0, 31671, 'Orgrimmar Grunt'), +(3296, 3, 0, '%s throws rotten banana on $n.', 16, 0, 100, 0, 0, 0, 31672, 'Orgrimmar Grunt'), +(3296, 4, 0, '%s spits on $n.', 16, 0, 100, 0, 0, 0, 31673, 'Orgrimmar Grunt'), +(3296, 5, 0, 'Monster!', 12, 0, 100, 0, 0, 0, 31662, 'Orgrimmar Grunt'), +(3296, 5, 1, 'Murderer!', 12, 0, 100, 0, 0, 0, 31679, 'Orgrimmar Grunt'), +(3296, 5, 2, 'GET A ROPE!', 12, 0, 100, 0, 0, 0, 31669, 'Orgrimmar Grunt'), +(3296, 5, 3, 'How dare you set foot in our city!', 12, 0, 100, 0, 0, 0, 31684, 'Orgrimmar Grunt'), +(3296, 5, 4, 'You disgust me.', 12, 0, 100, 0, 0, 0, 31680, 'Orgrimmar Grunt'), +(3296, 5, 5, 'Looks like we''re going to have ourselves an execution.', 12, 0, 100, 0, 0, 0, 31682, 'Orgrimmar Grunt'), +(3296, 5, 6, 'Traitorous dog.', 12, 0, 100, 0, 0, 0, 31665, 'Orgrimmar Grunt'), +(3296, 5, 7, 'My family was wiped out by the Scourge! MONSTER!', 12, 0, 100, 0, 0, 0, 31667, 'Orgrimmar Grunt'), +(14304, 0, 0, 'Taste blade, mongrel!', 12, 0, 100, 0, 0, 0, 10950, 'Kor''kron Elite - On Aggro'), +(14304, 0, 1, 'Please tell me that you didn''t just do what I think you just did. Please tell me that I''m not going to have to hurt you... ', 12, 0, 100, 0, 0, 0, 10951, 'Kor''kron Elite - On Aggro'), +(14304, 0, 2, 'As if we don''t have enough problems, you go and create more!', 12, 0, 100, 0, 0, 0, 10953, 'Kor''kron Elite - On Aggro'), +(14304, 0, 3, 'You dare spill blood on neutral ground? OUT! OUT, I SAY!', 12, 0, 100, 0, 0, 0, 10948, 'Kor''kron Elite - On Aggro'), +(14304, 0, 4, 'We don''t take kindly to miscreants, $r.', 12, 0, 100, 0, 0, 0, 10949, 'Kor''kron Elite - On Aggro'), +(14304, 0, 5, 'Get a rope!',12, 0, 100, 0, 0, 0, 10952, 'Kor''kron Elite - On Aggro'), +(14304, 0, 6, 'Believe me when I tell you this: You''re gonna wish you weren''t born, sissy!', 12, 0, 100, 0, 0, 0, 10954, 'Kor''kron Elite - On Aggro'), +(14304, 0, 7, 'Your actions shame us all, $c. I hurt inside as I beat you senseless.', 12, 0, 100, 0, 0, 0, 10955, 'Kor''kron Elite - On Aggro'); + +-- AIs +-- Stormwind City Guard SAI +SET @ENTRY := 68; +UPDATE `creature_template` SET `AIName`="SmartAI", `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,10,0,100,0,1,10,10000,10000,87,@ENTRY*100+00,@ENTRY*100+01,@ENTRY*100+02,@ENTRY*100+03,0,0,1,0,0,0,0,0,0,0,"Stormwind City Guard - Within 1-10 Range Out of Combat LoS - Run Random Script"), +(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On aggro - Say text1"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=68; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,68,0,0,28,0,13188,0,0,0,"","Only Run script if quest is completed"); + +-- Kor''kron Elite SAI +SET @ENTRY := 14304; +UPDATE `creature_template` SET `AIName`="SmartAI", `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,10,0,100,0,1,10,10000,10000,87,68*100+00,68*100+01,68*100+02,68*100+03,0,0,1,0,0,0,0,0,0,0,"Kor''kron Elite - Within 1-10 Range Out of Combat LoS - Run Random Script"), +(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kor''kron Elite - On aggro - Say text1"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=14304; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,14304,0,0,28,0,13189,0,0,0,"","Only Run script if quest is completed"); + +-- Stormwind City Patroller SAI +SET @ENTRY := 1976; +UPDATE `creature_template` SET `AIName`="SmartAI", `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,10,0,100,0,1,10,10000,10000,87,68*100+00,68*100+01,68*100+02,68*100+03,0,0,1,0,0,0,0,0,0,0,"Stormwind City Patroller - Within 1-10 Range Out of Combat LoS - Run Random Script"), +(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Patroller - On aggro - Say text1"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=1976; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,1976,0,0,28,0,13188,0,0,0,"","Only Run script if quest is completed"); + +-- Stormwind Royal Guard SAI +SET @ENTRY := 1756; +UPDATE `creature_template` SET `AIName`="SmartAI", `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,10,0,100,0,1,10,10000,10000,87,68*100+00,68*100+01,68*100+02,68*100+03,0,0,1,0,0,0,0,0,0,0,"Stormwind Royal Guard - Within 1-10 Range Out of Combat LoS - Run Random Script"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=1756; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,1756,0,0,28,0,13188,0,0,0,"","Only Run script if quest is completed"); + +-- Orgrimmar Grunt SAI +SET @ENTRY := 3296; +UPDATE `creature_template` SET `AIName`="SmartAI", `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,10,0,100,0,1,10,10000,10000,87,68*100+00,68*100+01,68*100+02,68*100+03,0,0,1,0,0,0,0,0,0,0,"Orgrimmar Grunt - Within 1-10 Range Out of Combat LoS - Run Random Script"), +(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Orgrimmar Grunt - On aggro - Say text1"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=3296; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,3296,0,0,28,0,13189,0,0,0,"","Only Run script if quest is completed"); + +-- Actionlist SAI +SET @ENTRY := 6800; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58509,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Cast ''Rotten Apple Toss'"), +(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,1,2,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Say Line 2"); + +-- Actionlist SAI +SET @ENTRY := 6801; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58513,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Cast 'Rotten Banana Toss'"), +(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,1,3,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Say Line 3"); + +-- Actionlist SAI +SET @ENTRY := 6802; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58520,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Cast 'Spit'"), +(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,1,4,0,0,0,0,0,7,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Say Line 4"); + +-- Actionlist SAI +SET @ENTRY := 6803; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stormwind City Guard - On Script - Say Line 5"); + + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (58509, 58513, 58520); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +(58509, 58511, 0, 'Rotten Apple - Rotten Apple'), +(58513, 58514, 0, 'Rotten Banana - Rotten Banana'), +(58520, 58519, 0, 'Spit - Spit'); From a791663556b5969fb842285825262be08713f79d Mon Sep 17 00:00:00 2001 From: Dr-J Date: Mon, 7 Sep 2015 19:57:53 +0100 Subject: [PATCH 101/110] DB/Misc: Correction A correction as pointed out by Killyana, reversing faction update do peons with defiant and enraged change hostile rather then the peons with the other 2 buffs turn friendly, Ye I forgot about the dragonmaw illusion buff when testing. --- sql/updates/world/2015_09_07_04_world.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 sql/updates/world/2015_09_07_04_world.sql diff --git a/sql/updates/world/2015_09_07_04_world.sql b/sql/updates/world/2015_09_07_04_world.sql new file mode 100644 index 00000000000..bfae5b6eafd --- /dev/null +++ b/sql/updates/world/2015_09_07_04_world.sql @@ -0,0 +1,8 @@ +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN(2331100,2331101,2331102) AND `id`>0; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` =23311 AND `id`=12; +UPDATE `smart_scripts` SET `link`=12 WHERE `entryorguid`=23311 AND `source_type`=0 AND `id`=8 AND `link`=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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2331100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 89, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 1 - Set Random Movement'), +(2331102, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Script 3 - Set Faction'), +(23311, 0, 12, 0, 61, 0, 100, 0, 0, 0, 0, 0, 2, 62, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Disobedient Dragonmaw Peon - Linked with Previous Event - Set Faction'); From da612f2041b15bb6f19cee01bd201d63e304d4dc Mon Sep 17 00:00:00 2001 From: Killyana Date: Mon, 7 Sep 2015 21:16:48 +0200 Subject: [PATCH 102/110] DB/NPC: Argent Cannon Add the regen mana on spell casted, and set initial mana to 0. Closes #15460 --- sql/updates/world/2015_09_07_05_world.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 sql/updates/world/2015_09_07_05_world.sql diff --git a/sql/updates/world/2015_09_07_05_world.sql b/sql/updates/world/2015_09_07_05_world.sql new file mode 100644 index 00000000000..6ddd137c60d --- /dev/null +++ b/sql/updates/world/2015_09_07_05_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 57387; +INSERT INTO `spell_linked_spell` VALUES (57387, 57608, 0, 'Argent Cannon - Powering Up The Core'); +UPDATE `creature` SET `curhealth`=126000 WHERE `id`=30236; +UPDATE `creature_template` SET `unit_flags2`=0, `RegenHealth`=0 WHERE `entry`=30236; From 9829ad846db176b7dc85e93cd6de2c7a32348949 Mon Sep 17 00:00:00 2001 From: Killyana Date: Tue, 8 Sep 2015 17:28:42 +0200 Subject: [PATCH 103/110] DB/Quest: Generosity Abounds Add condition for the spell Iron Chain Add cosmetic Exploding Abomination and fix visual issues. Closes #15461 --- sql/updates/world/2015_09_08_00_world.sql | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 sql/updates/world/2015_09_08_00_world.sql diff --git a/sql/updates/world/2015_09_08_00_world.sql b/sql/updates/world/2015_09_08_00_world.sql new file mode 100644 index 00000000000..1b000429a1a --- /dev/null +++ b/sql/updates/world/2015_09_08_00_world.sql @@ -0,0 +1,15 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry` IN (58203); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17,0,58203,0,0,31,1,3,31075,0,0,0,'','Iron Chain'); + +UPDATE `smart_scripts` SET `event_param1`=500, `event_param2`=500, `action_type`=51 WHERE `entryorguid` IN (3092000) AND `source_type`=9 AND `id`=5; +UPDATE `smart_scripts` SET `event_param1`=2000, `event_param2`=2000, `action_param1`=52520 WHERE `entryorguid` IN (3092000) AND `source_type`=9 AND `id`=0; +UPDATE `smart_scripts` SET `event_param1`=2000, `event_param2`=2000, `action_param1`=58231, `target_type`=1, `target_param1`=0 WHERE `entryorguid` IN (3107500) AND `source_type`=9 AND `id`=0; +UPDATE `smart_scripts` SET `event_type`=38, `event_param1`=1, `event_param2`=1, `event_param3`=0, `event_param4`=0, `action_type`=103, `action_param1`=1, `comment`="Scourge Bomb - On Data Set 1 1 - Root" WHERE `entryorguid` IN (31075) AND `source_type`=0 AND `id`=3; +UPDATE `smart_scripts` SET `event_param1`=1000, `event_param2`=1000, `action_param1`=0 WHERE `entryorguid` IN (3107500) AND `source_type`=9 AND `id`=1; +UPDATE `smart_scripts` SET `event_param3`=3 WHERE `entryorguid` IN (30920) AND `source_type`=0 AND `id`=1; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (58231); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13,2,58231,0,0,31,0,3,31075,0,1,0,'','Exploding Abomination'); From 77beb316dd7b1442ea8cab48b51eb3da18d61175 Mon Sep 17 00:00:00 2001 From: Killyana Date: Tue, 8 Sep 2015 19:59:00 +0200 Subject: [PATCH 104/110] DB/Gossip: Fix some weapon masters gossip menus Author: @tkrokli Closes #15464 --- sql/updates/world/2015_09_08_01_world.sql | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 sql/updates/world/2015_09_08_01_world.sql diff --git a/sql/updates/world/2015_09_08_01_world.sql b/sql/updates/world/2015_09_08_01_world.sql new file mode 100644 index 00000000000..ac4c458096e --- /dev/null +++ b/sql/updates/world/2015_09_08_01_world.sql @@ -0,0 +1,39 @@ +-- +-- Weapon Master Hanashi: add the missing linked IDs in `action_menu_id` +UPDATE `gossip_menu_option` SET `action_menu_id`= 5262 WHERE `menu_id`= 5263 AND `OptionBroadcastTextID`= 8812; + +-- Hanashi is a troll, using Low Common "Troll" speech, so link the correct text lines for him: +UPDATE `gossip_menu_option` SET `action_menu_id`= 8603 WHERE `menu_id`= 5262 AND `option_text`= 'Crossbow'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8604 WHERE `menu_id`= 5262 AND `option_text`= 'Dagger'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8605 WHERE `menu_id`= 5262 AND `option_text`= 'Fist Weapon'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8606 WHERE `menu_id`= 5262 AND `option_text`= 'Gun'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8607 WHERE `menu_id`= 5262 AND `option_text`= 'Mace'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8608 WHERE `menu_id`= 5262 AND `option_text`= 'Polearm'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8609 WHERE `menu_id`= 5262 AND `option_text`= 'Sword'; + +-- Weapon Master Archibald: add missing linked IDs to `action_menu_id` (using default gossip from npc_text) +UPDATE `gossip_menu_option` SET `action_menu_id`= 5268 WHERE `menu_id`= 5269 AND `OptionBroadcastTextID`= 8812; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8592 WHERE `menu_id`= 5268 AND `option_text`= 'Axe'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8593 WHERE `menu_id`= 5268 AND `option_text`= 'Bow'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8596 WHERE `menu_id`= 5268 AND `option_text`= 'Fist Weapon'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8597 WHERE `menu_id`= 5268 AND `option_text`= 'Gun'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8598 WHERE `menu_id`= 5268 AND `option_text`= 'Mace'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8600 WHERE `menu_id`= 5268 AND `option_text`= 'Staff'; +UPDATE `gossip_menu_option` SET `action_menu_id`= 8602 WHERE `menu_id`= 5268 AND `option_text`= 'Thrown'; + +-- Weapon Master Sayoc: add the gossip link ID 5220 in `action_menu_id` and link it in `gossip_menu` too +UPDATE `gossip_menu_option` SET `action_menu_id` = 5222 WHERE `menu_id` = 5221 AND `OptionBroadcastTextID`= 8812; +-- Sayoc needs new lines in `gossip_menu_option` as well as the linked lines from npc_text : +DELETE FROM `gossip_menu_option` WHERE `menu_id` = 5222 AND `OptionBroadcastTextID` IN (20582,20585,20586,20587,20588,20589); +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(5222,0,0,'Crossbow',20582,1,1,8594,0,0,0,'',0), +(5222,1,0,'Gun',20585,1,1,8597,0,0,0,'',0), +(5222,2,0,'Mace',20586,1,1,8598,0,0,0,'',0), +(5222,3,0,'Polearm',20587,1,1,8599,0,0,0,'',0), +(5222,4,0,'Staff',20588,1,1,8610,0,0,0,'',0), -- +(5222,5,0,'Sword',20589,1,1,8601,0,0,0,'',0); + +UPDATE `creature_template` SET `type_flags`=134217728 WHERE `entry` IN (17005); +DELETE FROM `gossip_menu_option` WHERE (`menu_id`=7337); +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(7337,0,3,'Show me what you know, Larenis.',13168,5,16,0,0,0,0,'',0); From 1503be010ba98930081cc7da2a8929eed787b041 Mon Sep 17 00:00:00 2001 From: m_pan Date: Tue, 8 Sep 2015 13:30:50 -0500 Subject: [PATCH 105/110] Config: Minor Typo # Updates.SourcePath > # Updates.MySqlCLIPath --- src/server/authserver/authserver.conf.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index ba9cb5b23b4..437ec221e94 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -182,7 +182,7 @@ Updates.EnableDatabases = 0 Updates.SourcePath = "" # -# Updates.SourcePath +# Updates.MySqlCLIPath # Description: The path to your mysql cli binary. # If the path is left empty, built-in path from cmake is used. # Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" From 90ef83ad052892ee3df56ccb9af9594b0dd8932f Mon Sep 17 00:00:00 2001 From: Killyana Date: Tue, 8 Sep 2015 23:29:13 +0200 Subject: [PATCH 106/110] DB/Gossip: Fix gossip menus with only one special option --- sql/updates/world/2015_09_08_02_world.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sql/updates/world/2015_09_08_02_world.sql diff --git a/sql/updates/world/2015_09_08_02_world.sql b/sql/updates/world/2015_09_08_02_world.sql new file mode 100644 index 00000000000..5fbf0df3488 --- /dev/null +++ b/sql/updates/world/2015_09_08_02_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `type_flags`=`type_flags`|134217728 WHERE `npcflag`>16 AND `gossip_menu_id`!= 0; From 153c8fda6fcaa1b92b309bb9c3d4d46e22dcfa08 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Wed, 9 Sep 2015 04:37:31 +0200 Subject: [PATCH 107/110] DB/Misc: Fix startup errors --- sql/updates/world/2015_09_09_00_world.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 sql/updates/world/2015_09_09_00_world.sql diff --git a/sql/updates/world/2015_09_09_00_world.sql b/sql/updates/world/2015_09_09_00_world.sql new file mode 100644 index 00000000000..a3190da0559 --- /dev/null +++ b/sql/updates/world/2015_09_09_00_world.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `creature` WHERE `guid` IN (120831,120833,123124); +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(120831, 32769, 571, 1, 1, 25753, 0, 7523.09, 1852.78, 491.641, 3.23212, 300, 0, 0, 12600, 3994, 0, 0, 0, 0, 0), +(120833, 32769, 571, 1, 1, 25753, 0, 7703.2, 1822.89, 469.378, 3.94286, 300, 0, 0, 12600, 3994, 0, 0, 0, 0, 0), +(123124, 32769, 571, 1, 1, 25753, 0, 7733.55, 1578.02, 469.378, 2.51066, 300, 0, 0, 12600, 3994, 0, 0, 0, 0, 0); + +DELETE FROM pool_creature WHERE guid = 151994; From 556c413fcce78e4690f4ff405f88bdda99f113f7 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Wed, 9 Sep 2015 04:39:45 +0200 Subject: [PATCH 108/110] Update 2015_09_09_00_world.sql copy&paste is evil. --- sql/updates/world/2015_09_09_00_world.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/updates/world/2015_09_09_00_world.sql b/sql/updates/world/2015_09_09_00_world.sql index a3190da0559..697123fefac 100644 --- a/sql/updates/world/2015_09_09_00_world.sql +++ b/sql/updates/world/2015_09_09_00_world.sql @@ -1,6 +1,6 @@ -- DELETE FROM `creature` WHERE `guid` IN (120831,120833,123124); -INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES (120831, 32769, 571, 1, 1, 25753, 0, 7523.09, 1852.78, 491.641, 3.23212, 300, 0, 0, 12600, 3994, 0, 0, 0, 0, 0), (120833, 32769, 571, 1, 1, 25753, 0, 7703.2, 1822.89, 469.378, 3.94286, 300, 0, 0, 12600, 3994, 0, 0, 0, 0, 0), (123124, 32769, 571, 1, 1, 25753, 0, 7733.55, 1578.02, 469.378, 2.51066, 300, 0, 0, 12600, 3994, 0, 0, 0, 0, 0); From 33892e0f9da468e8aa3ea173e5baa269235e5070 Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Mon, 7 Sep 2015 18:47:45 +0200 Subject: [PATCH 109/110] DB/World schema backport: updated quest_template table --- sql/updates/world/2015_09_10_00_world_335.sql | 21 +++++++++++++++++++ src/server/game/Globals/ObjectMgr.cpp | 20 +++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 sql/updates/world/2015_09_10_00_world_335.sql diff --git a/sql/updates/world/2015_09_10_00_world_335.sql b/sql/updates/world/2015_09_10_00_world_335.sql new file mode 100644 index 00000000000..f3fb517d486 --- /dev/null +++ b/sql/updates/world/2015_09_10_00_world_335.sql @@ -0,0 +1,21 @@ +ALTER TABLE `quest_template` + CHANGE COLUMN `LimitTime` `TimeAllowed` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PointOption`, + CHANGE COLUMN `RequiredRaces` `RequiredRaces` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `TimeAllowed`, + CHANGE COLUMN `NextQuestIdChain` `RewardNextQuest` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredFactionValue2`, + CHANGE COLUMN `RewardXPId` `RewardXPDifficulty` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardNextQuest`, + CHANGE COLUMN `RewardOrRequiredMoney` `RewardMoney` INT(11) NOT NULL DEFAULT '0' AFTER `RewardXPDifficulty`, + CHANGE COLUMN `RewardMoneyMaxLevel` `RewardBonusMoney` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardMoney`, + CHANGE COLUMN `RewardSpell` `RewardDisplaySpell` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardBonusMoney`, + CHANGE COLUMN `RewardSpellCast` `RewardSpell` INT(11) NOT NULL DEFAULT '0' AFTER `RewardDisplaySpell`, + CHANGE COLUMN `RewardHonorMultiplier` `RewardKillHonor` FLOAT NOT NULL DEFAULT '0' AFTER `RewardHonor`, + CHANGE COLUMN `SourceItemId` `StartItem` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardKillHonor`, + CHANGE COLUMN `RewardTitle` `RewardTitle` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemQuantity6`, + CHANGE COLUMN `RewardTalents` `RewardTalents` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardTitle`, + CHANGE COLUMN `RewardArenaPoints` `RewardArenaPoints` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardTalents`; +-- split needed to avoid import errors +ALTER TABLE `quest_template` + CHANGE COLUMN `PointMapId` `POIContinent` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardChoiceItemQuantity6`, + CHANGE COLUMN `PointX` `POIx` FLOAT NOT NULL DEFAULT '0' AFTER `POIContinent`, + CHANGE COLUMN `PointY` `POIy` FLOAT NOT NULL DEFAULT '0' AFTER `POIx`, + CHANGE COLUMN `PointOption` `POIPriority` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `POIy`, + CHANGE COLUMN `EndText` `AreaDescription` TEXT NULL AFTER `QuestDescription`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 71b06c1a308..6eefa9770b3 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3966,24 +3966,24 @@ void ObjectMgr::LoadQuests() mExclusiveQuestGroups.clear(); QueryResult result = WorldDatabase.Query("SELECT " - //0 1 2 3 4 5 6 7 8 - "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, LimitTime, RequiredRaces," + //0 1 2 3 4 5 6 7 8 + "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, RequiredRaces," // 9 10 11 12 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, " - // 13 14 15 16 17 18 19 20 - "NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, " - // 21 22 23 24 25 26 - "SourceItemId, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, " + // 13 14 15 16 17 18 19 20 + "RewardNextQuest, RewardXPDifficulty, RewardMoney, RewardBonusMoney, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, " + // 21 22 23 24 25 26 + "StartItem, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, " // 27 28 29 30 31 32 33 34 "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, " // 35 36 37 38 39 40 41 42 43 44 45 46 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, " // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5," - // 62 63 64 65 - "PointMapId, PointX, PointY, PointOption, " - // 66 67 68 69 70 - "LogTitle, LogDescription, QuestDescription, EndText, QuestCompletionLog, " + // 62 63 64 65 + "POIContinent, POIx, POIy, POIPriority, " + // 66 67 68 69 70 + "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, " // 71 72 73 74 75 76 77 78 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, " // 79 80 81 82 83 84 85 86 From 38cbefd3c4725a3b4ad24bd493299b7aaecc93c2 Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Thu, 10 Sep 2015 15:54:56 +0200 Subject: [PATCH 110/110] DB/World schema backport: updated quest_template table --- sql/updates/world/2015_09_10_01_world_335.sql | 10 ++++++++++ src/server/game/Globals/ObjectMgr.cpp | 8 ++++---- 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 sql/updates/world/2015_09_10_01_world_335.sql diff --git a/sql/updates/world/2015_09_10_01_world_335.sql b/sql/updates/world/2015_09_10_01_world_335.sql new file mode 100644 index 00000000000..4a14da07ff8 --- /dev/null +++ b/sql/updates/world/2015_09_10_01_world_335.sql @@ -0,0 +1,10 @@ +ALTER TABLE `quest_template` + CHANGE COLUMN `RequiredRaces` `AllowableRaces` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `TimeAllowed`, + CHANGE COLUMN `RequiredSourceItemId1` `ItemDrop1` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardAmount4`, + CHANGE COLUMN `RequiredSourceItemCount1` `ItemDropQuantity1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDrop1`, + CHANGE COLUMN `RequiredSourceItemId2` `ItemDrop2` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDropQuantity1`, + CHANGE COLUMN `RequiredSourceItemCount2` `ItemDropQuantity2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDrop2`, + CHANGE COLUMN `RequiredSourceItemId3` `ItemDrop3` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDropQuantity2`, + CHANGE COLUMN `RequiredSourceItemCount3` `ItemDropQuantity3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDrop3`, + CHANGE COLUMN `RequiredSourceItemId4` `ItemDrop4` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDropQuantity3`, + CHANGE COLUMN `RequiredSourceItemCount4` `ItemDropQuantity4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ItemDrop4`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6eefa9770b3..9ed8dc1cf75 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3966,8 +3966,8 @@ void ObjectMgr::LoadQuests() mExclusiveQuestGroups.clear(); QueryResult result = WorldDatabase.Query("SELECT " - //0 1 2 3 4 5 6 7 8 - "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, RequiredRaces," + //0 1 2 3 4 5 6 7 8 + "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, AllowableRaces," // 9 10 11 12 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, " // 13 14 15 16 17 18 19 20 @@ -3986,8 +3986,8 @@ void ObjectMgr::LoadQuests() "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, " // 71 72 73 74 75 76 77 78 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, " - // 79 80 81 82 83 84 85 86 - "RequiredSourceItemId1, RequiredSourceItemId2, RequiredSourceItemId3, RequiredSourceItemId4, RequiredSourceItemCount1, RequiredSourceItemCount2, RequiredSourceItemCount3, RequiredSourceItemCount4, " + // 79 80 81 82 83 84 85 86 + "ItemDrop1, ItemDrop2, ItemDrop3, ItemDrop4, ItemDropQuantity1, ItemDropQuantity2, ItemDropQuantity3, ItemDropQuantity4, " // 87 88 89 90 91 92 93 94 95 96 97 98 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, " // 99 100 101 102 103