📄 runsock.~pas
字号:
end;
end;
end;
for i := Low(g_GateArr) to High(g_GateArr) do begin
if g_GateArr[i].Socket <> nil then begin
Gate := @g_GateArr[i];
if (GetTickCount - Gate.dwSendTick) >= 1000 then begin
Gate.dwSendTick := GetTickCount();
Gate.nSendMsgBytes := Gate.nSendBytesCount;
Gate.nSendedMsgCount := Gate.nSendCount;
Gate.nSendBytesCount := 0;
Gate.nSendCount := 0;
end;
if Gate.boSendKeepAlive then begin
Gate.boSendKeepAlive := False;
SendCheck(Gate.Socket, GM_CHECKSERVER);
end;
end;
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg);
MainOutMessage(E.Message);
end;
end;
end;
g_nSockCountMin := GetTickCount - dwRunTick;
if g_nSockCountMin > g_nSockCountMax then g_nSockCountMax := g_nSockCountMin;
end;
procedure TRunSocket.DoClientCertification(GateIdx: Integer; GateUser: pTGateUserInfo; nSocket: Integer; sMsg: string); //004E1028
function ScanCertification(sAccount: string; sChrName: string; nSessionID, nClientVersion: Integer): Boolean;
var
DefMsg: TDefaultMessage;
resourcestring
sInfoMsg = '%s/%s/%s/%d/%d/%d/%d-%d';
begin
Result := False;
//**00/88/200000/200000/0
if (sAccount = '00') and (sChrName = '88') and (nSessionID = 200000) and (nClientVersion = 200000) then begin
sMsg := format(sInfoMsg, [g_Config.sServerName,
g_Config.sRegKey,
g_Config.sRegServerAddr,
g_Config.nRegServerPort,
UserEngine.OnlinePlayObject,
g_dwStartTick,
GetTickCount,
VEROWNER]);
//sMsg := Base64EncodeStr(sMsg, IntToStr(nSessionID xor (nClientVersion div 3)));
SendScanMsg(nil, EncodeString(sMsg), GateIdx, nSocket, GateUser.nGSocketIdx);
Result := True;
end;
end;
function GetCertification(sMsg: string; var sAccount: string; var sChrName: string; var nSessionID: Integer; var nClientVersion: Integer; var boFlag: Boolean): Boolean; //004E0DE0
var
sData: string;
sCodeStr, sClientVersion: string;
sIdx: string;
resourcestring
sExceptionMsg = '[Exception] TRunSocket::DoClientCertification -> GetCertification';
begin
Result := False;
try
sData := DeCodeString(sMsg);
if (Length(sData) > 2) and (sData[1] = '*') and (sData[2] = '*') then begin
sData := Copy(sData, 3, Length(sData) - 2);
sData := GetValidStr3(sData, sAccount, ['/']);
sData := GetValidStr3(sData, sChrName, ['/']);
sData := GetValidStr3(sData, sCodeStr, ['/']);
sData := GetValidStr3(sData, sClientVersion, ['/']);
sIdx := sData;
nSessionID := Str_ToInt(sCodeStr, 0);
if sIdx = '0' then begin
boFlag := True;
end else begin
boFlag := False;
end;
if (sAccount <> '') and (sChrName <> '') and (nSessionID >= 2) then begin
nClientVersion := Str_ToInt(sClientVersion, 0);
Result := True;
end;
end;
except
MainOutMessage(sExceptionMsg);
end;
end;
var
nCheckCode: Integer;
sData: string;
sAccount, sChrName: string;
nSessionID: Integer;
boFlag: Boolean;
nClientVersion: Integer;
nPayMent, nPayMode: Integer;
SessInfo: pTSessInfo;
PlayObject: TPlayObject;
i: Integer;
resourcestring
sExceptionMsg = '[Exception] TRunSocket::DoClientCertification CheckCode: ';
sDisable = '*disable*';
begin
nCheckCode := 0;
{if Assigned(zPlugOfEngine.RunSocketExecGateMsg_Data) then begin
zPlugOfEngine.RunSocketExecGateMsg_Data(GateIdx, nSocket, PChar(sMsg));
end;}
try
if GateUser.sAccount = '' then begin
if TagCount(sMsg, '!') > 0 then begin
sData := ArrestStringEx(sMsg, '#', '!', sMsg);
sMsg := Copy(sMsg, 2, Length(sMsg) - 1);
if GetCertification(sMsg, sAccount, sChrName, nSessionID, nClientVersion, boFlag) then begin
//if ScanCertification(sAccount, sChrName, nSessionID, nClientVersion) then exit;
SessInfo := FrmIDSoc.GetAdmission(sAccount, GateUser.sIPaddr, nSessionID, nPayMode, nPayMent);
if (SessInfo <> nil) and (nPayMent > 0) then begin
PlayObject := nil;
PlayObject := UserEngine.GetPlayObjectExOfAutoGetExp(Trim(sAccount)); //, Trim(sChrName)
if PlayObject <> nil then begin //离线挂机人物直接登陆游戏
if CompareText(PlayObject.m_sCharName, Trim(sChrName)) = 0 then begin
PlayObject.m_VisibleHumanList.Clear;
for i := 0 to PlayObject.m_VisibleItems.Count - 1 do begin
if pTVisibleMapItem(PlayObject.m_VisibleItems.Items[i]) <> nil then
Dispose(pTVisibleMapItem(PlayObject.m_VisibleItems.Items[i]));
end;
PlayObject.m_VisibleItems.Clear;
for i := 0 to PlayObject.m_VisibleActors.Count - 1 do begin
if pTVisibleBaseObject(PlayObject.m_VisibleActors.Items[i]) <> nil then
Dispose(pTVisibleBaseObject(PlayObject.m_VisibleActors.Items[i]));
end;
PlayObject.m_VisibleActors.Clear;
PlayObject.m_VisibleEvents.Clear; //清除人物列表
PlayObject.m_boGhost := False;
PlayObject.m_boDeath := False;
PlayObject.m_sIPaddr := GateUser.sIPaddr;
PlayObject.m_nGSocketIdx := GateUser.nGSocketIdx;
PlayObject.m_nGateIdx := GateIdx;
PlayObject.m_nSocket := nSocket;
PlayObject.m_nSessionID := nSessionID;
PlayObject.m_nPayMent := nPayMent;
PlayObject.m_nPayMode := nPayMode;
PlayObject.m_boEmergencyClose := False;
PlayObject.m_boSwitchData := False;
PlayObject.m_boReconnection := False;
PlayObject.m_boKickFlag := False;
PlayObject.m_boSoftClose := False;
PlayObject.m_boReadyRun := False;
PlayObject.bo698 := False;
PlayObject.n69C := 0;
PlayObject.m_dwSaveRcdTick := GetTickCount();
PlayObject.m_boWantRefMsg := True;
PlayObject.m_boRcdSaved := False;
PlayObject.m_boDieInFight3Zone := False;
PlayObject.m_Script := nil;
PlayObject.m_boTimeRecall := False;
PlayObject.m_sMoveMap := '';
PlayObject.m_nMoveX := 0;
PlayObject.m_nMoveY := 0;
PlayObject.m_dwRunTick := GetTickCount();
PlayObject.m_nRunTime := 250;
PlayObject.m_dwSearchTime := 1000;
PlayObject.m_dwSearchTick := GetTickCount();
PlayObject.m_nViewRange := 12;
PlayObject.m_boNewHuman := False;
PlayObject.m_boLoginNoticeOK := False;
PlayObject.bo6AB := False;
PlayObject.m_boExpire := False;
PlayObject.m_boSendNotice := False;
PlayObject.m_dwCheckDupObjTick := GetTickCount();
PlayObject.dwTick578 := GetTickCount();
PlayObject.dwTick57C := GetTickCount();
PlayObject.m_boInSafeArea := False;
PlayObject.n5F8 := 0;
PlayObject.n5FC := 0;
PlayObject.m_dwMagicAttackTick := GetTickCount();
PlayObject.m_dwMagicAttackInterval := 0;
PlayObject.m_dwAttackTick := GetTickCount();
PlayObject.m_dwMoveTick := GetTickCount();
PlayObject.m_dwTurnTick := GetTickCount();
PlayObject.m_dwActionTick := GetTickCount();
PlayObject.m_dwAttackCount := 0;
PlayObject.m_dwAttackCountA := 0;
PlayObject.m_dwMagicAttackCount := 0;
PlayObject.m_dwMoveCount := 0;
PlayObject.m_dwMoveCountA := 0;
PlayObject.m_nOverSpeedCount := 0;
PlayObject.m_sOldSayMsg := '';
PlayObject.m_dwSayMsgTick := GetTickCount();
PlayObject.m_boDisableSayMsg := False;
PlayObject.m_dwDisableSayMsgTick := GetTickCount();
PlayObject.m_dLogonTime := Now();
PlayObject.m_dwLogonTick := GetTickCount();
PlayObject.n584 := 0;
PlayObject.n588 := 0;
PlayObject.m_boSwitchData := False;
PlayObject.m_boSwitchDataSended := False;
PlayObject.m_nWriteChgDataErrCount := 0;
PlayObject.m_dwShowLineNoticeTick := GetTickCount();
PlayObject.m_nShowLineNoticeIdx := 0;
PlayObject.m_nSoftVersionDateEx := 0;
PlayObject.m_nKillMonExpMultiple := 1;
PlayObject.m_nKillMonExpRate := 100;
PlayObject.m_dwRateTick := GetTickCount();
PlayObject.m_nPowerRate := 100;
PlayObject.m_boSetStoragePwd := False;
PlayObject.m_boReConfigPwd := False;
PlayObject.m_boCheckOldPwd := False;
PlayObject.m_boUnLockPwd := False;
PlayObject.m_boUnLockStoragePwd := False;
PlayObject.m_boPasswordLocked := False; //锁仓库
PlayObject.m_btPwdFailCount := 0;
PlayObject.m_sTempPwd := '';
PlayObject.m_sStoragePwd := '';
PlayObject.m_boFilterSendMsg := False;
PlayObject.m_boCanDeal := True;
PlayObject.m_boCanDrop := True;
PlayObject.m_boCanGetBackItem := True;
PlayObject.m_boCanWalk := True;
PlayObject.m_boCanRun := True;
PlayObject.m_boCanHit := True;
PlayObject.m_boCanSpell := True;
PlayObject.m_boCanUseItem := True;
PlayObject.m_nMemberType := 0;
PlayObject.m_nMemberLevel := 0;
//PlayObject.m_nGameGold := 0;
PlayObject.m_boDecGameGold := False;
PlayObject.m_nDecGameGold := 1;
PlayObject.m_dwDecGameGoldTick := GetTickCount();
PlayObject.m_dwDecGameGoldTime := 60 * 1000;
PlayObject.m_boIncGameGold := False;
PlayObject.m_nIncGameGold := 1;
PlayObject.m_dwIncGameGoldTick := GetTickCount();
PlayObject.m_dwIncGameGoldTime := 60 * 1000;
//PlayObject.m_nGamePoint := 0;
PlayObject.m_dwIncGamePointTick := GetTickCount();
PlayObject.m_nPayMentPoint := 0;
PlayObject.m_DearHuman := nil;
PlayObject.m_MasterHuman := nil;
PlayObject.m_MasterList := TList.Create;
PlayObject.m_boSendMsgFlag := False;
PlayObject.m_boChangeItemNameFlag := False;
PlayObject.m_boCanMasterRecall := False;
PlayObject.m_boCanDearRecall := False;
PlayObject.m_dwDearRecallTick := GetTickCount();
PlayObject.m_dwMasterRecallTick := GetTickCount();
PlayObject.m_btReColorIdx := 0;
PlayObject.m_GetWhisperHuman := nil;
PlayObject.m_boOnHorse := False;
PlayObject.m_wContribution := 0;
PlayObject.m_sRankLevelName := g_sRankLevelName;
PlayObject.m_boFixedHideMode := True;
PlayObject.m_nStep := 0;
PlayObject.m_nClientFlagMode := -1;
PlayObject.m_dwAutoGetExpTick := GetTickCount;
PlayObject.m_nAutoGetExpPoint := 0;
PlayObject.m_AutoGetExpEnvir := nil;
PlayObject.m_dwHitIntervalTime := g_Config.dwHitIntervalTime; //攻击间隔
PlayObject.m_dwMagicHitIntervalTime := g_Config.dwMagicHitIntervalTime; //魔法间隔
PlayObject.m_dwRunIntervalTime := g_Config.dwRunIntervalTime; //走路间隔
PlayObject.m_dwWalkIntervalTime := g_Config.dwWalkIntervalTime; //走路间隔
PlayObject.m_dwTurnIntervalTime := g_Config.dwTurnIntervalTime; //换方向间隔
PlayObject.m_dwActionIntervalTime := g_Config.dwActionIntervalTime; //组合操作间隔
PlayObject.m_dwRunLongHitIntervalTime := g_Config.dwRunLongHitIntervalTime; //组合操作间隔
PlayObject.m_dwRunHitIntervalTime := g_Config.dwRunHitIntervalTime; //组合操作间隔
PlayObject.m_dwWalkHitIntervalTime := g_Config.dwWalkHitIntervalTime; //组合操作间隔
PlayObject.m_dwRunMagicIntervalTime := g_Config.dwRunMagicIntervalTime; //跑位魔法间隔
PlayObject.m_SessInfo := nil;
PlayObject.m_boTestSpeedMode := False;
PlayObject.m_boLockLogon := True;
PlayObject.m_boLockLogoned := False;
PlayObject.m_boRemoteMsg := False; //是否允许接受消息
PlayObject.m_boNotOnlineAddExp := False; //是否是离线挂机人物
PlayObject.m_boStartAutoAddExpPoint := False; //是否开始增加经验
PlayObject.m_dwStartNotOnlineAddExpTime := 0; //离线挂机开始时间
PlayObject.m_dwNotOnlineAddExpTime := 0; //离线挂机时长
PlayObject.m_nNotOnlineAddExpPoint := 0; //离线挂机每分钟增加经验值
PlayObject.m_dwAutoAddExpPointTick := GetTickCount;
PlayObject.m_dwAutoAddExpPointTimeTick := GetTickCount;
PlayObject.m_sAutoSendMsg := ''; //自动回复信息
PlayObject.m_boKickAutoAddExpUser := False;
PlayObject.m_boTimeGoto := False;
PlayObject.m_dwTimeGotoTick := GetTickCount;
PlayObject.m_sTimeGotoLable := '';
PlayObject.m_TimeGotoNPC := nil;
PlayObject.m_nDealGoldPose := 0;
for i := 0 to PlayObject.m_DynamicVarList.Count - 1 do begin //清除变量错误
if pTDynamicVar(PlayObject.m_DynamicVarList.Items[i]) <> nil then
Dispose(pTDynamicVar(PlayObject.m_DynamicVarList.Items[i]));
end;
PlayObject.m_DynamicVarList.Clear;
if Assigned(zPlugOfEngine.PlayObjectCreate) then begin
try
zPlugOfEngine.PlayObjectCreate(Self);
except
end;
end;
GateUser.boCertification := True;
GateUser.sAccount := Trim(sAccount);
GateUser.sCharName := Trim(sChrName);
GateUser.nSessionID := nSessionID;
GateUser.nClientVersion := nClientVersion;
GateUser.SessInfo := SessInfo;
SetGateUserList(PlayObject.m_nGateIdx, PlayObject.m_nSocket, PlayObject);
UserEngine.SendServerGroupMsg(SS_201, nServerIndex, PlayObject.m_sCharName);
end else begin //同一个账号不同人物
PlayObject.m_boPlayOffLine := False;
PlayObject.m_boNotOnlineAddExp := False;
//PlayObject.m_boReconnection := False;
//PlayObject.m_boSoftClose := True;
GateUser.boCertification := True;
GateUser.sAccount := Trim(sAccount);
GateUser.sCharName := Trim(sChrName);
GateUser.nSessionID := nSessionID;
GateUser.nClientVersion := nClientVersion;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -