Auto-allocation

This commit is contained in:
rubenwardy 2014-12-27 17:36:58 +00:00
parent 8fab1cb55a
commit c89ac55ff7
4 changed files with 194 additions and 122 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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,
})