Вот статистика для трибесов не поддерживаются suden death, тк повер переменную gamesudden сделал криво
в след версии будем думать как это исправить, а пока пусть так...
Если в игре есть боты, то ведется отдельная статистика.
Update
изменены и добавлены некоторые функции
статистика доступна тут http://nfk.pro2d.ru/?action=ladder
глобальные переменные
Code
uses WinSock, SysUtils
BotGame:boolean;
NeedUpdate:boolean;
NewGame:boolean;
в процедуре MAIN_Loop надо добавить
Code
procedure MAIN_Loop;
var
i: byte;
begin
...
if StrToInt(GetSystemVariable('warmupleft'))<>0 then
NeedUpdate:=false;
if NewGame then
if not NeedUpdate and (StrToInt(GetSystemVariable('warmupleft'))=0) then
NeedUpdate:=True;
if NeedUpdate then
begin
ACheckBot;
AGetScore;
end;
...
...
end;
в ResetGame и MapChanged
Quote
procedure EVENT_ResetGame;
var
i: byte;
begin
...
NewGame:=True;
BotGame:=False;
...
...
end;
procedure EVENT_MapChanged;
begin
...
NewGame:=True;
BotGame:=False;
...
...
end;
Новые процедуры
Code
procedure ASendPlayers;
const
host = 'nfk.pro2d.ru';
var
i : byte;
wData : WSADATA;
addr : sockaddr_in;
sock : integer;
error : integer;
buf : array [0..1023] of Char;
str : string;
phe : PHostEnt;
begin
NeedUpdate:=False;
NewGame:=False;
WSAStartup($0101, wData);
phe := gethostbyname(PChar(string(host)));
if phe = nil then
begin
WSACleanup;
Exit;
end;
sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if sock = INVALID_SOCKET then
begin
WSACleanup;
Exit;
end;
addr.sin_family := AF_INET;
addr.sin_port := htons(80);
addr.sin_addr := PInAddr(phe.h_addr_list^)^;
error := connect(sock, addr, sizeof(addr));
if error = SOCKET_ERROR then
begin
closesocket(sock);
WSACleanup;
Exit;
end;
str := 'GET
http://' + host + '/?action=arena';
for I:=0 to 7 do
if players[i] <> nil then
with players[i] do
begin
str := str + '&name'+IntToStr(i+1)+'=' + NickTrim(netname) ;
str := str + '&frags'+IntToStr(i+1)+'=' + IntToStr(frags) ;
str := str + '&deaths'+IntToStr(i+1)+'=' + IntToStr(deaths) ;
end;
str := str + '>=' + GetSystemVariable('gametype');
if BotGame then str := str + '&botgame=1' else str := str + '&botgame=0' ;
str := str + ' HTTP/1.0'#13#10#13#10;
send(sock, str[1], Length(str), 0);
AddMEssage('^1SCORE SEND');
closesocket(sock);
WSACleanup;
end;
Code
procedure AGetScore;
var i:byte;
OT, TL, T_M, T_S, FL, DS_R, CS_R:Integer;
TS_R, TS_B, DL, CL, DS_B, CS_B :Integer;
GT :String;
begin
TL :=StrToInt(GetSystemVariable('timelimit'));
OT :=StrToInt(GetSystemVariable('overtime'));
T_M :=StrToInt(GetSystemVariable('time_min'));
T_S :=StrToInt(GetSystemVariable('time_sec'));
FL :=StrToInt(GetSystemVariable('fraglimit'));
CL :=StrToInt(GetSystemVariable('capturelimit'));
DL :=StrToInt(GetSystemVariable('domlimit'));
TS_R :=StrToInt(GetSystemVariable('teamscore_red'));
TS_B :=StrToInt(GetSystemVariable('teamscore_blue'));
GT :=GetSystemVariable('gametype');
DS_R :=DomScore_Red;
DS_B :=DomScore_blue;
CS_R :=CaptScore_Red;
CS_B :=CaptScore_Blue;
if TL<>0 then
if (T_M>=TL+OT) then ASendPlayers;
if FL<>0 then
for i:=0 to 4 do
if players[i] <> nil then
if players[i].frags >= FL then ASendPlayers;
if GT='CTF' then
if CL<>0 then
if (CS_R>=CL) or (CS_B>=CL) then ASendPlayers;
if GT='DOM' then
if DL<>0 then
if (DS_R>=DL) or (DS_B>=DL) then ASendPlayers;
end;
Code
procedure ACheckBot;
var i:byte;
begin
for i:=0 to 7 do
if players[i] <> nil then
if players[i].bot then
begin BotGame:=True; Exit; end;
end;
Code
function NickTrim(Nick : string): string;
var i:byte;
begin
Nick:=cleanstr(Nick);
for i:=0 to length(Nick) do
if Nick[i] in ['$','&', '''','"','#'] then
delete(nick,i,1);
Result := Nick;
end;
Code
function cleanstr(s:string):string;
var
i:integer;
cleann:boolean;
begin
Result := '';
cleann := false;
for i := 1 to length(s) do
begin
if cleann then
begin
cleann := false;
continue;
end
else
if s[i] = '^' then
begin
cleann := true;
continue;
end;
Result := Result + s[i];
end;
end;
bot_hack
Code
function CaptScore_Red:Byte;
begin
Result:=PInteger($0054C2C8)^;
end;
function CaptScore_Blue:Byte;
begin
Result:=PInteger($0054C2CC)^;
end;
function DomScore_Blue:Byte;
begin
Result:=PInteger($0054C818)^;
end;
function DomScore_Red:Byte;
begin
Result:=PInteger($0054C81C)^;
end;