everness/vines.lua

333 lines
8.4 KiB
Lua

--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2024 SaKeL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
--]]
local S = minetest.get_translator(minetest.get_current_modname())
local function register_vine(name, def, overrides)
local _overrides = overrides and table.copy(overrides) or {}
local _def = table.copy(def)
local _name = name
_def.walkable = false
_def.climbable = true
_def.sunlight_propagates = true
_def.paramtype = 'light'
_def.buildable_to = false
_def.drawtype = 'plantlike'
_def.paramtype2 = 'meshoptions'
_def.place_param2 = 8
_def.visual_scale = 1.1
_def.light_source = 7
_def.selection_box = def.selection_box or {
type = 'fixed',
fixed = { -4 / 16, -8 / 16, -4 / 16, 4 / 16, 8 / 16, 4 / 16 }
}
_def.groups = {
-- MTG
vine = 1,
snappy = 3,
-- Everness
falling_vines = 1,
no_silktouch = 1,
-- X Farming
compost = 30,
-- MCL
handy = 1,
axey = 1,
shearsy = 1,
swordy = 1,
deco_block = 1,
dig_by_piston = 1,
destroy_by_lava_flow = 1,
compostability = 30,
fire_encouragement = 15,
fire_flammability = 100,
-- ALL
flammable = 2,
}
if _overrides.groups then
Everness.mergeTables(_def.groups, _overrides.groups)
end
-- MCL
_def._mcl_shears_drop = true
_def._mcl_blast_resistance = 0.2
_def._mcl_hardness = 0.2
_def.on_rotate = function()
return false
end
_def.sounds = Everness.node_sound_leaves_defaults()
_def.waving = 1
_def.on_destruct = function(pos)
local pos_below = vector.new(pos.x, pos.y - 1, pos.z)
local node_below = minetest.get_node(pos_below)
if minetest.get_item_group(node_below.name, 'vine') > 0 then
minetest.remove_node(pos_below)
end
end
_def.after_dig_node = function(pos, oldnode, oldmetadata, digger)
local pos_above = vector.new(pos.x, pos.y + 1, pos.z)
Everness:tick_vine(pos_above)
end
_def.on_construct = function(pos)
Everness:tick_vine(pos)
end
local grow_vine_node_names = {}
local grow_vine_end_node_name = ''
for i = 1, 3 do
local _d = table.copy(_def)
local _n = _name
local first = i == 1
local last = i == 3
if last then
-- end
_n = _n .. '_end'
_d.groups.vine_end = 1
grow_vine_end_node_name = 'everness:' .. _n
_d.tiles = { 'everness_' .. _n .. '.png' }
_d.wield_image = 'everness_' .. _n .. '.png'
_d.inventory_image = 'everness_' .. _n .. '.png'
_d.drop = {
max_items = 1,
items = {
{
tool_groups = { 'vine_shears' },
items = { 'everness:' .. _n }
}
}
}
if _overrides.last_def then
-- custom, not 'plantlike' drawtype
for k, v in pairs(_overrides.last_def) do
_d[k] = v
end
if not _overrides.last_def.place_param2 then
_d.place_param2 = nil
end
end
else
-- 1, 2..
_n = _n .. '_' .. i
_d.tiles = { 'everness_' .. _n .. '.png' }
_d.wield_image = 'everness_' .. _n .. '.png'
_d.inventory_image = 'everness_' .. _n .. '.png'
_d.drop = {
max_items = 1,
items = {
{
tool_groups = { 'vine_shears' },
items = { 'everness:' .. _n }
}
}
}
table.insert(grow_vine_node_names, 'everness:' .. _n)
end
if not first then
-- 2.., end
_d.light_source = 12
end
_d.on_timer = function(pos, elapsed)
Everness:grow_vine(pos, elapsed, {
node_names = grow_vine_node_names,
end_node_name = grow_vine_end_node_name,
end_node_param2 = _overrides.end_node_param2 and _overrides.end_node_param2 or nil
})
end
Everness:register_node('everness:' .. _n, _d)
end
end
-- Cave vine
register_vine('vine_cave', {
description = S('Cave Vine')
})
minetest.register_alias('everness:vine_cave', 'everness:vine_cave_1')
minetest.register_alias('everness:vine_cave_with_mese_leaves', 'everness:vine_cave_2')
-- Whispering Gourd Vine
register_vine('whispering_gourd_vine', {
description = S('Whispering Gourd Vine')
})
-- Bulb Vine
register_vine('bulb_vine', {
description = S('Bulb Vine')
})
-- Willow Vine
register_vine('willow_vine', {
description = S('Willow Vine')
}, {
groups = {
falling_vines = 0
}
})
-- Eye Vine
register_vine('eye_vine',
{
description = S('Eye Vine'),
},
{
end_node_param2 = 0,
last_def = {
tiles = {
'everness_eye_vine_end_top.png',
'everness_eye_vine_end_bottom.png',
'everness_eye_vine_end_side.png',
},
wield_image = 'everness_eye_vine_end_bottom.png',
inventory_image = 'everness_eye_vine_end_bottom.png',
drawtype = 'normal',
paramtype2 = 'facedir',
sunlight_propagates = false,
visual_scale = 1,
selection_box = {
type = 'fixed',
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
drop = {
max_items = 1,
items = {
{
tool_groups = { 'vine_shears' },
items = { 'everness:eye_vine_lantern' }
}
}
}
}
}
)
-- Lumabus Vine
register_vine('lumabus_vine',
{
description = S('Lumabus Vine')
},
{
end_node_param2 = 0,
last_def = {
tiles = {
'everness_lumabus_bulb_purple.png',
{
name = 'everness_lumabus_leaves.png',
backface_culling = false
}
},
use_texture_alpha = 'clip',
drawtype = 'mesh',
mesh = 'everness_lumabus.obj',
paramtype2 = 'wallmounted',
sunlight_propagates = false,
visual_scale = 1,
selection_box = {
type = 'fixed',
fixed = {
-1 / 2 + 3 / 16,
-1 / 2,
-1 / 2 + 3 / 16,
1 / 2 - 3 / 16,
1 / 2 - 6 / 16,
1 / 2 - 3 / 16
}
},
drop = {
max_items = 1,
items = {
{
tool_groups = { 'vine_shears' },
items = { 'everness:lumabus_vine_lantern' }
}
}
}
},
}
)
-- Ivis Vine
register_vine('ivis_vine', {
description = S('Ivis Vine')
})
-- Flowered vine
register_vine('flowered_vine', {
description = S('Flowered Vine')
})
-- Reeds vine
register_vine('reeds_vine', {
description = S('Reeds Vine')
})
-- Tenanea Flowers vine
register_vine('tenanea_flowers_vine', {
description = S('Tenanea Flowers Vine')
})
-- Twisted vine
register_vine('twisted_vine', {
description = S('Twisted Vine')
})
-- Golden vine
register_vine('golden_vine', {
description = S('Golden Vine')
})
-- Dense vine
register_vine('dense_vine', {
description = S('Dense Vine')
})
-- LBMs
Everness:register_lbm({
label = 'Grows vines',
name = 'everness:vines',
nodenames = { 'group:vine' },
run_at_every_load = true,
action = function(pos, node)
Everness:tick_vine(pos)
end,
})