init.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. -----------------------------------------------------------------------------------------------
  2. local title = "Fishing - Mossmanikin's version"
  3. local version = "0.2.3"
  4. local mname = "fishing"
  5. -----------------------------------------------------------------------------------------------
  6. -- original by wulfsdad (http://forum.minetest.net/viewtopic.php?id=4375)
  7. -- this version by Mossmanikin (https://forum.minetest.net/viewtopic.php?id=6480)
  8. -- License (code & textures): WTFPL
  9. -- Contains code from: animal_clownfish, animal_fish_blue_white, fishing (original), stoneage
  10. -- Looked at code from: default, farming
  11. -- Dependencies: default
  12. -- Supports: animal_clownfish, animal_fish_blue_white, animal_rat, mobs
  13. -----------------------------------------------------------------------------------------------
  14. -- todo: item wear done
  15. -- automatic re-baiting option done (but not optional)
  16. -- different types of fish, done, but not finished
  17. -- add sound done
  18. -- bobber done
  19. -- change rainworms filling inv & make 'em disappear done
  20. -- placable fishing rod for decoration done
  21. -- make bobber move slowly while fish on hook done
  22. -- catch bigger fish with smaller done, but not finished
  23. -- change color of bobber when fish on hook done
  24. -----------------------------------------------------------------------------------------------
  25. dofile(minetest.get_modpath("fishing").."/settings.txt")
  26. dofile(minetest.get_modpath("fishing").."/bobber.lua")
  27. dofile(minetest.get_modpath("fishing").."/bobber_shark.lua")
  28. dofile(minetest.get_modpath("fishing").."/crafting.lua")
  29. dofile(minetest.get_modpath("fishing").."/fishes.lua")
  30. dofile(minetest.get_modpath("fishing").."/worm.lua")
  31. dofile(minetest.get_modpath("fishing").."/trophies.lua")
  32. -----------------------------------------------------------------------------------------------
  33. -- Fishing Pole
  34. -----------------------------------------------------------------------------------------------
  35. local function rod_wear(itemstack, user, pointed_thing, uses)
  36. itemstack:add_wear(65535/(uses-1))
  37. return itemstack
  38. end
  39. minetest.register_tool("fishing:pole", {
  40. description = "Fishing Pole",
  41. groups = {},
  42. inventory_image = "fishing_pole.png",
  43. wield_image = "fishing_pole.png^[transformFXR270",
  44. stack_max = 1,
  45. liquids_pointable = true,
  46. on_use = function (itemstack, user, pointed_thing)
  47. if pointed_thing and pointed_thing.under then
  48. local pt = pointed_thing
  49. local node = minetest.get_node(pt.under)
  50. if string.find(node.name, "default:water") then
  51. local player = user:get_player_name()
  52. local inv = user:get_inventory()
  53. if inv:get_stack("main", user:get_wield_index()+1):get_name() == "fishing:bait_worm" then
  54. if not minetest.setting_getbool("creative_mode") then
  55. inv:remove_item("main", "fishing:bait_worm")
  56. end
  57. minetest.sound_play("fishing_bobber2", {
  58. pos = pt.under,
  59. gain = 0.5,
  60. })
  61. minetest.add_entity({interval = 1,x=pt.under.x, y=pt.under.y+(45/64), z=pt.under.z}, "fishing:bobber_entity")
  62. if WEAR_OUT == true
  63. and not minetest.setting_getbool("creative_mode") then
  64. return rod_wear(itemstack, user, pointed_thing, 30)
  65. else
  66. return {name="fishing:pole", count=1, wear=0, metadata=""}
  67. end
  68. end
  69. if inv:get_stack("main", user:get_wield_index()+1):get_name() == "fishing:fish_raw" then
  70. if not minetest.setting_getbool("creative_mode") then
  71. inv:remove_item("main", "fishing:fish_raw")
  72. end
  73. minetest.sound_play("fishing_bobber2", {
  74. pos = pt.under,
  75. gain = 0.5,
  76. })
  77. minetest.add_entity({interval = 1,x=pt.under.x, y=pt.under.y+(45/64), z=pt.under.z}, "fishing:bobber_entity_shark")
  78. if WEAR_OUT == true
  79. and not minetest.setting_getbool("creative_mode") then
  80. return rod_wear(itemstack, user, pointed_thing, 30)
  81. else
  82. return {name="fishing:pole", count=1, wear=0, metadata=""}
  83. end
  84. end
  85. end
  86. end
  87. return nil
  88. end,
  89. on_place = function(itemstack, placer, pointed_thing)
  90. local pt = pointed_thing
  91. if minetest.get_node(pt.under).name~="default:water_source" and minetest.get_node(pt.under).name~="default:water_flowing" then
  92. local wear = itemstack:get_wear()
  93. --print (wear)
  94. local direction = minetest.dir_to_facedir(placer:get_look_dir())
  95. --local meta1 = minetest.get_meta(pt.under)
  96. local meta = minetest.get_meta(pt.above)
  97. minetest.set_node(pt.above, {name="fishing:pole_deco", param2=direction})
  98. --meta1:set_int("wear", wear)
  99. meta:set_int("wear", wear)
  100. if not minetest.setting_getbool("creative_mode") then
  101. itemstack:take_item()
  102. end
  103. end
  104. return itemstack
  105. end,
  106. })
  107. if SIMPLE_DECO_FISHING_POLE == true then
  108. minetest.register_node("fishing:pole_deco", {
  109. description = "Fishing Pole",
  110. inventory_image = "fishing_pole.png",
  111. wield_image = "fishing_pole.png^[transformFXR270",
  112. drawtype = "nodebox",
  113. paramtype = "light",
  114. paramtype2 = "facedir",
  115. tiles = {
  116. "fishing_pole_simple.png",
  117. "fishing_pole_simple.png",
  118. "fishing_pole_simple.png",
  119. "fishing_pole_simple.png^[transformFX",
  120. },
  121. groups = {
  122. snappy=3,
  123. flammable=2,
  124. not_in_creative_inventory=1
  125. },
  126. node_box = {
  127. type = "fixed",
  128. fixed = {
  129. { 0 , -1/2 , 0 , 0 , 1/2 , 1 },
  130. }
  131. },
  132. selection_box = {
  133. type = "fixed",
  134. fixed = {
  135. {-1/16 , -1/2 , 0 , 1/16 , 1/2 , 1 },
  136. }
  137. },
  138. sounds = default.node_sound_wood_defaults(),
  139. on_dig = function(pos, node, digger)
  140. if digger:is_player() and digger:get_inventory() then
  141. local meta = minetest.env:get_meta(pos)
  142. local wear_out = meta:get_int("wear")
  143. digger:get_inventory():add_item("main", {name="fishing:pole", count=1, wear=wear_out, metadata=""})
  144. end
  145. minetest.remove_node(pos)
  146. end,
  147. })
  148. else
  149. minetest.register_node("fishing:pole_deco", {
  150. description = "Fishing Pole",
  151. inventory_image = "fishing_pole.png",
  152. wield_image = "fishing_pole.png^[transformFXR270",
  153. drawtype = "nodebox",
  154. paramtype = "light",
  155. paramtype2 = "facedir",
  156. tiles = {
  157. "fishing_pole_top.png",
  158. "fishing_pole_bottom.png",
  159. "fishing_pole_deco.png", -- right
  160. "fishing_pole_deco.png^[transformFX", -- left
  161. "fishing_pole_back.png",
  162. "fishing_pole_front.png"
  163. },
  164. node_box = {
  165. type = "fixed",
  166. -- { left , bottom , front , right , top , back }
  167. fixed = {
  168. {-1/32 , -1/16 , 14/16 , 1/32 , 6/16 , 15/16},
  169. {-1/32 , -3/16 , 13/16 , 1/32 , -1/16 , 14/16},
  170. {-1/32 , -4/16 , 12/16 , 1/32 , -3/16 , 13/16},
  171. {-1/32 , -5/16 , 11/16 , 1/32 , -4/16 , 12/16},
  172. {-1/32 , -6/16 , 9/16 , 1/32 , -5/16 , 11/16},
  173. {-1/32 , -5/16 , 9/16 , 1/32 , -4/16 , 10/16},
  174. -- stick
  175. {-1/32 , 6/16 , 12/16 , 1/32 , 7/16 , 15/16}, -- top
  176. {-1/32 , 5/16 , 11/16 , 1/32 , 7/16 , 12/16},
  177. {-1/32 , 5/16 , 10/16 , 1/32 , 6/16 , 11/16},
  178. {-1/32 , 4/16 , 9/16 , 1/32 , 6/16 , 10/16},
  179. {-1/32 , 3/16 , 8/16 , 1/32 , 5/16 , 9/16},
  180. {-1/32 , 2/16 , 7/16 , 1/32 , 4/16 , 8/16},
  181. {-1/32 , 1/16 , 6/16 , 1/32 , 3/16 , 7/16},
  182. {-1/32 , 0 , 5/16 , 1/32 , 2/16 , 6/16},
  183. {-1/32 , -2/16 , 4/16 , 1/32 , 1/16 , 5/16},
  184. {-1/32 , -3/16 , 3/16 , 1/32 , 0 , 4/16},
  185. {-1/32 , -5/16 , 2/16 , 1/32 , -1/16 , 3/16},
  186. {-1/32 , -7/16 , 1/16 , 1/32 , -3/16 , 2/16},
  187. {-1/32 , -1/2 , 0 , 1/32 , -5/16 , 1/16}, -- bottom
  188. }
  189. },
  190. selection_box = {
  191. type = "fixed",
  192. fixed = {
  193. {-1/16 , -1/2 , 0 , 1/16 , 1/2 , 1 },
  194. }
  195. },
  196. groups = {
  197. snappy=3,
  198. flammable=2,
  199. not_in_creative_inventory=1
  200. },
  201. sounds = default.node_sound_wood_defaults(),
  202. on_dig = function(pos, node, digger)
  203. if digger:is_player() and digger:get_inventory() then
  204. local meta = minetest.get_meta(pos)
  205. local wear_out = meta:get_int("wear")
  206. digger:get_inventory():add_item("main", {name="fishing:pole", count=1, wear=wear_out, metadata=""})
  207. end
  208. minetest.remove_node(pos)
  209. end,
  210. })
  211. end
  212. -----------------------------------------------------------------------------------------------
  213. -- GETTING WORMS
  214. -----------------------------------------------------------------------------------------------
  215. -- get worms from digging in dirt:
  216. if NEW_WORM_SOURCE == false then
  217. minetest.register_node(":default:dirt", {
  218. description = "Dirt",
  219. tiles = {"default_dirt.png"},
  220. is_ground_content = true,
  221. groups = {crumbly=3},
  222. sounds = default.node_sound_dirt_defaults(),
  223. after_dig_node = function (pos, oldnode, oldmetadata, digger)
  224. if math.random(1, 100) < WORM_CHANCE then
  225. local tool_in_use = digger:get_wielded_item():get_name()
  226. if tool_in_use == "" or tool_in_use == "default:dirt" then
  227. if WORM_IS_MOB == true then
  228. minetest.add_entity({x = pos.x, y = pos.y+0.4, z = pos.z}, "fishing:bait_worm_entity")
  229. else
  230. local inv = digger:get_inventory()
  231. if inv:room_for_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""}) then
  232. inv:add_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""})
  233. end
  234. end
  235. end
  236. end
  237. end,
  238. })
  239. else
  240. -- get worms from digging with hoes:
  241. -- turns nodes with group soil=1 into soil
  242. local function hoe_on_use(itemstack, user, pointed_thing, uses)
  243. local pt = pointed_thing
  244. -- check if pointing at a node
  245. if not pt then
  246. return
  247. end
  248. if pt.type ~= "node" then
  249. return
  250. end
  251. local under = minetest.get_node(pt.under)
  252. local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
  253. local above = minetest.get_node(p)
  254. -- return if any of the nodes is not registered
  255. if not minetest.registered_nodes[under.name] then
  256. return
  257. end
  258. if not minetest.registered_nodes[above.name] then
  259. return
  260. end
  261. -- check if the node above the pointed thing is air
  262. if above.name ~= "air" then
  263. return
  264. end
  265. -- check if pointing at dirt
  266. if minetest.get_item_group(under.name, "soil") ~= 1 then
  267. return
  268. end
  269. -- turn the node into soil, play sound, get worm and wear out item
  270. minetest.set_node(pt.under, {name="farming:soil"})
  271. minetest.sound_play("default_dig_crumbly", {
  272. pos = pt.under,
  273. gain = 0.5,
  274. })
  275. if math.random(1, 100) < WORM_CHANCE then
  276. if WORM_IS_MOB == true then
  277. minetest.add_entity({x=pt.under.x, y=pt.under.y+0.4, z=pt.under.z}, "fishing:bait_worm_entity")
  278. else
  279. local inv = user:get_inventory()
  280. if inv:room_for_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""}) then
  281. inv:add_item("main", {name="fishing:bait_worm", count=1, wear=0, metadata=""})
  282. end
  283. end
  284. end
  285. itemstack:add_wear(65535/(uses-1))
  286. return itemstack
  287. end
  288. -- didn't change the hoes, just here because hoe_on_use is local
  289. minetest.register_tool(":farming:hoe_wood", {
  290. description = "Wooden Hoe",
  291. inventory_image = "farming_tool_woodhoe.png",
  292. on_use = function(itemstack, user, pointed_thing)
  293. return hoe_on_use(itemstack, user, pointed_thing, 30)
  294. end,
  295. })
  296. minetest.register_tool(":farming:hoe_stone", {
  297. description = "Stone Hoe",
  298. inventory_image = "farming_tool_stonehoe.png",
  299. on_use = function(itemstack, user, pointed_thing)
  300. return hoe_on_use(itemstack, user, pointed_thing, 90)
  301. end,
  302. })
  303. minetest.register_tool(":farming:hoe_steel", {
  304. description = "Steel Hoe",
  305. inventory_image = "farming_tool_steelhoe.png",
  306. on_use = function(itemstack, user, pointed_thing)
  307. return hoe_on_use(itemstack, user, pointed_thing, 200)
  308. end,
  309. })
  310. minetest.register_tool(":farming:hoe_bronze", {
  311. description = "Bronze Hoe",
  312. inventory_image = "farming_tool_bronzehoe.png",
  313. on_use = function(itemstack, user, pointed_thing)
  314. return hoe_on_use(itemstack, user, pointed_thing, 220)
  315. end,
  316. })
  317. end
  318. -----------------------------------------------------------------------------------------------
  319. print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...")
  320. -----------------------------------------------------------------------------------------------