Problem with borer tool mod.

Post Reply
User avatar
Andrey01
Member
Posts: 2577
Joined: Wed Oct 19, 2016 15:18
GitHub: Andrey2470T
In-game: Andrey01
Location: Russia, Moscow

Problem with borer tool mod.

by Andrey01 » Post

I am making a mod that adds the tool that will dig blocks depending on parameters (W, H, L) are set in formspec tool. But it appears an error when it is starting to run a loop:

Code: Select all

2018-05-30 17:59:57: ERROR[Main]: ServerError: AsyncErr: ServerThread::run Lua: Runtime error from mod 'extended_borer_tool' in callback item_OnUse(): /home/user/.minetest/mods/extended_borer_tool/init.lua:56: attempt to perform arithmetic on a nil value
2018-05-30 17:59:57: ERROR[Main]: stack traceback:
2018-05-30 17:59:57: ERROR[Main]: 	/home/user/.minetest/mods/extended_borer_tool/init.lua:56: in function </home/user/.minetest/mods/extended_borer_tool/init.lua:50>
Here is my code:

Code: Select all

tool_formspec = "size[6, 5]" ..
        "label[1.5, 0.3;====TUNNEL BORER TOOL====]" ..
        "label[-0.1,1.2;Set Length, Height and Width of space that borer tool must dig through]" ..
        "field[1, 3;1, 1;length_field;Length:;;]" ..
        "field[2.8, 3;1, 1;height_field;Height:;;]" ..
        "field[4.6, 3;1, 1;width_field;Width:;;]" ..
        "button[1, 3.7;4, 1;submit_data;Submit]"
        
fields_parameter = {}
minetest.register_on_player_receive_fields(function(player, formname, fields)
    if formname == "extended_borer_tool:tool_formspec" then
        if fields.name == "submit_data" then
            if fields.length_field == nil then
                fields_parameter["length"] = "3"
            else
                fields_parameter["length"] = fields.length_field
            end
            if fields.height_field == nil then
                fields_parameter["height"] = "3"
            else
                fields_parameter["height"] = fields.height_field
            end
            if fields.width_field == nil then
                fields_parameter["width"] = "3"
            else
                fields_parameter["width"] = fields.width_field
            end
            
        end
    end
end)
minetest.register_tool("extended_borer_tool:borer_tool", {
    description = "Borer tool",
    inventory_image = "borer_tool.png",
    tool_capabilities = {
		full_punch_interval = 0,
        max_drop_level = 0,
        uses = {uses=100, leveldiff=0},
        max_level = 0,
        digging_times = 0,
		groupcaps = {
            cracky = {uses=100, maxlevel=0, times=0}
        }
	},
    on_place = function (itemstack, placer, pointed_thing)
        local playername = placer:get_player_name()
        
        minetest.show_formspec(playername, "extended_borer_tool:tool_formspec", tool_formspec) 
    end,
    on_use = function (itemstack, user, pointed_thing)
        if pointed_thing.type == "node" then
            
            amount_of_rows = 0
            
            local pos = pointed_thing.under
--line:56            for row = 1, tonumber(fields_parameter["length"]) * tonumber(fields_parameter["height"]) do
                for delete_node = 1, tonumber(fields_parameter["width"]) do
                    minetest.set_node({x = pointed_thing.under.x - tonumber(fields_parameter["length"]) / 2, y = pointed_thing.under.y - tonumber(fields_parameter["height"]) / 2, z = pointed_thing.under.z}, {name = "air"})
                    
                    pos.z = pos.z + 1
                end
                amount_of_rows = amount_of_rows + 1
                
                if amount_of_rows > tonumber(fields_parameter["length"]) or amount_of_rows == tonumber(fields_parameter["length"]) then
                    amount_of_rows = 0
                
                else
                    pos.x = pointed_thing.x - tonumber(fields_parameter["length"]) / 2
                    
                    pos.y = pos.y + 1
                    
                end
            end
        end
    end
                --[[if row == 1 then
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y - 1, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y - 1, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y - 1, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 2 then
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y - 1, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y - 1, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y - 1, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 3 then
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y - 1, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y - 1, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y - 1, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 4 then
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y, z = pointed_thing.under.z- 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 5 then
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 6 then
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 7 then
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y + 1, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y + 1, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x - 1, y = pointed_thing.under.y + 1, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 8 then
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y + 1, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y + 1, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x, y = pointed_thing.under.y + 1, z = pointed_thing.under.z + 1}, {name = "air"})
                
                elseif row == 9 then
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y + 1, z = pointed_thing.under.z - 1}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y + 1, z = pointed_thing.under.z}, {name = "air"})
                
                    minetest.set_node({x = pointed_thing.under.x + 1, y = pointed_thing.under.y + 1, z = pointed_thing.under.z + 1}, {name = "air"})
                end
            end
        end
    end]]
})
Or you can download the code:
init.zip
(1.15 KiB) Downloaded 35 times

User avatar
AspireMint
Member
Posts: 415
Joined: Mon Jul 09, 2012 12:59
GitHub: AspireMint
IRC: AspireMint
In-game: AspireMint
Location: Stuck at spawn

Re: Problem with borer tool mod.

by AspireMint » Post

(consider changing button in formspec to button_exit: https://rubenwardy.com/minetest_modding ... specs.html)

fields_parameter["length"] , fields_parameter["width"] and fields_parameter["height"] are nil because of line 12:

Code: Select all

if fields.name == "submit_data" then
always false, remove this condition, you do not need it

In your "for" statement is missing exp3 (increment/decrement value), see this: https://www.lua.org/pil/4.3.4.html
When you use your tool before setting values in formspec, you will get error.
Length, width and height are nil !
Better if you use this:

Code: Select all

minetest.register_on_player_receive_fields(function(player, formname, fields)
    if formname == "extended_borer_tool:tool_formspec" then
      fields_parameter["length"] = fields.length_field
		fields_parameter["height"] = fields.height_field
		fields_parameter["width"] = fields.width_field
    end
end)
and check for nil values

Code: Select all

on_use = function (itemstack, user, pointed_thing)
		fields_parameter["length"] = fields_parameter["length"] or 3
		fields_parameter["height"] = fields_parameter["height"] or 3
		fields_parameter["width"] = fields_parameter["width"] or 3
		
        if pointed_thing.type == "node" then
...
end
Line 55:

Code: Select all

local pos = pointed_thing.under
This is not how you copy values, now you have 2 same objects!
In your "for" loops you do this: pos.z = pos.z + 1 but it also set pointed_thing.under.z value :-P
It should be like this:
local pos = {x = pointed_thing.under.x, y = pointed_thing.under.y, z = pointed_thing.under.z}

Also line 68:

Code: Select all

pos.x = pointed_thing.x - tonumber(fields_parameter["length"]) / 2
Note that first evaluated is: tonumber(fields_parameter["length"]) / 2 ! then pointed_thing.x - ...
Use parentheses:

Code: Select all

pos.x = (pointed_thing.x - tonumber(fields_parameter["length"])) / 2
And pointed_thing.x is nil , https://dev.minetest.net/pointed_thing
use pointed_thing.under.x

But still it doesnt work x)
For simplicity use 3 nested "for" statements (for width, height and length).

Post Reply

Who is online

Users browsing this forum: No registered users and 10 guests