Reorder, add server spawn.
parent
0ee0d3617c
commit
c33e55992f
|
@ -34,3 +34,15 @@ setmetatable(kingdoms.config, {
|
||||||
t._defaults[key] = value
|
t._defaults[key] = value
|
||||||
end,
|
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
|
||||||
|
|
|
@ -12,8 +12,13 @@ function kingdoms.can_dig(r, pos, name)
|
||||||
local positions = minetest.find_nodes_in_area(
|
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},
|
||||||
{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
|
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 meta = minetest.get_meta(pos)
|
||||||
local kid = meta:get_string("kingdom.id")
|
local kid = meta:get_string("kingdom.id")
|
||||||
if (not kingdom or kid ~= kingdom.id) and kingdoms.db.kingdoms[kid] then
|
if (not kingdom or kid ~= kingdom.id) and kingdoms.db.kingdoms[kid] then
|
||||||
|
@ -40,17 +45,28 @@ function kingdoms.bypos(pos)
|
||||||
{"kingdoms:corestone"})
|
{"kingdoms:corestone"})
|
||||||
for _, pos in ipairs(positions) do
|
for _, pos in ipairs(positions) do
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
if kingdoms.db.kingdoms[meta:get_string("kingdom.id")] then
|
||||||
return kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
|
return kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
|
||||||
end
|
end
|
||||||
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
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)
|
function kingdoms.is_protected(pos, digger)
|
||||||
return not kingdoms.can_dig(kingdoms.config.corestone_radius, pos, digger)
|
return not kingdoms.can_dig(kingdoms.config.corestone_radius, pos, digger)
|
||||||
end
|
end
|
||||||
|
|
||||||
old_is_protected = minetest.is_protected
|
old_is_protected = minetest.is_protected
|
||||||
function minetest.is_protected(pos, digger, digging)
|
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 kingdoms.is_protected(pos, digger) then
|
||||||
if _G['protection_lagporter'] ~= nil and digging then
|
if _G['protection_lagporter'] ~= nil and digging then
|
||||||
protection_lagporter.check(pos, digger)
|
protection_lagporter.check(pos, digger)
|
||||||
|
@ -61,14 +77,14 @@ function minetest.is_protected(pos, digger, digging)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Build the Corestone infotext, do not resend meta if unnecessary.
|
-- Build the Corestone infotext, do not resend meta if unnecessary.
|
||||||
local function build_infotext(pos)
|
local function build_infotext(pos, nodename)
|
||||||
local akingdom = kingdoms.bypos(pos)
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
local akingdom = kingdoms.db.kingdoms[meta:get_string("kingdom.id")]
|
||||||
local infotext = ""
|
local infotext = ""
|
||||||
if akingdom then
|
if akingdom then
|
||||||
infotext = "Corestone of "..akingdom.longname
|
infotext = nodename.." of "..akingdom.longname
|
||||||
else
|
else
|
||||||
infotext = "Inactive Corestone"
|
infotext = "Inactive "..nodename
|
||||||
end
|
end
|
||||||
if meta:get_string("infotext") ~= infotext then
|
if meta:get_string("infotext") ~= infotext then
|
||||||
meta:set_string("infotext", infotext)
|
meta:set_string("infotext", infotext)
|
||||||
|
@ -78,11 +94,7 @@ end
|
||||||
minetest.register_node("kingdoms:corestone", {
|
minetest.register_node("kingdoms:corestone", {
|
||||||
description = "Kingdom Core",
|
description = "Kingdom Core",
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {
|
tiles = {"kingdoms_corestone.png"},
|
||||||
"moreblocks_circle_stone_bricks.png",
|
|
||||||
"moreblocks_circle_stone_bricks.png",
|
|
||||||
"moreblocks_circle_stone_bricks.png^protector_logo.png"
|
|
||||||
},
|
|
||||||
sounds = default.node_sound_stone_defaults(),
|
sounds = default.node_sound_stone_defaults(),
|
||||||
groups = {oddly_breakable_by_hand = 2, unbreakable = 1},
|
groups = {oddly_breakable_by_hand = 2, unbreakable = 1},
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
|
@ -111,6 +123,11 @@ minetest.register_node("kingdoms:corestone", {
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
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
|
||||||
|
|
||||||
if pointed_thing.under.y < kingdoms.config.corestone_miny then
|
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))
|
minetest.chat_send_player(placer:get_player_name(), ("You cannot place a corestone below %d."):format(kingdoms.config.corestone_miny))
|
||||||
return itemstack
|
return itemstack
|
||||||
|
@ -136,18 +153,18 @@ minetest.register_node("kingdoms:corestone", {
|
||||||
local kingdom = kingdoms.player.kingdom(placer:get_player_name())
|
local kingdom = kingdoms.player.kingdom(placer:get_player_name())
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
meta:set_string("kingdom.id", kingdom.id)
|
meta:set_string("kingdom.id", kingdom.id)
|
||||||
build_infotext(pos)
|
build_infotext(pos, "Corestone")
|
||||||
end,
|
end,
|
||||||
|
|
||||||
can_dig = function(pos, digger)
|
can_dig = function(pos, digger)
|
||||||
local akingdom = kingdoms.bypos(pos)
|
local akingdom = kingdoms.bycspos(pos)
|
||||||
local pkingdom = kingdoms.player.kingdom(digger:get_player_name())
|
local pkingdom = kingdoms.player.kingdom(digger:get_player_name())
|
||||||
-- Can only dig if this is the digger's kingdom and he has enough levels.
|
-- 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"))
|
return not akingdom or (pkingdom and pkingdom.id == akingdom.id and kingdoms.player.can(digger:get_player_name(), "corestone"))
|
||||||
end,
|
end,
|
||||||
|
|
||||||
on_destruct = function(pos)
|
on_destruct = function(pos)
|
||||||
local kingdom = kingdoms.bypos(pos)
|
local kingdom = kingdoms.bycspos(pos)
|
||||||
if not kingdom then return end
|
if not kingdom then return end
|
||||||
kingdom.corestone = nil
|
kingdom.corestone = nil
|
||||||
kingdoms.log("action", ("Corestone of '%s' removed at %s."):format(kingdom.longname, minetest.pos_to_string(pos)))
|
kingdoms.log("action", ("Corestone of '%s' removed at %s."):format(kingdom.longname, minetest.pos_to_string(pos)))
|
||||||
|
@ -156,16 +173,95 @@ minetest.register_node("kingdoms:corestone", {
|
||||||
on_use = function(itemstack, user, pointed_thing)
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
end,
|
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 = 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)
|
on_rightclick = function(pos, node, clicker, itemstack)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
on_punch = function(pos, node, puncher)
|
on_punch = function(pos, node, puncher)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_abm{
|
|
||||||
nodenames = {"kingdoms:corestone"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
action = build_infotext,
|
|
||||||
}
|
|
||||||
|
|
|
@ -9,13 +9,14 @@ kingdoms.config.minlevel = 1
|
||||||
kingdoms.config.maxlevel = 100
|
kingdoms.config.maxlevel = 100
|
||||||
|
|
||||||
-- Default levels.
|
-- Default levels.
|
||||||
kingdoms.config.default_level_set_levels = 100
|
kingdoms.config.default_level_set_levels = 100 -- Change level values.
|
||||||
kingdoms.config.default_level_corestone = 100
|
kingdoms.config.default_level_corestone = 100 -- Place or dig the corestone.
|
||||||
kingdoms.config.default_level_kick = 50
|
kingdoms.config.default_level_set_info = 75 -- Set the kingdom's info.
|
||||||
kingdoms.config.default_level_invite = 50
|
kingdoms.config.default_level_kick = 50 -- Kick a member of lower level than oneself.
|
||||||
kingdoms.config.default_level_change_level = 25
|
kingdoms.config.default_level_invite = 50 -- Invite someone to join.
|
||||||
kingdoms.config.default_level_build = 10
|
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_talk = 1
|
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>.
|
-- A corestone extends in a radius of <corestone_radius>.
|
||||||
kingdoms.config.corestone_radius = 5
|
kingdoms.config.corestone_radius = 5
|
||||||
|
|
|
@ -59,6 +59,8 @@ domodfile("player.lua")
|
||||||
|
|
||||||
domodfile("hud.lua")
|
domodfile("hud.lua")
|
||||||
domodfile("corestone.lua")
|
domodfile("corestone.lua")
|
||||||
|
domodfile("gen.lua")
|
||||||
|
domodfile("crafts.lua")
|
||||||
|
|
||||||
-- All done!
|
-- All done!
|
||||||
kingdoms.log("action", "Completely loaded.")
|
kingdoms.log("action", "Completely loaded.")
|
||||||
|
|
|
@ -6,6 +6,7 @@ local selectedinvitation = {}
|
||||||
local kmenuitems = {
|
local kmenuitems = {
|
||||||
{"invite", "Manage invitations"},
|
{"invite", "Manage invitations"},
|
||||||
{"levels", "Manage levels"},
|
{"levels", "Manage levels"},
|
||||||
|
{"info", "Manage the description"},
|
||||||
{"leave", "Leave the kingdom"},
|
{"leave", "Leave the kingdom"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +15,7 @@ for _,item in ipairs(kmenuitems) do
|
||||||
table.insert(kmenuitemsd, minetest.formspec_escape(item[2]))
|
table.insert(kmenuitemsd, minetest.formspec_escape(item[2]))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- The main formspecs, contains menus and options to all others and information about the current status.
|
||||||
local kcommand = {
|
local kcommand = {
|
||||||
params = "",
|
params = "",
|
||||||
description = "Display the Kingdoms GUI.",
|
description = "Display the Kingdoms GUI.",
|
||||||
|
@ -31,8 +33,12 @@ local kcommand = {
|
||||||
minetest.show_formspec(name, "kingdoms:joined",
|
minetest.show_formspec(name, "kingdoms:joined",
|
||||||
"size[9,6]"
|
"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;"..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]"
|
.."label[0,0.5;Age: "
|
||||||
.."textlist[0,1;4,4;members;"..membersstring.."]"
|
..("%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]"
|
.."label[4.5,0;Kingdom Menu]"
|
||||||
.."textlist[4.75,0.5;4,5;menu;"..table.concat(kmenuitemsd, ",").."]"
|
.."textlist[4.75,0.5;4,5;menu;"..table.concat(kmenuitemsd, ",").."]"
|
||||||
)
|
)
|
||||||
|
@ -79,6 +85,7 @@ local function leave_kingdom(name)
|
||||||
kingdom.members[name] = nil
|
kingdom.members[name] = nil
|
||||||
kingdoms.db.players[name] = nil
|
kingdoms.db.players[name] = nil
|
||||||
|
|
||||||
|
-- If there are no members, then the kingdom is disbanded.
|
||||||
if #kingdom.memberlist == 0 then
|
if #kingdom.memberlist == 0 then
|
||||||
kingdoms.db.invitations = kingdoms.utils.filteri(kingdoms.db.invitations, function(v) return v.kingdom ~= kingdom.id end)
|
kingdoms.db.invitations = kingdoms.utils.filteri(kingdoms.db.invitations, function(v) return v.kingdom ~= kingdom.id end)
|
||||||
kingdoms.db.kingdoms[kingdom.id] = nil
|
kingdoms.db.kingdoms[kingdom.id] = nil
|
||||||
|
@ -87,6 +94,8 @@ local function leave_kingdom(name)
|
||||||
return
|
return
|
||||||
end
|
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
|
if level == kingdoms.config.maxlevel then
|
||||||
local highest = kingdom.members[kingdom.memberlist[1]]
|
local highest = kingdom.members[kingdom.memberlist[1]]
|
||||||
for _,member in pairs(kingdom.members) do
|
for _,member in pairs(kingdom.members) do
|
||||||
|
@ -103,6 +112,7 @@ local function leave_kingdom(name)
|
||||||
end
|
end
|
||||||
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)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
if formname ~= "kingdoms:unjoined" then return false end
|
if formname ~= "kingdoms:unjoined" then return false end
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
@ -182,6 +192,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
return true
|
return true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- The invitations formspec, manages invitations sent.
|
||||||
local formspec_invitations
|
local formspec_invitations
|
||||||
formspec_invitations = {
|
formspec_invitations = {
|
||||||
selected = {},
|
selected = {},
|
||||||
|
@ -200,6 +211,43 @@ formspec_invitations = {
|
||||||
end,
|
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 = {
|
local formspec_member = {
|
||||||
func = function(name)
|
func = function(name)
|
||||||
local selected = selectedmember[name]
|
local selected = selectedmember[name]
|
||||||
|
@ -216,138 +264,6 @@ local formspec_member = {
|
||||||
end,
|
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)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
if formname ~= "kingdoms:member" then return false end
|
if formname ~= "kingdoms:member" then return false end
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
|
@ -397,38 +313,171 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
return kcommand.func(name)
|
return kcommand.func(name)
|
||||||
end)
|
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)
|
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 name = player:get_player_name()
|
||||||
local kingdom = kingdoms.player.kingdom(name)
|
local kingdom = kingdoms.player.kingdom(name)
|
||||||
if not kingdoms.player.can(name, "invite") then return true end
|
|
||||||
if fields.invite then
|
if fields.levels then
|
||||||
if not core.get_auth_handler().get_auth(fields.iname) then
|
formspec_levels.selected[name] = formspec_levels.possible[minetest.explode_textlist_event(fields.levels).index]
|
||||||
minetest.chat_send_player(name, "That player does not exist.")
|
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
|
return true
|
||||||
end
|
end
|
||||||
if kingdoms.player.kingdom(fields.iname) then
|
minetest.show_formspec(name, "kingdoms:setlevel", "size[4,3]"
|
||||||
minetest.chat_send_player(name, "That player is already in a kingdom.")
|
.."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
|
return true
|
||||||
end
|
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)
|
end)
|
||||||
kingdom.invitations = kingdoms.utils.filteri(kingdom.invitations, function(v)
|
|
||||||
return v ~= selected
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
end)
|
if formname ~= "kingdoms:setlevel" then return false end
|
||||||
return formspec_invitations.func(name)
|
local name = player:get_player_name()
|
||||||
elseif fields.invitations then
|
local kingdom = kingdoms.player.kingdom(name)
|
||||||
formspec_invitations.selected[name] = kingdom.invitations[minetest.explode_textlist_event(fields.invitations).index]
|
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
|
||||||
end)
|
end)
|
||||||
|
|
|
@ -25,10 +25,16 @@ end
|
||||||
|
|
||||||
local function respawn(player)
|
local function respawn(player)
|
||||||
local kingdom = kingdoms.player.kingdom(player:get_player_name())
|
local kingdom = kingdoms.player.kingdom(player:get_player_name())
|
||||||
if not kingdom or not kingdom.corestone then return false end
|
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.."'")
|
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}))
|
player:setpos(vector.add(kingdom.corestone, {x=0, y=1, z=0}))
|
||||||
return true
|
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
|
end
|
||||||
|
|
||||||
minetest.register_on_respawnplayer(respawn)
|
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 |
|
@ -17,6 +17,7 @@ function kingdoms.utils.s(label, number, s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Copy and return numeric-indexed table with only those entries matching <func>.
|
||||||
function kingdoms.utils.filteri(table, func)
|
function kingdoms.utils.filteri(table, func)
|
||||||
local ret = {}
|
local ret = {}
|
||||||
local i = 1
|
local i = 1
|
||||||
|
@ -28,3 +29,20 @@ function kingdoms.utils.filteri(table, func)
|
||||||
end
|
end
|
||||||
return ret
|
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
|
||||||
|
|
Loading…
Reference in New Issue