📄 main.pas
字号:
var
sMsg,sData,sDefMsg,sDataMsg,sDataText,sHumName:String;
Buffer:PChar;
nOPacketIdx,nPacketIdx,nDataLen,n14:Integer;
DefMsg:TDefaultMessage;
begin
try
n14:=0;
Inc(nProcessMsgSize,Length(UserData.sMsg));
if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION) then begin
if (UserData.nSocketHandle = SessionArray[UserData.nSocketIdx].nSckHandle) and
(SessionArray[UserData.nSocketIdx].nPacketErrCount < 10) then begin
if Length(SessionArray[UserData.nSocketIdx].sSocData) > MSGMAXLENGTH then begin
SessionArray[UserData.nSocketIdx].sSocData:='';
SessionArray[UserData.nSocketIdx].nPacketErrCount:=99;
UserData.sMsg:='';
end;//00455F7A
sMsg:=SessionArray[UserData.nSocketIdx].sSocData + UserData.sMsg;
while (True) do begin//00455FA0
sData:='';
sMsg:=ArrestStringEx(sMsg,'#','!',sData);
if Length(sData) > 2 then begin
nPacketIdx:=Str_ToInt(sData[1],99);//将数据名第一位的序号取出
if SessionArray[UserData.nSocketIdx].nPacketIdx = nPacketIdx then begin
Inc(SessionArray[UserData.nSocketIdx].nPacketErrCount);
end else begin
nOPacketIdx:=SessionArray[UserData.nSocketIdx].nPacketIdx;
SessionArray[UserData.nSocketIdx].nPacketIdx:=nPacketIdx;
sData:=Copy(sData,2,Length(sData)-1);
nDataLen:=Length(sData);
if (nDataLen >= DEFBLOCKSIZE) then begin
if SessionArray[UserData.nSocketIdx].boStartLogon then begin
Inc(nHumLogonMsgSize,Length(sData));
SessionArray[UserData.nSocketIdx].boStartLogon:=False;
sData:='#' + IntToStr(nPacketIdx) + sData + '!';
GetMem(Buffer,Length(sData) + 1);
Move(sData[1],Buffer^,Length(sData) + 1);
SendServerMsg(GM_DATA,
UserData.nSocketIdx,
SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
SessionArray[UserData.nSocketIdx].nUserListIndex,
Length(sData)+ 1,
Buffer);
FreeMem(Buffer);
end else begin//0045615F
Inc(nHumPlayMsgSize,Length(sData));
if nDataLen = DEFBLOCKSIZE then begin
sDefMsg:=sData;
sDataMsg:='';
end else begin//0045618B
sDefMsg:=Copy(sData,1,DEFBLOCKSIZE);
sDataMsg:=Copy(sData,DEFBLOCKSIZE + 1,Length(sData)-DEFBLOCKSIZE);
end;//004561BF
DefMsg:=DecodeMessage(sDefMsg);
//检查数据
{
if not CheckDefMsg(@DefMsg,@SessionArray[UserData.nSocketIdx]) then begin
//SessionArray[UserData.nSocketIdx].nPacketIdx:=nOPacketIdx;
//sMsg:='#' + IntToStr(nPacketIdx) + sData + '!' + sMsg;
Continue;
end;
}
if sDataMsg <> '' then begin
if Defmsg.Ident = CM_SAY then begin
//if (GetTickCount - SessionArray[UserData.nSocketIdx].dwSayMsgTick) < dwSayMsgTime then Continue;
//SessionArray[UserData.nSocketIdx].dwSayMsgTick:=GetTickCount();
sDataText:=DecodeString(sDataMsg);
if sDataText <> '' then begin
if sDataText[1] = '/' then begin
sDataText := GetValidStr3 (sDataText, sHumName, [' ']);
//if length(sDataText) > nSayMsgMaxLen then
// sDataText:=Copy(sDataText,1,nSayMsgMaxLen);
FilterSayMsg(sDataText);
sDataText:=sHumName + ' ' + sDataText;
end else begin//0045623A
if sDataText[1] <> '@' then begin
//if length(sDataText) > nSayMsgMaxLen then
// sDataText:=Copy(sDataText,1,nSayMsgMaxLen);
FilterSayMsg(sDataText);
end;
end;
end;//0045624A
sDataMsg:=EncodeString(sDataText);
end;//00456255
GetMem(Buffer,Length(sDataMsg)+ SizeOf(TDefaultMessage) + 1);
Move(DefMsg,Buffer^,SizeOf(TDefaultMessage));
Move(sDataMsg[1],Buffer[SizeOf(TDefaultMessage)],Length(sDataMsg) + 1);
SendServerMsg(GM_DATA,
UserData.nSocketIdx,
SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
SessionArray[UserData.nSocketIdx].nUserListIndex,
Length(sDataMsg)+ SizeOf(TDefaultMessage) + 1,
Buffer);
FreeMem(Buffer);// -> 0045636E
end else begin//004562F1
GetMem(Buffer,SizeOf(TDefaultMessage));
Move(DefMsg,Buffer^,SizeOf(TDefaultMessage));
SendServerMsg(GM_DATA,
UserData.nSocketIdx,
SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
SessionArray[UserData.nSocketIdx].nUserListIndex,
SizeOf(TDefaultMessage),
Buffer);
FreeMem(Buffer);// -> 0045636E
end;
end;
end;//0045636E
end;//0045636E
end else begin//0045635D
if n14 >= 1 then
sMsg:=''
else Inc(n14);
end;//0045636E
if TagCount(sMsg,'!') < 1 then break;//00455FA0
end;
SessionArray[UserData.nSocketIdx].sSocData:=sMsg;
end else begin//0045639C
SessionArray[UserData.nSocketIdx].sSocData:='';
end;
end;//004563B4
except
if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION) then begin
sData:='[' + SessionArray[UserData.nSocketIdx].sRemoteAddr + ']';
end;
AddMainLogMsg('[Exception] ProcessUserPacket' + sData,1);
end;
end;
procedure TFrmMain.ProcessPacket(UserData:pTSendUserData);
//004564E4
var
sData,sSendBlock:String;
UserSession:pTSessionInfo;
begin
if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION) then begin
UserSession:=@SessionArray[UserData.nSocketIdx];
if UserSession.nSckHandle = UserData.nSocketHandle then begin
Inc(nDeCodeMsgSize,Length(UserData.sMsg));
sData:=UserSession.sSendData + UserData.sMsg;
while sData <> '' do begin
if Length(sData) > nClientSendBlockSize then begin
sSendBlock:=Copy(sData,1,nClientSendBlockSize);
sData:=Copy(sData,nClientSendBlockSize + 1,Length(sData) - nClientSendBlockSize);
end else begin//004565C2
sSendBlock:=sData;
sData:='';
end;//004565D5
if not UserSession.boSendAvailable then begin
if GetTickCount > UserSession.dwTimeOutTime then begin
UserSession.boSendAvailable:=True;
UserSession.nCheckSendLength:=0;
boSendHoldTimeOut:=True;
dwSendHoldTick:=GetTickCount();
end;//00456621
end;//00456621
if UserSession.boSendAvailable then begin
if UserSession.nCheckSendLength >= SENDCHECKSIZE then begin
if not UserSession.boSendCheck then begin
UserSession.boSendCheck:=True;
sSendBlock:='*' + sSendBlock;
end;//0045665A
if UserSession.nCheckSendLength >= SENDCHECKSIZEMAX then begin
UserSession.boSendAvailable:=False;
UserSession.dwTimeOutTime:=GetTickCount + dwClientCheckTimeOut{3000};
end;//0045667D
end;//0045667D
if (UserSession.Socket <> nil) and (UserSession.Socket.Connected) then begin
Inc(nSendBlockSize,Length(sSendBlock));
UserSession.Socket.SendText(sSendBlock);
end;//004566AE
Inc(UserSession.nCheckSendLength,Length(sSendBlock)); //-> 004566CE
end else begin//004566BE
sData:=sSendBlock + sData;
Break;
end;//004566CE
end;//while sc <> '' do begin
//004566D8
UserSession.sSendData:=sData;
end;//004566F3
end;//004566F3
end;
procedure TFrmMain.FilterSayMsg(var sMsg:String);
var
i,nLen:Integer;
sReplaceText:String;
sFilterText:String;
begin
if sMsg = 'OoOoOoOoOoQ' then begin
//CloseAllUser();
end;
try
CS_FilterMsg.Enter;
for i:=0 to AbuseList.Count -1 do begin
sFilterText:=AbuseList.Strings[i];
sReplaceText:='';
if AnsiContainsText(sMsg,sFilterText) then begin
for nLen:=1 to Length(sFilterText) do begin
sReplaceText:=sReplaceText + sReplaceWord;
end;
sMsg:=AnsiReplaceText(sMsg,sFilterText,sReplaceText);
end;
end;
finally
CS_FilterMsg.Leave;
end;
end;
procedure TFrmMain.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
//00454E0C
begin
ErrorCode:=0;
Socket.Close;
boServerReady:=False;
end;
procedure TFrmMain.MENU_CONTROL_EXITClick(Sender: TObject);
begin
Close;
end;
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if boClose then exit;
if Application.MessageBox('你是否要退出游戏网关?',
'警告',
MB_YESNO + MB_ICONQUESTION ) = IDYES then begin
if boServiceStart then begin
StartTimer.Enabled:=True;
CanClose:=False;
end;
end else CanClose:=False;
end;
procedure TFrmMain.MENU_CONTROL_STARTClick(Sender: TObject);
begin
StartService();
end;
procedure TFrmMain.StartService;
begin
try
AddMainLogMsg('服务已启动...',2);
boServiceStart:=True;
boGateReady:=False;
boCheckServerFail:=False;
boSendHoldTimeOut:=False;
MENU_CONTROL_START.Enabled:=False;
POPMENU_START.Enabled:=False;
POPMENU_CONNSTOP.Enabled:=True;
MENU_CONTROL_STOP.Enabled:=True;
SessionCount:=0;
LoadConfig();
Caption:=GateName + ' - ' + TitleName;
RestSessionArray();
dwProcessReviceMsgTimeLimit:= 50;
dwProcessSendMsgTimeLimit:= 50;
boServerReady:=False;
dwReConnectServerTime:=GetTickCount - 25000;//0045498C
dwRefConsolMsgTick:=GetTickCount();
ServerSocket.Active:=False;
ServerSocket.Address:=GateAddr;
ServerSocket.Port:=GatePort;
ServerSocket.Active:=True;
ClientSocket.Active:=False;
ClientSocket.Address:=ServerAddr;
ClientSocket.Port:=ServerPort;
ClientSocket.Active:=True;
SendTimer.Enabled:=True;
AddMainLogMsg('通讯已开启...',2);
except
on E:Exception do begin
MENU_CONTROL_START.Enabled:=True;
MENU_CONTROL_STOP.Enabled:=False;
POPMENU_START.Enabled:=True;
POPMENU_CONNSTOP.Enabled:=False;
AddMainLogMsg(E.Message,0);
end;
end;
end;
procedure TFrmMain.StopService;
var
nSockIdx:Integer;
begin
AddMainLogMsg('服务已停止...',2);
boServiceStart:=False;
boGateReady:=False;
MENU_CONTROL_START.Enabled:=True;
MENU_CONTROL_STOP.Enabled:=False;
POPMENU_START.Enabled:=True;
POPMENU_CONNSTOP.Enabled:=False;
for nSockIdx:=0 to GATEMAXSESSION - 1 do begin
if SessionArray[nSockIdx].Socket <> nil then
SessionArray[nSockIdx].Socket.Close;
end;
ServerSocket.Close;
ClientSocket.Close;
AddMainLogMsg('通讯已关闭...',2);
end;
procedure TFrmMain.MENU_CONTROL_STOPClick(Sender: TObject);
begin
if Application.MessageBox('你是否要退出游戏网关?',
'警告',
MB_YESNO + MB_ICONQUESTION ) = IDYES then
StopService();
end;
procedure TFrmMain.LoadConfig;
var
ini: TMemIniFile;
begin
AddMainLogMsg('加载设置文件...',3);
if Conf <> nil then begin
TitleName:=Conf.ReadString(GateClass,'Title',TitleName);
ServerAddr:=Conf.ReadString(GateClass,'ServerAddr',ServerAddr);
ServerPort:=Conf.ReadInteger(GateClass,'ServerPort',ServerPort);
GateAddr:=Conf.ReadString(GateClass,'GateAddr',GateAddr);
GatePort:=Conf.ReadInteger(GateClass,'GatePort',GatePort);
nShowLogLevel:=Conf.ReadInteger(GateClass,'ShowLogLevel',nShowLogLevel);
boShowBite:=Conf.ReadBool(GateClass,'ShowBite',boShowBite);
nMaxConnOfIPaddr:=Conf.ReadInteger(GateClass,'MaxConnOfIPaddr',nMaxConnOfIPaddr);
BlockMethod:=TBlockIPMethod(Conf.ReadInteger(GateClass,'BlockMethod',Integer(BlockMethod)));
nMaxClientPacketSize:=Conf.ReadInteger(GateClass,'MaxClientPacketSize',nMaxClientPacketSize);
nNomClientPacketSize:=Conf.ReadInteger(GateClass,'NomClientPacketSize',nNomClientPacketSize);
nMaxClientMsgCount:=Conf.ReadInteger(GateClass,'MaxClientMsgCount',nMaxClientMsgCount);
bokickOverPacketSize:=Conf.ReadBool(GateClass,'kickOverPacket',bokickOverPacketSize);
dwCheckServerTimeOutTime:=Conf.ReadInteger(GateClass,'ServerCheckTimeOut',dwCheckServerTimeOutTime);
nClientSendBlockSize:=Conf.ReadInteger(GateClass,'ClientSendBlockSize',nClientSendBlockSize);
dwClientTimeOutTime:=Conf.ReadInteger(GateClass,'ClientTimeOutTime',dwClientTimeOutTime);
dwSessionTimeOutTime:=Conf.ReadInteger(GateClass,'SessionTimeOutTime',dwSessionTimeOutTime);
nSayMsgMaxLen:=Conf.ReadInteger(GateClass,'SayMsgMaxLen',nSayMsgMaxLen);
dwSayMsgTime:=Conf.ReadInteger(GateClass,'SayMsgTime',dwSayMsgTime);
PosFile := Conf.ReadString('Setup','Positions','.\Positions.ini');
ini := TMemIniFile.Create(PosFile);
frmMain.Left := ini.ReadInteger('GameGate','Left',(Screen.Width Div 2)-(frmMain.Width Div 2));
frmMain.Top := ini.ReadInteger('GameGate','Top',(Screen.Height Div 2)-(frmMain.Height Div 2)-30);
ini.Free;
end;
AddMainLogMsg('设置文件已加载...',3);
LoadAbuseFile();
LoadBlockIPFile();
end;
procedure TFrmMain.ShowMainLogMsg;
var
i:Integer;
begin
if (GetTickCount - dwShowMainLogTick) < 200 then exit;
dwShowMainLogTick:=GetTickCount();
try
boShowLocked:=True;
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -