Add land.transfer()
parent
ca5897a30e
commit
091186ccd0
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue