297 lines
9.2 KiB
Lua
297 lines
9.2 KiB
Lua
--[[
|
|
X Farming. Extends Minetest farming mod with new plants, crops and ice fishing.
|
|
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.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to juraj.vajda@gmail.com
|
|
--]]
|
|
|
|
local S = minetest.get_translator(minetest.get_current_modname())
|
|
|
|
x_farming.register_plant('x_farming:rice', {
|
|
description = S('Rice Seed') .. '\n' .. S('Compost chance') .. ': 30%',
|
|
short_description = S('Rice Seed'),
|
|
tiles = { 'x_farming_silt_loam_soil.png' },
|
|
inventory_image = 'x_farming_rice_seed_inv.png',
|
|
steps = 8,
|
|
minlight = 13,
|
|
maxlight = 14,
|
|
fertility = { 'grassland' },
|
|
drawtype = 'plantlike_rooted',
|
|
paramtype2 = 'none',
|
|
visual_scale = 3.0,
|
|
special_tiles = 'x_farming_rice_seed.png',
|
|
node_dig_prediction = 'x_farming:silt_loam_soil',
|
|
groups = { attached_node = 0 },
|
|
node_placement_prediction = '',
|
|
buildable_to = false,
|
|
selection_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_1 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_2 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_3 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 2, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_4 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 2.5, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_5 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 2.5, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_6 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 3, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_7 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 3, 4 / 16 },
|
|
},
|
|
},
|
|
selection_box_8 = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -4 / 16, 0.5, -4 / 16, 4 / 16, 3, 4 / 16 },
|
|
},
|
|
},
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
if pointed_thing.type ~= 'node' or not placer then
|
|
return itemstack
|
|
end
|
|
|
|
local player_name = placer:get_player_name()
|
|
local pos_under = pointed_thing.under
|
|
local pos_above = pointed_thing.above
|
|
local node_under = minetest.get_node(pos_under)
|
|
local def_under = minetest.registered_nodes[node_under.name]
|
|
|
|
if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then
|
|
return def_under.on_rightclick(pos_under, node_under, placer, itemstack, pointed_thing) or itemstack
|
|
end
|
|
|
|
local water_above = minetest.find_nodes_in_area(
|
|
vector.new(pos_above),
|
|
vector.new(pos_above.x, pos_above.y + 2, pos_above.z),
|
|
{ 'default:water_source' }
|
|
)
|
|
|
|
if node_under.name ~= 'x_farming:silt_loam_soil'
|
|
or minetest.get_node(pos_above).name ~= 'default:water_source'
|
|
or #water_above ~= 1
|
|
then
|
|
return itemstack
|
|
end
|
|
|
|
if minetest.is_protected(pos_under, player_name)
|
|
or minetest.is_protected(pos_above, player_name)
|
|
then
|
|
minetest.record_protection_violation(pos_under, player_name)
|
|
return itemstack
|
|
end
|
|
|
|
node_under.name = itemstack:get_name()
|
|
minetest.set_node(pos_under, node_under)
|
|
x_farming.tick(pos_under)
|
|
|
|
if not minetest.is_creative_enabled(player_name) then
|
|
itemstack:take_item()
|
|
end
|
|
|
|
return itemstack
|
|
end,
|
|
after_destruct = function(pos, oldnode)
|
|
minetest.set_node(pos, { name = 'x_farming:silt_loam_soil' })
|
|
end,
|
|
on_timer = function(pos, elapsed)
|
|
local node = minetest.get_node(pos)
|
|
local name = node.name
|
|
local def = minetest.registered_nodes[name]
|
|
|
|
if not def.next_plant then
|
|
-- disable timer for fully grown plant
|
|
return
|
|
end
|
|
|
|
-- grow seed
|
|
if minetest.get_item_group(node.name, 'seed') and def.fertility then
|
|
local water_above = minetest.find_nodes_in_area(
|
|
vector.new(pos),
|
|
vector.new(pos.x, pos.y + 2, pos.z),
|
|
{ 'default:water_source' }
|
|
)
|
|
|
|
if #water_above ~= 1 then
|
|
x_farming.tick_again(pos)
|
|
return
|
|
end
|
|
-- omitted is a check for light, we assume seeds can germinate in the dark.
|
|
local placenode = { name = def.next_plant }
|
|
|
|
if def.place_param2 then
|
|
placenode.param2 = def.place_param2
|
|
end
|
|
|
|
minetest.swap_node(pos, placenode)
|
|
|
|
if minetest.registered_nodes[def.next_plant].next_plant then
|
|
x_farming.tick(pos)
|
|
return
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
-- check if emerged in water
|
|
local water_above = minetest.find_nodes_in_area(
|
|
vector.new(pos),
|
|
vector.new(pos.x, pos.y + 2, pos.z),
|
|
{ 'default:water_source' }
|
|
)
|
|
|
|
local air_above = minetest.find_nodes_in_area(
|
|
vector.new(pos),
|
|
vector.new(pos.x, pos.y + 3, pos.z),
|
|
{ 'air' }
|
|
)
|
|
|
|
if #water_above ~= 1 or #air_above ~= 2 then
|
|
x_farming.tick_again(pos)
|
|
return
|
|
end
|
|
|
|
-- check light
|
|
local light = minetest.get_node_light(pos)
|
|
|
|
if not light or light < def.minlight or light > def.maxlight then
|
|
x_farming.tick_again(pos)
|
|
return
|
|
end
|
|
|
|
-- grow
|
|
local placenode = { name = def.next_plant }
|
|
|
|
if def.place_param2 then
|
|
placenode.param2 = def.place_param2
|
|
end
|
|
|
|
minetest.swap_node(pos, placenode)
|
|
|
|
-- new timer needed?
|
|
if minetest.registered_nodes[def.next_plant].next_plant then
|
|
x_farming.tick(pos)
|
|
end
|
|
end
|
|
})
|
|
|
|
-- Registered before the stairs so the stairs get fuel recipes.
|
|
minetest.register_craft({
|
|
type = 'fuel',
|
|
recipe = 'x_farming:rice_stack',
|
|
burntime = 3,
|
|
})
|
|
|
|
if minetest.get_modpath('stairs') then
|
|
do
|
|
local recipe = 'x_farming:rice'
|
|
local groups = { snappy = 3, flammable = 4 }
|
|
local images = { 'x_farming_rice_stack_side.png' }
|
|
local sounds = x_farming.node_sound_leaves_defaults()
|
|
|
|
stairs.register_stair('rice_stack', recipe, groups, images, S('Rice Stack Stair'),
|
|
sounds, true)
|
|
stairs.register_stair_inner('rice_stack', recipe, groups, images, '',
|
|
sounds, true, S('Inner Rice Stack Stair'))
|
|
stairs.register_stair_outer('rice_stack', recipe, groups, images, '',
|
|
sounds, true, S('Outer Rice Stack Stair'))
|
|
stairs.register_slab('rice_stack', recipe, groups, images, S('Rice Stack Slab'),
|
|
sounds, true)
|
|
end
|
|
end
|
|
|
|
-- crate
|
|
x_farming.register_crate('crate_rice_3', {
|
|
description = S('Rice Crate'),
|
|
short_description = S('Rice Crate'),
|
|
tiles = { 'x_farming_crate_rice_3.png' },
|
|
_custom = {
|
|
crate_item = 'x_farming:rice'
|
|
}
|
|
})
|
|
|
|
-- bag
|
|
x_farming.register_bag('bag_rice_grains', {
|
|
description = S('Rice Grain') .. ' Bag',
|
|
short_description = S('Rice Grain') .. ' Bag',
|
|
tiles = { 'x_farming_bag_rice_grains.png' },
|
|
_custom = {
|
|
bag_item = 'x_farming:rice_grains'
|
|
}
|
|
})
|
|
|
|
minetest.register_decoration(asuna.features.crops.rice.inject_decoration({
|
|
deco_type = "simple",
|
|
sidelen = 8,
|
|
spawn_by = {"default:water_source", "default:river_water_source",
|
|
"default:water_flowing", "default:river_water_flowing", "default:papyrus", "default:jungletree"},
|
|
place_offset_y = -1,
|
|
noise_params = {
|
|
offset = -0.4125,
|
|
scale = 0.3575,
|
|
spread = {x = 14, y = 14, z = 14},
|
|
seed = 1112,
|
|
octaves = 2,
|
|
persist = 0.62,
|
|
lacunarity = 0.675,
|
|
},
|
|
flags = "place_center_x,place_center_z,force_placement",
|
|
y_max = 0,
|
|
y_min = 0,
|
|
decoration = {
|
|
"x_farming:rice_7",
|
|
"x_farming:rice_8",
|
|
},
|
|
}))
|