944 lines
28 KiB
Lua
944 lines
28 KiB
Lua
-- 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",
|
|
"flowers:waterlily",
|
|
"default:coral_brown",
|
|
"default:coral_orange",
|
|
"default:coral_skeleton",
|
|
"bones:bones",
|
|
"default:clay",
|
|
"x_farming:sea_cucumber",
|
|
},
|
|
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",
|
|
},
|
|
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(80, 160))
|
|
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)
|
|
local biome_name = minetest.get_biome_name(biome_data.biome)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("infotext", "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.item_drop(ItemStack("x_farming:seed_icefishing"), nil, pos)
|
|
return
|
|
end
|
|
|
|
-- too short for getting a fish or junk (tier_1)
|
|
if current_step < 6 then
|
|
minetest.item_drop(ItemStack("x_farming:seed_icefishing"), nil, pos)
|
|
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)
|
|
local biome_name = minetest.get_biome_name(biome_data.biome)
|
|
local pos1 = vector.add(pos, 1)
|
|
local pos2 = vector.subtract(pos, 1)
|
|
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"
|
|
)
|
|
-- 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
|
|
minetest.register_craftitem(name, {
|
|
description = desc .. "\n" .. minetest.colorize(x_farming.colors.brown, "Hunger: " .. def.item_eat),
|
|
tiles = {img},
|
|
inventory_image = img,
|
|
wield_image = img .. "^[transformFXR90",
|
|
on_use = minetest.item_eat(def.item_eat),
|
|
})
|
|
|
|
-- hbhunger
|
|
if x_farming.hbhunger ~= nil then
|
|
if hbhunger.register_food ~= nil then
|
|
hbhunger.register_food(name, def.item_eat)
|
|
end
|
|
end
|
|
|
|
if def.item_eat_cooked ~= nil then
|
|
-- cooked
|
|
minetest.register_craftitem(name .. "_cooked", {
|
|
description = "Cooked "..desc .. "\n" .. minetest.colorize(x_farming.colors.brown, "Hunger: " .. def.item_eat_cooked),
|
|
tiles = {img},
|
|
inventory_image = img .. "^[colorize:#3B2510:204",
|
|
wield_image = img .. "^[transformFXR90^[colorize:#3B2510:204",
|
|
on_use = minetest.item_eat(def.item_eat_cooked),
|
|
})
|
|
|
|
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
|
|
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"
|
|
},
|
|
inventory_image = "x_farming_icefishing_inv.png",
|
|
wield_image = "x_farming_icefishing_inv.png",
|
|
drawtype = "nodebox",
|
|
groups = {seed = 1, snappy = 3, plant = 1, attached_node = 1},
|
|
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 = default.node_sound_dirt_defaults({
|
|
dig = {name = "", gain = 0},
|
|
dug = {name = "default_grass_footstep", gain = 0.2},
|
|
place = {name = "default_place_node", gain = 0.25},
|
|
}),
|
|
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,
|
|
paramtype = "light",
|
|
walkable = false,
|
|
buildable_to = true,
|
|
sunlight_propagates = true,
|
|
on_rotate = screwdriver.disallow,
|
|
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 = {snappy = 3, plant = 1, not_in_creative_inventory = 1, attached_node = 1},
|
|
sounds = default.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 = "Ice Fishing (Place on drilled Ice)",
|
|
steps = 9,
|
|
})
|
|
|
|
-- nodes
|
|
|
|
minetest.register_node("x_farming:drilled_ice", {
|
|
description = "Drilled Ice",
|
|
tiles = {
|
|
"x_farming_drilled_ice.png",
|
|
"default_ice.png",
|
|
"default_ice.png",
|
|
"default_ice.png",
|
|
"default_ice.png",
|
|
"default_ice.png",
|
|
},
|
|
paramtype = "light",
|
|
drop = "default:ice",
|
|
groups = {cracky = 3, cools_lava = 1, slippery = 3, not_in_creative_inventory = 1, ice_fishing = 1},
|
|
sounds = default.node_sound_ice_defaults(),
|
|
})
|
|
|
|
-- tools
|
|
|
|
minetest.register_tool("x_farming:ice_auger", {
|
|
description = "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)
|
|
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" 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", ""},
|
|
}
|
|
})
|
|
|
|
-- decorations
|
|
|
|
minetest.register_decoration({
|
|
name = "x_farming:icefishing_9",
|
|
deco_type = "schematic",
|
|
place_on = {"default:ice", "default:snowblock", "default:snow", "default:dirt_with_snow"},
|
|
sidelen = 16,
|
|
noise_params = {
|
|
offset = 0,
|
|
scale = 0.0025,
|
|
spread = {x = 100, y = 100, z = 100},
|
|
seed = 2,
|
|
octaves = 3,
|
|
persist = 0.7
|
|
},
|
|
biomes = {"icesheet", "snowy_grassland", "icesheet_ocean"},
|
|
y_max = 30,
|
|
y_min = 1,
|
|
schematic = minetest.get_modpath("x_farming") .. "/schematics/x_farming_icefishing.mts",
|
|
flags = "force_placement",
|
|
rotation = "random",
|
|
})
|