more commands
This commit is contained in:
parent
136f47b2be
commit
34fa2fc7fa
23
chat.lua
23
chat.lua
@ -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
|
||||||
|
@ -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
|
||||||
|
71
init.lua
71
init.lua
@ -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
139
town.lua
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user