teleport.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. -- Originally Teleport Request by Traxie21 and released with the WTFPL license
  2. -- https://forum.minetest.net/viewtopic.php?id=4457
  3. -- Updates by Zeno and ChaosWormz
  4. local timeout_delay = 60
  5. local version = '1.5'
  6. local tpr_list = {}
  7. local tphr_list = {}
  8. local function find_free_position_near(pos)
  9. local tries = {
  10. {x=1,y=0,z=0},
  11. {x=-1,y=0,z=0},
  12. {x=0,y=0,z=1},
  13. {x=0,y=0,z=-1},
  14. }
  15. for _,d in pairs(tries) do
  16. local p = vector.add(pos, d)
  17. if not minetest.registered_nodes[minetest.get_node(p).name].walkable then
  18. return p, true
  19. end
  20. end
  21. return pos, false
  22. end
  23. --Teleport Request System
  24. local function tpr_send(sender, receiver)
  25. local player = minetest.get_player_by_name(sender)
  26. if not player:get_inventory():contains_item('main', 'epic:teleport_powder') then
  27. minetest.chat_send_player(sender, 'You need teleport powder.')
  28. return
  29. end
  30. if receiver == '' then
  31. minetest.chat_send_player(sender, 'Usage: /tpr <Player name>')
  32. return
  33. end
  34. if not minetest.get_player_by_name(receiver) then
  35. minetest.chat_send_player(sender, 'There is no player by that name. Keep in mind this is case sensitive, and the player must be online.')
  36. return
  37. end
  38. minetest.chat_send_player(receiver, sender ..' is requesting to teleport to you. /tpy to accept.')
  39. minetest.chat_send_player(sender, 'Teleport request sent! It will time out in '.. timeout_delay ..' seconds.')
  40. --Write name values to list and clear old values.
  41. tpr_list[receiver] = sender
  42. --Teleport timeout delay
  43. minetest.after(timeout_delay, function(name)
  44. if tpr_list[name] then
  45. tpr_list[name] = nil
  46. end
  47. end, sender)
  48. end
  49. local function tphr_send(sender, receiver)
  50. local player = minetest.get_player_by_name(sender)
  51. if not player:get_inventory():contains_item('main', 'epic:teleport_powder') then
  52. minetest.chat_send_player(sender, 'You need teleport powder.')
  53. return
  54. end
  55. if receiver == '' then
  56. minetest.chat_send_player(sender, 'Usage: /tphr <Player name>')
  57. return
  58. end
  59. if not minetest.get_player_by_name(receiver) then
  60. minetest.chat_send_player(sender, 'There is no player by that name. Keep in mind this is case sensitive, and the player must be online.')
  61. return
  62. end
  63. minetest.chat_send_player(receiver, sender ..' is requesting that you teleport to them. /tpy to accept; /tpn to deny')
  64. minetest.chat_send_player(sender, 'Teleport request sent! It will time out in '.. timeout_delay ..' seconds.')
  65. --Write name values to list and clear old values.
  66. tphr_list[receiver] = sender
  67. --Teleport timeout delay
  68. minetest.after(timeout_delay, function(name)
  69. if tphr_list[name] then
  70. tphr_list[name] = nil
  71. end
  72. end, sender)
  73. end
  74. local function tpr_deny(name)
  75. if tpr_list[name] then
  76. minetest.chat_send_player(tpr_list[name], 'Teleport request denied.')
  77. tpr_list[name] = nil
  78. end
  79. if tphr_list[name] then
  80. minetest.chat_send_player(tphr_list[name], 'Teleport request denied.')
  81. tphr_list[name] = nil
  82. end
  83. end
  84. --Teleport Accept Systems
  85. local function tpr_accept(name, param)
  86. --Check to prevent constant teleporting.
  87. if not tpr_list[name]
  88. and not tphr_list[name] then
  89. minetest.chat_send_player(name, 'Usage: /tpy allows you to accept teleport requests sent to you by other players.')
  90. return
  91. end
  92. local chatmsg, source, target, name2
  93. if tpr_list[name] then
  94. name2 = tpr_list[name]
  95. source = minetest.get_player_by_name(name)
  96. target = minetest.get_player_by_name(name2)
  97. takepotion = minetest.get_player_by_name(name2)
  98. chatmsg = name2 .. ' is teleporting to you.'
  99. tpr_list[name] = nil
  100. elseif tphr_list[name] then
  101. name2 = tphr_list[name]
  102. source = minetest.get_player_by_name(name2)
  103. target = minetest.get_player_by_name(name)
  104. takepotion = minetest.get_player_by_name(name2)
  105. chatmsg = 'You are teleporting to ' .. name2 .. '.'
  106. tphr_list[name] = nil
  107. else
  108. return
  109. end
  110. -- Could happen if either player disconnects (or timeout); if so just abort
  111. if not source
  112. or not target then
  113. return
  114. end
  115. minetest.chat_send_player(name2, 'Request Accepted!')
  116. minetest.chat_send_player(name, chatmsg)
  117. local target_coords=source:getpos()
  118. target:setpos(find_free_position_near(target_coords))
  119. takepotion:get_inventory():remove_item('main', 'epic:teleport_powder')
  120. minetest.sound_play('whoosh', {pos = target_coords, gain = 0.5, max_hear_distance = 10})
  121. particles_teleport(target_coords)
  122. end
  123. --Chat commands.
  124. minetest.register_chatcommand('tpr', {
  125. description = 'Request teleport to another player',
  126. params = '<playername> | leave playername empty to see help message',
  127. privs = {interact=true},
  128. func = tpr_send
  129. })
  130. minetest.register_chatcommand('tphr', {
  131. description = 'Request player to teleport to you',
  132. params = '<playername> | leave playername empty to see help message',
  133. privs = {interact=true},
  134. func = tphr_send
  135. })
  136. minetest.register_chatcommand('tpy', {
  137. description = 'Accept teleport requests from another player',
  138. privs = {interact=true},
  139. func = tpr_accept
  140. })
  141. minetest.register_chatcommand('tpn', {
  142. description = 'Deny teleport requests from another player',
  143. privs = {interact=true},
  144. func = tpr_deny
  145. })