forked from VoxeLibre/VoxeLibre
293 lines
7.6 KiB
Lua
293 lines
7.6 KiB
Lua
local S = minetest.get_translator("mcl_lanterns")
|
|
local modpath = minetest.get_modpath("mcl_lanterns")
|
|
|
|
mcl_lanterns = {}
|
|
|
|
--[[
|
|
TODO:
|
|
- add lantern specific sounds
|
|
- remove the hack arround walmounted nodes
|
|
]]
|
|
|
|
local allowed_non_solid_nodes_floor = {
|
|
"mcl_core:ice",
|
|
"mcl_nether:soul_sand",
|
|
"mcl_mobspawners:spawner",
|
|
"mcl_core:barrier",
|
|
"mcl_end:chorus_flower",
|
|
"mcl_end:chorus_flower_dead",
|
|
"mcl_end:end_rod",
|
|
"mcl_end:dragon_egg",
|
|
"mcl_portals:end_portal_frame_eye",
|
|
"mcl_lanterns:chain"
|
|
}
|
|
-- The function below allows nodes that call it to be included in the 'allowed floor placement' list above. This lets lanterns be placed on top of said nodes. Most useful for modded in nodes.
|
|
function mcl_lanterns.add_allowed_non_solid_nodes_floor (node_name)
|
|
table.insert (allowed_non_solid_nodes_floor, node_name)
|
|
end
|
|
|
|
local allowed_non_solid_groups_floor = {"anvil", "wall", "glass", "fence", "fence_gate", "pane"}
|
|
|
|
local allowed_non_solid_nodes_ceiling = {
|
|
"mcl_core:ice",
|
|
"mcl_nether:soul_sand",
|
|
"mcl_mobspawners:spawner",
|
|
"mcl_core:barrier",
|
|
"mcl_end:chorus_flower",
|
|
"mcl_end:chorus_flower_dead",
|
|
"mcl_end:end_rod",
|
|
"mcl_core:grass_path",
|
|
"mcl_lanterns:chain"
|
|
}
|
|
-- The function below allows nodes that call it to be included in the 'allowed ceiling placement' list above. This lets lanterns be placed below said nodes. Most useful for modded in nodes.
|
|
function mcl_lanterns.add_allowed_non_solid_nodes_ceiling (node_name)
|
|
table.insert (allowed_non_solid_nodes_ceiling, node_name)
|
|
end
|
|
|
|
local allowed_non_solid_groups_ceiling = {"anvil", "wall", "glass", "fence", "fence_gate", "soil", "pane", "end_portal_frame"}
|
|
|
|
local function check_placement(node, wdir)
|
|
local nn = node.name
|
|
local def = minetest.registered_nodes[nn]
|
|
|
|
if not def then
|
|
return false
|
|
else
|
|
--wdir:
|
|
--0: ceiling
|
|
--1: floor
|
|
if wdir == 0 then
|
|
if def.groups.solid or def.groups.opaque then
|
|
return true
|
|
else
|
|
for _,i in ipairs(allowed_non_solid_nodes_ceiling) do
|
|
if nn == i then
|
|
return true
|
|
end
|
|
end
|
|
for _,j in ipairs(allowed_non_solid_groups_ceiling) do
|
|
if def.groups[j] then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
else --assuming wdir == 1
|
|
if def.groups.solid or def.groups.opaque then
|
|
return true
|
|
else
|
|
for _,i in ipairs(allowed_non_solid_nodes_floor) do
|
|
if nn == i then
|
|
return true
|
|
end
|
|
end
|
|
for _,j in ipairs(allowed_non_solid_groups_floor) do
|
|
if def.groups[j] then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mcl_lanterns.register_lantern(name, def)
|
|
local itemstring_floor = "mcl_lanterns:"..name.."_floor"
|
|
local itemstring_ceiling = "mcl_lanterns:"..name.."_ceiling"
|
|
|
|
local sounds = mcl_sounds.node_sound_metal_defaults()
|
|
|
|
minetest.register_node(":"..itemstring_floor, {
|
|
description = def.description,
|
|
_doc_items_longdesc = def.longdesc,
|
|
drawtype = "mesh",
|
|
mesh = "mcl_lanterns_lantern_floor.obj",
|
|
inventory_image = def.texture_inv,
|
|
wield_image = def.texture_inv,
|
|
tiles = {
|
|
{
|
|
name = def.texture,
|
|
animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3}
|
|
}
|
|
},
|
|
use_texture_alpha = "clip",
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
place_param2 = 1,
|
|
node_placement_prediction = "",
|
|
sunlight_propagates = true,
|
|
light_source = def.light_level,
|
|
groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1, dig_by_piston=1},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, -0.5, -0.1875, 0.1875, -0.0625, 0.1875},
|
|
{-0.125, -0.0625, -0.125, 0.125, 0.0625, 0.125},
|
|
{-0.0625, -0.5, -0.0625, 0.0625, 0.1875, 0.0625},
|
|
},
|
|
},
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, -0.5, -0.1875, 0.1875, -0.0625, 0.1875},
|
|
{-0.125, -0.0625, -0.125, 0.125, 0.0625, 0.125},
|
|
{-0.0625, -0.5, -0.0625, 0.0625, 0.1875, 0.0625},
|
|
},
|
|
},
|
|
sounds = sounds,
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
local new_stack = mcl_util.call_on_rightclick(itemstack, placer, pointed_thing)
|
|
if new_stack then
|
|
return new_stack
|
|
end
|
|
|
|
local under = pointed_thing.under
|
|
local above = pointed_thing.above
|
|
local node = minetest.get_node(under)
|
|
|
|
local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above))
|
|
local fakestack = itemstack
|
|
|
|
if check_placement(node, wdir) == false then
|
|
return itemstack
|
|
end
|
|
|
|
if wdir == 0 then
|
|
fakestack:set_name(itemstring_ceiling)
|
|
elseif wdir == 1 then
|
|
fakestack:set_name(itemstring_floor)
|
|
end
|
|
|
|
local success
|
|
itemstack, success = minetest.item_place(fakestack, placer, pointed_thing, wdir)
|
|
itemstack:set_name(itemstring_floor)
|
|
|
|
if success then
|
|
minetest.sound_play(sounds.place, {pos = under, gain = 1}, true)
|
|
end
|
|
|
|
return itemstack
|
|
end,
|
|
on_rotate = false,
|
|
_mcl_hardness = 3.5,
|
|
_mcl_blast_resistance = 3.5,
|
|
})
|
|
|
|
minetest.register_node(":"..itemstring_ceiling, {
|
|
description = def.description,
|
|
_doc_items_create_entry = false,
|
|
drawtype = "mesh",
|
|
mesh = "mcl_lanterns_lantern_ceiling.obj",
|
|
tiles = {
|
|
{
|
|
name = def.texture,
|
|
animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3}
|
|
}
|
|
},
|
|
use_texture_alpha = "clip",
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
place_param2 = 0,
|
|
node_placement_prediction = "",
|
|
sunlight_propagates = true,
|
|
light_source = def.light_level,
|
|
groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1, not_in_creative_inventory = 1},
|
|
drop = itemstring_floor,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, 0, -0.1875, 0.1875, 0.4375, 0.1875},
|
|
{-0.125, -0.125, -0.125, 0.125, 0, 0.125},
|
|
{-0.0625, -0.5, -0.0625, 0.0625, -0.125, 0.0625},
|
|
},
|
|
},
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.1875, 0, -0.1875, 0.1875, 0.4375, 0.1875},
|
|
{-0.125, -0.125, -0.125, 0.125, 0, 0.125},
|
|
{-0.0625, -0.5, -0.0625, 0.0625, -0.125, 0.0625},
|
|
},
|
|
},
|
|
sounds = sounds,
|
|
on_rotate = false,
|
|
_mcl_hardness = 3.5,
|
|
_mcl_blast_resistance = 3.5,
|
|
})
|
|
end
|
|
|
|
minetest.register_node("mcl_lanterns:chain", {
|
|
description = S("Chain"),
|
|
_doc_items_longdesc = S("Chains are metallic decoration blocks."),
|
|
inventory_image = "mcl_lanterns_chain_inv.png",
|
|
tiles = {"mcl_lanterns_chain.png"},
|
|
drawtype = "mesh",
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
use_texture_alpha = "clip",
|
|
mesh = "mcl_lanterns_chain.obj",
|
|
is_ground_content = false,
|
|
sunlight_propagates = true,
|
|
collision_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625},
|
|
}
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625},
|
|
}
|
|
},
|
|
groups = {pickaxey = 1, deco_block = 1},
|
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
|
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:get_pos()
|
|
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 = 20
|
|
elseif p0.x - 1 == p1.x then
|
|
param2 = 16
|
|
elseif p0.x + 1 == p1.x then
|
|
param2 = 12
|
|
elseif p0.z - 1 == p1.z then
|
|
param2 = 8
|
|
elseif p0.z + 1 == p1.z then
|
|
param2 = 4
|
|
end
|
|
|
|
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
|
end,
|
|
_mcl_blast_resistance = 6,
|
|
_mcl_hardness = 5,
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "mcl_lanterns:chain",
|
|
recipe = {
|
|
{"mcl_core:iron_nugget"},
|
|
{"mcl_core:iron_ingot"},
|
|
{"mcl_core:iron_nugget"},
|
|
},
|
|
})
|
|
|
|
dofile(modpath.."/register.lua")
|