----------------------------------------------------------------------------------------------- local title = "Fishing - Mossmanikin's version" local version = "0.2.3" local mname = "fishing" ----------------------------------------------------------------------------------------------- -- original by wulfsdad (http://forum.minetest.net/viewtopic.php?id=4375) -- this version by Mossmanikin (https://forum.minetest.net/viewtopic.php?id=6480) -- License (code & textures): WTFPL -- Contains code from: animal_clownfish, animal_fish_blue_white, fishing (original), stoneage -- Looked at code from: default, farming -- Dependencies: default -- Supports: animal_clownfish, animal_fish_blue_white, animal_rat, mobs ----------------------------------------------------------------------------------------------- -- todo: item wear done -- automatic re-baiting option done (but not optional) -- different types of fish, done, but not finished -- add sound done -- bobber done -- change rainworms filling inv & make 'em disappear done -- placable fishing rod for decoration done -- make bobber move slowly while fish on hook done -- catch bigger fish with smaller done, but not finished -- change color of bobber when fish on hook done ----------------------------------------------------------------------------------------------- -- Boilerplate to support localized strings if intllib mod is installed. local S if (minetest.get_modpath("intllib")) then dofile(minetest.get_modpath("intllib").."/intllib.lua") S = intllib.Getter(minetest.get_current_modname()) else S = function ( s ) return s end end dofile(minetest.get_modpath("fishing").."/settings.txt") dofile(minetest.get_modpath("fishing").."/bobber.lua") dofile(minetest.get_modpath("fishing").."/bobber_shark.lua") dofile(minetest.get_modpath("fishing").."/crafting.lua") dofile(minetest.get_modpath("fishing").."/fishes.lua") dofile(minetest.get_modpath("fishing").."/worm.lua") dofile(minetest.get_modpath("fishing").."/trophies.lua") ----------------------------------------------------------------------------------------------- -- Fishing Pole ----------------------------------------------------------------------------------------------- local function rod_wear(itemstack, user, pointed_thing, uses) itemstack:add_wear(65535/(uses-1)) return itemstack end --Canne à pêche normal minetest.register_tool("fishing:pole", { description = S("Fishing Pole"), groups = {}, inventory_image = "fishing_pole.png", wield_image = "fishing_pole.png^[transformFXR270", stack_max = 1, liquids_pointable = true, on_use = function (itemstack, user, pointed_thing) if pointed_thing and pointed_thing.under then local pt = pointed_thing local node = minetest.get_node(pt.under) if string.find(node.name, "default:water") then local player = user:get_player_name() local inv = user:get_inventory() if inv:get_stack("main", user:get_wield_index()+1):get_name() == "fishing:bait_worm" then if not minetest.setting_getbool("creative_mode") then inv:remove_item("main", "fishing:bait_worm") end minetest.sound_play("fishing_bobber2", { pos = pt.under, gain = 0.5, }) minetest.add_entity({interval = 1,x=pt.under.x, y=pt.under.y+(45/64), z=pt.under.z}, "fishing:bobber_entity") if WEAR_OUT == true and not minetest.setting_getbool("creative_mode") then return rod_wear(itemstack, user, pointed_thing, 30) else return {name="fishing:pole", count=1, wear=0, metadata=""} end end if inv:get_stack("main", user:get_wield_index()+1):get_name() == "fishing:fish_raw" then if not minetest.setting_getbool("creative_mode") then inv:remove_item("main", "fishing:fish_raw") end minetest.sound_play("fishing_bobber2", { pos = pt.under, gain = 0.5, }) minetest.add_entity({interval = 1,x=pt.under.x, y=pt.under.y+(45/64), z=pt.under.z}, "fishing:bobber_entity_shark") if WEAR_OUT == true and not minetest.setting_getbool("creative_mode") then return rod_wear(itemstack, user, pointed_thing, 30) else return {name="fishing:pole", count=1, wear=0, metadata=""} end end end end return nil end, on_place = function(itemstack, placer, pointed_thing) local pt = pointed_thing if minetest.get_node(pt.under).name~="default:water_source" and minetest.get_node(pt.under).name~="default:water_flowing" then local wear = itemstack:get_wear() --print (wear) local direction = minetest.dir_to_facedir(placer:get_look_dir()) --local meta1 = minetest.get_meta(pt.under) local meta = minetest.get_meta(pt.above) minetest.set_node(pt.above, {name="fishing:pole_deco", param2=direction}) --meta1:set_int("wear", wear) meta:set_int("wear", wear) if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end end return itemstack end, }) --Canne à pêche parfaite minetest.register_tool("fishing:pole_perfect", { description = S("Perfect Fishing Pole"), groups = {}, inventory_image = "fishing_pole_perfect.png", wield_image = "fishing_pole_perfect.png^[transformFXR270", stack_max = 1, liquids_pointable = true, on_use = function (itemstack, user, pointed_thing) if pointed_thing and pointed_thing.under then local pt = pointed_thing local node = minetest.get_node(pt.under) if string.find(node.name, "default:water") then local player = user:get_player_name() local inv = user:get_inventory() if inv:get_stack("main", user:get_wield_index()+1):get_name() == "fishing:bait_worm" then if not minetest.setting_getbool("creative_mode") then inv:remove_item("main", "fishing:bait_worm") end minetest.sound_play("fishing_bobber2", { pos = pt.under, gain = 0.5, }) minetest.add_entity({interval = 1,x=pt.under.x, y=pt.under.y+(45/64), z=pt.under.z}, "fishing:bobber_entity") if WEAR_OUT == true and not minetest.setting_getbool("creative_mode") then return rod_wear(itemstack, user, pointed_thing, 1500) else return {name="fishing:pole_perfect", count=1, wear=0, metadata=""} end end if inv:get_stack("main", user:get_wield_index()+1):get_name() == "fishing:fish_raw" then if not minetest.setting_getbool("creative_mode") then inv:remove_item("main", "fishing:fish_raw") end minetest.sound_play("fishing_bobber2", { pos = pt.under, gain = 0.5, }) minetest.add_entity({interval = 1,x=pt.under.x, y=pt.under.y+(45/64), z=pt.under.z}, "fishing:bobber_entity_shark") if WEAR_OUT == true and not minetest.setting_getbool("creative_mode") then return rod_wear(itemstack, user, pointed_thing, 1500) else return {name="fishing:pole_perfect", count=1, wear=0, metadata=""} end end end end return nil end, on_place = function(itemstack, placer, pointed_thing) local pt = pointed_thing if minetest.get_node(pt.under).name~="default:water_source" and minetest.get_node(pt.under).name~="default:water_flowing" then local wear = itemstack:get_wear() --print (wear) local direction = minetest.dir_to_facedir(placer:get_look_dir()) --local meta1 = minetest.get_meta(pt.under) local meta = minetest.get_meta(pt.above) minetest.set_node(pt.above, {name="fishing:pole_perfect_deco", param2=direction}) --meta1:set_int("wear", wear) meta:set_int("wear", wear) if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end end return itemstack end, }) if SIMPLE_DECO_FISHING_POLE == true then --Canne à pêche deco minetest.register_node("fishing:pole_deco", { description = S("Fishing Pole"), inventory_image = "fishing_pole.png", wield_image = "fishing_pole.png^[transformFXR270", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", tiles = { "fishing_pole_simple.png", "fishing_pole_simple.png", "fishing_pole_simple.png", "fishing_pole_simple.png^[transformFX", }, groups = { snappy=3, flammable=2, not_in_creative_inventory=1 }, node_box = { type = "fixed", fixed = { { 0 , -1/2 , 0 , 0 , 1/2 , 1 }, } }, selection_box = { type = "fixed", fixed = { {-1/16 , -1/2 , 0 , 1/16 , 1/2 , 1 }, } }, sounds = default.node_sound_wood_defaults(), on_dig = function(pos, node, digger) if digger:is_player() and digger:get_inventory() then local meta = minetest.get_meta(pos) local wear_out = meta:get_int("wear") digger:get_inventory():add_item("main", {name="fishing:pole", count=1, wear=wear_out, metadata=""}) end minetest.remove_node(pos) end, }) --Canne à pêche parfaite deco minetest.register_node("fishing:pole_perfect_deco", { description = S("Perfect Fishing Pole"), inventory_image = "fishing_pole_perfect.png", wield_image = "fishing_pole_perfect.png^[transformFXR270", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", tiles = { "fishing_pole_perfect_simple.png", "fishing_pole_perfect_simple.png", "fishing_pole_perfect_simple.png", "fishing_pole_perfect_simple.png^[transformFX", }, groups = { snappy=3, flammable=2, not_in_creative_inventory=1 }, node_box = { type = "fixed", fixed = { { 0 , -1/2 , 0 , 0 , 1/2 , 1 }, } }, selection_box = { type = "fixed", fixed = { {-1/16 , -1/2 , 0 , 1/16 , 1/2 , 1 }, } }, sounds = default.node_sound_wood_defaults(), on_dig = function(pos, node, digger) if digger:is_player() and digger:get_inventory() then local meta = minetest.get_meta(pos) local wear_out = meta:get_int("wear") digger:get_inventory():add_item("main", {name="fishing:pole_perfect", count=1, wear=wear_out, metadata=""}) end minetest.remove_node(pos) end, }) else --Canne à pêche deco minetest.register_node("fishing:pole_deco", { description = S("Fishing Pole"), inventory_image = "fishing_pole.png", wield_image = "fishing_pole.png^[transformFXR270", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", tiles = { "fishing_pole_top.png", "fishing_pole_bottom.png", "fishing_pole_deco.png", -- right "fishing_pole_deco.png^[transformFX", -- left "fishing_pole_back.png", "fishing_pole_front.png" }, node_box = { type = "fixed", -- { left , bottom , front , right , top , back } fixed = { {-1/32 , -1/16 , 14/16 , 1/32 , 6/16 , 15/16}, {-1/32 , -3/16 , 13/16 , 1/32 , -1/16 , 14/16}, {-1/32 , -4/16 , 12/16 , 1/32 , -3/16 , 13/16}, {-1/32 , -5/16 , 11/16 , 1/32 , -4/16 , 12/16}, {-1/32 , -6/16 , 9/16 , 1/32 , -5/16 , 11/16}, {-1/32 , -5/16 , 9/16 , 1/32 , -4/16 , 10/16}, -- stick {-1/32 , 6/16 , 12/16 , 1/32 , 7/16 , 15/16}, -- top {-1/32 , 5/16 , 11/16 , 1/32 , 7/16 , 12/16}, {-1/32 , 5/16 , 10/16 , 1/32 , 6/16 , 11/16}, {-1/32 , 4/16 , 9/16 , 1/32 , 6/16 , 10/16}, {-1/32 , 3/16 , 8/16 , 1/32 , 5/16 , 9/16}, {-1/32 , 2/16 , 7/16 , 1/32 , 4/16 , 8/16}, {-1/32 , 1/16 , 6/16 , 1/32 , 3/16 , 7/16}, {-1/32 , 0 , 5/16 , 1/32 , 2/16 , 6/16}, {-1/32 , -2/16 , 4/16 , 1/32 , 1/16 , 5/16}, {-1/32 , -3/16 , 3/16 , 1/32 , 0 , 4/16}, {-1/32 , -5/16 , 2/16 , 1/32 , -1/16 , 3/16}, {-1/32 , -7/16 , 1/16 , 1/32 , -3/16 , 2/16}, {-1/32 , -1/2 , 0 , 1/32 , -5/16 , 1/16}, -- bottom } }, selection_box = { type = "fixed", fixed = { {-1/16 , -1/2 , 0 , 1/16 , 1/2 , 1 }, } }, groups = { snappy=3, flammable=2, not_in_creative_inventory=1 }, sounds = default.node_sound_wood_defaults(), on_dig = function(pos, node, digger) if digger:is_player() and digger:get_inventory() then local meta = minetest.get_meta(pos) local wear_out = meta:get_int("wear") digger:get_inventory():add_item("main", {name="fishing:pole", count=1, wear=wear_out, metadata=""}) end minetest.remove_node(pos) end, }) --Canne à pêche parfaite deco minetest.register_node("fishing:pole_perfect_deco", { description = S("Perfect Fishing Pole"), inventory_image = "fishing_pole_perfect.png", wield_image = "fishing_pole_perfect.png^[transformFXR270", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", tiles = { "fishing_pole_perfect_top.png", "fishing_pole_perfect_bottom.png", "fishing_pole_perfect_deco.png", -- right "fishing_pole_perfect_deco.png^[transformFX", -- left "fishing_pole_perfect_back.png", "fishing_pole_perfect_front.png" }, node_box = { type = "fixed", -- { left , bottom , front , right , top , back } fixed = { {-1/32 , -1/16 , 14/16 , 1/32 , 6/16 , 15/16}, {-1/32 , -3/16 , 13/16 , 1/32 , -1/16 , 14/16}, {-1/32 , -4/16 , 12/16 , 1/32 , -3/16 , 13/16}, {-1/32 , -5/16 , 11/16 , 1/32 , -4/16 , 12/16}, {-1/32 , -6/16 , 9/16 , 1/32 , -5/16 , 11/16}, {-1/32 , -5/16 , 9/16 , 1/32 , -4/16 , 10/16}, -- stick {-1/32 , 6/16 , 12/16 , 1/32 , 7/16 , 15/16}, -- top {-1/32 , 5/16 , 11/16 , 1/32 , 7/16 , 12/16}, {-1/32 , 5/16 , 10/16 , 1/32 , 6/16 , 11/16}, {-1/32 , 4/16 , 9/16 , 1/32 , 6/16 , 10/16}, {-1/32 , 3/16 , 8/16 , 1/32 , 5/16 , 9/16}, {-1/32 , 2/16 , 7/16 , 1/32 , 4/16 , 8/16}, {-1/32 , 1/16 , 6/16 , 1/32 , 3/16 , 7/16}, {-1/32 , 0 , 5/16 , 1/32 , 2/16 , 6/16}, {-1/32 , -2/16 , 4/16 , 1/32 , 1/16 , 5/16}, {-1/32 , -3/16 , 3/16 , 1/32 , 0 , 4/16}, {-1/32 , -5/16 , 2/16 , 1/32 , -1/16 , 3/16}, {-1/32 , -7/16 , 1/16 , 1/32 , -3/16 , 2/16}, {-1/32 , -1/2 , 0 , 1/32 , -5/16 , 1/16}, -- bottom } }, selection_box = { type = "fixed", fixed = { {-1/16 , -1/2 , 0 , 1/16 , 1/2 , 1 }, } }, groups = { snappy=3, flammable=2, not_in_creative_inventory=1 }, sounds = default.node_sound_wood_defaults(), on_dig = function(pos, node, digger) if digger:is_player() and digger:get_inventory() then local meta = minetest.get_meta(pos) local wear_out = meta:get_int("wear") digger:get_inventory():add_item("main", {name="fishing:pole_perfect", count=1, wear=wear_out, metadata=""}) end minetest.remove_node(pos) end, }) end ----------------------------------------------------------------------------------------------- -- GETTING WORMS ----------------------------------------------------------------------------------------------- -- get worms from digging in dirt: if NEW_WORM_SOURCE == false then minetest.register_node(":default:dirt", { description = S("Dirt"), tiles = {"default_dirt.png"}, is_ground_content = true, groups = {crumbly=3}, sounds = default.node_sound_dirt_defaults(), after_dig_node = function (pos, oldnode, oldmetadata, digger) if math.random(1, 100) < WORM_CHANCE then local tool_in_use = digger:get_wielded_item():get_name() if tool_in_use == "" or tool_in_use == "default:dirt" then if WORM_IS_MOB == true then minetest.add_entity({x = pos.x, y = pos.y+0.4, z = pos.z}, "fishing:bait_worm_entity") else local inv = digger:get_inventory() if inv:room_for_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""}) then inv:add_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""}) end end end end end, }) else -- get worms from digging with hoes: -- turns nodes with group soil=1 into soil local function hoe_on_use(itemstack, user, pointed_thing, uses) local pt = pointed_thing -- check if pointing at a node if not pt then return end if pt.type ~= "node" then return end 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 dirt if minetest.get_item_group(under.name, "soil") ~= 1 then return end -- turn the node into soil, play sound, get worm and wear out item minetest.set_node(pt.under, {name="farming:soil"}) minetest.sound_play("default_dig_crumbly", { pos = pt.under, gain = 0.5, }) if math.random(1, 100) < WORM_CHANCE then if WORM_IS_MOB == true then minetest.add_entity({x=pt.under.x, y=pt.under.y+0.4, z=pt.under.z}, "fishing:bait_worm_entity") else local inv = user:get_inventory() if inv:room_for_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""}) then inv:add_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""}) end end end itemstack:add_wear(65535/(uses-1)) return itemstack end -- didn't change the hoes, just here because hoe_on_use is local minetest.register_tool(":farming:hoe_wood", { description = S("Wooden Hoe"), inventory_image = "farming_tool_woodhoe.png", on_use = function(itemstack, user, pointed_thing) return hoe_on_use(itemstack, user, pointed_thing, 30) end, }) minetest.register_tool(":farming:hoe_stone", { description = S("Stone Hoe"), inventory_image = "farming_tool_stonehoe.png", on_use = function(itemstack, user, pointed_thing) return hoe_on_use(itemstack, user, pointed_thing, 90) end, }) minetest.register_tool(":farming:hoe_steel", { description = S("Steel Hoe"), inventory_image = "farming_tool_steelhoe.png", on_use = function(itemstack, user, pointed_thing) return hoe_on_use(itemstack, user, pointed_thing, 200) end, }) minetest.register_tool(":farming:hoe_bronze", { description = S("Bronze Hoe"), inventory_image = "farming_tool_bronzehoe.png", on_use = function(itemstack, user, pointed_thing) return hoe_on_use(itemstack, user, pointed_thing, 220) end, }) end ----------------------------------------------------------------------------------------------- minetest.log("action", "[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") -----------------------------------------------------------------------------------------------