📄 lmain.pas
字号:
if TagCount(GateInfo.sReceiveMsg, '$') <= 0 then
break;
GateInfo.sReceiveMsg := ArrestStringEx(GateInfo.sReceiveMsg, '%', '$',
sMsg);
if sMsg <> '' then
begin
;
Code := sMsg[1];
sMsg := Copy(sMsg, 2, length(sMsg) - 1);
case Code of
'-':
begin
SendKeepAlivePacket(GateInfo.Socket);
GateInfo.dwKeepAliveTick := GetTickCount();
end;
'A':
begin
sData := GetValidStr3(sMsg, sSockIndex, ['/']);
ReceiveSendUser(Config, sSockIndex, GateInfo, sData);
end;
'O': //有新玩家
begin
sData := GetValidStr3(sMsg, sSockIndex, ['/']);
ReceiveOpenUser(Config, sSockIndex, sData, GateInfo);
end;
'X':
begin
sSockIndex := sMsg;
ReceiveCloseUser(Config, sSockIndex, GateInfo);
end;
end;
end
else
begin //0046AD85
if nCount >= 1 then
GateInfo.sReceiveMsg := '';
Inc(nCount);
end;
end;
except
MainOutMessage('[Exception] TFrmMain.DecodeGateData');
end;
end;
//0046A63C
procedure SendKeepAlivePacket(Socket: TCustomWinSocket);
begin
if Socket.Connected then
Socket.SendText('%++$');
end;
//0046B058
procedure ReceiveCloseUser(Config: pTConfig; sSockIndex: string;
GateInfo: pTGateInfo);
var
UserInfo : pTUserInfo;
I : Integer;
resourcestring
sCloseMsg = 'Close: %s';
begin
for I := 0 to GateInfo.UserList.Count - 1 do
begin
UserInfo := GateInfo.UserList.Items[I];
if UserInfo.sSockIndex = sSockIndex then
begin
if Config.boShowDetailMsg then
MainOutMessage(format(sCloseMsg, [UserInfo.sUserIPaddr]));
if not UserInfo.boSelServer then
SessionDel(Config, UserInfo.nSessionID);
Dispose(UserInfo);
GateInfo.UserList.Delete(I);
break;
end;
end;
end;
//0046AE3C
procedure ReceiveOpenUser(Config: pTConfig; sSockIndex, sIPaddr: string;
GateInfo: pTGateInfo);
var
UserInfo : pTUserInfo;
I : Integer;
sGateIPaddr : string;
sUserIPaddr : string;
resourcestring
sOpenMsg = 'Open: %s/%s';
begin
sGateIPaddr := GetValidStr3(sIPaddr, sUserIPaddr, ['/']);
try
for I := 0 to GateInfo.UserList.Count - 1 do
begin
UserInfo := GateInfo.UserList.Items[I];
if UserInfo.sSockIndex = sSockIndex then
begin
UserInfo.sUserIPaddr := sUserIPaddr;
UserInfo.sGateIPaddr := sGateIPaddr;
UserInfo.sAccount := '';
UserInfo.nSessionID := 0;
UserInfo.sReceiveMsg := '';
UserInfo.dwTime5C := GetTickCount();
UserInfo.dwClientTick := GetTickCount();
exit;
end;
end;
New(UserInfo);
UserInfo.sAccount := '';
UserInfo.sUserIPaddr := sUserIPaddr;
UserInfo.sGateIPaddr := sGateIPaddr;
UserInfo.sSockIndex := sSockIndex;
UserInfo.nVersionDate := 0;
UserInfo.boCertificationOK := False;
UserInfo.nSessionID := 0;
UserInfo.bo51 := False;
UserInfo.Socket := GateInfo.Socket;
UserInfo.sReceiveMsg := '';
UserInfo.dwTime5C := GetTickCount();
UserInfo.dwClientTick := GetTickCount();
UserInfo.bo60 := False;
UserInfo.Gate := GateInfo;
UserInfo.CreateCount:=0;
GateInfo.UserList.Add(UserInfo);
if Config.boShowDetailMsg then
MainOutMessage(format(sOpenMsg, [sUserIPaddr, sGateIPaddr]));
except
MainOutMessage('TFrmMain.ReceiveOpenUser');
end;
end;
//0046B1A8
procedure ReceiveSendUser(Config: pTConfig; sSockIndex: string;
GateInfo: pTGateInfo; sData: string);
var
UserInfo : pTUserInfo;
I : Integer;
begin
try
for I := 0 to GateInfo.UserList.Count - 1 do
begin
UserInfo := GateInfo.UserList.Items[I];
if UserInfo.sSockIndex = sSockIndex then
begin
if length(UserInfo.sReceiveMsg) < 4069 then
begin
UserInfo.sReceiveMsg := UserInfo.sReceiveMsg + sData;
end;
break;
end;
end;
except
MainOutMessage('TFrmMain.ReceiveSendUser');
end;
end;
//00469D38
procedure SessionClearKick(Config: pTConfig);
var
I : Integer;
ConnInfo : pTConnInfo;
begin
Config.SessionList.Lock;
try
for I := Config.SessionList.Count - 1 downto 0 do
begin
ConnInfo := Config.SessionList.Items[I];
if ConnInfo.boKicked and ((GetTickCount - ConnInfo.dwKickTick) > 5 * 1000)
then
begin
Dispose(ConnInfo);
Config.SessionList.Delete(I);
end;
end;
finally
Config.SessionList.UnLock;
end;
end;
//0046B284
procedure DecodeUserData(Config: pTConfig; UserInfo: pTUserInfo);
var
sMsg : string;
nCount : Integer;
begin
nCount := 0;
try
//if UserInfo = nil then nErrCode:=1;
while (true) do
begin
if TagCount(UserInfo.sReceiveMsg, '!') <= 0 then
break;
UserInfo.sReceiveMsg := ArrestStringEx(UserInfo.sReceiveMsg, '#', '!',
sMsg);
if sMsg <> '' then
begin
;
if length(sMsg) >= DEFBLOCKSIZE + 1 then
begin
sMsg := Copy(sMsg, 2, length(sMsg) - 1);
ProcessUserMsg(Config, UserInfo, sMsg);
end;
end
else
begin
if nCount >= 1 then
UserInfo.sReceiveMsg := '';
Inc(nCount);
end;
if UserInfo.sReceiveMsg = '' then
break;
end;
except
MainOutMessage('[Exception] TFrmMain.DecodeUserData ');
end;
end;
//0046A088
procedure SessionDel(Config: pTConfig; nSessionID: Integer);
var
ConnInfo : pTConnInfo;
I : Integer;
begin
Config.SessionList.Lock;
try
for I := 0 to Config.SessionList.Count - 1 do
begin
ConnInfo := Config.SessionList.Items[I];
if ConnInfo.nSessionID = nSessionID then
begin
Dispose(ConnInfo);
Config.SessionList.Delete(I);
break;
end;
end;
finally
Config.SessionList.UnLock;
end;
end;
//0046CC3C
procedure ProcessUserMsg(Config: pTConfig; UserInfo: pTUserInfo; sMsg: string);
var
sDefMsg : string;
sData : string;
DefMsg : TDefaultMessage;
begin
try
sDefMsg := Copy(sMsg, 1, DEFBLOCKSIZE);
sData := Copy(sMsg, DEFBLOCKSIZE + 1, length(sMsg) - DEFBLOCKSIZE);
DefMsg := DecodeMessage(sDefMsg);
//AddLogMsg('Code: ' + IntToStr(DefMsg.Ident) + ' Msg: ' + sData,0);
case DefMsg.Ident of
CM_SELECTSERVER:
begin
if not UserInfo.boSelServer then
begin
AccountSelectServer(Config, UserInfo, sData);
end;
end;
CM_PROTOCOL:
begin
AccountCheckProtocol(UserInfo, DefMsg.Recog);
end;
CM_IDPASSWORD:
begin
if UserInfo.sAccount = '' then
begin
AccountLogin(Config, UserInfo, sData);
end
else
begin
KickUser(Config, UserInfo);
end;
end;
CM_ADDNEWUSER:
begin
if Config.boEnableMakingID then
begin
// 2006-2-4 15:53:52 防止同时注册多个id的攻击
if ((GetTickCount - UserInfo.dwClientTick) > 5000)and(UserInfo.CreateCount<4) then
begin
UserInfo.dwClientTick := GetTickCount();
AccountCreate(Config, UserInfo, sData);
end
else
begin
MainOutMessage('[超速操作] 创建帐号 ' + '/' +
UserInfo.sUserIPaddr);
end;
end;
end;
CM_CHANGEPASSWORD:
begin
if UserInfo.sAccount = '' then
begin
if (GetTickCount - UserInfo.dwClientTick) > 5000 then
begin
UserInfo.dwClientTick := GetTickCount();
AccountChangePassword(Config, UserInfo, sData);
end
else
begin
MainOutMessage('[超速操作] 修改密码 ' + '/' +
UserInfo.sUserIPaddr);
end;
end
else
UserInfo.sAccount := '';
end;
CM_UPDATEUSER:
begin
if (GetTickCount - UserInfo.dwClientTick) > 5000 then
begin
UserInfo.dwClientTick := GetTickCount();
AccountUpdateUserInfo(Config, UserInfo, sData);
end
else
begin
MainOutMessage('[超速操作] 更新帐号 ' + '/' + UserInfo.sUserIPaddr);
end;
end;
{ CM_GETBACKPASSWORD:
begin
if (GetTickCount - UserInfo.dwClientTick) > 5000 then begin
UserInfo.dwClientTick:=GetTickCount();
AccountGetBackPassword(UserInfo,sData);
end else begin
MainOutMessage('[超速操作] 找回密码 ' + '/' + UserInfo.sUserIPaddr);
end;
end;
}
end;
except
MainOutMessage('[Exception] TFrmMain.ProcessUserMsg ' + 'wIdent: ' +
IntToStr(DefMsg.Ident) + ' sData: ' + sData);
end;
end;
procedure AccountCreate(Config: pTConfig; UserInfo: pTUserInfo; sData: string); //0046C244
var
UserEntry : TUserEntry;
UserAddEntry : TUserEntryAdd;
DBRecord : TAccountDBRecord;
nLen : Integer;
sUserEntryMsg : string;
sUserAddEntryMsg : string;
nErrCode : Integer;
DefMsg,msg : TDefaultMessage;
bo21 : Boolean;
n10 : Integer;
smsg : string;
ncode : integer;
resourcestring
sAddNewuserFail = '[新建帐号失败] %s/%s';
sLogFlag = 'new';
begin
try
nErrCode := -1;
FillChar(UserEntry, SizeOf(TUserEntry), #0);
FillChar(UserAddEntry, SizeOf(TUserEntryAdd), #0);
nLen := GetCodeMsgSize(SizeOf(TUserEntry) * 4 / 3);
bo21 := False;
sUserEntryMsg := Copy(sData, 1, nLen);
sUserAddEntryMsg := Copy(sData, nLen + 1, length(sData) - nLen);
if (sUserEntryMsg <> '') and (sUserAddEntryMsg <> '') then
begin
DecodeBuffer(sUserEntryMsg, @UserEntry, SizeOf(TUserEntry));
DecodeBuffer(sUserAddEntryMsg, @UserAddEntry, SizeOf(TUserEntryAdd));
if CheckAccountName(UserEntry.sAccount) then
bo21 := true;
if bo21 then
begin
nErrCode:=0;
if (FrmMain.ClientSocket1.Active) then
Begin
Msg:=MakeDefaultMsg(102,0,0,0,0);
sMsg:=EncodeMessage(Msg)+EncodeString(UserEntry.sAccount);
FrmMain.SendDBSockMsg(sMsg);
if FrmMain.GetDBSockMsg(Msg,5000) then
begin
if Msg.Ident=1002 then
nErrCode:=1
else
nErrCode:=0;
End;
end;
if nErrCode=1 then
Begin
try
FillChar(DBRecord, SizeOf(TAccountDBRecord), #0);
DBRecord.UserEntry := UserEntry;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -