Add land.transfer()

master
rubenwardy 2018-11-21 17:11:46 +00:00
parent ca5897a30e
commit 091186ccd0
3 changed files with 114 additions and 2 deletions

View File

@ -84,6 +84,54 @@ function land.get_by_area_id(id)
return area and area.land_type and area
end
function land.transfer(id, newowner, pname)
assert(type(id) == "number")
assert(type(newowner) == "string")
assert(type(pname) == "string")
local area = areas.areas[id]
if not area then
return false, "Unable to find area id=" .. id
end
if not area.parent then
return false, "Unable to transfer root areas"
end
local land_admin = minetest.check_player_privs(pname, { land_admin = true })
local comp = company.get_from_owner_str(area.owner)
if not land_admin then
if comp then
local comp_active = company.get_active(pname)
if not comp_active or comp_active.name ~= comp.name then
return false, "You're not currently acting on behalf of " .. comp.title
end
if not comp:check_perm(pname, "TRANSFER_LAND") then
return false, "Missing permission: TRANSFER_LAND"
end
elseif pname ~= area.owner then
return false, "You don't have access to land owned by " .. area.owner
end
end
if not minetest.player_exists(newowner) and
not company.get_from_owner_str(newowner) then
if newowner:sub(1, 2) == "c:" then
return false, "New owner " .. newowner .. " doesn't exist"
else
return false, "New owner " .. newowner .. " doesn't exist (did you forget 'c:'?)"
end
end
adt:post(pname, comp.name, "Transferred area id=" .. id .. " to " .. newowner)
area.owner = newowner
areas:save()
return true, "Transfered area id=" .. id .. " to " .. newowner
end
function land.can_set_price(area, pname)
if not area or not area.land_type then
return false, "Unable to sell unowned or unclassified (ie: c/i/r) area"

View File

@ -13,6 +13,19 @@ ChatCmdBuilder.new("land", function(cmd)
return true, "Showed land debug form"
end)
cmd:sub("owner :id:int :newowner", function(name, id, newowner)
return land.transfer(id, newowner, name)
end)
cmd:sub("owner :id:int", function(name, id)
local area = areas.areas[id]
if not area then
return false, "Unable to find area id=" .. id
end
return true, area.owner
end)
cmd:sub("set_type :id:int :type", function(name, id, type)
if not minetest.check_player_privs(name, { land_admin = true }) then
return false, "Missing privilege: land_admin"

View File

@ -13,9 +13,9 @@ _G.company = {}
function company.get_from_owner_str(owner)
local data
if owner == "c:government" then
data = { name = "government", owner = "testuser" }
data = { name = "government", title = "Government", owner = "testuser" }
elseif owner == "c:test" then
data = { name = "test", owner = "testuser" }
data = { name = "test", title = "Test", owner = "testuser" }
else
return nil
end
@ -37,6 +37,15 @@ function company.get_active(pname)
end
end
_G.minetest = {
player_exists = function(name)
return name == "testuser"
end,
check_player_privs = function()
return false
end,
}
describe("land", function()
it("get_by_area_id", function()
@ -51,7 +60,49 @@ describe("land", function()
assert.equals(land.get_by_area_id(1), areas.areas[1])
end)
it("transfer", function()
local area = areas.areas[1]
area.owner = "c:government"
assert.equals(land.get_by_area_id(1), area)
assert.equals(area.owner, "c:government")
local suc, msg = land.transfer(2, "c:test", "testuser")
assert.is_false(suc)
assert.is_not_nil(msg:match("to find area"))
assert.equals(area.owner, "c:government")
suc, msg = land.transfer(1, "c:test", "testuser")
assert.is_false(suc)
assert.is_not_nil(msg:match("transfer root areas"))
assert.equals(area.owner, "c:government")
area.parent = 3
suc, msg = land.transfer(1, "c:test", "testuser")
assert.is_false(suc)
assert.is_not_nil(msg:match("acting on behalf"))
assert.equals(area.owner, "c:government")
company.is_active = true
suc, msg = land.transfer(1, "nonexist", "testuser")
assert.is_false(suc)
assert.is_not_nil(msg:match("did you forget"))
assert.equals(area.owner, "c:government")
suc, msg = land.transfer(1, "c:nonexist", "testuser")
assert.is_false(suc)
assert.is_not_nil(msg:match("doesn't exist"))
assert.equals(area.owner, "c:government")
suc = land.transfer(1, "c:test", "testuser")
assert.is_true(suc)
assert.equals(area.owner, "c:test")
end)
it("set_price", function()
company.is_active = false
local area = { owner = "c:test", id=1 }
assert.is_nil(area.land_sale)