diff --git a/mods/capturetheflag/ctf/core.lua b/mods/capturetheflag/ctf/core.lua index 1c8a922..6ce7a7d 100644 --- a/mods/capturetheflag/ctf/core.lua +++ b/mods/capturetheflag/ctf/core.lua @@ -1,3 +1,12 @@ +ctf.registered_on_load = {} +function ctf.register_on_load(func) + table.insert(ctf.registered_on_load, func) +end +ctf.registered_on_save = {} +function ctf.register_on_save(func) + table.insert(ctf.registered_on_save, func) +end + function ctf.init() print("[CaptureTheFlag] Initialising...") @@ -6,7 +15,6 @@ function ctf.init() ctf.teams = {} ctf.players = {} ctf.claimed = {} - ctf.diplo = {diplo = {}} -- Settings: Feature enabling ctf._set("node_ownership",true) @@ -22,7 +30,7 @@ function ctf.init() ctf._set("team_channel",true) -- do teams have their own chat channel ctf._set("global_channel",true) -- Can players chat with other teams on /all. If team_channel is false, this does nothing. ctf._set("players_can_change_team",true) - + -- Settings: Teams ctf._set("allocate_mode", 0) -- how are players allocated to teams? 0: none, 1: random, 2: one of first two largest groups, 3 smallest group ctf._set("maximum_in_team", -1) -- Maximum number in team, obeyed by allocation and /join. Admins don't obey this @@ -34,19 +42,10 @@ function ctf.init() ctf._set("flag_protect_distance", 25) -- how far do flags protect? ctf._set("team_gui_initial", "news") -- [news/flags/diplo/admin] - the starting tab - local file = io.open(minetest.get_worldpath().."/ctf.txt", "r") - if file then - local table = minetest.deserialize(file:read("*all")) - if type(table) == "table" then - ctf.teams = table.teams - ctf.players = table.players - ctf.diplo.diplo = table.diplo - return - end - end + ctf.load() end --- Set settings +-- Set default setting value function ctf._set(setting,default) ctf._defsettings[setting] = default end @@ -63,16 +62,42 @@ function ctf.setting(name) end end --- Save game +function ctf.load() + local file = io.open(minetest.get_worldpath().."/ctf.txt", "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + ctf.teams = table.teams + ctf.players = table.players + + for i = 1, #ctf.registered_on_load do + ctf.registered_on_load[i](table) + end + return + end + end +end + function ctf.save() print("[CaptureTheFlag] Saving data...") local file = io.open(minetest.get_worldpath().."/ctf.txt", "w") if file then - file:write(minetest.serialize({ + local out = { teams = ctf.teams, - players = ctf.players, - diplo = ctf.diplo.diplo - })) + players = ctf.players + } + + for i = 1, #ctf.registered_on_save do + local res = ctf.registered_on_save[i]() + + if res then + for key, value in pairs(res) do + out[key] = value + end + end + end + + file:write(minetest.serialize(out)) file:close() end end @@ -93,9 +118,9 @@ function ctf.team(name) -- get or add a team players={}, flags = {} } - + ctf.save() - + return ctf.teams[name.name] else return ctf.teams[name] @@ -112,7 +137,7 @@ function ctf.count_players_in_team(team) end -- get a player -function ctf.player(name) +function ctf.player(name) return ctf.players[name] end @@ -123,11 +148,11 @@ function ctf.join(name, team, force) end local player = ctf.player(name) - + if not player then player = {name = name} end - + if not force and not ctf.setting("players_can_change_team") and (not player.team or player.team == "") then minetest.chat_send_player(name, "You are not allowed to switch teams, traitor!") return false @@ -188,7 +213,7 @@ end -- Sees if the player can change stuff in a team function ctf.can_mod(player,team) local privs = minetest.get_player_privs(player) - + if privs then if privs.team == true then return true @@ -223,25 +248,25 @@ minetest.register_on_newplayer(function(player) local name = player:get_player_name() local max_players = ctf.setting("maximum_in_team") local alloc_mode = tonumber(ctf.setting("allocate_mode")) - + if alloc_mode == 0 then return elseif alloc_mode == 1 then local index = {} - + for key, team in pairs(ctf.teams) do if max_players == -1 or ctf.count_players_in_team(key) < max_players then table.insert(index, key) end end - + if #index == 0 then minetest.log("error", "[CaptureTheFlag] No teams to join!") else local team = index[math.random(1, #index)] - + print(name.." was allocated to "..team) - + ctf.join(name, team) end elseif alloc_mode == 2 then @@ -258,19 +283,19 @@ minetest.register_on_newplayer(function(player) one = key one_count = count end - + if count > two_count then two = key two_count = count - end + end end end - + if not one and not two then minetest.log("error", "[CaptureTheFlag] No teams to join!") elseif one and two then if math.random() > 0.5 then - print(name.." was allocated to "..one) + print(name.." was allocated to "..one) ctf.join(name, one) else print(name.." was allocated to "..two) @@ -278,9 +303,9 @@ minetest.register_on_newplayer(function(player) end else if one then - print(name.." was allocated to "..one) + print(name.." was allocated to "..one) ctf.join(name, one) - else + else print(name.." was allocated to "..two) ctf.join(name, two) end @@ -295,7 +320,7 @@ minetest.register_on_newplayer(function(player) smallest_count = count end end - + if not smallest then minetest.log("error", "[CaptureTheFlag] No teams to join!") else diff --git a/mods/capturetheflag/ctf/diplomacy.lua b/mods/capturetheflag/ctf/diplomacy.lua index 1ecd658..f504e02 100644 --- a/mods/capturetheflag/ctf/diplomacy.lua +++ b/mods/capturetheflag/ctf/diplomacy.lua @@ -1,5 +1,15 @@ -- diplo states: war, peace, alliance -ctf.diplo = {} +ctf.diplo = { + diplo = {} +} + +ctf.register_on_load(function(table) + ctf.diplo.diplo = table.diplo +end) + +ctf.register_on_save(function() + return { diplo = ctf.diplo.diplo } +end) function ctf.diplo.get(one,two) if not ctf.diplo.diplo then @@ -28,40 +38,40 @@ function ctf.diplo.set(one,two,state) end end end - + table.insert(ctf.diplo.diplo,{one=one,two=two,state=state}) return end function ctf.diplo.check_requests(one,two) local team = ctf.team(two) - + if not team.log then return nil end - + for i=1,#team.log do if team.log[i].team == one and team.log[i].type=="request" and team.log[i].mode=="diplo" then return team.log[i].msg end end - + return nil end function ctf.diplo.cancel_requests(one,two) local team = ctf.team(two) - + if not team.log then return end - + for i=1,#team.log do if team.log[i].team == one and team.log[i].type=="request" and team.log[i].mode=="diplo" then table.remove(team.log,i) return end end - + return -end \ No newline at end of file +end diff --git a/mods/capturetheflag/ctf/gui.lua b/mods/capturetheflag/ctf/gui.lua index ee72e6f..e7ce3df 100644 --- a/mods/capturetheflag/ctf/gui.lua +++ b/mods/capturetheflag/ctf/gui.lua @@ -1,387 +1,401 @@ ctf.gui = {} -if ctf.setting("team_gui") and ctf.setting("gui") then -- check if team guis are enabled - -- Get tab buttons - function ctf.gui.tabs(name,team) - local result = "" - local id = 1 - local function addtab(name,text) - result = result .. "button["..(id*2-1)..",0;2,1;"..name..";"..text.."]" - id = id + 1 - end - if ctf.setting("news_gui") then - addtab("board","News") - end - if ctf.setting("flag_teleport_gui") then - addtab("flags","Flags") - end - if ctf.setting("diplomacy") then - addtab("diplo","Diplomacy") - end - addtab("admin","Settings") - return result +-- Get tab buttons +function ctf.gui.tabs(name,team) + local result = "" + local id = 1 + local function addtab(name,text) + result = result .. "button["..(id*2-1)..",0;2,1;"..name..";"..text.."]" + id = id + 1 end - - -- Team interface - function ctf.gui.team_board(name,team) - local result = "" - local data = ctf.teams[team].log - - if not data then - data = {} - end + if ctf.setting("news_gui") then + addtab("board","News") + end + if ctf.setting("flag_teleport_gui") then + addtab("flags","Flags") + end + if ctf.setting("diplomacy") then + addtab("diplo","Diplomacy") + end + addtab("admin","Settings") + return result +end - local amount = 0 +-- Team interface +function ctf.gui.team_board(name,team) + if not ctf.setting("team_gui") or not ctf.setting("gui") then + return + end - for i=1,#data do - if data[i].type == "request" then - if ctf.can_mod(name,team)==true then - amount = amount + 2 - local height = (amount*0.5) + 0.5 - amount = amount + 1 + local result = "" + local data = ctf.teams[team].log - if data[i].mode == "diplo" then - result = result .. "image[0.5,".. height ..";10.5,1;diplo_"..data[i].msg..".png]" - if data[i].msg == "alliance" then - result = result .. "label[1,".. height ..";".. data[i].team .." offers an "..minetest.formspec_escape(data[i].msg).." treaty]" - else - result = result .. "label[1,".. height ..";".. data[i].team .." offers a "..minetest.formspec_escape(data[i].msg).." treaty]" - end - result = result .. "button[6,".. height ..";1,1;btn_y"..i..";Yes]" - result = result .. "button[7,".. height ..";1,1;btn_n"..i..";No]" - else - result = result .. "label[0.5,".. height ..";RANDOM REQUEST TYPE]" - end - end - else + if not data then + data = {} + end + + local amount = 0 + + for i=1,#data do + if data[i].type == "request" then + if ctf.can_mod(name,team)==true then + amount = amount + 2 + local height = (amount*0.5) + 0.5 amount = amount + 1 - local height = (amount*0.5)+0.5 - if height > 5 then - print("break!") - break + if data[i].mode == "diplo" then + result = result .. "image[0.5,".. height ..";10.5,1;diplo_"..data[i].msg..".png]" + if data[i].msg == "alliance" then + result = result .. "label[1,".. height ..";".. data[i].team .." offers an "..minetest.formspec_escape(data[i].msg).." treaty]" + else + result = result .. "label[1,".. height ..";".. data[i].team .." offers a "..minetest.formspec_escape(data[i].msg).." treaty]" + end + result = result .. "button[6,".. height ..";1,1;btn_y"..i..";Yes]" + result = result .. "button[7,".. height ..";1,1;btn_n"..i..";No]" + else + result = result .. "label[0.5,".. height ..";RANDOM REQUEST TYPE]" end - - - result = result .. "label[0.5,".. height ..";".. minetest.formspec_escape(data[i].msg) .."]" end - end - - if ctf.can_mod(name,team)==true then - result = result .. "button[4,6;2,1;clear;Clear all]" - end - - if amount == 0 then - result = "label[0.5,1;Welcome to the news panel]".. - "label[0.5,1.5;News such as attacks will appear here]" - end - - minetest.show_formspec(name, "ctf:board", - "size[10,7]".. - ctf.gui.tabs(name,team).. - result - ) - end - - -- Team interface - function ctf.gui.team_flags(name,team) - local result = "" - local t = ctf.team(team) - - if not t then - return - end - - local x = 1 - local y = 2 - result = result .. "label[1,1;Click a flag button to go there]" - - if ctf.setting("spawn_in_flag_teleport_gui") and minetest.get_setting("static_spawnpoint") then - local x,y,z = string.match(minetest.get_setting("static_spawnpoint"),"(%d+),(%d+),(%d+)") - - result = result .. - "button[" .. x .. "," .. y .. ";2,1;goto_" - ..f.x.."_"..f.y.."_"..f.z..";" - - result = result .. "Spawn]" - x = x + 2 - end - - for i=1,#t.flags do - local f = t.flags[i] - - if x > 8 then - x = 1 - y = y + 1 - end - - if y > 6 then - break - end - - result = result .. - "button[" .. x .. "," .. y .. ";2,1;goto_" - ..f.x.."_"..f.y.."_"..f.z..";" - - if f.name then - result = result .. f.name .. "]" - else - result = result .. "("..f.x..","..f.y..","..f.z..")]" - end - - x = x + 2 - end - - minetest.show_formspec(name, "ctf:flags", - "size[10,7]".. - ctf.gui.tabs(name,team).. - result - ) - end - - -- Team interface - function ctf.gui.team_dip(name,team) - local result = "" - local data = {} - - local amount = 0 - - for key,value in pairs(ctf.teams) do - if key ~= team then - table.insert(data,{ - team = key, - state = ctf.diplo.get(team,key), - to = ctf.diplo.check_requests(team,key), - from = ctf.diplo.check_requests(key,team) - }) - end - end - - result = result .. "label[1,1;Diplomacy from the perspective of "..team.."]" - - for i=1,#data do - amount = i - local height = (i*1)+0.5 + else + amount = amount + 1 + local height = (amount*0.5)+0.5 if height > 5 then + print("break!") break end - result = result .. "image[1,".. height ..";10,1;diplo_"..data[i].state..".png]" - result = result .. "button[1.25,".. height ..";2,1;team_".. data[i].team ..";".. data[i].team .."]" - result = result .. "label[3.75,".. height ..";".. data[i].state .."]" - if ctf.can_mod(name,team)==true and ctf.player(name).team == team then - if not data[i].from and not data[i].to then - if data[i].state == "war" then - result = result .. "button[7.5,".. height ..";1.5,1;peace_".. data[i].team ..";Peace]" - elseif data[i].state == "peace" then - result = result .. "button[6,".. height ..";1.5,1;war_".. data[i].team ..";War]" - result = result .. "button[7.5,".. height ..";1.5,1;alli_".. data[i].team ..";Alliance]" - elseif data[i].state == "alliance" then - result = result .. "button[6,".. height ..";1.5,1;peace_".. data[i].team ..";Peace]" - end - elseif data[i].from ~= nil then - result = result .. "label[6,".. height ..";request recieved]" - elseif data[i].to ~= nil then - result = result .. "label[5.5,".. height ..";request sent]" - result = result .. "button[7.5,".. height ..";1.5,1;cancel_".. data[i].team ..";Cancel]" - end - end + result = result .. "label[0.5,".. height ..";".. minetest.formspec_escape(data[i].msg) .."]" end - - minetest.show_formspec(name, "ctf:dip", - "size[10,7]".. - ctf.gui.tabs(name,team).. - result - ) end - - -- Team interface - function ctf.gui.team_settings(name,team) - if not team or not ctf.team(team) then - return - end - - local color = "" - if ctf.team(team).data and ctf.team(team).data.color then - color = ctf.team(team).data.color - end - - local result = "field[3,2;4,1;color;Team Color;"..color.."]".. - "button[4,6;2,1;save;Save]" - - - if ctf.can_mod(name,team) == false then - result = "label[0.5,1;You do not own this team!" - end - - minetest.show_formspec(name, "ctf:team_settings", - "size[10,7]".. - ctf.gui.tabs(name,team).. - result - ) + if ctf.can_mod(name,team)==true then + result = result .. "button[4,6;2,1;clear;Clear all]" end - minetest.register_on_player_receive_fields(function(player, formname, fields) - local name = player:get_player_name() - if formname=="ctf:board" or formname=="ctf:flags" or formname=="ctf:dip" or formname=="ctf:team_settings" then - if fields.flags then - if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then - ctf.gui.team_flags(name,ctf.players[name].team) + + if amount == 0 then + result = "label[0.5,1;Welcome to the news panel]".. + "label[0.5,1.5;News such as attacks will appear here]" + end + + minetest.show_formspec(name, "ctf:board", + "size[10,7]".. + ctf.gui.tabs(name,team).. + result + ) +end + +-- Team interface +function ctf.gui.team_flags(name,team) + if not ctf.setting("team_gui") or not ctf.setting("gui") then + return + end + + local result = "" + local t = ctf.team(team) + + if not t then + return + end + + local x = 1 + local y = 2 + result = result .. "label[1,1;Click a flag button to go there]" + + if ctf.setting("spawn_in_flag_teleport_gui") and minetest.get_setting("static_spawnpoint") then + local x,y,z = string.match(minetest.get_setting("static_spawnpoint"),"(%d+),(%d+),(%d+)") + + result = result .. + "button[" .. x .. "," .. y .. ";2,1;goto_" + ..f.x.."_"..f.y.."_"..f.z..";" + + result = result .. "Spawn]" + x = x + 2 + end + + for i=1,#t.flags do + local f = t.flags[i] + + if x > 8 then + x = 1 + y = y + 1 + end + + if y > 6 then + break + end + + result = result .. + "button[" .. x .. "," .. y .. ";2,1;goto_" + ..f.x.."_"..f.y.."_"..f.z..";" + + if f.name then + result = result .. f.name .. "]" + else + result = result .. "("..f.x..","..f.y..","..f.z..")]" + end + + x = x + 2 + end + + minetest.show_formspec(name, "ctf:flags", + "size[10,7]".. + ctf.gui.tabs(name,team).. + result + ) +end + +-- Team interface +function ctf.gui.team_dip(name,team) + if not ctf.setting("team_gui") or not ctf.setting("gui") then + return + end + + local result = "" + local data = {} + + local amount = 0 + + for key,value in pairs(ctf.teams) do + if key ~= team then + table.insert(data,{ + team = key, + state = ctf.diplo.get(team,key), + to = ctf.diplo.check_requests(team,key), + from = ctf.diplo.check_requests(key,team) + }) + end + end + + result = result .. "label[1,1;Diplomacy from the perspective of "..team.."]" + + for i=1,#data do + amount = i + local height = (i*1)+0.5 + + if height > 5 then + break + end + + result = result .. "image[1,".. height ..";10,1;diplo_"..data[i].state..".png]" + result = result .. "button[1.25,".. height ..";2,1;team_".. data[i].team ..";".. data[i].team .."]" + result = result .. "label[3.75,".. height ..";".. data[i].state .."]" + + if ctf.can_mod(name,team)==true and ctf.player(name).team == team then + if not data[i].from and not data[i].to then + if data[i].state == "war" then + result = result .. "button[7.5,".. height ..";1.5,1;peace_".. data[i].team ..";Peace]" + elseif data[i].state == "peace" then + result = result .. "button[6,".. height ..";1.5,1;war_".. data[i].team ..";War]" + result = result .. "button[7.5,".. height ..";1.5,1;alli_".. data[i].team ..";Alliance]" + elseif data[i].state == "alliance" then + result = result .. "button[6,".. height ..";1.5,1;peace_".. data[i].team ..";Peace]" end - return true + elseif data[i].from ~= nil then + result = result .. "label[6,".. height ..";request recieved]" + elseif data[i].to ~= nil then + result = result .. "label[5.5,".. height ..";request sent]" + result = result .. "button[7.5,".. height ..";1.5,1;cancel_".. data[i].team ..";Cancel]" end - if fields.board then - if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then - ctf.gui.team_board(name,ctf.players[name].team) - end - return true + end + end + + minetest.show_formspec(name, "ctf:dip", + "size[10,7]".. + ctf.gui.tabs(name,team).. + result + ) +end + +-- Team interface +function ctf.gui.team_settings(name,team) + if not ctf.setting("team_gui") or not ctf.setting("gui") then + return + end + + if not team or not ctf.team(team) then + return + end + + local color = "" + + if ctf.team(team).data and ctf.team(team).data.color then + color = ctf.team(team).data.color + end + + local result = "field[3,2;4,1;color;Team Color;"..color.."]".. + "button[4,6;2,1;save;Save]" + + + if ctf.can_mod(name,team) == false then + result = "label[0.5,1;You do not own this team!" + end + + minetest.show_formspec(name, "ctf:team_settings", + "size[10,7]".. + ctf.gui.tabs(name,team).. + result + ) +end +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if formname=="ctf:board" or formname=="ctf:flags" or formname=="ctf:dip" or formname=="ctf:team_settings" then + if fields.flags then + if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then + ctf.gui.team_flags(name,ctf.players[name].team) end - if fields.diplo then - if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then - ctf.gui.team_dip(name,ctf.players[name].team) - end - return true + return true + end + if fields.board then + if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then + ctf.gui.team_board(name,ctf.players[name].team) end - if fields.admin then - if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then - ctf.gui.team_settings(name,ctf.players[name].team) - end - return true + return true + end + if fields.diplo then + if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then + ctf.gui.team_dip(name,ctf.players[name].team) end - if fields.clear then - if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then - ctf.team(ctf.players[name].team).log = {} + return true + end + if fields.admin then + if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then + ctf.gui.team_settings(name,ctf.players[name].team) + end + return true + end + if fields.clear then + if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then + ctf.team(ctf.players[name].team).log = {} + ctf.save() + ctf.gui.team_board(name,ctf.players[name].team) + end + return true + end + if fields.save and formname=="ctf:team_settings" then + if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then + ctf.gui.team_settings(name,ctf.players[name].team) + end + if ctf and ctf.team(ctf.players[name].team) and ctf.team(ctf.players[name].team).data then + if minetest.registered_items["ctf:flag_top_"..fields.color] then + print("Setting color...") + ctf.team(ctf.players[name].team).data.color = fields.color ctf.save() - ctf.gui.team_board(name,ctf.players[name].team) + else + minetest.chat_send_player(name,"Color "..fields.color.." does not exist!") end + end + return true + end + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if formname=="ctf:board" then + for key, field in pairs(fields) do + local ok, id = string.match(key, "btn_([yn])([0123456789]+)") + if ok and id then + if ctf.player(name) and ctf.player(name).team and ctf.team(ctf.player(name).team) then + if ok == "y" then + ctf.diplo.set(ctf.player(name).team, ctf.team(ctf.player(name).team).log[tonumber(id)].team, ctf.team(ctf.player(name).team).log[tonumber(id)].msg) + ctf.post(ctf.player(name).team,{msg="You have accepted the "..ctf.team(ctf.player(name).team).log[tonumber(id)].msg.." request from "..ctf.team(ctf.player(name).team).log[tonumber(id)].team}) + ctf.post(ctf.team(ctf.player(name).team).log[tonumber(id)].team,{msg=ctf.player(name).team.." has accepted your "..ctf.team(ctf.player(name).team).log[tonumber(id)].msg.." request"}) + id = id + 1 + end + + table.remove(ctf.team(ctf.player(name).team).log,id) + ctf.save() + ctf.gui.team_board(name,ctf.player(name).team) + return true + end + end + end + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if formname=="ctf:flags" then + for key, field in pairs(fields) do + local x,y,z = string.match(key, "goto_(%d+)_(%d+)_(%d+)") + if x and y and x then + player:setpos({x=x,y=y,z=z}) return true end - if fields.save and formname=="ctf:team_settings" then - if ctf and ctf.players and ctf.players[name] and ctf.players[name].team then - ctf.gui.team_settings(name,ctf.players[name].team) - end - if ctf and ctf.team(ctf.players[name].team) and ctf.team(ctf.players[name].team).data then - if minetest.registered_items["ctf:flag_top_"..fields.color] then - print("Setting color...") - ctf.team(ctf.players[name].team).data.color = fields.color - ctf.save() + end + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if formname=="ctf:dip" then + for key, field in pairs(fields) do + local newteam = string.match(key, "team_(.+)") + if newteam then + ctf.gui.team_dip(name,newteam) + return true + end + + newteam = string.match(key, "peace_(.+)") + if newteam and ctf.player(name) then + local team = ctf.player(name).team + + if team then + if ctf.diplo.get(team,newteam) == "war" then + ctf.post(newteam,{type="request",msg="peace",team=team,mode="diplo"}) else - minetest.chat_send_player(name,"Color "..fields.color.." does not exist!") + ctf.diplo.set(team,newteam,"peace") + ctf.post(team,{msg="You have cancelled the alliance treaty with "..newteam}) + ctf.post(newteam,{msg=team.." has cancelled the alliance treaty"}) end end + + ctf.gui.team_dip(name,team) + return true + end + + newteam = string.match(key, "war_(.+)") + if newteam and ctf.player(name) then + local team = ctf.player(name).team + + if team then + ctf.diplo.set(team,newteam,"war") + ctf.post(team,{msg="You have declared war on "..newteam}) + ctf.post(newteam,{msg=team.." has declared war on you"}) + end + + ctf.gui.team_dip(name,team) + return true + end + + newteam = string.match(key, "alli_(.+)") + if newteam and ctf.player(name) then + local team = ctf.player(name).team + + if team then + ctf.post(newteam,{type="request",msg="alliance",team=team,mode="diplo"}) + end + + ctf.gui.team_dip(name,team) + return true + end + + newteam = string.match(key, "cancel_(.+)") + if newteam and ctf.player(name) then + local team = ctf.player(name).team + + if team then + ctf.diplo.cancel_requests(team,newteam) + end + + ctf.gui.team_dip(name,team) return true end end - end) - - minetest.register_on_player_receive_fields(function(player, formname, fields) - local name = player:get_player_name() - if formname=="ctf:board" then - for key, field in pairs(fields) do - local ok, id = string.match(key, "btn_([yn])([0123456789]+)") - if ok and id then - if ctf.player(name) and ctf.player(name).team and ctf.team(ctf.player(name).team) then - if ok == "y" then - ctf.diplo.set(ctf.player(name).team, ctf.team(ctf.player(name).team).log[tonumber(id)].team, ctf.team(ctf.player(name).team).log[tonumber(id)].msg) - ctf.post(ctf.player(name).team,{msg="You have accepted the "..ctf.team(ctf.player(name).team).log[tonumber(id)].msg.." request from "..ctf.team(ctf.player(name).team).log[tonumber(id)].team}) - ctf.post(ctf.team(ctf.player(name).team).log[tonumber(id)].team,{msg=ctf.player(name).team.." has accepted your "..ctf.team(ctf.player(name).team).log[tonumber(id)].msg.." request"}) - id = id + 1 - end - - table.remove(ctf.team(ctf.player(name).team).log,id) - ctf.save() - ctf.gui.team_board(name,ctf.player(name).team) - return true - end - end - end - end - end) - - minetest.register_on_player_receive_fields(function(player, formname, fields) - local name = player:get_player_name() - if formname=="ctf:flags" then - for key, field in pairs(fields) do - local x,y,z = string.match(key, "goto_(%d+)_(%d+)_(%d+)") - if x and y and x then - player:setpos({x=x,y=y,z=z}) - return true - end - end - end - end) - - minetest.register_on_player_receive_fields(function(player, formname, fields) - local name = player:get_player_name() - if formname=="ctf:dip" then - for key, field in pairs(fields) do - local newteam = string.match(key, "team_(.+)") - if newteam then - ctf.gui.team_dip(name,newteam) - return true - end - - newteam = string.match(key, "peace_(.+)") - if newteam and ctf.player(name) then - local team = ctf.player(name).team - - if team then - if ctf.diplo.get(team,newteam) == "war" then - ctf.post(newteam,{type="request",msg="peace",team=team,mode="diplo"}) - else - ctf.diplo.set(team,newteam,"peace") - ctf.post(team,{msg="You have cancelled the alliance treaty with "..newteam}) - ctf.post(newteam,{msg=team.." has cancelled the alliance treaty"}) - end - end - - ctf.gui.team_dip(name,team) - return true - end - - newteam = string.match(key, "war_(.+)") - if newteam and ctf.player(name) then - local team = ctf.player(name).team - - if team then - ctf.diplo.set(team,newteam,"war") - ctf.post(team,{msg="You have declared war on "..newteam}) - ctf.post(newteam,{msg=team.." has declared war on you"}) - end - - ctf.gui.team_dip(name,team) - return true - end - - newteam = string.match(key, "alli_(.+)") - if newteam and ctf.player(name) then - local team = ctf.player(name).team - - if team then - ctf.post(newteam,{type="request",msg="alliance",team=team,mode="diplo"}) - end - - ctf.gui.team_dip(name,team) - return true - end - - newteam = string.match(key, "cancel_(.+)") - if newteam and ctf.player(name) then - local team = ctf.player(name).team - - if team then - ctf.diplo.cancel_requests(team,newteam) - end - - ctf.gui.team_dip(name,team) - return true - end - end - end - end) -end -- end of check if team guis are enabled + end +end) -- Flag interface function ctf.gui.flag_board(name,pos) @@ -408,7 +422,7 @@ function ctf.gui.flag_board(name,pos) flag.name = nil return end - + if not ctf.setting("gui") then return end @@ -416,7 +430,7 @@ function ctf.gui.flag_board(name,pos) if not flag_name then flag_name = "" end - + if not ctf.gui.flag_data then ctf.gui.flag_data = {} end @@ -432,7 +446,7 @@ function ctf.gui.flag_board(name,pos) end minetest.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() - + if not formname=="ctf:flag_board" then return false end @@ -447,7 +461,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not team then return false end - + if ctf.can_mod(name,team) == false then return false end @@ -466,15 +480,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end print(msg) - + ctf.post(team,{msg=msg,icon="flag_info"}) return true elseif fields.delete then local pos = ctf.gui.flag_data[name].pos - + local flag = ctf.area.get_flag(ctf.gui.flag_data[name].pos) - + if not flag then print("No flag?!") end @@ -483,17 +497,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not team then return end - + if ctf.can_mod(name,team) == false then return false end - + ctf.area.delete_flag(team,pos) - + minetest.env:set_node(pos,{name="air"}) pos.y=pos.y+1 minetest.env:set_node(pos,{name="air"}) return true end -end) \ No newline at end of file +end) diff --git a/mods/capturetheflag/ctf/init.lua b/mods/capturetheflag/ctf/init.lua index bcff44f..9c1b9c8 100644 --- a/mods/capturetheflag/ctf/init.lua +++ b/mods/capturetheflag/ctf/init.lua @@ -58,11 +58,8 @@ function v3.get_direction(pos1,pos2) return {x=x_raw,y=y_raw,z=z_raw} end --- Load the core -dofile(minetest.get_modpath("ctf").."/core.lua") -ctf.init() - -- Modules +dofile(minetest.get_modpath("ctf").."/core.lua") dofile(minetest.get_modpath("ctf").."/diplomacy.lua") dofile(minetest.get_modpath("ctf").."/area.lua") dofile(minetest.get_modpath("ctf").."/gui.lua") @@ -70,5 +67,6 @@ dofile(minetest.get_modpath("ctf").."/cli.lua") dofile(minetest.get_modpath("ctf").."/flag.lua") -- Init +ctf.init() ctf.clean_player_lists() ctf.collect_claimed()