overwrite registered nodes

cornernote
Member
 
Posts: 844
Joined: Wed Jul 11, 2012 15:02

overwrite registered nodes

by cornernote » Fri Sep 14, 2012 01:16

removed
Last edited by cornernote on Mon Nov 05, 2012 10:11, edited 1 time in total.
 

User avatar
PilzAdam
Member
 
Posts: 4026
Joined: Fri Jul 20, 2012 16:19
GitHub: PilzAdam
IRC: PilzAdam

by PilzAdam » Fri Sep 14, 2012 12:44

This is a bug that i also recognized: If you set the entity table to minetest.registered_nodes[] you cant change the fields in the table. Here is some (not very good) code to fix it:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
local entity = {}
entity.after_place_node = (...)
for name,value in pairs(minetest.registered_nodes[nodename]) do
    entity[name] = param
end

minetest.register_node(name, entity)
 

cornernote
Member
 
Posts: 844
Joined: Wed Jul 11, 2012 15:02

by cornernote » Sat Sep 15, 2012 02:30

That works, thanks PilzAdam! I wonder why the difference between the for loop, and assigning the whole object.

Just for reference, here is the full working code. entity.after_place_node should be called after the for loop to ensure you overwrite the default param.

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
local entity = {}
for name,value in pairs(minetest.registered_nodes["default:sapling"]) do
    entity[name] = value
end
entity.after_place_node = function(pos) print("TESTING123") end
minetest.register_node(":default:sapling", entity)
 

cornernote
Member
 
Posts: 844
Joined: Wed Jul 11, 2012 15:02

by cornernote » Sat Sep 15, 2012 03:05

Heres a quick function (hack) based on your solution to make main code a little cleaner:

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
minetest.registered = function(case,name)
    local params = {}
    local list
    if case == "item" then list = minetest.registered_items end
    if case == "node" then list = minetest.registered_nodes end
    if case == "craftitem" then list = minetest.registered_craftitems end
    if case == "tool" then list = minetest.registered_tools end
    if case == "entity" then list = minetest.registered_entities end
    if list then
        for k,v in pairs(list[name]) do
            params[k] = v
        end
    end
    return params
end



Then use it like this:

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
local node = minetest.registered("node","default:sapling")
node.after_place_node = function(pos) print("TESTING123") end
minetest.register_node(":default:sapling", node)
Last edited by cornernote on Sat Sep 15, 2012 03:05, edited 1 time in total.
 


Return to Minetest Problems

Who is online

Users browsing this forum: No registered users and 9 guests

cron