/*
* The Mana Server
* Copyright (C) 2007-2010 The Mana World Development Team
* Copyright (C) 2010 The Mana Developers
*
* This file is part of The Mana Server.
*
* The Mana Server 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
* any later version.
*
* The Mana Server 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 The Mana Server. If not, see .
*/
#include "luautil.h"
#include
#include "game-server/charactercomponent.h"
#include "game-server/itemmanager.h"
#include "game-server/monster.h"
#include "game-server/monstermanager.h"
#include "game-server/npc.h"
#include "utils/logger.h"
#include "scripting/luascript.h"
void raiseWarning(lua_State *, const char *format, ...)
{
va_list args;
va_start(args, format);
char message[1024];
vsprintf(message, format, args);
va_end( args );
LOG_WARN("Lua script error: "<< message);
}
char UserDataCache::mRegistryKey;
bool UserDataCache::retrieve(lua_State *s, void *object)
{
// Retrieve the cache table
lua_pushlightuserdata(s, &mRegistryKey); // key
lua_rawget(s, LUA_REGISTRYINDEX); // Cache?
if (lua_isnil(s, -1))
{
lua_pop(s, 1);
return false;
}
lua_pushlightuserdata(s, object); // Cache, object
lua_rawget(s, -2); // Cache, UD?
if (lua_isnil(s, -1))
{
lua_pop(s, 2); // ...
return false;
}
lua_replace(s, -2); // UD
return true;
}
void UserDataCache::insert(lua_State *s, void *object)
{
// Retrieve the cache table
lua_pushlightuserdata(s, &mRegistryKey); // UD, key
lua_rawget(s, LUA_REGISTRYINDEX); // UD, Cache?
// Create the cache when it doesn't exist yet
if (lua_isnil(s, -1))
{
lua_pop(s, 1); // UD
lua_newtable(s); // UD, Cache
// The metatable that makes the values in the table above weak
lua_newtable(s); // UD, Cache, {}
lua_pushliteral(s, "__mode");
lua_pushliteral(s, "v");
lua_rawset(s, -3); // UD, Cache, { __mode = "v" }
lua_setmetatable(s, -2); // UD, Cache
lua_pushlightuserdata(s, &mRegistryKey);// UD, Cache, key
lua_pushvalue(s, -2); // UD, Cache, key, Cache
lua_rawset(s, LUA_REGISTRYINDEX); // UD, Cache
}
lua_pushlightuserdata(s, object); // UD, Cache, object
lua_pushvalue(s, -3); // UD, Cache, object, UD
lua_rawset(s, -3); // UD, Cache { object = UD }
lua_pop(s, 1); // UD
}
Script *getScript(lua_State *s)
{
lua_pushlightuserdata(s, (void *)&LuaScript::registryKey);
lua_gettable(s, LUA_REGISTRYINDEX);
Script *script = static_cast