From 0891975ad6c8d6d3e15b20f33b22cf5baca7eb62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Fri, 17 Mar 2017 07:48:29 +0100 Subject: [PATCH] [CSM] Add core.get_timeofday & core.get_day_count env calls (#5401) * [CSM] Add core.get_timeofday & core.get_day_count env calls * [CSM] Add core.get_node_level, core.get_node_max_level, core.find_node_near --- clientmods/preview/init.lua | 9 +++++++ src/client.cpp | 1 + src/clientenvironment.cpp | 1 + src/environment.cpp | 5 ++-- src/environment.h | 5 +++- src/script/clientscripting.cpp | 2 ++ src/script/cpp_api/s_client.cpp | 5 ++++ src/script/cpp_api/s_client.h | 4 +++ src/script/lua_api/l_env.cpp | 44 +++++++++++++++++++++++++-------- src/script/lua_api/l_env.h | 1 + src/script/lua_api/l_internal.h | 10 -------- src/serverenvironment.cpp | 3 ++- src/serverenvironment.h | 2 +- 13 files changed, 67 insertions(+), 25 deletions(-) diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index bdda7fe4e..3f85d576d 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -64,6 +64,15 @@ core.after(2, function() preview_minimap() modstorage:set_string("current_mod", modname) print(modstorage:get_string("current_mod")) + + print("[PREVIEW] Day count: " .. core.get_day_count() .. + " time of day " .. core.get_timeofday()) + + print("[PREVIEW] Node level: " .. core.get_node_level({x=0, y=20, z=0}) .. + " max level " .. core.get_node_max_level({x=0, y=20, z=0})) + + print("[PREVIEW] Find node near: " .. dump(core.find_node_near({x=0, y=20, z=0}, 10, + {"group:tree", "default:dirt", "default:stone"}))) end) core.register_on_dignode(function(pos, node) diff --git a/src/client.cpp b/src/client.cpp index 2491db704..b355fa617 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -268,6 +268,7 @@ Client::Client( m_modding_enabled = g_settings->getBool("enable_client_modding"); m_script = new ClientScripting(this); m_env.setScript(m_script); + m_script->setEnv(&m_env); } void Client::initMods() diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp index 7a74c897c..29ecd2dfe 100644 --- a/src/clientenvironment.cpp +++ b/src/clientenvironment.cpp @@ -38,6 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc., ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, ITextureSource *texturesource, Client *client, IrrlichtDevice *irr): + Environment(client), m_map(map), m_local_player(NULL), m_smgr(smgr), diff --git a/src/environment.cpp b/src/environment.cpp index 737d93ecd..d1ea5f8bb 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -26,13 +26,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "daynightratio.h" #include "emerge.h" -Environment::Environment(): +Environment::Environment(IGameDef *gamedef): m_time_of_day_speed(0), m_time_of_day(9000), m_time_of_day_f(9000./24000), m_time_conversion_skew(0.0f), m_enable_day_night_ratio_override(false), - m_day_night_ratio_override(0.0f) + m_day_night_ratio_override(0.0f), + m_gamedef(gamedef) { m_cache_enable_shaders = g_settings->getBool("enable_shaders"); m_cache_active_block_mgmt_interval = g_settings->getFloat("active_block_mgmt_interval"); diff --git a/src/environment.h b/src/environment.h index 5154bbdcb..52f369817 100644 --- a/src/environment.h +++ b/src/environment.h @@ -40,13 +40,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "threading/atomic.h" #include "network/networkprotocol.h" // for AccessDeniedCode +class IGameDef; class Map; class Environment { public: // Environment will delete the map passed to the constructor - Environment(); + Environment(IGameDef *gamedef); virtual ~Environment(); /* @@ -77,6 +78,7 @@ public: // counter used internally when triggering ABMs u32 m_added_objects; + IGameDef* getGameDef() { return m_gamedef; } protected: GenericAtomic m_time_of_day_speed; @@ -114,6 +116,7 @@ protected: float m_cache_abm_interval; float m_cache_nodetimer_interval; + IGameDef *m_gamedef; private: Mutex m_time_lock; diff --git a/src/script/clientscripting.cpp b/src/script/clientscripting.cpp index 8bf1b68b1..df30a7253 100644 --- a/src/script/clientscripting.cpp +++ b/src/script/clientscripting.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client.h" #include "cpp_api/s_internal.h" #include "lua_api/l_client.h" +#include "lua_api/l_env.h" #include "lua_api/l_minimap.h" #include "lua_api/l_storage.h" #include "lua_api/l_sound.h" @@ -62,6 +63,7 @@ void ClientScripting::InitializeModApi(lua_State *L, int top) ModApiClient::Initialize(L, top); ModApiSound::Initialize(L, top); ModApiStorage::Initialize(L, top); + ModApiEnvMod::InitializeClient(L, top); LuaItemStack::Register(L); StorageRef::Register(L); diff --git a/src/script/cpp_api/s_client.cpp b/src/script/cpp_api/s_client.cpp index 154dd6194..666fd693d 100644 --- a/src/script/cpp_api/s_client.cpp +++ b/src/script/cpp_api/s_client.cpp @@ -177,3 +177,8 @@ bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node) bool blocked = lua_toboolean(L, -1); return blocked; } + +void ScriptApiClient::setEnv(ClientEnvironment *env) +{ + ScriptApiBase::setEnv(env); +} diff --git a/src/script/cpp_api/s_client.h b/src/script/cpp_api/s_client.h index 93e9558f2..2369efe3e 100644 --- a/src/script/cpp_api/s_client.h +++ b/src/script/cpp_api/s_client.h @@ -29,6 +29,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #endif +class ClientEnvironment; + class ScriptApiClient: virtual public ScriptApiBase { public: @@ -47,5 +49,7 @@ public: bool on_dignode(v3s16 p, MapNode node); bool on_punchnode(v3s16 p, MapNode node); + + void setEnv(ClientEnvironment *env); }; #endif diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 14df558d3..4fad7b37c 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -347,7 +347,10 @@ int ModApiEnvMod::l_punch_node(lua_State *L) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_get_node_max_level(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } v3s16 pos = read_v3s16(L, 1); MapNode n = env->getMap().getNodeNoEx(pos); @@ -359,7 +362,10 @@ int ModApiEnvMod::l_get_node_max_level(lua_State *L) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_get_node_level(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } v3s16 pos = read_v3s16(L, 1); MapNode n = env->getMap().getNodeNoEx(pos); @@ -558,11 +564,14 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L) // get_timeofday() -> 0...1 int ModApiEnvMod::l_get_timeofday(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } // Do it int timeofday_mh = env->getTimeOfDay(); - float timeofday_f = (float)timeofday_mh / 24000.0; + float timeofday_f = (float)timeofday_mh / 24000.0f; lua_pushnumber(L, timeofday_f); return 1; } @@ -570,7 +579,10 @@ int ModApiEnvMod::l_get_timeofday(lua_State *L) // get_day_count() -> int int ModApiEnvMod::l_get_day_count(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } lua_pushnumber(L, env->getDayCount()); return 1; @@ -591,9 +603,12 @@ int ModApiEnvMod::l_get_gametime(lua_State *L) // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" int ModApiEnvMod::l_find_node_near(lua_State *L) { - GET_ENV_PTR; + Environment *env = getEnv(L); + if (!env) { + return 0; + } - INodeDefManager *ndef = getServer(L)->ndef(); + INodeDefManager *ndef = getGameDef(L)->ndef(); v3s16 pos = read_v3s16(L, 1); int radius = luaL_checkinteger(L, 2); std::set filter; @@ -611,13 +626,13 @@ int ModApiEnvMod::l_find_node_near(lua_State *L) ndef->getIds(lua_tostring(L, 3), filter); } - for(int d=1; d<=radius; d++){ + for (int d=1; d<=radius; d++){ std::vector list = FacePositionCache::getFacePositions(d); - for(std::vector::iterator i = list.begin(); + for (std::vector::iterator i = list.begin(); i != list.end(); ++i){ v3s16 p = pos + (*i); content_t c = env->getMap().getNodeNoEx(p).getContent(); - if(filter.count(c) != 0){ + if (filter.count(c) != 0){ push_v3s16(L, p); return 1; } @@ -1087,3 +1102,12 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(forceload_block); API_FCT(forceload_free_block); } + +void ModApiEnvMod::InitializeClient(lua_State *L, int top) +{ + API_FCT(get_timeofday); + API_FCT(get_day_count); + API_FCT(get_node_max_level); + API_FCT(get_node_level); + API_FCT(find_node_near); +} diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 322959411..38b2282d7 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -173,6 +173,7 @@ private: public: static void Initialize(lua_State *L, int top); + static void InitializeClient(lua_State *L, int top); static struct EnumString es_ClearObjectsMode[]; }; diff --git a/src/script/lua_api/l_internal.h b/src/script/lua_api/l_internal.h index c610dc5a3..b7627619e 100644 --- a/src/script/lua_api/l_internal.h +++ b/src/script/lua_api/l_internal.h @@ -37,16 +37,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MAP_LOCK_REQUIRED #define NO_MAP_LOCK_REQUIRED -/* -#if (defined(WIN32) || defined(_WIN32_WCE)) - #define NO_MAP_LOCK_REQUIRED -#else - #include "profiler.h" - #define NO_MAP_LOCK_REQUIRED \ - ScopeProfiler nolocktime(g_profiler,"Scriptapi: unlockable time",SPT_ADD) -#endif -*/ - #define GET_ENV_PTR_NO_MAP_LOCK \ ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \ if (env == NULL) \ diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index ecc7c3150..e09c7da16 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -353,7 +353,8 @@ void ActiveBlockList::update(std::vector &active_positions, ServerEnvironment::ServerEnvironment(ServerMap *map, ServerScripting *scriptIface, Server *server, - const std::string &path_world) : + const std::string &path_world): + Environment(server), m_map(map), m_script(scriptIface), m_server(server), diff --git a/src/serverenvironment.h b/src/serverenvironment.h index b7796b5f1..99110542a 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -320,7 +320,7 @@ public: //check if there's a line of sight between two positions bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL); - u32 getGameTime() { return m_game_time; } + u32 getGameTime() const { return m_game_time; } void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } float getMaxLagEstimate() { return m_max_lag_estimate; }