scriptapi: Sort out ServerEnvironment / Environment distinction properly
authorsfan5 <sfan5@live.de>
Fri, 10 Apr 2020 20:06:24 +0000 (22:06 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Sat, 11 Apr 2020 11:12:51 +0000 (13:12 +0200)
The API implementation is shared between CSM and SSM.
Functions should retrieve a plain env when they do not
need any server-specific functions.

src/environment.cpp
src/environment.h
src/script/lua_api/l_env.cpp
src/script/lua_api/l_internal.h
src/script/lua_api/l_object.cpp
src/serverenvironment.cpp
src/serverenvironment.h

index 906f35219b746ffc728bb0a2217d28478712861c..c997be3ff75ed5d6a6254fa8be0554748025163e 100644 (file)
@@ -83,6 +83,24 @@ float Environment::getTimeOfDayF()
        return m_time_of_day_f;
 }
 
+bool Environment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p)
+{
+       // Iterate trough nodes on the line
+       voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS);
+       do {
+               MapNode n = getMap().getNode(iterator.m_current_node_pos);
+
+               // Return non-air
+               if (n.param0 != CONTENT_AIR) {
+                       if (p)
+                               *p = iterator.m_current_node_pos;
+                       return false;
+               }
+               iterator.next();
+       } while (iterator.m_current_index <= iterator.m_last_index);
+       return true;
+}
+
 /*
        Check if a node is pointable
 */
index f568ba2287e42370e988eda05317ef25619bdebc..91c33ba15967b28e66ffb8f0f4205bdb14567936 100644 (file)
@@ -76,6 +76,16 @@ public:
 
        u32 getDayCount();
 
+       /*!
+        * Returns false if the given line intersects with a
+        * non-air node, true otherwise.
+        * \param pos1 start of the line
+        * \param pos2 end of the line
+        * \param p output, position of the first non-air node
+        * the line intersects
+        */
+       bool line_of_sight(v3f pos1, v3f pos2, v3s16 *p = nullptr);
+
        /*!
         * Gets the objects pointed by the shootline as
         * pointed things.
index 3169fa4cfdce1dd2ad642245f8fd3cfd7bb61957..31e582d3d52333a57ed75b88c555d6d64b6bf6e5 100644 (file)
@@ -139,8 +139,7 @@ void LuaLBM::trigger(ServerEnvironment *env, v3s16 p, MapNode n)
 
 int LuaRaycast::l_next(lua_State *L)
 {
-       MAP_LOCK_REQUIRED;
-       GET_ENV_PTR;
+       GET_PLAIN_ENV_PTR;
 
        bool csm = false;
 #ifndef SERVER
@@ -384,7 +383,7 @@ int ModApiEnvMod::l_get_node_or_nil(lua_State *L)
 // timeofday: nil = current time, 0 = night, 0.5 = day
 int ModApiEnvMod::l_get_node_light(lua_State *L)
 {
-       GET_ENV_PTR;
+       GET_PLAIN_ENV_PTR;
 
        // Do it
        v3s16 pos = read_v3s16(L, 1);
@@ -488,10 +487,7 @@ 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)
 {
-       Environment *env = getEnv(L);
-       if (!env) {
-               return 0;
-       }
+       GET_PLAIN_ENV_PTR;
 
        v3s16 pos = read_v3s16(L, 1);
        MapNode n = env->getMap().getNode(pos);
@@ -503,10 +499,7 @@ 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)
 {
-       Environment *env = getEnv(L);
-       if (!env) {
-               return 0;
-       }
+       GET_PLAIN_ENV_PTR;
 
        v3s16 pos = read_v3s16(L, 1);
        MapNode n = env->getMap().getNode(pos);
@@ -551,7 +544,7 @@ int ModApiEnvMod::l_add_node_level(lua_State *L)
 // find_nodes_with_meta(pos1, pos2)
 int ModApiEnvMod::l_find_nodes_with_meta(lua_State *L)
 {
-       GET_ENV_PTR;
+       GET_PLAIN_ENV_PTR;
 
        std::vector<v3s16> positions = env->getMap().findNodesWithMetadata(
                check_v3s16(L, 1), check_v3s16(L, 2));
@@ -728,10 +721,7 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L)
 // get_timeofday() -> 0...1
 int ModApiEnvMod::l_get_timeofday(lua_State *L)
 {
-       Environment *env = getEnv(L);
-       if (!env) {
-               return 0;
-       }
+       GET_PLAIN_ENV_PTR;
 
        // Do it
        int timeofday_mh = env->getTimeOfDay();
@@ -743,10 +733,7 @@ int ModApiEnvMod::l_get_timeofday(lua_State *L)
 // get_day_count() -> int
 int ModApiEnvMod::l_get_day_count(lua_State *L)
 {
-       Environment *env = getEnv(L);
-       if (!env) {
-               return 0;
-       }
+       GET_PLAIN_ENV_PTR;
 
        lua_pushnumber(L, env->getDayCount());
        return 1;
@@ -767,12 +754,9 @@ 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)
 {
-       Environment *env = getEnv(L);
-       if (!env) {
-               return 0;
-       }
+       GET_PLAIN_ENV_PTR;
 
-       const NodeDefManager *ndef = getGameDef(L)->ndef();
+       const NodeDefManager *ndef = env->getGameDef()->ndef();
        v3s16 pos = read_v3s16(L, 1);
        int radius = luaL_checkinteger(L, 2);
        std::vector<content_t> filter;
@@ -815,20 +799,19 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
 int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
 {
-       GET_ENV_PTR;
+       GET_PLAIN_ENV_PTR;
 
        v3s16 minp = read_v3s16(L, 1);
        v3s16 maxp = read_v3s16(L, 2);
        sortBoxVerticies(minp, maxp);
 
+       const NodeDefManager *ndef = env->getGameDef()->ndef();
+
 #ifndef SERVER
-       const NodeDefManager *ndef = getClient(L) ? getClient(L)->ndef() : getServer(L)->ndef();
        if (getClient(L)) {
                minp = getClient(L)->CSMClampPos(minp);
                maxp = getClient(L)->CSMClampPos(maxp);
        }
-#else
-       const NodeDefManager *ndef = getServer(L)->ndef();
 #endif
 
        v3s16 cube = maxp - minp + 1;
@@ -892,20 +875,19 @@ int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L)
         * TODO
         */
 
-       GET_ENV_PTR;
+       GET_PLAIN_ENV_PTR;
 
        v3s16 minp = read_v3s16(L, 1);
        v3s16 maxp = read_v3s16(L, 2);
        sortBoxVerticies(minp, maxp);
 
+       const NodeDefManager *ndef = env->getGameDef()->ndef();
+
 #ifndef SERVER
-       const NodeDefManager *ndef = getClient(L) ? getClient(L)->ndef() : getServer(L)->ndef();
        if (getClient(L)) {
                minp = getClient(L)->CSMClampPos(minp);
                maxp = getClient(L)->CSMClampPos(maxp);
        }
-#else
-       const NodeDefManager *ndef = getServer(L)->ndef();
 #endif
 
        v3s16 cube = maxp - minp + 1;
@@ -1034,7 +1016,7 @@ int ModApiEnvMod::l_clear_objects(lua_State *L)
 // line_of_sight(pos1, pos2) -> true/false, pos
 int ModApiEnvMod::l_line_of_sight(lua_State *L)
 {
-       GET_ENV_PTR;
+       GET_PLAIN_ENV_PTR;
 
        // read position 1 from lua
        v3f pos1 = checkFloatPos(L, 1);
index bbedfe46edde7df7938010ac1bd36bb4a35ffca8..a86eeaf79879fa9f92b0f0a236943072f9905adc 100644 (file)
@@ -32,14 +32,39 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name}
 #define API_FCT(name) registerFunction(L, #name, l_##name, top)
 
-#define MAP_LOCK_REQUIRED
-#define NO_MAP_LOCK_REQUIRED
+// For future use
+#define MAP_LOCK_REQUIRED ((void)0)
+#define NO_MAP_LOCK_REQUIRED ((void)0)
 
+/* In debug mode ensure no code tries to retrieve the server env when it isn't
+ * actually available (in CSM) */
+#if !defined(SERVER) && !defined(NDEBUG)
+#define DEBUG_ASSERT_NO_CLIENTAPI                    \
+       FATAL_ERROR_IF(getClient(L) != nullptr, "Tried " \
+               "to retrieve ServerEnvironment on client")
+#else
+#define DEBUG_ASSERT_NO_CLIENTAPI ((void)0)
+#endif
+
+// Retrieve ServerEnvironment pointer as `env` (no map lock)
 #define GET_ENV_PTR_NO_MAP_LOCK                              \
+       DEBUG_ASSERT_NO_CLIENTAPI;                               \
        ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \
        if (env == NULL)                                         \
                return 0
 
+// Retrieve ServerEnvironment pointer as `env`
 #define GET_ENV_PTR         \
        MAP_LOCK_REQUIRED;      \
        GET_ENV_PTR_NO_MAP_LOCK
+
+// Retrieve Environment pointer as `env` (no map lock)
+#define GET_PLAIN_ENV_PTR_NO_MAP_LOCK            \
+       Environment *env = (Environment *)getEnv(L); \
+       if (env == NULL)                             \
+               return 0
+
+// Retrieve Environment pointer as `env`
+#define GET_PLAIN_ENV_PTR         \
+       MAP_LOCK_REQUIRED;            \
+       GET_PLAIN_ENV_PTR_NO_MAP_LOCK
index 23ed1ffe005f81fed662fe3be849fb937574df89..5cd978d73cbb31417c44dccde1ff7a1c906d1f70 100644 (file)
@@ -533,7 +533,7 @@ int ObjectRef::l_set_local_animation(lua_State *L)
 // get_local_animation(self)
 int ObjectRef::l_get_local_animation(lua_State *L)
 {
-       NO_MAP_LOCK_REQUIRED
+       NO_MAP_LOCK_REQUIRED;
        ObjectRef *ref = checkobject(L, 1);
        RemotePlayer *player = getplayer(ref);
        if (player == NULL)
index 2d3ee078e5617e4bcb46c2809d0362dd58a6d9f0..0ccbd772b7bed978bc94b4de1c1ef43c239a0778 100644 (file)
@@ -545,24 +545,6 @@ bool ServerEnvironment::removePlayerFromDatabase(const std::string &name)
        return m_player_database->removePlayer(name);
 }
 
-bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p)
-{
-       // Iterate trough nodes on the line
-       voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS);
-       do {
-               MapNode n = getMap().getNode(iterator.m_current_node_pos);
-
-               // Return non-air
-               if (n.param0 != CONTENT_AIR) {
-                       if (p)
-                               *p = iterator.m_current_node_pos;
-                       return false;
-               }
-               iterator.next();
-       } while (iterator.m_current_index <= iterator.m_last_index);
-       return true;
-}
-
 void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason,
        const std::string &str_reason, bool reconnect)
 {
index 3c7b7d059577490d6f1be64f2348754bf2b899c5..bf10e3ca864a08e09d6f8ce353bce7ef8c9bf74e 100644 (file)
@@ -334,16 +334,6 @@ public:
        // This makes stuff happen
        void step(f32 dtime);
 
-       /*!
-        * Returns false if the given line intersects with a
-        * non-air node, true otherwise.
-        * \param pos1 start of the line
-        * \param pos2 end of the line
-        * \param p output, position of the first non-air node
-        * the line intersects
-        */
-       bool line_of_sight(v3f pos1, v3f pos2, v3s16 *p = NULL);
-
        u32 getGameTime() const { return m_game_time; }
 
        void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; }