Add sfinv, add tabs
This commit is contained in:
parent
f4e70557d3
commit
97091c6037
7 changed files with 261 additions and 77 deletions
|
@ -1 +1,2 @@
|
||||||
ctf
|
ctf
|
||||||
|
sfinv
|
||||||
|
|
|
@ -1,46 +1,40 @@
|
||||||
ctf.register_on_init(function()
|
local fs = [[
|
||||||
ctf._set("inventory", false)
|
size[8,8.6]
|
||||||
end)
|
bgcolor[#080808BB;true]
|
||||||
|
background[5,5;1,1;gui_formbg.png;true]
|
||||||
local fs = "size[8,8.5]" ..
|
{{ nav }}
|
||||||
"bgcolor[#080808BB;true]" ..
|
textlist[0,0;7.85,8.5;help;
|
||||||
"background[5,5;1,1;gui_formbg.png;true]" ..
|
]]
|
||||||
"listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" ..
|
|
||||||
"list[current_player;main;0,4.25;8,1;]" ..
|
|
||||||
"list[current_player;main;0,5.5;8,3;8]" ..
|
|
||||||
"textlist[0,0;7.85,4;help;"
|
|
||||||
|
|
||||||
local items = {
|
local items = {
|
||||||
"Welcome to Capture the Flag!",
|
"Tips",
|
||||||
"* There is no crafting, look for stuff in chests.",
|
"",
|
||||||
"* Your team color is displayed in the top left.",
|
"* Capture an enemy's flag by walking up to it, punching it,",
|
||||||
|
" then running and punching your team's flag.",
|
||||||
|
"* Look for guns, grenades and other resources in chests.",
|
||||||
|
"* Guns can destroy blocks.",
|
||||||
|
"* See the league table by typing /rankings",
|
||||||
|
" See your position in it by typing /rankings me",
|
||||||
|
" Get to the top by capturing lots of flags, and having a high K/D ratio.",
|
||||||
|
"* Your team has a chest near your flag.",
|
||||||
|
" Be warned that other teams can steal from it.",
|
||||||
|
"* Your team name is displayed in the top left.",
|
||||||
" to talk with only your team, type: /t message",
|
" to talk with only your team, type: /t message",
|
||||||
"* If the match is getting boring, type /vote_next",
|
"* If the match is getting boring, type /vote, then /yes to vote yes.",
|
||||||
"* rubenwardy is the only admin or mod on this server.",
|
"* Report people who sabotage using /report."
|
||||||
" Message him using /mail rubenwardy your message"
|
|
||||||
}
|
}
|
||||||
for i = 1, #items do
|
for i = 1, #items do
|
||||||
if i > 1 then
|
items[i] = minetest.formspec_escape(items[i])
|
||||||
fs = fs .. ","
|
|
||||||
end
|
|
||||||
fs = fs .. minetest.formspec_escape(items[i])
|
|
||||||
end
|
end
|
||||||
|
fs = fs .. table.concat(items, ",") .. "]"
|
||||||
|
|
||||||
|
sfinv.register_page("ctf_inventory:help", {
|
||||||
|
title = "Help",
|
||||||
|
get = function(player, context)
|
||||||
|
return fs
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
--"list[current_player;craft;1.75,0.5;3,3;]" ..
|
|
||||||
--"list[current_player;craftpreview;5.75,1.5;1,1;]" ..
|
|
||||||
--"image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]" ..
|
|
||||||
--"listring[current_player;main]" ..
|
|
||||||
--"listring[current_player;craft]" ..
|
|
||||||
fs = fs ..
|
|
||||||
"]" ..
|
|
||||||
"image[0,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[1,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[2,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[3,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[4,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[5,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[6,4.25;1,1;gui_hb_bg.png]" ..
|
|
||||||
"image[7,4.25;1,1;gui_hb_bg.png]"
|
|
||||||
|
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
if ctf.setting("inventory") then
|
if ctf.setting("inventory") then
|
||||||
|
|
|
@ -46,21 +46,12 @@ function random_messages.check_params(name,func,params)
|
||||||
end
|
end
|
||||||
|
|
||||||
function random_messages.read_messages()
|
function random_messages.read_messages()
|
||||||
local line_number = 1
|
random_messages.messages = {
|
||||||
local input = io.open(minetest.get_worldpath().."/random_messages","r")
|
"To talk to only your team, start your messages with /t. For example, /t Hello team!",
|
||||||
if not input then
|
"If the map is ruined, use /vote to start a new vote to skip the current match.",
|
||||||
local output = io.open(minetest.get_worldpath().."/random_messages","w")
|
"Eat apples to restore health quickly.",
|
||||||
output:write("To talk to only your team, start your messages with /t. For example, /t Hello team!\n")
|
"You can steal items from the other team's chest."
|
||||||
output:write("If the map is ruined, use /vote to start a new vote to skip the current match.\n")
|
}
|
||||||
output:write("Eat apples to restore health quickly.\n")
|
|
||||||
io.close(output)
|
|
||||||
input = io.open(minetest.get_worldpath().."/random_messages","r")
|
|
||||||
end
|
|
||||||
for line in input:lines() do
|
|
||||||
random_messages.messages[line_number] = line
|
|
||||||
line_number = line_number + 1
|
|
||||||
end
|
|
||||||
io.close(input)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function random_messages.display_message(message_number)
|
function random_messages.display_message(message_number)
|
||||||
|
|
1
mods/rules/depends.txt
Normal file
1
mods/rules/depends.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
sfinv?
|
|
@ -1,35 +1,49 @@
|
||||||
-- License: WTFPL
|
-- License: WTFPL
|
||||||
|
|
||||||
|
|
||||||
rules = {}
|
rules = {}
|
||||||
function rules.show(player)
|
|
||||||
local msgs = {
|
local items = {
|
||||||
"Welcome to Capture the Flag!",
|
"Welcome to Capture the Flag!",
|
||||||
|
"",
|
||||||
"Developed and hosted by rubenwardy.",
|
"Developed and hosted by rubenwardy.",
|
||||||
"Moderators: Kpenguin, Thomas-S, Dragonop,",
|
"Moderators: Kpenguin, Thomas-S, Dragonop,",
|
||||||
" stormchaser3000, Calinou.",
|
" stormchaser3000, Calinou, sparky/ircSparky.",
|
||||||
" tip: use /vote to skip to the next round",
|
"By playing on this server you agree to these rules:",
|
||||||
",By playing on this server you agree to these rules:",
|
|
||||||
"1. Be nice. eg: No (excessive or bad) swearing",
|
"1. Be nice. eg: No (excessive or bad) swearing",
|
||||||
"2. No dating.",
|
"2. No dating.",
|
||||||
"3. Don't be a cheater. No hacked clients.",
|
"3. Don't be a cheater. No hacked clients.",
|
||||||
"4. Don't be a traitor. Don't:",
|
"4. Don't be a traitor. Don't:",
|
||||||
" a. Dig blocks in your base to make it less secure or",
|
" a. Dig blocks in your base to make it less secure or",
|
||||||
" to trap team mates on purpose.",
|
" to trap team mates on purpose.",
|
||||||
" b. Help the other team.",
|
" b. Help the other team win.",
|
||||||
"5. Don't impersonate other community members",
|
"5. Don't impersonate other community members",
|
||||||
"Failure to follow these rules may result in a kick or ban",
|
"Failure to follow these rules may result in a kick or ban",
|
||||||
" (temp or permanent) depending on severity."}
|
" (temp or permanent) depending on severity.",
|
||||||
|
"Use /report to send a message to a moderator.",
|
||||||
|
"For example, /report bobgreen is destroying our base"}
|
||||||
|
|
||||||
local fs = ""
|
for i = 1, #items do
|
||||||
for _, line in pairs(msgs) do
|
items[i] = minetest.formspec_escape(items[i])
|
||||||
if fs ~= "" then
|
end
|
||||||
fs = fs .. ","
|
rules.txt = table.concat(items, ",")
|
||||||
end
|
|
||||||
fs = fs .. minetest.formspec_escape(line)
|
if minetest.global_exists("sfinv") then
|
||||||
|
sfinv.register_page("rules:rules", {
|
||||||
|
title = "Rules",
|
||||||
|
get = function(player, context)
|
||||||
|
return ([[
|
||||||
|
size[8,8.6]
|
||||||
|
bgcolor[#080808BB;true]
|
||||||
|
background[5,5;1,1;gui_formbg.png;true]
|
||||||
|
{{ nav }}
|
||||||
|
textlist[0,0;7.85,8.5;help;]] .. rules.txt .. "]")
|
||||||
end
|
end
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
function rules.show(player)
|
||||||
fs = "size[8,8]textlist[0.1,0.1;7.8,6;msg;" .. fs .. "]"
|
local fs = "size[8,8]textlist[0.1,0.1;7.8,6;msg;" .. rules.txt .. "]"
|
||||||
if minetest.check_player_privs(player:get_player_name(), { interact = true }) then
|
if minetest.check_player_privs(player:get_player_name(), { interact = true }) then
|
||||||
fs = fs .. "button_exit[0.5,6;7,2;yes;Okay]"
|
fs = fs .. "button_exit[0.5,6;7,2;yes;Okay]"
|
||||||
else
|
else
|
||||||
|
|
153
mods/sfinv/api.lua
Normal file
153
mods/sfinv/api.lua
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
local theme = [[size[8,8.6]
|
||||||
|
bgcolor[#080808BB;true]
|
||||||
|
background[5,5;1,1;gui_formbg.png;true]
|
||||||
|
{{ nav }}
|
||||||
|
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
|
||||||
|
list[current_player;main;0,4.25;8,1;]
|
||||||
|
list[current_player;main;0,5.5;8,3;8] ]]
|
||||||
|
|
||||||
|
sfinv = {
|
||||||
|
pages = {},
|
||||||
|
pages_unordered = {},
|
||||||
|
homepage_name = "sfinv:crafting",
|
||||||
|
contexts = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sfinv.register_page(name, def)
|
||||||
|
if not name or not def or not def.get then
|
||||||
|
error("Invalid sfinv page. Requires a name & def, and a get function in def")
|
||||||
|
end
|
||||||
|
sfinv.pages[name] = def
|
||||||
|
def.name = name
|
||||||
|
table.insert(sfinv.pages_unordered, def)
|
||||||
|
end
|
||||||
|
|
||||||
|
function sfinv.parse_variables(fs, vars)
|
||||||
|
local ret = fs
|
||||||
|
for key, value in pairs(vars) do
|
||||||
|
print("Running " .. key .. "=" .. value .. " on string")
|
||||||
|
ret = string.gsub(ret, "{{([ ]+)" .. key .. "([ ]+)}}", value)
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
function sfinv.get(player, context)
|
||||||
|
local page = sfinv.pages[context.page]
|
||||||
|
if not page then
|
||||||
|
page = sfinv.pages["404"]
|
||||||
|
end
|
||||||
|
print(dump(page))
|
||||||
|
|
||||||
|
local fs = page:get(player, context)
|
||||||
|
local nav = {}
|
||||||
|
local nav_ids = {}
|
||||||
|
local current_idx = 1
|
||||||
|
for i, pdef in pairs(sfinv.pages_unordered) do
|
||||||
|
if not pdef.is_in_nav or pdef.is_in_nav(player, context) then
|
||||||
|
nav[#nav + 1] = pdef.title
|
||||||
|
nav_ids[#nav_ids + 1] = pdef.name
|
||||||
|
if pdef.name == context.page then
|
||||||
|
current_idx = i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
context.nav = nav_ids
|
||||||
|
|
||||||
|
print(dump(context))
|
||||||
|
print(current_idx)
|
||||||
|
|
||||||
|
local vars = {
|
||||||
|
layout = theme,
|
||||||
|
name = player:get_player_name(),
|
||||||
|
nav = "tabheader[0,0;tabs;" .. table.concat(nav, ",") .. ";" .. current_idx .."]"
|
||||||
|
}
|
||||||
|
fs = sfinv.parse_variables(fs, vars)
|
||||||
|
fs = sfinv.parse_variables(fs, vars)
|
||||||
|
return fs
|
||||||
|
end
|
||||||
|
|
||||||
|
function sfinv.set(player, context)
|
||||||
|
if not context then
|
||||||
|
local name = player:get_player_name()
|
||||||
|
context = sfinv.contexts[name]
|
||||||
|
if not context then
|
||||||
|
context = {
|
||||||
|
page = sfinv.homepage_name
|
||||||
|
}
|
||||||
|
sfinv.contexts[name] = context
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print("Setting " .. context.page)
|
||||||
|
local fs = sfinv.get(player, context)
|
||||||
|
print(fs)
|
||||||
|
player:set_inventory_formspec(fs)
|
||||||
|
|
||||||
|
--[[local tmp = [ [
|
||||||
|
size[8,8.6]
|
||||||
|
image[4.06,3.4;0.8,0.8;creative_trash_icon.png]
|
||||||
|
list[current_player;main;0,4.7;8,1;]
|
||||||
|
list[current_player;main;0,5.85;8,3;8]
|
||||||
|
list[detached:creative_trash;main;4,3.3;1,1;]
|
||||||
|
tablecolumns[color;text;color;text]
|
||||||
|
tableoptions[background=#00000000;highlight=#00000000;border=false]
|
||||||
|
button[5.4,3.2;0.8,0.9;creative_prev;<]
|
||||||
|
button[7.25,3.2;0.8,0.9;creative_next;>]
|
||||||
|
button[2.1,3.4;0.8,0.5;search;?]
|
||||||
|
button[2.75,3.4;0.8,0.5;clear;X]
|
||||||
|
tooltip[search;Search]
|
||||||
|
tooltip[clear;Reset]
|
||||||
|
listring[current_player;main]
|
||||||
|
] ] ..
|
||||||
|
"field[0.3,3.5;2.2,1;filter;;".. filter .."]"..
|
||||||
|
"listring[detached:creative_".. player_name ..";main]"..
|
||||||
|
"tabheader[0,0;tabs;Crafting,All,Nodes,Tools,Items;".. tostring(tab_id) ..";true;false]"..
|
||||||
|
"list[detached:creative_".. player_name ..";main;0,0;8,3;".. tostring(start_i) .."]"..
|
||||||
|
"table[6.05,3.35;1.15,0.5;pagenum;#FFFF00,".. tostring(pagenum) ..",#FFFFFF,/ ".. tostring(pagemax) .."]"..
|
||||||
|
default.get_hotbar_bg(0,4.7)..
|
||||||
|
default.gui_bg .. default.gui_bg_img .. default.gui_slots
|
||||||
|
]]--
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(player)
|
||||||
|
minetest.after(0.5, function()
|
||||||
|
minetest.chat_send_player(player:get_player_name(), "Hello!")
|
||||||
|
sfinv.set(player)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
if formname ~= "" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
print("Received fields! " .. dump(fields))
|
||||||
|
|
||||||
|
-- Get Context
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local context = sfinv.contexts[name]
|
||||||
|
if not context then
|
||||||
|
sfinv.set(player)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Handle Events
|
||||||
|
if fields.tabs and context.nav then
|
||||||
|
local tid = tonumber(fields.tabs)
|
||||||
|
if tid and tid > 0 then
|
||||||
|
local id = context.nav[tid]
|
||||||
|
if id and sfinv.pages[id] then
|
||||||
|
print(name .. " views sfinv/" .. id)
|
||||||
|
|
||||||
|
-- TODO: on_leave
|
||||||
|
context.page = id
|
||||||
|
sfinv.set(player, context)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pass to page
|
||||||
|
local page = sfinv.pages[context.page]
|
||||||
|
if page and page.on_player_receive_fields then
|
||||||
|
return page.on_player_receive_fields(player, context, fields)
|
||||||
|
end
|
||||||
|
end)
|
30
mods/sfinv/init.lua
Normal file
30
mods/sfinv/init.lua
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
dofile(minetest.get_modpath("sfinv") .. "/api.lua")
|
||||||
|
|
||||||
|
sfinv.register_page("sfinv:crafting", {
|
||||||
|
title = "Crafting",
|
||||||
|
is_in_nav = function(player, context)
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
get = function(player, context)
|
||||||
|
return [[ {{ layout }}
|
||||||
|
list[current_player;craft;1.75,0.5;3,3;]
|
||||||
|
list[current_player;craftpreview;5.75,1.5;1,1;]
|
||||||
|
image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]
|
||||||
|
listring[current_player;main]
|
||||||
|
listring[current_player;craft]
|
||||||
|
image[0,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[1,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[2,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[3,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[4,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[5,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[6,4.25;1,1;gui_hb_bg.png]
|
||||||
|
image[7,4.25;1,1;gui_hb_bg.png] ]]
|
||||||
|
end,
|
||||||
|
on_player_receive_fields = function(player, context, fields)
|
||||||
|
print("Received!")
|
||||||
|
end,
|
||||||
|
on_leave = function(player, context)
|
||||||
|
print("Left page!")
|
||||||
|
end
|
||||||
|
})
|
Loading…
Reference in a new issue