svmain.pas

来自「2009最新 传奇汉化0599代码 传奇汉化」· PAS 代码 · 共 1,827 行 · 第 1/4 页

PAS
1,827
字号


  {
  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('MonG:%d/%d/%d MonP:%d/%d/%d ObjRun:%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('Loading StdItem.DB...');
    nCode:=FrmDB.LoadItemsDB;
    if nCode < 0 then begin
      if nCode = -3 then MemoLog.Lines.Add('StdItems.DB : No Items in DB. Please Check!' + 'Code= ' + IntToStr(nCode))
      else MemoLog.Lines.Add('StdItems.DB : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('StdItem.DB loaded(%d).',[UserEngine.StdItemList.Count]));
    {$IFDEF UseTXT}
      MemoLog.Lines.Add('File Setting: [TextFiles]');
    {$ELSE}
      MemoLog.Lines.Add('File Setting: [Database]');    
    {$ENDIF}
    MemoLog.Lines.Add('Loading MapFiles...');
    nCode:= FrmDB.LoadMapInfo;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MapInfo : Failure occurred.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('Mapfile loaded(%d).',[g_MapManager.Count]));

    {$IFDEF UseTXT}
      MemoLog.Lines.Add('Loading Minimap...'); 
      nCode:= FrmDB.LoadMinMap;
      if nCode < 0 then begin
        MemoLog.Lines.Add('Minimap.txt : Failure was occurred while reading this file.' + 'Code: ' + IntToStr(nCode));
        exit;
      end;
      MemoLog.Lines.Add('Minimap loaded...');
    {$ENDIF}

    nCode:= FrmDB.LoadDecorationList;
    if nCode < 0 then begin
      MemoLog.Lines.Add('DecoItem.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('DecoItem loaded...');

    MemoLog.Lines.Add('Loading Guild Territorys...');
    g_GuildTerritory.LoadAll();
    MemoLog.Lines.Add('Loading Monster.DB...');
    nCode:= FrmDB.LoadMonsterDB;
    if nCode < 0 then begin
      MemoLog.Lines.Add('Monster.DB : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('Monster.DB loaded(%d).',[UserEngine.MonsterList.Count]));

    MemoLog.Lines.Add('Loading Magic.DB...');
    nCode:= FrmDB.LoadMagicDB;
    if nCode < 0 then begin
      MemoLog.Lines.Add('Magic.DB : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('Magic.DB loaded(%d).',[UserEngine.m_MagicList.Count]));

    MemoLog.Lines.Add('Loading MonGen.txt...');
    nCode:= FrmDB.LoadMonGen;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MonGen.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('MonGen.txt loaded(%d).',[UserEngine.m_MonGenList.Count]));
    
    MemoLog.Lines.Add('Loading GenMsg.txt...');
    LoadMonSayMsg();
    MemoLog.Lines.Add(format('GenMsg.txt loaded(%d).',[g_MonSayMsgList.Count]));
    LoadDisableTakeOffList();
    LoadMonDropLimitList();
    LoadDisableMakeItem();
    LoadEnableMakeItem();
    LoadAllowSellOffItem();
    LoadDisableMoveMap;
    ItemUnit.LoadCustomItemName();
    LoadDisableSendMsgList();
    LoadItemBindIPaddr();
    LoadItemBindAccount();
    LoadItemBindCharName();
    LoadUnMasterList();
    LoadUnForceMasterList();
    
    MemoLog.Lines.Add('Loading UnbindList.txt...');
    nCode:= FrmDB.LoadUnbindList;
    if nCode < 0 then begin
      MemoLog.Lines.Add('UnbindList.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('UnbindList information loaded.');

    MemoLog.Lines.Add('Loading MapQuest.txt...');
    nCode:= FrmDB.LoadMapQuest;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MapQuest.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('MapQuest information loaded.');

    MemoLog.Lines.Add('Loading QuestDiary\*.txt...');
    nCode:= FrmDB.LoadQuestDiary;
    if nCode < 0 then begin
      MemoLog.Lines.Add('QuestDiary\*.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('QuestDiary information loaded.');

    if LoadAbuseInformation('.\!Abuse.txt') then begin
      MemoLog.Lines.Add('!Abuse.txt loaded..');
    end;

    MemoLog.Lines.Add('Loading LineNotice...');
    if not LoadLineNotice(g_Config.sNoticeDir + 'LineNotice.txt') then  begin
      MemoLog.Lines.Add('Line Notice.txt : Failed to load.');
    end;
    MemoLog.Lines.Add('Line Notice loaded...');

    FrmDB.LoadAdminList();
    MemoLog.Lines.Add('Admin List loaded..');
    g_GuildManager.LoadGuildInfo();
    MemoLog.Lines.Add('Guild List loaded..');

    g_CastleManager.LoadCastleList();
    MemoLog.Lines.Add('Castle List loaded..');


    //UserCastle.Initialize;
    g_CastleManager.Initialize;
    MemoLog.Lines.Add('Castle initialized..');
    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);

{$IFEND}
     g_dwRunTick := GetTickCount();

    n4EBD1C  := 0;
    g_dwUsrRotCountTick := GetTickCount();
{$IF USERENGINEMODE = THREADENGINE}
    FillChar(g_Config.UserEngineThread,SizeOf(g_Config.UserEngineThread),0);
    g_Config.UserEngineThread.Config:=@g_Config;
    g_Config.UserEngineThread.hThreadHandle:=CreateThread(nil,
                                                 0,
                                                 @UserEngineThread,
                                                 @g_Config.UserEngineThread,
                                                 0,
                                                 g_Config.UserEngineThread.dwThreadID);
 {$ELSE}

{$IFEND}
    RunTimer.Enabled:=True;
    SendGameCenterMsg(SG_STARTOK,'游戏主程序启动完成...');
    GateSocket.Address:=g_Config.sGateAddr;
    GateSocket.Port:=g_Config.nGatePort;
    g_GateSocket:=GateSocket;

    boRemoteOpenGateSocket:=True;
  except
    on e: Exception do
      MainOutMessage('StartTimer exception: ' + E.Message);
  end;
end;

procedure TFrmMain.StartEngine(); //004E5F2C
var
  nCode:Integer;
  nCheckCode:Integer;
ResourceString
  sExceptionMsg = '[Exception] TFrmMain::StartEngine - Code=%d';
begin
  nCheckCode := 0;
  try
{$IF IDSOCKETMODE = TIMERENGINE}
    FrmIDSoc.Initialize;
    MemoLog.Lines.Add('IDSoc Initialized..');
{$IFEND}

    nCheckCode := 1;
    g_MapManager.LoadMapDoor;
    MemoLog.Lines.Add('GrobalEnvir loaded..');

    nCheckCode := 2;
    MakeStoneMines();
    MemoLog.Lines.Add('MakeStoneMines...');

    nCheckCode := 3;
    nCode:= FrmDB.LoadMerchant;
    if nCode < 0 then begin
      MemoLog.Lines.Add('Merchant.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('Merchant loaded...');

    nCheckCode := 4;
    if not g_Config.boVentureServer then begin
     nCode:= FrmDB.LoadGuardList;
     if nCode < 0 then begin
        MemoLog.Lines.Add('Guardlist.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      end;
      MemoLog.Lines.Add('GuardList loaded..');
    end;

    nCheckCode := 5;
    nCode:= FrmDB.LoadNpcs;
    if nCode < 0 then begin
      MemoLog.Lines.Add('Npc.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('Npc loaded..');

    nCheckCode := 6;
    nCode:= FrmDB.LoadMakeItem;
    if nCode < 0 then begin
      MemoLog.Lines.Add('MakeItem.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('MakeItem loaded..');

    nCheckCode := 7;
    nCode:= FrmDB.LoadStartPoint;
    if nCode < 0 then begin
      MemoLog.Lines.Add('StartPoint.txt : Failure was occurred while reading this file.' + 'Code= ' + IntToStr(nCode));
      Close;
    end;
    MemoLog.Lines.Add('StartPoints loaded...');

    nCheckCode := 8;
    FrontEngine.Resume;
    MemoLog.Lines.Add('F-Engine resumed..');

    nCheckCode := 9;
    UserEngine.Initialize;
    MemoLog.Lines.Add('U-Engine initialized..');

    nCheckCode := 10;
    if (not DirectoryExists(g_Config.sEnvirDir+ 'Memo_Saved')) then begin
      if (not CreateDir(g_Config.sEnvirDir+ 'Memo_Saved')) then
        MemoLog.Lines.Add('Error: Memo_Saved directory cannot be created.');
    end;

    if not DirectoryExists(g_Config.sEnvirDir+ 'Friend_Saved') then begin
      if (not CreateDir(g_Config.sEnvirDir+ 'Friend_Saved')) then
        MemoLog.Lines.Add('Error: Friend_Saved directory cannot be created.');
    end;
  except
    MainOutMessage(format(sExceptionMsg, [nCheckCode]));
  end;
end;

procedure TFrmMain.MakeStoneMines();//004E5E88
var
  i,nW,nH:Integer;
  Envir:TEnvirnoment;
begin
  for i:=0 to g_MapManager.Count -1 do begin
    Envir:=TEnvirnoment(g_MapManager.Items[i]);
    if Envir.Flag.boMINE or Envir.Flag.boMINE2 or Envir.Flag.boMINE3 then begin
      for nW:=0 to Envir.Header.wWidth - 1 do begin
        for nH:=0 to Envir.Header.wHeight - 1 do begin
          //if (nW mod 2 = 0) and (nH mod 2 = 0) then
            TStoneMineEvent.Create(Envir,nW,nH,ET_MINE);
        end;
      end;
    end;      
  end;
end;
function TFrmMain.LoadClientFile():Boolean;
begin
  MemoLog.Lines.Add('Loaded client version information and server table...');
  if not (g_Config.sClientFile1='') then g_Config.nClientFile1_CRC:=CalcFileCRC(g_Config.sClientFile1);
  if not (g_Config.sClientFile2='') then g_Config.nClientFile2_CRC:=CalcFileCRC(g_Config.sClientFile2);
  if not (g_Config.sClientFile3='') then g_Config.nClientFile3_CRC:=CalcFileCRC(g_Config.sClientFile3);

  if (g_Config.nClientFile1_CRC<>0) or (g_Config.nClientFile2_CRC<>0) or (g_Config.nClientFile3_CRC<>0) then begin
    Result:=True;
  end else begin
    MemoLog.Lines.Add('Loading client version information failed. check !setup.txt -> [setup] -> clientfile1,..');
    MemoLog.Lines.Add('Ensure you''ve copied the client exe into the M2 folder and it has the same name in !setup.txt');
    Result:=TRUE;
  end;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
var
  nX,nY:Integer;

ResourceString
  sGateIdx       = 'Idx';
  sGateIPaddr    = 'Address';
  sGateListMsg   = 'Msg';
  sGateSendCount = 'SCount';
  sGateMsgCount  = 'MCount';
  sGateSendKB    = 'KB';
  sGateUserCount = 'Users';
begin
  Randomize;
  LogUDP := TWSocket.Create(nil);

  g_dwGameCenterHandle:=Str_ToInt(ParamStr(1),0);
  nX:=Str_ToInt(ParamStr(2),-1);
  nY:=Str_ToInt(ParamStr(3),-1);
  if (nX >= 0) or (nY >= 0) then begin
    Left:=nX;
    Top:=nY;
  end;

  SendGameCenterMsg(SG_FORMHANDLE,IntToStr(Self.Handle));


  GridGate.RowCount:= 21;
  GridGate.Cells[0,0]:=sGateIdx;
  GridGate.Cells[1,0]:=sGateIPaddr;
  GridGate.Cells[2,0]:=sGateListMsg;
  GridGate.Cells[3,0]:=sGateSendCount;
  GridGate.Cells[4,0]:=sGateMsgCount;
  GridGate.Cells[5,0]:=sGateSendKB;
  GridGate.Cells[6,0]:=sGateUserCount;

  {
  GridGate.Cells[0,1]:='0';
  GridGate.Cells[1,1]:='888.888.888.888:8888';
  GridGate.Cells[2,1]:='10000';
  GridGate.Cells[3,1]:='10000';
  GridGate.Cells[4,1]:='10000';
  GridGate.Cells[5,1]:='10000';
  }


  GateSocket:=TServerSocket.Create(Owner);

⌨️ 快捷键说明

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