forked from nalc/homedecor_modpack
		
	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.
		
	
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 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
 | |
| })
 |