npc.lua 3.9 KB

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