init.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. -- Bows Mod by UjEdwin
  2. bows = {
  3. pvp = minetest.settings:get_bool("enable_pvp"),
  4. feather = minetest.get_modpath("mobs") and "mobs:chicken_feather" or "default:leaves",
  5. registed_arrows = {},
  6. registed_bows = {},
  7. }
  8. local creative_mode_cache = minetest.settings:get_bool("creative_mode")
  9. function bows.is_creative(name)
  10. return creative_mode_cache or minetest.check_player_privs(name, {creative = true})
  11. end
  12. bows.register_arrow = function(name, def)
  13. if name == nil
  14. or name == "" then
  15. return false
  16. end
  17. def.damage = def.damage or 0
  18. def.name = "bows:" .. name
  19. def.level = def.level or 1
  20. def.on_hit_object = def.on_hit_object
  21. def.on_hit_node = def.on_hit_node
  22. def.on_hit_sound = def.on_hit_sound or "default_dig_dig_immediate"
  23. bows.registed_arrows[def.name] = def
  24. minetest.register_craftitem("bows:" .. name, {
  25. description = def.description or name,
  26. inventory_image = def.texture or "bows_arrow_wooden.png",
  27. groups = {arrow = 1},
  28. drop_chance = def.drop_chance
  29. })
  30. if def.craft then
  31. minetest.register_craft({
  32. output = def.name .." " .. (def.craft_count or 4),
  33. recipe = def.craft
  34. })
  35. end
  36. end
  37. bows.register_bow = function(name, def)
  38. if name == nil
  39. or name == "" then
  40. return false
  41. end
  42. def.replace = "bows:" .. name .. "_loaded"
  43. def.name = "bows:" .. name
  44. def.uses = def.uses - 1 or 49
  45. bows.registed_bows[def.replace] = def
  46. minetest.register_tool(def.name, {
  47. description = def.description or name,
  48. inventory_image = def.texture or "bows_bow.png",
  49. on_use = bows.load,
  50. groups = {bow = 1, stick = 1},
  51. })
  52. minetest.register_tool(def.replace, {
  53. description = def.description or name,
  54. inventory_image = def.texture_loaded or "bows_bow_loaded.png",
  55. on_use = bows.shoot,
  56. groups = {bow = 1, stick = 1, not_in_creative_inventory = 1},
  57. })
  58. if def.craft then
  59. minetest.register_craft({output = def.name,recipe = def.craft})
  60. end
  61. end
  62. bows.load = function(itemstack, user, pointed_thing)
  63. local inv = user:get_inventory()
  64. local index = user:get_wield_index() - 1
  65. local arrow = inv:get_stack("main", index)
  66. if minetest.get_item_group(arrow:get_name(), "arrow") == 0 then
  67. return itemstack
  68. end
  69. local item = itemstack:to_table()
  70. local meta = minetest.deserialize(item.metadata)
  71. meta = {arrow = arrow:get_name()}
  72. item.metadata = minetest.serialize(meta)
  73. item.name = item.name .. "_loaded"
  74. itemstack:replace(item)
  75. if not bows.is_creative(user:get_player_name()) then
  76. inv:set_stack("main", index,
  77. ItemStack(arrow:get_name() .. " " .. (arrow:get_count() - 1)))
  78. end
  79. return itemstack
  80. end
  81. bows.shoot = function(itemstack, user, pointed_thing)
  82. local item = itemstack:to_table()
  83. local meta = minetest.deserialize(item.metadata)
  84. if (not (meta and meta.arrow))
  85. or (not bows.registed_arrows[meta.arrow]) then
  86. return itemstack
  87. end
  88. local name = itemstack:get_name()
  89. local replace = bows.registed_bows[name].name
  90. local ar = bows.registed_bows[name].uses
  91. local wear = bows.registed_bows[name].uses
  92. local level = 19 + bows.registed_bows[name].level
  93. bows.tmp = {}
  94. bows.tmp.arrow = meta.arrow
  95. bows.tmp.user = user
  96. bows.tmp.name = meta.arrow
  97. item.arrow = ""
  98. item.metadata = minetest.serialize(meta)
  99. item.name = replace
  100. itemstack:replace(item)
  101. local pos = user:get_pos()
  102. local dir = user:get_look_dir()
  103. local e = minetest.add_entity({
  104. x = pos.x,
  105. y = pos.y + 1.5,
  106. z = pos.z
  107. }, "bows:arrow")
  108. e:set_velocity({x = dir.x * level, y = dir.y * level, z = dir.z * level})
  109. e:set_acceleration({x = dir.x * -3, y = -10, z = dir.z * -3})
  110. e:set_yaw(user:get_look_horizontal() - math.pi/2)
  111. if not bows.is_creative(user:get_player_name()) then
  112. itemstack:add_wear(65535 / wear)
  113. end
  114. minetest.sound_play("bows_shoot", {pos = pos})
  115. return itemstack
  116. end
  117. local path = minetest.get_modpath("bows")
  118. dofile(path .. "/arrow.lua")
  119. dofile(path .. "/items.lua")
  120. dofile(path .. "/lucky_block.lua")
  121. print ("[MOD] Bows loaded")