📄 main.pas
字号:
begin
UserSession := @SessionArray[i];
if UserSession.Socket <> nil then
begin
UserSession.Socket.Close;
UserSession.Socket := nil;
UserSession.nSckHandle := -1;
end;
end;
RestSessionArray();
if SocketBuffer <> nil then
begin
FreeMem(SocketBuffer);
end;
SocketBuffer := nil;
for i := 0 to List_45AA58.Count - 1 do
begin
//00454D6F
//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('是否确认清除显示的日志信息?',
'确认信息',
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
frmGeneralConfig.Top := Self.Top + 20;
frmGeneralConfig.Left := Self.Left;
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
frmMessageFilterConfig.Top := Self.Top + 20;
frmMessageFilterConfig.Left := Self.Left;
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
frmIPaddrFilter.Top := Self.Top + 20;
frmIPaddrFilter.Left := Self.Left;
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;
frmPrefConfig.Top := Self.Top + 20;
frmPrefConfig.Left := Self.Left;
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('是否确认重新加载配置信息?',
'确认信息',
MB_OKCANCEL + MB_ICONQUESTION
) <> IDOK then
exit;
LoadConfig();
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -