2024-01-10 18:39:33 +01:00

1316 lines
40 KiB
Lua

local S = minetest.get_translator("sf_nodes")
local NS = function(s) return s end
local WOOD_WALL_LIMIT = 6/16
local CHAINLINK_LIMIT = 6/16
local RAILING_LIMIT = 6/16
local RAILING_HEIGHT = 4/16
local TABLE_PLATE_LIMIT = 7/16
local TABLE_LEG_LIMIT = 7/16
local TORCH_LIGHT = 8
local PROTRUDING_LEAVES_MULTIPLY_COLOR = "#d0d0d0"
local PLANTLIKE_OFFSET_LEVELS = 15
local EDITOR = minetest.settings:get_bool("sf_editor", false) or minetest.settings:get_bool("creative_mode", false)
sf_nodes = {}
local make_leveled_node = function(nodename, description)
local def = minetest.registered_nodes[nodename]
local new_groups
if def.groups then
new_groups = table.copy(def.groups)
else
new_groups = {}
end
new_groups.leveled_node = 1
minetest.register_node(nodename.."_level", {
description = description,
tiles = def.tiles,
groups = new_groups,
drawtype = "nodebox",
node_box = {
type = "leveled",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
use_texture_alpha = def.use_texture_alpha,
walkable = def.walkable,
paramtype = "light",
paramtype2 = "leveled",
place_param2 = 32,
sounds = def.sounds,
-- Store name of original node
_sf_unleveled_node_variant = nodename,
})
minetest.override_item(nodename, {
-- Store name of leveled node in the original node
_sf_leveled_node_variant = nodename.."_level"
})
end
local make_sound_variant_node = function(nodename, description, reverb_sound)
local def = table.copy(minetest.registered_nodes[nodename])
def.sounds = reverb_sound
def.description = description
def._sf_unreverb = nodename
if EDITOR and def.tiles and def.tiles[1] then
if type(def.tiles[1]) == "string" then
def.tiles[1] = "("..def.tiles[1] .. ")^sf_nodes_reverb_overlay.png"
elseif type(def.tiles[1]) == "table" and def.tiles[1].name then
def.tiles[1].name = "("..def.tiles[1].name .. ")^sf_nodes_reverb_overlay.png"
end
end
minetest.register_node(nodename .. "_reverb", def)
minetest.override_item(nodename, {
_sf_reverb = nodename .. "_reverb",
})
end
sf_nodes.update_plantlike_offset_node = function(pos)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
if not def then
return
end
local below = table.copy(pos)
below.y = below.y - 1
local node_below = minetest.get_node(below)
local new_offset
if minetest.get_item_group(node_below.name, "leveled_node") == 1 then
local p2i = 64 - node_below.param2
new_offset = math.floor(p2i / 4)
new_offset = math.max(0, math.min(PLANTLIKE_OFFSET_LEVELS, new_offset))
else
new_offset = 0
end
local offset_group_val = minetest.get_item_group(node.name, "plantlike_offset")
if offset_group_val > 0 then
if new_offset > 0 then
node.name = string.sub(node.name, 1, string.len(node.name) - 2) .. string.format("%02d", new_offset)
minetest.set_node(pos, node)
else
node.name = def._sf_plantlike_base_node
minetest.set_node(pos, node)
end
elseif offset_group_val < 0 then
if new_offset > 0 then
node.name = def._sf_plantlike_offset_nodename_prefix .. string.format("%02d", new_offset)
minetest.set_node(pos, node)
else
if node_below.name == "air" then
minetest.remove_node(pos)
minetest.set_node(below, node)
end
end
end
end
local make_plantlike_offset_nodes = function(nodename)
local def = minetest.registered_nodes[nodename]
for i=1, PLANTLIKE_OFFSET_LEVELS do
local hue = -(i-1)*12
local snum = string.format("%02d", i)
local new_box = table.copy(def.selection_box)
new_box.fixed[2] = -0.5 - (i/16)
new_box.fixed[5] = new_box.fixed[5] - (i/16)
minetest.register_node(nodename.."_offset_"..snum, {
walkable = false,
description = S("@1 (offset @2)", def.description, i),
tiles = def.tiles,
wield_image = def.tiles[1],
inventory_image = "("..def.tiles[1]..")^(sf_nodes_offset_overlay.png^[hsl:"..hue..":0:0)",
drawtype = "mesh",
mesh = "sf_nodes_plantlike_offset_"..i..".obj",
use_texture_alpha = "clip",
paramtype = "light",
groups = { editor_breakable = 1, plantlike_offset = i },
selection_box = new_box,
waving = 1,
drop = nodename,
_sf_plantlike_base_node = nodename,
visual_scale = def.visual_scale,
})
local orig_def = minetest.registered_nodes[nodename]
local groups = table.copy(orig_def.groups or {})
groups.plantlike_offset = -1
minetest.override_item(nodename, {
_sf_plantlike_offset_nodename_prefix = nodename.."_offset_",
groups = groups,
on_construct = function(pos)
sf_nodes.update_plantlike_offset_node(pos)
end,
})
end
end
minetest.register_node("sf_nodes:dirt", {
description = S("Dirt"),
tiles = {{ name = "sf_nodes_dirt.png", align_style="world", scale=2 }},
sounds = sf_sounds.node_sound_dirt_defaults(),
groups = { editor_breakable = 1 },
})
make_leveled_node("sf_nodes:dirt", S("Leveled Dirt"))
minetest.register_node("sf_nodes:coarse_dirt", {
description = S("Coarse Dirt"),
tiles = {{ name = "sf_nodes_coarse_dirt.png", align_style="world", scale=2 }},
sounds = sf_sounds.node_sound_dirt_defaults(),
groups = { editor_breakable = 1 },
})
make_leveled_node("sf_nodes:coarse_dirt", S("Leveled Coarse Dirt"))
minetest.register_node("sf_nodes:grass_block", {
description = S("Grass Block"),
tiles = {
{ name = "sf_nodes_grass_cover.png", align_style="world", scale=2 },
},
sounds = sf_sounds.node_sound_dirt_defaults(),
groups = { editor_breakable = 1 },
})
make_leveled_node("sf_nodes:grass_block", S("Leveled Grass Block"))
minetest.register_node("sf_nodes:mud", {
description = S("Mud"),
tiles = { "sf_nodes_mud.png" },
groups = { editor_breakable = 1, mud = 1 },
sounds = sf_sounds.node_sound_mud_defaults(),
})
make_leveled_node("sf_nodes:mud", S("Leveled Mud"))
minetest.register_node("sf_nodes:snow", {
description = S("Snow"),
tiles = { "sf_nodes_snow.png" },
groups = { editor_breakable = 1, snow = 1 },
sounds = sf_sounds.node_sound_snow_defaults(),
})
make_leveled_node("sf_nodes:snow", S("Leveled Snow"))
minetest.register_node("sf_nodes:gravel", {
description = S("Gravel"),
tiles = { "sf_nodes_gravel.png" },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_gravel_defaults(),
})
make_leveled_node("sf_nodes:gravel", S("Leveled Gravel"))
minetest.register_node("sf_nodes:stone", {
description = S("Stone"),
tiles = { { name = "sf_nodes_stone.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_leveled_node("sf_nodes:stone", S("Leveled Stone"))
make_sound_variant_node("sf_nodes:stone", S("Reverb Stone"), sf_sounds.node_sound_stone_reverb_defaults())
make_sound_variant_node("sf_nodes:stone_level", S("Reverb Leveled Stone"), sf_sounds.node_sound_stone_reverb_defaults())
minetest.register_node("sf_nodes:stone_tile", {
description = S("Stone Tile"),
tiles = { { name = "sf_nodes_stone_tile.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_sound_variant_node("sf_nodes:stone_tile", S("Reverb Stone Tile"), sf_sounds.node_sound_stone_reverb_defaults())
minetest.register_node("sf_nodes:stone_tile_big", {
description = S("Big Stone Tile"),
tiles = {
{ name = "sf_nodes_stone_tile_big.png", align_style = "world", scale = 2 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_sound_variant_node("sf_nodes:stone_tile_big", S("Reverb Big Stone Tile"), sf_sounds.node_sound_stone_reverb_defaults())
minetest.register_node("sf_nodes:stone_tile_huge", {
description = S("Huge Stone Tile"),
tiles = {
{ name = "sf_nodes_stone_tile_huge.png", align_style = "world", scale = 2 },
{ name = "sf_nodes_stone_tile_huge.png", align_style = "world", scale = 2 },
{ name = "sf_nodes_stone_smooth.png", align_style = "world", scale = 2 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_sound_variant_node("sf_nodes:stone_tile_huge", S("Reverb Huge Stone Tile"), sf_sounds.node_sound_stone_reverb_defaults())
minetest.register_node("sf_nodes:stone_brick", {
description = S("Stone Brick"),
tiles = { { name = "sf_nodes_stone_brick.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_sound_variant_node("sf_nodes:stone_brick", S("Reverb Stone Brick"), sf_sounds.node_sound_stone_reverb_defaults())
minetest.register_node("sf_nodes:stone_smooth", {
description = S("Smooth Stone"),
tiles = { { name = "sf_nodes_stone_smooth.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_leveled_node("sf_nodes:stone_smooth", S("Leveled Smooth Stone"))
make_sound_variant_node("sf_nodes:stone_smooth", S("Reverb Smooth Stone"), sf_sounds.node_sound_stone_reverb_defaults())
make_sound_variant_node("sf_nodes:stone_smooth_level", S("Reverb Leveled Smooth Stone"), sf_sounds.node_sound_stone_reverb_defaults())
minetest.register_node("sf_nodes:white_stone", {
description = S("White Stone"),
tiles = { { name = "sf_nodes_white_stone.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_leveled_node("sf_nodes:white_stone", S("Leveled White Stone"))
minetest.register_node("sf_nodes:white_stone_tile", {
description = S("White Stone Tile"),
tiles = { { name = "sf_nodes_white_stone_tile.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
minetest.register_node("sf_nodes:white_stone_tile_big", {
description = S("Big White Stone Tile"),
tiles = {
{ name = "sf_nodes_white_stone_tile_big.png", align_style = "world", scale = 2 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
minetest.register_node("sf_nodes:white_stone_brick", {
description = S("White Stone Brick"),
tiles = { { name = "sf_nodes_white_stone_brick.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
minetest.register_node("sf_nodes:white_stone_smooth", {
description = S("Smooth White Stone"),
tiles = { { name = "sf_nodes_white_stone_smooth.png", align_style = "world", scale = 2 } },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_leveled_node("sf_nodes:white_stone_smooth", S("Leveled Smooth White Stone"))
local pebbles = {
1, 2, 3, 4, 5, 6, 7
}
for p=1, #pebbles do
local size = pebbles[p]
minetest.register_node("sf_nodes:pebble_"..size, {
description = S("Pebble (size @1)", size),
tiles = { { name = "sf_nodes_stone.png", align_style = "world", scale = 2 } },
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { -size/16, -0.5, -size/16, size/16, (size/16)-0.5, size/16 }
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
end
minetest.register_node("sf_nodes:pedestal", {
description = S("Pedestal"),
tiles = { "sf_nodes_pedestal_top.png", "sf_nodes_pedestal_side.png" },
groups = { editor_breakable = 1 },
drawtype = "nodebox",
paramtype = "light",
node_box = {
type = "fixed",
fixed = {
{ -0.5, 6/16, -0.5, 0.5, 0.5, 0.5 }, -- plate
{ -5/16, -7/16, -5/16, 5/16, 6/16, 5/16 }, -- body
{ -0.5, -0.5, -0.5, 0.5, -7/16, 0.5 }, -- base
},
},
sounds = sf_sounds.node_sound_stone_defaults(),
})
minetest.register_node("sf_nodes:concrete", {
description = S("Concrete"),
tiles = { "sf_nodes_concrete.png" },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
make_leveled_node("sf_nodes:concrete", S("Leveled Concrete"))
local wconcrete_tiles
if EDITOR then
wconcrete_tiles = { "sf_nodes_concrete.png^sf_nodes_weak_concrete_overlay.png" }
else
wconcrete_tiles = { "sf_nodes_concrete.png" }
end
minetest.register_node("sf_nodes:weak_concrete", {
description = S("Weak Concrete"),
tiles = wconcrete_tiles,
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_stone_defaults(),
})
minetest.register_node("sf_nodes:tree", {
description = S("Tree"),
paramtype2 = "facedir",
tiles = {
"sf_nodes_tree_top.png",
"sf_nodes_tree_top.png",
"sf_nodes_tree.png",
},
groups = { editor_breakable = 1, tree = 1 },
sounds = sf_sounds.node_sound_tree_defaults(0.9),
on_place = function(itemstack, placer, pointed_thing)
return minetest.rotate_and_place(itemstack, placer, pointed_thing, EDITOR, { force_facedir = true })
end,
})
local small_tree_names = {
[2] = NS("Tiny Tree"),
[4] = NS("Mini Tree"),
[6] = NS("Small Tree"),
}
for i=2, 6, 2 do
minetest.register_node("sf_nodes:tree_small_"..i, {
description = S(small_tree_names[i]),
paramtype2 = "facedir",
tiles = {
"sf_nodes_tree_top_small_"..i..".png",
"sf_nodes_tree_top_small_"..i..".png",
"sf_nodes_tree_small_"..i..".png",
},
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { -i/16, -0.5, -i/16, i/16, 0.5, i/16 },
},
groups = { editor_breakable = 1, tree = 1, tree_small = i },
sounds = sf_sounds.node_sound_tree_defaults(0.9),
on_place = function(itemstack, placer, pointed_thing)
return minetest.rotate_and_place(itemstack, placer, pointed_thing, EDITOR, { force_facedir = true })
end,
})
minetest.register_node("sf_nodes:tree_small_"..i.."x", {
description = S("@1 Extension", S(small_tree_names[i])),
tiles = {
"sf_nodes_tree_top_small_"..i..".png",
"sf_nodes_tree_top_small_"..i..".png",
"sf_nodes_tree_small_"..i..".png",
},
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { -i/16, -1.5+(1/128), -i/16, i/16, 0.5, i/16 },
},
groups = { editor_breakable = 1, tree = 1, tree_small = i, tree_small_extension = 1 },
sounds = sf_sounds.node_sound_tree_defaults(0.9),
})
end
minetest.register_node("sf_nodes:leaves", {
description = S("Decidious Leaves"),
drawtype = "allfaces_optional",
paramtype = "light",
tiles = { "sf_nodes_leaves.png" },
groups = { editor_breakable = 1, leaves = 1 },
sounds = sf_sounds.node_sound_leaves_defaults(),
})
minetest.register_node("sf_nodes:leaves_protrusion", {
description = S("Protruding Decidious Leaves"),
drawtype = "plantlike",
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
tiles = { "sf_nodes_leaves_plantlike.png" },
groups = { editor_breakable = 1, leaves_protrusion = 1 },
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1/16, 0.5 },
},
visual_scale = 1.3,
sounds = sf_sounds.node_sound_leaves_defaults(),
walkable = false,
})
minetest.register_node("sf_nodes:conifer_needles", {
description = S("Conifer Needles"),
drawtype = "allfaces_optional",
paramtype = "light",
tiles = { "sf_nodes_conifer_needles.png" },
groups = { editor_breakable = 1, leaves = 1 },
sounds = sf_sounds.node_sound_leaves_defaults(),
})
minetest.register_node("sf_nodes:conifer_needles_protrusion", {
description = S("Protruding Conifer Needles"),
paramtype = "light",
paramtype2 = "wallmounted",
groups = { editor_breakable = 1, leaves_protrusion = 1 },
tiles = { "sf_nodes_conifer_needles_plantlike.png^[multiply:"..PROTRUDING_LEAVES_MULTIPLY_COLOR },
drawtype = "plantlike",
walkable = false,
visual_scale = 1.2,
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 },
},
})
minetest.register_node("sf_nodes:wood", {
description = S("Wooden Planks"),
tiles = { "sf_nodes_wood.png" },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(),
})
minetest.register_node("sf_nodes:plank", {
description = S("Wooden Plank"),
tiles = { "sf_nodes_wood_plank.png" },
paramtype = "light",
paramtype2 = "4dir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { -0.5, 6/16, -0.5, 0.5, 0.5, 0.5 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(1.2),
})
minetest.register_node("sf_nodes:metal_plate", {
description = S("Metal Plate"),
tiles = { {name="sf_nodes_rusty_metal_soft.png", align_style="world", scale=2} },
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { -0.5, 6/16, -0.5, 0.5, 0.5, 0.5 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_metal_defaults(),
})
minetest.register_node("sf_nodes:industrial_light", {
description = S("Industrial Light"),
tiles = { "sf_nodes_industrial_light.png" },
paramtype = "light",
light_source = 10,
sunlight_propagates = true,
drawtype = "nodebox",
paramtype2 = "wallmounted",
node_box = {
type = "fixed",
fixed = { -4/16, -0.5, -4/16, 4/16, 5/16, 4/16 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_metal_defaults(),
})
minetest.register_node("sf_nodes:metal", {
description = S("Metal"),
tiles = { {name="sf_nodes_rusty_metal_soft.png", align_style="world", scale=2} },
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_metal_defaults(),
})
minetest.register_node("sf_nodes:plank_small", {
description = S("Small Wooden Plank"),
tiles = { "sf_nodes_wood_plank_small.png" },
paramtype = "light",
sunlight_propagates = true,
drawtype = "nodebox",
paramtype2 = "4dir",
node_box = {
type = "fixed",
fixed = { -0.5, 6/16, -2/16, 0.5, 0.5, 2/16 },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(1.4),
})
minetest.register_node("sf_nodes:chainlink", {
description = S("Chainlink Fence"),
tiles = {
"sf_nodes_chainlink_side.png",
"sf_nodes_chainlink_side.png",
"sf_nodes_chainlink_side.png",
"sf_nodes_chainlink_side.png",
"sf_nodes_chainlink.png",
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
use_texture_alpha = "clip",
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -CHAINLINK_LIMIT },
},
groups = { editor_breakable = 1 },
})
minetest.register_node("sf_nodes:railing", {
description = S("Railing"),
tiles = {
"sf_nodes_rusty_metal.png",
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
use_texture_alpha = "clip",
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
{ -5/16, -0.5, -0.5, -3/16, RAILING_HEIGHT-1/16, -RAILING_LIMIT }, -- left pole
{ 3/16, -0.5, -0.5, 5/16, RAILING_HEIGHT-1/16, -RAILING_LIMIT }, -- right pole
{ -0.5, RAILING_HEIGHT-1/16, -0.5, 0.5, RAILING_HEIGHT, -RAILING_LIMIT }, -- rail
},
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_metal_defaults(),
})
minetest.register_node("sf_nodes:railing_corner", {
description = S("Inner Railing Corner"),
tiles = {
"sf_nodes_rusty_metal.png",
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
use_texture_alpha = "clip",
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
{ -5/16, -0.5, -0.5, -3/16, RAILING_HEIGHT-1/16, -RAILING_LIMIT }, -- left pole
{ 3/16, -0.5, -0.5, 5/16, RAILING_HEIGHT-1/16, -RAILING_LIMIT }, -- right pole
{ -0.5, -0.5, -5/16, -RAILING_LIMIT, RAILING_HEIGHT-1/16, -3/16 }, -- front pole
{ -0.5, -0.5, 3/16, -RAILING_LIMIT, RAILING_HEIGHT-1/16, 5/16 }, -- back pole
{ -0.5, RAILING_HEIGHT-1/16, -0.5, 0.5, RAILING_HEIGHT, -RAILING_LIMIT }, -- rail left-right
{ -0.5, RAILING_HEIGHT-1/16, -RAILING_LIMIT, -RAILING_LIMIT, RAILING_HEIGHT, 0.5 } -- rail front-back
},
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_metal_defaults(),
})
minetest.register_node("sf_nodes:railing_corner_outer", {
description = S("Outer Railing Corner"),
tiles = {
"sf_nodes_rusty_metal.png",
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
use_texture_alpha = "clip",
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
{ -0.5, RAILING_HEIGHT-1/16, -0.5, -RAILING_LIMIT, RAILING_HEIGHT, -RAILING_LIMIT }, -- rail piece
},
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_metal_defaults(),
})
minetest.register_node("sf_nodes:wood_wall", {
description = S("Wooden Wall"),
tiles = { { name = "sf_nodes_wood.png", align_style = "world" } },
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -WOOD_WALL_LIMIT },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(),
})
minetest.register_node("sf_nodes:wood_wall_corner_inner", {
description = S("Inner Wooden Corner Wall"),
tiles = { { name = "sf_nodes_wood.png", align_style = "world" } },
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
node_box = {
type = "fixed",
fixed = { { -0.5, -0.5, -0.5, -WOOD_WALL_LIMIT, 0.5, 0.5 },
{ -WOOD_WALL_LIMIT, -0.5, -0.5, 0.5, 0.5, -WOOD_WALL_LIMIT }
},
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(),
})
minetest.register_node("sf_nodes:wood_wall_corner_outer", {
description = S("Outer Wooden Corner Wall"),
tiles = { { name = "sf_nodes_wood.png", align_style = "world" } },
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
node_box = {
type = "fixed",
fixed = { { WOOD_WALL_LIMIT, -0.5, -0.5, 0.5, 0.5, -WOOD_WALL_LIMIT } },
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(),
})
minetest.register_node("sf_nodes:wood_table2_piece", {
description = S("Table Piece"),
tiles = { { name = "sf_nodes_wood.png", align_style = "world" } },
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "4dir",
node_box = {
type = "fixed",
fixed = {
{ -0.5, TABLE_PLATE_LIMIT, -0.5, 0.5, 0.5, 0.5 }, -- plate
{ -0.5, -0.5, -0.5, -TABLE_LEG_LIMIT, TABLE_PLATE_LIMIT, -TABLE_LEG_LIMIT }, -- leg 1
{ -0.5, -0.5, TABLE_LEG_LIMIT, -TABLE_LEG_LIMIT, TABLE_PLATE_LIMIT, 0.5 }, -- leg 2
},
},
groups = { editor_breakable = 1 },
sounds = sf_sounds.node_sound_wood_defaults(),
})
local darkness_pointable, darkness_drawtype, darkness_tiles
if EDITOR then
darkness_pointable = true
darkness_drawtype = "allfaces"
darkness_tiles = { "sf_nodes_darkness.png" }
else
darkness_pointable = false
darkness_drawtype = "airlike"
darkness_tiles = nil
end
minetest.register_node("sf_nodes:darkness", {
description = S("Darkness"),
pointable = darkness_pointable,
walkable = false,
drawtype = darkness_drawtype,
tiles = darkness_tiles,
paramtype = "light",
wield_image = "sf_nodes_darkness.png",
inventory_image = "sf_nodes_darkness.png",
groups = { editor_breakable = 1 },
})
local liquid_pointable
if EDITOR then
liquid_pointable = true
else
liquid_pointable = false
end
local make_liquid_node = function(nodename, tile, description, description_flowing, description_puddle, post_effect_color)
minetest.register_node(nodename, {
description = description,
pointable = liquid_pointable,
walkable = false,
tiles = { tile },
post_effect_color = post_effect_color,
post_effect_color_shaded = true,
drawtype = "liquid",
paramtype = "light",
use_texture_alpha = "blend",
sounds = sf_sounds.node_sound_water_defaults(),
liquid_move_physics = true,
move_resistance = 1,
groups = { editor_breakable = 1 },
liquid_alternative_source = nodename,
liquid_alternative_flowing = nodename.."_flowing",
liquid_range = 2,
})
minetest.register_node(nodename.."_flowing", {
description = description_flowing,
pointable = liquid_pointable,
walkable = false,
tiles = { tile },
special_tiles = {
{ name = tile, backface_culling = false },
{ name = tile, backface_culling = false },
},
post_effect_color = post_effect_color,
post_effect_color_shaded = true,
drawtype = "flowingliquid",
paramtype = "light",
use_texture_alpha = "blend",
sounds = sf_sounds.node_sound_water_defaults(),
liquid_move_physics = true,
move_resistance = 1,
groups = { editor_breakable = 1 },
liquid_alternative_source = nodename,
liquid_alternative_flowing = nodename.."_flowing",
liquid_range = 2,
})
local def = minetest.registered_nodes[nodename]
minetest.register_node(nodename.."_puddle", {
description = description_puddle,
pointable = liquid_pointable,
walkable = false,
tiles = { tile, "blank.png" },
post_effect_color = post_effect_color,
post_effect_color_shaded = true,
groups = { editor_breakable = 1, leveled_node = 1, puddle = 1 },
drawtype = "nodebox",
node_box = {
type = "leveled",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
use_texture_alpha = "blend",
walkable = false,
paramtype = "light",
paramtype2 = "leveled",
place_param2 = 32,
sounds = sf_sounds.node_sound_puddle_defaults(),
liquid_move_physics = false,
move_resistance = 0,
})
end
make_liquid_node("sf_nodes:water", "sf_nodes_water.png", S("Water"), S("Flowing Water"), S("Water Puddle"), {r=45,g=106,b=183,a=64})
make_liquid_node("sf_nodes:dirty_water", "sf_nodes_dirty_water.png", S("Dirty Water"), S("Flowing Dirty Water"), S("Dirty Water Puddle"), {r=199,g=156,b=107,a=107})
-- HACK: This is a special mud with puddle footstep sounds.
-- It may only be placed below puddle nodes because the puddle nodes
-- themselves fail to play the puddle sound when placed above a solid node.
minetest.register_node("sf_nodes:puddle_mud", {
description = S("Puddle Mud"),
tiles = { "sf_nodes_puddle_mud.png" },
groups = { editor_breakable = 1, mud = 2 },
sounds = sf_sounds.node_sound_puddle_defaults(),
})
minetest.register_node("sf_nodes:torch_floor", {
description = S("Torch (floor)"),
tiles = {
"sf_nodes_torch_floor_top.png",
"sf_nodes_torch_floor_bottom.png",
"sf_nodes_torch_floor_side.png",
},
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -1/16, -0.5, -1/16, 1/16, 0, 1/16 }, -- stick
},
},
light_source = TORCH_LIGHT,
groups = { editor_breakable = 1, torch = 1 },
walkable = false,
})
minetest.register_node("sf_nodes:torch_wall", {
description = S("Torch (wall)"),
tiles = {
"sf_nodes_torch_wall_top.png",
"sf_nodes_torch_wall_bottom.png",
"sf_nodes_torch_wall_side.png",
},
paramtype = "light",
paramtype2 = "4dir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -1/16, 0, 5/16, 1/16, 1/16, 0.5 }, -- holder 1
{ -1/16, -3/16, 5/16, 1/16, -2/16, 0.5 }, -- holder 2
{ -1/16, -4/16, 3/16, 1/16, 4/16, 5/16 }, -- stick
},
},
light_source = TORCH_LIGHT,
groups = { editor_breakable = 1, torch = 1 },
walkable = false,
})
minetest.register_node("sf_nodes:ladder", {
description = S("Wooden Ladder"),
tiles = { "sf_nodes_ladder_top.png",
"sf_nodes_ladder_bottom.png",
"sf_nodes_ladder_side.png",
"sf_nodes_ladder_side.png",
"sf_nodes_ladder.png",
"sf_nodes_ladder.png",
},
drawtype = "nodebox",
paramtype = "light",
sunlight_propagates = true,
use_texture_alpha = "clip",
paramtype2 = "4dir",
walkable = false,
climbable = true,
groups = { editor_breakable = 1 },
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, 6/16, -6/16, 0.5, 0.5 }, -- left stick
{ 6/16, -0.5, 6/16, 0.5, 0.5, 0.5 }, -- right stick
{ -6/16, 5/16, 6/16, 6/16, 7/16, 0.5 }, -- rung 1
{ -6/16, 1/16, 6/16, 6/16, 3/16, 0.5 }, -- rung 2
{ -6/16, -3/16, 6/16, 6/16, -1/16, 0.5 }, -- rung 3
{ -6/16, -7/16, 6/16, 6/16, -5/16, 0.5 }, -- rung 4
},
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, 6/16, 0.5, 0.5, 0.5 },
},
sounds = sf_sounds.node_sound_wood_defaults(1.4),
})
minetest.register_node("sf_nodes:metal_ladder", {
description = S("Metal Ladder"),
tiles = { "sf_nodes_metal_ladder_top.png",
"sf_nodes_metal_ladder_bottom.png",
"sf_nodes_metal_ladder_side.png",
"sf_nodes_metal_ladder_side.png",
"sf_nodes_metal_ladder.png",
"sf_nodes_metal_ladder.png",
},
drawtype = "nodebox",
paramtype = "light",
sunlight_propagates = true,
use_texture_alpha = "clip",
paramtype2 = "4dir",
walkable = false,
climbable = true,
groups = { editor_breakable = 1 },
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, 6/16, -6/16, 0.5, 0.5 }, -- left stick
{ 6/16, -0.5, 6/16, 0.5, 0.5, 0.5 }, -- right stick
{ -6/16, 5/16, 6/16, 6/16, 7/16, 0.5 }, -- rung 1
{ -6/16, 1/16, 6/16, 6/16, 3/16, 0.5 }, -- rung 2
{ -6/16, -3/16, 6/16, 6/16, -1/16, 0.5 }, -- rung 3
{ -6/16, -7/16, 6/16, 6/16, -5/16, 0.5 }, -- rung 4
},
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, 6/16, 0.5, 0.5, 0.5 },
},
sounds = sf_sounds.node_sound_metal_defaults(1.4),
})
minetest.register_node("sf_nodes:metal_ladder_x", {
description = S("Metal Ladder Extension"),
tiles = { "sf_nodes_metal_ladder_top.png",
"sf_nodes_metal_ladder_bottom.png",
"sf_nodes_metal_ladder_side.png",
"sf_nodes_metal_ladder_side.png",
"sf_nodes_metal_ladder.png",
"sf_nodes_metal_ladder.png",
},
drawtype = "nodebox",
paramtype = "light",
sunlight_propagates = true,
use_texture_alpha = "clip",
paramtype2 = "4dir",
walkable = false,
climbable = true,
groups = { editor_breakable = 1 },
node_box = {
type = "fixed",
fixed = {
{ -0.5, -1.5, 6/16, -6/16, 0.5, 0.5 }, -- left stick
{ 6/16, -1.5, 6/16, 0.5, 0.5, 0.5 }, -- right stick
{ -6/16, 5/16, 6/16, 6/16, 7/16, 0.5 }, -- rung 1
{ -6/16, 1/16, 6/16, 6/16, 3/16, 0.5 }, -- rung 2
{ -6/16, -3/16, 6/16, 6/16, -1/16, 0.5 }, -- rung 3
{ -6/16, -7/16, 6/16, 6/16, -5/16, 0.5 }, -- rung 4
{ -6/16, -9/16, 6/16, 6/16, -11/16, 0.5 }, -- rung 5
{ -6/16, -13/16, 6/16, 6/16, -15/16, 0.5 }, -- rung 5
{ -6/16, -17/16, 6/16, 6/16, -19/16, 0.5 }, -- rung 5
{ -6/16, -21/16, 6/16, 6/16, -23/16, 0.5 }, -- rung 5
},
},
selection_box = {
type = "fixed",
fixed = { -0.5, -1.5, 6/16, 0.5, 0.5, 0.5 },
},
sounds = sf_sounds.node_sound_metal_defaults(1.4),
})
minetest.register_node("sf_nodes:fern", {
walkable = false,
description = S("Fern"),
tiles = { "sf_nodes_fern.png" },
drawtype = "mesh",
mesh = "sf_nodes_plantlike.obj",
use_texture_alpha = "clip",
paramtype = "light",
groups = { editor_breakable = 1 },
selection_box = {
type = "fixed",
fixed = { -6/16, -0.5, -6/16, 6/16, 0.5, 6/16 },
},
waving = 1,
})
make_plantlike_offset_nodes("sf_nodes:fern")
minetest.register_node("sf_nodes:grass", {
walkable = false,
description = S("Small Grass"),
tiles = { "sf_nodes_grass.png" },
drawtype = "mesh",
mesh = "sf_nodes_plantlike.obj",
use_texture_alpha = "clip",
paramtype = "light",
groups = { editor_breakable = 1 },
selection_box = {
type = "fixed",
fixed = { -6/16, -0.5, -6/16, 6/16, 0, 6/16 },
},
waving = 1,
})
make_plantlike_offset_nodes("sf_nodes:grass")
minetest.register_node("sf_nodes:grass_2", {
walkable = false,
description = S("Medium Grass"),
tiles = { "sf_nodes_grass_2.png" },
drawtype = "mesh",
mesh = "sf_nodes_plantlike.obj",
use_texture_alpha = "clip",
paramtype = "light",
groups = { editor_breakable = 1 },
selection_box = {
type = "fixed",
fixed = { -6/16, -0.5, -6/16, 6/16, 0, 6/16 },
},
waving = 1,
visual_scale = 1.1,
})
make_plantlike_offset_nodes("sf_nodes:grass_2")
minetest.register_node("sf_nodes:grass_3", {
walkable = false,
description = S("Tall Grass"),
tiles = { "sf_nodes_grass_3.png" },
drawtype = "mesh",
mesh = "sf_nodes_plantlike.obj",
use_texture_alpha = "clip",
paramtype = "light",
groups = { editor_breakable = 1 },
selection_box = {
type = "fixed",
fixed = { -7/16, -0.5, -7/16, 7/16, 0.5, 7/16 },
},
waving = 1,
visual_scale = 1.2,
})
make_plantlike_offset_nodes("sf_nodes:grass_3")
minetest.register_node("sf_nodes:ivy", {
walkable = false,
description = S("Ivy"),
tiles = { "sf_nodes_ivy.png" },
drawtype = "signlike",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = { editor_breakable = 1 },
selection_box = {
type = "wallmounted",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -7/16 },
},
})
minetest.register_node("sf_nodes:ivy_sprouting", {
walkable = false,
description = S("Sprouting Ivy"),
tiles = { "sf_nodes_ivy_sprouting.png" },
drawtype = "signlike",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = { editor_breakable = 1 },
selection_box = {
type = "wallmounted",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -7/16 },
},
})
minetest.register_node("sf_nodes:ivy_root", {
walkable = false,
description = S("Ivy Root"),
tiles = { "sf_nodes_ivy_root.png" },
drawtype = "signlike",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = { editor_breakable = 1 },
selection_box = {
type = "wallmounted",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -7/16 },
},
})
local spikeplant_weak_tiles
if EDITOR then
spikeplant_weak_tiles = { "sf_nodes_spikeplant_weak.png" }
else
spikeplant_weak_tiles = { "sf_nodes_spikeplant.png" }
end
-- Same as normal shadow bush, except it is supposed to be destroyed
-- by a special event at the shadow bush barrier in the Dead Forest.
minetest.register_node("sf_nodes:spikeplant_weak", {
description = S("Weak Shadow Bush"),
paramtype = "light",
groups = { editor_breakable = 1, leaves = 1, disable_jump = 1 },
drawtype = "allfaces_optional",
tiles = spikeplant_weak_tiles,
move_resistance = 1,
damage_per_second = 1,
walkable = true,
collision_box = {
type = "fixed",
fixed = {-6/16, -0.5, -6/16, 6/16, 6/16, 6/16},
},
sounds = sf_sounds.node_sound_leaves_defaults(0.8),
})
minetest.register_node("sf_nodes:spikeplant", {
description = S("Shadow Bush"),
paramtype = "light",
groups = { editor_breakable = 1, leaves = 1, disable_jump = 1 },
tiles = { "sf_nodes_spikeplant.png" },
drawtype = "allfaces_optional",
move_resistance = 1,
damage_per_second = 1,
walkable = true,
collision_box = {
type = "fixed",
fixed = {-6/16, -0.5, -6/16, 6/16, 6/16, 6/16},
},
sounds = sf_sounds.node_sound_leaves_defaults(0.8),
})
minetest.register_node("sf_nodes:spikeplant_inner", {
description = S("Branchy Shadow Bush"),
paramtype = "light",
groups = { editor_breakable = 1, leaves = 1, disable_jump = 1 },
tiles = { "sf_nodes_spikeplant_inner.png" },
drawtype = "allfaces_optional",
move_resistance = 2,
damage_per_second = 2,
walkable = true,
collision_box = {
type = "fixed",
fixed = {-6/16, -0.5, -6/16, 6/16, 6/16, 6/16},
},
sounds = sf_sounds.node_sound_leaves_defaults(0.8),
})
minetest.register_node("sf_nodes:spikeplant_protrusion", {
description = S("Protuding Shadow Bush"),
paramtype = "light",
groups = { editor_breakable = 1, leaves_protrusion = 1, disable_jump = 1 },
tiles = { "sf_nodes_spikeplant_plantlike.png" },
drawtype = "plantlike",
paramtype2 = "wallmounted",
move_resistance = 1,
walkable = false,
damage_per_second = 1,
sounds = sf_sounds.node_sound_leaves_defaults(0.8),
})
minetest.register_node("sf_nodes:spikeplant_angled", {
description = S("Angled Shadow Bush"),
paramtype = "light",
groups = { editor_breakable = 1 },
tiles = { "sf_nodes_spikeplant_plantlike.png" },
drawtype = "plantlike",
paramtype2 = "meshoptions",
move_resistance = 1,
walkable = false,
damage_per_second = 1,
place_param2 = 4,
sounds = sf_sounds.node_sound_leaves_defaults(0.8),
})
minetest.register_node("sf_nodes:bush", {
description = S("Bush"),
paramtype = "light",
groups = { editor_breakable = 1, leaves = 1 },
tiles = { "sf_nodes_bush.png" },
drawtype = "allfaces_optional",
collision_box = {
type = "fixed",
fixed = {-6/16, -6/16, -6/16, 6/16, 6/16, 6/16},
},
sounds = sf_sounds.node_sound_leaves_defaults(1.1),
})
minetest.register_node("sf_nodes:bush_protrusion", {
description = S("Protruding Bush"),
paramtype = "light",
paramtype2 = "wallmounted",
groups = { editor_breakable = 1, leaves_protrusion = 1 },
tiles = { "sf_nodes_bush_plantlike.png" },
drawtype = "plantlike",
walkable = false,
visual_scale = 1.2,
selection_box = {
type = "fixed",
fixed = {-6/16, -0.5, -6/16, 6/16, 0, 6/16 },
},
sounds = sf_sounds.node_sound_leaves_defaults(1.1),
})
minetest.register_node("sf_nodes:light_crystal", {
description = S("Light Crystal"),
paramtype = "light",
sunlight_propagates = true,
light_source = minetest.LIGHT_MAX,
drawtype = "nodebox",
groups = { editor_breakable = 1, dig_immediate = 3 },
node_box = {
type = "fixed",
fixed = {
{ -2/16, -0.5, -2/16, 2/16, 2/16, 2/16 }, -- center piece
{ -4/16, -0.5, -1/16, 4/16, -2/16, 1/16 }, -- low piece 1
{ -1/16, -0.5, -4/16, 1/16, -2/16, 4/16 }, -- low piece 2
{ -3/16, -0.5, -3/16, 3/16, -7/16, 3/16 }, -- flatty
},
},
tiles = {{ name = "sf_nodes_light_crystal.png" }},
use_texture_alpha = "blend",
sounds = {
dug = { name = "sf_nodes_crystal_collect", gain = 0.25 },
place = { name = "sf_nodes_crystal_collect", gain = 0.35, pitch = 0.9 },
},
drop = "",
after_dig_node = function(pos, oldnode, oldmetadata, digger)
if EDITOR then
return
end
local count = sf_resources.get_resource_count(digger, "sf_resources:light_crystal")
count = count + 1
sf_resources.set_resource_count(digger, "sf_resources:light_crystal", count)
end,
})
minetest.register_node("sf_nodes:campfire_off", {
description = S("Campfire"),
drawtype = "mesh",
mesh = "sf_nodes_campfire.obj",
paramtype = "light",
groups = { editor_breakable = 1, campfire = 1 },
tiles = {
"blank.png",
"blank.png",
{ name = "sf_nodes_campfire_top.png", backface_culling = true },
{ name = "sf_nodes_campfire_side.png", backface_culling = true },
},
use_texture_alpha = "clip",
walkable = false,
selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, -6/16, 6/16 }},
sounds = sf_sounds.node_sound_dirt_defaults(),
})
minetest.register_node("sf_nodes:campfire_on", {
description = S("Campfire with Fire"),
drawtype = "mesh",
mesh = "sf_nodes_campfire.obj",
paramtype = "light",
groups = { editor_breakable = 1, campfire = 2 },
tiles = {
{ name="sf_nodes_campfire_fire_anim.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.49 } },
{ name="sf_nodes_campfire_fire_anim.png", animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5 } },
{ name = "sf_nodes_campfire_top.png", backface_culling = true },
{ name = "sf_nodes_campfire_side.png", backface_culling = true },
},
use_texture_alpha = "clip",
walkable = false,
light_source = minetest.LIGHT_MAX,
selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, -6/16, 6/16 }},
sounds = sf_sounds.node_sound_dirt_defaults(),
damage_per_second = 1,
on_rightclick = function(pos, node, clicker)
if not clicker or not clicker:is_player() then
return
end
sf_upgrade.show_upgrade_formspec(clicker)
end,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Campfire (rightclick to upgrade)"))
end,
})
-- Warning: This node is very bouncy. Always put another solid node
-- above it (like an invisible barrier)
-- to make sure the player can't bounce into space!
minetest.register_node("sf_nodes:shadow_barrier", {
description = S("Shadow Barrier"),
drawtype = "glasslike",
paramtype = "light",
-- Bounces the player heavily off when walking into it
groups = { editor_breakable = 1, bouncy = 225 },
tiles = {
{ name = "sf_nodes_shadow_barrier.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 4, }},
},
use_texture_alpha = "blend",
walkable = true,
})
local ib_pointable, ib_drawtype, ib_tiles
if EDITOR then
ib_pointable = true
ib_drawtype = "allfaces"
ib_tiles = { "sf_nodes_invisible_barrier.png" }
else
ib_pointable = false
ib_drawtype = "airlike"
ib_tiles = nil
end
minetest.register_node("sf_nodes:invisible_barrier", {
description = S("Invisible Barrier"),
drawtype = ib_drawtype,
tiles = ib_tiles,
wield_image = "sf_nodes_invisible_barrier.png",
inventory_image = "sf_nodes_invisible_barrier.png",
paramtype = "light",
sunlight_propagates = true,
groups = { editor_breakable = 1 },
walkable = true,
pointable = ib_pointable,
})
local ki_pointable, ki_drawtype, ki_tiles, ki_dmg
if EDITOR then
ki_pointable = true
ki_drawtype = "allfaces"
ki_tiles = { "sf_nodes_killer.png" }
ki_dmg = 0
else
ki_pointable = false
ki_drawtype = "airlike"
ki_tiles = nil
ki_dmg = 20
end
minetest.register_node("sf_nodes:killer", {
description = S("Killer"),
drawtype = ki_drawtype,
tiles = ki_tiles,
wield_image = "sf_nodes_killer.png",
inventory_image = "sf_nodes_killer.png",
paramtype = "light",
visual_scale = 0.5,
sunlight_propagates = true,
groups = { editor_breakable = 1 },
walkable = false,
pointable = ki_pointable,
damage_per_second = ki_dmg,
})