📄 usrsoc.pas
字号:
begin
//0802修正
if Pos('$', GateList[GateIndex].sText) <= 0 then
break;
ss := #13#10;
GateList[GateIndex].sText := ArrestStringEx(GateList[GateIndex].sText, '%', '$', s10);
if Pos(ss, GateList[GateIndex].sText) > 0 then
break;
if s10 <> '' then
begin
s19 := s10[1];
Delete(s10, 1, 1);
case Ord(s19) of
Ord('-'):
begin
SendKeepAlivePacket(GateList[GateIndex].Socket);
dwKeepAliveTick := GetTickCount();
end;
Ord('A'):
begin
s10 := GetValidStr3(s10, s0C, ['/']);
if s0C = '' then
break;
for i := 0 to UserCount do
begin
UserInfo := GateList[GateIndex].UserList[i];
begin
if UserInfo.sConnID = s0C then
begin
GateList[GateIndex].UserList[i].s2C := GateList[GateIndex].UserList[i].s2C + s10;
if Pos('!', s10) < 1 then
Continue;
ProcessUserMsg(GateList[GateIndex].UserList[i]);
break;
end;
end;
end;
end;
Ord('O'):
begin
s10 := GetValidStr3(s10, s0C, ['/']);
OpenUser(s0C, s10, GateIndex);
end;
Ord('X'):
begin
CloseUser(s10, GateIndex);
end;
end;
end; //004A3587
end;
end;
procedure TFrmUserSoc.SendKeepAlivePacket(Socket: TCustomWinSocket);
begin
if Socket.Connected then
Socket.SendText('%++$');
end;
procedure TFrmUserSoc.ProcessUserMsg(var UserInfo: TUserInfo);
var
s10 : string;
nC : Integer;
begin
nC := 0;
while (true) do
begin
if TagCount(UserInfo.s2C, '!') <= 0 then
break;
UserInfo.s2C := ArrestStringEx(UserInfo.s2C, '#', '!', s10);
if s10 <> '' then
begin
// s10 := Copy(s10, 2, Length(s10) - 1);
Delete(s10,1,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;
end;
end;
procedure TFrmUserSoc.OpenUser(sID, sIP: string; GateIndex:Integer);
var
i : Integer;
UserInfo : TUserInfo;
sUserIPaddr : string;
sGateIPaddr : string;
find:Boolean;
begin
if not (GateIndex in [0..9]) then exit;
if not GateList[GateIndex].IsUsed then exit;
sGateIPaddr := GetValidStr3(sIP, sUserIPaddr, ['/']);
find:=False;
for i := 0 to UserCount do
begin
UserInfo :=GateList[GateIndex].UserList[i];
if (UserInfo.sConnID = sID) then
begin
exit;
end;
if (UserInfo.sUserIPaddr='') and (not UserInfo.IsUsered) then
begin
GateList[GateIndex].UserList[i].sAccount := '';
GateList[GateIndex].UserList[i].sUserIPaddr := sUserIPaddr;
GateList[GateIndex].UserList[i].sGateIPaddr := sGateIPaddr;
// GateList[GateIndex].UserList[i].DBIndex:=0;
GateList[GateIndex].UserList[i].sConnID := sID;
GateList[GateIndex].UserList[i].nSessionID := 0;
GateList[GateIndex].UserList[i].Socket := GateList[GateIndex].Socket;
GateList[GateIndex].UserList[i].s2C := '';
GateList[GateIndex].UserList[i].dwTick34 := GetTickCount();
GateList[GateIndex].UserList[i].dwChrTick := GetTickCount();
GateList[GateIndex].UserList[i].boChrSelected := False;
GateList[GateIndex].UserList[i].boChrQueryed := False;
GateList[GateIndex].UserList[i].nSelGateID := GateList[GateIndex].nGateID;
GateList[GateIndex].UserList[i].IsUsered:=True;
Inc(GateList[GateIndex].Count);
Break;
End;
end;
end;
//004A30B8
procedure TFrmUserSoc.CloseUser(sID: string; GateIndex:Integer);
var
i : Integer;
UserInfo : TUserInfo;
begin
if not (GateIndex in [0..9]) then exit;
if not GateList[GateIndex].IsUsed then exit;
for i := 0 to UserCOunt do
begin
UserInfo := GateList[GateIndex].UserList[i];
if (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;
GateList[GateIndex].UserList[i].sUserIPaddr:='';
GateList[GateIndex].UserList[i].IsUsered:=False;
Dec(GateList[GateIndex].Count);
if GateList[GateIndex].Count<0 then GateList[GateIndex].Count:=0;
break;
end;
end;
end;
procedure TFrmUserSoc.DeCodeUserMsg(sData: string;
var UserInfo: TUserInfo); //004A48E0
var
sDefMsg, s18 : string;
Msg : TDefaultMessage;
begin
sDefMsg := Copy(sData, 1, DEFBLOCKSIZE);
s18 := Copy(sData, DEFBLOCKSIZE + 1, Length(sData) - DEFBLOCKSIZE);
if Length(sDefMsg)<>DEFBLOCKSIZE then exit;
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
Inc(g_nQueryChrCount);
OutMainMessage('[Hacker Attack] _QUERYCHR ' + 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
Inc(nHackerNewChrCount);
OutMainMessage('[Hacker Attack] _NEWCHR ' + 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
Inc(nHackerDelChrCount);
OutMainMessage('[Hacker Attack] _DELCHR ' + 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 //004A4D69
OutOfConnect(UserInfo);
end;
end
else
begin //004A4D79
// Inc(nHackerSelChrCount);
OutMainMessage('Double send _SELCHR ' + UserInfo.sAccount + '/' +
UserInfo.sUserIPaddr);
end;
end;
else
begin
Inc(n4ADC24);
end;
end;
end;
//004A3620
function TFrmUserSoc.QueryChr(sData: string; var UserInfo: TUserInfo): Boolean;
var
sAccount : string;
sSessionID : string;
nSessionID : Integer;
nChrCount : Integer;
ChrList : TStringList;
i : Integer;
nIndex : Integer;
ChrRecord : THumData;
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;
s40 := DataModule_DB.GetChrName(sAccount ,nChrCount);
SendUserSocket(UserInfo.Socket,
UserInfo.sConnID,
EncodeMessage(MakeDefaultMsg(SM_QUERYCHR, nChrCount, 0, 1, 0)) +
EncodeString(s40));
//*ChrName/sJob/sHair/sLevel/sSex/
end
else
begin
SendUserSocket(UserInfo.Socket,
UserInfo.sConnID,
EncodeMessage(MakeDefaultMsg(SM_QUERYCHR_FAIL, nChrCount, 0, 1, 0)));
CloseUser(UserInfo.sConnID, CurGate);
UserInfo.IsUsered:=False;
end;
end;
procedure TFrmUserSoc.OutOfConnect(const UserInfo: TUserInfo);
//004A4844
var
Msg : TDefaultMessage;
sMsg : string;
begin
Msg := MakeDefaultMsg(SM_OUTOFCONNECTION, 0, 0, 0, 0);
sMsg := EncodeMessage(Msg);
SendUserSocket(UserInfo.Socket, sMsg, UserInfo.sConnID);
end;
procedure TFrmUserSoc.DelChr(sData: string;
var UserInfo: TUserInfo);
//004A424C
var
sChrName : string;
boCheck : Boolean;
Msg : TDefaultMessage;
sMsg : string;
n10 : Integer;
HumRecord : THumInfo;
begin
g_CheckCode.dwThread0 := 1000300;
sChrName := DecodeString(sData);
boCheck := False;
g_CheckCode.dwThread0 := 1000301;
boCheck:=DataModule_DB.UpdateBy(sChrName,'',0,1);
g_CheckCode.dwThread0 := 1000302;
if boCheck then
Msg := MakeDefaultMsg(SM_DELCHR_SUCCESS, 0, 0, 0, 0)
else
Msg := MakeDefaultMsg(SM_DELCHR_FAIL, 0, 0, 0, 0);
sMsg := EncodeMessage(Msg);
SendUserSocket(UserInfo.Socket, UserInfo.sConnID, sMsg);
g_CheckCode.dwThread0 := 1000303;
end;
procedure TFrmUserSoc.newchr(sData: string; var UserInfo: TUserInfo); //004A3C08
var
Data, sAccount, sChrName, sHair, sJob, sSex: string;
nCode : Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -