📄 usrsoc.pas
字号:
UserInfo.Socket := GateInfo.Socket;
UserInfo.s2C := '';
UserInfo.dwTick34 := GetTickCount();
UserInfo.dwChrTick := GetTickCount();
UserInfo.boChrSelected := False;
UserInfo.boChrQueryed := False;
UserInfo.nSelGateID := GateInfo.nGateID;
GateInfo.UserList.Add(UserInfo);
end;
procedure TFrmUserSoc.CloseUser(sID: string; var GateInfo: pTGateInfo);
var
i: Integer;
UserInfo: pTUserInfo;
begin
for i := 0 to GateInfo.UserList.Count - 1 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;
Dispose(UserInfo);
GateInfo.UserList.Delete(i);
break;
end;
end;
end;
procedure TFrmUserSoc.DeCodeUserMsg(sData: string;
var UserInfo: pTUserInfo); //004A48E0
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, 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, 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, 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, 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) + '/';
Inc(nChrCount);
end;
end;
end;
end;
finally
HumDataDB.Close;
end;
end;
finally
HumChrDB.Close;
end;
ChrList.Free;
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);
end;
end;
procedure TFrmUserSoc.OutOfConnect(const UserInfo: pTUserInfo);
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: pTUserInfo);
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;
try
if HumChrDB.Open then begin
n10 := HumChrDB.Index(sChrName);
if n10 >= 0 then begin
HumChrDB.Get(n10, HumRecord);
if HumRecord.sAccount = UserInfo.sAccount then begin
HumRecord.boDeleted := True;
HumRecord.dModDate := Now();
HumChrDB.Update(n10, HumRecord);
boCheck := True;
end;
end;
end;
finally
HumChrDB.Close;
end;
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: pTUserInfo); //004A3C08
var
Data, sAccount, sChrName, sHair, sJob, sSex: string;
nCode: Integer;
Msg: TDefaultMessage;
sMsg: string;
HumRecord: THumInfo;
i: Integer;
begin
nCode := -1;
Data := DecodeString(sData);
Data := GetValidStr3(Data, sAccount, ['/']);
Data := GetValidStr3(Data, sChrName, ['/']);
Data := GetValidStr3(Data, sHair, ['/']);
Data := GetValidStr3(Data, sJob, ['/']);
Data := GetValidStr3(Data, sSex, ['/']);
if Trim(Data) <> '' then nCode := 0;
sChrName := Trim(sChrName);
if Length(sChrName) < 3 then nCode := 0;
if not CheckDenyChrName(sChrName) then nCode := 2;
if not boDenyChrName then begin
if not CheckChrName(sChrName) then nCode := 0;
for i := 1 to Length(sChrName) do begin
if (sChrName[i] = #$A1) or
(sChrName[i] = ' ') or
(sChrName[i] = '/') or
(sChrName[i] = '@') or
(sChrName[i] = '?') or
(sChrName[i] = '''') or
(sChrName[i] = '"') or
(sChrName[i] = '\') or
(sChrName[i] = '.') or
(sChrName[i] = ',') or
(sChrName[i] = ':') or
(sChrName[i] = ';') or
(sChrName[i] = '`') or
(sChrName[i] = '~') or
(sChrName[i] = '!') or
(sChrName[i] = '#') or
(sChrName[i] = '$') or
(sChrName[i] = '%') or
(sChrName[i] = '^') or
(sChrName[i] = '&') or
(sChrName[i] = '*') or
(sChrName[i] = '(') or
(sChrName[i] = ')') or
(sChrName[i] = '-') or
(sChrName[i] = '_') or
(sChrName[i] = '+') or
(sChrName[i] = '=') or
(sChrName[i] = '|') or
(sChrName[i] = '[') or
(sChrName[i] = '{') or
(sChrName[i] = ']') or
(sChrName[i] = '}') then nCode := 0;
end;
end;
if nCode = -1 then begin
try
HumDataDB.Lock;
if HumDataDB.Index(sChrName) >= 0 then nCode := 2;
finally
HumDataDB.UnLock;
end;
end;
if nCode = -1 then begin
try
if HumChrDB.Open then begin
// if HumChrDB.ChrCountOfAccount(sAccount) < 2 then begin
FillChar(HumRecord, SizeOf(THumInfo), #0);
HumRecord.sChrName := sChrName;
HumRecord.sAccount := sAccount;
HumRecord.boDeleted := False;
HumRecord.btCount := 0;
HumRecord.Header.sName := sChrName;
HumRecord.Header.nSelectID := UserInfo.nSelGateID;
if HumRecord.Header.sName <> '' then
if not HumChrDB.Add(HumRecord) then nCode := 2;
// end else nCode:= 3;
end;
finally
HumChrDB.Close;
end;
if nCode = -1 then begin
if NewChrData(sChrName, Str_ToInt(sSex, 0), Str_ToInt(sJob, 0), Str_ToInt(sHair, 0)) then
nCode := 1;
end else begin
FrmDBSrv.DelHum(sChrName);
nCode := 4;
end;
end;
if nCode = 1 then begin
Msg := MakeDefaultMsg(SM_NEWCHR_SUCCESS, 0, 0, 0, 0);
end else begin
Msg := MakeDefaultMsg(SM_NEWCHR_FAIL, nCode, 0, 0, 0);
end;
sMsg := EncodeMessage(Msg);
SendUserSocket(UserInfo.Socket, UserInfo.sConnID, sMsg);
end;
//004A440C
function TFrmUserSoc.SelectChr(sData: string;
var UserInfo: pTUserInfo): Boolean;
var
sAccount: string;
sChrName: string;
ChrList: TStringList;
HumRecord: THumInfo;
i: Integer;
nIndex: Integer;
nMapIndex: Integer;
QuickID: pTQuickID;
ChrRecord: THumDataInfo;
sCurMap: string;
boDataOK: Boolean;
sDefMsg: string;
sRouteMsg: string;
sRouteIP: string;
nRoutePort: Integer;
begin
Result := False;
sChrName := GetValidStr3(DecodeString(sData), sAccount, ['/']);
boDataOK := False;
if UserInfo.sAccount = sAccount then begin
try
if HumChrDB.Open then begin
ChrList := TStringList.Create;
if HumChrDB.FindByAccount(sAccount, ChrList) >= 0 then begin
for i := 0 to ChrList.Count - 1 do begin
QuickID := pTQuickID(ChrList.Objects[i]);
nIndex := QuickID.nIndex;
if HumChrDB.GetBy(nIndex, HumRecord) then begin
if HumRecord.sChrName = sChrName then begin
HumRecord.boSelected := True;
HumChrDB.UpdateBy(nIndex, HumRecord);
end else begin
if HumRecord.boSelected then begin
HumRecord.boSelected := False;
HumChrDB.UpdateBy(nIndex, HumRecord);
end;
end;
end;
end;
end;
ChrList.Free;
end;
finally
HumChrDB.Close;
end;
try
if HumDataDB.OpenEx then begin
nIndex := HumDataDB.Index(sChrName);
if nIndex >= 0 then begin
HumDataDB.Get(nIndex, ChrRecord);
sCurMap := ChrRecord.Data.sCurMap;
boDataOK := True;
end;
end;
finally
HumDataDB.Close;
end;
end;
if boDataOK then begin
nMapIndex := GetMapIndex(sCurMap);
sDefMsg := EncodeMessage(MakeDefaultMsg(SM_STARTPLAY, 0, 0, 0, 0));
sRouteIP := GateRouteIP(CurGate.sGateaddr, nRoutePort);
if g_boDynamicIPMode then sRouteIP := UserInfo.sGateIPaddr; //使用动态IP
//MainOutMessage('sRouteIP+nMapIndex+UserInfo.nSessionID:'+sRouteIP+IntToStr(nMapIndex)+IntToStr(UserInfo.nSessionID));
sRouteMsg := EncodeString(sRouteIP + '/' + IntToStr(nRoutePort + nMapIndex));
SendUserSocket(UserInfo.Socket,
UserInfo.sConnID,
sDefMsg + sRouteMsg);
FrmIDSoc.SetGlobaSessionPlay(UserInfo.nSessionID);
Result := True;
end else begin
SendUserSocket(UserInfo.Socket,
UserInfo.sConnID,
EncodeMessage(MakeDefaultMsg(SM_STARTFAIL, 0, 0, 0, 0)));
end;
end;
function TFrmUserSoc.GateRoutePort(sGateIP: string): Integer; //004A2724
begin
Result := 7200;
end;
function TFrmUserSoc.GateRouteIP(sGateIP: string; var nPort: Integer): string; //0x004A258C
function GetRoute(RouteInfo: pTRouteInfo; var nGatePort: Integer): string;
var
nGateIndex: Integer;
begin
nGateIndex := Random(RouteInfo.nGateCount);
Result := RouteInfo.sGameGateIP[nGateIndex];
nGatePort := RouteInfo.nGameGatePort[nGateIndex];
end;
var
i: Integer;
RouteInfo: pTRouteInfo;
begin
nPort := 0;
Result := '';
for i := Low(g_RouteInfo) to High(g_RouteInfo) do begin
RouteInfo := @g_RouteInfo[i];
if RouteInfo.sSelGateIP = sGateIP then begin
Result := GetRoute(RouteInfo, nPort);
break;
end;
end;
end;
function TFrmUserSoc.GetMapIndex(sMap: string): Integer; //0x004A24D4
var
i: Integer;
begin
Result := 0;
for i := 0 to MapList.Count - 1 do begin
if MapList.Strings[i] = sMap then begin
Result := Integer(MapList.Objects[i]);
break;
end;
end;
end;
procedure TFrmUserSoc.SendUserSocket(Socket: TCustomWinSocket; sSessionID,
sSendMsg: string);
//004A2E18
begin
Socket.SendText('%' + sSessionID + '/#' + sSendMsg + '!$');
end;
//0045C2C0
function TFrmUserSoc.CheckDenyChrName(sChrName: string): Boolean;
var
i: Integer;
begin
Result := True;
g_CheckCode.dwThread0 := 1000700;
for i := 0 to DenyChrNameList.Count - 1 do begin
g_CheckCode.dwThread0 := 1000701;
if CompareText(sChrName, DenyChrNameList.Strings[i]) = 0 then begin
g_CheckCode.dwThread0 := 1000702;
Result := False;
break;
end;
end;
g_CheckCode.dwThread0 := 1000703;
end;
end.
d.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -