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

📄 svmain.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 5 页
字号:
          AssignFile(LogFile,sLogFileName);
          Rewrite(LogFile);
        end else begin
          AssignFile(LogFile,sLogFileName);
          Append(LogFile);
        end;
        boWriteLog:=False;
      except
        MemoLog.Lines.Add('写入日志文件失败');
      end;
    end;
    for i:=0 to MainLogMsgList.Count - 1 do begin
      MemoLog.Lines.Add(MainLogMsgList.Strings[i]);
      if not boWriteLog then begin
        Writeln(LogFile,MainLogMsgList.Strings[i]);
      end;
    end;
    MainLogMsgList.Clear;
    if not boWriteLog then CloseFile(LogFile);
    for I := 0 to LogStringList.Count - 1 do begin
//      MemoryStream:=TMemoryStream.Create;
//      try
        s28:='1' + #9 + IntToStr(g_Config.nServerNumber) + #9 + IntToStr(nServerIndex) + #9 + LogStringList.Strings[I] + #2;
//        MemoryStream.Write(s28[1],length(s28));
        LogUDP.Send(@s28[1],length(s28));
//      finally
//        MemoryStream.Free;
//      end;
    end;
    LogStringList.Clear;
    if LogonCostLogList.Count > 0 then begin
      WriteConLog(LogonCostLogList);
    end;
    LogonCostLogList.Clear;  
  finally
    LeaveCriticalSection(LogMsgCriticalSection);
  end;


  if nServerIndex = 0 then begin
    sSrvType:='[M]';
  end else begin
    if FrmMsgClient.MsgClient.Socket.Connected then begin
      sSrvType:='[S]';
    end else begin
      sSrvType:='[ ]';
    end;
  end;
  //检查线程 运行时间
  //g_dwEngineRunTime:=GetTickCount - g_dwEngineTick;

  tSecond:=(GetTickCount() - g_dwStartTick) div 1000;
  wHour:=tSecond div 3600;
  wMinute:=(tSecond div 60) mod 60;
  wSecond:=tSecond mod 60;
  StatusBar.Panels[0].Text := IntToStr(wHour) + ':' +
                      IntToStr(wMinute) + ':' +
                      IntToStr(wSecond) + ' ' + sSrvType;{ +
                      IntToStr(g_dwEngineRunTime) + g_sProcessName + '-' + g_sOldProcessName;}
  StatusBar.Panels[1].Text := '(' + IntToStr(UserEngine.MonsterCount) + ')   ' +
                        IntToStr(UserEngine.OnlinePlayObject) + '/' +
                        IntToStr(UserEngine.PlayObjectCount) + '[' +
                        IntToStr(UserEngine.LoadPlayCount) + '/' +
                        IntToStr(UserEngine.m_PlayObjectFreeList.Count) + ']';
  {
  Label1.Caption:= 'Run' + IntToStr(nRunTimeMin) + '/' + IntToStr(nRunTimeMax) + ' ' +
                   'Soc' + IntToStr(g_nSockCountMin) + '/' + IntToStr(g_nSockCountMax) + ' ' +
                   'Usr' + IntToStr(g_nUsrTimeMin) + '/' + IntToStr(g_nUsrTimeMax);
  }
  Label1.Caption:= format('处理:%d/%d 传输:%d/%d 角色:%d/%d',[nRunTimeMin,nRunTimeMax,g_nSockCountMin,g_nSockCountMax,g_nUsrTimeMin,g_nUsrTimeMax]);
  {
  Label2.Caption:= 'Hum' + IntToStr(g_nHumCountMin) + '/' + IntToStr(g_nHumCountMax) + ' ' +
                   'Mon' + IntToStr(g_nMonTimeMin) + '/' + IntToStr(g_nMonTimeMax) + ' ' +
                   'UsrRot' + IntToStr(dwUsrRotCountMin) + '/' + IntToStr(dwUsrRotCountMax) + ' ' +
                   'Merch' + IntToStr(UserEngine.dwProcessMerchantTimeMin) + '/' + IntToStr(UserEngine.dwProcessMerchantTimeMax) + ' ' +
                   'Npc' + IntToStr(UserEngine.dwProcessNpcTimeMin) + '/' + IntToStr(UserEngine.dwProcessNpcTimeMax) + ' ' +
                   '(' + IntToStr(g_nProcessHumanLoopTime) + ')';
  }
  Label2.Caption:= format('人物:%d/%d 循环:%d/%d 交易:%d/%d 管理:%d/%d (%d)',[g_nHumCountMin,
                                                                                  g_nHumCountMax,
                                                                                  dwUsrRotCountMin,
                                                                                  dwUsrRotCountMax,
                                                                                  UserEngine.dwProcessMerchantTimeMin,
                                                                                  UserEngine.dwProcessMerchantTimeMax,
                                                                                  UserEngine.dwProcessNpcTimeMin,
                                                                                  UserEngine.dwProcessNpcTimeMax,
                                                                                  g_nProcessHumanLoopTime]);


  {
  Label20.Caption:='MonG' + IntToStr(g_nMonGenTime) + '/' + IntToStr(g_nMonGenTimeMin) + '/' + IntToStr(g_nMonGenTimeMax) + ' ' +
                   'MonP' + IntToStr(g_nMonProcTime) + '/' + IntToStr(g_nMonProcTimeMin) + '/' + IntToStr(g_nMonProcTimeMax) + ' ' +
                   'ObjRun' + IntToStr(g_nBaseObjTimeMin) + '/' + IntToStr(g_nBaseObjTimeMax);
  }
  Label20.Caption:=format('刷新怪物:%d/%d/%d 处理怪物:%d/%d/%d 角色处理:%d/%d',[g_nMonGenTime,g_nMonGenTimeMin,g_nMonGenTimeMax,g_nMonProcTime,g_nMonProcTimeMin,g_nMonProcTimeMax,g_nBaseObjTimeMin,g_nBaseObjTimeMax]);

  tTimeCount:=GetTickCount() / (24 * 60 * 60 * 1000);
  {if tTimeCount >= 36 then LbTimeCount.Font.Color:=clBlue
  else LbTimeCount.Font.Color:=clBlack;}
  StatusBar.Panels[2].Text := CurrToStr(tTimeCount) + 'Mins';

  {
  //004E5B78
  for i:= Low(RunSocket.GateList) to High(RunSocket.GateList) do begin
    GateInfo:=@RunSocket.GateList[i];
    if GateInfo.boUsed and (GateInfo.Socket <> nil) then begin
      if GateInfo.nSendMsgBytes < 1024 then begin
        tGate:=IntToStr(GateInfo.nSendMsgBytes) + 'b ';
      end else begin//004E5BDA
        tGate:=IntToStr(GateInfo.nSendMsgBytes div 1024) + 'kb ';
      end;//004E5C0A
      sGate:='[G' + IntToStr(i) + ': ' +
             IntToStr(GateInfo.nSendMsgCount) + '/' +
             IntToStr(GateInfo.nSendRemainCount) + ' ' +
             tGate + IntToStr(GateInfo.nSendedMsgCount) + ']' + sGate;
    end;//004E5C90
  end;
  Label3.Caption:=sGate;
  }
 // GridGate
  nRow:=1;
  //for i:= Low(RunSocket.GateList) to High(RunSocket.GateList) do begin
  for i:= Low(g_GateArr) to High(g_GateArr) do begin
    GridGate.Cells[0,I + 1]:='';
    GridGate.Cells[1,I + 1]:='';
    GridGate.Cells[2,I + 1]:='';
    GridGate.Cells[3,I + 1]:='';
    GridGate.Cells[4,I + 1]:='';
    GridGate.Cells[5,I + 1]:='';
    GridGate.Cells[6,I + 1]:='';
    GateInfo:=@g_GateArr[i];
    //GateInfo:=@RunSocket.GateList[i];
    if GateInfo.boUsed and (GateInfo.Socket <> nil) then begin
      GridGate.Cells[0,nRow]:=IntToStr(I);
      GridGate.Cells[1,nRow]:=GateInfo.sAddr + ':' + IntToStr(GateInfo.nPort);
      GridGate.Cells[2,nRow]:=IntToStr(GateInfo.nSendMsgCount);
      GridGate.Cells[3,nRow]:=IntToStr(GateInfo.nSendedMsgCount);
      GridGate.Cells[4,nRow]:=IntToStr(GateInfo.nSendRemainCount);
      if GateInfo.nSendMsgBytes < 1024 then begin
        GridGate.Cells[5,nRow]:=IntToStr(GateInfo.nSendMsgBytes) + 'b';
      end else begin
        GridGate.Cells[5,nRow]:=IntToStr(GateInfo.nSendMsgBytes div 1024) + 'kb';
      end;
      GridGate.Cells[6,nRow]:=IntToStr(GateInfo.nUserCount) + '/' + IntToStr(GateInfo.UserList.Count);
      Inc(nRow);
    end;
  end;

  Inc(nRunTimeMax);

  if g_nSockCountMax   > 0 then Dec(g_nSockCountMax);
  if g_nUsrTimeMax     > 0 then Dec(g_nUsrTimeMax);
  if g_nHumCountMax    > 0 then Dec(g_nHumCountMax);
  if g_nMonTimeMax     > 0 then Dec(g_nMonTimeMax);
  if dwUsrRotCountMax  > 0 then Dec(dwUsrRotCountMax);
  if g_nMonGenTimeMin  > 1 then Dec(g_nMonGenTimeMin,2);
  if g_nMonProcTimeMin > 1 then Dec(g_nMonProcTimeMin,2);
  if g_nBaseObjTimeMax > 0 then Dec(g_nBaseObjTimeMax);
end;

procedure TFrmMain.StartTimerTimer(Sender: TObject);//004E4848
var
  nCode:Integer;
begin
  SendGameCenterMsg(SG_STARTNOW,'正在启动游戏主程序...');
  StartTimer.Enabled:=False;
  FrmDB:=TFrmDB.Create();
  StartService();

  try
    if SizeOf(THumData)<> SIZEOFTHUMAN then begin
      ShowMessage('SizeOf(THuman) ' + IntToStr(sizeof(THumData)) + ' <> SIZEOFTHUMAN ' + IntToStr(SIZEOFTHUMAN));
      Close;
      exit;
    end;
    if not LoadClientFile then begin
      Close;
      exit;
    end;

    FrmDB.InitDBM;

    LoadGameLogItemNameList();
    LoadDenyIPAddrList();
    LoadDenyAccountList();
    LoadDenyChrNameList();
    LoadNoClearMonList();

    //thedeath
    nEMKills:=0;//make sure all the em values are set
    dwEMSpellTick:=GetTickCount();//em value again
    dwEMDied:=0;//em didnt die yet

    
    MemoLog.Lines.Add('加载物品数据库...');
    nCode:=FrmDB.LoadItemsDB;
    if nCode < 0 then begin
      if nCode = -3 then MemoLog.Lines.Add('StdItems.DB:没有物品数据请检查!' + '代码= ' + IntToStr(nCode))
      else MemoLog.Lines.Add('StdItems.DB:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('物品数据库已加载(%d).',[UserEngine.StdItemList.Count]));
    {$IFDEF UseTXT}
      //MemoLog.Lines.Add('文件设置:[文本文件]');
    {$ELSE}
      MemoLog.Lines.Add('文件设置:[数据库]');
    {$ENDIF}
    MemoLog.Lines.Add('加载地图文件...');
    nCode:= FrmDB.LoadMapInfo;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MapInfo:发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('地图文件以加载(%d).',[g_MapManager.Count]));

    {$IFDEF UseTXT}
      MemoLog.Lines.Add('加载小地图...');
      nCode:= FrmDB.LoadMinMap;
      if nCode < 0 then begin
        MemoLog.Lines.Add('Minimap.txt:读取这个文件的时候,发生错误。' + '代码: ' + IntToStr(nCode));
        exit;
      end;
      MemoLog.Lines.Add('小地图已加载...');

      MemoLog.Lines.Add('加载大地图...');
      nCode:= FrmDB.LoadBigMap;
      if nCode < 0 then begin
        MemoLog.Lines.Add('BigMap.txt:读取这个文件的时候,发生错误。' + '代码: ' + IntToStr(nCode));
        exit;
      end;
      MemoLog.Lines.Add('大地图已加载...');

    {$ENDIF}

    nCode:= FrmDB.LoadDecorationList;
    if nCode < 0 then begin
      MemoLog.Lines.Add('DecoItem.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('装饰物品已加载...');

    MemoLog.Lines.Add('加载公会领土信息...');
    g_GuildTerritory.LoadAll();
    MemoLog.Lines.Add('加载怪物数据库...');
    nCode:= FrmDB.LoadMonsterDB;
    if nCode < 0 then begin
      MemoLog.Lines.Add('Monster.DB:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('怪物数据库已加载(%d).',[UserEngine.MonsterList.Count]));

    MemoLog.Lines.Add('加载技能数据库...');
    nCode:= FrmDB.LoadMagicDB;
    if nCode < 0 then begin
      MemoLog.Lines.Add('Magic.DB:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('技能数据库已加载(%d).',[UserEngine.m_MagicList.Count]));

    MemoLog.Lines.Add('加载刷怪列表信息...');
    nCode:= FrmDB.LoadMonGen;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MonGen.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('刷怪列表信息已加载(%d).',[UserEngine.m_MonGenList.Count]));
    
    MemoLog.Lines.Add('加载怪物说话信息...');
    LoadMonSayMsg();
    MemoLog.Lines.Add(format('怪物说话信息已加载(%d).',[g_MonSayMsgList.Count]));
    LoadDisableTakeOffList();
    LoadMonDropLimitList();
    LoadDisableMakeItem();
    LoadEnableMakeItem();
    LoadAllowSellOffItem();
    LoadDisableMoveMap;
    ItemUnit.LoadCustomItemName();
    LoadDisableSendMsgList();
    LoadItemBindIPaddr();
    LoadItemBindAccount();
    LoadItemBindCharName();
    LoadUnMasterList();
    LoadUnForceMasterList();
    
    MemoLog.Lines.Add('加载释放物品列表信息...');
    nCode:= FrmDB.LoadUnbindList;
    if nCode < 0 then begin
      MemoLog.Lines.Add('UnbindList.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('释放物品列表信息已加载...');

    {MemoLog.Lines.Add('正在加载商城商品数据信息...');
    nCode:= FrmDB.LoadGameShopItemList();
    if nCode < 0 then begin
      MemoLog.Lines.Add('GameShopItem.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;  }
    //MemoLog.Lines.Add('加载商城商品数据信息...');

    {nCode:= FrmDB.LoadGameShopList;
    if nCode < 0 then begin
      MemoLog.Lines.Add('GameShopList.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end; }
    MemoLog.Lines.Add('商城商品数据信息已加载...');

    MemoLog.Lines.Add('加载任务触发信息...');
    nCode:= FrmDB.LoadMapQuest;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MapQuest.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('任务触发信息已加载...');

    MemoLog.Lines.Add('正在加载地图触发事件信息...');
    nCode := FrmDB.LoadMapEvent;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MapEvent.txt加载地图触发事件信息失败!!!');
      Exit;
    end;
    MemoLog.Lines.Add('加载地图触发事件信息成功...');

    MemoLog.Lines.Add('加载QuestDiary\*.txt...');
    nCode:= FrmDB.LoadQuestDiary;
    if nCode < 0 then begin
      MemoLog.Lines.Add('QuestDiary\*.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('QuestDiary信息已加载...');

    if LoadAbuseInformation('.\!Abuse.txt') then begin
      MemoLog.Lines.Add('脏话信息已加载...');
    end;

    MemoLog.Lines.Add('加载滚动公告信息...');
    if not LoadLineNotice(g_Config.sNoticeDir + 'LineNotice.txt') then  begin
      MemoLog.Lines.Add('Line Notice.txt:读取失败...');
    end;
    MemoLog.Lines.Add('滚动公告信息已加载...');

    FrmDB.LoadAdminList();
    MemoLog.Lines.Add('游戏管理员列表已加载...');
    g_GuildManager.LoadGuildInfo();
    MemoLog.Lines.Add('公会列表已加载...');

    g_CastleManager.LoadCastleList();
    MemoLog.Lines.Add('城堡列表已加载...');


    //UserCastle.Initialize;
    g_CastleManager.Initialize;
    MemoLog.Lines.Add('城堡初始化...');
    if (nServerIndex=0) then FrmSrvMsg.StartMsgServer
    else FrmMsgClient.ConnectMsgServer;
    StartEngine();
    boStartReady:=True;
    Sleep(500);

{$IF DBSOCKETMODE = TIMERENGINE}
    ConnectTimer.Enabled:=True;
{$ELSE}
    FillChar(g_Config.DBSOcketThread,SizeOf(g_Config.DBSOcketThread),0);
    g_Config.DBSOcketThread.Config:=@g_Config;
    g_Config.DBSOcketThread.hThreadHandle:=CreateThread(nil,
                                                 0,
                                                 @DBSocketThread,
                                                 @g_Config.DBSOcketThread,
                                                 0,
                                                 g_Config.DBSOcketThread.dwThreadID);
{$IFEND}
{$IF IDSOCKETMODE = THREADENGINE}
    FillChar(g_Config.IDSocketThread,SizeOf(g_Config.IDSocketThread),0);
    g_Config.IDSocketThread.Config:=@g_Config;
    g_Config.IDSocketThread.hThreadHandle:=CreateThread(nil,
                                                 0,
                                                 @IDSocketThread,
                                                 @g_Config.IDSocketThread,
                                                 0,
                                                 g_Config.IDSocketThread.dwThreadID);

⌨️ 快捷键说明

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