Eluna improve object variable extension

This commit is contained in:
Rochet2
2014-07-11 00:20:25 +03:00
parent dc8afa45b2
commit 1447e0da57
6 changed files with 138 additions and 70 deletions

View File

@@ -1272,20 +1272,18 @@ void Eluna::OnUpdate(Map* map, uint32 diff)
EVENT_EXECUTE(0); EVENT_EXECUTE(0);
ENDCALL(); ENDCALL();
} }
void Eluna::OnRemove(Map* map, Creature* creature) void Eluna::OnRemove(GameObject* gameobject)
{ {
EVENT_BEGIN(ServerEventBindings, MAP_EVENT_ON_REMOVE_CREATURE, return); EVENT_BEGIN(ServerEventBindings, WORLD_EVENT_ON_DELETE_GAMEOBJECT, return);
Push(L, map); Push(L, gameobject);
Push(L, creature); EVENT_EXECUTE(0);
ENTRY_EXECUTE(0);
ENDCALL(); ENDCALL();
} }
void Eluna::OnRemove(Map* map, GameObject* gameobject) void Eluna::OnRemove(Creature* creature)
{ {
EVENT_BEGIN(ServerEventBindings, MAP_EVENT_ON_REMOVE_GAMEOBJECT, return); EVENT_BEGIN(ServerEventBindings, WORLD_EVENT_ON_DELETE_CREATURE, return);
Push(L, map); Push(L, creature);
Push(L, gameobject); EVENT_EXECUTE(0);
ENTRY_EXECUTE(0);
ENDCALL(); ENDCALL();
} }
@@ -1392,6 +1390,22 @@ void Eluna::OnSummoned(Creature* pCreature, Unit* pSummoner)
ENDCALL(); ENDCALL();
} }
void Eluna::OnAddToWorld(Creature* creature)
{
ENTRY_BEGIN(CreatureEventBindings, creature->GetEntry(), CREATURE_EVENT_ON_ADD, return);
Push(L, creature);
ENTRY_EXECUTE(0);
ENDCALL();
}
void Eluna::OnRemoveFromWorld(Creature* creature)
{
ENTRY_BEGIN(CreatureEventBindings, creature->GetEntry(), CREATURE_EVENT_ON_REMOVE, return);
Push(L, creature);
ENTRY_EXECUTE(0);
ENDCALL();
}
struct ElunaCreatureAI : ScriptedAI struct ElunaCreatureAI : ScriptedAI
{ {
#ifndef TRINITY #ifndef TRINITY
@@ -1845,6 +1859,22 @@ void Eluna::OnSpawn(GameObject* gameobject)
ENDCALL(); ENDCALL();
} }
void Eluna::OnAddToWorld(GameObject* gameobject)
{
ENTRY_BEGIN(GameObjectEventBindings, gameobject->GetEntry(), GAMEOBJECT_EVENT_ON_ADD, return);
Push(L, gameobject);
ENTRY_EXECUTE(0);
ENDCALL();
}
void Eluna::OnRemoveFromWorld(GameObject* gameobject)
{
ENTRY_BEGIN(GameObjectEventBindings, gameobject->GetEntry(), GAMEOBJECT_EVENT_ON_REMOVE, return);
Push(L, gameobject);
ENTRY_EXECUTE(0);
ENDCALL();
}
CreatureAI* Eluna::GetAI(Creature* creature) CreatureAI* Eluna::GetAI(Creature* creature)
{ {
if (!CreatureEventBindings->GetBindMap(creature->GetEntry())) if (!CreatureEventBindings->GetBindMap(creature->GetEntry()))

View File

@@ -85,9 +85,9 @@ namespace HookMgr
// AddOns // AddOns
ADDON_EVENT_ON_MESSAGE = 30, // (event, sender, type, prefix, msg, target) - target can be nil/whisper_target/guild/group/channel ADDON_EVENT_ON_MESSAGE = 30, // (event, sender, type, prefix, msg, target) - target can be nil/whisper_target/guild/group/channel
MAP_EVENT_ON_REMOVE_CREATURE = 31, // (event, map, creature) WORLD_EVENT_ON_DELETE_CREATURE = 31, // (event, creature)
MAP_EVENT_ON_REMOVE_GAMEOBJECT = 32, // (event, map, gameobject) WORLD_EVENT_ON_DELETE_GAMEOBJECT = 32, // (event, gameobject)
SERVER_EVENT_COUNT SERVER_EVENT_COUNT
}; };
@@ -227,6 +227,8 @@ namespace HookMgr
CREATURE_EVENT_ON_QUEST_COMPLETE = 33, // (event, player, creature, quest) CREATURE_EVENT_ON_QUEST_COMPLETE = 33, // (event, player, creature, quest)
CREATURE_EVENT_ON_QUEST_REWARD = 34, // (event, player, creature, quest, opt) CREATURE_EVENT_ON_QUEST_REWARD = 34, // (event, player, creature, quest, opt)
CREATURE_EVENT_ON_DIALOG_STATUS = 35, // (event, player, creature) CREATURE_EVENT_ON_DIALOG_STATUS = 35, // (event, player, creature)
CREATURE_EVENT_ON_ADD = 36, // (event, creature)
CREATURE_EVENT_ON_REMOVE = 37, // (event, creature)
CREATURE_EVENT_COUNT CREATURE_EVENT_COUNT
}; };
@@ -244,6 +246,8 @@ namespace HookMgr
GAMEOBJECT_EVENT_ON_LOOT_STATE_CHANGE = 9, // (event, go, state) GAMEOBJECT_EVENT_ON_LOOT_STATE_CHANGE = 9, // (event, go, state)
GAMEOBJECT_EVENT_ON_GO_STATE_CHANGED = 10, // (event, go, state) GAMEOBJECT_EVENT_ON_GO_STATE_CHANGED = 10, // (event, go, state)
GAMEOBJECT_EVENT_ON_QUEST_COMPLETE = 11, // (event, player, go, quest) GAMEOBJECT_EVENT_ON_QUEST_COMPLETE = 11, // (event, player, go, quest)
GAMEOBJECT_EVENT_ON_ADD = 12, // (event, gameobject)
GAMEOBJECT_EVENT_ON_REMOVE = 13, // (event, gameobject)
GAMEOBJECT_EVENT_COUNT GAMEOBJECT_EVENT_COUNT
}; };

View File

@@ -35,7 +35,7 @@ void Eluna::Initialize()
// GetScripts(lua_folderpath + "/extensions", lua_extensions); // GetScripts(lua_folderpath + "/extensions", lua_extensions);
GetScripts(lua_folderpath, lua_scripts); GetScripts(lua_folderpath, lua_scripts);
ELUNA_LOG_DEBUG("[Eluna]: Loaded %u scripts in %u ms", uint32(lua_scripts.size()), GetTimeDiff(oldMSTime)); ELUNA_LOG_DEBUG("[Eluna]: Loaded %u scripts in %u ms", uint32(lua_scripts.size() + lua_extensions.size()), GetTimeDiff(oldMSTime));
// Create global eluna // Create global eluna
new Eluna(); new Eluna();

View File

@@ -675,8 +675,12 @@ public:
void OnPlayerEnter(Map* map, Player* player); void OnPlayerEnter(Map* map, Player* player);
void OnPlayerLeave(Map* map, Player* player); void OnPlayerLeave(Map* map, Player* player);
void OnUpdate(Map* map, uint32 diff); void OnUpdate(Map* map, uint32 diff);
void OnRemove(Map* map, Creature* creature); void OnAddToWorld(Creature* creature);
void OnRemove(Map* map, GameObject* gameobject); void OnRemoveFromWorld(Creature* creature);
void OnAddToWorld(GameObject* gameobject);
void OnRemoveFromWorld(GameObject* gameobject);
void OnRemove(Creature* creature);
void OnRemove(GameObject* gameobject);
/* World */ /* World */
void OnOpenStateChange(bool open); void OnOpenStateChange(bool open);
@@ -881,10 +885,6 @@ public:
lua_setfield(L, metatable, "__gc"); lua_setfield(L, metatable, "__gc");
} }
// hide metatable
lua_pushvalue(L, methods);
lua_setfield(L, metatable, "__metatable");
// make methods accessible through metatable // make methods accessible through metatable
lua_pushvalue(L, methods); lua_pushvalue(L, methods);
lua_setfield(L, metatable, "__index"); lua_setfield(L, metatable, "__index");

View File

@@ -551,8 +551,13 @@ namespace LuaUnit
Powers PowerSelectorHelper(lua_State* L, Unit* unit, int powerType = -1) Powers PowerSelectorHelper(lua_State* L, Unit* unit, int powerType = -1)
{ {
#if (!defined(TRINITY) && defined(WOTLK))
if (powerType == -1)
return unit->GetPowerType();
#else
if (powerType == -1) if (powerType == -1)
return unit->getPowerType(); return unit->getPowerType();
#endif
if (powerType < 0 || powerType >= int(MAX_POWERS)) if (powerType < 0 || powerType >= int(MAX_POWERS))
luaL_argerror(L, 2, "valid Powers expected"); luaL_argerror(L, 2, "valid Powers expected");
@@ -910,7 +915,11 @@ namespace LuaUnit
uint32 type = Eluna::CHECKVAL<uint32>(L, 2); uint32 type = Eluna::CHECKVAL<uint32>(L, 2);
if (type >= int(MAX_POWERS)) if (type >= int(MAX_POWERS))
return luaL_argerror(L, 2, "valid Powers expected"); return luaL_argerror(L, 2, "valid Powers expected");
#if (!defined(TRINITY) && defined(WOTLK))
unit->SetPowerType((Powers)type);
#else
unit->setPowerType((Powers)type); unit->setPowerType((Powers)type);
#endif
return 0; return 0;
} }

View File

@@ -4,58 +4,83 @@
-- Please see the included DOCS/LICENSE.md for more information -- Please see the included DOCS/LICENSE.md for more information
-- --
--[[ local variableStores = {
Functions: Map = {},
Object:GetData(instance) -- returns a table unique for the object or it's instance Player = {},
Object:RemoveData(instance) -- deletes the unique table for the object or it's instance Creature = {},
GameObject = {},
}
Usage: local function DestroyData(event, obj)
-- Set a variable if (event == 18) then
creature:GetData().escorted = true local mapid = obj:GetMapId()
-- Check a variable local instid = obj:GetInstanceId()
if(creature:GetData().escorted) then if (variableStores.Map[mapid]) then
print(creature:GetName().." has been escorted") variableStores.Map[mapid][instid] = nil
end
-- Remove all variables (on death, logout etc)
creature:RemoveData()
]]
local T = {}
function Object:GetData(instance)
assert(self, "ObjectVariables: self was nil")
if(instance) then
if(not self.GetInstanceId or not self.GetMapId) then
error("instance is true and object is not worldobject", 2)
end
local map = -self:GetMapId()
local ID = self:GetInstanceId()
if(not T[map]) then
T[map] = {}
end
if(not T[map][ID]) then
T[map][ID] = {}
end
return T[map][ID]
else
local ID = self:GetGUID()
if(not T[ID]) then
T[ID] = {}
end
return T[ID]
end
end
function Object:RemoveData(instance)
assert(self, "ObjectVariables: self was nil")
if(instance) then
if(not self.GetInstance or not self.GetMapId) then
error("instance or map is true and object is not worldobject", 2)
end
local map = -self:GetMapId()
local ID = self:GetInstanceId()
if(T[map]) then
T[map][ID] = nil
end end
else else
T[self:GetGUID()] = nil variableStores[obj:GetObjectType()][obj:GetGUIDLow()] = nil
end end
end end
local function GetData(self, field)
local Type = self:GetObjectType()
local varStore = variableStores[Type]
local id
if (Type == "Map") then
local mapid = self:GetMapId()
varStore = varStore[mapid]
if (not varStore) then
return nil
end
id = self:GetInstanceId()
else
id = self:GetGUIDLow()
end
if (not varStore[id]) then
return nil
end
if (field == nil) then
return varStore[id]
else
return varStore[id][field]
end
end
local function SetData(self, field, val)
assert(field ~= nil, "field was nil", 2)
local Type = self:GetObjectType()
local varStore = variableStores[Type]
local id
if (Type == "Map") then
local mapid = self:GetMapId()
if (not varStore[mapid]) then
varStore[mapid] = {}
end
varStore = varStore[mapid]
id = self:GetInstanceId()
else
id = self:GetGUIDLow()
end
if (not varStore[id]) then
varStore[id] = {}
end
varStore[id][field] = val
end
for k,v in pairs(variableStores) do
_G[k].GetData = GetData
_G[k].SetData = SetData
end
RegisterPlayerEvent(4, DestroyData)
RegisterServerEvent(31, DestroyData)
RegisterServerEvent(32, DestroyData)
RegisterServerEvent(18, DestroyData)