EinsDreiDreiSieben/mods/x_farming/ice_fishing.lua
2025-05-10 22:28:50 +02:00

1112 lines
38 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())
---ICE FISHING
local icefishing = {
drops = {
treasure = {
"default:mese_crystal",
"default:diamond",
"x_farming:diamond_angler",
"x_farming:goldfish",
"x_farming:true_goldfish",
"x_farming:rusty_skullfin",
"x_farming:slimefish",
"x_farming:illager_ghostfish",
"x_farming:father_sun",
"x_farming:mother_moon",
},
tier_1 = {
"default:stick",
"default:wood",
"default:coral_brown",
"default:coral_orange",
"default:coral_skeleton",
"bones:bones",
"default:clay",
"x_farming:sea_cucumber",
"default:sand_with_kelp"
},
tier_2 = {
"x_farming:shrimp",
"x_farming:anchovy",
"x_farming:albacore",
"x_farming:black_seashroom",
"x_farming:blue_seashroom",
"x_farming:brown_seashroom",
"x_farming:cyan_seashroom",
"x_farming:gray_seashroom",
"x_farming:light_gray_seashroom",
"x_farming:green_seashroom",
"x_farming:lime_seashroom",
"x_farming:magenta_seashroom",
"x_farming:orange_seashroom",
"x_farming:pink_seashroom",
"x_farming:purple_seashroom",
"x_farming:red_seashroom",
"x_farming:white_seashroom",
"x_farming:yellow_seashroom",
"default:sand_with_kelp"
},
tier_3 = {
"x_farming:goldeye",
"x_farming:halibut",
"x_farming:herring",
"x_farming:ironfish",
"x_farming:pearlwog",
"x_farming:blobfish",
"x_farming:tancho_koi",
"x_farming:pike",
},
tier_4 = {
"x_farming:red_mullet",
"x_farming:rainbow_trout",
"x_farming:crab",
"x_farming:lobster",
"x_farming:stingray",
"x_farming:tilapia",
"x_farming:obster",
"x_farming:totemfish",
}
},
biomes = {
["icesheet_ocean"] = {
"x_farming:angler",
"x_farming:frozen_boneminnow",
"x_farming:frozen_ocean_hermit_crab",
"x_farming:paddlefish",
"x_farming:pearl_isopod",
},
["taiga_ocean"] = {
"x_farming:armored_catfish",
"x_farming:gar",
"x_farming:giant_moray",
"x_farming:perch",
"x_farming:piglish",
},
["desert_ocean"] = {
"x_farming:arrow_squid",
"x_farming:desert_frog",
"x_farming:desert_sunfish",
"x_farming:piranha",
"x_farming:prismfish",
"x_farming:pumpkinseed",
},
["tundra_ocean"] = {
"x_farming:barracuda",
"x_farming:flier",
"x_farming:floral_faefish",
"x_farming:flounder",
"x_farming:fourhorn_sculpin",
},
["snowy_grassland_ocean"] = {
"x_farming:grass_pickerel",
"x_farming:guppy",
"x_farming:hagfish",
"x_farming:rainbowfish",
"x_farming:red_snapper",
},
["coniferous_forest_ocean"] = {
"x_farming:bream",
"x_farming:redbreast_sunfish",
"x_farming:rockfish",
"x_farming:rohu",
"x_farming:rosefish",
},
["grassland_ocean"] = {
"x_farming:conger",
"x_farming:sablefish",
"x_farming:sardine",
"x_farming:sawfish",
"x_farming:skate",
"x_farming:skullfin",
},
["savanna_ocean"] = {
"x_farming:chorus_snail",
"x_farming:white_bullhead",
"x_farming:whitefish",
"x_farming:wolffish",
"x_farming:woodskip",
},
["cold_desert_ocean"] = {
"x_farming:chub",
"x_farming:cold_ocean_hermit_crab",
"x_farming:oscar",
"x_farming:leerfish",
},
["sandstone_desert_ocean"] = {
"x_farming:clam",
"x_farming:skykoi",
"x_farming:smallmouth_bass",
"x_farming:sterlet",
},
["deciduous_forest_ocean"] = {
"x_farming:crayfish",
"x_farming:damselfish",
"x_farming:danios",
"x_farming:vampire_squid",
"x_farming:walleye",
"x_farming:warm_ocean_hermit_crab",
},
["rainforest_ocean"] = {
"x_farming:burbot",
"x_farming:koi",
"x_farming:lamprey",
"x_farming:largemouth_bass",
"x_farming:lava_eel",
"x_farming:leech",
},
["rainforest_swamp"] = {
"x_farming:swamp_darter",
"x_farming:swamp_frog",
"x_farming:sturgeon",
"x_farming:sunfish",
"x_farming:swordfish",
},
["icesheet"] = {
"x_farming:dwarf_caiman",
"x_farming:eel",
"x_farming:electric_eel",
"x_farming:endray",
"x_farming:tench",
},
["tundra_beach"] = {
"x_farming:carp",
"x_farming:catfish",
"x_farming:catla",
"x_farming:ocean_hermit_crab",
"x_farming:octopus",
},
["savanna_shore"] = {
"x_farming:angelfish",
"x_farming:lingcod",
"x_farming:lukewarm_ocean_hermit_crab",
"x_farming:magma_slimefish",
"x_farming:manta_ray",
},
["deciduous_forest_shore"] = {
"x_farming:congo_tiger_fish",
"x_farming:convict_cichlid",
"x_farming:minnow",
"x_farming:mud_flounder",
"x_farming:neon_tetra",
},
}
}
---how often node timers for plants will tick, +/- some random value
function icefishing.tick(pos)
minetest.get_node_timer(pos):start(math.random(166, 286))
end
---how often a growth failure tick is retried (e.g. too dark)
function icefishing.tick_again(pos)
minetest.get_node_timer(pos):start(math.random(40, 80))
end
icefishing.on_construct = function(pos)
local under = { x = pos.x, y = pos.y - 1, z = pos.z }
local biome_data = minetest.get_biome_data(under)
if not biome_data then
return
end
local biome_name = minetest.get_biome_name(biome_data.biome)
if not biome_name then
return
end
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Biome") .. ": "
.. string.gsub(string.gsub(biome_name, "(_)", " "), "(%a)([%w_']*)", x_farming.tchelper))
end
icefishing.after_destruct = function(pos, oldnode, oldmetadata, digger)
local max_steps = 9
local current_step = tonumber(string.reverse(string.reverse(oldnode.name):split("_")[1]))
---is a seed
if not current_step then
minetest.add_item(pos, ItemStack("x_farming:seed_icefishing"))
return
end
---too short for getting a fish or junk (tier_1)
if current_step < 6 then
minetest.add_item(pos, ItemStack("x_farming:seed_icefishing"))
return
end
---get ice nodes around
local under = { x = pos.x, y = pos.y - 1, z = pos.z }
local biome_data = minetest.get_biome_data(under)
if not biome_data then
return
end
local biome_name = minetest.get_biome_name(biome_data.biome)
local positions = minetest.find_nodes_in_area_under_air(
{ x = under.x - 1, y = under.y, z = under.z - 1 },
{ x = under.x + 1, y = under.y, z = under.z + 1 },
{ 'default:ice', 'group:ice' }
)
---subtract 1 - not including the node where the icefishing was
local rarity = 8 - (current_step - 1) * 7 / (max_steps - 1)
rarity = math.floor(rarity)
local positions_count = #positions - 1
local items_to_drop = {}
local tier = 1
---tiers
if current_step == max_steps then
if positions_count >= 4 and positions_count < 6 then
tier = 2
elseif positions_count >= 6 and positions_count < 8 then
tier = 3
elseif positions_count >= 8 then
tier = 4
end
end
---initial item to drop
local tier_items = icefishing.drops["tier_" .. tier]
local biome_items = icefishing.biomes[biome_name]
---add specific biome items
if biome_items ~= nil and tier == 4 then
tier_items = x_farming.mergeTables(tier_items, biome_items)
end
local tier_item = tier_items[math.random(1, #tier_items)]
table.insert(items_to_drop, tier_item)
---rarity - add extra item from list of items to drop
if math.random(1, rarity) == 1 then
local random_item = items_to_drop[math.random(1, #items_to_drop)]
table.insert(items_to_drop, random_item)
end
---50% chance to drop the ice fishing equipment
if math.random(1, 2) == 1 then
table.insert(items_to_drop, "x_farming:seed_icefishing")
end
---treasure chance (10%)
if math.random(1, 10) == 1 and tier == 4 then
local random_items = icefishing.drops.treasure
local random_item = random_items[math.random(1, #random_items)]
table.insert(items_to_drop, random_item)
end
for i, v in ipairs(items_to_drop) do
local obj = minetest.add_item(pos, ItemStack(v))
if obj and minetest.registered_items[v] then
if obj then
obj:set_velocity({
x = math.random(-1, 1),
y = 2,
z = math.random(-1, 1),
})
end
else
minetest.log('warning', '[x_farming] Tried to drop non-existing item "' .. dump(v) .. '" ')
end
end
end
---Seed placement
icefishing.place_seed = function(itemstack, placer, pointed_thing, plantname)
local pt = pointed_thing
---check if pointing at a node
if not pt then
return itemstack
end
if pt.type ~= "node" then
return itemstack
end
local under = minetest.get_node(pt.under)
local above = minetest.get_node(pt.above)
local player_name = placer and placer:get_player_name() or ""
if minetest.is_protected(pt.under, player_name) then
minetest.record_protection_violation(pt.under, player_name)
return
end
if minetest.is_protected(pt.above, player_name) then
minetest.record_protection_violation(pt.above, player_name)
return
end
---return if any of the nodes is not registered
if not minetest.registered_nodes[under.name] then
return itemstack
end
if not minetest.registered_nodes[above.name] then
return itemstack
end
---check if pointing at the top of the node
if pt.above.y ~= pt.under.y + 1 then
return itemstack
end
---check if you can replace the node above the pointed node
if not minetest.registered_nodes[above.name].buildable_to then
return itemstack
end
---check if pointing at soil
if under.name ~= "x_farming:drilled_ice" then
return itemstack
end
---add the node and remove 1 item from the itemstack
minetest.log("action", player_name .. " places node " .. plantname .. " at " ..
minetest.pos_to_string(pt.above))
minetest.add_node(pt.above, { name = plantname, param2 = 1 })
icefishing.tick(pt.above)
if not (creative and creative.is_enabled_for
and creative.is_enabled_for(player_name)) then
itemstack:take_item()
end
return itemstack
end
icefishing.grow_plant = 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 soil_node = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z })
if not soil_node then
icefishing.tick_again(pos)
return
end
---omitted is a check for light, we assume seeds can germinate in the dark.
for _, v in pairs(def.fertility) do
if minetest.get_item_group(soil_node.name, v) ~= 0 then
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
icefishing.tick(pos)
return
end
end
end
return
end
---check if on ice
local below = minetest.get_node({ x = pos.x, y = pos.y - 1, z = pos.z })
if below.name ~= "x_farming:drilled_ice" then
icefishing.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
icefishing.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)
minetest.add_particlespawner({
amount = 7,
time = 3,
minpos = { x = pos.x - 0.2, y = pos.y - 0.2, z = pos.z - 0.2 },
maxpos = { x = pos.x + 0.2, y = pos.y - 0.4, z = pos.z + 0.2 },
minacc = { x = -0.1, y = 0.1, z = -0.1 },
maxacc = { x = 0.1, y = 0.1, z = 0.1 },
minexptime = 0.4,
maxexptime = 0.8,
minsize = 1.5,
maxsize = 2,
texture = 'bubble.png'
})
---new timer needed?
if minetest.registered_nodes[def.next_plant].next_plant then
icefishing.tick(pos)
end
return
end
---Items / Harvest
local fishes = {
{ name = "crab", item_eat = 1, item_eat_cooked = 6 },
{ name = "goldeye", item_eat = 1, item_eat_cooked = 3 },
{ name = "halibut", item_eat = 1, item_eat_cooked = 6 },
{ name = "herring", item_eat = 1, item_eat_cooked = 3 },
{ name = "rainbow_trout", item_eat = 1, item_eat_cooked = 6 },
{ name = "red_mullet", item_eat = 1, item_eat_cooked = 6 },
{ name = "shrimp", item_eat = 1, item_eat_cooked = 2 },
{ name = "swamp_frog", item_eat = 1, item_eat_cooked = 2 },
{ name = "swamp_darter", item_eat = 1, item_eat_cooked = 4 },
{ name = "jungle_frog", item_eat = 1, item_eat_cooked = 2 },
{ name = "albacore", item_eat = 1, item_eat_cooked = 4 },
{ name = "anchovy", item_eat = 1, item_eat_cooked = 4 },
{ name = "angelfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "angler", item_eat = 1, item_eat_cooked = 4 },
{ name = "armored_catfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "arrow_squid", item_eat = 1, item_eat_cooked = 8 },
{ name = "barracuda", item_eat = 1, item_eat_cooked = 4 },
{ name = "black_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "blobfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "blue_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "bream", item_eat = 1, item_eat_cooked = 4 },
{ name = "brown_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "burbot", item_eat = 1, item_eat_cooked = 4 },
{ name = "carp", item_eat = 1, item_eat_cooked = 4 },
{ name = "catfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "catla", item_eat = 1, item_eat_cooked = 4 },
{ name = "chorus_snail", item_eat = 1, item_eat_cooked = 2 },
{ name = "chub", item_eat = 1, item_eat_cooked = 4 },
{ name = "clam", item_eat = 1, item_eat_cooked = 2 },
{ name = "cold_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 },
{ name = "conger", item_eat = 1, item_eat_cooked = 4 },
{ name = "congo_tiger_fish", item_eat = 1, item_eat_cooked = 4 },
{ name = "convict_cichlid", item_eat = 1, item_eat_cooked = 4 },
{ name = "crayfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "cyan_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "damselfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "danios", item_eat = 1, item_eat_cooked = 4 },
{ name = "desert_frog", item_eat = 1, item_eat_cooked = 2 },
{ name = "desert_sunfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "diamond_angler", item_eat = 1, item_eat_cooked = 8 },
{ name = "dwarf_caiman", item_eat = 1, item_eat_cooked = 4 },
{ name = "eel", item_eat = 1, item_eat_cooked = 4 },
{ name = "electric_eel", item_eat = 1, item_eat_cooked = 4 },
{ name = "endray", item_eat = 1, item_eat_cooked = 5 },
{ name = "father_sun", item_eat = 1, item_eat_cooked = 10 },
{ name = "flier", item_eat = 1, item_eat_cooked = 4 },
{ name = "floral_faefish", item_eat = 1, item_eat_cooked = 4 },
{ name = "flounder", item_eat = 1, item_eat_cooked = 4 },
{ name = "fourhorn_sculpin", item_eat = 1, item_eat_cooked = 4 },
{ name = "frozen_boneminnow", item_eat = 1, item_eat_cooked = 4 },
{ name = "frozen_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 },
{ name = "gar", item_eat = 1, item_eat_cooked = 4 },
{ name = "giant_moray", item_eat = 1, item_eat_cooked = 6 },
{ name = "goldfish", item_eat = 1, item_eat_cooked = 8 },
{ name = "grass_pickerel", item_eat = 1, item_eat_cooked = 4 },
{ name = "gray_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "green_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "guppy", item_eat = 1, item_eat_cooked = 4 },
{ name = "hagfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "illager_ghostfish", item_eat = 1, item_eat_cooked = 10 },
{ name = "ironfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "koi", item_eat = 1, item_eat_cooked = 4 },
{ name = "lamprey", item_eat = 1, item_eat_cooked = 4 },
{ name = "largemouth_bass", item_eat = 1, item_eat_cooked = 4 },
{ name = "lava_eel", item_eat = 1, item_eat_cooked = 6 },
{ name = "leech", item_eat = 1, item_eat_cooked = 4 },
{ name = "leerfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "light_gray_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "lime_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "lingcod", item_eat = 1, item_eat_cooked = 4 },
{ name = "lobster", item_eat = 1, item_eat_cooked = 8 },
{ name = "lukewarm_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 },
{ name = "magenta_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "magma_slimefish", item_eat = 1, item_eat_cooked = 4 },
{ name = "manta_ray", item_eat = 1, item_eat_cooked = 4 },
{ name = "minnow", item_eat = 1, item_eat_cooked = 4 },
{ name = "mother_moon", item_eat = 1, item_eat_cooked = 10 },
{ name = "mud_flounder", item_eat = 1, item_eat_cooked = 4 },
{ name = "neon_tetra", item_eat = 1, item_eat_cooked = 4 },
{ name = "obster", item_eat = 1, item_eat_cooked = 4 },
{ name = "ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 },
{ name = "octopus", item_eat = 1, item_eat_cooked = 8 },
{ name = "orange_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "oscar", item_eat = 1, item_eat_cooked = 4 },
{ name = "paddlefish", item_eat = 1, item_eat_cooked = 4 },
{ name = "pearl_isopod", item_eat = 1, item_eat_cooked = 4 },
{ name = "pearlwog", item_eat = 1, item_eat_cooked = 4 },
{ name = "perch", item_eat = 1, item_eat_cooked = 4 },
{ name = "piglish", item_eat = 1, item_eat_cooked = 4 },
{ name = "pike", item_eat = 1, item_eat_cooked = 4 },
{ name = "pink_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "piranha", item_eat = 1, item_eat_cooked = 6 },
{ name = "prismfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "pumpkinseed", item_eat = 1, item_eat_cooked = 4 },
{ name = "purple_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "rainbowfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "red_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "red_snapper", item_eat = 1, item_eat_cooked = 6 },
{ name = "redbreast_sunfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "rockfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "rohu", item_eat = 1, item_eat_cooked = 4 },
{ name = "rosefish", item_eat = 1, item_eat_cooked = 4 },
{ name = "rusty_skullfin", item_eat = 1, item_eat_cooked = 10 },
{ name = "sablefish", item_eat = 1, item_eat_cooked = 4 },
{ name = "sardine", item_eat = 1, item_eat_cooked = 4 },
{ name = "sawfish", item_eat = 1, item_eat_cooked = 5 },
{ name = "sea_cucumber", item_eat = 1, item_eat_cooked = 2 },
{ name = "skate", item_eat = 1, item_eat_cooked = 4 },
{ name = "skullfin", item_eat = 1, item_eat_cooked = 4 },
{ name = "skykoi", item_eat = 1, item_eat_cooked = 4 },
{ name = "slimefish", item_eat = 1, item_eat_cooked = 8 },
{ name = "smallmouth_bass", item_eat = 1, item_eat_cooked = 4 },
{ name = "sterlet", item_eat = 1, item_eat_cooked = 4 },
{ name = "stingray", item_eat = 1, item_eat_cooked = 6 },
{ name = "sturgeon", item_eat = 1, item_eat_cooked = 4 },
{ name = "sunfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "swordfish", item_eat = 1, item_eat_cooked = 6 },
{ name = "tancho_koi", item_eat = 1, item_eat_cooked = 4 },
{ name = "tench", item_eat = 1, item_eat_cooked = 4 },
{ name = "tilapia", item_eat = 1, item_eat_cooked = 4 },
{ name = "totemfish", item_eat = 1, item_eat_cooked = 4 },
{ name = "true_goldfish", item_eat = 1, item_eat_cooked = 10 },
{ name = "vampire_squid", item_eat = 1, item_eat_cooked = 6 },
{ name = "walleye", item_eat = 1, item_eat_cooked = 4 },
{ name = "warm_ocean_hermit_crab", item_eat = 1, item_eat_cooked = 2 },
{ name = "white_bullhead", item_eat = 1, item_eat_cooked = 4 },
{ name = "white_seashroom", item_eat = 1, item_eat_cooked = 3 },
{ name = "whitefish", item_eat = 1, item_eat_cooked = 4 },
{ name = "wolffish", item_eat = 1, item_eat_cooked = 4 },
{ name = "woodskip", item_eat = 1, item_eat_cooked = 4 },
{ name = "yellow_seashroom", item_eat = 1, item_eat_cooked = 3 },
}
for i, def in ipairs(fishes) do
local name = "x_farming:" .. def.name
local desc = string.gsub(string.gsub(def.name, "(_)", " "), "(%a)([%w_']*)", x_farming.tchelper)
local img = "x_farming_fish_" .. def.name .. ".png"
-- raw
local raw_fish_def = {
description = desc .. "\n"
.. minetest.colorize(x_farming.colors.brown, S("Hunger") .. ": " .. def.item_eat),
tiles = { img },
inventory_image = img,
wield_image = img .. "^[transformFXR90",
groups = {
-- X Farming
fish = 1,
-- MCL
food = 2,
eatable = 2,
smoker_cookable = 1
},
_mcl_saturation = 0.4
}
if minetest.get_modpath('farming') then
raw_fish_def.on_use = minetest.item_eat(def.item_eat)
end
if minetest.get_modpath('mcl_farming') then
raw_fish_def.on_place = minetest.item_eat(def.item_eat)
raw_fish_def.on_secondary_use = minetest.item_eat(def.item_eat)
end
minetest.register_craftitem(name, raw_fish_def)
-- hbhunger
if x_farming.hbhunger ~= nil then
if hbhunger.register_food ~= nil then
hbhunger.register_food(name, def.item_eat)
end
end
-- hunger_ng
if x_farming.hunger_ng ~= nil then
hunger_ng.add_hunger_data(name, { satiates = def.item_eat })
end
if def.item_eat_cooked ~= nil then
-- cooked
local cooked_fish_def = {
description = S("Cooked") .. " " .. desc .. "\n"
.. minetest.colorize(x_farming.colors.brown, S("Hunger") .. ": "
.. def.item_eat_cooked),
tiles = { img },
inventory_image = img .. '^[colorize:#3B2510:204' ..
'^(' .. img .. '^[colorize:#FFFFFF:255^[mask:x_farming_cooked_mask.png^[opacity:191)',
wield_image = img .. '^[transformFXR90^[colorize:#3B2510:204' ..
'^(' .. img .. '^[colorize:#FFFFFF:255^[mask:x_farming_cooked_mask.png^[opacity:191)',
groups = {
-- MCL
food = 2,
eatable = 5,
food_fish = 1
},
_mcl_saturation = 6,
}
if minetest.get_modpath('farming') then
cooked_fish_def.on_use = minetest.item_eat(def.item_eat_cooked)
end
if minetest.get_modpath('mcl_farming') then
cooked_fish_def.on_place = minetest.item_eat(def.item_eat_cooked)
cooked_fish_def.on_secondary_use = minetest.item_eat(def.item_eat_cooked)
end
minetest.register_craftitem(name .. "_cooked", cooked_fish_def)
minetest.register_craft({
type = "cooking",
cooktime = 15,
output = name .. "_cooked",
recipe = name
})
---hbhunger
if x_farming.hbhunger ~= nil then
if hbhunger.register_food ~= nil then
hbhunger.register_food(name .. "_cooked", def.item_eat_cooked)
end
end
-- hunger_ng
if x_farming.hunger_ng ~= nil then
hunger_ng.add_hunger_data(name .. "_cooked", { satiates = def.item_eat_cooked })
end
end
end
---Ice fishing equipment
icefishing.register_equipment = function(name, def)
local mname = name:split(":")[1]
local pname = name:split(":")[2]
---Register seed
local lbm_nodes = { mname .. ":seed_" .. pname }
minetest.register_node(mname .. ":seed_" .. pname, {
description = def.description,
---top, bottom, sides
tiles = {
"x_farming_icefishing_bottom.png",
"x_farming_icefishing_bottom.png",
"x_farming_icefishing_right.png",
"x_farming_icefishing_left.png",
"x_farming_icefishing_front_0.png",
"x_farming_icefishing_back_0.png"
},
use_texture_alpha = 'clip',
inventory_image = "x_farming_icefishing_inv.png",
wield_image = "x_farming_icefishing_inv.png",
drawtype = "nodebox",
groups = {
-- MTG
seed = 1,
snappy = 3,
plant = 1,
attached_node = 1,
-- MCL
handy = 1,
shearsy = 1,
deco_block = 1,
dig_by_water = 1,
destroy_by_lava_flow = 1,
dig_by_piston = 1
},
_mcl_blast_resistance = 0,
_mcl_hardness = 0,
paramtype = "light",
walkable = false,
sunlight_propagates = true,
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 },
{ -0.5, -0.375, 0, 0.5, 0.5, 0 },
{ 0, -0.375, -0.5, 0, -0.25, 0.5 },
}
},
collision_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 },
},
},
selection_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 },
},
},
fertility = { "ice_fishing" },
drop = "",
sounds = x_farming.node_sound_wood_defaults(),
next_plant = mname .. ":" .. pname .. "_1",
on_timer = icefishing.grow_plant,
minlight = 13,
maxlight = 15,
on_place = function(itemstack, placer, pointed_thing)
local under = pointed_thing.under
local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name]
if udef and udef.on_rightclick
and not (placer and placer:is_player()
and placer:get_player_control().sneak)
then
return udef.on_rightclick(under, node, placer, itemstack, pointed_thing) or itemstack
end
return icefishing.place_seed(itemstack, placer, pointed_thing, "x_farming:seed_icefishing")
end,
on_construct = icefishing.on_construct,
after_destruct = icefishing.after_destruct,
})
---Register growing steps
for i = 1, def.steps do
local next_plant = nil
local last_step = i == def.steps
if i < def.steps then
next_plant = mname .. ":" .. pname .. "_" .. (i + 1)
lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i
end
local tiles = {
{
name = "x_farming_icefishing_top_animated.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
},
{ name = mname .. "_" .. pname .. "_bottom.png" },
{ name = mname .. "_" .. pname .. "_right.png" },
{ name = mname .. "_" .. pname .. "_left.png" },
{ name = mname .. "_" .. pname .. "_front_" .. i .. ".png" },
{ name = mname .. "_" .. pname .. "_back_" .. i .. ".png" },
}
if last_step then
tiles[1] = {
name = "x_farming_icefishing_top_animated_9.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
}
end
minetest.register_node(mname .. ":" .. pname .. "_" .. i, {
drawtype = "nodebox",
---Textures of node; +Y, -Y, +X, -X, +Z, -Z
---Textures of node; top, bottom, right, left, front, back
tiles = tiles,
use_texture_alpha = 'clip',
paramtype = "light",
walkable = false,
buildable_to = true,
sunlight_propagates = true,
on_rotate = function(pos, node, user, mode, new_param2)
return false
end,
drop = "",
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 },
{ -0.5, -0.375, 0, 0.5, 0.5, 0 },
{ 0, -0.375, -0.5, 0, -0.25, 0.5 },
}
},
collision_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 },
},
},
selection_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 },
},
},
groups = {
-- MTG
seed = 1,
snappy = 3,
plant = 1,
attached_node = 1,
not_in_creative_inventory = 1,
-- MCL
handy = 1,
shearsy = 1,
deco_block = 1,
dig_by_water = 1,
destroy_by_lava_flow = 1,
dig_by_piston = 1
},
_mcl_blast_resistance = 0,
_mcl_hardness = 0,
sounds = x_farming.node_sound_leaves_defaults(),
next_plant = next_plant,
on_timer = icefishing.grow_plant,
minlight = 13,
maxlight = 15,
after_destruct = icefishing.after_destruct,
})
end
---replacement LBM for pre-nodetimer plants
minetest.register_lbm({
name = mname .. ":start_nodetimer_" .. pname,
nodenames = lbm_nodes,
action = function(pos, node)
icefishing.tick_again(pos)
end,
})
---Return
local r = {
seed = mname .. ":seed_" .. pname
}
return r
end
icefishing.register_equipment("x_farming:icefishing", {
description = S("Ice Fishing (Place on drilled Ice)"),
steps = 9,
})
---nodes
minetest.register_node("x_farming:drilled_ice", {
description = S("Drilled Ice"),
tiles = {
{ name = "x_farming_ice.png^x_farming_drilled_ice.png", tileable_vertical = false },
"x_farming_ice.png",
"x_farming_ice.png",
"x_farming_ice.png",
"x_farming_ice.png",
"x_farming_ice.png",
},
paramtype = "light",
drop = "default:ice",
groups = {
-- MTG
cracky = 3,
cools_lava = 1,
not_in_creative_inventory = 1,
ice_fishing = 1,
-- MCL
handy = 1,
pickaxey = 1,
building_block = 1,
ice = 1,
-- ALL
slippery = 3
},
sounds = x_farming.node_sound_ice_defaults(),
})
---tools
minetest.register_tool("x_farming:ice_auger", {
description = S("Ice Auger drills hole in ice for ice fishing."),
inventory_image = "x_farming_ice_auger.png",
wield_image = "x_farming_ice_auger.png^[transformR270",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
if not user then
return
end
local pt = pointed_thing
---check if pointing at a node
if not pt then
return
end
if pt.type ~= "node" then
return
end
local uses = 500
local under = minetest.get_node(pt.under)
local p = { x = pt.under.x, y = pt.under.y + 1, z = pt.under.z }
local above = minetest.get_node(p)
---return if any of the nodes is not registered
if not minetest.registered_nodes[under.name] then
return
end
if not minetest.registered_nodes[above.name] then
return
end
---check if the node above the pointed thing is air
if above.name ~= "air" then
return
end
---check if pointing at soil
if under.name ~= "default:ice" and minetest.get_item_group(under.name, 'ice') == 0 then
return
end
if minetest.is_protected(pt.under, user:get_player_name()) then
minetest.record_protection_violation(pt.under, user:get_player_name())
return
end
if minetest.is_protected(pt.above, user:get_player_name()) then
minetest.record_protection_violation(pt.above, user:get_player_name())
return
end
---turn the node into soil and play sound
minetest.set_node(pt.under, { name = "x_farming:drilled_ice" })
minetest.sound_play("x_farming_ice_dug", {
pos = pt.under,
gain = 0.5,
}, true)
minetest.add_particlespawner({
amount = 10,
time = 0.5,
minpos = { x = pt.above.x - 0.4, y = pt.above.y - 0.4, z = pt.above.z - 0.4 },
maxpos = { x = pt.above.x + 0.4, y = pt.above.y - 0.5, z = pt.above.z + 0.4 },
minvel = { x = 0, y = 1, z = 0 },
maxvel = { x = 0, y = 2, z = 0 },
minacc = { x = 0, y = -4, z = 0 },
maxacc = { x = 0, y = -8, z = 0 },
minexptime = 1,
maxexptime = 1.5,
node = { name = "default:snowblock" },
collisiondetection = true,
object_collision = true,
})
if not (creative and creative.is_enabled_for and creative.is_enabled_for(user:get_player_name())) then
---wear tool
local wdef = itemstack:get_definition()
itemstack:add_wear(65535 / (uses - 1))
---tool break sound
if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks, { pos = pt.above,
gain = 0.5 }, true)
end
end
return itemstack
end,
sound = { breaks = "default_tool_breaks" },
})
minetest.register_craft({
output = "x_farming:ice_auger",
recipe = {
{ "group:stick", "default:coalblock", "group:stick" },
{ "", "default:steel_ingot", "" },
{ "", "default:steel_ingot", "" },
}
})
---crate
x_farming.register_crate('crate_fish_3', {
description = S('Fish Crate'),
tiles = { 'x_farming_crate_fish_3.png' },
})
minetest.register_on_mods_loaded(function()
local deco_place_on = {}
local deco_biomes = {}
-- MTG
if minetest.get_modpath('default') then
table.insert(deco_place_on, 'default:ice')
table.insert(deco_place_on, 'default:snowblock')
table.insert(deco_place_on, 'default:snow')
table.insert(deco_place_on, 'default:dirt_with_snow')
table.insert(deco_biomes, 'icesheet')
table.insert(deco_biomes, 'snowy_grassland')
table.insert(deco_biomes, 'icesheet_ocean')
end
-- Everness
if minetest.get_modpath('everness') then
table.insert(deco_place_on, 'everness:frosted_snowblock')
table.insert(deco_biomes, 'everness:frosted_icesheet')
end
-- MCL
if minetest.get_modpath('mcl_core') then
table.insert(deco_place_on, 'mcl_core:snow')
table.insert(deco_biomes, 'IcePlains')
end
if next(deco_place_on) and next(deco_biomes) then
minetest.register_decoration({
name = 'x_farming:icefishing',
deco_type = 'schematic',
place_on = deco_place_on,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.0025,
spread = { x = 100, y = 100, z = 100 },
seed = 2,
octaves = 3,
persist = 0.7
},
biomes = deco_biomes,
y_max = 30,
y_min = 1,
schematic = minetest.get_modpath('x_farming') .. '/schematics/x_farming_icefishing.mts',
flags = 'force_placement',
rotation = 'random',
})
end
end)