Use minetest.show_formspec for button formspecs.

master
Nathan Salapat 2022-08-11 19:35:20 -05:00
parent 256a8049f1
commit 80fd11d709
4 changed files with 153 additions and 136 deletions

View File

@ -21,6 +21,7 @@ end
local function button_create(id, name, player_count, xp, pos_string, desc, builders, solo)
local pos = minetest.string_to_pos(pos_string)
local clean_pos = pos.x..','..pos.y..','..pos.z
player_count = player_count or 3
builders = builders or ''
solo = solo or 'true'
local formspec =
@ -69,11 +70,14 @@ local function button_display(id, name, owner, player_count, xp, pos, desc)
return formspec
end
local button_claim =
'formspec_version[3]'..
'size[12,6]'..
'label[4,1;Claim this button (15XP)]'..
'button_exit[3.5,4;4,1;claim;Claim This Button]'
local function button_claim(pos)
formspec =
'formspec_version[3]'..
'size[12,6]'..
'label[4,1;Claim this button (15XP)]'..
'button_exit[3.5,4;4,1;claim;Claim This Button]'
return formspec
end
minetest.register_node('lobby:button_0', {
description = 'Unconfigured Button',
@ -93,6 +97,7 @@ minetest.register_node('lobby:button_0', {
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local player_name = clicker:get_player_name()
lobby.button_pos[player_name] = pos
local meta = minetest.get_meta(pos)
local owner = meta:get_string('owner')
local id = meta:get_string('id')
@ -103,10 +108,11 @@ minetest.register_node('lobby:button_0', {
local desc = meta:get_string('desc')
local builders = meta:get_string('builders')
local solo = meta:get_string('solo')
meta:set_string('formspec', '')
if owner == '' then
meta:set_string('formspec', button_claim)
minetest.show_formspec(player_name, 'lobby:button_claim', button_claim(pos))
elseif owner == player_name or minetest.check_player_privs(clicker, {server = true}) then
meta:set_string('formspec', button_create(id, name, player_count, xp, pos, desc, builders, solo))
minetest.show_formspec(player_name, 'lobby:button_create', button_create(id, name, player_count, xp, pos, desc, builders, solo))
else
minetest.show_formspec(player_name, 'lobby:button_display', button_display(id, name, owner, player_count, xp, pos, desc))
lobby.stat[player_name] = id
@ -133,129 +139,6 @@ minetest.register_node('lobby:button_0', {
lobby.game[name] = map_id..'_builder'
end
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local owner = meta:get_string('owner')
local player_name = sender:get_player_name()
if fields ['claim'] then --Should make it so only builders can claim a button.
if lobby.take_xp(sender, 15) then
minetest.show_formspec(player_name, 'lobby:get_started', lobby.getting_started)
meta:set_string('owner', player_name)
local map_id = lobby.create_id(player_name)
lobby.savedata.IDs[map_id] = true
meta:set_string('id', map_id)
local pos_string = random_pos()
local pos = minetest.string_to_pos(pos_string)
local run = true
while run do
if not minetest.is_protected(pos, sender) and run then
minetest.load_area(pos)
meta:set_string('pos', pos_string)
worldedit.cube(pos, 5, 1, 5, 'color:grey_blocks', false)
minetest.set_node(pos, {name = 'lights:block_4'})
run = false
end
end
else
minetest.chat_send_player(player_name, 'You need more XP!')
end
end
if owner == player_name or minetest.check_player_privs(sender, {server = true}) then
local map_id = meta:get_string('id')
if not string.find(map_id, owner) then --Using old player assigned IDs
local map_id_new = lobby.create_id(owner)
lobby.savedata.IDs[map_id_new] = true
meta:set_string('id', map_id_new)
if lobby.savedata.stats[map_id] then
local stats = lobby.savedata.stats[map_id] or {}
local stats_new = {}
stats_new.solo_play = stats.solo_play or 0
stats_new.multi_play = stats.multi_play or 0
stats_new.winner_traitor = stats.winner_traitor or 0
stats_new.winner_team = stats.winner_team or 0
stats_new.player_count = stats.player_count or 0
stats_new.max_players = stats.max_players or 0
lobby.savedata.stats[map_id_new] = stats_new
lobby.savedata.IDs[map_id] = nil
lobby.savedata.stats[map_id] = nil
lobby.savedata.data[map_id] = nil
end
map_id = map_id_new
end
if fields.solo then
meta:set_string('solo', fields.solo)
elseif fields ['save'] then
meta:set_string('infotext', fields.name)
meta:set_string('name', fields.name)
meta:set_string('player_count', fields.player_count)
meta:set_string('xp', fields.xp)
meta:set_string('pos', fields.pos)
meta:set_string('desc', fields.desc)
meta:set_string('builders', fields.builders)
elseif fields ['submit'] then
meta:set_string('infotext', fields.name)
meta:set_string('name', fields.name)
meta:set_string('player_count', fields.player_count)
meta:set_string('xp', fields.xp)
meta:set_string('pos', fields.pos)
meta:set_string('desc', fields.desc)
meta:set_string('builders', fields.builders)
local dist = tonumber(minetest.settings:get("map_generation_limit") or 31000)
local x, y, z = string.match(fields.pos, "^(-?%d+),(-?%d+),(-?%d+)$")
local pos_x = tonumber(x)
local pos_y = tonumber(y)
local pos_z = tonumber(z)
local saveable = 0
if fields.name == '' then
minetest.chat_send_player(player_name, 'Sorry, a name is required. You can always change it later')
saveable = 1
end
if pos_x > dist or pos_x < -dist or pos_y > dist or pos_y < -dist or pos_z > dist or pos_z < -dist then
minetest.chat_send_player(player_name, 'Double check your spawn pos, values seem to be invalid.')
saveable = 1
end
if not lobby.is_integer(fields.player_count ) then
minetest.chat_send_player(player_name, 'An Integer is a whole number, your required player count is not.')
saveable = 1
end
if not lobby.is_integer(fields.xp) then
minetest.chat_send_player(player_name, 'An Integer is a whole number, your required XP amount is not.')
saveable = 1
end
if saveable == 0 then
local data = {}
data.builders = fields.builers
data.description = fields.desc
data.level_pos = {x = pos_x, y = pos_y+1, z = pos_z}
data.map_name = fields.name
data.owner_name = owner
data.required_players = math.max(fields.player_count, 3)
data.xp = math.max(tonumber(fields.xp),1)
lobby.savedata.data[map_id] = data
lobby.savedata.name_2_id[fields.name] = map_id
lobby.savedata.id_2_name[map_id] = fields.name
lobby.savedata.IDs[map_id] = true
minetest.swap_node(pos, {name = 'lobby:button_1'})
end
elseif fields ['discard'] then
meta:set_string('owner', '')
meta:set_string('infotext', 'Unconfigured/Unclaimed Button')
meta:set_string('id', '')
meta:set_string('name', '')
meta:set_string('player_count', '')
meta:set_string('xp', '')
meta:set_string('pos', '')
meta:set_string('desc', '')
meta:set_string('builders', '')
meta:set_string('solo', 'true')
local stats = lobby.savedata.stats[map_id]
if not stats then
lobby.savedata.IDs[map_id] = nil
end
lobby.give_xp(sender, 15)
end
end
end,
})
minetest.register_node('lobby:button_1', {
@ -299,7 +182,7 @@ minetest.register_node('lobby:button_1', {
player_attributes:set_string('mode', 'builder')
lobby.game[name] = map_id..'_builder'
else
local needed_players = tonumber(meta:get_string('player_count'))
local needed_players = game_data['required_players']
local objs = minetest.get_objects_inside_radius(pos, 3)
local player_count = 0
local map_players = {}
@ -410,5 +293,132 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
minetest.chat_send_player(name, 'You need to select a reason.')
end
end
elseif formname == 'lobby:button_claim' then
local name = player:get_player_name()
if lobby.is_builder(player) then
if lobby.take_xp(player, 15) then
local pos = lobby.button_pos[name]
local meta = minetest.get_meta(pos)
minetest.show_formspec(name, 'lobby:get_started', lobby.getting_started)
meta:set_string('owner', name)
local map_id = lobby.create_id(name)
lobby.savedata.IDs[map_id] = true
meta:set_string('id', map_id)
local pos_string = random_pos()
local pos = minetest.string_to_pos(pos_string)
local run = true
while run do
if not minetest.is_protected(pos, player) and run then
minetest.load_area(pos)
meta:set_string('pos', pos_string)
worldedit.cube(pos, 5, 1, 5, 'color:grey_blocks', false)
minetest.set_node(pos, {name = 'lights:block_4'})
run = false
end
end
end
else
minetest.chat_send_player(name, 'You need more XP!')
end
elseif formname == 'lobby:button_create' then
local name = player:get_player_name()
local pos = lobby.button_pos[name]
local meta = minetest.get_meta(pos)
local map_id = meta:get_string('id')
local owner = meta:get_string('owner')
if owner == name or minetest.check_player_privs(player, {server = true}) then
if not string.find(map_id, owner) then --Using old player assigned IDs
local map_id_new = lobby.create_id(owner)
lobby.savedata.IDs[map_id_new] = true
meta:set_string('id', map_id_new)
if lobby.savedata.stats[map_id] then
local stats = lobby.savedata.stats[map_id] or {}
local stats_new = {}
stats_new.solo_play = stats.solo_play or 0
stats_new.multi_play = stats.multi_play or 0
stats_new.winner_traitor = stats.winner_traitor or 0
stats_new.winner_team = stats.winner_team or 0
stats_new.player_count = stats.player_count or 0
stats_new.max_players = stats.max_players or 0
lobby.savedata.stats[map_id_new] = stats_new
lobby.savedata.IDs[map_id] = nil
lobby.savedata.stats[map_id] = nil
lobby.savedata.data[map_id] = nil
end
map_id = map_id_new
end
if fields.solo then
meta:set_string('solo', fields.solo)
elseif fields ['save'] then
meta:set_string('infotext', fields.name)
meta:set_string('name', fields.name)
meta:set_string('player_count', fields.player_count)
meta:set_string('xp', fields.xp)
meta:set_string('pos', fields.pos)
meta:set_string('desc', fields.desc)
meta:set_string('builders', fields.builders)
elseif fields ['submit'] then
meta:set_string('infotext', fields.name)
meta:set_string('name', fields.name)
meta:set_string('player_count', fields.player_count)
meta:set_string('xp', fields.xp)
meta:set_string('pos', fields.pos)
meta:set_string('desc', fields.desc)
meta:set_string('builders', fields.builders)
local dist = tonumber(minetest.settings:get("map_generation_limit") or 31000)
local x, y, z = string.match(fields.pos, "^(-?%d+),(-?%d+),(-?%d+)$")
local pos_x = tonumber(x)
local pos_y = tonumber(y)
local pos_z = tonumber(z)
local saveable = 0
if fields.name == '' then
minetest.chat_send_player(name, 'Sorry, a name is required. You can always change it later')
saveable = 1
end
if pos_x > dist or pos_x < -dist or pos_y > dist or pos_y < -dist or pos_z > dist or pos_z < -dist then
minetest.chat_send_player(name, 'Double check your spawn pos, values seem to be invalid.')
saveable = 1
end
if not lobby.is_integer(fields.player_count ) then
minetest.chat_send_player(name, 'An Integer is a whole number, your required player count is not.')
saveable = 1
end
if not lobby.is_integer(fields.xp) then
minetest.chat_send_player(name, 'An Integer is a whole number, your required XP amount is not.')
saveable = 1
end
if saveable == 0 then
local data = {}
data.builders = fields.builers
data.description = fields.desc
data.level_pos = {x = pos_x, y = pos_y+1, z = pos_z}
data.map_name = fields.name
data.owner_name = owner
data.required_players = math.max(fields.player_count, 3)
data.xp = math.max(tonumber(fields.xp),1)
lobby.savedata.data[map_id] = data
lobby.savedata.name_2_id[fields.name] = map_id
lobby.savedata.id_2_name[map_id] = fields.name
lobby.savedata.IDs[map_id] = true
minetest.swap_node(pos, {name = 'lobby:button_1'})
end
elseif fields ['discard'] then
meta:set_string('owner', '')
meta:set_string('infotext', 'Unconfigured/Unclaimed Button')
meta:set_string('id', '')
meta:set_string('name', '')
meta:set_string('player_count', '')
meta:set_string('xp', '')
meta:set_string('pos', '')
meta:set_string('desc', '')
meta:set_string('builders', '')
meta:set_string('solo', 'true')
local stats = lobby.savedata.stats[map_id]
if not stats then
lobby.savedata.IDs[map_id] = nil
end
lobby.give_xp(player, 15)
end
end
end
end)

View File

@ -93,16 +93,21 @@ minetest.register_chatcommand('kick', {
local actual_votes = lobby.votes[map_id] or 0
if not lobby.voted[name] then
lobby.vote_timer[map_id] = 1800
minetest.log('action', name..' just voted and reset the timer to 1800.')
minetest.register_globalstep(function(dtime)
if lobby.vote_timer[map_id] == 1 then
lobby.message_to_level(map_id, 'Voting time is over.')
minetest.log('action', 'Voting has ended')
lobby.vote(map_id, true)
elseif lobby.vote_timer[map_id] == 300 then
lobby.message_to_level(map_id, 'Thirty seconds left to vote.')
minetest.log('action', '30 seconds left to vote.')
elseif lobby.vote_timer[map_id] == 600 then
lobby.message_to_level(map_id, 'One minute left to vote.')
minetest.log('action', '60 seconds left to vote.')
elseif lobby.vote_timer[map_id] == 1200 then
lobby.message_to_level(map_id, 'Two minutes left to vote')
minetest.log('action', '120 seconds left to vote.')
end
if lobby.vote_timer[map_id] >= 0 then
lobby.vote_timer[map_id] = lobby.vote_timer[map_id] - 1
@ -133,6 +138,7 @@ minetest.register_chatcommand('skip', {
if map_id ~= 'lobby' then
local actual_votes = lobby.votes[map_id] or 0
if not lobby.voted[name] then
minetest.log('action', name..' just skipped voting and reset the timer to 1800.')
lobby.vote_timer[map_id] = 1800
minetest.chat_send_player(name, 'You skipped voting this round.')
lobby.voted[name] = true

View File

@ -12,7 +12,8 @@ lobby.spawn_pos = {x=29996, y=-4.5, z=30041.5}
lobby.spawn_pos = minetest.setting_get_pos('traitor_lobby_spawn') or lobby.spawn_pos
lobby.sabotage = {}
lobby.sabotage_level = {}
lobby.stat = {}
lobby.stat = {} --stores what map_id a player is looking at for viewing stats.
lobby.button_pos = {} --stores the pos of a button a player is viewing formspecs of.
--Yes I know these table names are not very clear.
--[[

View File

@ -94,16 +94,16 @@ function lobby.server_stats()
local stats = lobby.savedata.stats['server']
local max_players = stats.max_players
local max_id = stats.max_players_id
local max_name = lobby.savedata.id_2_name[max_id]
local max_name = lobby.savedata.id_2_name[max_id] or ''
local most_players = stats.most_played
local most_id = stats.most_played_id
local most_name = lobby.savedata.id_2_name[most_id]
local most_name = lobby.savedata.id_2_name[most_id] or ''
local traitor_wins = stats.traitor_wins
local traitor_id = stats.traitor_wins_id
local traitor_name = lobby.savedata.id_2_name[traitor_id]
local traitor_name = lobby.savedata.id_2_name[traitor_id] or ''
local team_wins = stats.team_wins
local team_id = stats.team_wins_id
local team_name = lobby.savedata.id_2_name[team_id]
local team_name = lobby.savedata.id_2_name[team_id] or ''
local formspec =
'textarea[.5,5.25;15,3.25;;;Serverwide Stats and Rankings:\n'..
max_name..' has the highest player count of any level with '..max_players..' playing at once.\n'..