From c89ac55ff7cc2872e84844eecc4151975c5960a9 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 27 Dec 2014 17:36:58 +0000 Subject: [PATCH] Auto-allocation --- mods/capturetheflag/ctf/cli.lua | 13 +- mods/capturetheflag/ctf/core.lua | 92 +++++++++++++- mods/traps/cage.lua | 12 +- mods/traps/lava.lua | 199 +++++++++++++++---------------- 4 files changed, 194 insertions(+), 122 deletions(-) diff --git a/mods/capturetheflag/ctf/cli.lua b/mods/capturetheflag/ctf/cli.lua index b5fdc66..d91ce04 100644 --- a/mods/capturetheflag/ctf/cli.lua +++ b/mods/capturetheflag/ctf/cli.lua @@ -55,15 +55,12 @@ minetest.register_chatcommand("team", { minetest.chat_send_player(name, "Teams:",false) for k,v in pairs(ctf.teams) do if v and v.players then - local numItems = 0 - for k,v in pairs(v.players) do - numItems = numItems + 1 + local numPlayers = ctf.count_players_in_team(k) + local numFlags = 0 + for k, v in pairs(v.flags) do + numFlags = numFlags + 1 end - local numItems2 = 0 - for k,v in pairs(v.flags) do - numItems2 = numItems2 + 1 - end - minetest.chat_send_player(name, ">> "..k.." ("..numItems2.." flags, "..numItems.." players)",false) + minetest.chat_send_player(name, ">> "..k.." ("..numFlags.." flags, "..numPlayers.." players)") end end elseif ctf.team(param) then diff --git a/mods/capturetheflag/ctf/core.lua b/mods/capturetheflag/ctf/core.lua index 241692d..38452a4 100644 --- a/mods/capturetheflag/ctf/core.lua +++ b/mods/capturetheflag/ctf/core.lua @@ -24,14 +24,15 @@ function ctf.init() ctf._set("players_can_change_team",true) -- Settings: Teams - --ctf._set("allocate_mode",0) -- (COMING SOON):how are players allocated to teams? - ctf._set("default_diplo_state","war") -- what is the default diplomatic state? (war/peace/alliance) + ctf._set("allocate_mode", 2) -- 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 + ctf._set("default_diplo_state", "war") -- what is the default diplomatic state? (war/peace/alliance) --ctf._setb("delete_teams",false) -- (COMING SOON):should teams be deleted when they are defeated? -- Settings: Misc --ctf._set("on_game_end",0) -- (COMING SOON):what happens when the game ends? - ctf._set("flag_protect_distance",25) -- how far do flags protect? - ctf._set("team_gui_initial","news") -- [news/flags/diplo/admin] - the starting tab + 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 @@ -51,8 +52,9 @@ function ctf._set(setting,default) end function ctf.setting(name) - if minetest.setting_get("ctf_"..name) then - return minetest.setting_get("ctf_"..name) + local set = minetest.setting_get("ctf_"..name) + if set ~= nil then + return set elseif ctf._defsettings[name] ~= nil then return ctf._defsettings[name] else @@ -100,6 +102,15 @@ function ctf.team(name) -- get or add a team end end +-- Count number of players in a team +function ctf.count_players_in_team(team) + local count = 0 + for name, player in pairs(ctf.team(team).players) do + count = count + 1 + end + return count +end + -- get a player function ctf.player(name) return ctf.players[name] @@ -207,3 +218,72 @@ function ctf.post(team,msg) return true end + +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 == 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 + local one = nil + local one_count = -1 + local two = nil + local two_count = -1 + for key, team in pairs(ctf.teams) do + local count = ctf.count_players_in_team(key) + if (max_players == -1 or count < max_players) then + if count > one_count then + two = one + two_count = one_count + one = key + one_count = count + end + + if count > two_count then + two = key + two_count = count + 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) + ctf.join(name, one) + else + print(name.." was allocated to "..two) + ctf.join(name, two) + end + else + if one then + print(name.." was allocated to "..one) + ctf.join(name, one) + else + print(name.." was allocated to "..two) + ctf.join(name, two) + end + end + else + print("Unknown allocation mode: "..ctf.setting("allocate_mode")) + end +end) diff --git a/mods/traps/cage.lua b/mods/traps/cage.lua index d8c91b3..6da081a 100644 --- a/mods/traps/cage.lua +++ b/mods/traps/cage.lua @@ -13,7 +13,7 @@ minetest.register_node("traps:cage",{ inventory_image = minetest.inventorycube("traps_grass.png", "default_grass_side.png", "default_grass_side.png"), dug_item = '', -- Get nothing - groups={immortal}, + groups={immortal = 1}, description = "Cage Trap", }) @@ -22,7 +22,7 @@ minetest.register_node("traps:uncage",{ inventory_image = minetest.inventorycube("traps_uncage.png", "traps_uncage.png", "traps_uncage.png"), dug_item = '', -- Get nothing - groups={immortal}, + groups={immortal = 1}, description = "Cage Trap Release", }) @@ -33,7 +33,7 @@ minetest.register_node("traps:cage_glass", { inventory_image = minetest.inventorycube("default_glass.png"), paramtype = "light", sunlight_propagates = true, - groups = {immortl}, + groups = {immortal = 1}, sounds = default.node_sound_glass_defaults(), }) @@ -48,14 +48,12 @@ minetest.register_abm( for k, obj in pairs(objs) do print("HIT!") --local objpos=obj:getpos() - - local tmp - + minetest.env:add_node(pos,{name=block_to_place}) --Left print("Left") - tmp={x=(pos.x+1),y=(pos.y+1),z=(pos.z)} + local tmp = {x=(pos.x+1),y=(pos.y+1),z=(pos.z)} minetest.env:add_node(tmp,{name=block_to_place}) --Right diff --git a/mods/traps/lava.lua b/mods/traps/lava.lua index 1d83a18..2f30bc2 100644 --- a/mods/traps/lava.lua +++ b/mods/traps/lava.lua @@ -6,174 +6,171 @@ -- Cage Trap -minetest.register_node("traps:lava",{ - tile_images = {"traps_grass.png", "default_dirt.png", - "default_grass_side.png", "default_grass_side.png", - "default_grass_side.png", "default_grass_side.png"}, - inventory_image = minetest.inventorycube("traps_grass.png", - "default_grass_side.png", "default_grass_side.png"), +minetest.register_node("traps:lava", { + tile_images = {"traps_grass.png", "default_dirt.png", + "default_grass_side.png", "default_grass_side.png", + "default_grass_side.png", "default_grass_side.png"}, + inventory_image = minetest.inventorycube("traps_grass.png", + "default_grass_side.png", "default_grass_side.png"), dug_item = '', -- Get nothing - groups={immortal}, - description = "Lava Drop Trap", + groups = {immortal = 1}, + description = "Lava Drop Trap", }) -local block_to_place="default:lava_source" -local hi=5 --How high the lava is +local block_to_place = "default:lava_source" +local hi = 5 --How high the lava is minetest.register_abm( - {nodenames = {"traps:lava"}, - interval = 0.2, - chance = 1, + {nodenames = {"traps:lava"}, + interval = 0.2, + chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local objs = minetest.env:get_objects_inside_radius(pos, 1) for k, obj in pairs(objs) do print("HIT!") - --local objpos=obj:getpos() - - local tmp - - minetest.env:add_node(pos,{name="default:dirt"}) + + minetest.env:add_node(pos, {name = "default:dirt"}) --Left side pit - tmp={x=pos.x-2,y=pos.y,z=pos.z-2} - minetest.env:add_node(tmp,{name="air"}) + local tmp = {x = pos.x-2, y = pos.y, z = pos.z-2} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x-2,y=pos.y,z=pos.z-1} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x-2, y = pos.y, z = pos.z-1} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x-2,y=pos.y,z=pos.z} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x-2, y = pos.y, z = pos.z} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x-2,y=pos.y,z=pos.z+1} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x-2, y = pos.y, z = pos.z+1} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x-2,y=pos.y,z=pos.z+2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x-2, y = pos.y, z = pos.z+2} + minetest.env:add_node(tmp, {name = "air"}) --Right side pit - tmp={x=pos.x+2,y=pos.y,z=pos.z-2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+2, y = pos.y, z = pos.z-2} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x+2,y=pos.y,z=pos.z-1} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+2, y = pos.y, z = pos.z-1} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x+2,y=pos.y,z=pos.z} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+2, y = pos.y, z = pos.z} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x+2,y=pos.y,z=pos.z+1} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+2, y = pos.y, z = pos.z+1} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x+2,y=pos.y,z=pos.z+2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+2, y = pos.y, z = pos.z+2} + minetest.env:add_node(tmp, {name = "air"}) --front side pit - tmp={x=pos.x-1,y=pos.y,z=pos.z-2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x-1, y = pos.y, z = pos.z-2} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x,y=pos.y,z=pos.z-2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x, y = pos.y, z = pos.z-2} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x+1,y=pos.y,z=pos.z-2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+1, y = pos.y, z = pos.z-2} + minetest.env:add_node(tmp, {name = "air"}) --back side pit - tmp={x=pos.x-1,y=pos.y,z=pos.z+2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x-1, y = pos.y, z = pos.z+2} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x,y=pos.y,z=pos.z+2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x, y = pos.y, z = pos.z+2} + minetest.env:add_node(tmp, {name = "air"}) - tmp={x=pos.x+1,y=pos.y,z=pos.z+2} - minetest.env:add_node(tmp,{name="air"}) + tmp = {x = pos.x+1, y = pos.y, z = pos.z+2} + minetest.env:add_node(tmp, {name = "air"}) -- PLACE LAVA -- -- --Left side lava - tmp={x=pos.x-2,y=pos.y+hi,z=pos.z-2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-2, y = pos.y+hi, z = pos.z-2} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x-2,y=pos.y+hi,z=pos.z-1} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-2, y = pos.y+hi, z = pos.z-1} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x-2,y=pos.y+hi,z=pos.z} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-2, y = pos.y+hi, z = pos.z} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x-2,y=pos.y+hi,z=pos.z+1} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-2, y = pos.y+hi, z = pos.z+1} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x-2,y=pos.y+hi,z=pos.z+2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-2, y = pos.y+hi, z = pos.z+2} + minetest.env:add_node(tmp, {name = block_to_place}) --Right side lava - tmp={x=pos.x+2,y=pos.y+hi,z=pos.z-2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+2, y = pos.y+hi, z = pos.z-2} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x+2,y=pos.y+hi,z=pos.z-1} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+2, y = pos.y+hi, z = pos.z-1} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x+2,y=pos.y+hi,z=pos.z} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+2, y = pos.y+hi, z = pos.z} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x+2,y=pos.y+hi,z=pos.z+1} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+2, y = pos.y+hi, z = pos.z+1} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x+2,y=pos.y+hi,z=pos.z+2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+2, y = pos.y+hi, z = pos.z+2} + minetest.env:add_node(tmp, {name = block_to_place}) --front side pit - tmp={x=pos.x-1,y=pos.y+hi,z=pos.z-2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-1, y = pos.y+hi, z = pos.z-2} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x,y=pos.y+hi,z=pos.z-2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x, y = pos.y+hi, z = pos.z-2} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x+1,y=pos.y+hi,z=pos.z-2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+1, y = pos.y+hi, z = pos.z-2} + minetest.env:add_node(tmp, {name = block_to_place}) --back side lava - tmp={x=pos.x-1,y=pos.y+hi,z=pos.z+2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x-1, y = pos.y+hi, z = pos.z+2} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x,y=pos.y+hi,z=pos.z+2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x, y = pos.y+hi, z = pos.z+2} + minetest.env:add_node(tmp, {name = block_to_place}) - tmp={x=pos.x+1,y=pos.y+hi,z=pos.z+2} - minetest.env:add_node(tmp,{name=block_to_place}) + tmp = {x = pos.x+1, y = pos.y+hi, z = pos.z+2} + minetest.env:add_node(tmp, {name = block_to_place}) --block barrier - tmp={x=pos.x,y=pos.y+hi-1,z=pos.z} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x, y = pos.y+hi-1, z = pos.z} + minetest.env:add_node(tmp, {name = "default:glass"}) --1 - tmp={x=pos.x+1,y=pos.y+hi-1,z=pos.z+1} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x+1, y = pos.y+hi-1, z = pos.z+1} + minetest.env:add_node(tmp, {name = "default:glass"}) - tmp={x=pos.x+1,y=pos.y+hi-1,z=pos.z} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x+1, y = pos.y+hi-1, z = pos.z} + minetest.env:add_node(tmp, {name = "default:glass"}) - tmp={x=pos.x+1,y=pos.y+hi-1,z=pos.z-1} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x+1, y = pos.y+hi-1, z = pos.z-1} + minetest.env:add_node(tmp, {name = "default:glass"}) --2 - tmp={x=pos.x,y=pos.y+hi-1,z=pos.z-1} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x, y = pos.y+hi-1, z = pos.z-1} + minetest.env:add_node(tmp, {name = "default:glass"}) - tmp={x=pos.x-1,y=pos.y+hi-1,z=pos.z+1} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x-1, y = pos.y+hi-1, z = pos.z+1} + minetest.env:add_node(tmp, {name = "default:glass"}) - tmp={x=pos.x-1,y=pos.y+hi-1,z=pos.z-1} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x-1, y = pos.y+hi-1, z = pos.z-1} + minetest.env:add_node(tmp, {name = "default:glass"}) - tmp={x=pos.x,y=pos.y+hi-1,z=pos.z+1} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x, y = pos.y+hi-1, z = pos.z+1} + minetest.env:add_node(tmp, {name = "default:glass"}) - tmp={x=pos.x-1,y=pos.y+hi-1,z=pos.z} - minetest.env:add_node(tmp,{name="default:glass"}) + tmp = {x = pos.x-1, y = pos.y+hi-1, z = pos.z} + minetest.env:add_node(tmp, {name = "default:glass"}) end - end, + end, }) \ No newline at end of file