/* * 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