crafts.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. local S = mobs.translate
  2. local FS = function(...) return minetest.formspec_escape(S(...)) end
  3. local mc2 = minetest.get_modpath("mcl_core")
  4. -- recipe items
  5. local items = {
  6. paper = mc2 and "mcl_core:paper" or "default:paper",
  7. dye_black = mc2 and "mcl_dye:black" or "dye:black",
  8. string = mc2 and "mcl_mobitems:string" or "farming:string",
  9. stick = mc2 and "mcl_core:stick" or "default:stick",
  10. diamond = mc2 and "mcl_core:diamond" or "default:diamond",
  11. steel_ingot = mc2 and "mcl_core:iron_ingot" or "default:steel_ingot",
  12. gold_block = mc2 and "mcl_core:goldblock" or "default:goldblock",
  13. diamond_block = mc2 and "mcl_core:diamondblock" or "default:diamondblock",
  14. stone = mc2 and "mcl_core:stone" or "default:stone",
  15. mese_crystal = mc2 and "mcl_core:gold_ingot" or "default:mese_crystal",
  16. wood = mc2 and "mcl_core:wood" or "default:wood",
  17. fence_wood = mc2 and "group:fence_wood" or "default:fence_wood",
  18. meat_raw = mc2 and "mcl_mobitems:beef" or "group:food_meat_raw",
  19. meat_cooked = mc2 and "mcl_mobitems:cooked_beef" or "group:food_meat",
  20. }
  21. -- name tag
  22. minetest.register_craftitem("mobs:nametag", {
  23. description = S("Name Tag"),
  24. inventory_image = "mobs_nametag.png",
  25. groups = {flammable = 2, nametag = 1}
  26. })
  27. minetest.register_craft({
  28. output = "mobs:nametag",
  29. recipe = {
  30. { items.paper, items.dye_black, items.string }
  31. }
  32. })
  33. -- leather
  34. minetest.register_craftitem("mobs:leather", {
  35. description = S("Leather"),
  36. inventory_image = "mobs_leather.png",
  37. groups = {flammable = 2, leather = 1}
  38. })
  39. -- raw meat
  40. minetest.register_craftitem("mobs:meat_raw", {
  41. description = S("Raw Meat"),
  42. inventory_image = "mobs_meat_raw.png",
  43. on_use = minetest.item_eat(3),
  44. groups = {food_meat_raw = 1, flammable = 2}
  45. })
  46. -- cooked meat
  47. minetest.register_craftitem("mobs:meat", {
  48. description = S("Meat"),
  49. inventory_image = "mobs_meat.png",
  50. on_use = minetest.item_eat(8),
  51. groups = {food_meat = 1, flammable = 2}
  52. })
  53. minetest.register_craft({
  54. type = "cooking",
  55. output = "mobs:meat",
  56. recipe = "mobs:meat_raw",
  57. cooktime = 5
  58. })
  59. -- lasso
  60. minetest.register_tool("mobs:lasso", {
  61. description = S("Lasso (right-click animal to put in inventory)"),
  62. inventory_image = "mobs_magic_lasso.png",
  63. groups = {flammable = 2}
  64. })
  65. minetest.register_craft({
  66. output = "mobs:lasso",
  67. recipe = {
  68. { items.string, "", items.string},
  69. { "", items.diamond, "" },
  70. { items.string, "", items.string }
  71. }
  72. })
  73. minetest.register_alias("mobs:magic_lasso", "mobs:lasso")
  74. -- net
  75. minetest.register_tool("mobs:net", {
  76. description = S("Net (right-click animal to put in inventory)"),
  77. inventory_image = "mobs_net.png",
  78. groups = {flammable = 2}
  79. })
  80. minetest.register_craft({
  81. output = "mobs:net",
  82. recipe = {
  83. { items.stick, "", items.stick },
  84. { items.stick, "", items.stick },
  85. { items.string, items.stick, items.string }
  86. }
  87. })
  88. -- shears (right click to shear animal)
  89. minetest.register_tool("mobs:shears", {
  90. description = S("Steel Shears (right-click to shear)"),
  91. inventory_image = "mobs_shears.png",
  92. groups = {flammable = 2}
  93. })
  94. minetest.register_craft({
  95. output = "mobs:shears",
  96. recipe = {
  97. { "", items.steel_ingot, "" },
  98. { "", items.stick, items.steel_ingot }
  99. }
  100. })
  101. -- protection rune
  102. minetest.register_craftitem("mobs:protector", {
  103. description = S("Mob Protection Rune"),
  104. inventory_image = "mobs_protector.png",
  105. groups = {flammable = 2}
  106. })
  107. minetest.register_craft({
  108. output = "mobs:protector",
  109. recipe = {
  110. { items.stone, items.stone, items.stone },
  111. { items.stone, items.gold_block, items.stone },
  112. { items.stone, items.stone, items.stone }
  113. }
  114. })
  115. -- level 2 protection rune
  116. minetest.register_craftitem("mobs:protector2", {
  117. description = S("Mob Protection Rune (Level 2)"),
  118. inventory_image = "mobs_protector2.png",
  119. groups = {flammable = 2}
  120. })
  121. minetest.register_craft({
  122. output = "mobs:protector2",
  123. recipe = {
  124. { "mobs:protector", items.mese_crystal, "mobs:protector" },
  125. { items.mese_crystal, items.diamond_block, items.mese_crystal },
  126. { "mobs:protector", items.mese_crystal, "mobs:protector" }
  127. }
  128. })
  129. -- saddle
  130. minetest.register_craftitem("mobs:saddle", {
  131. description = S("Saddle"),
  132. inventory_image = "mobs_saddle.png",
  133. groups = {flammable = 2, saddle = 1}
  134. })
  135. minetest.register_craft({
  136. output = "mobs:saddle",
  137. recipe = {
  138. {"mobs:leather", "mobs:leather", "mobs:leather"},
  139. {"mobs:leather", items.steel_ingot, "mobs:leather"},
  140. {"mobs:leather", items.steel_ingot, "mobs:leather"}
  141. }
  142. })
  143. -- make sure we can register fences
  144. local mod_def = minetest.get_modpath("default")
  145. if mod_def and default.register_fence then
  146. -- mob fence (looks like normal fence but collision is 2 high)
  147. default.register_fence("mobs:fence_wood", {
  148. description = S("Mob Fence"),
  149. texture = "default_wood.png",
  150. material = "default:fence_wood",
  151. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  152. sounds = mod_def and default.node_sound_wood_defaults(),
  153. collision_box = {
  154. type = "fixed",
  155. fixed = {
  156. {-0.5, -0.5, -0.5, 0.5, 1.9, 0.5},
  157. }
  158. }
  159. })
  160. end
  161. -- mob fence top (has enlarged collisionbox to stop mobs getting over)
  162. minetest.register_node("mobs:fence_top", {
  163. description = S("Mob Fence Top"),
  164. drawtype = "nodebox",
  165. tiles = {"default_wood.png"},
  166. paramtype = "light",
  167. is_ground_content = false,
  168. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  169. sounds = mod_def and default.node_sound_wood_defaults(),
  170. node_box = {
  171. type = "fixed",
  172. fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
  173. },
  174. collision_box = {
  175. type = "fixed",
  176. fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}
  177. },
  178. selection_box = {
  179. type = "fixed",
  180. fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}
  181. }
  182. })
  183. minetest.register_craft({
  184. output = "mobs:fence_top 12",
  185. recipe = {
  186. {"group:wood", "group:wood", "group:wood"},
  187. {"", items.fence_wood, ""}
  188. }
  189. })
  190. -- items that can be used as fuel
  191. minetest.register_craft({
  192. type = "fuel",
  193. recipe = "mobs:nametag",
  194. burntime = 3
  195. })
  196. minetest.register_craft({
  197. type = "fuel",
  198. recipe = "mobs:lasso",
  199. burntime = 7
  200. })
  201. minetest.register_craft({
  202. type = "fuel",
  203. recipe = "mobs:net",
  204. burntime = 8
  205. })
  206. minetest.register_craft({
  207. type = "fuel",
  208. recipe = "mobs:leather",
  209. burntime = 4
  210. })
  211. minetest.register_craft({
  212. type = "fuel",
  213. recipe = "mobs:saddle",
  214. burntime = 7
  215. })
  216. minetest.register_craft({
  217. type = "fuel",
  218. recipe = "mobs:fence_wood",
  219. burntime = 7
  220. })
  221. minetest.register_craft({
  222. type = "fuel",
  223. recipe = "mobs:fence_top",
  224. burntime = 2
  225. })
  226. -- this tool spawns same mob and adds owner, protected, nametag info
  227. -- then removes original entity, this is used for fixing any issues.
  228. -- also holding sneak while punching mob lets you change texture name.
  229. local tex_obj
  230. minetest.register_tool(":mobs:mob_reset_stick", {
  231. description = S("Mob Reset Stick"),
  232. inventory_image = "default_stick.png^[colorize:#ff000050",
  233. stack_max = 1,
  234. groups = {not_in_creative_inventory = 1},
  235. on_use = function(itemstack, user, pointed_thing)
  236. if pointed_thing.type ~= "object" then
  237. return
  238. end
  239. local obj = pointed_thing.ref
  240. local control = user:get_player_control()
  241. local sneak = control and control.sneak
  242. -- spawn same mob with saved stats, with random texture
  243. if obj and not sneak then
  244. local self = obj:get_luaentity()
  245. local obj2 = minetest.add_entity(obj:get_pos(), self.name)
  246. if obj2 then
  247. local ent2 = obj2:get_luaentity()
  248. ent2.protected = self.protected
  249. ent2.owner = self.owner
  250. ent2.nametag = self.nametag
  251. ent2.gotten = self.gotten
  252. ent2.tamed = self.tamed
  253. ent2.health = self.health
  254. ent2.order = self.order
  255. if self.child then
  256. obj2:set_velocity({x = 0, y = self.jump_height, z = 0})
  257. end
  258. obj2:set_properties({nametag = self.nametag})
  259. obj:remove()
  260. end
  261. end
  262. -- display form to enter texture name ending in .png
  263. if obj and sneak then
  264. tex_obj = obj
  265. -- get base texture
  266. local bt = tex_obj:get_luaentity().base_texture[1]
  267. if type(bt) ~= "string" then
  268. bt = ""
  269. end
  270. local name = user:get_player_name()
  271. minetest.show_formspec(name, "mobs_texture", "size[8,4]"
  272. .. "field[0.5,1;7.5,0;name;"
  273. .. FS("Enter texture:") .. ";" .. bt .. "]"
  274. .. "button_exit[2.5,3.5;3,1;mob_texture_change;"
  275. .. FS("Change") .. "]")
  276. end
  277. end
  278. })
  279. minetest.register_on_player_receive_fields(function(player, formname, fields)
  280. -- right-clicked with nametag and name entered?
  281. if formname == "mobs_texture"
  282. and fields.name
  283. and fields.name ~= "" then
  284. -- does mob still exist?
  285. if not tex_obj
  286. or not tex_obj:get_luaentity() then
  287. return
  288. end
  289. -- make sure nametag is being used to name mob
  290. local item = player:get_wielded_item()
  291. if item:get_name() ~= "mobs:mob_reset_stick" then
  292. return
  293. end
  294. -- limit name entered to 64 characters long
  295. if fields.name:len() > 64 then
  296. fields.name = fields.name:sub(1, 64)
  297. end
  298. -- update texture
  299. local self = tex_obj:get_luaentity()
  300. self.base_texture = {fields.name}
  301. tex_obj:set_properties({textures = {fields.name}})
  302. -- reset external variable
  303. tex_obj = nil
  304. end
  305. end)
  306. -- Meat Block
  307. minetest.register_node("mobs:meatblock", {
  308. description = S("Meat Block"),
  309. tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"},
  310. paramtype2 = "facedir",
  311. groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2},
  312. sounds = mod_def and default.node_sound_leaves_defaults(),
  313. on_place = minetest.rotate_node,
  314. on_use = minetest.item_eat(20)
  315. })
  316. minetest.register_craft({
  317. output = "mobs:meatblock",
  318. recipe = {
  319. { items.meat_cooked, items.meat_cooked, items.meat_cooked },
  320. { items.meat_cooked, items.meat_cooked, items.meat_cooked },
  321. { items.meat_cooked, items.meat_cooked, items.meat_cooked }
  322. }
  323. })
  324. -- Meat Block (raw)
  325. minetest.register_node("mobs:meatblock_raw", {
  326. description = S("Raw Meat Block"),
  327. tiles = {"mobs_meat_raw_top.png", "mobs_meat_raw_bottom.png", "mobs_meat_raw_side.png"},
  328. paramtype2 = "facedir",
  329. groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2},
  330. sounds = mod_def and default.node_sound_leaves_defaults(),
  331. on_place = minetest.rotate_node,
  332. on_use = minetest.item_eat(20)
  333. })
  334. minetest.register_craft({
  335. output = "mobs:meatblock_raw",
  336. recipe = {
  337. { items.meat_raw, items.meat_raw, items.meat_raw },
  338. { items.meat_raw, items.meat_raw, items.meat_raw },
  339. { items.meat_raw, items.meat_raw, items.meat_raw }
  340. }
  341. })
  342. minetest.register_craft({
  343. type = "cooking",
  344. output = "mobs:meatblock",
  345. recipe = "mobs:meatblock_raw",
  346. cooktime = 30
  347. })