339 lines
11 KiB
Lua
339 lines
11 KiB
Lua
local S = minetest.get_translator("rp_default")
|
|
|
|
-- Torches
|
|
|
|
|
|
|
|
local function register_torch(subname, description, tt_help, tiles, overlay_tiles, overlay_side_R90, inv_image, light, on_construct, on_timer, next_torch_level, ignite_pitch)
|
|
local on_ignite, on_ignite_wall
|
|
if next_torch_level then
|
|
on_ignite = function(pos, itemstack, user)
|
|
local node = minetest.get_node(pos)
|
|
minetest.set_node(pos, {name="rp_default:"..next_torch_level, param2=node.param2})
|
|
return {pitch=ignite_pitch or 1.0}
|
|
end
|
|
on_ignite_wall = function(pos, itemstack, user)
|
|
local node = minetest.get_node(pos)
|
|
minetest.set_node(pos, {name="rp_default:"..next_torch_level.."_wall", param2=node.param2})
|
|
return {pitch=ignite_pitch or 1.0}
|
|
end
|
|
end
|
|
minetest.register_node(
|
|
"rp_default:"..subname,
|
|
{
|
|
description = description,
|
|
_tt_help = tt_help,
|
|
drawtype = "nodebox",
|
|
tiles = tiles,
|
|
use_texture_alpha = "clip",
|
|
overlay_tiles = overlay_tiles,
|
|
inventory_image = inv_image,
|
|
wield_image = inv_image,
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
light_source = light,
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
floodable = true,
|
|
on_flood = function(pos, oldnode, newnode)
|
|
if light and light > 0 then
|
|
minetest.sound_play({name="rp_default_torch_burnout", gain=0.1, max_hear_distance = 8}, {pos=pos}, true)
|
|
end
|
|
minetest.add_item(pos, "rp_default:torch_dead")
|
|
end,
|
|
node_placement_prediction = "",
|
|
node_box = {
|
|
type = "wallmounted",
|
|
wall_top = {-2/16, 0, -2/16, 2/16, 0.5, 2/16},
|
|
wall_bottom = {-2/16, -0.5, -2/16, 2/16, 0, 2/16},
|
|
wall_side = {-0.5, -8/16, -2/16, -0.5+4/16, 0, 2/16},
|
|
},
|
|
groups = {choppy = 2, dig_immediate = 3, attached_node = 1, torch = 1, creative_decoblock = 1},
|
|
is_ground_content = false,
|
|
sounds = rp_sounds.node_sound_small_defaults(),
|
|
on_construct = on_construct,
|
|
on_timer = on_timer,
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
if pointed_thing.type ~= "node" then
|
|
return itemstack
|
|
end
|
|
local under = pointed_thing.under
|
|
local above = pointed_thing.above
|
|
local node = minetest.get_node(under)
|
|
local def = minetest.registered_nodes[node.name]
|
|
if def and def.on_rightclick and
|
|
not (placer and placer:is_player() and
|
|
placer:get_player_control().sneak) then
|
|
return def.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack
|
|
end
|
|
|
|
local nodedef = minetest.registered_nodes[node.name]
|
|
local buildable_to = nodedef and nodedef.buildable_to
|
|
local protcheck
|
|
if buildable_to then
|
|
protcheck = under
|
|
else
|
|
protcheck = above
|
|
end
|
|
if minetest.is_protected(protcheck, placer:get_player_name()) and
|
|
not minetest.check_player_privs(placer, "protection_bypass") then
|
|
minetest.record_protection_violation(protcheck, placer:get_player_name())
|
|
return itemstack
|
|
end
|
|
|
|
local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above))
|
|
local fakestack = itemstack
|
|
if wdir == 0 or wdir == 1 then
|
|
fakestack:set_name("rp_default:"..subname)
|
|
else
|
|
fakestack:set_name("rp_default:"..subname.."_wall")
|
|
end
|
|
|
|
local place_pos
|
|
itemstack, place_pos = minetest.item_place(fakestack, placer, pointed_thing, wdir)
|
|
if not place_pos then
|
|
wdir = 1
|
|
fakestack:set_name("rp_default:"..subname)
|
|
itemstack, place_pos = minetest.item_place(fakestack, placer, pointed_thing, wdir)
|
|
end
|
|
if place_pos then
|
|
rp_sounds.play_node_sound(place_pos, {name="rp_default:"..subname}, "place")
|
|
else
|
|
rp_sounds.play_place_failed_sound(placer)
|
|
end
|
|
itemstack:set_name("rp_default:"..subname)
|
|
|
|
return itemstack
|
|
end,
|
|
|
|
_rp_on_ignite = on_ignite,
|
|
})
|
|
local copy, copy_o
|
|
for i=1,6 do
|
|
if tiles[i] ~= nil then
|
|
copy = tiles[i]
|
|
else
|
|
tiles[i] = copy
|
|
end
|
|
if overlay_tiles then
|
|
if overlay_tiles[i] ~= nil then
|
|
copy_o = overlay_tiles[i]
|
|
else
|
|
overlay_tiles[i] = copy_o
|
|
end
|
|
end
|
|
end
|
|
local copy_tile = function(tile)
|
|
if type(tile) == "table" then
|
|
return table.copy(tile)
|
|
else
|
|
return tile
|
|
end
|
|
end
|
|
local overlay_tiles2
|
|
if overlay_tiles then
|
|
overlay_tiles2 = {
|
|
copy_tile(overlay_tiles[3]),
|
|
copy_tile(overlay_tiles[4]),
|
|
copy_tile(overlay_side_R90),
|
|
copy_tile(overlay_side_R90),
|
|
copy_tile(overlay_tiles[1]),
|
|
copy_tile(overlay_tiles[2]),
|
|
}
|
|
end
|
|
local tiles2
|
|
if tiles then
|
|
tiles2 = {
|
|
tiles[3],
|
|
tiles[4],
|
|
tiles[5].."^[transformR90",
|
|
tiles[6].."^[transformR90",
|
|
tiles[1],
|
|
tiles[2],
|
|
}
|
|
end
|
|
minetest.register_node(
|
|
"rp_default:"..subname.."_wall",
|
|
{
|
|
drawtype = "nodebox",
|
|
tiles = tiles2,
|
|
use_texture_alpha = "clip",
|
|
overlay_tiles = overlay_tiles2,
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
light_source = light,
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
floodable = true,
|
|
on_flood = function(pos, oldnode, newnode)
|
|
if light and light > 0 then
|
|
minetest.sound_play({name="rp_default_torch_burnout", gain=0.1, max_hear_distance = 8}, {pos=pos}, true)
|
|
end
|
|
minetest.add_item(pos, "rp_default:torch_dead")
|
|
end,
|
|
node_box = {
|
|
type = "wallmounted",
|
|
wall_top = {-2/16, 0, -2/16, 2/16, 0.5, 2/16},
|
|
wall_bottom = {-2/16, -0.5, -2/16, 2/16, 0, 2/16},
|
|
wall_side = {-0.5, -8/16, -2/16, -0.5+4/16, 0, 2/16},
|
|
},
|
|
drop = "rp_default:"..subname,
|
|
groups = {choppy = 2, dig_immediate = 3, attached_node = 1, not_in_creative_inventory = 1, torch = 2},
|
|
is_ground_content = false,
|
|
sounds = rp_sounds.node_sound_small_defaults(),
|
|
on_construct = on_construct,
|
|
on_timer = on_timer,
|
|
|
|
_rp_on_ignite = on_ignite_wall,
|
|
})
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
local tiles_base = {"default_torch_ends.png","default_torch_bottom.png","default_torch_base.png"}
|
|
local overlay_tiles_weak = {
|
|
{
|
|
name = "default_torch_weak_ends_overlay.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.0,
|
|
},
|
|
},
|
|
{
|
|
name = "blank.png"
|
|
},
|
|
{
|
|
name = "default_torch_weak_overlay.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.0,
|
|
},
|
|
},
|
|
}
|
|
local overlay_tiles_normal = {
|
|
{
|
|
name = "default_torch_ends_overlay.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.0,
|
|
},
|
|
},
|
|
{
|
|
name = "blank.png",
|
|
},
|
|
{
|
|
name = "default_torch_overlay.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.0,
|
|
},
|
|
},
|
|
}
|
|
|
|
local overlayR90_weak = {
|
|
name = "default_torch_weak_overlayR90.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.0,
|
|
},
|
|
}
|
|
local overlayR90_normal = {
|
|
name = "default_torch_overlayR90.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 1.0,
|
|
},
|
|
}
|
|
|
|
local start_weak_torch_timer = function(pos)
|
|
local time = math.random(default.WEAK_TORCH_MIN_TIMER, default.WEAK_TORCH_MAX_TIMER)
|
|
local timer = minetest.get_node_timer(pos)
|
|
timer:start(time)
|
|
minetest.log("action", "[rp_default] Weak torch timer at "..minetest.pos_to_string(pos).." started at "..time.."s")
|
|
end
|
|
|
|
local on_construct_weak = function(pos)
|
|
start_weak_torch_timer(pos)
|
|
end
|
|
local on_timer_weak = function(pos)
|
|
local node = minetest.get_node(pos)
|
|
if node.name == "rp_default:torch_weak" then
|
|
minetest.swap_node(pos, {name="rp_default:torch_dead", param2 = node.param2})
|
|
elseif node.name == "rp_default:torch_weak_wall" then
|
|
minetest.swap_node(pos, {name="rp_default:torch_dead_wall", param2 = node.param2})
|
|
end
|
|
minetest.sound_play({name="rp_default_torch_burnout", gain=0.1, max_hear_distance = 8}, {pos=pos}, true)
|
|
minetest.log("action", "[rp_default] Weak torch at "..minetest.pos_to_string(pos).." burns out")
|
|
|
|
-- Spawn burnout particle
|
|
local ppos, vel
|
|
local vel = vector.new(0, 0.6, 0)
|
|
local dir = minetest.wallmounted_to_dir(node.param2)
|
|
if dir.y < 0 then
|
|
ppos = vector.add(pos, vector.new(0, -0.05, 0))
|
|
elseif dir.y > 0 then
|
|
ppos = vector.add(pos, vector.new(0, -0.1, 0))
|
|
vel = vector.new(math.random(-10, 10)*0.01, 0, math.random(-10, 10)*0.01)
|
|
else
|
|
ppos = vector.add(pos, vector.new((6/16)*dir.x, -0.05, (6/16)*dir.z))
|
|
end
|
|
local anim = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = -1 }
|
|
minetest.add_particlespawner({
|
|
amount = 1,
|
|
time = 0.001,
|
|
pos = ppos,
|
|
vel = vel,
|
|
exptime = 1,
|
|
size = 2.75,
|
|
texpool = {
|
|
{name = "rp_default_torch_smoke_anim.png", animation = anim},
|
|
{name = "rp_default_torch_smoke_anim.png^[transformFX", animation = anim},
|
|
},
|
|
})
|
|
end
|
|
|
|
register_torch("torch_dead", S("Dead Torch"), S("Doesn't provide any light"), {"default_torch_ends.png","default_torch_bottom.png","default_torch_base.png"}, nil, nil, "default_torch_dead_inventory.png", 0, nil, nil, "torch_weak", 1.0)
|
|
register_torch("torch_weak", S("Weak Torch"), S("Provides a bit of light but it will eventually burn out"), {"default_torch_ends.png","default_torch_bottom.png","default_torch_base.png"}, overlay_tiles_weak, overlayR90_weak, "default_torch_weak_inventory.png", default.LIGHT_MAX-4, on_construct_weak, on_timer_weak, "torch", 1.1)
|
|
register_torch("torch", S("Torch"), S("It's bright and burns forever"), {"default_torch_ends.png","default_torch_bottom.png","default_torch_base.png"}, overlay_tiles_normal, overlayR90_normal, "default_torch_inventory.png", default.LIGHT_MAX-1)
|
|
|
|
minetest.register_lbm({
|
|
label = "Upgrade wall torches",
|
|
name = "rp_default:replace_legacy_wall_torches",
|
|
nodenames = { "rp_default:torch", "rp_default:torch_weak", "rp_default:torch_dead" },
|
|
action = function(pos, node)
|
|
local dir = minetest.wallmounted_to_dir(node.param2)
|
|
if dir and (dir.x ~= 0 or dir.z ~= 0) then
|
|
node.name = node.name .. "_wall"
|
|
minetest.set_node(pos, node)
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_lbm(
|
|
{
|
|
label = "Start weak torch timer",
|
|
name = "rp_default:start_weak_torch_timer",
|
|
nodenames = {"rp_default:torch_weak", "rp_default:torch_weak_wall"},
|
|
run_at_every_load = true,
|
|
action = function(pos, node)
|
|
local timer = minetest.get_node_timer(pos)
|
|
if not timer:is_started() then
|
|
start_weak_torch_timer(pos)
|
|
end
|
|
end
|
|
})
|