Official Soldat Forums

Server Talk => Scripting Releases => Topic started by: DhD on June 15, 2007, 12:58:46 pm

Title: [Release] Vote random map (with time)
Post by: DhD on June 15, 2007, 12:58:46 pm
Script Name: Vote random map
Script Description: Players can vote a random map by !voterandom. If they vote, they can't vote again until the time you have set is over. When map is changed the time will be reseted.
Original Author(s): DhD (DieHardDie)
Core Version: 2.6.1

If you want the script to work, you have to make a .txt file and edit the name in the script. Standard the name is randmaplist.txt
You can also adjust the time that the players have to wait before they can vote again.

Code: [Select]
const
  iTimer  = (3*60);            {time in seconds that the players have to wait before voting}
  sRanMap = 'randmaplist.txt'; {text file where the list of maps to choose from is}
var
  aPlayer: array[1..32] of Integer;

function OnRequestGame(IP: string; State: integer): integer;
begin
  Result := State;
end;

procedure OnMapChange(NewMap: string);
  var
    iFor: integer;
begin

  for iFor := 1 to 32 do begin
 
    aPlayer[iFor] := TimeLeft;
  end;
end;

procedure OnJoinTeam(ID, Team: byte);
begin
 
  aPlayer[ID] := TimeLeft;
end;

function xSplit(const source: string; const delimiter: string):TStringArray;
  var
    i,x,d:integer;
    s:string;
   
begin
 
  d:=length(delimiter);
  x:=0;
  i:=1;
  SetArrayLength(Result,1);
 
  while(i<=length(source)) do begin
 
    s:=Copy(source,i,d);
   
     if(s=delimiter) then begin
     
      inc(i,d);
      inc(x,1);
      SetArrayLength(result,x+1);
    end
    else begin
   
      result[x]:= result[x]+Copy(s,1,1);
      inc(i,1);
    end;
  end;
end;

procedure VoteMap(cText: string; Name: integer);
  var
    iList: Integer;
    iRep:  Integer;
    aList: TStringArray;
    sMap:  String;

begin
 
  iList := 1;
  if ((aPlayer[Name]-iTimer) >= TimeLeft) then begin
   
    if (FileExists(sRanMap)) then begin
     
      aList := xSplit(ReadFile(sRanMap), (chr(13)+chr(10)));
      iList := ArrayHigh(aList);
      sMap  := aList[random(0, iList)]
     
      repeat
       
        sMap := aList[random(0, iList)]
        iRep := iRep+1;
      until (sMap <> CurrentMap) or (iRep = 10);
     
      StartVoteMap(Name, sMap);
     
      aPlayer[Name] := TimeLeft;
    end
    else begin
     
      Command('/say Map list is not found.');
    end;
  end
  else begin
   
    Command('/say You have to wait ' + IntToStr(TimeLeft - (aPlayer[Name]-iTimer)) + ' seconds till next vote.');
  end;
end;

function OnPlayerSpeak(Name: string; Text: string): boolean;
  var
    cText:  String;
   
begin
 
  cText  := LowerCase(Text);
 
  if (cText = '!voterandom') then begin
   
    VoteMap(cText, StrToInt(Name));
  end;
end;

Thanks to all the scripts on this site and enesce!
Title: Re: [Release] Vote random map (with time)
Post by: urraka on June 15, 2007, 01:13:58 pm
The OnPlayerSpeak event, the correct is

Code: [Select]
procedure OnPlayerSpeak(ID: Byte; Text: string);
Maybe you should check also if the random map isn't the CurrentMap, so you don't vote the map you are playing on.
Title: Re: [Release] Vote random map (with time)
Post by: DhD on June 15, 2007, 01:37:25 pm
Thanks for your fast reaction! I changed it and I'll edit my post!
Title: Re: [Release] Vote random map (with time)
Post by: kusyi on June 16, 2007, 02:28:32 am
thx
Title: Re: [Release] Vote random map (with time)
Post by: miketh2005 on August 23, 2007, 05:50:25 pm
can someone sip this to work with new Core version? too lazy to do it myself :( sry thanx
Title: Re: [Release] Vote random map (with time)
Post by: Iq Unlimited on August 23, 2007, 08:48:35 pm
sure, gimme 3 seconds...

here.

Title: Re: [Release] Vote random map (with time)
Post by: miketh2005 on August 25, 2007, 01:39:30 pm
thanx