npc.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. local S = mobs.intllib
  2. -- Npc by TenPlus1
  3. mobs.npc_drops = {
  4. "default:pick_steel", "mobs:meat", "default:sword_steel",
  5. "default:shovel_steel", "farming:bread", "bucket:bucket_water"
  6. }
  7. mobs:register_mob("mobs_npc:npc", {
  8. type = "npc",
  9. passive = false,
  10. damage = 3,
  11. attack_type = "dogfight",
  12. attacks_monsters = true,
  13. attack_npcs = false,
  14. owner_loyal = true,
  15. pathfinding = true,
  16. hp_min = 10,
  17. hp_max = 20,
  18. armor = 100,
  19. collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
  20. visual = "mesh",
  21. mesh = "mobs_character.b3d",
  22. drawtype = "front",
  23. textures = {
  24. {"mobs_npc.png"},
  25. {"mobs_npc2.png"}, -- female by nuttmeg20
  26. },
  27. child_texture = {
  28. {"mobs_npc_baby.png"}, -- derpy baby by AmirDerAssassine
  29. },
  30. makes_footstep_sound = true,
  31. sounds = {},
  32. walk_velocity = 2,
  33. run_velocity = 3,
  34. jump = true,
  35. drops = {
  36. {name = "default:wood", chance = 1, min = 1, max = 3},
  37. {name = "default:apple", chance = 2, min = 1, max = 2},
  38. {name = "default:axe_stone", chance = 5, min = 1, max = 1},
  39. },
  40. water_damage = 0,
  41. lava_damage = 2,
  42. light_damage = 0,
  43. follow = {"farming:bread", "mobs:meat", "default:diamond"},
  44. view_range = 15,
  45. owner = "",
  46. order = "follow",
  47. fear_height = 3,
  48. animation = {
  49. speed_normal = 30,
  50. speed_run = 30,
  51. stand_start = 0,
  52. stand_end = 79,
  53. walk_start = 168,
  54. walk_end = 187,
  55. run_start = 168,
  56. run_end = 187,
  57. punch_start = 200,
  58. punch_end = 219,
  59. },
  60. on_rightclick = function(self, clicker)
  61. -- feed to heal npc
  62. if mobs:feed_tame(self, clicker, 8, true, true) then return end
  63. -- capture npc with net or lasso
  64. if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
  65. -- protect npc with mobs:protector
  66. if mobs:protect(self, clicker) then return end
  67. local item = clicker:get_wielded_item()
  68. local name = clicker:get_player_name()
  69. -- right clicking with gold lump drops random item from mobs.npc_drops
  70. if item:get_name() == "default:gold_lump" then
  71. if not mobs.is_creative(name) then
  72. item:take_item()
  73. clicker:set_wielded_item(item)
  74. end
  75. local pos = self.object:get_pos()
  76. pos.y = pos.y + 0.5
  77. local drops = self.npc_drops or mobs.npc_drops
  78. minetest.add_item(pos, {
  79. name = drops[math.random(1, #drops)]
  80. })
  81. minetest.chat_send_player(name, S("NPC dropped you an item for gold!"))
  82. return
  83. end
  84. -- by right-clicking owner can switch npc between follow and stand
  85. if self.owner and self.owner == name then
  86. if self.order == "follow" then
  87. self.attack = nil
  88. self.order = "stand"
  89. self.state = "stand"
  90. self:set_animation("stand")
  91. self:set_velocity(0)
  92. minetest.chat_send_player(name, S("NPC stands still."))
  93. else
  94. self.order = "follow"
  95. minetest.chat_send_player(name, S("NPC will follow you."))
  96. end
  97. end
  98. end,
  99. })
  100. if not mobs.custom_spawn_npc then
  101. mobs:spawn({
  102. name = "mobs_npc:npc",
  103. nodes = {"default:brick"},
  104. neighbors = {"default:grass_3"},
  105. min_light = 10,
  106. chance = 10000,
  107. active_object_count = 1,
  108. min_height = 0,
  109. day_toggle = true,
  110. })
  111. end
  112. mobs:register_egg("mobs_npc:npc", S("Npc"), "default_brick.png", 1)
  113. -- compatibility
  114. mobs:alias_mob("mobs:npc", "mobs_npc:npc")