📄 main.pas
字号:
//00454D95
end;
List_45AA58.Clear;
boGateReady:=False;
boServerReady:=False;
end;
procedure TFrmMain.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
dwTime10,dwTick14:LongWord;
nMsgLen:Integer;
tBuffer :PChar;
begin
try
dwTick14:=GetTickCount();
nMsgLen:=Socket.ReceiveLength;
GetMem(tBuffer,nMsgLen);
Socket.ReceiveBuf(tBuffer^,nMsgLen);
ProcReceiveBuffer(tBuffer,nMsgLen);
Inc(nBufferOfM2Size,nMsgLen);
dwTime10:=GetTickCount - dwTick14;
if dwProcessServerMsgTime < dwTime10 then begin
dwProcessServerMsgTime:=dwTime10;
end;
except
on E:Exception do begin
AddMainLogMsg('[Exception] ClientSocketRead',1);
end;
end;
end;
procedure TFrmMain.ProcReceiveBuffer(tBuffer:PChar; nMsgLen:Integer);
var
nLen:integer;
Buff:PChar;
pMsg:pTMsgHeader;
MsgBuff:PChar;
TempBuff:PChar;
begin
try
ReallocMem(SocketBuffer,nBuffLen + nMsgLen);
Move(tBuffer^,SocketBuffer[nBuffLen],nMsgLen);
FreeMem(tBuffer);
nLen:=nBuffLen + nMsgLen;
Buff:=SocketBuffer;
if nLen >= SizeOf(TMsgHeader) then begin
while (True) do begin
pMsg:=pTMsgHeader(Buff);
if pMsg.dwCode = RUNGATECODE then begin
if (abs(pMsg.nLength) + SizeOf(TMsgHeader)) > nLen then break;// -> 0045525C
MsgBuff:=Ptr(LongInt(Buff) + SizeOf(TMsgHeader));
case pMsg.wIdent of
GM_CHECKSERVER: begin
boCheckServerFail:=False;
dwCheckServerTick:=GetTickCount();
end;
GM_SERVERUSERINDEX: begin
if (pMsg.wGSocketIdx < GATEMAXSESSION) and (pMsg.nSocket = SessionArray[pMsg.wGSocketIdx].nSckHandle) then begin
SessionArray[pMsg.wGSocketIdx].nUserListIndex:=pMsg.wUserListIndex;
end;//00455218
end;
GM_RECEIVE_OK: begin
dwCheckServerTimeMin:=GetTickCount - dwCheckRecviceTick;
if dwCheckServerTimeMin > dwCheckServerTimeMax then dwCheckServerTimeMax:=dwCheckServerTimeMin;
dwCheckRecviceTick:=GetTickCount();
SendServerMsg(GM_RECEIVE_OK,0,0,0,0,nil);
end;
GM_DATA: begin
ProcessMakeSocketStr(pMsg.nSocket,pMsg.wGSocketIdx,MsgBuff,pMsg.nLength);
end;
GM_TEST: begin
end;
end;
Buff:=@Buff[SizeOf(TMsgHeader) + abs(pMsg.nLength)];
//Buff:=Ptr(LongInt(Buff) + (abs(pMsg.nLength) + SizeOf(TMsgHeader)));
nLen:= nLen - (abs(pMsg.nLength) + SizeOf(TMsgHeader));
end else begin//00455242
Inc(Buff);
Dec(nLen);
//0045524C inc ds:dword_46950C
end;
if nLen < SizeOf(TMsgHeader) then break;
end;
end;//0045525C
if nLen > 0 then begin
GetMem(TempBuff,nLen);
Move(Buff^,TempBuff^,nLen);
FreeMem(SocketBuffer);
SocketBuffer:=TempBuff;
nBuffLen:=nLen;
end else begin//00455297
FreeMem(SocketBuffer);
SocketBuffer:=nil;
nBuffLen:=0;
end;
except
on E:Exception do begin
AddMainLogMsg('[Exception] ProcReceiveBuffer',1);
end;
end;
end;
procedure TFrmMain.ProcessMakeSocketStr(nSocket,nSocketIndex:Integer;Buffer:PChar;nMsgLen:Integer);
//00455CA8
var
sSendMsg:String;
pDefMsg:pTDefaultMessage;
UserData:pTSendUserData;
begin
try
sSendMsg:='';
if nMsgLen < 0 then begin
sSendMsg:='#' + String(Buffer) + '!';
end else begin//00455D18
if (nMsgLen >= SizeOf(TDefaultMessage)) then begin
pDefMsg:=pTDefaultMessage(Buffer);
if nMsgLen > SizeOf(TDefaultMessage) then begin
sSendMsg:='#' + EncodeMessage(pDefMsg^) + String(PChar(@Buffer[SizeOf(TDefaultMessage)])) + '!';
end else begin//00455D62
sSendMsg:='#' + EncodeMessage(pDefMsg^) + '!';
end;
end;//00455D87
end;
if (nSocketIndex >= 0) and (nSocketIndex < GATEMAXSESSION) and (sSendMsg <> '') then begin
New(UserData);
UserData.nSocketIdx:=nSocketIndex;
UserData.nSocketHandle:=nSocket;
UserData.sMsg:=sSendMsg;
SendMsgList.Add(UserData);
end;
except
on E:Exception do begin
AddMainLogMsg('[Exception] ProcessMakeSocketStr',1);
end;
end;
end;
procedure TFrmMain.MENU_CONTROL_CLEAELOGClick(Sender: TObject);
begin
if Application.MessageBox('Do you want to clear the logs?',
'Confirm',
MB_OKCANCEL + MB_ICONQUESTION
) <> IDOK then exit;
MemoLog.Clear;
end;
procedure TFrmMain.MENU_CONTROL_RECONNECTClick(Sender: TObject);
begin
dwReConnectServerTime:=0;
end;
procedure TFrmMain.MENU_OPTION_GENERALClick(Sender: TObject);
begin
CenterDialog(Handle, frmGeneralConfig.Handle);
with frmGeneralConfig do begin
EditGateIPaddr.Text:=GateAddr;
EditGatePort.Text:=IntToStr(GatePort);
EditServerIPaddr.Text:=ServerAddr;
EditServerPort.Text:=IntToStr(ServerPort);
EditTitle.Text:=TitleName;
TrackBarLogLevel.Position:=nShowLogLevel;
ComboBoxShowBite.ItemIndex:=Integer(boShowBite);
end;
frmGeneralConfig.ShowModal;
end;
procedure TFrmMain.MENU_OPTION_FILTERMSGClick(Sender: TObject);
var
i:Integer;
begin
CenterDialog(Handle, frmMessageFilterConfig.Handle);
frmMessageFilterConfig.ListBoxFilterText.Clear;
try
CS_FilterMsg.Enter;
for i:=0 to AbuseList.Count -1 do begin
frmMessageFilterConfig.ListBoxFilterText.Items.Add(AbuseList.Strings[i]);
end;
finally
CS_FilterMsg.Leave;
end;
frmMessageFilterConfig.ButtonDel.Enabled:=False;
frmMessageFilterConfig.ButtonMod.Enabled:=False;
frmMessageFilterConfig.ShowModal;
end;
function TFrmMain.IsBlockIP(sIPaddr: String): Boolean;
var
i:Integer;
sBlockIPaddr:String;
begin
Result:=False;
for I := 0 to TempBlockIPList.Count - 1 do begin
sBlockIPaddr:= TempBlockIPList.Strings[i];
if CompareText(sIPaddr,sBlockIPaddr) = 0 then begin
Result:=True;
Break;
end;
end;
for I := 0 to BlockIPList.Count - 1 do begin
sBlockIPaddr:= BlockIPList.Strings[i];
if CompareLStr(sIPaddr,sBlockIPaddr,Length(sBlockIPaddr)) then begin
Result:=True;
Break;
end;
end;
end;
function TFrmMain.IsConnLimited(sIPaddr: String): Boolean;
var
i,nCount:Integer;
begin
nCount:=0;
Result:=False;
for I := 0 to ServerSocket.Socket.ActiveConnections - 1 do begin
if CompareText(sIPaddr,ServerSocket.Socket.Connections[i].RemoteAddress) = 0 then Inc(nCount);
end;
if nCount > nMaxConnOfIPaddr then begin
Result:=True;
end;
end;
procedure TFrmMain.MENU_OPTION_IPFILTERClick(Sender: TObject);
var
i:Integer;
sIPaddr:String;
begin
CenterDialog(Handle, frmIPaddrFilter.Handle);
frmIPaddrFilter.ListBoxActiveList.Clear;
frmIPaddrFilter.ListBoxTempList.Clear;
frmIPaddrFilter.ListBoxBlockList.Clear;
if ServerSocket.Active then
for i:= 0 to ServerSocket.Socket.ActiveConnections - 1 do begin
sIPaddr:=ServerSocket.Socket.Connections[i].RemoteAddress;
if sIPaddr <> '' then
frmIPaddrFilter.ListBoxActiveList.Items.AddObject(sIPaddr,Tobject(ServerSocket.Socket.Connections[i]));
end;
for i:= 0 to TempBlockIPList.Count - 1 do begin
frmIPaddrFilter.ListBoxTempList.Items.Add(TempBlockIPList.Strings[i]);
end;
for i:= 0 to BlockIPList.Count - 1 do begin
frmIPaddrFilter.ListBoxBlockList.Items.Add(BlockIPList.Strings[i]);
end;
frmIPaddrFilter.EditMaxConnect.Value:=nMaxConnOfIPaddr;
case BlockMethod of
mDisconnect: frmIPaddrFilter.RadioDisConnect.Checked:=True;
mBlock: frmIPaddrFilter.RadioAddTempList.Checked:=True;
mBlockList: frmIPaddrFilter.RadioAddBlockList.Checked:=True;
end;
frmIPaddrFilter.EditMaxSize.Value:=nMaxClientPacketSize;
frmIPaddrFilter.EditNomSize.Value:=nNomClientPacketSize;
frmIPaddrFilter.EditMaxClientMsgCount.Value:=nMaxClientMsgCount;
frmIPaddrFilter.CheckBoxLostLine.Checked:=bokickOverPacketSize;
frmIPaddrFilter.EditClientTimeOutTime.Value:=dwClientTimeOutTime div 1000;
frmIPaddrFilter.ShowModal;
end;
procedure TFrmMain.CloseConnect(sIPaddr: String);
var
i:Integer;
boCheck:Boolean;
begin
if ServerSocket.Active then
while (True) do begin
boCheck:=False;
for i:= 0 to ServerSocket.Socket.ActiveConnections - 1 do begin
if sIPaddr=ServerSocket.Socket.Connections[i].RemoteAddress then begin
ServerSocket.Socket.Connections[i].Close;
boCheck:=True;
break;
end;
end;
if not boCheck then break;
end;
end;
procedure TFrmMain.MENU_OPTION_PERFORMClick(Sender: TObject);
begin
frmPrefConfig.boShowOK:=False;
CenterDialog(Handle, frmPrefConfig.Handle);
with frmPrefConfig do begin
EditServerCheckTimeOut.Value:=dwCheckServerTimeOutTime div 1000;
EditSendBlockSize.Value:=nClientSendBlockSize;
{
EditGateIPaddr.Text:=GateAddr;
EditGatePort.Text:=IntToStr(GatePort);
EditServerIPaddr.Text:=ServerAddr;
EditServerPort.Text:=IntToStr(ServerPort);
EditTitle.Text:=TitleName;
TrackBarLogLevel.Position:=nShowLogLevel;
ComboBoxShowBite.ItemIndex:=Integer(boShowBite);
}
boShowOK:=True;
ShowModal;
end;
end;
function TFrmMain.CheckDefMsg(DefMsg:pTDefaultMessage;SessionInfo:pTSessionInfo):Boolean;
begin
Result:=True;
case DefMsg.Ident of
CM_WALK,CM_RUN: begin
end;
CM_TURN: begin
end;
CM_HIT,CM_HEAVYHIT,CM_BIGHIT,CM_POWERHIT,CM_LONGHIT,CM_WIDEHIT,CM_FIREHIT: begin
// if (GetTickCount - SessionInfo.dwHitTick) > dwHitTime then dwHitTime:=GetTickCount()
// else Result:=False;
end;
CM_SPELL: begin
end;
CM_DROPITEM: begin
end;
CM_PICKUP: begin
end;
end;
end;
procedure TFrmMain.CloseAllUser;
var
nSockIdx:Integer;
begin
for nSockIdx:=0 to GATEMAXSESSION - 1 do begin
if SessionArray[nSockIdx].Socket <> nil then
SessionArray[nSockIdx].Socket.Close;
end;
end;
procedure TFrmMain.MENU_CONTROL_RELOADCONFIGClick(Sender: TObject);
begin
if Application.MessageBox('Do you want to reload configuration?',
'Confirm',
MB_OKCANCEL + MB_ICONQUESTION
) <> IDOK then exit;
LoadConfig();
end;
{---- Adjust global SVN revision ----}
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
ini: TMemIniFile;
begin
ini := TMemIniFile.Create(PosFile);
ini.WriteInteger('GameGate','Left',frmMain.Left);
ini.WriteInteger('GameGate','Top',frmMain.Top);
ini.UpdateFile;
ini.Free;
end;
procedure TFrmMain.CnTrayIcon1DblClick(Sender: TObject);
begin
show;
end;
initialization
SVNRevision('$Id: Main.pas 465 2006-10-01 15:40:03Z thedeath $');
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -