/* Copyright (C) 2006,2007 ScriptDev2 * 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SCRIPTMGR_H #define SCRIPTMGR_H #include "../../game/Player.h" #include "../../game/GameObject.h" #include "../../game/SharedDefines.h" #include "../../game/GossipDef.h" #include "../../game/QuestDef.h" #include "../../game/WorldSession.h" #include "../../game/CreatureAI.h" #include "../../game/TargetedMovementGenerator.h" #include "../../shared/WorldPacket.h" #include "../../shared/Database/DBCStores.h" #define MAX_SCRIPTS 1000 struct Script { Script() : pGossipHello(NULL), pQuestAccept(NULL), pGossipSelect(NULL), pGossipSelectWithCode(NULL), pQuestSelect(NULL), pQuestComplete(NULL), pNPCDialogStatus(NULL), pChooseReward(NULL), pItemHello(NULL), pGOHello(NULL), pAreaTrigger(NULL), pItemQuestAccept(NULL), pGOQuestAccept(NULL), pGOChooseReward(NULL),pReceiveEmote(NULL),pItemUse(NULL), GetAI(NULL) {} std::string Name; // -- Quest/gossip Methods to be scripted -- bool (*pGossipHello )(Player *player, Creature *_Creature); bool (*pQuestAccept )(Player *player, Creature *_Creature, Quest *_Quest ); bool (*pGossipSelect )(Player *player, Creature *_Creature, uint32 sender, uint32 action ); bool (*pGossipSelectWithCode)(Player *player, Creature *_Creature, uint32 sender, uint32 action, char* sCode ); bool (*pQuestSelect )(Player *player, Creature *_Creature, Quest *_Quest ); bool (*pQuestComplete )(Player *player, Creature *_Creature, Quest *_Quest ); uint32 (*pNPCDialogStatus )(Player *player, Creature *_Creature ); bool (*pChooseReward )(Player *player, Creature *_Creature, Quest *_Quest, uint32 opt ); bool (*pItemHello )(Player *player, Item *_Item, Quest *_Quest ); bool (*pGOHello )(Player *player, GameObject *_GO ); bool (*pAreaTrigger )(Player *player, Quest *_Quest, uint32 triggerID ); bool (*pItemQuestAccept )(Player *player, Item *_Item, Quest *_Quest ); bool (*pGOQuestAccept )(Player *player, GameObject *_GO, Quest *_Quest ); bool (*pGOChooseReward )(Player *player, GameObject *_GO, Quest *_Quest, uint32 opt ); CreatureAI* (*GetAI)(Creature *_Creature); bool (*pReceiveEmote )(Player *player, Creature *_Creature, uint32 emote); bool (*pItemUse )(Player *player, Item* _Item); // ----------------------------------------- }; extern int nrscripts; extern Script *m_scripts[MAX_SCRIPTS]; #define VISIBLE_RANGE (26.46f) //Spell Targets (used in Select Spell) enum Targets { TARGET_SELF = 1, TARGET_PET = 5, TARGET_SINGLE_ENEMY = 6, TARGET_ALL_ENEMY_IN_AREA = 15, TARGET_ALL_ENEMY_IN_AREA_INSTANT = 16, TARGET_ALL_PARTY_AROUND_CASTER = 20, TARGET_SINGLE_FRIEND = 21, TARGET_ALL_ENEMIES_AROUND_CASTER = 22, TARGET_GAMEOBJECT = 23, TARGET_IN_FRONT_OF_CASTER = 24, TARGET_DUELVSPLAYER = 25, TARGET_GAMEOBJECT_ITEM = 26, TARGET_ALL_ENEMY_IN_AREA_CHANNELED = 28, TARGET_MINION = 32, TARGET_SINGLE_PARTY = 35, TARGET_AREAEFFECT_PARTY = 37, TARGET_SELF_FISHING = 39, TARGET_TOTEM_EARTH = 41, TARGET_TOTEM_WATER = 42, TARGET_TOTEM_AIR = 43, TARGET_TOTEM_FIRE = 44, TARGET_CHAIN = 45, TARGET_DYNAMIC_OBJECT = 47, TARGET_CURRENT_SELECTED_ENEMY = 53, TARGET_SINGLE_FRIEND_2 = 57, //This is incorrectly labled, this should say SINGLE_ENEMY_2. Needs to be examined TARGET_AREAEFFECT_PARTY_AND_CLASS = 61, }; //Spell targets used by SelectSpell enum SelectTarget { SELECT_TARGET_DONTCARE = 0, //All target types allowed SELECT_TARGET_SELF, //Only Self casting SELECT_TARGET_SINGLE_ENEMY, //Only Single Enemy SELECT_TARGET_AOE_ENEMY, //Only AoE Enemy SELECT_TARGET_ANY_ENEMY, //AoE or Single Enemy SELECT_TARGET_SINGLE_FRIEND, //Only Single Friend SELECT_TARGET_AOE_FRIEND, //Only AoE Friend SELECT_TARGET_ANY_FRIEND, //AoE or Single Friend }; //Spell Effects used by SelectSpell enum SelectEffect { SELECT_EFFECT_DONTCARE = 0, //All spell effects allowed SELECT_EFFECT_DAMAGE, //Spell does damage SELECT_EFFECT_HEALING, //Spell does healing SELECT_EFFECT_AURA, //Spell applies an aura }; //Chat defines #define CHAT_MSG_MONSTER_SAY 0x0B #define CHAT_MSG_MONSTER_YELL 0x0C #define CHAT_MSG_MONSTER_EMOTE 0x0D struct MANGOS_DLL_DECL ScriptedAI : public CreatureAI { ScriptedAI(Creature* creature) : m_creature(creature) {} ~ScriptedAI() {} //Called if IsVisible(Unit *who) is true at each *who move void MoveInLineOfSight(Unit *) {} //Called at each attack of m_creature by any victim void AttackStart(Unit *); //Called at stoping attack by any attacker void EnterEvadeMode(); //Called at any heal cast/item used (call non implemented in mangos) void HealBy(Unit *healer, uint32 amount_healed) {} //Called at any Damage from any attacker void DamageInflict(Unit *healer, uint32 amount_healed) {} //Is unit visible for MoveInLineOfSight bool IsVisible(Unit *who) const { if (!who) return false; return m_creature->IsWithinDist(who, VISIBLE_RANGE) && who->isVisibleFor(m_creature,true); } //Called at World update tick void UpdateAI(const uint32); void JustDied(Unit*){} void KilledUnit(Unit*){} Creature* m_creature; //Check condition for attack stop virtual bool needToStop() const; //************* //AI Helper Functions //************* //Start attack of victim and go to him void DoStartMeleeAttack(Unit* victim); //Start attack of victim but stay in position void DoStartRangedAttack(Unit* victim); //Stop attack of current victim void DoStopAttack(); //Cast spell by Id void DoCast(Unit* victim, uint32 spelId); //Cast spell by spell info void DoCastSpell(Unit* who,SpellEntry const *spellInfo); //Creature say void DoSay(char const* text, uint32 language, Unit* target); //Creature Yell void DoYell(char const* text, uint32 language, Unit* target); //Creature Text emote void DoTextEmote(char const* text, Unit* target); //Go back to spawn point void DoGoHome(); //Plays a sound to all nearby players void DoPlaySoundToSet(Unit* unit, uint32 sound); //Faces target void DoFaceTarget(Unit* unit); //Returns spells that meet the specified criteria from the creatures spell list SpellEntry const* SelectSpell(Unit* Target, uint32 School, uint32 Mechanic, SelectTarget Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effect); //Checks if you can cast the specified spell bool CanCast(Unit* Target, SpellEntry const *Spell); //Returns true if you are out of tether(spawnpoint) range bool CheckTether(); }; #endif