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

📄 usrengn.pas

📁 翎风世界..传奇服务端..DELPHI源代码 包括DBServer,LogDataServer,LoginGate,LoginSrv,M2Server等..内容齐全.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
          if boRegened then begin
            MonGen.dwStartTick:=GetTickCount();
          end;
        end;//004B17A9
        g_sMonGenInfo1:=MonGen.sMonName + ',' + IntToStr(m_nCurrMonGen) + '/' + IntToStr(m_MonGenList.Count);
      end;//004B1851

    end;//004B1851

    g_nMonGenTime:=GetTickCount - dwCurrentTick;
    if g_nMonGenTime > g_nMonGenTimeMin then g_nMonGenTimeMin:=g_nMonGenTime;
    if g_nMonGenTime > g_nMonGenTimeMax then g_nMonGenTimeMax:=g_nMonGenTime;

    //刷新怪物结束

      dwMonProcTick:=GetTickCount();
      nMonsterProcessCount:=0;
      tCode:=1;
      //004B187B
      for I:= m_nMonGenListPosition to m_MonGenList.Count -1 do begin
        MonGen:=m_MonGenList.Items[I];
        tCode:=11;
        if m_nMonGenCertListPosition < MonGen.CertList.Count then begin
          nProcessPosition:=m_nMonGenCertListPosition;
        end else begin//4B18A8
          nProcessPosition:=0;
        end;
        m_nMonGenCertListPosition:=0;
        //4B18B5
        while (True) do begin
          if nProcessPosition >= MonGen.CertList.Count then break;
          Monster:=MonGen.CertList.Items[nProcessPosition];
          tCode:=12;
          if not Monster.m_boGhost then begin
            if Integer(dwCurrentTick - Monster.m_dwRunTick) > Monster.m_nRunTime then begin
              Monster.m_dwRunTick:=dwRunTick;
              if (dwCurrentTick - Monster.m_dwSearchTick) > Monster.m_dwSearchTime then begin
                Monster.m_dwSearchTick:=GetTickCount();
                tCode:=13;
                Monster.SearchViewRange();
              end;
              tCode:=14;

{$IF PROCESSMONSTMODE = OLDMONSTERMODE}
                Monster.Run;
{$ELSE}
              if not Monster.m_boIsVisibleActive and (Monster.m_nProcessRunCount < g_Config.nProcessMonsterInterval) then begin
                Inc(Monster.m_nProcessRunCount);
              end else begin
                Monster.m_nProcessRunCount:=0;
                Monster.Run;
              end;
{$IFEND}
              Inc(nMonsterProcessCount);
            end;
            Inc(nMonsterProcessPostion);
          end else begin
            if (GetTickCount - Monster.m_dwGhostTick) > 5 * 60 * 1000 then begin
              MonGen.CertList.Delete(nProcessPosition);
              Monster.Free;
              Continue;
            end;
          end;

          Inc(nProcessPosition);
          if (GetTickCount - dwMonProcTick) > g_dwMonLimit then begin
            g_sMonGenInfo2:=Monster.m_sCharName + '/' + IntToStr(I) + '/' + IntToStr(nProcessPosition);
            boProcessLimit:=True;
            m_nMonGenCertListPosition:=nProcessPosition;
            break;
          end;
        end; //while (True) do begin
        if boProcessLimit then break;
      end;//for I:= m_nMonGenListPosition to MonGenList.Count -1 do begin
      //004B1A5D

      tCode:=2;
      if m_MonGenList.Count <= I then begin
        m_nMonGenListPosition:=0;
        nMonsterCount:=nMonsterProcessPostion;
        nMonsterProcessPostion:=0;
        n84:=(n84 + nMonsterProcessCount) div 2;
      end;//4B1AAF

      if not boProcessLimit then begin
        m_nMonGenListPosition:=0;
      end else begin
        m_nMonGenListPosition:=I;
      end;
      g_nMonProcTime:=GetTickCount - dwMonProcTick;
      if g_nMonProcTime > g_nMonProcTimeMin then g_nMonProcTimeMin:=g_nMonProcTime;
      if g_nMonProcTime > g_nMonProcTimeMax then g_nMonProcTimeMax:=g_nMonProcTime;

  except
    on e: Exception do begin
      MainOutMessage(format(sExceptionMsg,[tCode]));
      MainOutMessage(E.Message);
    end;
  end;
  g_nMonTimeMin:=GetTickCount - dwRunTick;
  if g_nMonTimeMax < g_nMonTimeMin then g_nMonTimeMax:=g_nMonTimeMin;
end;
function TUserEngine.GetGenMonCount(MonGen:pTMonGenInfo):Integer;//4AE19C
var
  I          :Integer;
  nCount     :Integer;
  BaseObject :TBaseObject;
begin
  nCount:=0;
  for I:=0 to MonGen.CertList.Count -1 do begin
    BaseObject:=TBaseObject(MonGen.CertList.Items[I]);
    if not BaseObject.m_boDeath and not BaseObject.m_boGhost then Inc(nCount);
  end;
  Result:=nCount;
end;

procedure TUserEngine.ProcessNpcs;
var
  dwRunTick,dwCurrTick:LongWord;
  i:integer;
  NPC:TNormNpc;
  boProcessLimit:Boolean;
begin
  dwRunTick:=GetTickCount();
  boProcessLimit:=False;
  try
    dwCurrTick:=GetTickCount();
    for i:=nNpcPosition to QuestNPCList.Count -1 do begin
      NPC:=QuestNPCList.Items[i];
      if not NPC.m_boGhost then begin
        if Integer(dwCurrTick - NPC.m_dwRunTick) > NPC.m_nRunTime then begin
          if (GetTickCount - NPC.m_dwSearchTick) > NPC.m_dwSearchTime then begin
            NPC.m_dwSearchTick:=GetTickCount();
            NPC.SearchViewRange();
          end;
          if Integer(dwCurrTick - NPC.m_dwRunTick) > NPC.m_nRunTime then begin
            NPC.m_dwRunTick:=dwCurrTick;
            NPC.Run;  {FFFFB}
          end;
        end;
      end else begin
        if (GetTickCount - NPC.m_dwGhostTick) > 60 * 1000 then begin
          NPC.Free;
          QuestNPCList.Delete(i);
          break;
        end;
      end;
      if (GetTickCount - dwRunTick) > g_dwNpcLimit then begin
        nNpcPosition:=i;
        boProcessLimit:=True;
        Break;
      end;
    end;
    if not boProcessLimit then begin
      nNpcPosition:=0;
    end;
  except
    MainOutMessage('[Exceptioin] TUserEngine.ProcessNpcs');
  end;
  dwProcessNpcTimeMin:=GetTickCount - dwRunTick;
  if dwProcessNpcTimeMin > dwProcessNpcTimeMax then dwProcessNpcTimeMax:=dwProcessNpcTimeMin;
end;
//004ADE3C
function TUserEngine.RegenMonsterByName(sMap: String; nX, nY: Integer;
  sMonName: String):TBaseObject;
var
  nRace:Integer;
  BaseObject:TBaseObject;
  n18:Integer;
  MonGen:pTMonGenInfo;
begin
  nRace:=GetMonRace(sMonName);
  BaseObject:=AddBaseObject(sMap,nX,nY,nRace,sMonName);
  if BaseObject <> nil then begin
    n18:=m_MonGenList.Count - 1;
    if n18 < 0 then n18:=0;
    MonGen:=m_MonGenList.Items[n18];
    MonGen.CertList.Add(BaseObject);
    BaseObject.m_PEnvir.AddObject(BaseObject);
    BaseObject.m_boAddToMaped:=True;
//    MainOutMessage(format('MonGet Count:%d',[MonGen.CertList.Count]));
  end;

  Result:=BaseObject;
end;

procedure TUserEngine.Run; //004B20B8
//var
//  i:integer;
//  dwProcessTick:LongWord;
ResourceString
  sExceptionMsg = '[Exception] TUserEngine::Run';
begin
    CalceTime:=GetTickCount;
    try
      {
      ProcessHumans();
      if (GetTickCount() - dwProcessMonstersTick) > g_dwProcessMonstersTime then begin
        dwProcessMonstersTick:=GetTickCount();
        ProcessMonsters();
      end;
      dwProcessTick:=GetTickCount();
      ProcessMerchants();
      dwProcessMerchantTimeMin:=GetTickCount - dwProcessTick;
      dwProcessTick:=GetTickCount();
      ProcessNpcs();
      dwProcessNpcTimeMin:=GetTickCount - dwProcessTick;
      if (GetTickCount() - dwProcessMissionsTime) > 1000 then begin
        dwProcessMissionsTime:=GetTickCount();
        ProcessMissions();
        Process4AECFC();
        ProcessEvents();
      end;
      if (GetTickCount() - dwProcessMapDoorTick) > 500 then begin
        dwProcessMapDoorTick:=GetTickCount();
        ProcessMapDoor();
      end;
      }
      if (GetTickCount() - dwShowOnlineTick) > g_Config.dwConsoleShowUserCountTime then begin
//      if (GetTickCount() - dwShowOnlineTime) > 5000 then begin
        dwShowOnlineTick:=GetTickCount();
        NoticeManager.LoadingNotice;
//        MainOutMessage(TimeToStr(Now) + ' 在线数: ' + IntToStr(GetUserCount));
        MainOutMessage('Users: ' + IntToStr(GetUserCount));
//        UserCastle.Save;
        g_CastleManager.Save;
      end;
      if (GetTickCount() - dwSendOnlineHumTime) > 10000 then begin
        dwSendOnlineHumTime:=GetTickCount();
        FrmIDSoc.SendOnlineHumCountMsg(GetOnlineHumCount);
//        GuildManager.Run;
//        UserCastle.Run;
//        for i:=0 to DenySayMsgList.Count - 1 do begin
//          //
//        end;
      end;
    except
     on e: Exception do begin
      MainOutMessage(sExceptionMsg);
      MainOutMessage(E.Message);
     end;
    end;
//    dwUsrTimeMin:=GetTickCount() - CalceTime;
//    if dwUsrTimeMax < dwUsrTimeMin then dwUsrTimeMax:=dwUsrTimeMin;
      
end;

function TUserEngine.GetStdItem(nItemIdx: Integer): TItem; //004AC2F8
begin
  Result:=nil;
    Dec(nItemIdx);
    if (nItemIdx >= 0) and (StdItemList.Count > nItemIdx) then begin
      Result:=StdItemList.Items[nItemIdx];
      if Result.Name = '' then Result:=nil;
    end;
end;
function TUserEngine.GetStdItem(sItemName:String): TItem; //004AC348
var
  I: Integer;
  StdItem:TItem;
begin
  Result:=nil;
  if sItemName = '' then exit;
    for I := 0 to StdItemList.Count - 1 do begin
      StdItem:=StdItemList.Items[i];
      if CompareText(StdItem.Name,sItemName) = 0 then begin
        Result:=StdItem;
        break;
      end;
    end;
end;

function TUserEngine.GetStdItemWeight(nItemIdx: Integer): Integer; //004AC2B0
var
  StdItem:TItem;
begin
    Dec(nItemIdx);
    if (nItemIdx >= 0) and (StdItemList.Count > nItemIdx) then begin
      StdItem:=StdItemList.Items[nItemIdx];
      Result:=StdItem.Weight;
    end else begin
      Result:=0;
    end;
end;

function TUserEngine.GetStdItemName(nItemIdx: Integer): String;//004AC1AC
begin
  Result:='';
  Dec(nItemIdx);
    if (nItemIdx >= 0) and (StdItemList.Count > nItemIdx) then begin
      Result:=TItem(StdItemList.Items[nItemIdx]).Name;

    end else Result:='';
end;

function TUserEngine.FindOtherServerUser(sName: String;
  var nServerIndex): Boolean;
begin
  Result:=False;
end;

//004AEA00
procedure TUserEngine.CryCry(wIdent: Word; pMap: TEnvirnoment; nX, nY,
  nWide: Integer;btFColor,btBColor:Byte; sMsg: String);
var
  i:integer;
  PlayObject:TPlayObject;
begin
  for I := 0 to m_PlayObjectList.Count - 1 do begin
    PlayObject:=TPlayObject(m_PlayObjectList.Objects[i]);
    if not PlayObject.m_boGhost and
      (PlayObject.m_PEnvir = pMap) and
      (PlayObject.m_boBanShout) and
      (abs(PlayObject.m_nCurrX - nX) < nWide) and
      (abs(PlayObject.m_nCurrY - nY) < nWide) then begin

      //PlayObject.SendMsg(nil,wIdent,0,0,$FFFF,0,sMsg);
      PlayObject.SendMsg(nil,wIdent,0,btFColor,btBColor,0,sMsg);
    end;
  end;
end;

procedure TUserEngine.DemoRun;
begin
  Run();
end;

function  TUserEngine.MonGetRandomItems (mon: TBaseObject):Integer;//004AD2E8
var
   i: integer;
   ItemList:TList;
   iname: string;
   MonItem:pTMonItem;
   UserItem:pTUserItem;
   StdItem:TItem;
   Monster:pTMonInfo;
begin
   ItemList:= nil;
     for i:=0 to MonsterList.Count-1 do begin
       Monster:=MonsterList.Items[i];
       if CompareText(Monster.sName, mon.m_sCharName) = 0 then begin
         ItemList:=Monster.Itemlist;
         break;
       end;
     end;
   if ItemList <> nil then begin
      for i:=0 to ItemList.Count-1 do begin
         MonItem:=pTMonItem(ItemList[i]);
         if Random(MonItem.MaxPoint) <= MonItem.SelPoint then begin
           if CompareText(MonItem.ItemName, sSTRING_GOLDNAME) = 0 then begin

⌨️ 快捷键说明

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