--[[ 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", }, }))