api.lua 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. --[[
  2. Ingots - allows the placemant of ingots in the world
  3. Copyright (C) 2018 Skamiz Kazzarch
  4. This library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. This library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  15. ]]--
  16. -- takes an item name and a texture name and a boolean whether the ingots are big
  17. function ingots.register_ingots(ingot_item, texture, is_big)
  18. --checks, whether the item name is a valid item (thanks 'puzzlecube')
  19. if not minetest.registered_items[ingot_item] then
  20. minetest.log("warning", ingot_item.." is not registered. Skipping ingot registration")
  21. return
  22. end
  23. -- de hardcoded modname, which allows the api to be properly used from within other mods (thanks 'argyle')
  24. local mod_name = minetest.get_current_modname()
  25. local mod_prefix = mod_name .. ":"
  26. local stack_size = 64
  27. local texture_prefix = "ingot_"
  28. --gets item name witout mod part, to be used in the deffinition of the new nodes
  29. local ingot_name = string.sub(ingot_item, string.find(ingot_item, ":", 1, true) +1, -1)
  30. -- Some ingots do not have unique sub-names.
  31. -- For these ingots, use their whole name, replacing ':' with '_'.
  32. -- Ex: talinite:ingot and brass:ingot have the same sub-name, "ingot".
  33. if ingot_name == "ingot" then
  34. ingot_name = string.gsub(ingot_item, ":", "_")
  35. end
  36. if is_big then
  37. ingot_name = ingot_name .. "_big"
  38. stack_size = 8
  39. texture_prefix = "ingot_big_"
  40. end
  41. --this way there is no need for a separate on_punch function for a stack of 1 ingot
  42. minetest.register_alias(mod_prefix .. ingot_name .."_0", "air")
  43. --gives the ingot_item the ability to be placed and increas already placed stacks of ingots
  44. minetest.override_item(ingot_item, {
  45. on_place = function (itemstack, placer, pointed_thing)
  46. local pos = minetest.get_pointed_thing_position(pointed_thing, true)
  47. if minetest.is_protected(pos, placer:get_player_name()) and not minetest.check_player_privs(placer, "protection_bypass") then
  48. return
  49. end
  50. if pointed_thing["type"] == "node" then
  51. local name = minetest.get_node(pointed_thing.under).name
  52. -- call on_rightclick function of pointed node if aplicable and not sneak
  53. -- might or might not break if item is placed by mod devices
  54. if minetest.registered_nodes[name].on_rightclick and
  55. not placer:get_player_control().sneak
  56. then
  57. minetest.registered_nodes[name].on_rightclick(pointed_thing.under,
  58. minetest.get_node(pointed_thing.under), placer, itemstack)
  59. elseif string.find(name, mod_prefix .. ingot_name) then
  60. local count = string.gsub(name, "%D*", "")
  61. if stack_size > minetest.registered_nodes[minetest.get_node(pointed_thing.under).name]._ingot_count then
  62. minetest.set_node(pointed_thing.under, {name = mod_prefix .. ingot_name .."_" .. count + 1, param2 = minetest.get_node(pointed_thing.under).param2})
  63. itemstack:take_item()
  64. elseif minetest.get_node(pointed_thing.above).name == "air" then
  65. minetest.set_node(pointed_thing.above, {name = mod_prefix .. ingot_name .."_1"})
  66. itemstack:take_item()
  67. end
  68. elseif minetest.get_node(pointed_thing.above).name == "air" then
  69. minetest.set_node(pointed_thing.above, {
  70. name = mod_prefix .. ingot_name .. "_1",
  71. param2 = math.random(0, 3),
  72. })
  73. itemstack:take_item()
  74. end
  75. return itemstack
  76. end
  77. end
  78. })
  79. -- Talinite ingots glow.
  80. local light_source = nil
  81. if ingot_item == "talinite:ingot" then
  82. light_source = 6
  83. end
  84. --registers 'stack_size' number of nodes, each has one more ingot in it than the last
  85. for i = 1, stack_size do
  86. local box = {
  87. type = "fixed",
  88. fixed = {
  89. --rectangular box which encompases all placed ingots
  90. ingots.get_box(is_big, i),
  91. },
  92. }
  93. minetest.register_node(mod_prefix .. ingot_name .. "_" .. i,{
  94. description = "ingots",
  95. drawtype = "mesh",
  96. tiles = {texture},
  97. mesh = texture_prefix .. i .. ".obj",
  98. selection_box = box,
  99. collision_box = box,
  100. paramtype = 'light',
  101. paramtype2 = "facedir",
  102. light_source = light_source,
  103. -- Not quick to walk on top of ingot piles.
  104. movement_speed_multiplier = default.SLOW_SPEED,
  105. -- Horizontal rotation only!
  106. on_rotate = screwdriver.rotate_simple,
  107. groups = {cracky = 3, level = 2, not_in_creative_inventory = 1, falling_node = 1},
  108. drop = ingot_item .. " " .. i,
  109. on_punch = function (pos, node, puncher, pointed_thing)
  110. if puncher then
  111. local wield = puncher:get_wielded_item()
  112. --checks, so that a stack can be taken appart only by hand or relevant ingot_item
  113. if wield:get_name() == ingot_item or
  114. wield:get_count() == 0 then
  115. if minetest.is_protected(pos, puncher:get_player_name()) and not minetest.check_player_privs(puncher, "protection_bypass") then
  116. return
  117. end
  118. minetest.set_node(pos, {name = mod_prefix .. ingot_name .."_" .. i - 1, param2 = node.param2})
  119. local stack = ItemStack(ingot_item)
  120. puncher:get_inventory():add_item("main", stack)
  121. end
  122. end
  123. end,
  124. _ingot_name = ingot_name,
  125. _ingot_count = i,
  126. })
  127. end
  128. end
  129. --returns an apropriate nodebox for a given number of ingots
  130. function ingots.get_box(is_big, i)
  131. if is_big then return {-0.5, -0.5, -0.5, 0.5, (((i + 1 - ((i +1 )%2)) / 8) - 0.5), 0.5}
  132. else return {-0.5, -0.5, -0.5, 0.5, (((i - 1 - ((i-1)%8)) / 8) - 3) / 8, 0.5}
  133. end
  134. end