--- /dev/null
+-- Minetest: builtin/client/init.lua
+local scriptpath = core.get_builtin_path()..DIR_DELIM
+local clientpath = scriptpath.."client"..DIR_DELIM
+
+dofile(clientpath .. "register.lua")
+
+-- This is an example function to ensure it's working properly, should be removed before merge
+core.register_on_shutdown(function()
+ print("shutdown client")
+end)
+
+-- This is an example function to ensure it's working properly, should be removed before merge
+core.register_on_receiving_chat_messages(function(message)
+ print("Received message " .. message)
+ return false
+end)
+
+-- This is an example function to ensure it's working properly, should be removed before merge
+core.register_on_sending_chat_messages(function(message)
+ print("Sending message " .. message)
+ return false
+end)
--- /dev/null
+
+core.callback_origins = {}
+
+function core.run_callbacks(callbacks, mode, ...)
+ assert(type(callbacks) == "table")
+ local cb_len = #callbacks
+ if cb_len == 0 then
+ if mode == 2 or mode == 3 then
+ return true
+ elseif mode == 4 or mode == 5 then
+ return false
+ end
+ end
+ local ret
+ for i = 1, cb_len do
+ local cb_ret = callbacks[i](...)
+
+ if mode == 0 and i == 1 or mode == 1 and i == cb_len then
+ ret = cb_ret
+ elseif mode == 2 then
+ if not cb_ret or i == 1 then
+ ret = cb_ret
+ end
+ elseif mode == 3 then
+ if cb_ret then
+ return cb_ret
+ end
+ ret = cb_ret
+ elseif mode == 4 then
+ if (cb_ret and not ret) or i == 1 then
+ ret = cb_ret
+ end
+ elseif mode == 5 and cb_ret then
+ return cb_ret
+ end
+ end
+ return ret
+end
+
+--
+-- Callback registration
+--
+
+local function make_registration()
+ local t = {}
+ local registerfunc = function(func)
+ t[#t + 1] = func
+ core.callback_origins[func] = {
+ mod = core.get_current_modname() or "??",
+ name = debug.getinfo(1, "n").name or "??"
+ }
+ --local origin = core.callback_origins[func]
+ --print(origin.name .. ": " .. origin.mod .. " registering cbk " .. tostring(func))
+ end
+ return t, registerfunc
+end
+
+core.registered_on_shutdown, core.register_on_shutdown = make_registration()
+core.registered_on_receiving_chat_messages, core.register_on_receiving_chat_messages = make_registration()
+core.registered_on_sending_chat_messages, core.register_on_sending_chat_messages = make_registration()
+
+
-- Load other files
local scriptdir = core.get_builtin_path() .. DIR_DELIM
local gamepath = scriptdir .. "game" .. DIR_DELIM
+local clientpath = scriptdir .. "client" .. DIR_DELIM
local commonpath = scriptdir .. "common" .. DIR_DELIM
local asyncpath = scriptdir .. "async" .. DIR_DELIM
end
elseif INIT == "async" then
dofile(asyncpath .. "init.lua")
+elseif INIT == "client" then
+ dofile(clientpath .. "init.lua")
else
error(("Unrecognized builtin initialization type %s!"):format(tostring(INIT)))
end
#include "client.h"
#include "network/clientopcodes.h"
#include "filesys.h"
-#include "porting.h"
#include "mapblock_mesh.h"
#include "mapblock.h"
#include "minimap.h"
-#include "settings.h"
+#include "mods.h"
#include "profiler.h"
#include "gettext.h"
-#include "log.h"
-#include "nodemetadata.h"
-#include "itemdef.h"
-#include "shader.h"
#include "clientmap.h"
#include "clientmedia.h"
-#include "sound.h"
-#include "IMeshCache.h"
-#include "config.h"
#include "version.h"
#include "drawscene.h"
#include "database-sqlite3.h"
#include "serialization.h"
#include "guiscalingfilter.h"
-#include "raycast.h"
+#include "script/clientscripting.h"
extern gui::IGUIEnvironment* guienv;
m_cache_use_tangent_vertices = m_cache_enable_shaders && (
g_settings->getBool("enable_bumpmapping") ||
g_settings->getBool("enable_parallax_occlusion"));
+
+ m_script = new ClientScripting(this);
+}
+
+void Client::initMods()
+{
+ std::string script_path = getBuiltinLuaPath() + DIR_DELIM "init.lua";
+
+ m_script->loadMod(script_path, BUILTIN_MOD_NAME);
+}
+
+const std::string Client::getBuiltinLuaPath()
+{
+ return porting::path_share + DIR_DELIM + "builtin";
+}
+
+const std::vector<ModSpec>& Client::getMods() const
+{
+ static std::vector<ModSpec> client_modspec_temp;
+ return client_modspec_temp;
+}
+
+const ModSpec* Client::getModSpec(const std::string &modname) const
+{
+ return NULL;
}
void Client::Stop()
{
+ m_script->on_shutdown();
//request all client managed threads to stop
m_mesh_update_thread.stop();
// Save local server map
infostream << "Local map saving ended." << std::endl;
m_localdb->endSave();
}
+
+ delete m_script;
}
bool Client::isShutdown()
if(message == L"")
return;
+ // If message was ate by script API, don't send it to server
+ if (m_script->on_sending_message(wide_to_utf8(message))) {
+ return;
+ }
+
// Send to others
sendChatMessage(message);
std::map<u16, u16> m_packets;
};
+class ClientScripting;
+
class Client : public con::PeerHandler, public InventoryManager, public IGameDef
{
public:
~Client();
+ void initMods();
+
/*
request all threads managed by client to be stopped
*/
ClientEnvironment& getEnv() { return m_env; }
ITextureSource *tsrc() { return getTextureSource(); }
ISoundManager *sound() { return getSoundManager(); }
+ static const std::string getBuiltinLuaPath();
+
+ virtual const std::vector<ModSpec> &getMods() const;
+ virtual const ModSpec* getModSpec(const std::string &modname) const;
// Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent)
void removeNode(v3s16 p);
bool m_cache_enable_shaders;
bool m_cache_use_tangent_vertices;
+ ClientScripting *m_script;
+
DISABLE_CLASS_COPY(Client);
};
#include "settings.h"
#include "mapblock.h" // For getNodeBlockPos
#include "map.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "log.h"
void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef) {
#include "nodedef.h"
#include "remoteplayer.h"
#include "server.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "genericobject.h"
std::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
#include "mg_schematic.h"
#include "nodedef.h"
#include "profiler.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "server.h"
#include "serverobject.h"
#include "settings.h"
#include "environment.h"
#include "collision.h"
#include "serverobject.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "server.h"
#include "daynightratio.h"
#include "emerge.h"
fps_control.last_time = device->getTimer()->getTime();
+ client->initMods();
+
while (device->run()) {
limitFps(&fps_control, &dtime);
class ISceneManager;
}}
+struct ModSpec;
/*
An interface for fetching game-global definitions like tool and
mapnode properties
ICraftDefManager *cdef() { return getCraftDefManager(); }
MtEventManager *event() { return getEventManager(); }
- IRollbackManager *rollback() { return getRollbackManager();}
+ IRollbackManager *rollback() { return getRollbackManager(); }
+
+ virtual const std::vector<ModSpec> &getMods() const = 0;
+ virtual const ModSpec* getModSpec(const std::string &modname) const = 0;
+ virtual std::string getWorldPath() const { return ""; }
};
#endif
#include "filesys.h"
#include "gettime.h"
#include "gettext.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "porting.h"
#include "settings.h"
#include "client.h"
#include "inventorymanager.h"
#include "log.h"
#include "serverenvironment.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "serverobject.h"
#include "settings.h"
#include "craftdef.h"
#include "server.h"
#include "util/strfnd.h"
#include "network/clientopcodes.h"
+#include "script/clientscripting.h"
#include "util/serialize.h"
#include "util/srp.h"
#include "tileanimation.h"
message += (wchar_t)read_wchar;
}
- m_chat_queue.push(message);
+ // If chat message not consummed by client lua API
+ if (!m_script->on_receiving_message(wide_to_utf8(message))) {
+ m_chat_queue.push(message);
+ }
}
void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
#include "nodedef.h"
#include "player.h"
#include "rollback_interface.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "settings.h"
#include "tool.h"
#include "version.h"
add_subdirectory(lua_api)
# Used by server and client
-set(common_SCRIPT_SRCS
- ${CMAKE_CURRENT_SOURCE_DIR}/scripting_game.cpp
+set(common_SCRIPT_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/serverscripting.cpp
${common_SCRIPT_COMMON_SRCS}
${common_SCRIPT_CPP_API_SRCS}
${common_SCRIPT_LUA_API_SRCS}
PARENT_SCOPE)
# Used by client only
-set(client_SCRIPT_SRCS
+set(client_SCRIPT_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/scripting_mainmenu.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/clientscripting.cpp
${client_SCRIPT_COMMON_SRCS}
${client_SCRIPT_CPP_API_SRCS}
${client_SCRIPT_LUA_API_SRCS}
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "clientscripting.h"
+#include "client.h"
+#include "cpp_api/s_internal.h"
+#include "lua_api/l_client.h"
+#include "lua_api/l_util.h"
+
+ClientScripting::ClientScripting(Client *client):
+ ScriptApiBase()
+{
+ setGameDef(client);
+
+ SCRIPTAPI_PRECHECKHEADER
+
+ // Security is mandatory client side
+ initializeSecurity();
+
+ lua_getglobal(L, "core");
+ int top = lua_gettop(L);
+
+ InitializeModApi(L, top);
+ lua_pop(L, 1);
+
+ // Push builtin initialization type
+ lua_pushstring(L, "client");
+ lua_setglobal(L, "INIT");
+
+ infostream << "SCRIPTAPI: Initialized client game modules" << std::endl;
+}
+
+void ClientScripting::InitializeModApi(lua_State *L, int top)
+{
+ ModApiUtil::Initialize(L, top);
+ ModApiClient::Initialize(L, top);
+}
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef CLIENT_SCRIPTING_H_
+#define CLIENT_SCRIPTING_H_
+
+#include "cpp_api/s_base.h"
+#include "cpp_api/s_client.h"
+#include "cpp_api/s_security.h"
+
+class Client;
+class ClientScripting:
+ virtual public ScriptApiBase,
+ public ScriptApiSecurity,
+ public ScriptApiClient
+{
+public:
+ ClientScripting(Client *client);
+
+private:
+ virtual void InitializeModApi(lua_State *L, int top);
+};
+#endif
PARENT_SCOPE)
set(client_SCRIPT_CPP_API_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/s_client.cpp
${CMAKE_CURRENT_SOURCE_DIR}/s_mainmenu.cpp
PARENT_SCOPE)
#include "lua_api/l_object.h"
#include "common/c_converter.h"
#include "serverobject.h"
-#include "debug.h"
#include "filesys.h"
-#include "log.h"
#include "mods.h"
#include "porting.h"
#include "util/string.h"
+#include "server.h"
+#ifndef SERVER
+#include "client.h"
+#endif
extern "C" {
*/
ScriptApiBase::ScriptApiBase() :
- m_luastackmutex()
+ m_luastackmutex(),
+ m_gamedef(NULL)
{
#ifdef SCRIPTAPI_LOCK_DEBUG
m_lock_recursion_count = 0;
// Default to false otherwise
m_secure = false;
- m_server = NULL;
m_environment = NULL;
m_guiengine = NULL;
}
lua_remove(L, -2); // object_refs
lua_remove(L, -2); // core
}
+
+Server* ScriptApiBase::getServer()
+{
+ return dynamic_cast<Server *>(m_gamedef);
+}
+#ifndef SERVER
+Client* ScriptApiBase::getClient()
+{
+ return dynamic_cast<Client *>(m_gamedef);
+}
+#endif
setOriginFromTableRaw(index, __FUNCTION__)
class Server;
+#ifndef SERVER
+class Client;
+#endif
+class IGameDef;
class Environment;
class GUIEngine;
class ServerActiveObject;
void addObjectReference(ServerActiveObject *cobj);
void removeObjectReference(ServerActiveObject *cobj);
- Server* getServer() { return m_server; }
+ IGameDef *getGameDef() { return m_gamedef; }
+ Server* getServer();
+#ifndef SERVER
+ Client* getClient();
+#endif
std::string getOrigin() { return m_last_run_mod; }
void setOriginDirect(const char *origin);
void scriptError(int result, const char *fxn);
void stackDump(std::ostream &o);
- void setServer(Server* server) { m_server = server; }
+ void setGameDef(IGameDef* gamedef) { m_gamedef = gamedef; }
Environment* getEnv() { return m_environment; }
void setEnv(Environment* env) { m_environment = env; }
lua_State* m_luastack;
- Server* m_server;
+ IGameDef* m_gamedef;
Environment* m_environment;
GUIEngine* m_guiengine;
};
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "s_client.h"
+#include "s_internal.h"
+
+void ScriptApiClient::on_shutdown()
+{
+ SCRIPTAPI_PRECHECKHEADER
+
+ // Get registered shutdown hooks
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "registered_on_shutdown");
+ // Call callbacks
+ runCallbacks(0, RUN_CALLBACKS_MODE_FIRST);
+}
+
+bool ScriptApiClient::on_sending_message(const std::string &message)
+{
+ SCRIPTAPI_PRECHECKHEADER
+
+ // Get core.registered_on_chat_messages
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "registered_on_sending_chat_messages");
+ // Call callbacks
+ lua_pushstring(L, message.c_str());
+ runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC);
+ bool ate = lua_toboolean(L, -1);
+ return ate;
+}
+
+bool ScriptApiClient::on_receiving_message(const std::string &message)
+{
+ SCRIPTAPI_PRECHECKHEADER
+
+ // Get core.registered_on_chat_messages
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "registered_on_receiving_chat_messages");
+ // Call callbacks
+ lua_pushstring(L, message.c_str());
+ runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC);
+ bool ate = lua_toboolean(L, -1);
+ return ate;
+}
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef S_CLIENT_H_
+#define S_CLIENT_H_
+
+#include "cpp_api/s_base.h"
+
+class ScriptApiClient: virtual public ScriptApiBase
+{
+public:
+ // Calls on_shutdown handlers
+ void on_shutdown();
+
+ // Chat message handlers
+ bool on_sending_message(const std::string &message);
+ bool on_receiving_message(const std::string &message);
+};
+#endif
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI);
ScriptApiBase *script = (ScriptApiBase *) lua_touserdata(L, -1);
lua_pop(L, 1);
- const Server *server = script->getServer();
-
- if (!server) return false;
+ const IGameDef *gamedef = script->getGameDef();
+ if (!gamedef)
+ return false;
// Get mod name
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
// Allow paths in mod path
// Don't bother if write access isn't important, since it will be handled later
if (write_required || write_allowed != NULL) {
- const ModSpec *mod = server->getModSpec(mod_name);
+ const ModSpec *mod = gamedef->getModSpec(mod_name);
if (mod) {
str = fs::AbsolutePath(mod->path);
if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
// Allow read-only access to all mod directories
if (!write_required) {
- const std::vector<ModSpec> mods = server->getMods();
+ const std::vector<ModSpec> mods = gamedef->getMods();
for (size_t i = 0; i < mods.size(); ++i) {
str = fs::AbsolutePath(mods[i].path);
if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
}
}
- str = fs::AbsolutePath(server->getWorldPath());
+ str = fs::AbsolutePath(gamedef->getWorldPath());
if (!str.empty()) {
// Don't allow access to other paths in the world mod/game path.
// These have to be blocked so you can't override a trusted mod
PARENT_SCOPE)
set(client_SCRIPT_LUA_API_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/l_client.cpp
${CMAKE_CURRENT_SOURCE_DIR}/l_mainmenu.cpp
PARENT_SCOPE)
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "l_client.h"
+#include "l_internal.h"
+
+int ModApiClient::l_get_current_modname(lua_State *L)
+{
+ lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
+ return 1;
+}
+
+void ModApiClient::Initialize(lua_State *L, int top)
+{
+ API_FCT(get_current_modname);
+}
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef L_CLIENT_H_
+#define L_CLIENT_H_
+
+#include "lua_api/l_base.h"
+
+class ModApiClient : public ModApiBase
+{
+private:
+ // get_current_modname()
+ static int l_get_current_modname(lua_State *L);
+
+public:
+ static void Initialize(lua_State *L, int top);
+};
+
+#endif
#include "lua_api/l_vmanip.h"
#include "common/c_converter.h"
#include "common/c_content.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "environment.h"
#include "server.h"
#include "nodedef.h"
void LuaABM::trigger(ServerEnvironment *env, v3s16 p, MapNode n,
u32 active_object_count, u32 active_object_count_wider)
{
- GameScripting *scriptIface = env->getScriptIface();
+ ServerScripting *scriptIface = env->getScriptIface();
scriptIface->realityCheck();
lua_State *L = scriptIface->getStack();
void LuaLBM::trigger(ServerEnvironment *env, v3s16 p, MapNode n)
{
- GameScripting *scriptIface = env->getScriptIface();
+ ServerScripting *scriptIface = env->getScriptIface();
scriptIface->realityCheck();
lua_State *L = scriptIface->getStack();
};
struct ScriptCallbackState {
- GameScripting *script;
+ ServerScripting *script;
int callback_ref;
int args_ref;
unsigned int refcount;
#include "content_sao.h"
#include "server.h"
#include "hud.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
struct EnumString es_HudElementType[] =
{
+++ /dev/null
-/*
-Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) 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 Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#include "scripting_game.h"
-#include "server.h"
-#include "log.h"
-#include "settings.h"
-#include "cpp_api/s_internal.h"
-#include "lua_api/l_areastore.h"
-#include "lua_api/l_base.h"
-#include "lua_api/l_craft.h"
-#include "lua_api/l_env.h"
-#include "lua_api/l_inventory.h"
-#include "lua_api/l_item.h"
-#include "lua_api/l_itemstackmeta.h"
-#include "lua_api/l_mapgen.h"
-#include "lua_api/l_nodemeta.h"
-#include "lua_api/l_nodetimer.h"
-#include "lua_api/l_noise.h"
-#include "lua_api/l_object.h"
-#include "lua_api/l_particles.h"
-#include "lua_api/l_rollback.h"
-#include "lua_api/l_server.h"
-#include "lua_api/l_util.h"
-#include "lua_api/l_vmanip.h"
-#include "lua_api/l_settings.h"
-#include "lua_api/l_http.h"
-#include "lua_api/l_storage.h"
-
-extern "C" {
-#include "lualib.h"
-}
-
-GameScripting::GameScripting(Server* server)
-{
- setServer(server);
-
- // setEnv(env) is called by ScriptApiEnv::initializeEnvironment()
- // once the environment has been created
-
- SCRIPTAPI_PRECHECKHEADER
-
- if (g_settings->getBool("secure.enable_security")) {
- initializeSecurity();
- }
-
- lua_getglobal(L, "core");
- int top = lua_gettop(L);
-
- lua_newtable(L);
- lua_setfield(L, -2, "object_refs");
-
- lua_newtable(L);
- lua_setfield(L, -2, "luaentities");
-
- // Initialize our lua_api modules
- InitializeModApi(L, top);
- lua_pop(L, 1);
-
- // Push builtin initialization type
- lua_pushstring(L, "game");
- lua_setglobal(L, "INIT");
-
- infostream << "SCRIPTAPI: Initialized game modules" << std::endl;
-}
-
-void GameScripting::InitializeModApi(lua_State *L, int top)
-{
- // Initialize mod api modules
- ModApiCraft::Initialize(L, top);
- ModApiEnvMod::Initialize(L, top);
- ModApiInventory::Initialize(L, top);
- ModApiItemMod::Initialize(L, top);
- ModApiMapgen::Initialize(L, top);
- ModApiParticles::Initialize(L, top);
- ModApiRollback::Initialize(L, top);
- ModApiServer::Initialize(L, top);
- ModApiUtil::Initialize(L, top);
- ModApiHttp::Initialize(L, top);
- ModApiStorage::Initialize(L, top);
-
- // Register reference classes (userdata)
- InvRef::Register(L);
- ItemStackMetaRef::Register(L);
- LuaAreaStore::Register(L);
- LuaItemStack::Register(L);
- LuaPerlinNoise::Register(L);
- LuaPerlinNoiseMap::Register(L);
- LuaPseudoRandom::Register(L);
- LuaPcgRandom::Register(L);
- LuaSecureRandom::Register(L);
- LuaVoxelManip::Register(L);
- NodeMetaRef::Register(L);
- NodeTimerRef::Register(L);
- ObjectRef::Register(L);
- LuaSettings::Register(L);
- StorageRef::Register(L);
-}
-
-void log_deprecated(const std::string &message)
-{
- log_deprecated(NULL, message);
-}
+++ /dev/null
-/*
-Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) 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 Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#ifndef SCRIPTING_GAME_H_
-#define SCRIPTING_GAME_H_
-
-#include "cpp_api/s_base.h"
-#include "cpp_api/s_entity.h"
-#include "cpp_api/s_env.h"
-#include "cpp_api/s_inventory.h"
-#include "cpp_api/s_node.h"
-#include "cpp_api/s_player.h"
-#include "cpp_api/s_server.h"
-#include "cpp_api/s_security.h"
-
-/*****************************************************************************/
-/* Scripting <-> Game Interface */
-/*****************************************************************************/
-
-class GameScripting :
- virtual public ScriptApiBase,
- public ScriptApiDetached,
- public ScriptApiEntity,
- public ScriptApiEnv,
- public ScriptApiNode,
- public ScriptApiPlayer,
- public ScriptApiServer,
- public ScriptApiSecurity
-{
-public:
- GameScripting(Server* server);
-
- // use ScriptApiBase::loadMod() to load mods
-
-private:
- void InitializeModApi(lua_State *L, int top);
-};
-
-void log_deprecated(const std::string &message);
-
-#endif /* SCRIPTING_GAME_H_ */
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "serverscripting.h"
+#include "server.h"
+#include "log.h"
+#include "settings.h"
+#include "cpp_api/s_internal.h"
+#include "lua_api/l_areastore.h"
+#include "lua_api/l_base.h"
+#include "lua_api/l_craft.h"
+#include "lua_api/l_env.h"
+#include "lua_api/l_inventory.h"
+#include "lua_api/l_item.h"
+#include "lua_api/l_itemstackmeta.h"
+#include "lua_api/l_mapgen.h"
+#include "lua_api/l_nodemeta.h"
+#include "lua_api/l_nodetimer.h"
+#include "lua_api/l_noise.h"
+#include "lua_api/l_object.h"
+#include "lua_api/l_particles.h"
+#include "lua_api/l_rollback.h"
+#include "lua_api/l_server.h"
+#include "lua_api/l_util.h"
+#include "lua_api/l_vmanip.h"
+#include "lua_api/l_settings.h"
+#include "lua_api/l_http.h"
+#include "lua_api/l_storage.h"
+
+extern "C" {
+#include "lualib.h"
+}
+
+ServerScripting::ServerScripting(Server* server)
+{
+ setGameDef(server);
+
+ // setEnv(env) is called by ScriptApiEnv::initializeEnvironment()
+ // once the environment has been created
+
+ SCRIPTAPI_PRECHECKHEADER
+
+ if (g_settings->getBool("secure.enable_security")) {
+ initializeSecurity();
+ }
+
+ lua_getglobal(L, "core");
+ int top = lua_gettop(L);
+
+ lua_newtable(L);
+ lua_setfield(L, -2, "object_refs");
+
+ lua_newtable(L);
+ lua_setfield(L, -2, "luaentities");
+
+ // Initialize our lua_api modules
+ InitializeModApi(L, top);
+ lua_pop(L, 1);
+
+ // Push builtin initialization type
+ lua_pushstring(L, "game");
+ lua_setglobal(L, "INIT");
+
+ infostream << "SCRIPTAPI: Initialized game modules" << std::endl;
+}
+
+void ServerScripting::InitializeModApi(lua_State *L, int top)
+{
+ // Initialize mod api modules
+ ModApiCraft::Initialize(L, top);
+ ModApiEnvMod::Initialize(L, top);
+ ModApiInventory::Initialize(L, top);
+ ModApiItemMod::Initialize(L, top);
+ ModApiMapgen::Initialize(L, top);
+ ModApiParticles::Initialize(L, top);
+ ModApiRollback::Initialize(L, top);
+ ModApiServer::Initialize(L, top);
+ ModApiUtil::Initialize(L, top);
+ ModApiHttp::Initialize(L, top);
+ ModApiStorage::Initialize(L, top);
+
+ // Register reference classes (userdata)
+ InvRef::Register(L);
+ ItemStackMetaRef::Register(L);
+ LuaAreaStore::Register(L);
+ LuaItemStack::Register(L);
+ LuaPerlinNoise::Register(L);
+ LuaPerlinNoiseMap::Register(L);
+ LuaPseudoRandom::Register(L);
+ LuaPcgRandom::Register(L);
+ LuaSecureRandom::Register(L);
+ LuaVoxelManip::Register(L);
+ NodeMetaRef::Register(L);
+ NodeTimerRef::Register(L);
+ ObjectRef::Register(L);
+ LuaSettings::Register(L);
+ StorageRef::Register(L);
+}
+
+void log_deprecated(const std::string &message)
+{
+ log_deprecated(NULL, message);
+}
--- /dev/null
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef SERVER_SCRIPTING_H_
+#define SERVER_SCRIPTING_H_
+
+#include "cpp_api/s_base.h"
+#include "cpp_api/s_entity.h"
+#include "cpp_api/s_env.h"
+#include "cpp_api/s_inventory.h"
+#include "cpp_api/s_node.h"
+#include "cpp_api/s_player.h"
+#include "cpp_api/s_server.h"
+#include "cpp_api/s_security.h"
+
+/*****************************************************************************/
+/* Scripting <-> Server Game Interface */
+/*****************************************************************************/
+
+class ServerScripting:
+ virtual public ScriptApiBase,
+ public ScriptApiDetached,
+ public ScriptApiEntity,
+ public ScriptApiEnv,
+ public ScriptApiNode,
+ public ScriptApiPlayer,
+ public ScriptApiServer,
+ public ScriptApiSecurity
+{
+public:
+ ServerScripting(Server* server);
+
+ // use ScriptApiBase::loadMod() to load mods
+
+private:
+ void InitializeModApi(lua_State *L, int top);
+};
+
+void log_deprecated(const std::string &message);
+
+#endif /* SCRIPTING_GAME_H_ */
#include "settings.h"
#include "profiler.h"
#include "log.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "nodedef.h"
#include "itemdef.h"
#include "craftdef.h"
// Initialize scripting
infostream<<"Server: Initializing Lua"<<std::endl;
- m_script = new GameScripting(this);
+ m_script = new ServerScripting(this);
std::string script_path = getBuiltinLuaPath() + DIR_DELIM "init.lua";
modlist.push_back(it->name);
}
-std::string Server::getBuiltinLuaPath()
+const std::string Server::getBuiltinLuaPath()
{
return porting::path_share + DIR_DELIM + "builtin";
}
class IRollbackManager;
struct RollbackAction;
class EmergeManager;
-class GameScripting;
+class ServerScripting;
class ServerEnvironment;
struct SimpleSoundSpec;
class ServerThread;
Inventory* createDetachedInventory(const std::string &name, const std::string &player="");
// Envlock and conlock should be locked when using scriptapi
- GameScripting *getScriptIface(){ return m_script; }
+ ServerScripting *getScriptIface(){ return m_script; }
// actions: time-reversed list
// Return value: success/failure
IWritableNodeDefManager* getWritableNodeDefManager();
IWritableCraftDefManager* getWritableCraftDefManager();
- const std::vector<ModSpec> &getMods() const { return m_mods; }
- const ModSpec* getModSpec(const std::string &modname) const;
+ virtual const std::vector<ModSpec> &getMods() const { return m_mods; }
+ virtual const ModSpec* getModSpec(const std::string &modname) const;
void getModNames(std::vector<std::string> &modlist);
std::string getBuiltinLuaPath();
inline const std::string &getWorldPath() const { return m_path_world; }
// Scripting
// Envlock and conlock should be locked when using Lua
- GameScripting *m_script;
+ ServerScripting *m_script;
// Item definition manager
IWritableItemDefManager *m_itemdef;
#include "profiler.h"
#include "raycast.h"
#include "remoteplayer.h"
-#include "scripting_game.h"
+#include "serverscripting.h"
#include "server.h"
#include "voxelalgorithms.h"
#include "util/serialize.h"
*/
ServerEnvironment::ServerEnvironment(ServerMap *map,
- GameScripting *scriptIface, Server *server,
+ ServerScripting *scriptIface, Server *server,
const std::string &path_world) :
m_map(map),
m_script(scriptIface),
class ActiveBlockModifier;
class ServerActiveObject;
class Server;
-class GameScripting;
+class ServerScripting;
/*
{Active, Loading} block modifier interface.
class ServerEnvironment : public Environment
{
public:
- ServerEnvironment(ServerMap *map, GameScripting *scriptIface,
+ ServerEnvironment(ServerMap *map, ServerScripting *scriptIface,
Server *server, const std::string &path_world);
~ServerEnvironment();
ServerMap & getServerMap();
//TODO find way to remove this fct!
- GameScripting* getScriptIface()
+ ServerScripting* getScriptIface()
{ return m_script; }
Server *getGameDef()
// The map
ServerMap *m_map;
// Lua state
- GameScripting* m_script;
+ ServerScripting* m_script;
// Server definition
Server *m_server;
// World path
#include "test.h"
-#include "log.h"
#include "nodedef.h"
#include "itemdef.h"
#include "gamedef.h"
+#include "mods.h"
content_t t_CONTENT_STONE;
content_t t_CONTENT_GRASS;
void defineSomeNodes();
+ virtual const std::vector<ModSpec> &getMods() const
+ {
+ static std::vector<ModSpec> testmodspec;
+ return testmodspec;
+ }
+ virtual const ModSpec* getModSpec(const std::string &modname) const { return NULL; }
+
private:
IItemDefManager *m_itemdef;
INodeDefManager *m_nodedef;