📄 main.~pas
字号:
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 //SizeOf(TMsgHeader)=$14
while (True) do begin
pMsg:=pTMsgHeader(Buff);
if pMsg.dwCode = RUNGATECODE then begin //$AA55AA55
if (abs(pMsg.nLength) + SizeOf(TMsgHeader)) > nLen then break;// -> 0045525C
MsgBuff:=Ptr(LongInt(Buff) + SizeOf(TMsgHeader));
case pMsg.wIdent of
GM_CHECKSERVER: begin //$3
boCheckServerFail:=False;
dwCheckServerTick:=GetTickCount();
end;
GM_SERVERUSERINDEX: begin //$6
if (pMsg.wGateIndex < GATEMAXSESSION) and (pMsg.nSocket = SessionArray[pMsg.wGateIndex].nSckHandle) then begin
SessionArray[pMsg.wGateIndex].nUserListIndex:=pMsg.nUserListIndex;
end;//00455218
end;
GM_RECEIVE_OK: begin //$7
dwCheckServerTimeMin:=GetTickCount - dwCheckServerTick;//dwCheckRecviceTick;
// MemoLog.Lines.Add(inttostr(dwCheckServerTimeMin));
if dwCheckServerTimeMin > dwCheckServerTimeMax then dwCheckServerTimeMax:=dwCheckServerTimeMin;
dwCheckRecviceTick:=GetTickCount();
SendServerMsg(GM_RECEIVE_OK,0,0,0,0,nil);
end;
GM_DATA: begin //$5
ProcessMakeSocketStr(pMsg.nSocket,pMsg.wGateIndex,MsgBuff,pMsg.nLength);
end;
GM_TEST: begin
// memolog.Lines.Add('gm_test');
boCheckProServer:=true;
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);
// UserData.sMsg:=strpas(mir2cs(pchar(sSendMsg),length(sSendMsg), UserData.loginok,tpos1[nSocketIndex].tx,tpos1[nSocketIndex].ty,tfpos[nSocketIndex].tx,tfpos[nSocketIndex].ty,tpos1[nSocketIndex].mysex)); //sSendMsg
{ SendMsgList.Add(UserData);
if UserData.loginok='%loginok$' then
begin
UserData.loginok:='';
New(UserData);
UserData.nSocketIdx:=nSocketIndex;
UserData.nSocketHandle:=nSocket;
UserData.sMsg:='#1<<<<<A@<<<<<<<<<!'; //sReviceMsg; 发送查询包裹的消息 //这里可以修改封包
ReviceMsgList.Add(UserData);
{ 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; }
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,CM_3026HIT: begin
if (GetTickCount - SessionInfo.dwHitTick) > dwHitTime then SessionInfo.dwHitTick:=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;
procedure TFrmMain.N2Click(Sender: TObject);
begin
// about.show;
// MemoLog.Lines.Add(inttostr(sizeof(TcsMAGIC))) ;
// MemoLog.Lines.Add(inttostr(sizeof(TClientMagic))) ;
// MemoLog.Lines.Add(mydecodestring('+JVD<.HE-,,TRi@UhPZhRi@f_a@gaRXiMP6TNRde]aBgbR4YNN9UML6UKN9')+'3');
// MemoLog.Lines.Add(mydecodestring('.>V<HJYCHD,WRL6UNM?VML?UNK6'));
// MemoLog.Lines.Add(mydecodestring('.>V<HJYCHD,WRL6UNL?VNK?U')+'15');
// MemoLog.Lines.Add(mydecodestring('+JVD<DhFC;,ZRJ06J,78?.'));
Memolog.Lines.Add(mydecodestring('+JVD<.HE-,,TRi@UhPZhRi@f_a@gaRXiMP4')+'20');
Memolog.Lines.Add(mydecodestring('.>V<HJYCHD,WRL6UNL?VNL?V')+'30');
Memolog.Lines.Add(mydecodestring('-E7+-I.@E,,XRj:c^^,YOO7`[[@ZihZfch@V__Ad'));
Memolog.Lines.Add(mydecodestring('+JVD<DhFC;,ZRJ06J,78?.'));
end;
procedure TFrmMain.MyMessage(var MsgData: TWmCopyData);
var
sData:String;
wIdent:Word;
begin
wIdent:=HiWord(MsgData.From);
sData:=StrPas(MsgData.CopyDataStruct^.lpData);
case wIdent of
0: begin // GS_QUIT
if boServiceStart then begin
StartTimer.Enabled:=True;
end else begin
boClose:=True;
Close();
end;
end;
1: ;
2: ;
3: ;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -