/* * Copyright (C) 2008-2012 TrinityCore * * 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 * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /* * Spells used in holidays/game events that do not fit any other category. * Scriptnames in this file should be prefixed with "spell_#holidayname_". */ #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" #include "SpellAuraEffects.h" #include "GridNotifiers.h" #include "CellImpl.h" // 45102 Romantic Picnic enum SpellsPicnic { SPELL_BASKET_CHECK = 45119, // Holiday - Valentine - Romantic Picnic Near Basket Check SPELL_MEAL_PERIODIC = 45103, // Holiday - Valentine - Romantic Picnic Meal Periodic - effect dummy SPELL_MEAL_EAT_VISUAL = 45120, // Holiday - Valentine - Romantic Picnic Meal Eat Visual //SPELL_MEAL_PARTICLE = 45114, // Holiday - Valentine - Romantic Picnic Meal Particle - unused SPELL_DRINK_VISUAL = 45121, // Holiday - Valentine - Romantic Picnic Drink Visual SPELL_ROMANTIC_PICNIC_ACHIEV = 45123, // Romantic Picnic periodic = 5000 }; class spell_love_is_in_the_air_romantic_picnic : public SpellScriptLoader { public: spell_love_is_in_the_air_romantic_picnic() : SpellScriptLoader("spell_love_is_in_the_air_romantic_picnic") { } class spell_love_is_in_the_air_romantic_picnic_AuraScript : public AuraScript { PrepareAuraScript(spell_love_is_in_the_air_romantic_picnic_AuraScript); void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->SetStandState(UNIT_STAND_STATE_SIT); target->CastSpell(target, SPELL_MEAL_PERIODIC, false); } void OnPeriodic(AuraEffect const* /*aurEff*/) { // Every 5 seconds Unit* target = GetTarget(); Unit* caster = GetCaster(); // If our player is no longer sit, remove all auras if (target->getStandState() != UNIT_STAND_STATE_SIT) { target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV); target->RemoveAura(GetAura()); return; } target->CastSpell(target, SPELL_BASKET_CHECK, false); // unknown use, it targets Romantic Basket target->CastSpell(target, RAND(SPELL_MEAL_EAT_VISUAL, SPELL_DRINK_VISUAL), false); bool foundSomeone = false; // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) // required by achievement and "hearts" visual std::list playerList; Trinity::AnyPlayerInObjectRangeCheck checker(target, INTERACTION_DISTANCE*2); Trinity::PlayerListSearcher searcher(target, playerList, checker); target->VisitNearbyWorldObject(INTERACTION_DISTANCE*2, searcher); for (std::list::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) { if ((*itr) != target && (*itr)->HasAura(GetId())) // && (*itr)->getStandState() == UNIT_STAND_STATE_SIT) { if (caster) { caster->CastSpell(*itr, SPELL_ROMANTIC_PICNIC_ACHIEV, true); caster->CastSpell(target, SPELL_ROMANTIC_PICNIC_ACHIEV, true); } foundSomeone = true; // break; } } if (!foundSomeone && target->HasAura(SPELL_ROMANTIC_PICNIC_ACHIEV)) target->RemoveAura(SPELL_ROMANTIC_PICNIC_ACHIEV); } void Register() { AfterEffectApply += AuraEffectApplyFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_is_in_the_air_romantic_picnic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; AuraScript* GetAuraScript() const { return new spell_love_is_in_the_air_romantic_picnic_AuraScript(); } }; void AddSC_holiday_spell_scripts() { new spell_love_is_in_the_air_romantic_picnic(); }