Flint & steel sounds: Fix bugs caused by nil position
authorparamat <mat.gregory@virginmedia.com>
Fri, 10 Mar 2017 18:43:44 +0000 (18:43 +0000)
committerparamat <mat.gregory@virginmedia.com>
Fri, 10 Mar 2017 19:30:18 +0000 (19:30 +0000)
Usage and tool break sounds were played at 'pointed_thing.above' which
can be nil if not pointing at anything or at an entity. This caused
sounds to be played to all players on a server non-positionally.

Fallback to player pos for sounds if 'pointed_thing.above' is nil.

Replace 'pt' variable with 'pointed_thing' in 'register_tool'.

mods/fire/init.lua

index a6dc1e5c557635109bfbe8b9e73c29bc70382100..a846b2896c731050db371011f21ee29aca9e1c74 100644 (file)
@@ -80,27 +80,27 @@ minetest.register_tool("fire:flint_and_steel", {
        sound = {breaks = "default_tool_breaks"},
 
        on_use = function(itemstack, user, pointed_thing)
-               local pt = pointed_thing
+               local sound_pos = pointed_thing.above or user:get_pos()
                minetest.sound_play(
                        "fire_flint_and_steel",
-                       {pos = pt.above, gain = 0.5, max_hear_distance = 8}
+                       {pos = sound_pos, gain = 0.5, max_hear_distance = 8}
                )
-               if pt.type == "node" then
-                       local node_under = minetest.get_node(pt.under).name
+               if pointed_thing.type == "node" then
+                       local node_under = minetest.get_node(pointed_thing.under).name
                        local nodedef = minetest.registered_nodes[node_under]
                        if not nodedef then
                                return
                        end
                        local player_name = user:get_player_name()
-                       if minetest.is_protected(pt.under, player_name) then
+                       if minetest.is_protected(pointed_thing.under, player_name) then
                                minetest.chat_send_player(player_name, "This area is protected")
                                return
                        end
                        if nodedef.on_ignite then
-                               nodedef.on_ignite(pt.under, user)
+                               nodedef.on_ignite(pointed_thing.under, user)
                        elseif minetest.get_item_group(node_under, "flammable") >= 1
-                                       and minetest.get_node(pt.above).name == "air" then
-                               minetest.set_node(pt.above, {name = "fire:basic_flame"})
+                                       and minetest.get_node(pointed_thing.above).name == "air" then
+                               minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"})
                        end
                end
                if not minetest.setting_getbool("creative_mode") then
@@ -109,7 +109,7 @@ minetest.register_tool("fire:flint_and_steel", {
                        itemstack:add_wear(1000)
                        -- Tool break sound
                        if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
-                               minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5})
+                               minetest.sound_play(wdef.sound.breaks, {pos = sound_pos, gain = 0.5})
                        end
                        return itemstack
                end