/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* 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 3 of the License, or
* 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 .
*
*/
#ifndef SCRIPTMGR_H
#define SCRIPTMGR_H
#define SCRIPTLIB_VERSION_MAJOR 3
#define SCRIPTLIB_VERSION_MINOR 0
#define MAKE_SCRIPT_VERSION(major, minor) (uint32)(((uint16)major << 16) | ((uint16)minor))
#define SCRIPT_MODULE void*
#define ADD_CREATURE_FACTORY_FUNCTION(cl) static CreatureAIScript * Create(Creature * c) { return new cl(c); }
#define ADD_GOSSIP_FACTORY_FUNCTION(cl) static GossipScript * Create() { return new cl; }
class Channel;
class Guild;
struct Quest;
enum ServerHookEvents
{
SERVER_HOOK_EVENT_ON_NEW_CHARACTER = 1,
SERVER_HOOK_EVENT_ON_KILL_PLAYER = 2,
SERVER_HOOK_EVENT_ON_FIRST_ENTER_WORLD = 3,
SERVER_HOOK_EVENT_ON_ENTER_WORLD = 4,
SERVER_HOOK_EVENT_ON_GUILD_JOIN = 5,
SERVER_HOOK_EVENT_ON_DEATH = 6,
SERVER_HOOK_EVENT_ON_REPOP = 7,
SERVER_HOOK_EVENT_ON_EMOTE = 8,
SERVER_HOOK_EVENT_ON_ENTER_COMBAT = 9,
SERVER_HOOK_EVENT_ON_CAST_SPELL = 10,
SERVER_HOOK_EVENT_ON_TICK = 11,
SERVER_HOOK_EVENT_ON_LOGOUT_REQUEST = 12,
SERVER_HOOK_EVENT_ON_LOGOUT = 13,
SERVER_HOOK_EVENT_ON_QUEST_ACCEPT = 14,
SERVER_HOOK_EVENT_ON_ZONE = 15,
SERVER_HOOK_EVENT_ON_CHAT = 16,
SERVER_HOOK_EVENT_ON_LOOT = 17,
SERVER_HOOK_EVENT_ON_GUILD_CREATE = 18,
SERVER_HOOK_EVENT_ON_ENTER_WORLD_2 = 19,
NUM_SERVER_HOOKS,
};
/* Hook typedefs */
typedef bool(*tOnNewCharacter)(uint32 Race, uint32 Class, WorldSession * Session, const char * Name);
typedef void(*tOnKillPlayer)(Player * pPlayer, Player * pVictim);
typedef void(*tOnFirstEnterWorld)(Player * pPlayer);
typedef void(*tOnEnterWorld)(Player * pPlayer);
typedef void(*tOnGuildCreate)(Player * pLeader, Guild * pGuild);
typedef void(*tOnGuildJoin)(Player * pPlayer, Guild * pGuild);
typedef void(*tOnDeath)(Player * pPlayer);
typedef bool(*tOnRepop)(Player * pPlayer);
typedef void(*tOnEmote)(Player * pPlayer, uint32 Emote);
typedef void(*tOnEnterCombat)(Player * pPlayer, Unit * pTarget);
typedef bool(*tOnCastSpell)(Player * pPlayer, SpellEntry * pSpell);
typedef void(*tOnTick)();
typedef bool(*tOnLogoutRequest)(Player * pPlayer);
typedef void(*tOnQuestAccept)(Player * pPlayer, Quest * pQuest);
typedef void(*tOnZone)(Player * pPlayer, uint32 Zone);
typedef void(*tOnChat)(Player * pPlayer, uint32 Type, uint32 Lang, const char * Message, const char * Misc);
typedef void(*tOnLoot)(Player * pPlayer, Unit * pTarget, uint32 Money, uint32 ItemId);
class Spell;
class Aura;
class Creature;
class CreatureAIScript;
class GossipScript;
class GameObjectAIScript;
class ScriptMgr;
struct ItemPrototype;
class QuestLogEntry;
/* Factory Imports (from script lib) */
typedef CreatureAIScript*(*exp_create_creature_ai)(Creature * pCreature);
typedef GameObjectAIScript*(*exp_create_gameobject_ai)(GameObject * pGameObject);
typedef GossipScript*(*exp_create_gossip_script)();
typedef bool(*exp_handle_dummy_spell)(uint32 i, Spell * pSpell);
typedef bool(*exp_handle_dummy_aura)(uint32 i, Aura * pAura, bool apply);
typedef void(*exp_script_register)(ScriptMgr * mgr);
typedef uint32(*exp_get_version)();
/* Hashmap typedefs */
typedef HM_NAMESPACE::hash_map CreatureCreateMap;
typedef HM_NAMESPACE::hash_map GameObjectCreateMap;
typedef HM_NAMESPACE::hash_map GossipCreateMap;
typedef HM_NAMESPACE::hash_map HandleDummyAuraMap;
typedef HM_NAMESPACE::hash_map HandleDummySpellMap;
typedef list ServerHookList;
typedef list LibraryHandleMap;
class SERVER_DECL ScriptMgr : public Singleton
{
public:
friend class HookInterface;
void LoadScripts();
void UnloadScripts();
CreatureAIScript * CreateAIScriptClassForEntry(Creature* pCreature);
GameObjectAIScript * CreateAIScriptClassForGameObject(uint32 uEntryId, GameObject* pGameObject);
bool CallScriptedDummySpell(uint32 uSpellId, uint32 i, Spell* pSpell);
bool CallScriptedDummyAura( uint32 uSpellId, uint32 i, Aura* pAura, bool apply);
GossipScript* GetGossipScript(uint32 uEntryId);
void register_creature_script(uint32 entry, exp_create_creature_ai callback);
void register_gameobject_script(uint32 entry, exp_create_gameobject_ai callback);
void register_gossip_script(uint32 entry, exp_create_gossip_script callback);
void register_dummy_aura(uint32 entry, exp_handle_dummy_aura callback);
void register_dummy_spell(uint32 entry, exp_handle_dummy_spell callback);
void register_hook(ServerHookEvents event, void * function_pointer);
protected:
CreatureCreateMap _creatures;
GameObjectCreateMap _gameobjects;
GossipCreateMap _gossips;
HandleDummyAuraMap _auras;
HandleDummySpellMap _spells;
LibraryHandleMap _handles;
ServerHookList _hooks[NUM_SERVER_HOOKS];
};
class SERVER_DECL CreatureAIScript
{
public:
CreatureAIScript(Creature* creature);
virtual ~CreatureAIScript() {};
virtual void OnCombatStart(Unit* mTarget) {}
virtual void OnCombatStop(Unit* mTarget) {}
virtual void OnDamageTaken(Unit* mAttacker, float fAmount) {}
virtual void OnCastSpell(uint32 iSpellId) {}
virtual void OnTargetParried(Unit* mTarget) {}
virtual void OnTargetDodged(Unit* mTarget) {}
virtual void OnTargetBlocked(Unit* mTarget, int32 iAmount) {}
virtual void OnTargetCritHit(Unit* mTarget, float fAmount) {}
virtual void OnTargetDied(Unit* mTarget) {}
virtual void OnParried(Unit* mTarget) {}
virtual void OnDodged(Unit* mTarget) {}
virtual void OnBlocked(Unit* mTarget, int32 iAmount) {}
virtual void OnCritHit(Unit* mTarget, float fAmount) {}
virtual void OnHit(Unit* mTarget, float fAmount) {}
virtual void OnDied(Unit *mKiller) {}
virtual void OnAssistTargetDied(Unit* mAssistTarget) {}
virtual void OnFear(Unit* mFeared, uint32 iSpellId) {}
virtual void OnFlee(Unit* mFlee) {}
virtual void OnCallForHelp() {}
virtual void OnLoad() {}
virtual void OnReachWP(uint32 iWaypointId, bool bForwards) {}
virtual void OnLootTaken(Player* pPlayer, ItemPrototype *pItemPrototype) {}
virtual void AIUpdate() {}
void RegisterAIUpdateEvent(uint32 frequency);
void RemoveAIUpdateEvent();
virtual void Destroy() {}
Creature* GetUnit() { return _unit; }
protected:
Creature* _unit;
};
class SERVER_DECL GameObjectAIScript
{
public:
GameObjectAIScript(GameObject* goinstance);
virtual ~GameObjectAIScript() {}
virtual void OnCreate() {}
virtual void OnSpawn() {}
virtual void OnDespawn() {}
virtual void OnLootTaken(Player * pLooter, ItemPrototype *pItemInfo) {}
virtual void OnActivate(Player * pPlayer) {}
virtual void AIUpdate() {}
virtual void Destroy() {}
void RegisterAIUpdateEvent(uint32 frequency);
protected:
GameObject* _gameobject;
};
class SERVER_DECL GossipScript
{
public:
GossipScript();
virtual ~GossipScript() {}
virtual void GossipHello(Creature* pCreature, Player* Plr, bool AutoSend);
virtual void GossipSelectOption(Creature* pCreature, Player* Plr, uint32 Id, uint32 IntId);
virtual void GossipEnd(Creature* pCreature, Player* Plr);
virtual void Destroy();
bool AutoCreated;
};
class SERVER_DECL QuestScript
{
public:
QuestScript(QuestLogEntry* qle);
virtual ~QuestScript() {};
virtual void OnQuestStart(Player* mTarget) {}
virtual void OnQuestComplete(Player* mTarget) {}
virtual void OnQuestCancel(Player* mTarget) {}
virtual void OnGameObjectActivate(uint32 entry, Player* mTarget) {}
virtual void OnCreatureKill(uint32 entry, Player* mTarget) {}
virtual void OnExploreArea(uint32 areaId, Player* mTarget) {}
virtual void OnPlayerItemPickup(uint32 itemId, uint32 totalCount, Player* mTarget) {}
virtual void EventUpdate() {};
void RegisterQuestEvent(uint32 frequency);
void RemoveQuestEvent();
virtual void Destroy() {}
protected:
QuestLogEntry *_qLogEntry;
};
class SERVER_DECL HookInterface : public Singleton
{
public:
friend class ScriptMgr;
bool OnNewCharacter(uint32 Race, uint32 Class, WorldSession * Session, const char * Name);
void OnKillPlayer(Player * pPlayer, Player * pVictim);
void OnFirstEnterWorld(Player * pPlayer);
void OnEnterWorld(Player * pPlayer);
void OnGuildCreate(Player * pLeader, Guild * pGuild);
void OnGuildJoin(Player * pPlayer, Guild * pGuild);
void OnDeath(Player * pPlayer);
bool OnRepop(Player * pPlayer);
void OnEmote(Player * pPlayer, uint32 Emote);
void OnEnterCombat(Player * pPlayer, Unit * pTarget);
bool OnCastSpell(Player * pPlayer, SpellEntry * pSpell);
bool OnLogoutRequest(Player * pPlayer);
void OnQuestAccept(Player * pPlayer, Quest * pQuest);
void OnZone(Player * pPlayer, uint32 Zone);
void OnChat(Player * pPlayer, uint32 Type, uint32 Lang, const char * Message, const char * Misc);
void OnLoot(Player * pPlayer, Unit * pTarget, uint32 Money, uint32 ItemId);
void OnEnterWorld2(Player * pPlayer);
};
#define sScriptMgr ScriptMgr::getSingleton()
#define sHookInterface HookInterface::getSingleton()
#endif