screwdriver.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. if not minetest.global_exists("electric_screwdriver") then electric_screwdriver = {} end
  2. electric_screwdriver.modpath = minetest.get_modpath("silicon")
  3. electric_screwdriver.image = "technic_sonic_screwdriver.png"
  4. electric_screwdriver.sound = "technic_sonic_screwdriver"
  5. electric_screwdriver.name = "electric_screwdriver:electric_screwdriver"
  6. electric_screwdriver.description = "Electric Screwdriver\n\nAn electrical, reusable screwdriver.\nMust be charged to use.\nLeft-click + 'E' copies rotation, right-click + 'E' applies rotation."
  7. electric_screwdriver.sound_gain = 0.1
  8. electric_screwdriver.sound_dist = 25
  9. -- Localize for performance.
  10. local math_floor = math.floor
  11. -- This is how many nodes the electric screwdriver can spin.
  12. electric_screwdriver.uses = math_floor(65535/2500)
  13. function electric_screwdriver.on_use(itemstack, user, pt)
  14. if not user or not user:is_player() then
  15. return
  16. end
  17. if pt.type ~= "node" then
  18. return
  19. end
  20. local wear = itemstack:get_wear()
  21. if wear == 0 then
  22. -- Tool isn't charged!
  23. -- Once it is charged the first time, wear should never be 0 again.
  24. return
  25. end
  26. if wear > math_floor(65535-electric_screwdriver.uses) then
  27. -- Tool has no charge left.
  28. return
  29. end
  30. local control = user:get_player_control()
  31. if control.aux1 then
  32. local meta = itemstack:get_meta()
  33. local node = minetest.get_node(pt.under)
  34. local ndef = minetest.registered_nodes[node.name]
  35. if ndef and ndef.paramtype2 == "facedir" then
  36. if node.param2 >= 0 and node.param2 <= 23 then
  37. meta:set_int("screwdriver_rotation", node.param2)
  38. -- Spam.
  39. --minetest.chat_send_player(user:get_player_name(),
  40. -- "# Server: copied facedir (" .. node.param2 .. ")!")
  41. end
  42. end
  43. else
  44. -- We handle stack ourselves.
  45. local fakestack = ItemStack(itemstack:get_name())
  46. screwdriver.handler(fakestack, user, pt, screwdriver.ROTATE_FACE, 200)
  47. end
  48. ambiance.sound_play(electric_screwdriver.sound, pt.under, electric_screwdriver.sound_gain, electric_screwdriver.sound_dist)
  49. wear = wear + electric_screwdriver.uses
  50. -- Don't let wear reach max or tool will be destroyed.
  51. if wear >= 65535 then
  52. wear = 65534
  53. end
  54. itemstack:set_wear(wear)
  55. return itemstack
  56. end
  57. function electric_screwdriver.on_place(itemstack, user, pt)
  58. if not user or not user:is_player() then
  59. return
  60. end
  61. if pt.type ~= "node" then
  62. return
  63. end
  64. local wear = itemstack:get_wear()
  65. if wear == 0 then
  66. -- Tool isn't charged!
  67. -- Once it is charged the first time, wear should never be 0 again.
  68. return
  69. end
  70. if wear > math_floor(65535-electric_screwdriver.uses) then
  71. -- Tool has no charge left.
  72. return
  73. end
  74. local control = user:get_player_control()
  75. if control.aux1 then
  76. if not minetest.is_protected(pt.under, user:get_player_name()) then
  77. local meta = itemstack:get_meta()
  78. local param2 = meta:get_int("screwdriver_rotation")
  79. local node = minetest.get_node(pt.under)
  80. local ndef = minetest.registered_nodes[node.name]
  81. if ndef and ndef.paramtype2 == "facedir" then
  82. if param2 >= 0 and param2 <= 23 then
  83. node.param2 = param2
  84. minetest.swap_node(pt.under, node)
  85. ambiance.sound_play("default_dug_metal", pt.under, 1, 30)
  86. end
  87. end
  88. end
  89. else
  90. -- We handle stack ourselves.
  91. local fakestack = ItemStack(itemstack:get_name())
  92. screwdriver.handler(fakestack, user, pt, screwdriver.ROTATE_AXIS, 200)
  93. end
  94. ambiance.sound_play(electric_screwdriver.sound, pt.under, electric_screwdriver.sound_gain, electric_screwdriver.sound_dist)
  95. wear = wear + electric_screwdriver.uses
  96. -- Don't let wear reach max or tool will be destroyed.
  97. if wear >= 65535 then
  98. wear = 65534
  99. end
  100. itemstack:set_wear(wear)
  101. return itemstack
  102. end
  103. if not electric_screwdriver.run_once then
  104. minetest.register_tool(":" .. electric_screwdriver.name, {
  105. description = electric_screwdriver.description,
  106. inventory_image = electric_screwdriver.image,
  107. wear_represents = "eu_charge",
  108. groups = {not_repaired_by_anvil = 1, disable_repair = 1},
  109. on_use = function(...)
  110. return electric_screwdriver.on_use(...)
  111. end,
  112. on_place = function(...)
  113. return electric_screwdriver.on_place(...)
  114. end,
  115. })
  116. ---[[
  117. minetest.register_craft({
  118. output = electric_screwdriver.name,
  119. recipe = {
  120. {"", "default:diamond", ""},
  121. {"plastic:plastic_sheeting", "battery:battery", "plastic:plastic_sheeting"},
  122. {"plastic:plastic_sheeting", "moreores:mithril_ingot", "plastic:plastic_sheeting"},
  123. }
  124. })
  125. --]]
  126. local c = "electric_screwdriver:core"
  127. local f = electric_screwdriver.modpath .. "/screwdriver.lua"
  128. reload.register_file(c, f, false)
  129. electric_screwdriver.run_once = true
  130. end