init.lua 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. --[[
  2. Copyright (C) 2015-2019 ChaosWormz
  3. This library is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public
  5. License as published by the Free Software Foundation; either
  6. version 2.1 of the License, or (at your option) any later version.
  7. This library is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public
  12. License along with this library; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
  14. USA
  15. ----------------------------------------------------------------------------
  16. Originally made by Traxie21 and released with the WTFPL license.
  17. Forum link: https://forum.minetest.net/viewtopic.php?id=4457
  18. Updates by Zeno, Panquesito7 and ChaosWormz.
  19. License: LGPL-2.1 for everything.
  20. Optional dependencies: areas, intllib
  21. New release by RobbieF under new mod: tps_teleport - http://blog.minetest.tv/teleport-request/
  22. --]]
  23. tp = {}
  24. -- Load support for intllib.
  25. local MP = minetest.get_modpath(minetest.get_current_modname())
  26. local S, NS = dofile(MP.."/intllib.lua")
  27. -- Load configuration.
  28. dofile(MP.."/config.lua")
  29. tp.tpr_list = {}
  30. tp.tphr_list = {}
  31. local map_size = 30912
  32. function tp.can_teleport(to)
  33. return to.x < map_size and to.x > -map_size and to.y < map_size and to.y > -map_size and to.z < map_size and to.z > -map_size
  34. end
  35. -- Teleport player to a player (used in "/tpr" and in "/tphr" command).
  36. function tp.tpr_teleport_player()
  37. local target_coords = source:get_pos()
  38. local target_sound = target:get_pos()
  39. target:set_pos(tp.find_free_position_near(target_coords))
  40. minetest.sound_play("whoosh", {pos = target_coords, gain = 0.5, max_hear_distance = 10})
  41. minetest.sound_play("whoosh", {pos = target_sound, gain = 0.5, max_hear_distance = 10})
  42. --tp.parti2(target_coords)
  43. end
  44. -- TPC & TPJ
  45. function tp.tpc_teleport_player(player)
  46. local pname = minetest.get_player_by_name(player)
  47. minetest.sound_play("whoosh", {pos = pname:get_pos(), gain = 0.5, max_hear_distance = 10})
  48. pname:set_pos(tp.find_free_position_near(target_coords))
  49. minetest.sound_play("whoosh", {pos = target_coords, gain = 0.5, max_hear_distance = 10})
  50. --tp.parti2(target_coords)
  51. end
  52. -- TPP
  53. function tp.tpp_teleport_player(player)
  54. local pname = minetest.get_player_by_name(player)
  55. minetest.sound_play("whoosh", {pos = pname:get_pos(), gain = 0.5, max_hear_distance = 10})
  56. pname:set_pos(tp.find_free_position_near(pos))
  57. minetest.sound_play("whoosh", {pos = pos, gain = 0.5, max_hear_distance = 10})
  58. --tp.parti2(target_coords)
  59. end
  60. function tp.find_free_position_near(pos)
  61. local tries = {
  62. {x=1,y=0,z=0},
  63. {x=-1,y=0,z=0},
  64. {x=0,y=0,z=1},
  65. {x=0,y=0,z=-1},
  66. }
  67. for _,d in pairs(tries) do
  68. local p = vector.add(pos, d)
  69. if not minetest.registered_nodes[minetest.get_node(p).name].walkable then
  70. return p, true
  71. end
  72. end
  73. return pos, false
  74. end
  75. function tp.parti(pos)
  76. minetest.add_particlespawner(50, 0.4,
  77. {x=pos.x + 0.5, y=pos.y, z=pos.z + 0.5}, {x=pos.x - 0.5, y=pos.y, z=pos.z - 0.5},
  78. {x=0, y=5, z=0}, {x=0, y=0, z=0},
  79. {x=0, y=5, z=0}, {x=0, y=0, z=0},
  80. 3, 5,
  81. 3, 5,
  82. false,
  83. "tps_portal_parti.png")
  84. end
  85. function tp.parti2(pos)
  86. minetest.add_particlespawner(50, 0.4,
  87. {x=pos.x + 0.5, y=pos.y + 10, z=pos.z + 0.5}, {x=pos.x - 0.5, y=pos.y, z=pos.z - 0.5},
  88. {x=0, y=-5, z=0}, {x=0, y=0, z=0},
  89. {x=0, y=-5, z=0}, {x=0, y=0, z=0},
  90. 3, 5,
  91. 3, 5,
  92. false,
  93. "tps_portal_parti.png")
  94. end
  95. -- Teleport Request System
  96. function tp.clear_tpr_list(name)
  97. if tp.tpr_list[name] then
  98. tp.tpr_list[name] = nil
  99. return
  100. end
  101. end
  102. function tp.clear_tphr_list(name)
  103. if tp.tphr_list[name] then
  104. tp.tphr_list[name] = nil
  105. return
  106. end
  107. end
  108. -- Clear requests when the player leaves
  109. minetest.register_on_leaveplayer(function(name)
  110. if tp.tpr_list[name] then
  111. tp.tpr_list[name] = nil
  112. return
  113. end
  114. if tp.tphr_list[name] then
  115. tp.tphr_list[name] = nil
  116. return
  117. end
  118. end)
  119. function tp.tpr_send(sender, receiver)
  120. -- Compatibility with beerchat (UNTESTED)
  121. if minetest.get_modpath("beerchat") and not minetest.check_player_privs(sender, {tp_admin = true}) then
  122. if minetest.get_player_by_name(sender):get_attribute("beerchat:muted:" .. sender) then
  123. minetest.chat_send_player(sender, S("You are not allowed to send requests because you're muted."))
  124. if minetest.get_modpath("chat2") then
  125. chat2.send_message(minetest.get_player_by_name(sender), S("You are not allowed to send requests because you're muted."), 0xFFFFFF)
  126. end
  127. return
  128. end
  129. end
  130. if minetest.check_player_privs(sender, {tp_admin = true}) and tp.enable_immediate_teleport then
  131. if receiver == "" then
  132. minetest.chat_send_player(sender, S("Usage: /tpr <Player name>"))
  133. if minetest.get_modpath("chat2") then
  134. chat2.send_message(minetest.get_player_by_name(sender), S("Usage: /tpr <Player name>"), 0xFFFFFF)
  135. end
  136. return
  137. end
  138. if not minetest.get_player_by_name(receiver) then
  139. minetest.chat_send_player(sender, S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"))
  140. if minetest.get_modpath("chat2") then
  141. chat2.send_message(minetest.get_player_by_name(sender), S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"), 0xFFFFFF)
  142. end
  143. return
  144. end
  145. tp.tpr_list[receiver] = sender
  146. tp.tpr_accept(receiver)
  147. minetest.chat_send_player(sender, S("You are teleporting to @1.", receiver))
  148. if minetest.get_modpath("chat2") then
  149. chat2.send_message(minetest.get_player_by_name(sender), S("You are teleporting to @1.", receiver), 0xFFFFFF)
  150. end
  151. return
  152. end
  153. if receiver == "" then
  154. minetest.chat_send_player(sender, S("Usage: /tpr <Player name>"))
  155. if minetest.get_modpath("chat2") then
  156. chat2.send_message(minetest.get_player_by_name(sender), S("Usage: /tpr <Player name>"), 0xFFFFFF)
  157. end
  158. return
  159. end
  160. if not minetest.get_player_by_name(receiver) then
  161. minetest.chat_send_player(sender, S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"))
  162. if minetest.get_modpath("chat2") then
  163. chat2.send_message(minetest.get_player_by_name(sender), S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"), 0xFFFFFF)
  164. end
  165. return
  166. end
  167. if minetest.get_modpath("chat2") then
  168. chat2.send_message(minetest.get_player_by_name(receiver), S("@1 is requesting to teleport to you. /tpy to accept", sender), 0xFFFFFF)
  169. chat2.send_message(minetest.get_player_by_name(sender), S("Teleport request sent! It will timeout in @1 seconds", tp.timeout_delay), 0xFFFFFF)
  170. end
  171. minetest.chat_send_player(receiver, S("@1 is requesting to teleport to you. /tpy to accept", sender))
  172. minetest.chat_send_player(sender, S("Teleport request sent! It will timeout in @1 seconds", tp.timeout_delay))
  173. -- Write name values to list and clear old values.
  174. tp.tpr_list[receiver] = sender
  175. -- Teleport timeout delay
  176. minetest.after(tp.timeout_delay, function(name)
  177. if tp.tpr_list[name] then
  178. tp.tpr_list[name] = nil
  179. minetest.chat_send_player(sender, S("Request timed-out."))
  180. minetest.chat_send_player(receiver, S("Request timed-out."))
  181. if minetest.get_modpath("chat2") then
  182. chat2.send_message(minetest.get_player_by_name(sender), S("Request timed-out."), 0xFFFFFF)
  183. chat2.send_message(minetest.get_player_by_name(receiver), S("Request timed-out."), 0xFFFFFF)
  184. end
  185. return
  186. end
  187. end, receiver)
  188. end
  189. function tp.tphr_send(sender, receiver)
  190. -- Compatibility with beerchat (UNTESTED)
  191. if minetest.get_modpath("beerchat") and not minetest.check_player_privs(sender, {tp_admin = true}) then
  192. if minetest.get_player_by_name(sender):get_attribute("beerchat:muted:" .. sender) then
  193. minetest.chat_send_player(sender, S("You are not allowed to send requests because you're muted."))
  194. if minetest.get_modpath("chat2") then
  195. chat2.send_message(minetest.get_player_by_name(sender), S("You are not allowed to send requests because you're muted."), 0xFFFFFF)
  196. end
  197. return
  198. end
  199. end
  200. if minetest.check_player_privs(sender, {tp_admin = true}) and tp.enable_immediate_teleport then
  201. if receiver == "" then
  202. minetest.chat_send_player(sender, S("Usage: /tphr <Player name>"))
  203. if minetest.get_modpath("chat2") then
  204. chat2.send_message(minetest.get_player_by_name(sender), S("Usage. /tphr <Player name>"), 0xFFFFFF)
  205. end
  206. return
  207. end
  208. if not minetest.get_player_by_name(receiver) then
  209. minetest.chat_send_player(sender, S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"))
  210. if minetest.get_modpath("chat2") then
  211. chat2.send_message(minetest.get_player_by_name(sender), S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"), 0xFFFFFF)
  212. end
  213. return
  214. end
  215. tp.tphr_list[receiver] = sender
  216. tp.tpr_accept(receiver)
  217. minetest.chat_send_player(sender, S("@1 is teleporting to you.", receiver))
  218. if minetest.get_modpath("chat2") then
  219. chat2.send_message(minetest.get_player_by_name(sender), S("@1 is teleporting to you.", receiver), 0xFFFFFF)
  220. end
  221. return
  222. end
  223. if receiver == "" then
  224. minetest.chat_send_player(sender, S("Usage: /tphr <Player name>"))
  225. if minetest.get_modpath("chat2") then
  226. chat2.send_message(minetest.get_player_by_name(sender), S("Usage. /tphr <Player name>"), 0xFFFFFF)
  227. end
  228. return
  229. end
  230. if not minetest.get_player_by_name(receiver) then
  231. minetest.chat_send_player(sender, S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"))
  232. if minetest.get_modpath("chat2") then
  233. chat2.send_message(minetest.get_player_by_name(sender), S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online"), 0xFFFFFF)
  234. end
  235. return
  236. end
  237. if minetest.get_modpath("chat2") then
  238. chat2.send_message(minetest.get_player_by_name(receiver), S("@1 is requesting that you teleport to them. /tpy to accept; /tpn to deny", sender), 0xFFFFFF)
  239. chat2.send_message(minetest.get_player_by_name(sender), S("Teleport request sent! It will timeout in @1 seconds", tp.timeout_delay), 0xFFFFFF)
  240. end
  241. minetest.chat_send_player(receiver, S("@1 is requesting that you teleport to them. /tpy to accept; /tpn to deny", sender))
  242. minetest.chat_send_player(sender, S("Teleport request sent! It will timeout in @1 seconds", tp.timeout_delay))
  243. -- Write name values to list and clear old values.
  244. tp.tphr_list[receiver] = sender
  245. -- Teleport timeout delay
  246. minetest.after(tp.timeout_delay, function(name)
  247. if tp.tphr_list[name] then
  248. tp.tphr_list[name] = nil
  249. minetest.chat_send_player(sender, S("Request timed-out."))
  250. minetest.chat_send_player(receiver, S("Request timed-out."))
  251. if minetest.get_modpath("chat2") then
  252. chat2.send_message(minetest.get_player_by_name(sender), S("Request timed-out"), 0xFFFFFF)
  253. chat2.send_message(minetest.get_player_by_name(receiver), S("Request timed-out"), 0xFFFFFF)
  254. end
  255. return
  256. end
  257. end, receiver)
  258. end
  259. function tp.tpc_send(player, coordinates)
  260. local posx,posy,posz = string.match(coordinates, "^(-?%d+), (-?%d+), (-?%d+)$")
  261. local pname = minetest.get_player_by_name(player)
  262. if posx ~= nil or posy ~= nil or posz ~= nil then
  263. posx = tonumber(posx) + 0.0
  264. posy = tonumber(posy) + 0.0
  265. posz = tonumber(posz) + 0.0
  266. end
  267. if posx==nil or posy==nil or posz==nil or string.len(posx) > 6 or string.len(posy) > 6 or string.len(posz) > 6 then
  268. minetest.chat_send_player(player, S("Usage: /tpc <x, y, z>"))
  269. if minetest.get_modpath("chat2") then
  270. chat2.send_message(minetest.get_player_by_name(player), S("Usage: /tpc <x, y, z>"), 0xFFFFFF)
  271. end
  272. return nil
  273. end
  274. target_coords = {x=posx, y=posy, z=posz}
  275. if tp.can_teleport(target_coords) == false then
  276. minetest.chat_send_player(player, S("You cannot teleport to a location outside the map!"))
  277. if minetest.get_modpath("chat2") then
  278. chat2.send_message(minetest.get_player_by_name(player), S("You cannot teleport to a location outside the map!"), 0xFFFFFF)
  279. end
  280. return nil
  281. end
  282. -- If the area is protected, reject the user's request to teleport to these coordinates
  283. -- In future release we'll actually query the player who owns the area, if they're online, and ask for their permission.
  284. -- Admin user (priv "tp_admin") overrides all protection
  285. if minetest.check_player_privs(pname, {tp_admin = true}) then
  286. tp.tpc_teleport_player(player)
  287. minetest.chat_send_player(player, S("Teleporting to: @1, @2, @3", posx, posy, posz))
  288. if minetest.get_modpath("chat2") then
  289. chat2.send_message(minetest.get_player_by_name(player), S("Teleporting to: @1, @2, @3", posx, posy, posz), 0xFFFFFF)
  290. end
  291. else
  292. if minetest.check_player_privs(pname, {tp_tpc = true}) then
  293. local protected = minetest.is_protected(target_coords,pname)
  294. if protected and minetest.get_modpath("areas") then
  295. if not areas:canInteract(target_coords, player) then
  296. local owners = areas:getNodeOwners(target_coords)
  297. minetest.chat_send_player(player, S("Error: @1 is protected by @2.", minetest.pos_to_string(target_coords), table.concat(owners, ", ")))
  298. if minetest.get_modpath("chat2") then
  299. chat2.send_message(minetest.get_player_by_name(player), S("Error: @1 is protected by @2.", minetest.pos_to_string(target_coords), table.concat(owners, ", ")), 0xFFFFFF)
  300. end
  301. return
  302. end
  303. end
  304. tp.tpc_teleport_player(player)
  305. minetest.chat_send_player(player, S("Teleporting to: @1, @2, @3", posx, posy, posz))
  306. if minetest.get_modpath("chat2") then
  307. chat2.send_message(minetest.get_player_by_name(player), S("Teleporting to: @1, @2, @3", posx, posy, posz), 0xFFFFFF)
  308. end
  309. else
  310. minetest.chat_send_player(player, S("Error: You do not have permission to teleport to those coordinates."))
  311. if minetest.get_modpath("chat2") then
  312. chat2.send_message(minetest.get_player_by_name(player), S("Error: You do not have permission to teleport to those coordinates."), 0xFFFFFF)
  313. end
  314. return
  315. end
  316. end
  317. end
  318. function tp.tpr_deny(name)
  319. if tp.tpr_list[name] then
  320. name2 = tp.tpr_list[name]
  321. minetest.chat_send_player(name2, S("Teleport request denied."))
  322. minetest.chat_send_player(name, S("You denied the request @1 sent you.", name2))
  323. if minetest.get_modpath("chat2") then
  324. chat2.send_message(minetest.get_player_by_name(name2), S("Teleport request denied."), 0xFFFFFF)
  325. chat2.send_message(minetest.get_player_by_name(name), S("You denied the request @1 sent you.", name2), 0xFFFFFF)
  326. end
  327. tp.tpr_list[name] = nil
  328. elseif tp.tphr_list[name] then
  329. name2 = tp.tphr_list[name]
  330. minetest.chat_send_player(name2, S("Teleport request denied."))
  331. minetest.chat_send_player(name, S("You denied the request @1 sent you.", name2))
  332. if minetest.get_modpath("chat2") then
  333. chat2.send_message(minetest.get_player_by_name(name2), S("Teleport request denied."), 0xFFFFFF)
  334. chat2.send_message(minetest.get_player_by_name(name), S("You denied the request @1 sent you.", name2), 0xFFFFFF)
  335. end
  336. tp.tphr_list[name] = nil
  337. else
  338. minetest.chat_send_player(name, S("Usage: /tpn allows you to deny teleport requests sent to you by other players."))
  339. if minetest.get_modpath("chat2") then
  340. chat2.send_message(minetest.get_player_by_name(name), S("Usage: /tpn allows you to deny teleport requests sent to you by other players."), 0xFFFFFF)
  341. end
  342. return
  343. end
  344. end
  345. -- Teleport Accept Systems
  346. function tp.tpr_accept(name, param)
  347. -- Check to prevent constant teleporting.
  348. if not tp.tpr_list[name] and not tp.tphr_list[name] then
  349. minetest.chat_send_player(name, S("Usage: /tpy allows you to accept teleport requests sent to you by other players"))
  350. if minetest.get_modpath("chat2") then
  351. chat2.send_message(minetest.get_player_by_name(name), S("Usage: /tpy allows you to accept teleport requests sent to you by other players"), 0xFFFFFF)
  352. end
  353. return
  354. end
  355. if tp.tpr_list[name] then
  356. name2 = tp.tpr_list[name]
  357. source = minetest.get_player_by_name(name)
  358. target = minetest.get_player_by_name(name2)
  359. chatmsg = S("@1 is teleporting to you.", name2)
  360. tp.tpr_list[name] = nil
  361. elseif tp.tphr_list[name] then
  362. name2 = tp.tphr_list[name]
  363. source = minetest.get_player_by_name(name2)
  364. target = minetest.get_player_by_name(name)
  365. chatmsg = S("You are teleporting to @1.", name2)
  366. tp.tphr_list[name] = nil
  367. else
  368. return
  369. end
  370. -- Could happen if either player disconnects (or timeout); if so just abort
  371. if not source
  372. or not target then
  373. minetest.chat_send_player(name, S("@1 doesn't exist, or just disconnected/left (by timeout).", name2))
  374. return
  375. end
  376. tp.tpr_teleport_player()
  377. minetest.chat_send_player(name2, S("Request Accepted!"))
  378. minetest.chat_send_player(name, chatmsg)
  379. if minetest.get_modpath("chat2") then
  380. chat2.send_message(minetest.get_player_by_name(name2), S("Request Accepted!"), 0xFFFFFF)
  381. chat2.send_message(minetest.get_player_by_name(name), chatmsg, 0xFFFFFF)
  382. end
  383. end
  384. -- Teleport Jump - Relative Position Teleportation by number of nodes
  385. function tp.tpj(player, param)
  386. local pname = minetest.get_player_by_name(player)
  387. if param == "" then
  388. minetest.chat_send_player(player, S("Usage: <x|y|z> <number>"))
  389. if minetest.get_modpath("chat2") then
  390. chat2.send_message(minetest.get_player_by_name(player), S("Usage: <x|y|z> <number>"), 0xFFFFFF)
  391. end
  392. return false
  393. end
  394. local args = param:split(" ") -- look into this. Can it crash if the player does not have two parameters?
  395. if #args < 2 then
  396. minetest.chat_send_player(player, S("Usage: <x|y|z> <number>"))
  397. if minetest.get_modpath("chat2") then
  398. chat2.send_message(minetest.get_player_by_name(player), S("Usage: <x|y|z> <number>"), 0xFFFFFF)
  399. end
  400. return false
  401. end
  402. if not tonumber(args[2]) then
  403. return false, S("Not a number!")
  404. end
  405. -- Initially generate the target coords from the player's current position (since it's relative) and then perform the math.
  406. target_coords = minetest.get_player_by_name(player):get_pos()
  407. if args[1] == "x" then
  408. target_coords["x"] = target_coords["x"] + tonumber(args[2])
  409. elseif args[1] == "y" then
  410. target_coords["y"] = target_coords["y"] + tonumber(args[2])
  411. elseif args[1] == "z" then
  412. target_coords["z"] = target_coords["z"] + tonumber(args[2])
  413. else
  414. minetest.chat_send_player(player, S("Not a valid axis. Valid options are X, Y or Z"))
  415. if minetest.get_modpath("chat2") then
  416. chat2.send_message(minetest.get_player_by_name(player), S("Not a valid axis. Valid options are X, Y or Z"), 0xFFFFFF)
  417. end
  418. return
  419. end
  420. if tp.can_teleport(target_coords) == false then
  421. minetest.chat_send_player(player, S("You cannot teleport to a location outside the map!"))
  422. if minetest.get_modpath("chat2") then
  423. chat2.send_message(minetest.get_player_by_name(player), S("You cannot teleport to a location outside the map!"), 0xFFFFFF)
  424. end
  425. return
  426. end
  427. tp.tpc_teleport_player(player)
  428. end
  429. -- Evade
  430. function tp.tpe(player)
  431. if minetest.get_modpath("chat2") then
  432. chat2.send_message(minetest.get_player_by_name(player), S("EVADE!"), 0xFFFFFF)
  433. end
  434. minetest.chat_send_player(player, S("EVADE!"))
  435. local mindistance = 15
  436. local maxdistance = 50
  437. local times = math.random(6,20) -- how many times to jump - minimum,maximum
  438. local negatives = { '-','' } -- either it's this way or that way: the difference between -10 and 10
  439. local options = { 'x', 'y', 'z' }
  440. local isnegative = ''
  441. local distance = 0
  442. local axis = ''
  443. local iteration = 0
  444. for i = 1,times do
  445. -- do this every 1 second
  446. minetest.after(iteration,
  447. function()
  448. isnegative = negatives[math.random(2)] -- choose randomly whether this is this way or that
  449. distance = isnegative .. math.random(mindistance,maxdistance) -- the distance to jump
  450. axis = options[math.random(3)]
  451. local command = axis .. " " .. distance
  452. tp.tpj(player, command)
  453. end
  454. )
  455. iteration = iteration + 0.5
  456. end
  457. end
  458. -- Register chatcommands
  459. if tp.enable_tpp_command then
  460. minetest.register_chatcommand("tpp", {
  461. description = S("Teleport to a place (i.e., spawn, shop)."),
  462. params = S("<place> | leave empty to see available places"),
  463. privs = {},
  464. func = function(player, param)
  465. local pname = minetest.get_player_by_name(player)
  466. -- Show the available places to the player (taken from shivajiva101's POI mod, thanks!).
  467. if param == "" then
  468. local places = {}
  469. if not tp.available_places then tp.available_places = {} end
  470. for key, value in pairs(tp.available_places) do
  471. if minetest.get_modpath("chat2") then
  472. chat2.send_message(minetest.get_player_by_name(player), key, 0xFFFFFF)
  473. end
  474. table.insert(places, key)
  475. end
  476. if #places == 0 then
  477. if minetest.get_modpath("chat2") then
  478. chat2.send_message(minetest.get_player_by_name(player), S("There are no places yet."), 0xFFFFFF)
  479. end
  480. return true, S("There are no places yet.")
  481. end
  482. if minetest.get_modpath("chat2") then
  483. chat2.send_message(minetest.get_player_by_name(player), S("Usage: /tpp <place>"), 0xFFFFFF)
  484. end
  485. table.insert(places, S("Usage: /tpp <place>"))
  486. return true, table.concat(places, "\n")
  487. -- Teleport player to the specified place (taken from shivajiva101's POI mod, thanks!).
  488. elseif tp.available_places[param] then
  489. pos = {x = tp.available_places[param].x, y = tp.available_places[param].y, z = tp.available_places[param].z}
  490. tp.tpp_teleport_player(player)
  491. minetest.chat_send_player(player, S("Teleporting to @1.", param))
  492. if minetest.get_modpath("chat2") then
  493. chat2.send_message(minetest.get_player_by_name(player), S("Teleporting to @1.", param), 0xFFFFFF)
  494. end
  495. -- Check if the place exists.
  496. elseif not tp.available_places[param] then
  497. minetest.chat_send_player(player, S("There is no place by that name. Keep in mind this is case-sensitive."))
  498. if minetest.get_modpath("chat2") then
  499. chat2.send_message(minetest.get_player_by_name(player), S("There is no place by that name. Keep in mind this is case-sensitive."), 0xFFFFFF)
  500. end
  501. return
  502. end
  503. end,
  504. })
  505. end
  506. minetest.register_chatcommand("tpr", {
  507. description = S("Request teleport to another player"),
  508. params = S("<playername> | leave playername empty to see help message"),
  509. privs = {interact = true, tp = true},
  510. func = tp.tpr_send
  511. })
  512. minetest.register_chatcommand("tphr", {
  513. description = S("Request player to teleport to you"),
  514. params = S("<playername> | leave playername empty to see help message"),
  515. privs = {interact = true, tp = true},
  516. func = tp.tphr_send
  517. })
  518. minetest.register_chatcommand("tpc", {
  519. description = S("Teleport to coordinates"),
  520. params = S("<coordinates> | leave coordinates empty to see help message"),
  521. privs = {interact = true, tp_tpc = true, tp = true},
  522. func = tp.tpc_send
  523. })
  524. minetest.register_chatcommand("tpj", {
  525. description = S("Teleport to relative position"),
  526. params = S("<axis> <distance> | leave empty to see help message"),
  527. privs = {interact = true, tp_tpc = true, tp = true},
  528. func = tp.tpj
  529. })
  530. minetest.register_chatcommand("tpe", {
  531. description = S("Evade Enemy"),
  532. privs = {interact = true, tp_tpc = true, tp = true},
  533. func = tp.tpe
  534. })
  535. minetest.register_chatcommand("tpy", {
  536. description = S("Accept teleport requests from another player"),
  537. privs = {interact = true, tp = true},
  538. func = tp.tpr_accept
  539. })
  540. minetest.register_chatcommand("tpn", {
  541. description = S("Deny teleport requests from another player"),
  542. privs = {interact = true, tp = true},
  543. func = tp.tpr_deny
  544. })
  545. -- Log
  546. if minetest.settings:get_bool("log_mods") then
  547. minetest.log("action", S("[Teleport Request] TPS Teleport v@1 Loaded!", tp.version))
  548. end