api.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 = 8
  27. local texture_prefix = "ingot_big_"
  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. --this way there is no need for a separate on_punch function for a stack of 1 ingot
  31. minetest.register_alias(mod_prefix .. ingot_name .."_0", "air")
  32. --gives the ingot_item the ability to be placed and increas already placed stacks of ingots
  33. minetest.override_item(ingot_item, {
  34. on_place = function (itemstack, placer, pointed_thing)
  35. local pos = minetest.get_pointed_thing_position(pointed_thing, true)
  36. if minetest.is_protected(pos, placer:get_player_name()) and not minetest.check_player_privs(placer, "protection_bypass") then
  37. return
  38. end
  39. if pointed_thing["type"] == "node" then
  40. local name = minetest.get_node(pointed_thing.under).name
  41. -- call on_rightclick function of pointed node if aplicable and not sneak
  42. -- might or might not break if item is placed by mod devices
  43. if minetest.registered_nodes[name].on_rightclick and
  44. not placer:get_player_control().sneak
  45. then
  46. minetest.registered_nodes[name].on_rightclick(pointed_thing.under,
  47. minetest.get_node(pointed_thing.under),
  48. placer,
  49. itemstack)
  50. elseif string.find(name, mod_prefix .. ingot_name) then
  51. local count = string.gsub(name, "%D*", "")
  52. if stack_size > minetest.registered_nodes[minetest.get_node(pointed_thing.under).name]._ingot_count then
  53. minetest.set_node(pointed_thing.under, {name = mod_prefix .. ingot_name .."_" .. count + 1, param2 = minetest.get_node(pointed_thing.under).param2})
  54. if not (creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())) then
  55. itemstack:take_item()
  56. end
  57. elseif minetest.get_node(pointed_thing.above).name == "air" then
  58. minetest.set_node(pointed_thing.above, {name = mod_prefix .. ingot_name .."_1"})
  59. if not (creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())) then
  60. itemstack:take_item()
  61. end
  62. end
  63. elseif minetest.get_node(pointed_thing.above).name == "air" then
  64. minetest.set_node(pointed_thing.above, {name = mod_prefix .. ingot_name .."_1"})
  65. if not (creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())) then
  66. itemstack:take_item()
  67. end
  68. end
  69. return itemstack
  70. end
  71. end
  72. })
  73. --registers 'stack_size' number of nodes, each has one more ingot in it than the last
  74. for i = 1, stack_size do
  75. local box = {
  76. type = "fixed",
  77. fixed = {
  78. --rectangular box which encompases all placed ingots
  79. ingots.get_box(is_big, i),
  80. },
  81. }
  82. minetest.register_node(mod_prefix .. ingot_name .. "_" .. i,{
  83. _doc_items_create_entry = false,
  84. description = "ingots",
  85. drawtype = "mesh",
  86. tiles = {texture},
  87. mesh = texture_prefix .. i .. ".obj",
  88. selection_box = box,
  89. collision_box = box,
  90. paramtype = 'light',
  91. paramtype2 = "facedir",
  92. groups = {cracky = 3, level = 2, not_in_creative_inventory = 1},
  93. drop = ingot_item .. " " .. i,
  94. on_punch = function (pos, node, puncher, pointed_thing)
  95. if puncher then
  96. local wield = puncher:get_wielded_item()
  97. --checks, so that a stack can be taken appart only by hand or relevant ingot_item
  98. if wield:get_name() == ingot_item or
  99. wield:get_count() == 0 then
  100. if minetest.is_protected(pos, puncher:get_player_name()) and not minetest.check_player_privs(puncher, "protection_bypass") then
  101. return
  102. end
  103. minetest.set_node(pos, {name = mod_prefix .. ingot_name .."_" .. i - 1, param2 = node.param2})
  104. if not (creative and creative.is_enabled_for and creative.is_enabled_for(puncher:get_player_name())) then
  105. local stack = ItemStack(ingot_item)
  106. puncher:get_inventory():add_item("main", stack)
  107. end
  108. end
  109. end
  110. end,
  111. _ingot_name = ingot_name,
  112. _ingot_count = i,
  113. })
  114. end
  115. end
  116. --returns an apropriate nodebox for a given number of ingots
  117. function ingots.get_box(is_big, i)
  118. if is_big then return {-0.5, -0.5, -0.5, 0.5, (((i + 1 - ((i +1 )%2)) / 8) - 0.5), 0.5}
  119. else return {-0.5, -0.5, -0.5, 0.5, (((i - 1 - ((i-1)%8)) / 8) - 3) / 8, 0.5}
  120. end
  121. end