diff options
| author | ShadowNinja <noreply@gmail.com> | 2013-09-02 19:16:14 -0400 | 
|---|---|---|
| committer | ShadowNinja <noreply@gmail.com> | 2013-09-02 19:16:14 -0400 | 
| commit | 4ae050a3ae13d5fc7a01b72fe2576508916e5145 (patch) | |
| tree | fe9e6bff4c88854e384fb1c26512aa8867d12f41 /legacy.lua | |
Initial commit
Diffstat (limited to 'legacy.lua')
| -rw-r--r-- | legacy.lua | 145 | 
1 files changed, 145 insertions, 0 deletions
| diff --git a/legacy.lua b/legacy.lua new file mode 100644 index 0000000..9ff7c77 --- /dev/null +++ b/legacy.lua @@ -0,0 +1,145 @@ +-- This file contains functions to convert from +-- the old areas format and other compatability code. + +minetest.register_chatcommand("legacy_load_areas", { +	params = "", +	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 startTime = os.clock() + +		err = areas:legacy_load() +		if err then +			minetest.chat_send_player(name, "Error loading legacy file: "..err) +			return +		end +		minetest.chat_send_player(name, "Legacy file loaded.") + +		for k, area in pairs(areas.areas) do +			--New position format +			areas.areas[k].pos1 = {x=area.x1, y=area.y1, z=area.z1} +			areas.areas[k].pos2 = {x=area.x2, y=area.y2, z=area.z2} + +			areas.areas[k].x1, areas.areas[k].y1, +			areas.areas[k].z1, areas.areas[k].x2, +			areas.areas[k].y2, areas.areas[k].z2 = +				nil, nil, nil, nil, nil, nil + +			--Area positions sorting +			areas.areas[k].pos1, areas.areas[k].pos2 = +				areas:sortPos(areas.areas[k].pos1, areas.areas[k].pos2) + +			--Add name +			areas.areas[k].name = "unnamed" +		end +		minetest.chat_send_player(name, "Table format updated.") + +		areas:save() +		minetest.chat_send_player(name, "Converted areas saved.") +		minetest.chat_send_player(name, "Finished in "..tostring(os.clock() - startTime).."s.") +end}) + +-- The old load function from node_ownership (with minor modifications) +function areas:legacy_load() +	local filename = minetest.get_worldpath().."/owners.tbl" +	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 _, area in pairs(areas.areas) do +		p1, p2 = area.pos1, area.pos2 +		if pos.x >= p1.x and pos.x <= p2.x and +		   pos.y >= p1.y and pos.y <= p2.y and +		   pos.z >= p1.z and pos.z <= p2.z then +			if area.owner ~= nil then +				return area.owner +			end +		end +	end +	return false +end + +-- Checks if a node is owned by you +function areas.isNodeOwner(pos, name) +	if minetest.check_player_privs(name, {areas=true}) then +		return true +	end +	for _, area in pairs(areas.areas) do +		p1, p2 = area.pos1, area.pos2 +		if pos.x >= p1.x and pos.x <= p2.x and +		   pos.y >= p1.y and pos.y <= p2.y and +		   pos.z >= p1.z and pos.z <= p2.z then +			if name == area.owner then +				return true +			end +		end +	end +	return false +end + +IsPlayerNodeOwner = areas.isNodeOwner +GetNodeOwnerName  = areas.getNodeOwnerName +HasOwner          = areas.hasOwner + +if areas.legacy_table then +	owner_defs = {} +	setmetatable(owner_defs, { +		__index = function(table, key) +			local a = rawget(areas.areas, key) +			if a then +				a.x1 = a.pos1.x +				a.y1 = a.pos1.y +				a.z1 = a.pos1.z +				a.x2 = a.pos2.x +				a.y2 = a.pos2.y +				a.z2 = a.pos2.z +				a.pos1, a.pos2 = nil, nil +			end +			return a +		end, +		__newindex = function(table, key, value) +			if rawget(areas.areas, key) ~= nil then +				local a = value +				a.pos1, a.pos2 = {}, {} +				a.pos1.x = a.x1 +				a.pos1.y = a.y1 +				a.pos1.z = a.z1 +				a.pos2.x = a.x2 +				a.pos2.y = a.y2 +				a.pos2.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" +				return rawset(areas.areas, key, a); +			end +		end +	}) +end + | 
