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

📄 usrengn.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      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_nSoftVersionDate:=UserOpenInfo.HumInfo.nSoftVersionDate;
      PlayObject.m_nSoftVersionDateEx :=
        GetExVersionNO(UserOpenInfo.LoadUser.nSoftVersionDate,
        PlayObject.m_nSoftVersionDate);
      Result := PlayObject;
    except
      MainOutMessage(sExceptionMsg);
    end;
  end;
var
  dwUsrRotTime                          : LongWord;
  dwCheckTime                           : LongWord;         //0x10
  dwCurTick                             : LongWord;
  nCheck30                              : Integer;          //0x30
  boCheckTimeLimit                      : Boolean;          //0x31
  nIdx                                  : Integer;
  PlayObject                            : TPlayObject;
  i                                     : Integer;
  UserOpenInfo                          : pTUserOpenInfo;
  GoldChangeInfo                        : pTGoldChangeInfo;
  LineNoticeMsg                         : 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 FrontEngine.IsFull and not IsLogined(m_LoadPlayList.Strings[i],UserOpenInfo.LoadUser.DBindex)
            then
          begin
            UserOpenInfo := pTUserOpenInfo(m_LoadPlayList.Objects[i]);

            PlayObject := MakeNewHuman(UserOpenInfo);


            if PlayObject <> nil then
            begin
              //PlayObject.m_boClientFlag:=UserOpenInfo.LoadUser.boClinetFlag; //将客户端标志传到人物数据中
              PlayObject.m_nSessionID:=UserOpenInfo.LoadUser.nSessionID;
              m_PlayObjectList.AddObject(m_LoadPlayList.Strings[i], PlayObject);
              SendServerGroupMsg(SS_201, nServerIndex, PlayObject.m_sCharName);
              m_NewHumanList.Add(PlayObject);
            end;

          end
          else
          begin                                             //004B0BF9
            KickOnlineUser(m_LoadPlayList.Strings[i]);
            UserOpenInfo := pTUserOpenInfo(m_LoadPlayList.Objects[i]);
            m_ListOfGateIdx.Add(Pointer(UserOpenInfo.LoadUser.nGateIdx));
            //004B0C39
            m_ListOfSocket.Add(Pointer(UserOpenInfo.LoadUser.nSocket));
          end;
          DisPose(pTUserOpenInfo(m_LoadPlayList.Objects[i]));
        end;                                                //004B0C96
        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;

      //004B0D4A
      for i := 0 to m_NewHumanList.Count - 1 do
      begin
        PlayObject := TPlayObject(m_NewHumanList.Items[i]);
        if PlayObject=nil then Continue ;
        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]));
          {$IF SHowErr = 1}
           MainOutMessage(E.Message);
          {$IFEND}
      end;
    end;
  end;                                                      //004B0E1E


  try
    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;                                                      //004B0F91


  boCheckTimeLimit := False;                                //004B0F91
  try
    dwCurTick := GetTickCount();
    nIdx := m_nProcHumIDx;
    while True do
    begin
      if m_PlayObjectList.Count <= nIdx then
        break;
      PlayObject := TPlayObject(m_PlayObjectList.Objects[nIdx]);
      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
{$IF CATEXCEPTION = TRYEXCEPTION}
            try
{$IFEND}
              PlayObject.RunNotice();
{$IF CATEXCEPTION = TRYEXCEPTION}
            except
              MainOutMessage(sExceptionMsg4);
            end;
{$IFEND}
          end
          else
          begin                                             //004B1058
            try
              if not PlayObject.m_boReadyRun then
              begin
                PlayObject.m_boReadyRun := True;            //004B1075
                PlayObject.UserLogon;                       //BaseObject.0FFFEh;
              end
              else
              begin
                if (GetTickCount() - PlayObject.m_dwSearchTick) >PlayObject.m_dwSearchTime then
                begin
                  PlayObject.m_dwSearchTick := GetTickCount();
                  PlayObject.SearchViewRange;

                  PlayObject.GameTimeChanged;
                end;                                        //004B10C4

                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);

                    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;
                  Inc(PlayObject.m_nShowLineNoticeIdx);
                  if (LineNoticeList.Count <= PlayObject.m_nShowLineNoticeIdx)
                    then
                    PlayObject.m_nShowLineNoticeIdx := 0;
                end;

                PlayObject.Run();
                //定时存盘
                if not FrontEngine.IsFull and ((GetTickCount() -
                  PlayObject.m_dwSaveRcdTick) > g_Config.dwSaveHumanRcdTime)
                  then
                begin
                  PlayObject.m_dwSaveRcdTick := GetTickCount();

                  PlayObject.DealCancelA();

                  SaveHumanRcd(PlayObject);

                end;
              end;                                          //004B119F
            except
              on E: Exception do
              begin
                MainOutMessage(format(sExceptionMsg5, [0]));
          {$IF SHowErr = 1}
           MainOutMessage(E.Message);
          {$IFEND}
              end;
            end;
          end;
        end
        else
        begin //if not PlayObject.boIsGhost then begin  //CODE:004B11C5
          try
            if nIdx < m_PlayObjectList.Count then
              m_PlayObjectList.Delete(nIdx);
            nCheck30 := 2;

            PlayObject.Disappear();

            nCheck30 := 3;
          except
            on E: Exception do
            begin
              MainOutMessage(format(sExceptionMsg6, [nCheck30]));
          {$IF SHowErr = 1}
           MainOutMessage(E.Message);
          {$IFEND}
            end;
          end;                                              //004B1232
          try

            AddToHumanFreeList(PlayObject);

            nCheck30 := 4;
            PlayObject.DealCancelA();

            SaveHumanRcd(PlayObject);

            RunSocket.CloseUser(PlayObject.m_nGateIdx, PlayObject.m_nSocket);

          except
            MainOutMessage(format(sExceptionMsg7, [nCheck30]));
          end;                                              //004B12BA

          SendServerGroupMsg(SS_202, nServerIndex, PlayObject.m_sCharName);
          Continue;
        end;
      end; //if (dwTime14 - PlayObject.dw368) > PlayObject.dw36C then begin
      Inc(nIdx);                                            //004B12E6
      if (GetTickCount - dwCheckTime) > g_dwHumLimit then
      begin
        boCheckTimeLimit := True;
        m_nProcHumIDx := nIdx;
        break;
      end;
    end;                                                    //while True do begin
    if not boCheckTimeLimit then
      m_nProcHumIDx := 0;
  except
    MainOutMessage(sExceptionMsg8);
  end;
  Inc(nProcessHumanLoopTime);
  g_nProcessHumanLoopTime := nProcessHumanLoopTime;
  if m_nProcHumIDx = 0 then
  begin
    nProcessHumanLoopTime := 0;
    g_nProcessHumanLoopTime := nProcessHumanLoopTime;
    dwUsrRotTime := GetTickCount - g_dwUsrRotCountTick;
    dwUsrRotCountMin := dwUsrRotTime;
    g_dwUsrRotCountTick := GetTickCount();
    if dwUsrRotCountMax < dwUsrRotTime then
      dwUsrRotCountMax := dwUsrRotTime;
  end;
  g_nHumCountMin := GetTickCount - dwCheckTime;
  if g_nHumCountMax < g_nHumCountMin then
    g_nHumCountMax := g_nHumCountMin;
end;

procedure TUserEngine.ProcessMerchants;                     //004B1B8C
var
  dwRunTick, dwCurrTick                 : LongWord;
  i                                     : Integer;
  MerchantNPC                           : TMerchant;
  boProcessLimit                        : Boolean;
resourcestring
  sExceptionMsg                           =
    '[Exception] TUserEngine::ProcessMerchants';
begin
  dwRunTick := GetTickCount();
  boProcessLimit := False;
  try
    dwCurrTick := GetTickCount();
    m_MerchantList.Lock;
    try
      for i := nMerchantPosition to m_MerchantList.Count - 1 do
      begin
        MerchantNPC := m_MerchantList.Items[i];
        if not MerchantNPC.m_boGhost then
        begin
          if Integer(dwCurrTick - MerchantNPC.m_dwRunTick) >
            MerchantNPC.m_nRunTime then
          begin
            if (GetTickCount - MerchantNPC.m_dwSearchTick) >
              MerchantNPC.m_dwSearchTime then
            begin
              MerchantNPC.m_dwSearchTick := GetTickCount();
              MerchantNPC.SearchViewRange();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -