diff --git a/ctf/core.lua b/ctf/core.lua index 30fcd64..fd26182 100644 --- a/ctf/core.lua +++ b/ctf/core.lua @@ -144,7 +144,6 @@ function ctf.init() ctf._set("maximum_in_team", -1) ctf._set("default_diplo_state", "war") ctf._set("hud", true) - ctf._set("remove_player_on_leave", false) ctf._set("autoalloc_on_joinplayer", true) ctf._set("friendly_fire", true) diff --git a/ctf/teams.lua b/ctf/teams.lua index 494d0aa..6301163 100644 --- a/ctf/teams.lua +++ b/ctf/teams.lua @@ -412,12 +412,6 @@ minetest.register_on_joinplayer(function(player) end end) -minetest.register_on_leaveplayer(function(player) - if ctf.setting("remove_player_on_leave") then - ctf.remove_player(player:get_player_name()) - end -end) - -- Disable friendly fire. minetest.register_on_punchplayer(function(player, hitter) if player and hitter then diff --git a/ctf_chat/init.lua b/ctf_chat/init.lua index 981877f..8808c97 100644 --- a/ctf_chat/init.lua +++ b/ctf_chat/init.lua @@ -266,13 +266,13 @@ minetest.register_chatcommand("t", { }) -- Chat plus stuff -if chatplus then +if minetest.global_exists("chatplus") then chatplus.register_handler(function(from, to, msg) if not ctf.setting("chat.team_channel") then -- Send to global return nil end - + if ctf.setting("chat.default") ~= "team" then if ctf.player(from).team then minetest.chat_send_player(to, ctf.player(from).team .. diff --git a/ctf_colors/gui.lua b/ctf_colors/gui.lua new file mode 100644 index 0000000..243ed5d --- /dev/null +++ b/ctf_colors/gui.lua @@ -0,0 +1,49 @@ + +ctf.gui.register_tab("settings", "Settings", function(name, team) + local color = "" + if 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 not ctf.can_mod(name,team) then + result = "label[0.5,1;You do not own this team!" + end + + minetest.show_formspec(name, "ctf:settings", + "size[10,7]" .. + ctf.gui.get_tabs(name, team) .. + result + ) +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "ctf:settings" then + return false + end + + -- Settings page + if fields.save then + ctf.gui.show(name, "settings") + + if ctf.flag_colors[fields.color] then + team.data.color = fields.color + ctf.needs_save = true + else + local colors = "" + for color, code in pairs(ctf.flag_colors) do + if colors ~= "" then + colors = colors .. ", " + end + colors = colors .. color + end + minetest.chat_send_player(name, "Color " .. fields.color .. + " does not exist! Available: " .. colors) + end + + return true + end +end) diff --git a/ctf_colors/hud.lua b/ctf_colors/hud.lua new file mode 100644 index 0000000..9246062 --- /dev/null +++ b/ctf_colors/hud.lua @@ -0,0 +1,32 @@ +ctf.hud.register_part(function(player, name, tplayer) + local text_color = ctf.team(tplayer.team).data.color + local color = ctf.flag_colors[text_color] + if not color then + color = "0x000000" + end + + if ctf.setting("colors.nametag") then + player:set_nametag_attributes({ color = "0xFF" .. string.sub(color, 3) }) + end + + if ctf.setting("colors.skins") and text_color and color then + player:set_properties({ + textures = {"ctf_colors_skin_" .. text_color .. ".png"}, + }) + end + + if not ctf.hud:exists(player, "ctf:hud_team") then + ctf.hud:add(player, "ctf:hud_team", { + hud_elem_type = "text", + position = {x = 1, y = 0}, + scale = {x = 100, y = 100}, + text = "Team " .. tplayer.team, + number = color, + offset = {x = -20, y = 20}, + alignment = {x = -1, y = 0} + }) + else + ctf.hud:change(player, "ctf:hud_team", "text", "Team " .. tplayer.team) + ctf.hud:change(player, "ctf:hud_team", "number", color) + end +end) diff --git a/ctf_colors/init.lua b/ctf_colors/init.lua index bd5c359..c25af37 100644 --- a/ctf_colors/init.lua +++ b/ctf_colors/init.lua @@ -19,84 +19,5 @@ ctf.register_on_init(function() ctf._set("colors.nametag", true) end) -ctf.hud.register_part(function(player, name, tplayer) - local text_color = ctf.team(tplayer.team).data.color - local color = ctf.flag_colors[text_color] - if not color then - color = "0x000000" - end - - if ctf.setting("colors.nametag") then - player:set_nametag_attributes({ color = "0xFF" .. string.sub(color, 3) }) - end - - if ctf.setting("colors.skins") and text_color and color then - player:set_properties({ - textures = {"ctf_colors_skin_" .. text_color .. ".png"}, - }) - end - - if not ctf.hud:exists(player, "ctf:hud_team") then - ctf.hud:add(player, "ctf:hud_team", { - hud_elem_type = "text", - position = {x = 1, y = 0}, - scale = {x = 100, y = 100}, - text = "Team " .. tplayer.team, - number = color, - offset = {x = -20, y = 20}, - alignment = {x = -1, y = 0} - }) - else - ctf.hud:change(player, "ctf:hud_team", "text", "Team " .. tplayer.team) - ctf.hud:change(player, "ctf:hud_team", "number", color) - end -end) - -ctf.gui.register_tab("settings", "Settings", function(name, team) - local color = "" - if 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 not ctf.can_mod(name,team) then - result = "label[0.5,1;You do not own this team!" - end - - minetest.show_formspec(name, "ctf:settings", - "size[10,7]" .. - ctf.gui.get_tabs(name, team) .. - result - ) -end) - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "ctf:settings" then - return false - end - - -- Settings page - if fields.save then - ctf.gui.show(name, "settings") - - if ctf.flag_colors[fields.color] then - team.data.color = fields.color - ctf.needs_save = true - else - local colors = "" - for color, code in pairs(ctf.flag_colors) do - if colors ~= "" then - colors = colors .. ", " - end - colors = colors .. color - end - minetest.chat_send_player(name, "Color " .. fields.color .. - " does not exist! Available: " .. colors) - end - - return true - end -end) +dofile(minetest.get_modpath("ctf_colors") .. "/hud.lua") +dofile(minetest.get_modpath("ctf_colors") .. "/gui.lua") diff --git a/ctf_flag/api.lua b/ctf_flag/api.lua new file mode 100644 index 0000000..3182c63 --- /dev/null +++ b/ctf_flag/api.lua @@ -0,0 +1,209 @@ +ctf_flag.registered_on_capture = {} +function ctf_flag.register_on_capture(func) + if ctf._mt_loaded then + error("You can't register callbacks at game time!") + end + table.insert(ctf_flag.registered_on_capture, func) +end + +ctf_flag.registered_on_pick_up = {} +function ctf_flag.register_on_pick_up(func) + if ctf._mt_loaded then + error("You can't register callbacks at game time!") + end + table.insert(ctf_flag.registered_on_pick_up, func) +end + +function ctf_flag.collect_claimed() + local claimed = {} + for _, team in pairs(ctf.teams) do + for i = 1, #team.flags do + if team.flags[i].claimed then + table.insert(claimed, team.flags[i]) + end + end + end + return claimed +end + +function ctf_flag.player_drop_flag(name) + if not name then + return + end + + local claimed = ctf_flag.collect_claimed() + for i = 1, #claimed do + local flag = claimed[i] + if flag.claimed.player == name then + flag.claimed = nil + + local flag_name = "" + if flag.name then + flag_name = flag.name .. " " + end + flag_name = flag.team .. "'s " .. flag_name .. "flag" + + ctf.hud.updateAll() + + ctf.action("flag", name .. " dropped " .. flag_name) + minetest.chat_send_all(flag_name.." has returned.") + end + end +end + +-- add a flag to a team +function ctf_flag.add(team, pos) + if not team or team == "" then + return + end + + ctf.log("flag", "Adding flag to " .. team .. " at (" .. pos.x .. + ", " .. pos.y .. ", " .. pos.z .. ")") + + if not ctf.team(team).flags then + ctf.team(team).flags = {} + end + + pos.team = team + table.insert(ctf.team(team).flags,pos) + ctf.needs_save = true +end + +function ctf_flag.update(pos) + if minetest.get_node(pos).name ~= "ctf_flag:flag" then + return + end + + local top = {x=pos.x,y=pos.y+1,z=pos.z} + local flagmeta = minetest.get_meta(pos) + + if not flagmeta then + return + end + + local flag_team_data = ctf_flag.get(pos) + if not flag_team_data or not ctf.team(flag_team_data.team)then + ctf.log("flag", "Flag does not exist! Deleting nodes. "..dump(pos)) + minetest.set_node(pos,{name="air"}) + minetest.set_node(top,{name="air"}) + return + end + local topmeta = minetest.get_meta(top) + local flag_name = flag_team_data.name + if flag_name and flag_name ~= "" then + flagmeta:set_string("infotext", flag_name.." - "..flag_team_data.team) + else + flagmeta:set_string("infotext", flag_team_data.team.."'s flag") + end + + if not ctf.team(flag_team_data.team).data.color then + ctf.team(flag_team_data.team).data.color = "red" + ctf.needs_save = true + end + + if flag_team_data.claimed then + minetest.set_node(top,{name="ctf_flag:flag_captured_top"}) + else + minetest.set_node(top,{name="ctf_flag:flag_top_"..ctf.team(flag_team_data.team).data.color}) + end + + topmeta = minetest.get_meta(top) + if flag_name and flag_name ~= "" then + topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team) + else + topmeta:set_string("infotext", flag_team_data.team.."'s flag") + end +end + +-- get a flag from a team +function ctf_flag.get(pos) + if not pos then + return + end + + local result = nil + for _, team in pairs(ctf.teams) do + for i = 1, #team.flags do + if ( + team.flags[i].x == pos.x and + team.flags[i].y == pos.y and + team.flags[i].z == pos.z + ) then + if result then + minetest.chat_send_all("[CTF ERROR] Multiple teams have same flag. Please report this to the server operator / admin") + print("CTF ERROR DATA") + print("Multiple teams have same flag.") + print("This is a sign of ctf.txt corruption.") + print("----------------") + print(dump(result)) + print(dump(team.flags[i])) + print("----------------") + else + result = team.flags[i] + end + end + end + end + return result +end + +-- delete a flag from a team +function ctf_flag.delete(team, pos) + if not team or team == "" then + return + end + + ctf.log("flag", "Deleting flag from " .. team .. " at (" .. pos.x .. + ", " .. pos.y .. ", " .. pos.z .. ")") + + for i = 1, #ctf.team(team).flags do + if ( + ctf.team(team).flags[i].x == pos.x and + ctf.team(team).flags[i].y == pos.y and + ctf.team(team).flags[i].z == pos.z + ) then + table.remove(ctf.team(team).flags,i) + return + end + end +end + +function ctf_flag.assert_flags() + for tname, team in pairs(ctf.teams) do + ctf_flag.assert_flags_team(tname) + end +end + +function ctf_flag.assert_flags_team(tname) + local team = ctf.team(tname) + if not tname or not team then + return false + end + + for i=1, #team.flags do + local flag = team.flags[i] + minetest.get_voxel_manip(flag, { x = flag.x + 1, y = flag.y + 1, z = flag.z + 1}) + local nodename = minetest.get_node(flag).name + if nodename ~= "ctf_flag:flag" then + ctf.log("flag", tname .. " has wrong node at flag position, " .. nodename .. ", correcting...") + minetest.set_node(flag, { name = "ctf_flag:flag"}) + + local function base_at(flag, dx, dz) + minetest.set_node({ + x = flag.x + dx, + y = flag.y - 1, + z = flag.z + dz, + }, { name = "ctf_flag:ind_base"}) + end + base_at(flag, -1, -1) + base_at(flag, -1, 0) + base_at(flag, -1, 1) + base_at(flag, 0, -1) + base_at(flag, 0, 0) + base_at(flag, 0, 1) + base_at(flag, 1, -1) + base_at(flag, 1, 0) + base_at(flag, 1, 1) + end + end +end diff --git a/ctf_flag/flags.lua b/ctf_flag/flags.lua new file mode 100644 index 0000000..2d369a9 --- /dev/null +++ b/ctf_flag/flags.lua @@ -0,0 +1,90 @@ +minetest.register_node("ctf_flag:ind_base", { + description = "Cheater!", + groups = {immortal = 1}, + tiles = {"default_stone.png"} +}) + +-- The flag +minetest.register_node("ctf_flag:flag", { + description = "Flag", + drawtype="nodebox", + paramtype = "light", + walkable = false, + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + node_box = { + type = "fixed", + fixed = { + {0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500} + } + }, + groups = {immortal=1,is_flag=1,flag_bottom=1}, + on_punch = ctf_flag.on_punch, + on_rightclick = ctf_flag.on_rightclick, + on_construct = ctf_flag.on_construct, + after_place_node = ctf_flag.after_place_node +}) + +for color, _ in pairs(ctf.flag_colors) do + minetest.register_node("ctf_flag:flag_top_"..color,{ + description = "You are not meant to have this! - flag top", + drawtype="nodebox", + paramtype = "light", + walkable = false, + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "flag_"..color.."2.png", + "flag_"..color..".png" + }, + node_box = { + type = "fixed", + fixed = { + {0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500}, + {-0.5,0,0.000000,0.250000,0.500000,0.062500} + } + }, + groups = {immortal=1,is_flag=1,flag_top=1,not_in_creative_inventory=1}, + on_punch = ctf_flag.on_punch_top, + on_rightclick = ctf_flag.on_rightclick_top + }) +end + +minetest.register_node("ctf_flag:flag_captured_top",{ + description = "You are not meant to have this! - flag captured", + drawtype = "nodebox", + paramtype = "light", + walkable = false, + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + node_box = { + type = "fixed", + fixed = { + {0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500} + } + }, + groups = {immortal=1,is_flag=1,flag_top=1,not_in_creative_inventory=1}, + on_punch = ctf_flag.on_punch_top, + on_rightclick = ctf_flag.on_rightclick_top +}) + +minetest.register_abm({ + nodenames = {"group:flag_bottom"}, + inteval = 5, + chance = 1, + action = ctf_flag.update +}) diff --git a/ctf_flag/hud.lua b/ctf_flag/hud.lua new file mode 100644 index 0000000..b1e6b72 --- /dev/null +++ b/ctf_flag/hud.lua @@ -0,0 +1,66 @@ +-- TODO: delete flags if they are removed (ctf.next, or captured) +ctf.hud.register_part(function(player, name, tplayer) + if ctf.setting("flag.waypoints") then + for tname, team in pairs(ctf.teams) do + for _, flag in pairs(team.flags) do + local hud = "ctf:hud_" .. flag.x .. "_" .. flag.y .. "_" .. flag.z + local flag_name = flag.name or tname .. "'s base" + local color = ctf.flag_colors[team.data.color] + if not color then + color = "0x000000" + end + if not ctf.hud:exists(player, hud) then + ctf.hud:add(player, hud, { + hud_elem_type = "waypoint", + name = flag_name, + number = color, + world_pos = { + x = flag.x, + y = flag.y, + z = flag.z + } + }) + end + end + end + end +end) + +ctf.hud.register_part(function(player, name, tplayer) + -- Check all flags + local alert = "Punch the enemy flag! Protect your flag!" + local color = "0xFFFFFF" + local claimed = ctf_flag.collect_claimed() + for _, flag in pairs(claimed) do + if flag.claimed.player == name then + alert = "You've got the flag! Run back and punch your flag!" + color = "0xFF0000" + elseif flag.team == tplayer.team then + alert = "Kill " .. flag.claimed.player .. ", they have your flag!" + color = "0xFF0000" + else + alert = "Protect " .. flag.claimed.player .. ", he's got the enemy flag!" + color = "0xFF0000" + end + end + + -- Display alert + if alert then + if ctf.hud:exists(player, "ctf:hud_team_alert") then + ctf.hud:change(player, "ctf:hud_team_alert", "text", alert) + ctf.hud:change(player, "ctf:hud_team_alert", "number", color) + else + ctf.hud:add(player, "ctf:hud_team_alert", { + hud_elem_type = "text", + position = {x = 1, y = 0}, + scale = {x = 100, y = 100}, + text = alert, + number = color, + offset = {x = -10, y = 50}, + alignment = {x = -1, y = 0} + }) + end + else + ctf.hud:remove(player, "ctf:hud_team_alert") + end +end) diff --git a/ctf_flag/init.lua b/ctf_flag/init.lua index 12baf0a..5484e42 100644 --- a/ctf_flag/init.lua +++ b/ctf_flag/init.lua @@ -10,9 +10,11 @@ ctf.register_on_init(function() ctf._set("gui.team.teleport_to_flag", true) ctf._set("gui.team.teleport_to_spawn", false) end) + ctf.register_on_new_team(function(team) team.flags = {} end) + ctf.register_on_territory_query(function(pos) local closest = nil local closest_team = nil @@ -33,6 +35,7 @@ ctf.register_on_territory_query(function(pos) return closest_team, closest_distSQ end) + function ctf.get_spawn(team) if not ctf.team(team) then return nil @@ -51,373 +54,8 @@ function ctf.get_spawn(team) end end --- TODO: delete flags if they are removed (ctf.next, or captured) -ctf.hud.register_part(function(player, name, tplayer) - if ctf.setting("flag.waypoints") then - for tname, team in pairs(ctf.teams) do - for _, flag in pairs(team.flags) do - local hud = "ctf:hud_" .. flag.x .. "_" .. flag.y .. "_" .. flag.z - local flag_name = flag.name or tname .. "'s base" - local color = ctf.flag_colors[team.data.color] - if not color then - color = "0x000000" - end - if not ctf.hud:exists(player, hud) then - ctf.hud:add(player, hud, { - hud_elem_type = "waypoint", - name = flag_name, - number = color, - world_pos = { - x = flag.x, - y = flag.y, - z = flag.z - } - }) - end - end - end - end -end) - -ctf.hud.register_part(function(player, name, tplayer) - -- Check all flags - local alert = "Punch the enemy flag! Protect your flag!" - local color = "0xFFFFFF" - local claimed = ctf_flag.collect_claimed() - for _, flag in pairs(claimed) do - if flag.claimed.player == name then - alert = "You've got the flag! Run back and punch your flag!" - color = "0xFF0000" - elseif flag.team == tplayer.team then - alert = "Kill " .. flag.claimed.player .. ", they have your flag!" - color = "0xFF0000" - else - alert = "Protect " .. flag.claimed.player .. ", he's got the enemy flag!" - color = "0xFF0000" - end - end - - -- Display alert - if alert then - if ctf.hud:exists(player, "ctf:hud_team_alert") then - ctf.hud:change(player, "ctf:hud_team_alert", "text", alert) - ctf.hud:change(player, "ctf:hud_team_alert", "number", color) - else - ctf.hud:add(player, "ctf:hud_team_alert", { - hud_elem_type = "text", - position = {x = 1, y = 0}, - scale = {x = 100, y = 100}, - text = alert, - number = color, - offset = {x = -10, y = 50}, - alignment = {x = -1, y = 0} - }) - end - else - ctf.hud:remove(player, "ctf:hud_team_alert") - end -end) - +dofile(minetest.get_modpath("ctf_flag") .. "/hud.lua") dofile(minetest.get_modpath("ctf_flag") .. "/gui.lua") dofile(minetest.get_modpath("ctf_flag") .. "/flag_func.lua") - -ctf_flag.registered_on_capture = {} -function ctf_flag.register_on_capture(func) - if ctf._mt_loaded then - error("You can't register callbacks at game time!") - end - table.insert(ctf_flag.registered_on_capture, func) -end - -ctf_flag.registered_on_pick_up = {} -function ctf_flag.register_on_pick_up(func) - if ctf._mt_loaded then - error("You can't register callbacks at game time!") - end - table.insert(ctf_flag.registered_on_pick_up, func) -end - -function ctf_flag.collect_claimed() - local claimed = {} - for _, team in pairs(ctf.teams) do - for i = 1, #team.flags do - if team.flags[i].claimed then - table.insert(claimed, team.flags[i]) - end - end - end - return claimed -end - -function ctf_flag.player_drop_flag(name) - if not name then - return - end - - local claimed = ctf_flag.collect_claimed() - for i = 1, #claimed do - local flag = claimed[i] - if flag.claimed.player == name then - flag.claimed = nil - - local flag_name = "" - if flag.name then - flag_name = flag.name .. " " - end - flag_name = flag.team .. "'s " .. flag_name .. "flag" - - ctf.hud.updateAll() - - ctf.action("flag", name .. " dropped " .. flag_name) - minetest.chat_send_all(flag_name.." has returned.") - end - end -end - --- add a flag to a team -function ctf_flag.add(team, pos) - if not team or team == "" then - return - end - - ctf.log("flag", "Adding flag to " .. team .. " at (" .. pos.x .. - ", " .. pos.y .. ", " .. pos.z .. ")") - - if not ctf.team(team).flags then - ctf.team(team).flags = {} - end - - pos.team = team - table.insert(ctf.team(team).flags,pos) - ctf.needs_save = true -end - -function ctf_flag.update(pos) - if minetest.get_node(pos).name ~= "ctf_flag:flag" then - return - end - - local top = {x=pos.x,y=pos.y+1,z=pos.z} - local flagmeta = minetest.get_meta(pos) - - if not flagmeta then - return - end - - local flag_team_data = ctf_flag.get(pos) - if not flag_team_data or not ctf.team(flag_team_data.team)then - ctf.log("flag", "Flag does not exist! Deleting nodes. "..dump(pos)) - minetest.set_node(pos,{name="air"}) - minetest.set_node(top,{name="air"}) - return - end - local topmeta = minetest.get_meta(top) - local flag_name = flag_team_data.name - if flag_name and flag_name ~= "" then - flagmeta:set_string("infotext", flag_name.." - "..flag_team_data.team) - else - flagmeta:set_string("infotext", flag_team_data.team.."'s flag") - end - - if not ctf.team(flag_team_data.team).data.color then - ctf.team(flag_team_data.team).data.color = "red" - ctf.needs_save = true - end - - if flag_team_data.claimed then - minetest.set_node(top,{name="ctf_flag:flag_captured_top"}) - else - minetest.set_node(top,{name="ctf_flag:flag_top_"..ctf.team(flag_team_data.team).data.color}) - end - - topmeta = minetest.get_meta(top) - if flag_name and flag_name ~= "" then - topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team) - else - topmeta:set_string("infotext", flag_team_data.team.."'s flag") - end -end - --- get a flag from a team -function ctf_flag.get(pos) - if not pos then - return - end - - local result = nil - for _, team in pairs(ctf.teams) do - for i = 1, #team.flags do - if ( - team.flags[i].x == pos.x and - team.flags[i].y == pos.y and - team.flags[i].z == pos.z - ) then - if result then - minetest.chat_send_all("[CTF ERROR] Multiple teams have same flag. Please report this to the server operator / admin") - print("CTF ERROR DATA") - print("Multiple teams have same flag.") - print("This is a sign of ctf.txt corruption.") - print("----------------") - print(dump(result)) - print(dump(team.flags[i])) - print("----------------") - else - result = team.flags[i] - end - end - end - end - return result -end - --- delete a flag from a team -function ctf_flag.delete(team, pos) - if not team or team == "" then - return - end - - ctf.log("flag", "Deleting flag from " .. team .. " at (" .. pos.x .. - ", " .. pos.y .. ", " .. pos.z .. ")") - - for i = 1, #ctf.team(team).flags do - if ( - ctf.team(team).flags[i].x == pos.x and - ctf.team(team).flags[i].y == pos.y and - ctf.team(team).flags[i].z == pos.z - ) then - table.remove(ctf.team(team).flags,i) - return - end - end -end - -function ctf_flag.assert_flags() - for tname, team in pairs(ctf.teams) do - ctf_flag.assert_flags_team(tname) - end -end - -function ctf_flag.assert_flags_team(tname) - local team = ctf.team(tname) - if not tname or not team then - return false - end - - for i=1, #team.flags do - local flag = team.flags[i] - minetest.get_voxel_manip(flag, { x = flag.x + 1, y = flag.y + 1, z = flag.z + 1}) - local nodename = minetest.get_node(flag).name - if nodename ~= "ctf_flag:flag" then - ctf.log("flag", tname .. " has wrong node at flag position, " .. nodename .. ", correcting...") - minetest.set_node(flag, { name = "ctf_flag:flag"}) - - local function base_at(flag, dx, dz) - minetest.set_node({ - x = flag.x + dx, - y = flag.y - 1, - z = flag.z + dz, - }, { name = "ctf_flag:ind_base"}) - end - base_at(flag, -1, -1) - base_at(flag, -1, 0) - base_at(flag, -1, 1) - base_at(flag, 0, -1) - base_at(flag, 0, 0) - base_at(flag, 0, 1) - base_at(flag, 1, -1) - base_at(flag, 1, 0) - base_at(flag, 1, 1) - end - end -end - -minetest.register_node("ctf_flag:ind_base", { - description = "Cheater!", - groups = {immortal = 1}, - tiles = {"default_stone.png"} -}) - --- The flag -minetest.register_node("ctf_flag:flag", { - description = "Flag", - drawtype="nodebox", - paramtype = "light", - walkable = false, - tiles = { - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png" - }, - node_box = { - type = "fixed", - fixed = { - {0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500} - } - }, - groups = {immortal=1,is_flag=1,flag_bottom=1}, - on_punch = ctf_flag.on_punch, - on_rightclick = ctf_flag.on_rightclick, - on_construct = ctf_flag.on_construct, - after_place_node = ctf_flag.after_place_node -}) - -for color, _ in pairs(ctf.flag_colors) do - minetest.register_node("ctf_flag:flag_top_"..color,{ - description = "You are not meant to have this! - flag top", - drawtype="nodebox", - paramtype = "light", - walkable = false, - tiles = { - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "flag_"..color.."2.png", - "flag_"..color..".png" - }, - node_box = { - type = "fixed", - fixed = { - {0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500}, - {-0.5,0,0.000000,0.250000,0.500000,0.062500} - } - }, - groups = {immortal=1,is_flag=1,flag_top=1,not_in_creative_inventory=1}, - on_punch = ctf_flag.on_punch_top, - on_rightclick = ctf_flag.on_rightclick_top - }) -end - -minetest.register_node("ctf_flag:flag_captured_top",{ - description = "You are not meant to have this! - flag captured", - drawtype = "nodebox", - paramtype = "light", - walkable = false, - tiles = { - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png" - }, - node_box = { - type = "fixed", - fixed = { - {0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500} - } - }, - groups = {immortal=1,is_flag=1,flag_top=1,not_in_creative_inventory=1}, - on_punch = ctf_flag.on_punch_top, - on_rightclick = ctf_flag.on_rightclick_top -}) - -minetest.register_abm({ - nodenames = {"group:flag_bottom"}, - inteval = 5, - chance = 1, - action = ctf_flag.update -}) +dofile(minetest.get_modpath("ctf_flag") .. "/api.lua") +dofile(minetest.get_modpath("ctf_flag") .. "/flags.lua")