|
| 1 | + |
| 2 | +sethome = {} |
| 3 | + |
1 | 4 | local homes_file = minetest.get_worldpath() .. "/homes"
|
2 | 5 | local homepos = {}
|
3 | 6 |
|
4 | 7 | local function loadhomes()
|
5 |
| - local input = io.open(homes_file, "r") |
6 |
| - if input then |
7 |
| - repeat |
8 |
| - local x = input:read("*n") |
9 |
| - if x == nil then |
10 |
| - break |
11 |
| - end |
12 |
| - local y = input:read("*n") |
13 |
| - local z = input:read("*n") |
14 |
| - local name = input:read("*l") |
15 |
| - homepos[name:sub(2)] = {x = x, y = y, z = z} |
16 |
| - until input:read(0) == nil |
17 |
| - io.close(input) |
18 |
| - else |
19 |
| - homepos = {} |
20 |
| - end |
| 8 | + local input, err = io.open(homes_file, "r") |
| 9 | + if not input then |
| 10 | + return minetest.log("info", "Could not load player homes file: " .. err) |
| 11 | + end |
| 12 | + |
| 13 | + -- Iterate over all stored positions in the format "x y z player" for each line |
| 14 | + for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do |
| 15 | + homepos[name] = minetest.string_to_pos(pos) |
| 16 | + end |
| 17 | + input:close() |
21 | 18 | end
|
22 | 19 |
|
23 | 20 | loadhomes()
|
24 | 21 |
|
25 |
| -minetest.register_privilege("home", "Can use /sethome and /home") |
| 22 | +sethome.set = function(name, pos) |
| 23 | + local player = minetest.get_player_by_name(name) |
| 24 | + if not player or not pos then |
| 25 | + return false |
| 26 | + end |
| 27 | + |
| 28 | + local data = {} |
| 29 | + local output, err = io.open(homes_file, "w") |
| 30 | + if output then |
| 31 | + homepos[name] = pos |
| 32 | + for i, v in pairs(homepos) do |
| 33 | + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i)) |
| 34 | + end |
| 35 | + output:write(table.concat(data)) |
| 36 | + io.close(output) |
| 37 | + return true |
| 38 | + end |
| 39 | + minetest.log("action", "Unable to write to player homes file: " .. err) |
| 40 | + return false |
| 41 | +end |
26 | 42 |
|
27 |
| -local changed = false |
| 43 | +sethome.get = function(name) |
| 44 | + return homepos[name] |
| 45 | +end |
| 46 | + |
| 47 | +sethome.go = function(name) |
| 48 | + local player = minetest.get_player_by_name(name) |
| 49 | + if player and homepos[name] then |
| 50 | + player:setpos(homepos[name]) |
| 51 | + return true |
| 52 | + end |
| 53 | + return false |
| 54 | +end |
| 55 | + |
| 56 | +minetest.register_privilege("home", "Can use /sethome and /home") |
28 | 57 |
|
29 | 58 | minetest.register_chatcommand("home", {
|
30 |
| - description = "Teleport you to your home point", |
31 |
| - privs = {home=true}, |
32 |
| - func = function(name) |
33 |
| - local player = minetest.get_player_by_name(name) |
34 |
| - if player == nil then |
35 |
| - -- just a check to prevent the server crashing |
36 |
| - return false |
37 |
| - end |
38 |
| - if homepos[player:get_player_name()] then |
39 |
| - player:setpos(homepos[player:get_player_name()]) |
40 |
| - minetest.chat_send_player(name, "Teleported to home!") |
41 |
| - else |
42 |
| - minetest.chat_send_player(name, "Set a home using /sethome") |
43 |
| - end |
44 |
| - end, |
| 59 | + description = "Teleport you to your home point", |
| 60 | + privs = {home = true}, |
| 61 | + func = function(name) |
| 62 | + if sethome.go(name) then |
| 63 | + return true, "Teleported to home!" |
| 64 | + end |
| 65 | + return false, "Set a home using /sethome" |
| 66 | + end, |
45 | 67 | })
|
46 | 68 |
|
47 | 69 | minetest.register_chatcommand("sethome", {
|
48 |
| - description = "Set your home point", |
49 |
| - privs = {home=true}, |
50 |
| - func = function(name) |
51 |
| - local player = minetest.get_player_by_name(name) |
52 |
| - local pos = player:getpos() |
53 |
| - homepos[player:get_player_name()] = pos |
54 |
| - minetest.chat_send_player(name, "Home set!") |
55 |
| - changed = true |
56 |
| - if changed then |
57 |
| - local output = io.open(homes_file, "w") |
58 |
| - for i, v in pairs(homepos) do |
59 |
| - output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n") |
60 |
| - end |
61 |
| - io.close(output) |
62 |
| - changed = false |
63 |
| - end |
64 |
| - end, |
| 70 | + description = "Set your home point", |
| 71 | + privs = {home = true}, |
| 72 | + func = function(name) |
| 73 | + name = name or "" -- fallback to blank name if nil |
| 74 | + local player = minetest.get_player_by_name(name) |
| 75 | + if player and sethome.set(name, player:getpos()) then |
| 76 | + return true, "Home set!" |
| 77 | + end |
| 78 | + return false, "Player not found!" |
| 79 | + end, |
65 | 80 | })
|
0 commit comments