make cobwebs sit in corners when so-placed.

Algorithm tries to find an X-/Z+ or X+/Z- corner first (places the
cobweb using the torchlike "on-floor" mode) then an X-/Z- or X+/Z+
corner ("on-ceiling), then opposing X-/X+ walls (nodebox, not rotated),
then opposing Z-/Z+ walls (nodebox, rotated 90 degrees), then falls back
to plantlike (which also happens to fit places where e.g. three walls
come together only 1m apart)

ABM added to convert old ones.

Node name has changed so if you have cobwebs in your inventory, sorry
about that.
This commit is contained in:
Vanessa Ezekowitz 2014-09-04 16:27:05 -04:00
parent 95d852691d
commit 60d34095a5
6 changed files with 120 additions and 20 deletions

118
homedecor/cobweb.lua Normal file
View File

@ -0,0 +1,118 @@
minetest.register_node("homedecor:cobweb_corner", {
description = "Cobweb",
drawtype = "torchlike",
tiles = { "homedecor_cobweb_torchlike.png" },
inventory_image = "homedecor_cobweb_inv.png",
wield_image = "homedecor_cobweb_inv.png",
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
},
visual_scale = 1.4,
groups = { snappy = 3 },
after_place_node = function(pos, placer, itemstack, pointed_thing)
homedecor.rotate_cobweb(pos)
end
})
minetest.register_node("homedecor:cobweb_centered", {
description = "Cobweb",
drawtype = "nodebox",
tiles = { "homedecor_cobweb.png" },
inventory_image = "homedecor_cobweb_inv.png",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
},
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, 0, 0.5, 0.5, 0 }
},
groups = { snappy = 3, not_in_creative_inventory = 1 },
drop = "homedecor:cobweb_corner"
})
minetest.register_node("homedecor:cobweb_plantlike", {
description = "Cobweb",
drawtype = "plantlike",
tiles = { "homedecor_cobweb_plantlike.png" },
inventory_image = "homedecor_cobweb_inv.png",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
},
visual_scale = 1.189,
groups = { snappy = 3, not_in_creative_inventory = 1 },
drop = "homedecor:cobweb_corner"
})
-- helper function to rotate the cobweb after it's placed
function homedecor.rotate_cobweb(pos)
local wall_xm = minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name
local wall_xp = minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name
local wall_zm = minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1}).name
local wall_zp = minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1}).name
local iswall_xm = (wall_xm ~= "air")
local iswall_xp = (wall_xp ~= "air")
local iswall_zm = (wall_zm ~= "air")
local iswall_zp = (wall_zp ~= "air")
print("wall_xm: "..dump(wall_xm))
print("wall_xp: "..dump(wall_xp))
print("wall_zm: "..dump(wall_zm))
print("wall_zp: "..dump(wall_zp))
-- only xm+zp, or only xp+zm means on-floor torchlike
if (iswall_xm and iswall_zp and not iswall_xp and not iswall_zm)
or (iswall_xp and iswall_zm and not iswall_xm and not iswall_zp) then
minetest.set_node(pos, {name = "homedecor:cobweb_corner", param2 = 1})
-- only xm+zm, or only xp+zp means on-ceiling torchlike
elseif (iswall_xm and iswall_zm and not iswall_xp and not iswall_zp)
or (iswall_xp and iswall_zp and not iswall_xm and not iswall_zm) then
minetest.set_node(pos, {name = "homedecor:cobweb_corner", param2 = 0})
-- only xm+xp means nodebox (not rotated, 0 degrees)
elseif iswall_xm and iswall_xp and not iswall_zm and not iswall_zp then
minetest.set_node(pos, {name = "homedecor:cobweb_centered", param2 = 0})
-- only zm+zp means nodebox rotated to 90 degrees
elseif iswall_zm and iswall_zp and not iswall_xm and not iswall_xp then
minetest.set_node(pos, {name = "homedecor:cobweb_centered", param2 = 1})
-- if all else fails, place the plantlike version as a fallback.
else
minetest.set_node(pos, {name = "homedecor:cobweb_plantlike", param2 = 0})
end
end
-- convert existing cobwebs
minetest.register_abm({
nodenames = { "homedecor:cobweb" },
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
homedecor_rotate_cobweb(pos)
end
})

View File

@ -105,6 +105,8 @@ dofile(homedecor.modpath.."/furniture_bathroom.lua")
dofile(homedecor.modpath.."/furniture_recipes.lua")
dofile(homedecor.modpath.."/climate-control.lua")
dofile(homedecor.modpath.."/cobweb.lua")
dofile(homedecor.modpath.."/locked.lua")

View File

@ -893,26 +893,6 @@ minetest.register_node("homedecor:trash_can", {
}
})
minetest.register_node("homedecor:cobweb", {
description = "Cobweb",
drawtype = "plantlike",
tiles = { "homedecor_cobweb.png" },
inventory_image = "homedecor_cobweb_inv.png",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
},
visual_scale = 1.189,
groups = { snappy = 3 },
after_place_node = function(pos, placer, itemstack, pointed_thing)
minetest.add_node(pos, { name = "homedecor:cobweb", param2 = 0 })
end
})
minetest.register_node("homedecor:well_base", {
tiles = {
"homedecor_well_base_top.png",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B