usrsoc.pas
来自「FIR引擎最新源码+注册」· PAS 代码 · 共 974 行 · 第 1/3 页
PAS
974 行
function TFrmUserSoc.LoadChrNameList(sFileName: string): Boolean;
var
i: Integer;
begin
Result := False;
if FileExists(sFileName) then begin
DenyChrNameList.LoadFromFile(sFileName);
i := 0;
while (True) do begin
if DenyChrNameList.Count <= i then break;
if Trim(DenyChrNameList.Strings[i]) = '' then begin
DenyChrNameList.Delete(i);
Continue;
end;
Inc(i);
end;
Result := True;
end;
end;
function TFrmUserSoc.LoadClearMakeIndexList(sFileName: string): Boolean;
var
i: Integer;
nIndex: Integer;
sLineText: string;
begin
Result := False;
if FileExists(sFileName) then begin
g_ClearMakeIndex.LoadFromFile(sFileName);
i := 0;
while (True) do begin
if g_ClearMakeIndex.Count <= i then break;
sLineText := g_ClearMakeIndex.Strings[i];
nIndex := Str_ToInt(sLineText, -1);
if nIndex < 0 then begin
g_ClearMakeIndex.Delete(i);
Continue;
end;
g_ClearMakeIndex.Objects[i] := TObject(nIndex);
Inc(i);
end;
Result := True;
end;
end;
procedure TFrmUserSoc.ProcessGateMsg(var GateInfo: pTGateInfo);
var
s0C: string;
s10: string;
s19: Char;
i: Integer;
UserInfo: pTUserInfo;
nCount: Integer;
begin
nCount := 0;
while True do begin
if Pos('$', GateInfo.sText) <= 0 then break;
GateInfo.sText := ArrestStringEx(GateInfo.sText, '%', '$', s10);
//if Pos('$', GateInfo.sText) > 0 then showmessage(GateInfo.sText);
//%O308/127.0.0.1/127.0.0.1$
//%A308/#2<<<<<BL<<<<<<<<<H?<lH>xq!$
if s10 <> '' then begin
s19 := s10[1];
s10 := Copy(s10, 2, Length(s10) - 1);
//s19:=UpperCase(s19);
case s19 of
'-': begin
SendKeepAlivePacket(GateInfo.Socket);
dwKeepAliveTick := GetTickCount();
end;
'D': begin
s10 := GetValidStr3(s10, s0C, ['/']);
for i := 0 to GateInfo.UserList.Count - 1 do begin
UserInfo := GateInfo.UserList.Items[i];
if UserInfo <> nil then begin
if UserInfo.sConnID = s0C then begin
UserInfo.s2C := UserInfo.s2C + s10;
if Pos('!', s10) < 1 then Continue;
ProcessUserMsg(UserInfo);
break;
end;
end;
end;
end;
'N': begin
s10 := GetValidStr3(s10, s0C, ['/']);
OpenUser(s0C, s10, GateInfo);
end;
'C': begin
CloseUser(s10, GateInfo);
end;
else begin
if nCount >= 1 then begin //2006-10-12 防止DBS溢出攻击
GateInfo.sText := '';
break;
end;
Inc(nCount);
end;
end;
end else begin //2007-01-16 防止DBS溢出攻击
GateInfo.sText := '';
break;
end;
end;
end;
procedure TFrmUserSoc.SendKeepAlivePacket(Socket: TCustomWinSocket);
begin
if Socket.Connected then
Socket.SendText('%++$');
end;
procedure TFrmUserSoc.SendKickUser(Socket: TCustomWinSocket; SocketHandle: string; nKickType: Integer);
begin
if (Socket <> nil) and Socket.Connected then begin
case nKickType of
0: Socket.SendText('%+-' + SocketHandle + '$');
1: Socket.SendText('%+T' + SocketHandle + '$');
2: Socket.SendText('%+B' + SocketHandle + '$');
end;
end;
end;
procedure TFrmUserSoc.ProcessUserMsg(var UserInfo: pTUserInfo);
var
s10: string;
nC: Integer;
nLoopCount: Integer;
begin
nC := 0;
nLoopCount := 0;
while (True) do begin
if nLoopCount > 10 then break;
if TagCount(UserInfo.s2C, '!') <= 0 then break;
UserInfo.s2C := ArrestStringEx(UserInfo.s2C, '#', '!', s10);
if s10 <> '' then begin
s10 := Copy(s10, 2, Length(s10) - 1);
if Length(s10) >= DEFBLOCKSIZE then begin
DeCodeUserMsg(s10, UserInfo);
end else Inc(n4ADC20);
end else begin
Inc(n4ADC1C);
if nC >= 1 then begin
UserInfo.s2C := '';
end;
Inc(nC);
end;
Inc(nLoopCount);
end;
end;
procedure TFrmUserSoc.OpenUser(sID, sIP: string; var GateInfo: pTGateInfo);
var
i: Integer;
UserInfo: pTUserInfo;
sUserIPaddr: string;
sGateIPaddr: string;
begin
sGateIPaddr := GetValidStr3(sIP, sUserIPaddr, ['/']);
for i := 0 to GateInfo.UserList.Count - 1 do begin
UserInfo := GateInfo.UserList.Items[i];
if (UserInfo <> nil) and (UserInfo.sConnID = sID) then begin
Exit;
end;
end;
New(UserInfo);
UserInfo.sAccount := '';
UserInfo.sUserIPaddr := sUserIPaddr;
UserInfo.sGateIPaddr := sGateIPaddr;
UserInfo.sConnID := sID;
UserInfo.nSessionID := 0;
UserInfo.Socket := GateInfo.Socket;
UserInfo.s2C := '';
UserInfo.dwTick34 := GetTickCount();
UserInfo.dwChrTick := GetTickCount();
UserInfo.boChrSelected := False;
UserInfo.boChrQueryed := False;
UserInfo.nSelGateID := GateInfo.nGateID;
UserInfo.nDataCount := 0;
GateInfo.UserList.Add(UserInfo);
end;
procedure TFrmUserSoc.CloseUser(sID: string; var GateInfo: pTGateInfo);
var
i: Integer;
UserInfo: pTUserInfo;
begin
for i := GateInfo.UserList.Count - 1 downto 0 do begin
UserInfo := GateInfo.UserList.Items[i];
if (UserInfo <> nil) and (UserInfo.sConnID = sID) then begin
if not FrmIDSoc.GetGlobaSessionStatus(UserInfo.nSessionID) then begin
FrmIDSoc.SendSocketMsg(SS_SOFTOUTSESSION, UserInfo.sAccount + '/' + IntToStr(UserInfo.nSessionID));
FrmIDSoc.CloseSession(UserInfo.sAccount, UserInfo.nSessionID);
end;
GateInfo.UserList.Delete(i);
Dispose(UserInfo);
break;
end;
end;
end;
procedure TFrmUserSoc.DeCodeUserMsg(sData: string;
var UserInfo: pTUserInfo);
var
sDefMsg, s18: string;
Msg: TDefaultMessage;
begin
sDefMsg := Copy(sData, 1, DEFBLOCKSIZE);
s18 := Copy(sData, DEFBLOCKSIZE + 1, Length(sData) - DEFBLOCKSIZE);
Msg := DecodeMessage(sDefMsg);
case Msg.Ident of
CM_QUERYCHR: begin
if not UserInfo.boChrQueryed or ((GetTickCount - UserInfo.dwChrTick) > 200) then begin
UserInfo.dwChrTick := GetTickCount();
if QueryChr(s18, UserInfo) then begin
UserInfo.boChrQueryed := True;
end;
end else begin
if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 0);
Inc(g_nQueryChrCount);
MainOutMessage('[超速操作] 查询人物 ' + UserInfo.sUserIPaddr);
end;
end;
CM_NEWCHR: begin
if (GetTickCount - UserInfo.dwChrTick) > 1000 then begin
UserInfo.dwChrTick := GetTickCount();
if (UserInfo.sAccount <> '')
and FrmIDSoc.CheckSession(UserInfo.sAccount, UserInfo.sUserIPaddr, UserInfo.nSessionID) then begin
NewChr(s18, UserInfo);
UserInfo.boChrQueryed := False;
end else begin
OutOfConnect(UserInfo);
end;
end else begin
if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 1);
Inc(nHackerNewChrCount);
MainOutMessage('[超速操作] 创建人物 ' + UserInfo.sAccount + '/' + UserInfo.sUserIPaddr);
end;
end;
CM_DELCHR: begin
if (GetTickCount - UserInfo.dwChrTick) > 1000 then begin
UserInfo.dwChrTick := GetTickCount();
if (UserInfo.sAccount <> '')
and FrmIDSoc.CheckSession(UserInfo.sAccount, UserInfo.sUserIPaddr, UserInfo.nSessionID) then begin
DelChr(s18, UserInfo);
UserInfo.boChrQueryed := False;
end else begin
OutOfConnect(UserInfo);
end;
end else begin
if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 0);
Inc(nHackerDelChrCount);
MainOutMessage('[超速操作] 删除人物' + UserInfo.sAccount + '/' + UserInfo.sUserIPaddr);
end;
end;
CM_SELCHR: begin
if not UserInfo.boChrQueryed then begin
if (UserInfo.sAccount <> '')
and FrmIDSoc.CheckSession(UserInfo.sAccount, UserInfo.sUserIPaddr, UserInfo.nSessionID) then begin
if SelectChr(s18, UserInfo) then begin
UserInfo.boChrSelected := True;
end;
end else begin
OutOfConnect(UserInfo);
end;
end else begin
if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 1);
Inc(nHackerSelChrCount);
MainOutMessage('[端口攻击]' + UserInfo.sAccount + '/' + UserInfo.sUserIPaddr);
end;
end;
else begin
Inc(n4ADC24);
end;
end;
end;
function TFrmUserSoc.QueryChr(sData: string; var UserInfo: pTUserInfo): Boolean;
var
sAccount: string;
sSessionID: string;
nSessionID: Integer;
nChrCount: Integer;
ChrList: TStringList;
i: Integer;
nIndex: Integer;
ChrRecord: THumDataInfo;
HumRecord: THumInfo;
QuickID: pTQuickID;
btSex: Byte;
sChrName: string;
sJob: string;
sHair: string;
sLevel: string;
s40: string;
begin
Result := False;
sSessionID := GetValidStr3(DecodeString(sData), sAccount, ['/']);
nSessionID := Str_ToInt(sSessionID, -2);
UserInfo.nSessionID := nSessionID;
nChrCount := 0;
if FrmIDSoc.CheckSession(sAccount, UserInfo.sUserIPaddr, nSessionID) then begin
FrmIDSoc.SetGlobaSessionNoPlay(nSessionID);
UserInfo.sAccount := sAccount;
ChrList := TStringList.Create;
try
if HumChrDB.Open and (HumChrDB.FindByAccount(sAccount, ChrList) >= 0) then begin
try
if HumDataDB.OpenEx then begin
for i := 0 to ChrList.Count - 1 do begin
QuickID := pTQuickID(ChrList.Objects[i]);
//FrmDBSrv.MemoLog.Lines.Add('UserInfo.nSelGateID: '+IntToStr(UserInfo.nSelGateID)+' QuickID.nIndex: '+IntToStr(QuickID.nIndex));
//如果选择ID不对,则跳过
//if QuickID.nIndex <> UserInfo.nSelGateID then Continue;
if HumChrDB.GetBy(QuickID.nIndex, HumRecord) and not HumRecord.boDeleted then begin
sChrName := QuickID.sChrName;
nIndex := HumDataDB.Index(sChrName);
if (nIndex < 0) or (nChrCount >= 2) then Continue;
if HumDataDB.Get(nIndex, ChrRecord) >= 0 then begin
btSex := ChrRecord.Data.btSex;
sJob := IntToStr(ChrRecord.Data.btJob);
sHair := IntToStr(ChrRecord.Data.btHair);
sLevel := IntToStr(ChrRecord.Data.Abil.Level);
if HumRecord.boSelected then s40 := s40 + '*';
s40 := s40 + sChrName + '/' + sJob + '/' + sHair + '/' + sLevel + '/' + IntToStr(btSex) + '/';
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?