cow.lua 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. local S = mobs.intllib_animal
  2. -- Cow by sirrobzeroone
  3. mobs:register_mob("mobs_animal:cow", {
  4. type = "animal",
  5. passive = false,
  6. attack_type = "dogfight",
  7. attack_npcs = false,
  8. reach = 2,
  9. damage = 4,
  10. hp_min = 5,
  11. hp_max = 20,
  12. armor = 200,
  13. collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.2, 0.4},
  14. visual = "mesh",
  15. mesh = "mobs_cow.b3d",
  16. textures = {
  17. {"mobs_cow.png"},
  18. {"mobs_cow2.png"}
  19. },
  20. makes_footstep_sound = true,
  21. sounds = {
  22. random = "mobs_cow",
  23. },
  24. walk_velocity = 1,
  25. run_velocity = 2,
  26. jump = true,
  27. jump_height = 6,
  28. pushable = true,
  29. drops = {
  30. {name = "mobs:meat_raw", chance = 1, min = 1, max = 3},
  31. {name = "mobs:leather", chance = 1, min = 0, max = 2}
  32. },
  33. water_damage = 0.01,
  34. lava_damage = 5,
  35. light_damage = 0,
  36. animation = {
  37. stand_start = 0,
  38. stand_end = 30,
  39. stand_speed = 20,
  40. stand1_start = 35,
  41. stand1_end = 75,
  42. stand1_speed = 20,
  43. walk_start = 85,
  44. walk_end = 114,
  45. walk_speed = 20,
  46. run_start = 120,
  47. run_end = 140,
  48. run_speed = 30,
  49. punch_start = 145,
  50. punch_end = 160,
  51. punch_speed = 20,
  52. die_start = 165,
  53. die_end = 185,
  54. die_speed = 10,
  55. die_loop = false
  56. },
  57. follow = {
  58. "farming:wheat", "default:grass_1", "farming:barley",
  59. "farming:oat", "farming:rye"
  60. },
  61. view_range = 8,
  62. replace_rate = 10,
  63. replace_what = {
  64. {"group:grass", "air", 0},
  65. {"default:dirt_with_grass", "default:dirt", -1}
  66. },
  67. -- stay_near = {{"farming:straw", "group:grass"}, 10},
  68. fear_height = 2,
  69. on_rightclick = function(self, clicker)
  70. -- feed or tame
  71. if mobs:feed_tame(self, clicker, 8, true, true) then
  72. -- if fed 7x wheat or grass then cow can be milked again
  73. if self.food and self.food > 6 then
  74. self.gotten = false
  75. end
  76. return
  77. end
  78. if mobs:protect(self, clicker) then return end
  79. if mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) then return end
  80. local tool = clicker:get_wielded_item()
  81. local name = clicker:get_player_name()
  82. local item = tool:get_name()
  83. -- milk cow with empty bucket
  84. if item == "bucket:bucket_empty"
  85. or item == "wooden_bucket:bucket_wood_empty"
  86. or item == "bucket_wooden:bucket_empty" then
  87. --if self.gotten == true
  88. if self.child == true then
  89. return
  90. end
  91. if self.gotten == true then
  92. minetest.chat_send_player(name, S("Cow already milked!"))
  93. return
  94. end
  95. local inv = clicker:get_inventory()
  96. tool:take_item()
  97. clicker:set_wielded_item(tool)
  98. -- which bucket are we using
  99. local ret_item = "mobs:bucket_milk"
  100. if item == "wooden_bucket:bucket_wood_empty"
  101. or item == "bucket_wooden:bucket_empty" then
  102. ret_item = "mobs:wooden_bucket_milk"
  103. end
  104. if inv:room_for_item("main", {name = ret_item}) then
  105. clicker:get_inventory():add_item("main", ret_item)
  106. else
  107. local pos = self.object:get_pos()
  108. pos.y = pos.y + 0.5
  109. minetest.add_item(pos, {name = ret_item})
  110. end
  111. self.gotten = true -- milked
  112. return
  113. end
  114. end,
  115. on_replace = function(self, pos, oldnode, newnode)
  116. self.food = (self.food or 0) + 1
  117. -- if cow replaces 8x grass then it can be milked again
  118. if self.food >= 8 then
  119. self.food = 0
  120. self.gotten = false
  121. end
  122. end
  123. })
  124. if not mobs.custom_spawn_animal then
  125. mobs:spawn({
  126. name = "mobs_animal:cow",
  127. nodes = {"default:dirt_with_grass", "ethereal:green_dirt"},
  128. neighbors = {"group:grass"},
  129. min_light = 14,
  130. interval = 60,
  131. chance = 8000,
  132. min_height = 5,
  133. max_height = 200,
  134. day_toggle = true
  135. })
  136. end
  137. mobs:register_egg("mobs_animal:cow", S("Cow"), "mobs_cow_inv.png")
  138. mobs:alias_mob("mobs:cow", "mobs_animal:cow") -- compatibility
  139. -- bucket of milk
  140. minetest.register_craftitem(":mobs:bucket_milk", {
  141. description = S("Bucket of Milk"),
  142. inventory_image = "mobs_bucket_milk.png",
  143. stack_max = 1,
  144. on_use = minetest.item_eat(8, "bucket:bucket_empty"),
  145. groups = {food_milk = 1, flammable = 3, drink = 1}
  146. })
  147. -- glass of milk
  148. minetest.register_craftitem(":mobs:glass_milk", {
  149. description = S("Glass of Milk"),
  150. inventory_image = "mobs_glass_milk.png",
  151. on_use = minetest.item_eat(2, "vessels:drinking_glass"),
  152. groups = {food_milk_glass = 1, flammable = 3, vessel = 1, drink = 1}
  153. })
  154. minetest.register_craft({
  155. output = "mobs:glass_milk 4",
  156. recipe = {
  157. {"vessels:drinking_glass", "vessels:drinking_glass"},
  158. {"vessels:drinking_glass", "vessels:drinking_glass"},
  159. {"mobs:bucket_milk", ""}
  160. },
  161. replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}}
  162. })
  163. minetest.register_craft({
  164. output = "mobs:bucket_milk",
  165. recipe = {
  166. {"group:food_milk_glass", "group:food_milk_glass"},
  167. {"group:food_milk_glass", "group:food_milk_glass"},
  168. {"bucket:bucket_empty", ""}
  169. },
  170. replacements = {
  171. {"group:food_milk_glass", "vessels:drinking_glass 4"}
  172. }
  173. })
  174. -- butter
  175. minetest.register_craftitem(":mobs:butter", {
  176. description = S("Butter"),
  177. inventory_image = "mobs_butter.png",
  178. on_use = minetest.item_eat(1),
  179. groups = {food_butter = 1, flammable = 2}
  180. })
  181. local salt_item = "default:sapling" -- some saplings are high in sodium
  182. if minetest.get_modpath("farming") and farming and farming.mod then
  183. salt_item = "farming:salt"
  184. end
  185. minetest.register_craft({
  186. output = "mobs:butter",
  187. recipe = {{"mobs:bucket_milk", salt_item}},
  188. replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}}
  189. })
  190. -- cheese wedge
  191. minetest.register_craftitem(":mobs:cheese", {
  192. description = S("Cheese"),
  193. inventory_image = "mobs_cheese.png",
  194. on_use = minetest.item_eat(4),
  195. groups = {food_cheese = 1, flammable = 2}
  196. })
  197. minetest.register_craft({
  198. type = "cooking",
  199. output = "mobs:cheese",
  200. recipe = "mobs:bucket_milk",
  201. cooktime = 5,
  202. replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}}
  203. })
  204. -- cheese block
  205. minetest.register_node(":mobs:cheeseblock", {
  206. description = S("Cheese Block"),
  207. tiles = {"mobs_cheeseblock.png"},
  208. is_ground_content = false,
  209. groups = {oddly_breakable_by_hand = 3},
  210. sounds = default and default.node_sound_dirt_defaults()
  211. })
  212. minetest.register_craft({
  213. output = "mobs:cheeseblock",
  214. recipe = {
  215. {"group:food_cheese", "group:food_cheese", "group:food_cheese"},
  216. {"group:food_cheese", "group:food_cheese", "group:food_cheese"},
  217. {"group:food_cheese", "group:food_cheese", "group:food_cheese"}
  218. }
  219. })
  220. minetest.register_craft({
  221. output = "mobs:cheese 9",
  222. recipe = {{"mobs:cheeseblock"}}
  223. })
  224. -- check for either of the wood bucket mods and add compatibility
  225. local wb = minetest.get_modpath("wooden_bucket")
  226. local bw = minetest.get_modpath("bucket_wooden")
  227. if wb or bw then
  228. local return_item = wb and "wooden_bucket:bucket_wood_empty"
  229. or "bucket_wooden:bucket_empty"
  230. minetest.register_craftitem(":mobs:wooden_bucket_milk", {
  231. description = S("Wooden Bucket of Milk"),
  232. inventory_image = "mobs_wooden_bucket_milk.png",
  233. stack_max = 1,
  234. on_use = minetest.item_eat(8, return_item),
  235. groups = {food_milk = 1, flammable = 3, drink = 1}
  236. })
  237. minetest.register_craft({
  238. output = "mobs:glass_milk 4",
  239. recipe = {
  240. {"vessels:drinking_glass", "vessels:drinking_glass"},
  241. {"vessels:drinking_glass", "vessels:drinking_glass"},
  242. {"mobs:wooden_bucket_milk", ""}
  243. },
  244. replacements = {{"mobs:wooden_bucket_milk", return_item}}
  245. })
  246. minetest.register_craft({
  247. output = "mobs:wooden_bucket_milk",
  248. recipe = {
  249. {"group:food_milk_glass", "group:food_milk_glass"},
  250. {"group:food_milk_glass", "group:food_milk_glass"},
  251. {return_item, ""}
  252. },
  253. replacements = {
  254. {"group:food_milk_glass", "vessels:drinking_glass 4"}
  255. }
  256. })
  257. minetest.register_craft({
  258. output = "mobs:butter",
  259. recipe = {{"mobs:wooden_bucket_milk", salt_item}},
  260. replacements = {{"mobs:wooden_bucket_milk", return_item}}
  261. })
  262. end