123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- -- This file contains functions to convert from
- -- the old areas format and other compatability code.
- minetest.register_chatcommand("legacy_load_areas", {
- params = "<version>",
- description = "Loads, converts, and saves the areas from"
- .." a legacy save file.",
- privs = {areas=true, server=true},
- func = function(name, param)
- minetest.chat_send_player(name, "Converting areas...")
- local version = tonumber(param)
- if version == 0 then
- local err = areas:node_ownership_load()
- if err then
- minetest.chat_send_player(name, "Error loading legacy file: "..err)
- return
- end
- else
- minetest.chat_send_player(name, "Invalid version number. (0 allowed)")
- return
- end
- minetest.chat_send_player(name, "Legacy file loaded.")
- for k, area in pairs(areas.areas) do
- -- New position format
- area.pos1 = {x=area.x1, y=area.y1, z=area.z1}
- area.pos2 = {x=area.x2, y=area.y2, z=area.z2}
- area.x1, area.y1, area.z1,
- area.x2, area.y2, area.z2 =
- nil, nil, nil, nil, nil, nil
- -- Area positions sorting
- areas:sortPos(area.pos1, area.pos2)
- -- Add name
- area.name = "unnamed"
- -- Remove ID
- area.id = nil
- end
- minetest.chat_send_player(name, "Table format updated.")
- areas:save()
- minetest.chat_send_player(name, "Converted areas saved. Done.")
- end
- })
- function areas:node_ownership_load()
- local filename = minetest.get_worldpath().."/owners.tbl"
- local tables, err
- tables, err = loadfile(filename)
- if err then
- return err
- end
- tables = tables()
- for idx = 1, #tables do
- local tolinkv, tolinki = {}, {}
- for i, v in pairs(tables[idx]) do
- if type(v) == "table" and tables[v[1]] then
- table.insert(tolinkv, {i, tables[v[1]]})
- end
- if type(i) == "table" and tables[i[1]] then
- table.insert(tolinki, {i, tables[i[1]]})
- end
- end
- -- link values, first due to possible changes of indices
- for _, v in ipairs(tolinkv) do
- tables[idx][v[1]] = v[2]
- end
- -- link indices
- for _, v in ipairs(tolinki) do
- tables[idx][v[2]], tables[idx][v[1]] = tables[idx][v[1]], nil
- end
- end
- self.areas = tables[1]
- end
- -- Returns the name of the first player that owns an area
- function areas.getNodeOwnerName(pos)
- for id, area in pairs(areas:getAreasAtPos(pos)) do
- return area.owner
- end
- return false
- end
- -- Checks if a node is owned by you
- function areas.isNodeOwner(pos, name)
- if minetest.check_player_privs(name, areas.adminPrivs) then
- return true
- end
- for id, area in pairs(areas:getAreasAtPos(pos)) do
- if name == area.owner then
- return true
- end
- end
- return false
- end
- -- Checks if an area has an owner
- function areas.hasOwner(pos)
- for id, area in pairs(areas:getAreasAtPos(pos)) do
- return true
- end
- return false
- end
- IsPlayerNodeOwner = areas.isNodeOwner
- GetNodeOwnerName = areas.getNodeOwnerName
- HasOwner = areas.hasOwner
- -- This is entirely untested and may break in strange and new ways.
- if areas.config.legacy_table then
- owner_defs = setmetatable({}, {
- __index = function(table, key)
- local a = rawget(areas.areas, key)
- if not a then return a end
- local b = {}
- for k, v in pairs(a) do b[k] = v end
- b.x1, b.y1, b.z1 = b.pos1.x, b.pos1.y, b.pos1.z
- b.x2, b.y1, b.z2 = b.pos2.x, b.pos2.y, b.pos2.z
- b.pos1, b.pos2 = nil, nil
- b.id = key
- return b
- end,
- __newindex = function(table, key, value)
- local a = value
- a.pos1, a.pos2 = {x=a.x1, y=a.y1, z=a.z1},
- {x=a.x2, y=a.y2, z=a.z2}
- a.x1, a.y1, a.z1, a.x2, a.y2, a.z2 =
- nil, nil, nil, nil, nil, nil
- a.name = a.name or "unnamed"
- a.id = nil
- return rawset(areas.areas, key, a)
- end
- })
- end
|