/* * Copyright (C) 2010 - 2016 Eluna Lua Engine * This program is free software licensed under GPL version 3 * Please see the included DOCS/LICENSE.md for more information */ #include "Hooks.h" #include "HookHelpers.h" #include "LuaEngine.h" #include "BindingMap.h" #include "ElunaIncludes.h" #include "ElunaTemplate.h" #include "ElunaInstanceAI.h" using namespace Hooks; #define START_HOOK(EVENT, AI) \ if (!IsEnabled())\ return;\ auto mapKey = EntryKey(EVENT, AI->instance->GetId());\ auto instanceKey = EntryKey(EVENT, AI->instance->GetInstanceId());\ if (!MapEventBindings->HasBindingsFor(mapKey) && !InstanceEventBindings->HasBindingsFor(instanceKey))\ return;\ LOCK_ELUNA;\ PushInstanceData(L, AI);\ Push(AI->instance) #define START_HOOK_WITH_RETVAL(EVENT, AI, RETVAL) \ if (!IsEnabled())\ return RETVAL;\ auto mapKey = EntryKey(EVENT, AI->instance->GetId());\ auto instanceKey = EntryKey(EVENT, AI->instance->GetInstanceId());\ if (!MapEventBindings->HasBindingsFor(mapKey) && !InstanceEventBindings->HasBindingsFor(instanceKey))\ return RETVAL;\ LOCK_ELUNA;\ PushInstanceData(L, AI);\ Push(AI->instance) void Eluna::OnInitialize(ElunaInstanceAI* ai) { START_HOOK(INSTANCE_EVENT_ON_INITIALIZE, ai); CallAllFunctions(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); } void Eluna::OnLoad(ElunaInstanceAI* ai) { START_HOOK(INSTANCE_EVENT_ON_LOAD, ai); CallAllFunctions(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); } void Eluna::OnUpdateInstance(ElunaInstanceAI* ai, uint32 diff) { START_HOOK(INSTANCE_EVENT_ON_UPDATE, ai); Push(diff); CallAllFunctions(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); } void Eluna::OnPlayerEnterInstance(ElunaInstanceAI* ai, Player* player) { START_HOOK(INSTANCE_EVENT_ON_PLAYER_ENTER, ai); Push(player); CallAllFunctions(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); } void Eluna::OnCreatureCreate(ElunaInstanceAI* ai, Creature* creature) { START_HOOK(INSTANCE_EVENT_ON_CREATURE_CREATE, ai); Push(creature); CallAllFunctions(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); } void Eluna::OnGameObjectCreate(ElunaInstanceAI* ai, GameObject* gameobject) { START_HOOK(INSTANCE_EVENT_ON_GAMEOBJECT_CREATE, ai); Push(gameobject); CallAllFunctions(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); } bool Eluna::OnCheckEncounterInProgress(ElunaInstanceAI* ai) { START_HOOK_WITH_RETVAL(INSTANCE_EVENT_ON_CHECK_ENCOUNTER_IN_PROGRESS, ai, false); return CallAllFunctionsBool(MapEventBindings, InstanceEventBindings, mapKey, instanceKey); }