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

📄 svmain.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    MemoLog.Lines.Add('加载任务地图信息成功...');

    MemoLog.Lines.Add('正在加载任务说明信息...');
    nCode := FrmDB.LoadQuestDiary;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('加载任务说明信息失败!!!');
      exit;
    end;
    MemoLog.Lines.Add('加载任务说明信息成功...');

    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('加载公告提示信息失败!!!');
    end;
    MemoLog.Lines.Add('加载公告提示信息成功...');

    FrmDB.LoadAdminList();
    MemoLog.Lines.Add('管理员列表加载成功...');

    for i:=0 to DateCount-1 do
    Begin
      g_GuildManager[i].LoadGuildInfo();
    End;
    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);

{$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;
    //GateSocket.Open;
{$IF DEBUG = 0}
    asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
    end;
{$IFEND}

{$IF DEBUG = 0}
    asm
    jz @@Start
    jnz @@Start
    db 0E8h
    @@Start:
    end;
{$IFEND}
    SendGameCenterMsg(SG_CHECKCODEADDR, IntToStr(Integer(@g_CheckCode)));

{$IF SoftVersion = VERDEMO}
    boRemoteOpenGateSocket := True;
{$IFEND}
    MENU_CONTROL_GATE_OPENClick(self);
  except
    on E: Exception do
      MainOutMessage('服务器启动异常!!!' + E.Message);
  end;
end;

procedure TFrmMain.StartEngine();                           //004E5F2C
var
  nCode                                 : Integer;
begin
  try
{$IF IDSOCKETMODE = TIMERENGINE}
    FrmIDSoc.Initialize;
    MemoLog.Lines.Add('登录服务器连接初始化完成...');
{$IFEND}


    g_MapManager.LoadMapDoor;
    MemoLog.Lines.Add('地图环境加载成功...');

    MakeStoneMines();
    MemoLog.Lines.Add('矿物数据初始成功...');

    nCode := FrmDB.LoadMerchant;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('Load Merchant Error !!!' + 'Code: ' +
        IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('交易NPC列表加载成功...');

    if not g_Config.boVentureServer then
    begin
      nCode := FrmDB.LoadGuardList;
      if nCode < 0 then
      begin
        MemoLog.Lines.Add('Load GuardList Error !!!' + 'Code: ' +
          IntToStr(nCode));
      end;
      MemoLog.Lines.Add('守卫列表加载成功...');
    end;

    nCode := FrmDB.LoadNpcs;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('Load NpcList Error !!!' + 'Code: ' +
        IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('管理NPC列表加载成功...');

    nCode := FrmDB.LoadMakeItem;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('Load MakeItem Error !!!' + 'Code: ' +
        IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('炼制物品信息加载成功...');

    nCode := FrmDB.LoadStartPoint;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('加载回城点配置时出现错误 !!!(错误码: ' +
        IntToStr(nCode) + ')');
      Close;
    end;
    MemoLog.Lines.Add('回城点配置加载成功...');

    FrontEngine.Resume;
    MemoLog.Lines.Add('人物数据引擎启动成功...');

    UserEngine.Initialize;
    MemoLog.Lines.Add('游戏处理引擎初始化成功...');
  except
    MainOutMessage('服务启动时出现异常错误 !!!');
  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.m_boMINE then
    begin
      for nW := 0 to Envir.m_nWidth - 1 do
      begin
        for nH := 0 to Envir.m_nHeight - 1 do
        begin
          //if (nW mod 2 = 0) and (nH mod 2 = 0) then
          TStoneMineEvent.Create(Envir, nW, nH, ET_STONEMINE);
        end;
      end;
    end;
  end;
end;



procedure TFrmMain.FormCreate(Sender: TObject);
var
  nX, nY                                : Integer;
 // md5str                                : PChar;
  hid                                   : String;
  g_MemFile                             : Integer;  
resourcestring
  sDemoVersion                          = '演示版';
  sGateIdx                              = '网关';
  sGateIPaddr                           = '网关地址';
  sGateListMsg                          = '队列数据';
  sGateSendCount                        = '发送数据';
  sGateMsgCount                         = '剩余数据';
  sGateSendKB                           = '平均流量';
  sGateUserCount                        = '最高人数';
begin

   g_MemFile:=OpenFileMapping(FILE_MAP_WRITE,False,'DBSERVERSQL');
    if g_MemFile = 0 then
    begin
      g_MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(THumDataLoadAndSave) ,'DBSERVERSQL');
    end;
    g_MemShared:=MapViewOfFile(g_MemFile,File_MAP_WRITE,0,0,0);


 {$IF DEBUG = 0}
 // caption:=Inttostr(SizeOf(THumDataInfo) );
{$I License.inc}
  DllHandle:=loadlibrary( 'm2server.dll' );
  {$I License.inc}
  if DllHandle=0 then
  Begin
    SHowMessage('没有正确加载DLL文件');
    Exit;
  End;
  {$I License.inc}
  //解密
  Function1:=GetProcAddress(DllHandle,Pointer(HiWord(0) or LoWord(1)));
  {$I License.inc}
  //检测
  Function2:=GetProcAddress(DllHandle,Pointer(HiWord(0) or LoWord(2)));
  {$I License.inc}
  //初始化
  Function4:=GetProcAddress(DllHandle,Pointer(HiWord(0) or LoWord(3)));
  {$I License.inc}
  Hid:=ExtractFilePath(Application.ExeName)+'!Setup.txt';
  Function4(Handle,PChar(Application.ExeName),PChar(Hid));

  {$IFEND}


  {$I License.inc}

  {$I License.inc}
    {$I License.inc}
  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;

  //网关socket
  GateSocket := TServerSocket.Create(Owner);
  GateSocket.OnClientConnect := GateSocketClientConnect;
  GateSocket.OnClientDisconnect := GateSocketClientDisconnect;
  GateSocket.OnClientError := GateSocketClientError;
  GateSocket.OnClientRead := GateSocketClientRead;

  //DBServer Socket
  DBSocket.OnConnect := DBSocketConnect;
  DBSocket.OnError := DBSocketError;
 // DBSocket.OnRead := DBSocketRead;


  Timer1.OnTimer := Timer1Timer;
  RunTimer.OnTimer := RunTimerTimer;
  StartTimer.OnTimer := StartTimerTimer;
  SaveVariableTimer.OnTimer := SaveVariableTimerTimer;
  ConnectTimer.OnTimer := ConnectTimerTimer;
  CloseTimer.OnTimer := CloseTimerTimer;
  MemoLog.OnChange := MemoLogChange;
  DataModule_mir200[0]:= TDataModule_mir200.Create(nil);
  DataModule_mir200[1]:= TDataModule_mir200.Create(nil);  
  StartTimer.Enabled := True;


end;

procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
resourcestring
  sCloseServerYesNo                     = '是否确认关闭游戏服务器?';
  sCloseServerTitle                     = '确认信息';
begin
  if not boServiceStarted then
  begin

    exit;
  end;
  if g_boExitServer then
  begin
    boStartReady := False;
    StopService();

    exit;
  end;
  CanClose := False;
  //  if MessageDlg('是否确认退出服务器?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  if Application.MessageBox(PChar(sCloseServerYesNo), PChar(sCloseServerTitle),
    MB_YESNO + MB_ICONQUESTION) = mrYes then
  begin
    g_boExitServer := True;
    CloseGateSocket();
    g_Config.boKickAllUser := True;
    FreeLibrary(DllHandle);
    CloseTimer.Enabled := True;
    
  end;
end;

procedure TFrmMain.CloseTimerTimer(Sender: TObject);
resourcestring
  sCloseServer                          = '%s [正在关闭服务器(%d/%d)...]';
begin
  if UserEngine=nil then
  Begin
      CloseTimer.Enabled := False;
      Close;
      Exit;
  End;
  Caption := format(sCloseServer, [g_Config.sServerName,  UserEngine.OnlinePlayObject, FrontEngine.SaveListCount]);
  if (UserEngine.OnlinePlayObject = 0)  then
  begin
    if FrontEngine.IsIdle then
    begin
      CloseTimer.Enabled := False;
      Close;
    end;
  end;
end;

procedure TFrmMain.SaveVariableTimerTimer(Sender: TObject);
begin
  SaveItemNumber();
end;

procedure TFrmMain.GateSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  RunSocket.CloseErrGate(Socket, ErrorCode);
end;

procedure TFrmMain.GateSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  RunSocket.CloseGate(Socket);
end;

procedure TFrmMain.GateSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  RunSocket.AddGate(Socket);
end;

procedure TFrmMain.GateSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  RunSocket.SocketRead(Socket);
end;

procedure TFrmMain.RunTimerTimer(Sender: TObject);

begin
  if boStartReady then
  begin
    RunSocket.Execute;

    FrmIDSoc.Run;

    UserEngine.Execute;

    ProcessGameRun();


    if nServerIndex = 0 then
      FrmSrvMsg.Run
    else

⌨️ 快捷键说明

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