Reorder, add server spawn.

master
Beha 2017-01-03 12:51:50 -05:00
parent 0ee0d3617c
commit c33e55992f
12 changed files with 455 additions and 271 deletions

View File

@ -5,18 +5,18 @@ kingdoms.config = {
-- Check if a setting is defined in minetest.conf
function kingdoms.config._get(setting, default)
if type(default) == "boolean" then
local read = minetest.setting_getbool("kingdoms."..setting)
if read == nil then
return default
else
return read
end
elseif type(default) == "string" then
return minetest.setting_get("kingdoms."..setting) or default
elseif type(default) == "number" then
return tonumber(minetest.setting_get("kingdoms."..setting) or default)
end
if type(default) == "boolean" then
local read = minetest.setting_getbool("kingdoms."..setting)
if read == nil then
return default
else
return read
end
elseif type(default) == "string" then
return minetest.setting_get("kingdoms."..setting) or default
elseif type(default) == "number" then
return tonumber(minetest.setting_get("kingdoms."..setting) or default)
end
end
-- To set a default value: kingdoms.config.setting_name = value
@ -34,3 +34,15 @@ setmetatable(kingdoms.config, {
t._defaults[key] = value
end,
})
-- Generate a dynamic list of default level names.
function kingdoms.possible_levels()
local ret = {}
for k,v in kingdoms.utils.spairs(kingdoms.config._defaults, function(t, a, b) return (t[a] == t[b]) and (a < b) or (t[a] > t[b]) end) do
local value = string.match(k, "default_level_(.*)")
if value then
table.insert(ret, value)
end
end
return ret
end

View File

@ -12,8 +12,13 @@ function kingdoms.can_dig(r, pos, name)
local positions = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
{"kingdoms:corestone"})
{"kingdoms:corestone", "kingdoms:servercorestone"})
for _, pos in ipairs(positions) do
local nodename = minetest.get_node(pos).name
-- If this is the server spawn, nobody can dig here.
if nodename == "kingdoms:servercorestone" then
return false
end
local meta = minetest.get_meta(pos)
local kid = meta:get_string("kingdom.id")
if (not kingdom or kid ~= kingdom.id) and kingdoms.db.kingdoms[kid] then
@ -40,17 +45,28 @@ function kingdoms.bypos(pos)
{"kingdoms:corestone"})
for _, pos in ipairs(positions) do
local meta = minetest.get_meta(pos)
return kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
if kingdoms.db.kingdoms[meta:get_string("kingdom.id")] then
return kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
end
end
return nil
end
function kingdoms.bycspos(pos)
local meta = minetest.get_meta(pos)
return kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
end
function kingdoms.is_protected(pos, digger)
return not kingdoms.can_dig(kingdoms.config.corestone_radius, pos, digger)
end
old_is_protected = minetest.is_protected
function minetest.is_protected(pos, digger, digging)
-- If this is an admin, they can dig anywhere without a message.
if minetest.check_player_privs(digger, {protection_bypass = true}) then
return false
end
if kingdoms.is_protected(pos, digger) then
if _G['protection_lagporter'] ~= nil and digging then
protection_lagporter.check(pos, digger)
@ -61,14 +77,14 @@ function minetest.is_protected(pos, digger, digging)
end
-- Build the Corestone infotext, do not resend meta if unnecessary.
local function build_infotext(pos)
local akingdom = kingdoms.bypos(pos)
local function build_infotext(pos, nodename)
local meta = minetest.get_meta(pos)
local akingdom = kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
local infotext = ""
if akingdom then
infotext = "Corestone of "..akingdom.longname
infotext = nodename.." of "..akingdom.longname
else
infotext = "Inactive Corestone"
infotext = "Inactive "..nodename
end
if meta:get_string("infotext") ~= infotext then
meta:set_string("infotext", infotext)
@ -76,96 +92,176 @@ local function build_infotext(pos)
end
minetest.register_node("kingdoms:corestone", {
description = "Kingdom Core",
drawtype = "nodebox",
tiles = {
"moreblocks_circle_stone_bricks.png",
"moreblocks_circle_stone_bricks.png",
"moreblocks_circle_stone_bricks.png^protector_logo.png"
},
sounds = default.node_sound_stone_defaults(),
groups = {oddly_breakable_by_hand = 2, unbreakable = 1},
is_ground_content = false,
paramtype = "light",
light_source = 0,
description = "Kingdom Core",
drawtype = "nodebox",
tiles = {"kingdoms_corestone.png"},
sounds = default.node_sound_stone_defaults(),
groups = {oddly_breakable_by_hand = 2, unbreakable = 1},
is_ground_content = false,
paramtype = "light",
light_source = 0,
node_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
}
},
node_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
}
},
on_blast = function(a, b)
return
end,
on_place = function(itemstack, placer, pointed_thing)
if not placer or pointed_thing.type ~= "node" then
return itemstack
end
on_blast = function(a, b)
return
end,
on_place = function(itemstack, placer, pointed_thing)
if not placer or pointed_thing.type ~= "node" then
return itemstack
end
local kingdom = kingdoms.player.kingdom(placer:get_player_name())
if not kingdom or not kingdoms.player.can(placer:get_player_name(), "corestone") then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone if you are not of sufficient level in a kingdom.")
return itemstack
end
if pointed_thing.under.y < kingdoms.config.corestone_miny then
minetest.chat_send_player(placer:get_player_name(), ("You cannot place a corestone below %d."):format(kingdoms.config.corestone_miny))
return itemstack
end
local radius = kingdoms.config.corestone_radius * kingdoms.config.corestone_overlap_multiplier
kingdoms.spm(false)
local canplace = not kingdoms.can_dig(radius, pointed_thing.under, placer:get_player_name()) or not kingdoms.can_dig(radius, pointed_thing.above, placer:get_player_name())
kingdoms.spm(true)
if canplace then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone this close to another.")
return itemstack
end
kingdom.corestone = pointed_thing.above
kingdoms.log("action", ("Corestone of '%s' placed at %s."):format(kingdom.longname, minetest.pos_to_string(pointed_thing.above)))
return minetest.item_place(itemstack, placer, pointed_thing)
end,
after_place_node = function(pos, placer)
local kingdom = kingdoms.player.kingdom(placer:get_player_name())
local meta = minetest.get_meta(pos)
meta:set_string("kingdom.id", kingdom.id)
build_infotext(pos)
end,
local kingdom = kingdoms.player.kingdom(placer:get_player_name())
if not kingdom or not kingdoms.player.can(placer:get_player_name(), "corestone") then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone if you are not of sufficient level in a kingdom.")
return itemstack
end
can_dig = function(pos, digger)
local akingdom = kingdoms.bypos(pos)
local pkingdom = kingdoms.player.kingdom(digger:get_player_name())
-- Can only dig if this is the digger's kingdom and he has enough levels.
return not akingdom or (pkingdom and pkingdom.id == akingdom.id and kingdoms.player.can(digger:get_player_name(), "corestone"))
end,
if kingdom.corestone then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone if the kingdom already has a corestone placed.")
return itemstack
end
on_destruct = function(pos)
local kingdom = kingdoms.bypos(pos)
if not kingdom then return end
kingdom.corestone = nil
kingdoms.log("action", ("Corestone of '%s' removed at %s."):format(kingdom.longname, minetest.pos_to_string(pos)))
end,
if pointed_thing.under.y < kingdoms.config.corestone_miny then
minetest.chat_send_player(placer:get_player_name(), ("You cannot place a corestone below %d."):format(kingdoms.config.corestone_miny))
return itemstack
end
local radius = kingdoms.config.corestone_radius * kingdoms.config.corestone_overlap_multiplier
kingdoms.spm(false)
local canplace = not kingdoms.can_dig(radius, pointed_thing.under, placer:get_player_name()) or not kingdoms.can_dig(radius, pointed_thing.above, placer:get_player_name())
kingdoms.spm(true)
if canplace then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone this close to another.")
return itemstack
end
kingdom.corestone = pointed_thing.above
kingdoms.log("action", ("Corestone of '%s' placed at %s."):format(kingdom.longname, minetest.pos_to_string(pointed_thing.above)))
return minetest.item_place(itemstack, placer, pointed_thing)
end,
on_use = function(itemstack, user, pointed_thing)
end,
after_place_node = function(pos, placer)
local kingdom = kingdoms.player.kingdom(placer:get_player_name())
local meta = minetest.get_meta(pos)
meta:set_string("kingdom.id", kingdom.id)
build_infotext(pos, "Corestone")
end,
can_dig = function(pos, digger)
local akingdom = kingdoms.bycspos(pos)
local pkingdom = kingdoms.player.kingdom(digger:get_player_name())
-- Can only dig if this is the digger's kingdom and he has enough levels.
return not akingdom or (pkingdom and pkingdom.id == akingdom.id and kingdoms.player.can(digger:get_player_name(), "corestone"))
end,
on_destruct = function(pos)
local kingdom = kingdoms.bycspos(pos)
if not kingdom then return end
kingdom.corestone = nil
kingdoms.log("action", ("Corestone of '%s' removed at %s."):format(kingdom.longname, minetest.pos_to_string(pos)))
end,
on_rightclick = function(pos, node, clicker, itemstack)
end,
on_use = function(itemstack, user, pointed_thing)
end,
on_punch = function(pos, node, puncher)
end,
on_rightclick = function(pos, node, clicker, itemstack)
local akingdom = kingdoms.bycspos(pos)
if akingdom then
kingdoms.formspec_info.func(clicker:get_player_name(), akingdom)
end
end,
on_punch = function(pos, node, puncher)
end,
})
minetest.register_abm{
nodenames = {"kingdoms:corestone"},
interval = 1,
chance = 1,
action = build_infotext,
action = function(pos) build_infotext(pos, "Corestone") end,
}
minetest.register_node("kingdoms:servercorestone", {
description = "Server Core",
drawtype = "nodebox",
tiles = {"kingdoms_corestone.png"},
sounds = default.node_sound_stone_defaults(),
groups = {oddly_breakable_by_hand = 2, unbreakable = 1},
is_ground_content = false,
paramtype = "light",
light_source = 0,
node_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
}
},
on_blast = function(a, b)
return
end,
on_place = function(itemstack, placer, pointed_thing)
if not placer or pointed_thing.type ~= "node" then
return itemstack
end
if not minetest.check_player_privs(placer:get_player_name(), {server = true}) then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a server corestone. How did you even get it?")
return itemstack
end
if kingdoms.db.servercorestone then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a server corestone if there is already one placed.")
return itemstack
end
-- Even the server corestone cannot overlap already existent corestones.
local radius = kingdoms.config.corestone_radius * kingdoms.config.corestone_overlap_multiplier
kingdoms.spm(false)
local canplace = not kingdoms.can_dig(radius, pointed_thing.under, placer:get_player_name()) or not kingdoms.can_dig(radius, pointed_thing.above, placer:get_player_name())
kingdoms.spm(true)
if canplace then
minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone this close to another.")
return itemstack
end
kingdoms.db.servercorestone = pointed_thing.above
return minetest.item_place(itemstack, placer, pointed_thing)
end,
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Server Spawn")
end,
can_dig = function(pos, digger)
return minetest.check_player_privs(digger:get_player_name(), {server = true})
end,
on_destruct = function(pos)
kingdoms.db.servercorestone = nil
end,
on_use = function(itemstack, user, pointed_thing)
end,
on_rightclick = function(pos, node, clicker, itemstack)
end,
on_punch = function(pos, node, puncher)
end,
})

0
kingdoms/crafts.lua Normal file
View File

View File

@ -9,13 +9,14 @@ kingdoms.config.minlevel = 1
kingdoms.config.maxlevel = 100
-- Default levels.
kingdoms.config.default_level_set_levels = 100
kingdoms.config.default_level_corestone = 100
kingdoms.config.default_level_kick = 50
kingdoms.config.default_level_invite = 50
kingdoms.config.default_level_change_level = 25
kingdoms.config.default_level_build = 10
kingdoms.config.default_level_talk = 1
kingdoms.config.default_level_set_levels = 100 -- Change level values.
kingdoms.config.default_level_corestone = 100 -- Place or dig the corestone.
kingdoms.config.default_level_set_info = 75 -- Set the kingdom's info.
kingdoms.config.default_level_kick = 50 -- Kick a member of lower level than oneself.
kingdoms.config.default_level_invite = 50 -- Invite someone to join.
kingdoms.config.default_level_change_level = 25 -- Change someone's level if their level and the target level are lower than oneself.
kingdoms.config.default_level_build = 10 -- Build within the corestone's range.
kingdoms.config.default_level_talk = 1 -- Talk in the kingdom's main channel.
-- A corestone extends in a radius of <corestone_radius>.
kingdoms.config.corestone_radius = 5

0
kingdoms/gen.lua Normal file
View File

View File

@ -59,6 +59,8 @@ domodfile("player.lua")
domodfile("hud.lua")
domodfile("corestone.lua")
domodfile("gen.lua")
domodfile("crafts.lua")
-- All done!
kingdoms.log("action", "Completely loaded.")

View File

@ -6,6 +6,7 @@ local selectedinvitation = {}
local kmenuitems = {
{"invite", "Manage invitations"},
{"levels", "Manage levels"},
{"info", "Manage the description"},
{"leave", "Leave the kingdom"},
}
@ -14,6 +15,7 @@ for _,item in ipairs(kmenuitems) do
table.insert(kmenuitemsd, minetest.formspec_escape(item[2]))
end
-- The main formspecs, contains menus and options to all others and information about the current status.
local kcommand = {
params = "",
description = "Display the Kingdoms GUI.",
@ -31,8 +33,12 @@ local kcommand = {
minetest.show_formspec(name, "kingdoms:joined",
"size[9,6]"
.."label[0,0;"..minetest.formspec_escape(("%s | You are level %d in this kingdom."):format(kingdom.longname, kingdom.members[name].level)).."]"
.."label[0,0.5;Age: "..("%f"):format((os.time() - kingdom.created) / 60 / 60 / 24).." days]"
.."textlist[0,1;4,4;members;"..membersstring.."]"
.."label[0,0.5;Age: "
..("%f"):format((os.time() - kingdom.created) / 60 / 60 / 24)
.." days | Corestone: "..minetest.formspec_escape(kingdom.corestone and minetest.pos_to_string(kingdom.corestone) or "N/A")
..minetest.formspec_escape("\n")..kingdoms.utils.s("member", #kingdom.memberlist)
.."]"
.."textlist[0,1.5;4,4;members;"..membersstring.."]"
.."label[4.5,0;Kingdom Menu]"
.."textlist[4.75,0.5;4,5;menu;"..table.concat(kmenuitemsd, ",").."]"
)
@ -79,6 +85,7 @@ local function leave_kingdom(name)
kingdom.members[name] = nil
kingdoms.db.players[name] = nil
-- If there are no members, then the kingdom is disbanded.
if #kingdom.memberlist == 0 then
kingdoms.db.invitations = kingdoms.utils.filteri(kingdoms.db.invitations, function(v) return v.kingdom ~= kingdom.id end)
kingdoms.db.kingdoms[kingdom.id] = nil
@ -87,6 +94,8 @@ local function leave_kingdom(name)
return
end
-- If this was the level 100 member, choose a new level 100 member from the highest-level member available. If there are two or more, choose the one who joined first.
-- Level 100s can choose their successor by reserving level 99 for that purpose.
if level == kingdoms.config.maxlevel then
local highest = kingdom.members[kingdom.memberlist[1]]
for _,member in pairs(kingdom.members) do
@ -103,6 +112,7 @@ local function leave_kingdom(name)
end
end
-- The Neutral formspec, displays a list of invitations and functionality to create a new kingdom.
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:unjoined" then return false end
local name = player:get_player_name()
@ -182,6 +192,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return true
end)
-- The invitations formspec, manages invitations sent.
local formspec_invitations
formspec_invitations = {
selected = {},
@ -200,6 +211,43 @@ formspec_invitations = {
end,
}
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:invitations" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if not kingdoms.player.can(name, "invite") then return true end
if fields.invite then
if not core.get_auth_handler().get_auth(fields.iname) then
minetest.chat_send_player(name, "That player does not exist.")
return true
end
if kingdoms.player.kingdom(fields.iname) then
minetest.chat_send_player(name, "That player is already in a kingdom.")
return true
end
kingdoms.db.invitations[fields.iname] = kingdoms.db.invitations[fields.iname] or {}
table.insert(kingdoms.db.invitations[fields.iname], {
sender = name,
kingdom = kingdom.id,
})
table.insert(kingdom.invitations, fields.iname)
return formspec_invitations.func(name)
elseif fields.cancel then
local selected = formspec_invitations.selected[name]
if not selected then return true end
kingdoms.db.invitations[selected] = kingdoms.utils.filteri(kingdoms.db.invitations[selected], function(v)
return v ~= kingdom.id
end)
kingdom.invitations = kingdoms.utils.filteri(kingdom.invitations, function(v)
return v ~= selected
end)
return formspec_invitations.func(name)
elseif fields.invitations then
formspec_invitations.selected[name] = kingdom.invitations[minetest.explode_textlist_event(fields.invitations).index]
end
end)
-- The member formspec, manages an individual member.
local formspec_member = {
func = function(name)
local selected = selectedmember[name]
@ -216,138 +264,6 @@ local formspec_member = {
end,
}
local formspec_levels
formspec_levels = {
selected = {},
possible = {
"set_levels",
"corestone",
"kick",
"invite",
"change_level",
"build",
"talk",
},
func = function(name)
local kingdom = kingdoms.player.kingdom(name)
formspec_levels.selected[name] = formspec_levels.possible[1]
local n = {}
for _,level in ipairs(formspec_levels.possible) do
if not kingdom.levels[level] then
kingdom.levels[level] = kingdoms.config["default_level_"..level]
end
table.insert(n, minetest.formspec_escape(("%s - %d (default %d)"):format(level, kingdom.levels[level], kingdoms.config["default_level_"..level])))
end
minetest.show_formspec(name, "kingdoms:levels",
"size[4,5]"
.."button[0,0;4,1;kingdoms_special_exit;X]"
.."textlist[0,1;4,4;levels;"..table.concat(n, ",")..";1]"
)
return true
end,
}
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.kingdoms_special_exit then
return kcommand.func(player:get_player_name())
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:levels" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if fields.levels then
formspec_levels.selected[name] = formspec_levels.possible[minetest.explode_textlist_event(fields.levels).index]
if not kingdoms.player.can(name, "set_levels") then
minetest.chat_send_player(name, "You do not have sufficient level to set levels.")
return true
end
minetest.show_formspec(name, "kingdoms:setlevel", "size[4,3]"
.."label[0,0;Setting level: "..minetest.formspec_escape(formspec_levels.selected[name]).."]"
.."field[0.15,1;4,1;value;Value;"..tostring(kingdom.levels[formspec_levels.selected[name]]).."]"
.."button[0,2;4,1;go;Go]")
return true
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:setlevel" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
local state = kingdoms.player.kingdom_state(name)
local level = formspec_levels.selected[name]
local oldvalue = kingdom.levels[level]
local value = tonumber(fields.value)
if fields.go then
if oldvalue == value then
return formspec_levels.func(name)
end
if not kingdoms.player.can(name, "set_levels") then
minetest.chat_send_player(name, "You do not have sufficient level to set levels.")
return formspec_levels.func(name)
end
if value < kingdoms.config.minlevel or value > kingdoms.config.maxlevel then
minetest.chat_send_player(name, "Invalid level range.")
return true
end
if value > state.level or oldvalue > state.level then
minetest.chat_send_player(name, "You cannot set that level due to your own level.")
return true
end
kingdom.levels[level] = value
return formspec_levels.func(name)
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:joined" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if fields.menu then
local m = minetest.explode_textlist_event(fields.menu)
if not kmenuitems[m.index] then return true end
local selected = kmenuitems[m.index][1]
if selected == "invite" then
if not kingdoms.player.can(name, "invite") then
minetest.chat_send_player(name, "You do not have sufficent level to invite.")
return true
end
return formspec_invitations.func(name)
elseif selected == "leave" then
minetest.show_formspec(name, "kingdoms:leave", "size[4,3]"
.."label[0,0;Are you sure you want to leave the kingdom?]"
.."button[0,1;4,1;yes;Yes]"
.."button[0,2;4,1;no;No")
return true
elseif selected == "levels" then
return formspec_levels.func(name)
end
elseif fields.members then
selectedmember[name] = kingdom.memberlist[minetest.explode_textlist_event(fields.members).index]
if not selectedmember[name] then return true end
return formspec_member.func(name)
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:leave" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if fields.yes then
leave_kingdom(name)
kingdoms.log("action", ("'%s' has left '%s'."):format(name, kingdom.longname))
minetest.chat_send_player(name, "You are no longer a member of "..kingdom.longname)
else
minetest.chat_send_player(name, "You are still a member of "..kingdom.longname)
end
return kcommand.func(name)
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:member" then return false end
local name = player:get_player_name()
@ -397,38 +313,171 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return kcommand.func(name)
end)
-- The levels formspec, manages the level values of the kingdom.
local formspec_levels
formspec_levels = {
selected = {},
possible = kingdoms.possible_levels(),
func = function(name)
local kingdom = kingdoms.player.kingdom(name)
formspec_levels.selected[name] = formspec_levels.possible[1]
local n = {}
for _,level in ipairs(formspec_levels.possible) do
if not kingdom.levels[level] then
kingdom.levels[level] = kingdoms.config["default_level_"..level]
end
table.insert(n, minetest.formspec_escape(("%s - %d (default %d)"):format(level, kingdom.levels[level], kingdoms.config["default_level_"..level])))
end
minetest.show_formspec(name, "kingdoms:levels",
"size[4,5]"
.."button[0,0;4,1;kingdoms_special_exit;X]"
.."textlist[0,1;4,4;levels;"..table.concat(n, ",")..";1]"
)
return true
end,
}
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:invitations" then return false end
if formname ~= "kingdoms:levels" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if not kingdoms.player.can(name, "invite") then return true end
if fields.invite then
if not core.get_auth_handler().get_auth(fields.iname) then
minetest.chat_send_player(name, "That player does not exist.")
if fields.levels then
formspec_levels.selected[name] = formspec_levels.possible[minetest.explode_textlist_event(fields.levels).index]
if not kingdoms.player.can(name, "set_levels") then
minetest.chat_send_player(name, "You do not have sufficient level to set levels.")
return true
end
if kingdoms.player.kingdom(fields.iname) then
minetest.chat_send_player(name, "That player is already in a kingdom.")
return true
end
kingdoms.db.invitations[fields.iname] = kingdoms.db.invitations[fields.iname] or {}
table.insert(kingdoms.db.invitations[fields.iname], {
sender = name,
kingdom = kingdom.id,
})
table.insert(kingdom.invitations, fields.iname)
return formspec_invitations.func(name)
elseif fields.cancel then
local selected = formspec_invitations.selected[name]
if not selected then return true end
kingdoms.db.invitations[selected] = kingdoms.utils.filteri(kingdoms.db.invitations[selected], function(v)
return v ~= kingdom.id
end)
kingdom.invitations = kingdoms.utils.filteri(kingdom.invitations, function(v)
return v ~= selected
end)
return formspec_invitations.func(name)
elseif fields.invitations then
formspec_invitations.selected[name] = kingdom.invitations[minetest.explode_textlist_event(fields.invitations).index]
minetest.show_formspec(name, "kingdoms:setlevel", "size[4,3]"
.."label[0,0;Setting level: "..minetest.formspec_escape(formspec_levels.selected[name]).."]"
.."field[0.15,1;4,1;value;Value;"..tostring(kingdom.levels[formspec_levels.selected[name]]).."]"
.."button[0,2;4,1;go;Go]")
return true
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:setlevel" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
local state = kingdoms.player.kingdom_state(name)
local level = formspec_levels.selected[name]
local oldvalue = kingdom.levels[level]
local value = tonumber(fields.value)
if fields.go then
if oldvalue == value then
return formspec_levels.func(name)
end
if not kingdoms.player.can(name, "set_levels") then
minetest.chat_send_player(name, "You do not have sufficient level to set levels.")
return formspec_levels.func(name)
end
if value < kingdoms.config.minlevel or value > kingdoms.config.maxlevel then
minetest.chat_send_player(name, "Invalid level range.")
return true
end
if value > state.level or oldvalue > state.level then
minetest.chat_send_player(name, "You cannot set that level due to your own level.")
return true
end
kingdom.levels[level] = value
return formspec_levels.func(name)
end
end)
-- The info formspec, displays the kingdoms description.
local formspec_info = {
func = function(name, a)
local pkingdom = kingdoms.player.kingdom(name)
local akingdom = a
if not akingdom then
akingdom = pkingdom
end
local cansave = not a and kingdoms.player.can(name, "set_info") and (pkingdom and pkingdom.id == akingdom.id)
local s = "size[6,5]"
if (not a) and cansave then
s = "size[6,7]"
elseif (not a) or cansave then
s = "size[6,6]"
end
minetest.show_formspec(name, "kingdoms:info",
s
.."label[0,0;"..minetest.formspec_escape(("%s: founded %f days ago."):format(akingdom.longname, (os.time() - akingdom.created) / 60 / 60 / 24)).."]"
.."textarea[0.25,1;6,4;info;Info;"..minetest.formspec_escape(akingdom.info or "").."]"
..(cansave and "button[0,5;6,1;save;Save]" or "")
..((not a) and "button[0,6;6,1;kingdoms_special_exit;X]" or "")
)
return true
end,
}
kingdoms.formspec_info = formspec_info
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:info" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if fields.save then
if not kingdoms.player.can(name, "set_info") then
return true
end
kingdom.info = fields.info
return formspec_info.func(name)
end
end)
-- The core kingdom formspec, displays the member list and kingdom menu.
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:joined" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if fields.menu then
local m = minetest.explode_textlist_event(fields.menu)
if not kmenuitems[m.index] then return true end
local selected = kmenuitems[m.index][1]
if selected == "invite" then
if not kingdoms.player.can(name, "invite") then
minetest.chat_send_player(name, "You do not have sufficent level to invite.")
return true
end
return formspec_invitations.func(name)
elseif selected == "leave" then
minetest.show_formspec(name, "kingdoms:leave", "size[4,3]"
.."label[0,0;Are you sure you want to leave the kingdom?]"
.."button[0,1;4,1;yes;Yes]"
.."button[0,2;4,1;no;No")
return true
elseif selected == "levels" then
return formspec_levels.func(name)
elseif selected == "info" then
return formspec_info.func(name)
end
elseif fields.members then
selectedmember[name] = kingdom.memberlist[minetest.explode_textlist_event(fields.members).index]
if not selectedmember[name] then return true end
return formspec_member.func(name)
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "kingdoms:leave" then return false end
local name = player:get_player_name()
local kingdom = kingdoms.player.kingdom(name)
if fields.yes then
leave_kingdom(name)
kingdoms.log("action", ("'%s' has left '%s'."):format(name, kingdom.longname))
minetest.chat_send_player(name, "You are no longer a member of "..kingdom.longname)
else
minetest.chat_send_player(name, "You are still a member of "..kingdom.longname)
end
return kcommand.func(name)
end)
-- If the formspec has a special <X> button, return to the base formspec when it is pressed.
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.kingdoms_special_exit then
return kcommand.func(player:get_player_name())
end
end)

View File

@ -25,10 +25,16 @@ end
local function respawn(player)
local kingdom = kingdoms.player.kingdom(player:get_player_name())
if not kingdom or not kingdom.corestone then return false end
kingdoms.log("action", "Respawning "..player:get_player_name().." at corestone "..minetest.pos_to_string(kingdom.corestone).." of '"..kingdom.longname.."'")
player:setpos(vector.add(kingdom.corestone, {x=0, y=1, z=0}))
return true
if kingdom and kingdom.corestone then
kingdoms.log("action", "Respawning "..player:get_player_name().." at corestone "..minetest.pos_to_string(kingdom.corestone).." of '"..kingdom.longname.."'")
player:setpos(vector.add(kingdom.corestone, {x=0, y=1, z=0}))
return true
elseif kingdoms.db.servercorestone then
kingdoms.log("action", "Respawning "..player:get_player_name().." at server corestone "..minetest.pos_to_string(kingdoms.db.servercorestone)..".")
player:setpos(vector.add(kingdoms.db.servercorestone, {x=0, y=1, z=0}))
return true
end
return false
end
minetest.register_on_respawnplayer(respawn)

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

View File

@ -17,6 +17,7 @@ function kingdoms.utils.s(label, number, s)
end
end
-- Copy and return numeric-indexed table with only those entries matching <func>.
function kingdoms.utils.filteri(table, func)
local ret = {}
local i = 1
@ -27,4 +28,21 @@ function kingdoms.utils.filteri(table, func)
end
end
return ret
end
end
function kingdoms.utils.spairs(t, order)
local keys = {}
for k in pairs(t) do keys[#keys+1] = k end
if order then
table.sort(keys, function(a,b) return order(t, a, b) end)
else
table.sort(keys)
end
local i = 0
return function()
i = i + 1
if keys[i] then
return keys[i], t[keys[i]]
end
end
end