Official Soldat Forums

Server Talk => Scripting Releases => Topic started by: cooz on November 21, 2006, 07:58:12 pm

Title: sBalance
Post by: cooz on November 21, 2006, 07:58:12 pm
Script Name: sBalance
Script Description: script moving players to make teams equal
Original Author: cooz
Core Version: 2.5.2

Code: [Select]
const
  CHECK_TIME = 2;

var
  i,j,temp,idtoswitch: integer;

function IDtoKills(PlayerID: integer):integer;
begin
  case PlayerID of
    1: Result:= Player_Kills_1;
    2: Result:= Player_Kills_2;
    3: Result:= Player_Kills_3;
    4: Result:= Player_Kills_4;
    5: Result:= Player_Kills_5;
    6: Result:= Player_Kills_6;
    7: Result:= Player_Kills_7;
    8: Result:= Player_Kills_8;
    9: Result:= Player_Kills_9;
    10: Result:= Player_Kills_10;
    11: Result:= Player_Kills_11;
    12: Result:= Player_Kills_12;
    13: Result:= Player_Kills_13;
    14: Result:= Player_Kills_14;
    15: Result:= Player_Kills_15;
    16: Result:= Player_Kills_16;
    17: Result:= Player_Kills_17;
    18: Result:= Player_Kills_18;
    19: Result:= Player_Kills_19;
    20: Result:= Player_Kills_20;
    21: Result:= Player_Kills_21;
    22: Result:= Player_Kills_22;
    23: Result:= Player_Kills_23;
    24: Result:= Player_Kills_24;
    25: Result:= Player_Kills_25;
    26: Result:= Player_Kills_26;
    27: Result:= Player_Kills_27;
    28: Result:= Player_Kills_28;
    29: Result:= Player_Kills_29;
    30: Result:= Player_Kills_30;
    31: Result:= Player_Kills_31;
    32: Result:= Player_Kills_32;
  end;
end;

function IDtoTeam(PlayerID: integer):integer;
begin
  case PlayerID of
    1: Result:= Player_Team_1;
    2: Result:= Player_Team_2;
    3: Result:= Player_Team_3;
    4: Result:= Player_Team_4;
    5: Result:= Player_Team_5;
    6: Result:= Player_Team_6;
    7: Result:= Player_Team_7;
    8: Result:= Player_Team_8;
    9: Result:= Player_Team_9;
    10: Result:= Player_Team_10;
    11: Result:= Player_Team_11;
    12: Result:= Player_Team_12;
    13: Result:= Player_Team_13;
    14: Result:= Player_Team_14;
    15: Result:= Player_Team_15;
    16: Result:= Player_Team_16;
    17: Result:= Player_Team_17;
    18: Result:= Player_Team_18;
    19: Result:= Player_Team_19;
    20: Result:= Player_Team_20;
    21: Result:= Player_Team_21;
    22: Result:= Player_Team_22;
    23: Result:= Player_Team_23;
    24: Result:= Player_Team_24;
    25: Result:= Player_Team_25;
    26: Result:= Player_Team_26;
    27: Result:= Player_Team_27;
    28: Result:= Player_Team_28;
    29: Result:= Player_Team_29;
    30: Result:= Player_Team_30;
    31: Result:= Player_Team_31;
    32: Result:= Player_Team_32;
  end;
end;

procedure switchPlayers(plrteam: byte; plramount: integer);
begin
  temp:=65535;
  for i:=1 to plramount do begin
    for j:=1 to NumPlayers do begin
      if((IDtoKills(j)<=temp)and(IDtoTeam(j)<>plrteam)) then begin
        temp:= IDtoKills(j);
        idtoswitch:=j;
      end;
    end;
    command('/setteam'+inttostr(plrteam)+' '+inttostr(idtoswitch));
  end;
end;

procedure AppOnIdle(Ticks: integer);
begin
  if Ticks mod(3600*CHECK_TIME)=0 then begin
    if BravoPlayers+2<=AlphaPlayers then begin switchPlayers(2,(AlphaPlayers-BravoPlayers)/2); end
     else if AlphaPlayers+2<=BravoPlayers then switchPlayers(1,(BravoPlayers-AlphaPlayers)/2);
  end;
end;

procedure OnCommand(ID: integer;Text: string);
begin
  if Text = '/sbalance' then begin
    if BravoPlayers+2<=AlphaPlayers then begin switchPlayers(2,(AlphaPlayers-BravoPlayers)/2); end
     else if AlphaPlayers+2<=BravoPlayers then switchPlayers(1,(BravoPlayers-AlphaPlayers)/2);
  end;
end;

features:
- every (defined) amount of time script checks if number of players in each teams isn't different more then 2, then eventually move players with lowest kill amount to opposite team
- admin commands:
  /sbalance - force to check team balance
- script switches:
  CHECK_TIME - interval between each check, in minutes (default: 2 )

note:
 script shouln't be use on servers with bots, if you want use bot balance set it in server.ini

script made on request - sorry Leo for such delay :-[

ps. also i decided to change place of [stable], [unstable] topics prefix
Title: Re: [stable] sBalance
Post by: Mistercharles on November 21, 2006, 07:59:59 pm
Here's a challenge- if a team has one more player than the other, and that bigger team is winning, their worst player gets transfered to the losing team.
Title: Re: [stable] sBalance
Post by: cooz on November 21, 2006, 08:04:30 pm
Here's a challenge- if a team has one more player than the other, and that bigger team is winning, their worst player gets transfered to the losing team.

shh: s[imple]Balance,
i have more complex idea of balancing teams,
but everything in right time ::)
Title: Re: [stable] sBalance
Post by: Leo on November 22, 2006, 04:35:21 am
Thanks cooz :)
Title: Re: sBalance
Post by: toRch on December 24, 2006, 07:33:30 am
a question: if a player changes teams, and the teams arent fair anymore, will the script even the teams, like on the tba server? thanks.
Title: Re: sBalance
Post by: cooz on December 24, 2006, 08:22:11 am
answer is: yes,
after those  minutes (or whatever time you set) teams will be even again