safe.lua 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. local S = minetest.get_translator("currency")
  2. function currency.get_safe_formspec(pos)
  3. local spos = pos.x .. "," .. pos.y .. "," ..pos.z
  4. local formspec =
  5. "size[8,9]"..
  6. "list[nodemeta:".. spos .. ";main;1,1;6,2;]"..
  7. "list[current_player;main;0,5;8,4;]"..
  8. "listring[nodemeta:".. spos .. ";main]"..
  9. "listring[current_player;main]"
  10. return formspec
  11. end
  12. if minetest.global_exists("default") then
  13. default.get_safe_formspec = currency.get_safe_formspec
  14. end
  15. local function has_safe_privilege(meta, player)
  16. local name = ""
  17. if player then
  18. if minetest.check_player_privs(player, "protection_bypass") then
  19. return true
  20. end
  21. name = player:get_player_name()
  22. end
  23. if name ~= meta:get_string("owner") then
  24. return false
  25. end
  26. return true
  27. end
  28. minetest.register_node("currency:safe", {
  29. description = S("Safe"),
  30. inventory_image = "safe_front.png",
  31. paramtype = "light",
  32. paramtype2 = "facedir",
  33. tiles = {"safe_side.png",
  34. "safe_side.png",
  35. "safe_side.png",
  36. "safe_side.png",
  37. "safe_side.png",
  38. "safe_front.png",},
  39. is_ground_content = false,
  40. groups = {cracky=1},
  41. after_place_node = function(pos, placer)
  42. local meta = minetest.get_meta(pos)
  43. meta:set_string("owner", placer:get_player_name() or "")
  44. meta:set_string("infotext", S("Safe (owned by @1)", meta:get_string("owner")))
  45. end,
  46. on_construct = function(pos)
  47. local meta = minetest.get_meta(pos)
  48. meta:set_string("infotext", "Safe")
  49. meta:set_string("owner", "")
  50. local inv = meta:get_inventory()
  51. inv:set_size("main", 6*2)
  52. end,
  53. can_dig = function(pos,player)
  54. local meta = minetest.get_meta(pos);
  55. local inv = meta:get_inventory()
  56. return inv:is_empty("main") and has_safe_privilege(meta, player)
  57. end,
  58. allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  59. local meta = minetest.get_meta(pos)
  60. if not has_safe_privilege(meta, player) then
  61. minetest.log("action", player:get_player_name().." tried to access a safe belonging to "
  62. ..meta:get_string("owner").." at "
  63. ..minetest.pos_to_string(pos))
  64. return 0
  65. end
  66. return count
  67. end,
  68. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  69. local meta = minetest.get_meta(pos)
  70. if not has_safe_privilege(meta, player) then
  71. minetest.log("action", player:get_player_name().." tried to access a safe belonging to "
  72. ..meta:get_string("owner").." at "
  73. ..minetest.pos_to_string(pos))
  74. return 0
  75. end
  76. return stack:get_count()
  77. end,
  78. allow_metadata_inventory_take = function(pos, listname, index, stack, player)
  79. local meta = minetest.get_meta(pos)
  80. if not has_safe_privilege(meta, player) then
  81. minetest.log("action", player:get_player_name().." tried to access a safe belonging to "
  82. ..meta:get_string("owner").." at "
  83. ..minetest.pos_to_string(pos))
  84. return 0
  85. end
  86. return stack:get_count()
  87. end,
  88. on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  89. minetest.log("action", player:get_player_name().." moves stuff in safe at "..minetest.pos_to_string(pos))
  90. end,
  91. on_metadata_inventory_put = function(pos, listname, index, stack, player)
  92. minetest.log("action", player:get_player_name().." moves stuff to safe at "..minetest.pos_to_string(pos))
  93. end,
  94. on_metadata_inventory_take = function(pos, listname, index, stack, player)
  95. minetest.log("action", player:get_player_name().." takes stuff from safe at "..minetest.pos_to_string(pos))
  96. end,
  97. on_rightclick = function(pos, node, clicker)
  98. local meta = minetest.get_meta(pos)
  99. if has_safe_privilege(meta, clicker) then
  100. minetest.show_formspec(
  101. clicker:get_player_name(),
  102. "currency:safe",
  103. currency.get_safe_formspec(pos)
  104. )
  105. end
  106. end,
  107. })