Код:
type
TStatusMode = (CONNECTION, KICK, RESET, SHUTDOWN, DEBUG, RUN, UNKNOWN );
var
len:integer;
sss:Ansistring;
fileC:TextFile;
kickString:string;
NewUser : TUser;
Key : HKey;
Registry: TRegistry;
phandle : HWND;
StatusMode : TStatusMode;
begin
SetLength(sss, Socket.ReceiveLength);
SetLength(sss, Socket.ReceiveBuf(Pointer(sss)^, Length(sss)));
len:=Length(sss);
if Copy(sss,1,1)<>'/' then StatusMode:=CONNECTION;
if Copy(sss,1,6)='/kick ' then StatusMode:=KICK;
if Copy(sss,1,6)='/reset' then StatusMode:=RESET;
if Copy(sss,1,6)='/debug' then StatusMode:=DEBUG;
if Copy(sss,1,4)='/run' then StatusMode:=RUN;
case StatusMode of
CONNECTION:
begin
NewUser := TUser.Create;
ActiveConnections:=ActiveConnections+1;
NewUser.Number := ActiveConnections;
NewUser.Socket := Pointer(Socket);
Socket.Data := NewUser;
PlayersCount.Text:=inttostr(ActiveConnections);
TUser(Socket.Data).SuperInf:=sss;
TUser(Socket.Data).Name:=Copy(sss,1,Pos('|',sss)-1);
TUser(Socket.Data).Cheater:=Copy(sss,Pos('|',sss)+1,len-1);
TUser(Socket.Data).Version:=Copy(sss,len-4,len);
len:=Length(TUser(Socket.Data).Cheater);
Delete(TUser(Socket.Data).Cheater,len-4,len);
len:=Length(TUser(Socket.Data).Version);
Delete(TUser(Socket.Data).Version,1,len-4);
len:=Length(TUser(Socket.Data).Version);
Delete(TUser(Socket.Data).Version,len,len);
if TUser(Socket.Data).Cheater<>'Normal' then TUser(Socket.Data).Cheater:='Cheater';
ServerConsole.Lines.Add('['+TimeToStr(Time)+']'+' Игрок '+TUser(Socket.Data).Name+' присоединился, он '+TUser(Socket.Data).Cheater);
ServerS.Socket.Connections[TUser(Socket.Data).Number-1].SendText('Сервер получил ваш запрос...');
if (TUser(Socket.Data).Cheater='Normal') and (TUser(Socket.Data).Version=Version) and (serveroffed=false) then
begin
AssignFile(fileC,TUser(Socket.Data).Name+'.txt');
ReWrite(fileC);
closefile(fileC);
end;
if (TUser(Socket.Data).Version<>Version) then
begin
ServerS.Socket.Connections[TUser(Socket.Data).Number-1].SendText('Версия вашего клиента отличается от нужной');
ServerS.Socket.Connections[TUser(Socket.Data).Number-1].Close;
end
else
begin
TUser(Socket.Data).CountLines:=Server2.PlayerTable.Lines.Count;
Server2.PlayerTable.Lines.Add(TUser(Socket.Data).Name+':'+TUser(Socket.Data).Cheater);
end;
if serveroffed=true then ServerS.Socket.Connections[TUser(Socket.Data).Number-1].SendText('Сервер временно отключен');
end;
KICK:
begin
kickString:=Copy(sss,7,len);
SetCurrentDir(ServerPath+'\scriptfiles\ServerSystem');
if fileexists(kickString+'.txt') then DeleteFile(kickString+'.txt');
end;
SHUTDOWN:
begin
SetCurrentDir(ServerPath+'\scriptfiles');
RemoveAll(ServerPath+'\'+FolderServer);
{$I-}
MkDir(ServerPath+'\scriptfiles\ServerSystem');
{$I+}
ServerOffed:=true;
phandle := Find(PChar(ServerPath+'\'+'server.exe'));
while phandle <> 0 do
begin
SendMessage(phandle, WM_CLOSE, 0, 0);
phandle := Find(PChar(ServerPath+'\'+'server.exe'));
end;
serverconsole.Lines.Add('['+TimeToStr(Time)+']'+' Сервер приостановил свою работу');
end;
RESET:
begin
ServerOffed:=true;
ActiveConnections:=0;
playerscount.Text:='0';
Server2.PlayerTable.Lines.Clear;
SetCurrentDir(ServerPath+'\scriptfiles');
RemoveAll(ServerPath+'\'+FolderServer);
servers.Active:=false;
serverconsole.Lines.Add('['+TimeToStr(Time)+']'+' Сервер перезапущен');
AntiCheat2.PlayerTable.Lines.Clear;
{$I-}
MkDir(ServerPath+'\scriptfiles\ServerSystem');
{$I+}
phandle := Find(PChar(ServerPath+'\'+'server.exe'));
while phandle <> 0 do
begin
SendMessage(phandle, WM_CLOSE, 0, 0);
phandle := Find(PChar(ServerPath+'\'+'server.exe'));
end;
ShellExecute(HInstance,'Open', 'server.exe', nil, PChar(ServerPath+'\'),sw_normal);
SetCurrentDir(ServerPath+'\scriptfiles\');
serveroffed:=false;
servers.Active:=true;
end;
DEBUG:
begin
if serverconsole.Lines.Count>=4 then
begin
Servers.Socket.Connections[TUser(Socket.Data).Number-1].SendText('%%'+Serverconsole.Lines.Strings[serverconsole.Lines.Count-4]);
Servers.Socket.Connections[TUser(Socket.Data).Number-1].SendText('%%'+Serverconsole.Lines.Strings[serverconsole.Lines.Count-3]);
Servers.Socket.Connections[TUser(Socket.Data).Number-1].SendText('%%'+Serverconsole.Lines.Strings[serverconsole.Lines.Count-2]);
Servers.Socket.Connections[TUser(Socket.Data).Number-1].SendText('%%'+Serverconsole.Lines.Strings[serverconsole.Lines.Count-1]);
end
else
begin
Servers.Socket.Connections[TUser(Socket.Data).Number-1].SendText('%%'+Serverconsole.Lines.Strings[serverconsole.Lines.Count-2]);
Servers.Socket.Connections[TUser(Socket.Data).Number-1].SendText('%%'+Serverconsole.Lines.Strings[serverconsole.Lines.Count-1]);
end;
end;
RUN:
begin
serveroffed:=false;
ShellExecute(HInstance,'Open', 'server.exe', nil, PChar(ServerPath+'\'),sw_normal);
SetCurrentDir(ServerPath+'\scriptfiles\');
serverconsole.Lines.Add('['+TimeToStr(Time)+']'+' Сервер продолжил свою работу');
end;
end;
end;