more commands

This commit is contained in:
Evert Prants 2019-01-13 01:27:26 +02:00
parent 136f47b2be
commit 34fa2fc7fa
Signed by: evert
GPG Key ID: 1688DA83D222D0B5
4 changed files with 167 additions and 70 deletions

View File

@ -115,7 +115,7 @@ local function town_command (name, param)
local town = towny:get_player_town(name) local town = towny:get_player_town(name)
-- Pre town requirement -- Pre town requirement
local print_town_info = nil local town_info = nil
if (pr1 == "create" or pr1 == "new") and pr2 then if (pr1 == "create" or pr1 == "new") and pr2 then
return towny:create_town(nil, name, pr2) return towny:create_town(nil, name, pr2)
@ -125,16 +125,16 @@ local function town_command (name, param)
return join_town(pr2,name,false) return join_town(pr2,name,false)
elseif pr1 == "show" or pr1 == "info" then elseif pr1 == "show" or pr1 == "info" then
if towny:get_town_by_name(pr2) then if towny:get_town_by_name(pr2) then
print_town_info = pr2 town_info = pr2
else else
return false, "No such town." return false, "No such town."
end end
elseif param == "" and town then elseif param == "" and town then
print_town_info = town town_info = town
end end
-- Print town information -- Print town information
if print_town_info then if town_info then
return false, "Not yet implemented!" return false, "Not yet implemented!"
end end
@ -169,11 +169,26 @@ local function town_command (name, param)
"WARNING! Deleting your town will render ALL of the buildings in it without protection!")) "WARNING! Deleting your town will render ALL of the buildings in it without protection!"))
return false, "Please run the command again with 'I WANT TO DELETE MY TOWN' in all caps written after it." return false, "Please run the command again with 'I WANT TO DELETE MY TOWN' in all caps written after it."
end end
elseif param == "greeting" then
local tdata = towny.towns[town]
if not tdata.flags["greeting"] then return false, "This town has no greeting message." end
return true,
minetest.colorize("#078e36", ("[%s] "):format(towny:get_full_name(town))) ..
minetest.colorize("#02aacc", tdata.flags["greeting"])
elseif pr1 == "kick" then elseif pr1 == "kick" then
return towny:kick_member(town,name,pr2) return towny:kick_member(town,name,pr2)
elseif pr1 == "set" then elseif pr1 == "set" then
local flag, value = string.match(pr2, "^([%a%d_-]+) (.+)$") local flag, value = string.match(pr2, "^([%a%d_-]+) (.+)$")
return towny:set_town_flags(nil,name,flag,value) return towny:set_town_flags(nil,name,flag,value)
elseif pr1 == "member" then
local action, user = string.match(pr2, "^([%a%d_-]+) (.+)$")
if action == "kick" then
return towny:kick_member(town,name,pr2)
elseif action == "set" then
local target, flag, value = string.match(user, "^([%a%d_-]+) ([%a%d_-]+) (.+)$")
return towny:set_town_member_flags(nil,name,target,flag,value)
end
end end
-- Plot management commands -- Plot management commands

View File

@ -8,8 +8,8 @@ function towny.flatfile:write_meta(town,dir,data)
local filepath = town.."."..extension local filepath = town.."."..extension
minetest.mkdir(directory) minetest.mkdir(directory)
if data.dirty then data.dirty = nil end data.dirty = nil
if data.level then data.level = nil end data.level = nil
local serialized local serialized
if serialize then if serialize then

View File

@ -68,6 +68,40 @@ towny = {
claimblocks = 448, claimblocks = 448,
} }
}, },
flags = {
town = {
['town_build'] = {"boolean", "lets everyone build in unplotted town claims"},
['plot_build'] = {"boolean", "lets everyone build in unowned town plots"},
['plot_member_build'] = {"boolean", "if false, plot members don't have build rights to plots by default"},
['teleport'] = {"vector", "town teleport point"},
['pvp'] = {"boolean", "players can fight in the town if true, ignores server pvp settings"},
['plot_pvp'] = {"boolean", "default plot pvp setting. defaults to false"},
['joinable'] = {"boolean", "if true, anyone can join this town. defaults to false"},
['greeting'] = {"string", "town's greeting message"},
['tax'] = {"number", "how much each member has to pay each day to stay in town"},
['bank'] = {"number", "town's treasury", false},
['claim_blocks'] = {"number", "town's bonus claim blocks", false},
['origin'] = {"vector", "town's center position, set at town creation", false},
},
town_member = {
['town_build'] = {"boolean", "member can build in unplotted town claims"},
['claim_create'] = {"boolean", "member can claim land for the town"},
['claim_delete'] = {"boolean", "member can abandon claim blocks"},
['plot_create'] = {"boolean", "member can create plots"},
['plot_delete'] = {"boolean", "member can delete plots"},
},
plot = {
['teleport'] = {"vector", "plot's teleport point"},
['pvp'] = {"boolean", "players can fight here if true, ignores server pvp settings"},
['cost'] = {"number", "plot cost (only with economy)"},
['claimable'] = {"boolean", "is this plot available for claiming. if cost is more than 0, require payment"},
['greeting'] = {"string", "plot's greeting message (defaults to \"{owner}'s Plot\"/\"Unclaimed Plot\")"},
},
plot_member = {
['plot_build'] = {"boolean", "member can build on plot. defaults to 'plot_member_build' town flag"},
['build'] = "plot_build",
},
},
-- Set to true if files need to be updated -- Set to true if files need to be updated
dirty = false, dirty = false,
@ -103,43 +137,6 @@ towny = {
} }
]] ]]
-- Town-specific flags
--[[
'town_build' boolean lets everyone build in unplotted town claims
'plot_build' boolean lets everyone build in unowned town plots
'plot_member_build' boolean if false, plot members don't have build rights to plots by default
'teleport' position town teleport point
'pvp' boolean players can fight in the town if true, ignores server pvp settings
'plot_pvp' boolean default plot pvp setting. defaults to false
'joinable' boolean if true, anyone can join this town. defaults to false
'greeting' string town's greeting message
'tax' float how much each member has to pay each day to stay in town (only with economy)
'bank' float town's wealth (only with economy) (unchangeable by owner)
'claim_blocks' int town's bonus claim blocks (unchangeable by owner)
'origin' position town's center position, set at town creation (unchangeable by owner)
]]
-- Members with flags
--[[
'plot_build' boolean if 'plot_member_build' town flag is false,
this one must be true for a plot member to be able to build on a plot.
If set to true in town flags, this member can build in all plots.
'town_build' boolean if true, this member can build in town claims.
'claim_create' boolean if true, this member can claim land for the town
'claim_delete' boolean if true, this member can abandon claim blocks
'plot_create' boolean if true, this member can create plots
'plot_delete' boolean if true, this member can delete plots
]]
-- Plot-specific flags
--[[
'teleport' position plot's teleport point
'pvp' boolean players can fight here if true, ignores server pvp settings
'cost' float plot cost (only with economy)
'claimable' boolean is this plot available for claiming. if cost is more than 0, require payment
'greeting' string plot's greeting message (defaults to "{owner}'s Plot"/"Unclaimed Plot")
]]
dofile(modpath.."/flatfile.lua") dofile(modpath.."/flatfile.lua")
dofile(modpath.."/visualize.lua") dofile(modpath.."/visualize.lua")
dofile(modpath.."/regions.lua") dofile(modpath.."/regions.lua")

139
town.lua
View File

@ -12,6 +12,45 @@ local function count(T)
return count return count
end end
local function flag_typeify(value,pos)
if type(value) == "string" then
if value == "true" then
value = true
elseif value == "false" then
value = false
elseif value == "here" and pos then
value = pos
elseif value == "none" or value == "null" or value == "nil" then
value = nil
elseif tonumber(value) ~= nil then
value = tonumber(value)
elseif minetest.string_to_pos(value) ~= nil then
value = minetest.string_to_pos(value)
end
end
return value
end
local function flag_validity(flag,scope,value,pos)
value = flag_typeify(value,pos)
if value == nil then return true end
local spd = towny.flags[scope]
if type(spd[flag]) == "string" then
flag = spd[flag]
end
if not spd[flag] then return false end
if spd[flag][3] == false then return false end
if spd[flag][1] == "vector" and (not value.x or not value.y or not value.z) then
return false
elseif spd[flag][1] ~= "vary" and type(value) ~= spd[flag][1] then
return false
end
return true, flag, value
end
function towny:get_player_town(name) function towny:get_player_town(name)
for town,data in pairs(towny.towns) do for town,data in pairs(towny.towns) do
if data.mayor == name then if data.mayor == name then
@ -515,25 +554,6 @@ function towny:plot_member(pos,player,member,action)
return true return true
end end
local function flag_typeify(value,pos)
if type(value) == "string" then
if value == "true" then
value = true
elseif value == "false" then
value = false
elseif value == "here" then
value = pos
elseif value == "none" or value == "null" or value == "nil" then
value = nil
elseif tonumber(value) ~= nil then
value = tonumber(value)
elseif minetest.string_to_pos(value) ~= nil then
value = minetest.string_to_pos(value)
end
end
return value
end
-- Set flags -- Set flags
function towny:set_plot_flags(pos,player,flag,value) function towny:set_plot_flags(pos,player,flag,value)
@ -563,9 +583,13 @@ function towny:set_plot_flags(pos,player,flag,value)
return err_msg(player, "You do not have permission to modify this plot.") return err_msg(player, "You do not have permission to modify this plot.")
end end
minetest.chat_send_player(player, ("Successfully set the plot flag '%s' to '%s'!") local fs,flag,res = flag_validity(flag, 'plot', value, pos)
:format(flag, value)) if not fs then
plot_data.flags[flag] = flag_typeify(value,pos) return err_msg(player, "Invalid flag or flag value.")
end
minetest.chat_send_player(player, ("Successfully set the plot flag '%s' to '%s'!"):format(flag, value))
plot_data.flags[flag] = res
towny:mark_dirty(t, false) towny:mark_dirty(t, false)
end end
@ -600,11 +624,14 @@ function towny:set_plot_member_flags(pos,player,member,flag,value)
return err_msg(player, "There is no such member in this plot.") return err_msg(player, "There is no such member in this plot.")
end end
if flag == "build" then flag = "plot_build" end local fs,flag,res = flag_validity(flag, 'plot_member', value, pos)
if not fs then
return err_msg(player, "Invalid flag or flag value.")
end
minetest.chat_send_player(player, ("Successfully set the plot member %s's flag '%s' to '%s'!") minetest.chat_send_player(player, ("Successfully set the plot member %s's flag '%s' to '%s'!")
:format(member, flag, value)) :format(member, flag, value))
plot_data.members[member][flag] = flag_typeify(value,pos) plot_data.members[member][flag] = res
towny:mark_dirty(t, false) towny:mark_dirty(t, false)
end end
@ -630,12 +657,50 @@ function towny:set_town_flags(pos,player,flag,value)
return err_msg(player, "You do not have permission to modify this town.") return err_msg(player, "You do not have permission to modify this town.")
end end
if (flag == 'bank' or flag == 'claim_blocks' or flag == 'origin') and not towny_admin then local fs,flag,res = flag_validity(flag, 'town', value, pos)
return err_msg(player, "You cannot change this flag.") if not fs then
return err_msg(player, "Invalid flag or invalid or unchangeable flag value.")
end end
minetest.chat_send_player(player, ("Successfully set the town flag '%s' to '%s'!"):format(flag,value)) minetest.chat_send_player(player, ("Successfully set the town flag '%s' to '%s'!"):format(flag,value))
data.flags[flag] = flag_typeify(value,pos) data.flags[flag] = res
towny:mark_dirty(t, false)
end
function towny:set_town_member_flags(pos,player,member,flag,value)
if not member or not flag then return false end
local towny_admin = minetest.check_player_privs(player, { towny_admin = true })
if not pos then
pos = minetest.get_player_by_name(player):get_pos()
end
local town = towny:get_player_town(player)
if not town and not towny_admin then
return err_msg(player, "You're not currently in a town!")
end
local t,p,c = towny.regions:get_town_at(pos)
if not t or (t ~= town and not towny_admin) then
return err_msg(player, "You are not in any town you can modify.")
end
local data = towny.towns[t]
if data.mayor ~= player and not towny_admin then
return err_msg(player, "You do not have permission to modify this town.")
end
if not data.members[member] then
return err_msg(player, "There is no such member in this town.")
end
local fs,flag,res = flag_validity(flag, 'town_member', value, pos)
if not fs then
return err_msg(player, "Invalid flag or flag value.")
end
minetest.chat_send_player(player, ("Successfully set the town member %s's flag '%s' to '%s'!")
:format(member, flag, value))
data.members[member][flag] = res
towny:mark_dirty(t, false) towny:mark_dirty(t, false)
end end
@ -695,6 +760,13 @@ function towny:get_member_count(town)
return count(tdata.members) return count(tdata.members)
end end
function towny:get_full_name(town)
local tdata = towny.towns[town]
if not tdata then return nil end
if not tdata.level then return tdata.name end
return ("%s (%s)"):format(tdata.name, tdata.level.name_tag)
end
function towny:get_town_level(town, update) function towny:get_town_level(town, update)
local tdata = towny.towns[town] local tdata = towny.towns[town]
if not tdata then return nil end if not tdata then return nil end
@ -708,3 +780,16 @@ function towny:get_town_level(town, update)
tdata.level = lvl tdata.level = lvl
return lvl return lvl
end end
minetest.register_on_joinplayer(function (player)
local town = towny:get_player_town(player:get_player_name())
if not town then return end
local tdata = towny.towns[town]
if not tdata then return nil end
if not tdata.flags["greeting"] then return nil end
minetest.chat_send_player(player:get_player_name(),
minetest.colorize("#078e36", ("[%s] "):format(towny:get_full_name(town))) ..
minetest.colorize("#02aacc", tdata.flags["greeting"]))
end)