grapes.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. --[[
  2. TODO:
  3. tension physics on wires
  4. spots/bugs disease
  5. check nearby nodes for yellowing decision
  6. growth and aging of vines
  7. ]]
  8. local grape_speed = {
  9. rand = 60,
  10. retry = 30,
  11. cutting = 500,
  12. sapling = 1000,
  13. fruit = 800,
  14. leaf_regrowth = 40,
  15. wine = 60*60*2,
  16. }
  17. --[[
  18. local grape_speed = {
  19. retry = 2,
  20. cutting = 6,
  21. sapling = 6,
  22. fruit = 4,
  23. leaf_regrowth = 4,
  24. }
  25. ]]
  26. local function gr()
  27. return math.random(grape_speed.rand)
  28. end
  29. minetest.register_craftitem("farming_super:grape_leaves", {
  30. description = "Grape Leaves",
  31. inventory_image = "farming_super_grapes_leaves_item.png",
  32. on_use = minetest.item_eat(1),
  33. groups = {flammable = 1},
  34. })
  35. local colors = {"red", "green", "purple", "black"}
  36. local deco_seeds = {4673, 4674, 4675, 4676, 4677 }
  37. for gi,color in ipairs(colors) do
  38. minetest.register_node("farming_super:grape_cutting_"..color, {
  39. description = "Grape Cutting",
  40. drawtype = "plantlike",
  41. -- waving = 1,
  42. -- visual_scale = 1.69,
  43. tiles = {"farming_super_grapes_cutting.png"},
  44. inventory_image = "farming_super_grapes_cutting.png",
  45. paramtype = "light",
  46. paramtype2 = "meshoptions",
  47. sunlight_propagates = true,
  48. walkable = false,
  49. buildable_to = false,
  50. grape_color = color,
  51. groups = {snappy = 2, oddly_breakable_by_hand = 2, flammable = 1, grape_cutting=1},
  52. sounds = default.node_sound_leaves_defaults(),
  53. selection_box = {
  54. type = "fixed",
  55. fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16},
  56. },
  57. place_param2 = 1,
  58. on_place = function(itemstack, placer, pointed_thing)
  59. minetest.set_node(pointed_thing.above, {name="farming_super:grape_cutting_"..color, param2 = 1})
  60. local timer = minetest.get_node_timer(pointed_thing.above)
  61. timer:start(grape_speed.cutting + gr())
  62. itemstack:take_item(1)
  63. return itemstack
  64. end,
  65. on_timer = function(pos, elapsed)
  66. local node = minetest.get_node(pos)
  67. local def = minetest.registered_nodes[node.name]
  68. local c = def.grape_color
  69. pos.y = pos.y - 1
  70. local soil = minetest.get_node(pos)
  71. if soil.name ~= "farming:desert_sand_soil_wet" then
  72. pos.y = pos.y + 1
  73. -- print("wrong soil")
  74. minetest.get_node_timer(pos):start(grape_speed.retry)
  75. return
  76. end
  77. pos.y = pos.y + 1
  78. minetest.set_node(pos, {name = "farming_super:grape_sapling_"..color, param2 = 1})
  79. minetest.get_node_timer(pos):start(grape_speed.sapling + gr())
  80. end,
  81. })
  82. minetest.register_node("farming_super:grape_sapling_"..color, {
  83. description = "Grape Sapling",
  84. drawtype = "plantlike",
  85. waving = 1,
  86. -- visual_scale = 1.69,
  87. tiles = {"farming_super_grapes_sapling.png"},
  88. inventory_image = "farming_super_grapes_sapling.png",
  89. paramtype = "light",
  90. paramtype2 = "meshoptions",
  91. sunlight_propagates = true,
  92. walkable = false,
  93. buildable_to = false,
  94. grape_color = color,
  95. groups = {snappy = 2, oddly_breakable_by_hand = 2, flammable = 1, grape_sapling=1},
  96. sounds = default.node_sound_leaves_defaults(),
  97. selection_box = {
  98. type = "fixed",
  99. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  100. },
  101. place_param2 = 1,
  102. on_place = function(itemstack, placer, pointed_thing)
  103. minetest.set_node(pointed_thing.above, {name="farming_super:grape_sapling_"..color, param2 = 1})
  104. local timer = minetest.get_node_timer(pointed_thing.above)
  105. timer:start(grape_speed.sapling + gr())
  106. itemstack:take_item(1)
  107. return itemstack
  108. end,
  109. on_timer = function(pos, elapsed)
  110. local node = minetest.get_node(pos)
  111. local def = minetest.registered_nodes[node.name]
  112. local c = def.grape_color
  113. pos.y = pos.y - 1
  114. local soil = minetest.get_node(pos)
  115. if soil.name ~= "farming:desert_sand_soil_wet" then
  116. pos.y = pos.y + 1
  117. -- print("wrong soil")
  118. minetest.get_node_timer(pos):start(grape_speed.retry)
  119. return
  120. end
  121. pos.y = pos.y + 3
  122. local wire = minetest.get_node(pos)
  123. if wire.name ~= "farming_super:wire" then
  124. pos.y = pos.y - 2
  125. minetest.get_node_timer(pos):start(grape_speed.retry)
  126. -- print("no wire")
  127. return
  128. end
  129. pos.y = pos.y - 1
  130. minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color, param2 = 3})
  131. minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
  132. pos.y = pos.y - 1
  133. minetest.set_node(pos, {name = "farming_super:grape_stem_"..color, param2 = 1})
  134. end,
  135. })
  136. minetest.register_node("farming_super:grape_stem_"..color, {
  137. description = "Grape Plant",
  138. drawtype = "plantlike",
  139. -- waving = 1,
  140. -- visual_scale = 1.69,
  141. tiles = {"farming_super_grape_vine_stem.png"},
  142. wield_image = "farming_super_grape_vine_stem.png",
  143. paramtype = "light",
  144. paramtype2 = "meshoptions",
  145. sunlight_propagates = true,
  146. walkable = false,
  147. buildable_to = false,
  148. grape_color = color,
  149. drop = {
  150. max_items = 2,
  151. items = {
  152. { items = {'farming_super:grape_cutting_'..color..' 2'}, },
  153. { items = {'farming_super:grape_cutting_'..color}, rarity = 2 },
  154. }
  155. },
  156. groups = {
  157. snappy = 1, choppy=2, flammable = 1, grape_stem = 1, not_in_creative_inventory=1,
  158. },
  159. sounds = default.node_sound_leaves_defaults(),
  160. selection_box = {
  161. type = "fixed",
  162. fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16},
  163. },
  164. place_param2 = 1,
  165. after_destruct = function(pos, oldnode)
  166. pos.y = pos.y + 1
  167. local leaves = minetest.get_node(pos)
  168. if minetest.get_item_group(leaves.name, "grape_leaves") > 0 then
  169. minetest.set_node(pos, {name="air"})
  170. end
  171. end,
  172. })
  173. minetest.register_node("farming_super:grape_leaves_"..color, {
  174. description = "Grape Leaves",
  175. drawtype = "plantlike",
  176. waving = 1,
  177. visual_scale = 1.2,
  178. tiles = {"default_aspen_leaves.png"},
  179. paramtype = "light",
  180. paramtype2 = "meshoptions",
  181. sunlight_propagates = true,
  182. -- walkable = false,
  183. climbable = true,
  184. groups = {
  185. snappy=1, flammable=1, grape_leaves=1, grape_leaves_bare=1,
  186. grape_healthy_leaves=1, not_in_creative_inventory=1, hangs_from_vines=1,
  187. },
  188. grape_color = color,
  189. drop = {
  190. max_items = 2,
  191. items = {
  192. { items = {'farming_super:grape_leaves 1'} },
  193. { items = {'farming_super:grape_leaves 1'}, rarity = 3 },
  194. { items = {'farming_super:grape_cutting_'..color}, rarity = 5 },
  195. }
  196. },
  197. sounds = default.node_sound_leaves_defaults(),
  198. selection_box = {
  199. type = "fixed",
  200. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  201. },
  202. collision_box = {
  203. type = "fixed",
  204. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  205. },
  206. place_param2 = 3,
  207. on_timer = function(pos, elapsed)
  208. local node = minetest.get_node(pos)
  209. local color = minetest.registered_nodes[node.name].grape_color
  210. minetest.set_node(pos, {name = "farming_super:grape_leaves_ripe_"..color, param2 = 3})
  211. minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
  212. end,
  213. })
  214. minetest.register_node("farming_super:grape_yellow_leaves_"..color, {
  215. description = "Yellow Grape Leaves",
  216. drawtype = "plantlike",
  217. waving = 1,
  218. visual_scale = 1.2,
  219. tiles = {"default_aspen_leaves.png^[colorize:olive:150"},
  220. paramtype = "light",
  221. paramtype2 = "meshoptions",
  222. sunlight_propagates = true,
  223. -- walkable = false,
  224. climbable = true,
  225. grape_color = color,
  226. groups = {
  227. snappy=1, flammable=1, grape_leaves=1, grape_yellow_leaves=1,
  228. not_in_creative_inventory=1, hangs_from_vines=1
  229. },
  230. sounds = default.node_sound_leaves_defaults(),
  231. selection_box = {
  232. type = "fixed",
  233. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  234. },
  235. collision_box = {
  236. type = "fixed",
  237. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  238. },
  239. place_param2 = 3,
  240. })
  241. minetest.register_node("farming_super:grape_leaves_ripe_"..color, {
  242. description = "Grapes, "..color,
  243. drawtype = "plantlike",
  244. waving = 1,
  245. visual_scale = 1.2,
  246. tiles = {"default_aspen_leaves.png^farming_super_grapes_ripe_"..color..".png"},
  247. paramtype = "light",
  248. paramtype2 = "meshoptions",
  249. sunlight_propagates = true,
  250. -- walkable = true,
  251. climbable = true,
  252. grape_color = color,
  253. groups = {
  254. snappy=1, flammable=1, grape_leaves=1, grape_healthy_leaves=1,
  255. not_in_creative_inventory=1, hangs_from_vines=1
  256. },
  257. sounds = default.node_sound_leaves_defaults(),
  258. drop = {
  259. max_items = 2,
  260. items = {
  261. { items = {'farming_super:grape_cluster_'..color..' 2'} },
  262. { items = {'farming_super:grape_cluster_'..color..' 1'}, rarity = 2},
  263. { items = {'farming_super:grape_cluster_'..color..' 2'}, rarity = 6},
  264. }
  265. },
  266. selection_box = {
  267. type = "fixed",
  268. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  269. },
  270. collision_box = {
  271. type = "fixed",
  272. fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16},
  273. },
  274. place_param2 = 3,
  275. -- after_dig_node = function(pos, oldnode, oldmetadata, digger)
  276. -- minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color})
  277. -- end,
  278. on_punch = function(pos, node, puncher)
  279. local inv = puncher:get_inventory()
  280. local drops = minetest.get_node_drops(node.name)
  281. for _,d in pairs(drops) do
  282. inv:add_item("main", d)
  283. end
  284. minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color, param2 = 3})
  285. minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
  286. end,
  287. })
  288. minetest.register_craftitem("farming_super:grape_cluster_"..color, {
  289. description = "Grapes, "..color,
  290. -- inventory_image = "farming_super_grape_cluster_"..color..".png",
  291. inventory_image = "farming_super_grapes_ripe_"..color..".png",
  292. on_use = minetest.item_eat(4),
  293. groups = {flammable = 1},
  294. })
  295. minetest.register_decoration({
  296. name = "farming_super:grape_sapling_"..color,
  297. deco_type = "simple",
  298. place_on = {"default:desert_sand", "default:sand", "default:dry_dirt_with_dry_grass"},
  299. sidelen = 16,
  300. noise_params = {
  301. offset = -0.0003,
  302. scale = 0.0009,
  303. spread = {x = 200, y = 200, z = 200},
  304. seed = deco_seeds[gi],
  305. octaves = 3,
  306. persist = 0.6
  307. },
  308. biomes = {"desert_ocean", "savanna"},
  309. y_max = 30,
  310. y_min = 0,
  311. decoration = "farming_super:grape_sapling_"..color,
  312. param2 = 1,
  313. })
  314. -- grape products and crafts
  315. minetest.register_craftitem("farming_super:grape_juice_"..color, {
  316. description = "Grape Juice, "..color,
  317. inventory_image = "farming_super_grapes_juice_"..color..".png",
  318. on_use = minetest.item_eat(7, "vessels:glass_bottle"),
  319. groups = {flammable = 1},
  320. })
  321. local bunch = "farming_super:grape_cluster_"..color
  322. local juice = "farming_super:grape_juice_"..color
  323. minetest.register_craft({
  324. output = "farming_super:grape_juice_"..color,
  325. recipe = {
  326. {bunch, bunch, bunch},
  327. {bunch, "vessels:glass_bottle", bunch},
  328. {bunch, bunch, bunch},
  329. },
  330. })
  331. minetest.register_node("farming_super:grape_juice_barrel_"..color, {
  332. description = "Juice Barrel, "..color,
  333. tiles = {
  334. "default_wood.png^farming_super_barrel_bung.png",
  335. "default_wood.png",
  336. "default_wood.png^[transformR90^farming_super_barrel_rings.png",
  337. "default_wood.png^[transformR90^farming_super_barrel_rings.png",
  338. "default_wood.png^[transformR90^farming_super_barrel_rings.png",
  339. "default_wood.png^[transformR90^farming_super_barrel_rings.png"
  340. },
  341. paramtype2 = "facedir",
  342. -- inventory_image = "bitumen_oil_drum.png",
  343. groups = {
  344. cracky=2,
  345. choppy=2,
  346. oddly_breakable_by_hand=2,
  347. },
  348. paramtype = "light",
  349. drawtype = "nodebox",
  350. grape_color = color,
  351. node_box = {
  352. type = "fixed",
  353. fixed = {
  354. --11.25
  355. {-0.49, -0.5, -0.10, 0.49, 0.5, 0.10},
  356. {-0.10, -0.5, -0.49, 0.10, 0.5, 0.49},
  357. --22.5
  358. {-0.46, -0.5, -0.19, 0.46, 0.5, 0.19},
  359. {-0.19, -0.5, -0.46, 0.19, 0.5, 0.46},
  360. -- 33.75
  361. {-0.416, -0.5, -0.28, 0.416, 0.5, 0.28},
  362. {-0.28, -0.5, -0.416, 0.28, 0.5, 0.416},
  363. --45
  364. {-0.35, -0.5, -0.35, 0.35, 0.5, 0.35},
  365. },
  366. },
  367. selection_box = {
  368. type = "fixed",
  369. fixed = {
  370. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  371. },
  372. },
  373. on_place = function(itemstack, placer, pointed_thing)
  374. minetest.set_node(pointed_thing.above, {name = "farming_super:grape_juice_barrel_"..color})
  375. local timer = minetest.get_node_timer(pointed_thing.above)
  376. timer:start(grape_speed.wine)
  377. itemstack:take_item(1)
  378. return itemstack
  379. end,
  380. on_timer = function(pos, elapsed)
  381. local node = minetest.get_node(pos)
  382. local color = minetest.registered_nodes[node.name].grape_color
  383. minetest.set_node(pos, {name = "farming_super:wine_barrel_"..color})
  384. end,
  385. })
  386. minetest.register_node("farming_super:wine_barrel_"..color, {
  387. description = "Wine Barrel, "..color,
  388. tiles = {
  389. "default_wood.png^farming_super_barrel_bung.png",
  390. "default_wood.png",
  391. "default_wood.png^[transformR90^farming_super_barrel_rings.png",
  392. "default_wood.png^[transformR90^farming_super_barrel_rings.png",
  393. "default_wood.png^[transformR90^farming_super_barrel_rings.png",
  394. "default_wood.png^[transformR90^farming_super_barrel_rings.png"
  395. },
  396. paramtype2 = "facedir",
  397. -- inventory_image = "bitumen_oil_drum.png",
  398. groups = {
  399. cracky=2,
  400. choppy=2,
  401. oddly_breakable_by_hand=2,
  402. },
  403. paramtype = "light",
  404. drawtype = "nodebox",
  405. grape_color = color,
  406. node_box = {
  407. type = "fixed",
  408. fixed = {
  409. --11.25
  410. {-0.49, -0.5, -0.10, 0.49, 0.5, 0.10},
  411. {-0.10, -0.5, -0.49, 0.10, 0.5, 0.49},
  412. --22.5
  413. {-0.46, -0.5, -0.19, 0.46, 0.5, 0.19},
  414. {-0.19, -0.5, -0.46, 0.19, 0.5, 0.46},
  415. -- 33.75
  416. {-0.416, -0.5, -0.28, 0.416, 0.5, 0.28},
  417. {-0.28, -0.5, -0.416, 0.28, 0.5, 0.416},
  418. --45
  419. {-0.35, -0.5, -0.35, 0.35, 0.5, 0.35},
  420. },
  421. },
  422. selection_box = {
  423. type = "fixed",
  424. fixed = {
  425. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  426. },
  427. },
  428. stack_max = 1,
  429. })
  430. minetest.register_craft({
  431. output = "farming_super:grape_juice_barrel_"..color,
  432. recipe = {
  433. {juice, juice, juice},
  434. {juice, "farming_super:barrel", juice},
  435. {juice, juice, juice},
  436. },
  437. })
  438. end
  439. minetest.register_abm({
  440. label = "Grape Vine Leaf Regrowth",
  441. nodenames = {"group:grape_stem"},
  442. interval = grape_speed.leaf_regrowth,
  443. chance = 20,
  444. action = function(pos, node)
  445. pos.y = pos.y + 1
  446. local n = minetest.get_node(pos)
  447. if n.name == "air" then
  448. local color = minetest.registered_nodes[node.name].grape_color
  449. minetest.set_node(pos, {name = "farming_super:grape_leaves_"..color, param2 = 3})
  450. minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
  451. end
  452. end,
  453. })
  454. minetest.register_abm({
  455. label = "Grape Vine Fruit",
  456. nodenames = {"group:grape_leaves_bare"},
  457. interval = 10,
  458. chance = 10,
  459. action = function(pos, node)
  460. local timer = minetest.get_node_timer(pos)
  461. if not timer:is_started() then
  462. timer:start(grape_speed.fruit + gr())
  463. end
  464. end,
  465. })
  466. minetest.register_abm({
  467. label = "Grape Vine Fruit",
  468. nodenames = {"group:grape_stem", "group:grape_cutting", "group:grape_sapling"},
  469. interval = 30,
  470. chance = 5,
  471. action = function(pos, node)
  472. local timer = minetest.get_node_timer(pos)
  473. if not timer:is_started() then
  474. timer:start(grape_speed.fruit + gr())
  475. end
  476. end,
  477. })
  478. minetest.register_abm({
  479. label = "Grape Leaf Disease Origin",
  480. nodenames = {"group:grape_healthy_leaves"},
  481. interval = 440,
  482. chance = 900,
  483. action = function(pos)
  484. local node = minetest.get_node(pos)
  485. local color = minetest.registered_nodes[node.name].grape_color
  486. minetest.set_node(pos, {name = "farming_super:grape_yellow_leaves_"..color, param2 = 3})
  487. minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
  488. end,
  489. })
  490. minetest.register_abm({
  491. label = "Grape Leaf Disease Spread",
  492. nodenames = {"group:grape_yellow_leaves"},
  493. neighbors = {"group:grape_healthy_leaves"},
  494. interval = 20,
  495. chance = 30,
  496. action = function(pos)
  497. local node = minetest.get_node(pos)
  498. local color = minetest.registered_nodes[node.name].grape_color
  499. minetest.set_node(pos, {name = "farming_super:grape_yellow_leaves_"..color, param2 = 3})
  500. minetest.get_node_timer(pos):start(grape_speed.fruit + gr())
  501. end,
  502. })