Set placer to nil instead of a non-functional one in item_OnPlace (#6449)
authorDTA7 <dta7e@t-online.de>
Thu, 21 Sep 2017 19:52:52 +0000 (21:52 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 21 Sep 2017 19:52:52 +0000 (21:52 +0200)
* Set placer to nil instead of a non-functional one

This requires nil checks in core.rotate_node and core.rotate_and_place.

builtin/common/misc_helpers.lua
src/script/cpp_api/s_item.cpp
src/script/lua_api/l_env.cpp

index 31d335fe287cad9c0a9cc434b1febeefb69529e9..d7e0b6ae2197ecc2c2272cc336230cdf53a944db 100644 (file)
@@ -349,7 +349,7 @@ if INIT == "game" then
                                        itemstack, pointed_thing)
                        return
                end
-               local fdir = core.dir_to_facedir(placer:get_look_dir())
+               local fdir = placer and core.dir_to_facedir(placer:get_look_dir()) or 0
                local wield_name = itemstack:get_name()
 
                local above = pointed_thing.above
@@ -369,9 +369,9 @@ if INIT == "game" then
                        iswall = false
                end
 
-               if core.is_protected(pos, placer:get_player_name()) then
-                       core.record_protection_violation(pos,
-                                       placer:get_player_name())
+               local name = placer and placer:get_player_name() or ""
+               if core.is_protected(pos, name) then
+                       core.record_protection_violation(pos, name)
                        return
                end
 
@@ -432,9 +432,11 @@ if INIT == "game" then
        end
 
        core.rotate_node = function(itemstack, placer, pointed_thing)
+               local name = placer and placer:get_player_name() or ""
+               local invert_wall = placer and placer:get_player_control().sneak or false
                core.rotate_and_place(itemstack, placer, pointed_thing,
-                               is_creative(placer:get_player_name()),
-                               {invert_wall = placer:get_player_control().sneak})
+                               is_creative(name),
+                               {invert_wall = invert_wall})
                return itemstack
        end
 end
index d48a3aee99c9c2daef1c6eacead568ebf84b15c8..3876272d7cd5279cee6fd46180468d3fb5be091b 100644 (file)
@@ -69,7 +69,12 @@ bool ScriptApiItem::item_OnPlace(ItemStack &item,
 
        // Call function
        LuaItemStack::create(L, item);
-       objectrefGetOrCreate(L, placer);
+
+       if (!placer)
+               lua_pushnil(L);
+       else
+               objectrefGetOrCreate(L, placer);
+
        pushPointedThing(pointed);
        PCALL_RES(lua_pcall(L, 3, 1, error_handler));
        if (!lua_isnil(L, -1)) {
index f9498a9a734a5222968ee5d261e2540f53f98556..ca8b6bf13711875484676b0b3a4fd4a9bd483950 100644 (file)
@@ -396,9 +396,8 @@ int ModApiEnvMod::l_place_node(lua_State *L)
        pointed.type = POINTEDTHING_NODE;
        pointed.node_abovesurface = pos;
        pointed.node_undersurface = pos + v3s16(0,-1,0);
-       // Place it with a NULL placer (appears in Lua as a non-functional
-       // ObjectRef)
-       bool success = scriptIfaceItem->item_OnPlace(item, NULL, pointed);
+       // Place it with a NULL placer (appears in Lua as nil)
+       bool success = scriptIfaceItem->item_OnPlace(item, nullptr, pointed);
        lua_pushboolean(L, success);
        return 1;
 }