From 2302e55dbb4cb3629066ae2619bc3c29d6958430 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 8 Apr 2012 17:49:02 +0300 Subject: [PATCH] Rework falling node code (now based on the falling_node group) --- mods/default/init.lua | 131 +++++++++++++++++++++++++++--------------- 1 file changed, 86 insertions(+), 45 deletions(-) diff --git a/mods/default/init.lua b/mods/default/init.lua index b3679866..e00e2436 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -766,7 +766,7 @@ minetest.register_node("default:sand", { description = "Sand", tile_images = {"default_sand.png"}, is_ground_content = true, - groups = {crumbly=3}, + groups = {crumbly=3, falling_node=1}, sounds = default.node_sound_sand_defaults(), }) @@ -774,7 +774,7 @@ minetest.register_node("default:desert_sand", { description = "Desert sand", tile_images = {"default_desert_sand.png"}, is_ground_content = true, - groups = {sand=1, crumbly=3}, + groups = {sand=1, crumbly=3, falling_node=1}, sounds = default.node_sound_sand_defaults(), }) @@ -782,7 +782,7 @@ minetest.register_node("default:gravel", { description = "Gravel", tile_images = {"default_gravel.png"}, is_ground_content = true, - groups = {crumbly=2}, + groups = {crumbly=2, falling_node=1}, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_gravel_footstep", gain=0.45}, }), @@ -1331,20 +1331,99 @@ minetest.add_to_creative_inventory('default:water_source') minetest.add_to_creative_inventory('default:lava_source') minetest.add_to_creative_inventory('default:ladder') +-- +-- Falling stuff +-- + +minetest.register_entity("default:falling_node", { + initial_properties = { + physical = true, + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + visual = "wielditem", + textures = {}, + visual_size = {x=0.667, y=0.667}, + }, + + nodename = "", + + set_node = function(self, nodename) + self.nodename = nodename + local stack = ItemStack(nodename) + local itemtable = stack:to_table() + local itemname = nil + if itemtable then + itemname = stack:to_table().name + end + local item_texture = nil + local item_type = "" + if minetest.registered_items[itemname] then + item_texture = minetest.registered_items[itemname].inventory_image + item_type = minetest.registered_items[itemname].type + end + prop = { + is_visible = true, + textures = {nodename}, + } + self.object:set_properties(prop) + end, + + get_staticdata = function(self) + return self.nodename + end, + + on_activate = function(self, staticdata) + self.nodename = staticdata + self.object:set_armor_groups({immortal=1}) + --self.object:setacceleration({x=0, y=-10, z=0}) + self:set_node(self.nodename) + end, + + on_step = function(self, dtime) + -- Set gravity + self.object:setacceleration({x=0, y=-10, z=0}) + -- Turn to actual sand when collides to ground or just move + local pos = self.object:getpos() + local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point + local bcn = minetest.env:get_node(bcp) + if bcn.name ~= "air" then + -- Turn to a sand node + local np = {x=bcp.x, y=bcp.y+1, z=bcp.z} + minetest.env:add_node(np, {name=self.nodename}) + self.object:remove() + else + -- Do nothing + end + end +}) + +function default.spawn_falling_node(p, nodename) + obj = minetest.env:add_entity(p, "default:falling_node") + obj:get_luaentity():set_node(nodename) +end + +-- Horrible crap to support old code +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + -- -- Some common functions -- -default.falling_node_names = {} - function nodeupdate_single(p) n = minetest.env:get_node(p) - if default.falling_node_names[n.name] ~= nil then + if minetest.registered_nodes[n.name] and minetest.registered_nodes[n.name].groups.falling_node and minetest.registered_nodes[n.name].groups.falling_node ~= 0 then p_bottom = {x=p.x, y=p.y-1, z=p.z} n_bottom = minetest.env:get_node(p_bottom) if n_bottom.name == "air" then minetest.env:remove_node(p) - minetest.env:add_entity(p, "default:falling_"..n.name) + default.spawn_falling_node(p, n.name) nodeupdate(p) end end @@ -1361,44 +1440,6 @@ function nodeupdate(p) end end --- --- Falling stuff --- - -function default.register_falling_node(nodename, texture) - default.falling_node_names[nodename] = true - -- Override naming conventions for stuff like :default:falling_default:sand - minetest.register_entity(":default:falling_"..nodename, { - -- Static definition - physical = true, - collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual = "cube", - textures = {texture,texture,texture,texture,texture,texture}, - -- State - -- Methods - on_step = function(self, dtime) - -- Set gravity - self.object:setacceleration({x=0, y=-10, z=0}) - -- Turn to actual sand when collides to ground or just move - local pos = self.object:getpos() - local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point - local bcn = minetest.env:get_node(bcp) - if bcn.name ~= "air" then - -- Turn to a sand node - local np = {x=bcp.x, y=bcp.y+1, z=bcp.z} - minetest.env:add_node(np, {name=nodename}) - self.object:remove() - else - -- Do nothing - end - end - }) -end - -default.register_falling_node("default:sand", "default_sand.png") -default.register_falling_node("default:gravel", "default_gravel.png") -default.register_falling_node("default:desert_sand", "default_desert_sand.png") - -- -- Global callbacks --