📄 usrengn.pas
字号:
PlayObject.m_sIPaddr := UserOpenInfo.LoadUser.sIPaddr;
PlayObject.m_sIPLocal := GetIPLocal(PlayObject.m_sIPaddr);
PlayObject.m_nSocket := UserOpenInfo.LoadUser.nSocket;
PlayObject.m_nGSocketIdx := UserOpenInfo.LoadUser.nGSocketIdx;
PlayObject.m_nGateIdx := UserOpenInfo.LoadUser.nGateIdx;
PlayObject.m_nSessionID := UserOpenInfo.LoadUser.nSessionID;
PlayObject.m_nPayMent := UserOpenInfo.LoadUser.nPayMent;
PlayObject.m_nPayMode := UserOpenInfo.LoadUser.nPayMode;
PlayObject.m_dwLoadTick := UserOpenInfo.LoadUser.dwNewUserTick;
PlayObject.m_nSoftVersionDateEx := GetExVersionNO(UserOpenInfo.LoadUser.nSoftVersionDate, PlayObject.m_nSoftVersionDate);
Result := PlayObject;
except
MainOutMessage(sExceptionMsg);
end;
end;
type
TGetLicense = function(var nProVersion: Integer; var UserLicense: Integer; var ErrorCode: Word): Integer; stdcall;
var
dwUsrRotTime: LongWord;
dwCheckTime: LongWord;
dwCurTick: LongWord;
nCheck30: Integer;
boCheckTimeLimit: Boolean;
nIdx: Integer;
PlayObject: TPlayObject;
I: Integer;
UserOpenInfo: pTUserOpenInfo;
GoldChangeInfo: pTGoldChangeInfo;
LineNoticeMsg: string;
nM2Crc: Integer;
m_nUserLicense: Integer;
m_nCheckServerCode: Integer;
m_nErrorCode: Word;
m_nProVersion: Integer;
sUserKey: string;
sCheckCode: string;
resourcestring
sExceptionMsg1 = '[Exception] TUserEngine::ProcessHumans -> Ready, Save, Load... Code:=%d';
sExceptionMsg2 = '[Exception] TUserEngine::ProcessHumans ClosePlayer.Delete - Free';
sExceptionMsg3 = '[Exception] TUserEngine::ProcessHumans ClosePlayer.Delete';
sExceptionMsg4 = '[Exception] TUserEngine::ProcessHumans RunNotice';
sExceptionMsg5 = '[Exception] TUserEngine::ProcessHumans Human.Operate Code: %d';
sExceptionMsg6 = '[Exception] TUserEngine::ProcessHumans Human.Finalize Code: %d';
sExceptionMsg7 = '[Exception] TUserEngine::ProcessHumans RunSocket.CloseUser Code: %d';
sExceptionMsg8 = '[Exception] TUserEngine::ProcessHumans';
begin
nCheck30 := 0;
dwCheckTime := GetTickCount();
if (GetTickCount - m_dwProcessLoadPlayTick) > 200 then begin
m_dwProcessLoadPlayTick := GetTickCount();
try
EnterCriticalSection(m_LoadPlaySection);
try
for I := 0 to m_LoadPlayList.Count - 1 do begin
UserOpenInfo := pTUserOpenInfo(m_LoadPlayList.Objects[I]);
if not UserOpenInfo.LoadUser.boIsHero then begin
if not FrontEngine.IsFull and not IsLogined(UserOpenInfo.sAccount, m_LoadPlayList.Strings[I]) then begin
PlayObject := MakeNewHuman(UserOpenInfo);
if PlayObject <> nil then begin
PlayObject.m_boClientFlag := UserOpenInfo.LoadUser.boClinetFlag; //将客户端标志传到人物数据中
m_PlayObjectList.AddObject(m_LoadPlayList.Strings[I], PlayObject);
SendServerGroupMsg(SS_201, nServerIndex, PlayObject.m_sCharName);
m_NewHumanList.Add(PlayObject);
end;
end else begin
KickOnlineUser(m_LoadPlayList.Strings[I]);
m_ListOfGateIdx.Add(Pointer(UserOpenInfo.LoadUser.nGateIdx));
m_ListOfSocket.Add(Pointer(UserOpenInfo.LoadUser.nSocket));
end;
end else begin
{$IF HEROVERSION = 1}
if UserOpenInfo.LoadUser.PlayObject <> nil then begin //开始召唤英雄
PlayObject := GetPlayObject(TBaseObject(UserOpenInfo.LoadUser.PlayObject));
if PlayObject <> nil then begin
case UserOpenInfo.LoadUser.btLoadDBType of
0: begin //召唤
if UserOpenInfo.nOpenStatus = 1 then begin
PlayObject.m_MyHero := PlayObject.MakeHero(PlayObject, UserOpenInfo.HumanRcd);
if PlayObject.m_MyHero <> nil then begin
THeroObject(PlayObject.m_MyHero).Login;
PlayObject.m_MyHero.SendRefMsg(RM_CREATEHERO, PlayObject.m_MyHero.m_btDirection, PlayObject.m_MyHero.m_nCurrX, PlayObject.m_MyHero.m_nCurrY, 0, ''); //刷新客户端,创建英雄信息
PlayObject.SendMsg(PlayObject, RM_RECALLHERO, 0, Integer(PlayObject.m_MyHero), 0, 0, '');
case THeroObject(PlayObject.m_MyHero).m_btStatus of
0: begin
PlayObject.m_boSlaveRelax := False;
THeroObject(PlayObject.m_MyHero).SysMsg('状态:跟随', c_Green, t_Hint);
end;
1: begin
PlayObject.m_boSlaveRelax := False;
THeroObject(PlayObject.m_MyHero).SysMsg('状态:攻击', c_Green, t_Hint);
end;
2: begin
PlayObject.m_boSlaveRelax := True;
THeroObject(PlayObject.m_MyHero).SysMsg('状态:休息', c_Green, t_Hint);
end;
end;
THeroObject(PlayObject.m_MyHero).SysMsg(g_sHeroLoginMsg, c_Green, t_Hint);
end;
end;
end;
1: begin //新建
case UserOpenInfo.nOpenStatus of
1: begin
PlayObject.m_boHasHero := True;
if g_FunctionNPC <> nil then begin
g_FunctionNPC.GotoLable(PlayObject, '@CreateHeroOK', False);
end;
end;
2: begin
PlayObject.m_boHasHero := False;
PlayObject.m_sHeroCharName := '';
if g_FunctionNPC <> nil then begin
g_FunctionNPC.GotoLable(PlayObject, '@HeroNameExists', False);
end;
end;
3: begin
PlayObject.m_boHasHero := False;
PlayObject.m_sHeroCharName := '';
if g_FunctionNPC <> nil then begin
g_FunctionNPC.GotoLable(PlayObject, '@HeroOverChrCount', False);
end;
end;
else begin
PlayObject.m_boHasHero := False;
PlayObject.m_sHeroCharName := '';
if g_FunctionNPC <> nil then begin
g_FunctionNPC.GotoLable(PlayObject, '@CreateHeroFail', False);
end;
end;
end;
end;
2: begin //删除
if UserOpenInfo.nOpenStatus = 1 then begin
PlayObject.m_boHasHero := False;
PlayObject.m_sHeroCharName := '';
if g_FunctionNPC <> nil then begin
g_FunctionNPC.GotoLable(PlayObject, '@DeleteHeroOK', False);
end;
end else begin
if g_FunctionNPC <> nil then begin
g_FunctionNPC.GotoLable(PlayObject, '@DeleteHeroFail', False);
end;
end;
end;
end;
PlayObject.m_boWaitHeroDate := False;
end;
end;
{$IFEND}
end;
Dispose(pTUserOpenInfo(m_LoadPlayList.Objects[I]));
end;
m_LoadPlayList.Clear;
for I := 0 to m_ChangeHumanDBGoldList.Count - 1 do begin
GoldChangeInfo := m_ChangeHumanDBGoldList.Items[I];
PlayObject := GetPlayObject(GoldChangeInfo.sGameMasterName);
if PlayObject <> nil then begin
PlayObject.GoldChange(GoldChangeInfo.sGetGoldUser, GoldChangeInfo.nGold);
end;
Dispose(GoldChangeInfo);
end;
m_ChangeHumanDBGoldList.Clear;
finally
LeaveCriticalSection(m_LoadPlaySection);
end;
for I := 0 to m_NewHumanList.Count - 1 do begin
PlayObject := TPlayObject(m_NewHumanList.Items[I]);
RunSocket.SetGateUserList(PlayObject.m_nGateIdx, PlayObject.m_nSocket, PlayObject);
end;
m_NewHumanList.Clear;
for I := 0 to m_ListOfGateIdx.Count - 1 do begin
RunSocket.CloseUser(Integer(m_ListOfGateIdx.Items[I]), Integer(m_ListOfSocket.Items[I])); //GateIdx,nSocket
end;
m_ListOfGateIdx.Clear;
m_ListOfSocket.Clear;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg1, [0]));
MainOutMessage(E.Message);
end;
end;
end;
try
for I := 0 to m_PlayObjectFreeList.Count - 1 do begin //for i := 0 to m_PlayObjectFreeList.Count - 1 do begin
PlayObject := TPlayObject(m_PlayObjectFreeList.Items[I]);
if (GetTickCount - PlayObject.m_dwGhostTick) > g_Config.dwHumanFreeDelayTime {5 * 60 * 1000} then begin
try
TPlayObject(m_PlayObjectFreeList.Items[I]).Free;
except
MainOutMessage(sExceptionMsg2);
end;
m_PlayObjectFreeList.Delete(I);
Break;
end else begin
if PlayObject.m_boSwitchData and (PlayObject.m_boRcdSaved) then begin
if SendSwitchData(PlayObject, PlayObject.m_nServerIndex) or (PlayObject.m_nWriteChgDataErrCount > 20) then begin
PlayObject.m_boSwitchData := False;
PlayObject.m_boSwitchDataSended := True;
PlayObject.m_dwChgDataWritedTick := GetTickCount();
end else Inc(PlayObject.m_nWriteChgDataErrCount);
end;
if PlayObject.m_boSwitchDataSended and ((GetTickCount - PlayObject.m_dwChgDataWritedTick) > 100) then begin
PlayObject.m_boSwitchDataSended := False;
SendChangeServer(PlayObject, PlayObject.m_nServerIndex);
end;
end;
end;
except
MainOutMessage(sExceptionMsg3);
end;
{===================================重新获取授权===============================}
try
if ((GetTickCount - m_dwSearchTick) > 1000 * 60 * 60) or (m_TodayDate <> Date) then begin
m_TodayDate := Date;
m_dwSearchTick := GetTickCount;
m_nCheckServerCode := 1000;
m_nUserLicense := 0;
nM2Crc := 0;
Inc(nCrackedLevel, 5);
if (g_nGetLicenseInfo >= 0) and Assigned(PlugProcArray[g_nGetLicenseInfo].nProcAddr) then begin
{$IF TESTMODE = 1}
MainOutMessage('nCrackedLevel_1 ' + IntToStr(nCrackedLevel));
{$IFEND}
Dec(nCrackedLevel);
m_nCheckServerCode := 1001;
nM2Crc := TGetLicense(PlugProcArray[g_nGetLicenseInfo].nProcAddr)(m_nProVersion, m_nUserLicense, m_nErrorCode);
Inc(nErrorLevel, m_nErrorCode);
m_nCheckServerCode := 1002;
m_nLimitNumber := LoWord(m_nUserLicense);
m_nLimitUserCount := HiWord(m_nUserLicense);
if (m_nProVersion = nProductVersion) and (nProductVersion <> 0) then Dec(nCrackedLevel);
m_nCheckServerCode := 1003;
if Decode(sUserQQKey, sUserKey) then Dec(nCrackedLevel);
m_nCheckServerCode := 1004;
if Str_ToInt(sUserKey, 0) = nUserLicense then Dec(nCrackedLevel);
m_nCheckServerCode := 1005;
if m_nCheckServerCode = 1005 then Dec(nCrackedLevel);
{$IF TESTMODE = 1}
MainOutMessage('nM2Crc ' + IntToStr(nM2Crc));
MainOutMessage('sUserKey ' + sUserKey);
MainOutMessage('nCrackedLevel_2 ' + IntToStr(nCrackedLevel));
MainOutMessage('m_nLimitNumber ' + IntToStr(m_nLimitNumber));
MainOutMessage('m_nLimitUserCount ' + IntToStr(m_nLimitUserCount));
MainOutMessage('m_nProVersion ' + IntToStr(m_nProVersion));
MainOutMessage('nErrorLevel ' + IntToStr(nErrorLevel));
{$IFEND}
end else begin
{$IF TESTMODE = 1}
MainOutMessage('g_nGetLicenseInfo < 0');
{$IFEND}
m_nLimitNumber := 0;
m_nLimitUserCount := 0;
end;
{$IF TESTMODE = 1}
MainOutMessage('nCrackedLevel ' + IntToStr(nCrackedLevel));
MainOutMessage('nErrorLevel ' + IntToStr(nErrorLevel));
{$IFEND}
end;
except
MainOutMessage('[Exception] TUserEngine::GetLicense');
end;
boCheckTimeLimit := False;
try
dwCurTick := GetTickCount();
nIdx := m_nProcHumIDx;
while True do begin
if m_PlayObjectList.Count <= nIdx then Break;
PlayObject := TPlayObject(m_PlayObjectList.Objects[nIdx]);
if PlayObject <> nil then begin
if Integer(dwCurTick - PlayObject.m_dwRunTick) > PlayObject.m_nRunTime then begin
PlayObject.m_dwRunTick := dwCurTick;
if not PlayObject.m_boGhost then begin
if not PlayObject.m_boLoginNoticeOK then begin
try
PlayObject.RunNotice();
except
MainOutMessage(sExceptionMsg4);
end;
end else begin
try
if not PlayObject.m_boReadyRun then begin
PlayObject.m_boNotOnlineAddExp := False;
PlayObject.m_boReadyRun := True;
PlayObject.UserLogon;
end else begin
if (GetTickCount() - PlayObject.m_dwSearchTick) > PlayObject.m_dwSearchTime then begin
PlayObject.m_dwSearchTick := GetTickCount();
nCheck30 := 10;
PlayObject.SearchViewRange;
nCheck30 := 11;
PlayObject.GameTimeChanged;
nCheck30 := 12;
end;
end;
if (GetTickCount() - PlayObject.m_dwShowLineNoticeTick) > g_Config.dwShowLineNoticeTime then begin
PlayObject.m_dwShowLineNoticeTick := GetTickCount();
if LineNoticeList.Count > PlayObject.m_nShowLineNoticeIdx then begin
LineNoticeMsg := g_ManageNPC.GetLineVariableText(PlayObject, LineNoticeList.Strings[PlayObject.m_nShowLineNoticeIdx]);
//PlayObject.SysMsg(g_Config.sLineNoticePreFix + ' '+ LineNoticeList.Strings[PlayObject.m_nShowLineNoticeIdx],g_nLineNoticeColor);
nCheck30 := 13;
case LineNoticeMsg[1] of
'R': PlayObject.SysMsg(Copy(LineNoticeMsg, 2, Length(LineNoticeMsg) - 1), c_Red, t_Notice);
'G': PlayObject.SysMsg(Copy(LineNoticeMsg, 2, Length(LineNoticeMsg) - 1), c_Green, t_Notice);
'B': PlayObject.SysMsg(Copy(LineNoticeMsg, 2, Length(LineNoticeMsg) - 1), c_Blue, t_Notice);
else begin
PlayObject.SysMsg(LineNoticeMsg, TMsgColor(g_Config.nLineNoticeColor) {c_Blue}, t_Notice);
end;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -