⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usrengn.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      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 + -