Added scaffoldings

master
MyTrooName 2013-05-02 14:51:12 +06:00 committed by Kotolegokot
parent 9b7719a3dd
commit 98577f8931
13 changed files with 199 additions and 3 deletions

View File

@ -4,7 +4,7 @@ function minetest.register_node(name, nodedef)
nodedef.cause_drop = function(pos, node)
local b_pos = {x=pos.x,y=pos.y-1,z=pos.z}
local b_node = minetest.env:get_node(b_pos)
if minetest.registered_nodes[b_node.name].walkable == false or
if minetest.registered_nodes[b_node.name].falling_node_walkable == false or
minetest.registered_nodes[b_node.name].buildable_to then
return true
end
@ -14,15 +14,105 @@ function minetest.register_node(name, nodedef)
nodedef.cause_fall = function(pos, node)
local b_pos = {x=pos.x,y=pos.y-1,z=pos.z}
local b_node = minetest.env:get_node(b_pos)
if minetest.registered_nodes[b_node.name].walkable == false or
if minetest.registered_nodes[b_node.name].falling_node_walkable == false or
minetest.registered_nodes[b_node.name].buildable_to then
return true
end
end
end
if nodedef.falling_node_walkable == nil then
nodedef.falling_node_walkable = true
end
minetest.register_item(name, nodedef)
end
minetest.register_entity(":__builtin: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)
-- Note: walkable is in the node definition, not in item groups
if minetest.registered_nodes[bcn.name] and
minetest.registered_nodes[bcn.name].falling_node_walkable then
if minetest.registered_nodes[bcn.name].buildable_to then
minetest.env:remove_node(bcp)
return
end
local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
-- Check what's here
local n2 = minetest.env:get_node(np)
-- If it's not air or liquid, remove node and replace it with
-- it's drops
if n2.name ~= "air" and (not minetest.registered_nodes[n2.name] or
minetest.registered_nodes[n2.name].liquidtype == "none") then
local drops = minetest.get_node_drops(n2.name, "")
minetest.env:remove_node(np)
-- Add dropped items
local _, dropped_item
for _, dropped_item in ipairs(drops) do
minetest.env:add_item(np, dropped_item)
end
-- Run script hook
local _, callback
for _, callback in ipairs(minetest.registered_on_dignodes) do
callback(np, n2, nil)
end
end
-- Create node and remove entity
minetest.env:add_node(np, {name=self.nodename})
self.object:remove()
nodeupdate(np)
else
-- Do nothing
end
end
})
function nodeupdate_single(p)
n = minetest.env:get_node(p)
if minetest.get_node_group(n.name, "falling_node") ~= 0 then

View File

@ -15,6 +15,18 @@ function table:get_index(value)
end
end
function copy_table(t)
local u = { }
for k, v in pairs(t) do
u[k] = v
end
return setmetatable(u, getmetatable(t))
end
function mod_pos(p, dx, dy, dz)
return { x = p.x + dx, y = p.y + dy, z = p.z + dz }
end
function hacky_swap_node(pos,name)
local node = minetest.env:get_node(pos)
local meta = minetest.env:get_meta(pos)

View File

@ -78,7 +78,7 @@ for j, tree_name in ipairs(realtest.registered_trees_list) do
drawtype = "nodebox",
tile_images = {tree.textures.planks},
paramtype = "light",
groups = {snappy=2,coppy=2,oddly_breakable_by_hand=2,drop_on_dig=1,fence=1,material=j},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,drop_on_dig=1,fence=1,material=j},
sunlight_propagates = true,
node_box = {
type = "fixed",

View File

@ -0,0 +1,3 @@
default
trees

88
mods/scaffolding/init.lua Normal file
View File

@ -0,0 +1,88 @@
-- Event handlers
local function scaffolding_update(pos)
local node_name = minetest.env:get_node(pos).name
if minetest.get_node_group(node_name, "scaffolding") ~= 1 then
return
end
local material = realtest.registered_trees_list[minetest.get_node_group(node_name, "material")]:remove_modname_prefix()
if minetest.get_node_group(minetest.env:get_node(mod_pos(pos, 0, 1, 0)).name, "scaffolding") == 1 then
minetest.env:add_node(pos, {name = "scaffolding:scaffolding_sub_"..material})
else
minetest.env:add_node(pos, {name = "scaffolding:scaffolding_top_"..material})
end
end
local function scaffolding_construct(pos)
scaffolding_update(pos)
scaffolding_update(mod_pos(pos, 0, -1, 0))
end
local function scaffolding_destruct(pos)
return
scaffolding_update(mod_pos(pos, 0, -1, 0))
end
-- Register scaffolding nodes and crafts
for i, tree_name in ipairs(realtest.registered_trees_list) do
local tree = realtest.registered_trees[tree_name]
local texture_plank = "trees_"..tree.name:remove_modname_prefix().."_planks.png"
local texture_top = texture_plank.."^scaffolding_wooden_top.png"
local texture_side = "scaffolding_wooden_side.png"
local texture_bottom = texture_top.."^scaffolding_wooden_bottom.png"
local scaffolding = {
description = tree.description.." Scaffolding",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
-- side crosses
{-0.5, -0.5, -0.5, -0.45, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.45},
{0.45, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0.45, 0.5, 0.5, 0.5},
-- top plank
{-0.5, 0.4, -0.5, 0.5, 0.5, 0.5},
},
},
tiles = {texture_top, texture_bottom, texture_side, texture_side, texture_side, texture_side},
drop = "scaffolding:scaffolding_"..tree.name:remove_modname_prefix(),
paramtype = "light",
sunlight_propagates = false,
groups = {dig_immediate=3, material=i, dropping_node = 1, scaffolding=1},
sounds = default.node_sound_wood_defaults(),
on_construct = scaffolding_construct,
climbable = true,
walkable = false,
cause_drop = function(pos, node)
local b_pos = {x=pos.x,y=pos.y-1,z=pos.z}
local b_node = minetest.env:get_node(b_pos)
if minetest.get_node_group(b_node.name, "scaffolding") ~= 1 and minetest.registered_nodes[b_node.name].walkable == false then
return true
end
end
}
local scaffolding_top = copy_table(scaffolding)
scaffolding_top.on_construct = nil
scaffolding_top.after_destruct = scaffolding_destruct
local scaffolding_sub = copy_table(scaffolding_top)
scaffolding_sub.tiles = {texture_side, texture_side, texture_side, texture_side, texture_side, texture_side}
scaffolding_sub.sunlight_propagates = true
minetest.register_node("scaffolding:scaffolding_"..tree.name:remove_modname_prefix(), scaffolding)
minetest.register_node("scaffolding:scaffolding_top_"..tree.name:remove_modname_prefix(), scaffolding_top)
minetest.register_node("scaffolding:scaffolding_sub_"..tree.name:remove_modname_prefix(), scaffolding_sub)
minetest.register_craft({
output = "scaffolding:scaffolding_"..tree.name:remove_modname_prefix().." 3",
recipe = {
{tree.name.."_plank",tree.name.."_plank",tree.name.."_plank"},
{"","group:stick",""},
{"group:stick","","group:stick"}
}
})
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

View File

@ -183,6 +183,7 @@ function realtest.register_tree(name, TreeDef)
},
sounds = default.node_sound_leaves_defaults(),
walkable = false,
falling_node_walkable = false,
climbable = true,
})
@ -212,6 +213,7 @@ function realtest.register_tree(name, TreeDef)
},
sounds = default.node_sound_leaves_defaults(),
walkable = false,
falling_node_walkable = false,
climbable = true,
})
end
@ -238,6 +240,7 @@ function realtest.register_tree(name, TreeDef)
},
sounds = default.node_sound_leaves_defaults(),
walkable = false,
falling_node_walkable = false,
climbable = true,
})
end