A ready-made thread that can stop script execution when nearby characters are detected. It ignores its own bots and whitelisted players.
uses SysUtils, Classes;
const
WHITE_LIST = 'Nickname1; Nickname2; ';
clRed = 255;
function IsMyBot(Player: TPlayer): Boolean;
var
i: Integer;
Acc: TAccount;
begin
Result:= False;
for i:= 0 to Accounts.Count-1 do begin
Acc:= Accounts(i);
if (Acc.User.OID = Player.OID) then begin
Result:= True;
Exit;
end;
end;
end;
function InWhiteList(Player: TPlayer): Boolean;
var
i: Integer;
SL: TStringList;
begin
Result:= False;
SL:= TStringList.Create();
try
SL.Text:= StringReplace(WHITE_LIST, ';', #13#10, [rfReplaceAll]);
for i:= 0 to SL.Count-1 do begin
if (SL[i] = Player.Name) then begin
Result:= True;
Exit;
end;
end;
finally
SL.Free();
end;
end;
function FindBadPlayer(): TPlayer;
var
i: Integer;
Player: TPlayer;
begin
Result:= nil;
for i:= 0 to Players.Count-1 do begin
Player:= Players(i);
if IsMyBot(Player) then Continue;
if InWhiteList(Player) then Continue;
Result:= Player;
Account.PrintEx(Format('Enemy detected: %s (dist: %d)', [Player.Name, User.DistTo(Player)]), clRed, 60000);
Break;
end;
end;
procedure CheckPlayersAndPauseScriptThread();
var
i: Integer;
BadPlayer: TPlayer;
SoundTimer: Cardinal;
begin
Print('CheckPlayersAndPauseScriptThread started...');
while Delay(1000) do begin
if (Status <> lsOnline) then Continue;
BadPlayer:= FindBadPlayer();
if Assigned(BadPlayer) then begin
Account.PrintEx(Format('Enemy detected: %s (dist: %d)', [BadPlayer.Name, User.DistTo(BadPlayer)]), clRed, 60000);
if TimerEx(SoundTimer, 5*1000) then PlaySound(ExePath + 'Sounds\alarm (fem).wav');
Script.Suspend();
end else begin
Script.Resume();
end;
end;
end;
begin
Script.NewThread(@CheckPlayersAndPauseScriptThread);
// ..
Delay(-1);
end.