Official Soldat Forums
Server Talk => Scripting Releases => Topic started by: DorkeyDear on August 13, 2007, 07:13:06 pm
-
Script Name: 1v1 With Voted Weapon (Survival)
Script Description: When server has survival enabled, the script checks if there is only 1 player alive on alpha and bravo team, and when there is, both players may type '/ready _' where as _ is a weapon number from 1 to 14 (1 - 10 primaries, 11 - 14 secondaries). Players are prevented to pick up weapons. This is done by just re-forcing their weapon back when they change weapons. This means that if a player throws a knife, yes, they get a new one.
Original Author: Curt (DorkeyDear)
Core Version: 2.6.2
Code:const
Color = $FFFFFFFF;
Health = 65;
var
Player,Choice: array[1..2] of byte;
AfterKillMsg: string;
Start,Once: boolean;
function FixType(Value: integer): integer;
begin
Result := StrtoInt(InttoStr(Value));
end;
function AlivePlayers(Team: shortint): byte;
var
i: byte;
begin
for i := 1 to 32 do if (GetPlayerStat(i,'Active') = true) and (GetPlayerStat(i,'Alive') = true) and ((Team = -1) or (GetPlayerStat(i,'Team') = Team)) then Result := Result + 1;
end;
function WeapNumtoRealWeapNum(Num: byte): byte;
begin
if Num <= 10 then Result := Num else if Num = 11 then Result := 0 else Result := Num + 2;
end;
procedure AppOnIdle(Ticks: integer);
begin
if AfterKillMsg <> '' then begin
DrawText(0,AfterKillMsg,300,$FFDF3CA8,3.5 / Length(AfterKillMsg),8,400);
AfterKillMsg := '';
end;
end;
function OnPlayerCommand(ID: Byte; Text: string): boolean;
var
i,Weap,PlayerNum: byte;
begin
Result := false;
if (GetPiece(Text,' ',0) = '/ready') and ((ID = Player[1]) or (ID = Player[2])) and (Start = false) and (GetPlayerStat(Player[1],'Alive') = true) and (GetPlayerStat(Player[2],'Alive') = true) then begin
for i := 1 to 2 do if ID = Player[i] then PlayerNum := i;
try
Weap := StrtoInt(GetPiece(Text,' ',1));
except
WriteConsole(ID,'Invalid input.',Color);
end;
if (Weap >= 1) and (Weap <= 14) then begin
Choice[PlayerNum] := Weap;
if Choice[FixType(iif(PlayerNum = 1,2,1))] = Weap then begin
WriteConsole(0,'Both players have agreed to choose weapon #' + InttoStr(Weap) + '.',Color);
for i := 1 to 2 do begin
DoDamage(Player[i],GetPlayerStat(Player[i],'Health') - Health);
ForceWeapon(Player[i],WeapNumtoRealWeapNum(Weap),255,0);
end;
Start := true;
end else WriteConsole(0,GetPlayerStat(ID,'Name') + ' has selected weapon #' + InttoStr(Weap) + '.',Color);
end else WriteConsole(ID,'Invalid weapon number.',Color);
end;
end;
procedure OnPlayerKill(Killer, Victim: byte; Weapon: string);
var
i,j: byte;
begin
if (NumPlayers >= 2) and (((GetPlayerStat(Killer,'Team') <> GetPlayerStat(Victim,'Team')) and (AlivePlayers(GetPlayerStat(Victim,'Team')) = 2) and (AlivePlayers(GetPlayerStat(Killer,'Team')) = 1))) or ((GetPlayerStat(Killer,'Team') = GetPlayerStat(Victim,'Team')) and (AlivePlayers(GetPlayerStat(Killer,'Team')) = 2) and (AlivePlayers(iif(GetPlayerStat(Killer,'Team') = 1,2,1)) = 1)) then begin
WriteConsole(0,'1 vs 1! If you want to fight with the same weapon, type',Color);
WriteConsole(0,'''/ready _'' where as _ is the weapon number (1-14).',Color);
for i := 1 to 32 do if (GetPlayerStat(i,'Active') = true) and (GetPlayerStat(i,'Alive') = true) and (i <> Victim) then begin
for j := 1 to 2 do if Player[j] = 0 then begin
Player[j] := i;
Break;
end;
if Player[2] <> 0 then Break;
end;
end;
if Start then begin
if Killer <> Victim then AfterKillMsg := GetPlayerStat(Killer,'Name') + ' has won the 1 vs 1!';
Start := false;
end;
end;
function OnPlayerDamage(Victim, Shooter: byte; Damage: integer): integer;
begin
Result := Damage;
end;
procedure OnPlayerRespawn(ID: byte);
var
i,j: byte;
begin
for i := 1 to 2 do begin
Player[i] := 0;
Choice[i] := 0;
end;
if (NumPlayers = 2) then begin
if Once then begin
WriteConsole(0,'1 vs 1! If you want to fight with the same weapon, type',Color);
WriteConsole(0,'''/ready _'' where as _ is the weapon number (1-14).',Color);
Once := false;
end else Once := true;
for i := 1 to 32 do if (GetPlayerStat(i,'Active') = true) and (GetPlayerStat(i,'Alive') = true) then begin
for j := 1 to 2 do if Player[j] = 0 then begin
Player[j] := i;
Break;
end;
if Player[2] <> 0 then Break;
end;
end;
end;
procedure OnWeaponChange(ID, PrimaryNum, SecondaryNum: Byte);
begin
if (Start) and (PrimaryNum <> Choice[1]) then ForceWeapon(ID,WeapNumtoRealWeapNum(Choice[1]),255,0);
end;
Bugs:
- When the map restarts or changes, the message saying to do the /ready thing comes up two times if there is only one alpha and bravo players.
In request from Zigosity
-
and when you throw a weapon, the weapon is automatically reloaded? I haven't tested it yet, just wondering.