init.lua 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. -- intllib
  2. local MP = minetest.get_modpath(minetest.get_current_modname())
  3. local S, NS = dofile(MP .. "/intllib.lua")
  4. -- rideable horse
  5. mobs:register_mob("mob_horse:horse", {
  6. type = "animal",
  7. visual = "mesh",
  8. visual_size = {x = 1.20, y = 1.20},
  9. mesh = "mobs_horse.x",
  10. collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4},
  11. animation = {
  12. speed_normal = 15,
  13. speed_run = 30,
  14. stand_start = 25,
  15. stand_end = 75,
  16. walk_start = 75,
  17. walk_end = 100,
  18. run_start = 75,
  19. run_end = 100,
  20. },
  21. textures = {
  22. {"mobs_horse.png"}, -- textures by Mjollna
  23. {"mobs_horsepeg.png"},
  24. {"mobs_horseara.png"}
  25. },
  26. fear_height = 3,
  27. runaway = true,
  28. fly = false,
  29. walk_chance = 60,
  30. view_range = 5,
  31. follow = {"farming:wheat", "default:apple"},
  32. passive = true,
  33. hp_min = 12,
  34. hp_max = 16,
  35. armor = 200,
  36. lava_damage = 5,
  37. fall_damage = 5,
  38. water_damage = 1,
  39. makes_footstep_sound = true,
  40. drops = {
  41. {name = "mobs:leather", chance = 1, min = 0, max = 2}
  42. },
  43. do_custom = function(self, dtime)
  44. -- set needed values if not already present
  45. if not self.v2 then
  46. self.v2 = 0
  47. self.max_speed_forward = 6
  48. self.max_speed_reverse = 2
  49. self.accel = 6
  50. self.terrain_type = 3
  51. self.driver_attach_at = {x = 0, y = 20, z = -2}
  52. self.driver_eye_offset = {x = 0, y = 3, z = 0}
  53. end
  54. -- if driver present allow control of horse
  55. if self.driver then
  56. mobs.drive(self, "walk", "stand", false, dtime)
  57. return false -- skip rest of mob functions
  58. end
  59. return true
  60. end,
  61. on_die = function(self, pos)
  62. -- drop saddle when horse is killed while riding
  63. -- also detach from horse properly
  64. if self.driver then
  65. minetest.add_item(pos, "mobs:saddle")
  66. mobs.detach(self.driver, {x = 1, y = 0, z = 1})
  67. self.saddle = nil
  68. end
  69. -- drop any horseshoes added
  70. if self.shoed then
  71. minetest.add_item(pos, self.shoed)
  72. end
  73. end,
  74. on_rightclick = function(self, clicker)
  75. -- make sure player is clicking
  76. if not clicker or not clicker:is_player() then
  77. return
  78. end
  79. -- feed, tame or heal horse
  80. if mobs:feed_tame(self, clicker, 10, true, true) then
  81. return
  82. end
  83. -- applying protection rune
  84. if mobs:protect(self, clicker) then
  85. return
  86. end
  87. -- make sure tamed horse is being clicked by owner only
  88. if self.tamed and self.owner == clicker:get_player_name() then
  89. local inv = clicker:get_inventory()
  90. -- detatch player already riding horse
  91. if self.driver and clicker == self.driver then
  92. mobs.detach(clicker, {x = 1, y = 0, z = 1})
  93. -- add saddle back to inventory
  94. if inv:room_for_item("main", "mobs:saddle") then
  95. inv:add_item("main", "mobs:saddle")
  96. else
  97. minetest.add_item(clicker:get_pos(), "mobs:saddle")
  98. end
  99. self.saddle = nil
  100. -- attach player to horse
  101. elseif (not self.driver
  102. and clicker:get_wielded_item():get_name() == "mobs:saddle")
  103. or self.saddle then
  104. self.object:set_properties({stepheight = 1.1})
  105. mobs.attach(self, clicker)
  106. -- take saddle from inventory
  107. if not self.saddle then
  108. inv:remove_item("main", "mobs:saddle")
  109. end
  110. self.saddle = true
  111. end
  112. end
  113. -- used to capture horse with magic lasso
  114. mobs:capture_mob(self, clicker, 0, 0, 80, false, nil)
  115. end
  116. })
  117. mobs:spawn({
  118. name = "mob_horse:horse",
  119. nodes = {"default:dirt_with_grass", "ethereal:dry_dirt"},
  120. min_light = 14,
  121. interval = 60,
  122. chance = 16000,
  123. min_height = 10,
  124. max_height = 31000,
  125. day_toggle = true,
  126. })
  127. mobs:register_egg("mob_horse:horse", S("Horse"), "wool_brown.png", 1)
  128. -- horseshoe helper function
  129. local apply_shoes = function(name, itemstack, obj, shoes, speed, jump, reverse)
  130. if obj.type ~= "object" then return end
  131. local mob = obj.ref
  132. local ent = mob:get_luaentity()
  133. if ent and ent.name and ent.name == "mob_horse:horse" then
  134. if ent.shoed then
  135. minetest.add_item(mob:get_pos(), ent.shoed)
  136. end
  137. ent.max_speed_forward = speed
  138. ent.jump_height = jump
  139. ent.max_speed_reverse = reverse
  140. ent.accel = speed
  141. ent.shoed = shoes
  142. minetest.chat_send_player(name, S("Horse shoes fitted -")
  143. .. S(" speed: ") .. speed
  144. .. S(" , jump height: ") .. jump
  145. .. S(" , stop speed: ") .. reverse)
  146. itemstack:take_item() ; return itemstack
  147. else
  148. minetest.chat_send_player(name, S("Horse shoes only work on horses!"))
  149. end
  150. end
  151. -- steel horseshoes
  152. minetest.register_craftitem(":mobs:horseshoe_steel", {
  153. description = S("Steel HorseShoes (use on horse to apply)"),
  154. inventory_image = "mobs_horseshoe_steel.png",
  155. on_use = function(itemstack, user, pointed_thing)
  156. return apply_shoes(user:get_player_name(), itemstack, pointed_thing,
  157. "mobs:horseshoe_steel", 7, 4, 2)
  158. end,
  159. })
  160. minetest.register_craft({
  161. output = "mobs:horseshoe_steel",
  162. recipe = {
  163. {"", "default:steelblock", ""},
  164. {"default:steel_ingot", "", "default:steel_ingot"},
  165. {"default:steel_ingot", "", "default:steel_ingot"},
  166. }
  167. })
  168. -- bronze horseshoes
  169. minetest.register_craftitem(":mobs:horseshoe_bronze", {
  170. description = S("Bronze HorseShoes (use on horse to apply)"),
  171. inventory_image = "mobs_horseshoe_bronze.png",
  172. on_use = function(itemstack, user, pointed_thing)
  173. return apply_shoes(user:get_player_name(), itemstack, pointed_thing,
  174. "mobs:horseshoe_bronze", 7, 4, 4)
  175. end,
  176. })
  177. minetest.register_craft({
  178. output = "mobs:horseshoe_bronze",
  179. recipe = {
  180. {"", "default:bronzeblock", ""},
  181. {"default:bronze_ingot", "", "default:bronze_ingot"},
  182. {"default:bronze_ingot", "", "default:bronze_ingot"},
  183. }
  184. })
  185. -- mese horseshoes
  186. minetest.register_craftitem(":mobs:horseshoe_mese", {
  187. description = S("Mese HorseShoes (use on horse to apply)"),
  188. inventory_image = "mobs_horseshoe_mese.png",
  189. on_use = function(itemstack, user, pointed_thing)
  190. return apply_shoes(user:get_player_name(), itemstack, pointed_thing,
  191. "mobs:horseshoe_mese", 9, 5, 8)
  192. end,
  193. })
  194. minetest.register_craft({
  195. output = "mobs:horseshoe_mese",
  196. recipe = {
  197. {"", "default:mese", ""},
  198. {"default:mese_crystal_fragment", "", "default:mese_crystal_fragment"},
  199. {"default:mese_crystal_fragment", "", "default:mese_crystal_fragment"},
  200. }
  201. })
  202. -- diamond horseshoes
  203. minetest.register_craftitem(":mobs:horseshoe_diamond", {
  204. description = S("Diamond HorseShoes (use on horse to apply)"),
  205. inventory_image = "mobs_horseshoe_diamond.png",
  206. on_use = function(itemstack, user, pointed_thing)
  207. return apply_shoes(user:get_player_name(), itemstack, pointed_thing,
  208. "mobs:horseshoe_diamond", 10, 6, 6)
  209. end,
  210. })
  211. minetest.register_craft({
  212. output = "mobs:horseshoe_diamond",
  213. recipe = {
  214. {"", "default:diamondblock", ""},
  215. {"default:diamond", "", "default:diamond"},
  216. {"default:diamond", "", "default:diamond"},
  217. }
  218. })
  219. -- lucky blocks
  220. if minetest.get_modpath("lucky_block") then
  221. lucky_block:add_blocks({
  222. {"dro", {"mobs:horseshoe_steel"}},
  223. {"dro", {"mobs:horseshoe_bronze"}},
  224. {"dro", {"mobs:horseshoe_mese"}},
  225. {"dro", {"mobs:horseshoe_diamond"}},
  226. })
  227. end