1112 lines
38 KiB
Lua
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)
|
|
|