update_elevator.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. local S = minetest.get_translator("travelnet")
  2. return function (node_info, fields, player)
  3. local pos = node_info.pos
  4. local meta = node_info.meta
  5. local player_name = player:get_player_name()
  6. local owner_name = node_info.props.owner_name
  7. local station_network = node_info.props.station_network
  8. local station_name = node_info.props.station_name
  9. local description = node_info.props.description
  10. if not description then
  11. return false, S("Unknown node.")
  12. end
  13. if not pos or not fields or not meta or not player_name then
  14. return false, S("Invalid data or node.")
  15. end
  16. -- sanitize inputs
  17. if travelnet.is_falsey_string(fields.station_name) then
  18. fields.station_name = S("at @1 m", tostring(pos.y))
  19. end
  20. -- nothing changed?
  21. if station_name == fields.station_name then
  22. return true, { formspecs = "primary" }
  23. end
  24. -- players with travelnet_remove priv can dig the station
  25. if not minetest.get_player_privs(player_name)[travelnet.remove_priv]
  26. -- the function travelnet.allow_dig(..) may allow additional digging
  27. and not travelnet.allow_dig(player_name, owner_name, station_network, pos)
  28. -- the owner can remove the station
  29. and owner_name ~= player_name
  30. -- stations without owner can be removed/edited by anybody
  31. and owner_name ~= ""
  32. then
  33. return false, S("This @1 belongs to @2. You can't edit it.",
  34. description,
  35. tostring(owner_name)
  36. )
  37. end
  38. -- abort if protected by another mod
  39. if minetest.is_protected(pos, player_name)
  40. and not minetest.check_player_privs(player_name, { protection_bypass = true })
  41. then
  42. minetest.record_protection_violation(pos, player_name)
  43. return false, S("This @1 belongs to @2. You can't edit it.",
  44. description,
  45. tostring(owner_name)
  46. )
  47. end
  48. local travelnets = travelnet.get_travelnets(owner_name)
  49. local network = travelnets[station_network]
  50. if not network then
  51. network = {}
  52. travelnets[station_name] = network
  53. end
  54. -- does a station with the new name already exist?
  55. if network[fields.station_name] then
  56. return false, S('Station "@1" already exists on network "@2".',
  57. fields.station_name, station_network)
  58. end
  59. -- get the old station table
  60. local old_station = network[station_name]
  61. if not old_station then
  62. return false, S("Station does exist.")
  63. end
  64. -- apply the old table to the new station
  65. network[fields.station_name] = old_station
  66. -- remove old station
  67. network[station_name] = nil
  68. -- update station name in node meta
  69. meta:set_string("station_name", fields.station_name)
  70. minetest.chat_send_player(player_name,
  71. S('Station "@1" has been renamed to "@2" on network "@3".',
  72. station_name, fields.station_name, station_network))
  73. meta:set_string("infotext",
  74. S("Station '@1'" .. " " ..
  75. "on network '@2' (owned by @3)" .. " " ..
  76. "ready for usage.",
  77. tostring(fields.station_name), tostring(station_network), tostring(owner_name)))
  78. -- save the updated network data in a savefile over server restart
  79. travelnet.log("action", "renamed elevator '" .. fields.station_name .. "' on network '" .. station_network ..
  80. "' for player '" .. owner_name .. "'")
  81. travelnet.set_travelnets(owner_name, travelnets)
  82. return true, { formspec = travelnet.formspecs.primary, options = {
  83. station_name = fields.station_name
  84. } }
  85. end