-- File: codersea/seashine.lua -- Purpose: CoderSea lit-stairs and lit-slabs support -- Credits: See "codersea.md" -- Licenses: See "LICENSE" -- =================================================================== -- Notes. -- This code implements lit-stairs and lit-slabs. These are similar to -- stairs and slabs produced by the "stairsshine" mod, but this code -- adds the ability to turn lit-stairs and lit-slabs on and off by -- punching them. -- =================================================================== -- "stair" and "slab" register routines for CoderSea. These are based -- on standard code and "stairsshine". Credits to Kahrl and celeron55. -- Nodes will be called codersea:shine_stair_ -- and shine_stair_SUBNAME_off. -- function codersea.register_shine_stair (subname, recipeitem, groups, images, description, sounds) local params = { description = description, drawtype = "nodebox", tiles = images, paramtype = "light", paramtype2 = "facedir", is_ground_content = true, groups = groups, sounds = sounds, node_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, 0, 0, 0.5, 0.5, 0.5}, }, }, on_place = function (itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then return itemstack end local p0 = pointed_thing.under local p1 = pointed_thing.above local param2 = 0 local placer_pos = placer:getpos() if placer_pos then local dir = { x = p1.x - placer_pos.x, y = p1.y - placer_pos.y, z = p1.z - placer_pos.z } param2 = minetest.dir_to_facedir(dir) end if p0.y-1 == p1.y then param2 = param2 + 20 if param2 == 21 then param2 = 23 elseif param2 == 23 then param2 = 21 end end return minetest.item_place (itemstack, placer, pointed_thing, param2) end, } local params_on = CloneTable (params) params_on.light_source = 14 minetest.register_node (":codersea:shine_stair_" .. subname .. "_off" , params) minetest.register_node (":codersea:shine_stair_" .. subname , params_on) minetest.register_craft ({ output = 'codersea:shine_stair_' .. subname .. ' 4', recipe = { { recipeitem , "" , "" } , { recipeitem , recipeitem , "" } , { recipeitem , recipeitem , recipeitem } , }, }) -- Flipped recipe minetest.register_craft ({ output = 'codersea:shine_stair_' .. subname .. ' 4' , recipe = { { "" , "" , recipeitem } , { "" , recipeitem , recipeitem } , { recipeitem , recipeitem , recipeitem } , }, }) end -- =================================================================== -- Nodes will be called codersea:slab_ function codersea.register_shine_slab (subname, recipeitem, groups, images, description, sounds) local params = { description = description, drawtype = "nodebox", tiles = images, paramtype = "light", paramtype2 = "facedir", is_ground_content = true, groups = groups, sounds = sounds, node_box = { type = "fixed" , fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } , } , on_place = function (itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then return itemstack end -- If it's being placed on an another similar one, replace it with -- a full block local slabpos = nil local slabnode = nil local p0 = pointed_thing.under local p1 = pointed_thing.above local n0 = minetest.get_node (p0) local n1 = minetest.get_node (p1) local param2 = 0 local n0_is_upside_down = StartsWith (n0.name, "codersea:shine_slab") and (n0.param2 >= 20) if StartsWith (n0.name, "codersea:shine_slab") and not n0_is_upside_down and p0.y+1 == p1.y then slabpos = p0 slabnode = n0 elseif StartsWith (n1.name, "codersea:shine_slab") then slabpos = p1 slabnode = n1 end if slabpos then -- Remove the slab at slabpos minetest.remove_node(slabpos) -- Make a fake stack of a single item and try to place it local fakestack = ItemStack(recipeitem) fakestack:set_count(itemstack:get_count()) pointed_thing.above = slabpos local success fakestack, success = minetest.item_place (fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, -- decrement original if success then itemstack:set_count (fakestack:get_count()) -- Else put old node back else minetest.set_node (slabpos, slabnode) end return itemstack end -- Upside down slabs if p0.y-1 == p1.y then -- Turn into full block if pointing at a existing slab if n0_is_upside_down then -- Remove the slab at the position of the slab minetest.remove_node (p0) -- Make a fake stack of a single item and -- try to place it local fakestack = ItemStack (recipeitem) fakestack:set_count (itemstack:get_count()) pointed_thing.above = p0 local success fakestack, success = minetest.item_place (fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, -- decrement original if success then itemstack:set_count (fakestack:get_count()) -- Else put old node back else minetest.set_node (p0, n0) end return itemstack end -- Place upside down slab param2 = 20 end -- If pointing at the side of a upside-down slab if n0_is_upside_down and p0.y+1 ~= p1.y then param2 = 20 end return minetest.item_place (itemstack, placer, pointed_thing, param2) end , } local params_on = CloneTable (params) params_on.light_source = 14 minetest.register_node (":codersea:shine_slab_" .. subname .. "_off", params) minetest.register_node (":codersea:shine_slab_" .. subname, params_on) minetest.register_craft ({ output = 'codersea:shine_slab_' .. subname .. ' 6' , recipe = { { recipeitem , recipeitem , recipeitem} , }, }) end -- =================================================================== -- Nodes will be called codersea:{stair,slab}_ function codersea.register_shine (subname , recipeitem , groups , images , desc_stair , desc_slab , sounds) codersea.register_shine_stair (subname , recipeitem , groups , images , desc_stair , sounds) codersea.register_shine_slab (subname , recipeitem , groups , images , desc_slab , sounds) end -- =================================================================== local on_shine_puncher = function (pos, node, puncher) local oldname = node.name local newname if not StartsWith (oldname, "codersea:shine_") then return end if EndsWith (oldname, "_off") then newname = oldname:gsub ("_off", "") else newname = oldname .. "_off" end minetest.set_node (pos, { name=newname }) nodeupdate (pos) end -- =================================================================== minetest.register_on_punchnode (on_shine_puncher)