init.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. -- Minetest 0.4 mod: bones
  2. -- See README.txt for licensing and other information.
  3. bones_formspec =
  4. "size[8,9]"..
  5. "list[current_name;main;0,0;8,4;]"..
  6. "list[current_player;main;0,5;8,4;]"..
  7. "listring[]"..
  8. "background[-0.5,-0.65;9,10.35;gui_bonesbg.png]"..
  9. "listcolors[#606060AA;#606060;#141318;#30434C;#FFF]"
  10. local function is_owner(pos, name)
  11. local owner = minetest.get_meta(pos):get_string("owner")
  12. if owner == "" or owner == name then
  13. return true
  14. end
  15. return false
  16. end
  17. minetest.register_node("bones:bones", {
  18. description = "Gravestone",
  19. tiles = {"default_stone.png", "default_stone.png",
  20. "default_stone.png", "default_stone.png",
  21. "default_stone.png", "default_stone.png^bones_writing.png",
  22. },
  23. drawtype = "nodebox",
  24. paramtype = "light",
  25. node_box = {
  26. type = "fixed",
  27. fixed = {
  28. {-0.25, -0.5, 0.375, 0.25, 0.125, 0.5}, -- NodeBox1
  29. {-0.1875, 0.125, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox2
  30. {-0.125, 0.1875, 0.375, 0.125, 0.25, 0.5}, -- NodeBox3
  31. {-0.0625, 0.25, 0.375, 0.0625, 0.3125, 0.5}, -- NodeBox4
  32. }
  33. },
  34. paramtype2 = "facedir",
  35. groups = {dig_immediate=3},
  36. sounds = default.node_sound_dirt_defaults({
  37. footstep = {name="default_gravel_footstep", gain=0.5},
  38. dug = {name="default_gravel_footstep", gain=1.0},
  39. }),
  40. can_dig = function(pos, player)
  41. local inv = minetest.get_meta(pos):get_inventory()
  42. return is_owner(pos, player:get_player_name()) and inv:is_empty("main")
  43. end,
  44. allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  45. if is_owner(pos, player:get_player_name()) then
  46. return count
  47. end
  48. return 0
  49. end,
  50. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  51. return 0
  52. end,
  53. allow_metadata_inventory_take = function(pos, listname, index, stack, player)
  54. if is_owner(pos, player:get_player_name()) then
  55. return stack:get_count()
  56. end
  57. return 0
  58. end,
  59. on_metadata_inventory_take = function(pos, listname, index, stack, player)
  60. local meta = minetest.get_meta(pos)
  61. if meta:get_string("owner") ~= "" and meta:get_inventory():is_empty("main") then
  62. meta:set_string("infotext", meta:get_string("owner").."'s old bones")
  63. meta:set_string("owner", "")
  64. end
  65. end,
  66. on_construct = function(pos)
  67. local meta = minetest.get_meta(pos)
  68. local inv = meta:get_inventory()
  69. inv:set_size("main", 8*4)
  70. meta:set_string("infotext", "Pile of Bones")
  71. meta:set_string("formspec",bones_formspec)
  72. end,
  73. on_timer = function(pos, elapsed)
  74. local meta = minetest.get_meta(pos)
  75. local time = meta:get_int("time")+elapsed
  76. local publish = 1200
  77. if tonumber(minetest.setting_get("share_bones_time")) then
  78. publish = tonumber(minetest.setting_get("share_bones_time"))
  79. end
  80. if publish == 0 then
  81. return
  82. end
  83. if time >= publish then
  84. meta:set_string("infotext", meta:get_string("owner").."'s old bones")
  85. meta:set_string("owner", "")
  86. else
  87. meta:set_int("time", time)
  88. return true
  89. end
  90. end,
  91. on_punch = function(pos, node, player)
  92. if(not is_owner(pos, player:get_player_name())) then
  93. return
  94. end
  95. local inv = minetest.get_meta(pos):get_inventory()
  96. local player_inv = player:get_inventory()
  97. local has_space = true
  98. for i=1,inv:get_size("main") do
  99. local stk = inv:get_stack("main", i)
  100. if player_inv:room_for_item("main", stk) then
  101. inv:set_stack("main", i, nil)
  102. player_inv:add_item("main", stk)
  103. else
  104. has_space = false
  105. break
  106. end
  107. end
  108. end
  109. })
  110. minetest.register_on_dieplayer(function(player)
  111. if minetest.setting_getbool("creative_mode") then
  112. return
  113. end
  114. local pos = player:getpos()
  115. pos.x = math.floor(pos.x+0.5)
  116. pos.y = math.floor(pos.y+0.5)
  117. pos.z = math.floor(pos.z+0.5)
  118. local param2 = minetest.dir_to_facedir(player:get_look_dir())
  119. local nn = minetest.get_node(pos).name
  120. if minetest.registered_nodes[nn].can_dig and
  121. not minetest.registered_nodes[nn].can_dig(pos, player) then
  122. local player_inv = player:get_inventory()
  123. for i=1,player_inv:get_size("main") do
  124. player_inv:set_stack("main", i, nil)
  125. end
  126. for i=1,player_inv:get_size("craft") do
  127. player_inv:set_stack("craft", i, nil)
  128. end
  129. return
  130. end
  131. minetest.dig_node(pos)
  132. minetest.add_node(pos, {name="bones:bones", param2=param2})
  133. local meta = minetest.get_meta(pos)
  134. local inv = meta:get_inventory()
  135. local player_inv = player:get_inventory()
  136. inv:set_size("main", 8*4)
  137. local empty_list = inv:get_list("main")
  138. inv:set_list("main", player_inv:get_list("main"))
  139. player_inv:set_list("main", empty_list)
  140. for i=1,player_inv:get_size("craft") do
  141. inv:add_item("main", player_inv:get_stack("craft", i))
  142. player_inv:set_stack("craft", i, nil)
  143. end
  144. meta:set_string("infotext", player:get_player_name().."'s fresh bones")
  145. meta:set_string("owner", player:get_player_name())
  146. meta:set_string("formspec",bones_formspec)
  147. meta:set_int("time", 0)
  148. local timer = minetest.get_node_timer(pos)
  149. timer:start(10)
  150. end)
  151. local function growgen(pointed_thing)
  152. pos = pointed_thing.under
  153. n = minetest.get_node(pos)
  154. if n.name == "" then return end
  155. if n.name == "lottfarming:turnips_1" then
  156. minetest.set_node(pos, {name="lottfarming:turnips_2"})
  157. elseif n.name == "lottfarming:turnips_2" then
  158. minetest.set_node(pos, {name="lottfarming:turnips_3"})
  159. elseif n.name == "lottfarming:turnips_3" then
  160. minetest.set_node(pos, {name="lottfarming:turnips_4"})
  161. elseif n.name == "lottfarming:athelas_1" then
  162. minetest.set_node(pos, {name="lottfarming:athelas_2"})
  163. elseif n.name == "lottfarming:athelas_2" then
  164. minetest.set_node(pos, {name="lottfarming:athelas_3"})
  165. elseif n.name == "lottfarming:barley_1" then
  166. minetest.set_node(pos, {name="lottfarming:barley_2"})
  167. elseif n.name == "lottfarming:barley_2" then
  168. minetest.set_node(pos, {name="lottfarming:barley_3"})
  169. elseif n.name == "lottfarming:berries_1" then
  170. minetest.set_node(pos, {name="lottfarming:berries_2"})
  171. elseif n.name == "lottfarming:berries_2" then
  172. minetest.set_node(pos, {name="lottfarming:berries_3"})
  173. elseif n.name == "lottfarming:berries_3" then
  174. minetest.set_node(pos, {name="lottfarming:berries_4"})
  175. elseif n.name == "lottfarming:blue_mushroom_1" then
  176. minetest.set_node(pos, {name="lottfarming:blue_mushroom_2"})
  177. elseif n.name == "lottfarming:blue_mushroom_2" then
  178. minetest.set_node(pos, {name="lottfarming:blue_mushroom_3"})
  179. elseif n.name == "lottfarming:blue_mushroom_3" then
  180. minetest.set_node(pos, {name="lottfarming:blue_mushroom_4"})
  181. elseif n.name == "lottfarming:brown_mushroom_1" then
  182. minetest.set_node(pos, {name="lottfarming:brown_mushroom_2"})
  183. elseif n.name == "lottfarming:brown_mushroom_2" then
  184. minetest.set_node(pos, {name="lottfarming:brown_mushroom_3"})
  185. elseif n.name == "lottfarming:brown_mushroom_3" then
  186. minetest.set_node(pos, {name="lottfarming:brown_mushroom_4"})
  187. elseif n.name == "lottfarming:cabbage_1" then
  188. minetest.set_node(pos, {name="lottfarming:cabbage_2"})
  189. elseif n.name == "lottfarming:cabbage_2" then
  190. minetest.set_node(pos, {name="lottfarming:cabbage_3"})
  191. elseif n.name == "lottfarming:green_mushroom_1" then
  192. minetest.set_node(pos, {name="lottfarming:green_mushroom_2"})
  193. elseif n.name == "lottfarming:green_mushroom_2" then
  194. minetest.set_node(pos, {name="lottfarming:green_mushroom_3"})
  195. elseif n.name == "lottfarming:green_mushroom_3" then
  196. minetest.set_node(pos, {name="lottfarming:green_mushroom_4"})
  197. elseif n.name == "lottfarming:melon_1" then
  198. minetest.set_node(pos, {name="lottfarming:melon_2"})
  199. elseif n.name == "lottfarming:melon_2" then
  200. minetest.set_node(pos, {name="lottfarming:melon_3"})
  201. elseif n.name == "lottfarming:pipeweed_1" then
  202. minetest.set_node(pos, {name="lottfarming:pipeweed_2"})
  203. elseif n.name == "lottfarming:pipeweed_2" then
  204. minetest.set_node(pos, {name="lottfarming:pipeweed_3"})
  205. elseif n.name == "lottfarming:pipeweed_3" then
  206. minetest.set_node(pos, {name="lottfarming:pipeweed_4"})
  207. elseif n.name == "lottfarming:potato_1" then
  208. minetest.set_node(pos, {name="lottfarming:potato_2"})
  209. elseif n.name == "lottfarming:potato_2" then
  210. minetest.set_node(pos, {name="lottfarming:potato_3"})
  211. elseif n.name == "lottfarming:red_mushroom_1" then
  212. minetest.set_node(pos, {name="lottfarming:red_mushroom_2"})
  213. elseif n.name == "lottfarming:red_mushroom_2" then
  214. minetest.set_node(pos, {name="lottfarming:red_mushroom_3"})
  215. elseif n.name == "lottfarming:red_mushroom_3" then
  216. minetest.set_node(pos, {name="lottfarming:red_mushroom_4"})
  217. elseif n.name == "lottfarming:white_mushroom_1" then
  218. minetest.set_node(pos, {name="lottfarming:white_mushroom_2"})
  219. elseif n.name == "lottfarming:white_mushroom_2" then
  220. minetest.set_node(pos, {name="lottfarming:white_mushroom_3"})
  221. elseif n.name == "lottfarming:white_mushroom_3" then
  222. minetest.set_node(pos, {name="lottfarming:white_mushroom_4"})
  223. elseif n.name == "lottfarming:tomatoes_1" then
  224. minetest.set_node(pos, {name="lottfarming:tomatoes_2"})
  225. elseif n.name == "lottfarming:tomatoes_2" then
  226. minetest.set_node(pos, {name="lottfarming:tomatoes_3"})
  227. elseif n.name == "lottfarming:tomatoes_3" then
  228. minetest.set_node(pos, {name="lottfarming:tomatoes_4"})
  229. elseif n.name == "lottfarming:corn_1" then
  230. minetest.set_node(pos, {name="lottfarming:corn_2"})
  231. elseif n.name == "lottfarming:corn_2" then
  232. minetest.set_node(pos, {name="lottfarming:corn_21"})
  233. elseif n.name == "lottfarming:corn_21" then
  234. minetest.set_node(pos, {name="lottfarming:corn_32"})
  235. elseif n.name == "farming:wheat_1" then
  236. minetest.set_node(pos, {name="farming:wheat_2"})
  237. elseif n.name == "farming:wheat_2" then
  238. minetest.set_node(pos, {name="farming:wheat_3"})
  239. elseif n.name == "farming:wheat_3" then
  240. minetest.set_node(pos, {name="farming:wheat_4"})
  241. elseif n.name == "farming:wheat_4" then
  242. minetest.set_node(pos, {name="farming:wheat_5"})
  243. elseif n.name == "farming:wheat_5" then
  244. minetest.set_node(pos, {name="farming:wheat_6"})
  245. elseif n.name == "farming:wheat_6" then
  246. minetest.set_node(pos, {name="farming:wheat_7"})
  247. elseif n.name == "farming:wheat_7" then
  248. minetest.set_node(pos, {name="farming:wheat_8"})
  249. elseif n.name == "farming:cotton_1" then
  250. minetest.set_node(pos, {name="farming:cotton_2"})
  251. elseif n.name == "farming:cotton_2" then
  252. minetest.set_node(pos, {name="farming:cotton_3"})
  253. elseif n.name == "farming:cotton_3" then
  254. minetest.set_node(pos, {name="farming:cotton_4"})
  255. elseif n.name == "farming:cotton_4" then
  256. minetest.set_node(pos, {name="farming:cotton_5"})
  257. elseif n.name == "farming:cotton_5" then
  258. minetest.set_node(pos, {name="farming:cotton_6"})
  259. elseif n.name == "farming:cotton_6" then
  260. minetest.set_node(pos, {name="farming:cotton_7"})
  261. elseif n.name == "farming:cotton_7" then
  262. minetest.set_node(pos, {name="farming:cotton_8"})
  263. end
  264. end
  265. minetest.register_craftitem("bones:bonedust", {
  266. description = "Bone Dust",
  267. inventory_image = "bones_bonedust.png",
  268. liquids_pointable = false,
  269. stack_max = 99,
  270. on_use = function(itemstack, user, pointed_thing)
  271. if pointed_thing.type == "node" then
  272. growgen(pointed_thing)
  273. itemstack:take_item()
  274. return itemstack
  275. end
  276. end,
  277. })
  278. minetest.register_craftitem("bones:bone", {
  279. description = "Bone",
  280. inventory_image = "bones_bone.png",
  281. })
  282. minetest.register_craft({
  283. type = "fuel",
  284. recipe = "bones:bonedust",
  285. burntime = 2,
  286. })
  287. minetest.register_craft({
  288. type = "fuel",
  289. recipe = "bones:bone",
  290. burntime = 4,
  291. })
  292. minetest.register_craft({
  293. type = "cooking",
  294. output = "bones:bonedust 2",
  295. recipe = "bones:bone",
  296. })
  297. minetest.register_tool("bones:bone_scythe", {
  298. description = "Bone Scythe",
  299. inventory_image = "bones_scythe.png",
  300. tool_capabilities = {
  301. full_punch_interval = 0.7,
  302. max_drop_level=1,
  303. groupcaps={
  304. snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3},
  305. },
  306. damage_groups = {fleshy=7},
  307. }
  308. })
  309. minetest.register_craft({
  310. output = 'bones:bone_scythe',
  311. recipe = {
  312. {'bones:skeleton_body', 'bones:skeleton_body', ''},
  313. {'', 'default:stick', ''},
  314. {'', 'default:stick',''},
  315. }
  316. })
  317. minetest.register_craft({
  318. output = 'bones:skeleton_body',
  319. recipe = {
  320. {'bones:bone', 'bones:bone', 'bones:bone'},
  321. {'bones:bone', 'bones:bone', 'bones:bone'},
  322. {'bones:bone', 'bones:bone', 'bones:bone'},
  323. }
  324. })
  325. minetest.register_node("bones:skeleton", {
  326. description = "Skeleton Head",
  327. drawtype = "nodebox",
  328. tiles = {
  329. "bones_skeleton_top.png",
  330. "bones_skeleton_bottom.png",
  331. "bones_skeleton_side.png",
  332. "bones_skeleton_side.png",
  333. "bones_skeleton_rear.png",
  334. "bones_skeleton_front.png"
  335. },
  336. paramtype2 = "facedir",
  337. paramtype = "light",
  338. groups = {dig_immediate=2},
  339. drop = "bones:bonedust",
  340. node_box = {
  341. type = "fixed",
  342. fixed = {
  343. {-0.3125,0.3125,-0.3125,0.3125,0.5,0.3125},
  344. { -0.5,0.25,-0.5,0.5,0.415385,0.5},
  345. {-0.5,-0.1875,-0.5,0.5,0.375,0.5},
  346. {-0.375,-0.5,-0.3125,0.375,0.125,0.3125},
  347. },
  348. },
  349. sounds = default.node_sound_dirt_defaults({
  350. footstep = {name="default_gravel_footstep", gain=0.5},
  351. dug = {name="default_gravel_footstep", gain=1.0},
  352. }),
  353. })
  354. minetest.register_node("bones:skeleton_body", {
  355. description = "Skeleton",
  356. drawtype = "nodebox",
  357. tiles = {"bones_skeleton_top.png"},
  358. inventory_image = "bones_skeleton.png",
  359. wield_image = "bones_skeleton.png",
  360. paramtype = "light",
  361. groups = {dig_immediate=2},
  362. node_box = {
  363. type = "fixed",
  364. fixed = {
  365. {-0.0625,-0.0625,-0.0625,0.125,0.5,0.0625},
  366. {-0.25,-0.3125,-0.25,0.3125,-0.0625,0.25},
  367. {-0.25,-0.5,-0.0625,-0.125,-0.0625,0.125},
  368. {0.3125,-0.5,-0.0625,0.1875,-0.0625,0.125},
  369. {-0.3125,0,-0.375,0.375,0.125,0.375},
  370. {-0.3125,0.375,-0.375,0.375,0.5,0.375},
  371. {-0.3125,0.1875,-0.375,0.375,0.3125,0.375},
  372. {0.375,-0.0625,-0.0625,0.5,0.5,0.1875},
  373. {-0.3125,-0.0625,-0.0625,-0.4375,0.5,0.1875},
  374. },
  375. },
  376. sounds = default.node_sound_dirt_defaults({
  377. footstep = {name="default_gravel_footstep", gain=0.5},
  378. dug = {name="default_gravel_footstep", gain=1.0},
  379. }),
  380. on_place = function(itemstack, placer, pointed_thing)
  381. local above = pointed_thing.above
  382. if minetest.get_node({x = above.x, y = above.y + 1, z = above.z}).name ~= "air" then
  383. return itemstack
  384. end
  385. local fdir = 0
  386. local placer_pos = placer:getpos()
  387. if placer_pos then
  388. dir = {
  389. x = above.x - placer_pos.x,
  390. y = above.y - placer_pos.y,
  391. z = above.z - placer_pos.z
  392. }
  393. fdir = minetest.dir_to_facedir(dir)
  394. end
  395. minetest.add_node(above, {name = "bones:skeleton_body", param2 = fdir})
  396. minetest.add_node({x = above.x, y = above.y + 1, z = above.z}, {name = "bones:skeleton", param2 = fdir})
  397. if not minetest.setting_getbool("creative_mode") then
  398. itemstack:take_item()
  399. end
  400. return itemstack
  401. end,
  402. on_destruct = function(pos)
  403. local p = {x=pos.x, y=pos.y+1, z=pos.z}
  404. minetest.remove_node(p)
  405. end
  406. })