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

📄 svmain.~pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
  tStr:String;
begin
  EnterCriticalSection(UserDBSection);
  try
    tStr:=Socket.ReceiveText;
    g_Config.sDBSocketRecvText:=g_Config.sDBSocketRecvText + tStr;
    if not g_Config.boDBSocketWorking then
    begin
      g_Config.sDBSocketRecvText:='';
    end;
  finally
    LeaveCriticalSection(UserDBSection);
  end;
end;

procedure TFrmMain.Timer1Timer(Sender: TObject);
var
  boWriteLog :Boolean;
  i          :Integer;
  nRow       :Integer;
  wHour      :Word;
  wMinute    :Word;
  wSecond    :Word;
  tSecond    :Integer;
  sSrvType   :String;
  sVerType   :String;
  tTimeCount :Currency;
  GateInfo   :pTGateInfo;
  LogFile :TextFile;
  MemoryStream:TMemoryStream;
  s28:String;
begin
  Caption:= format('%s - %s',[myDecodeString(g_sTitleName),sCaption]);
  EnterCriticalSection(LogMsgCriticalSection);
  try
    if MemoLog.Lines.Count > 500 then MemoLog.Clear;
    boWriteLog:=True;
    if MainLogMsgList.Count > 0 then
    begin
      try
        if not FileExists(sLogFileName) then
        begin
          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];
        MemoryStream.Write(s28[1],length(s28));
        LogUDP.SendStream(MemoryStream);
      finally
        MemoryStream.Free;
      end;
    end;
    LogStringList.Clear;
    if LogonCostLogList.Count > 0 then
    begin
      WriteConLog(LogonCostLogList);
    end;
    LogonCostLogList.Clear;  
  finally
    LeaveCriticalSection(LogMsgCriticalSection);
  end;

{$IF SoftVersion = VERDEMO}
  sVerType:='[D]';
{$ELSEIF SoftVersion = VERFREE}
  sVerType:='[F]';
{$ELSEIF SoftVersion = VERSTD}
  sVerType:='[S]';
{$ELSEIF SoftVersion = VEROEM}
  sVerType:='[O]';
{$ELSEIF SoftVersion = VERPRO}
  sVerType:='[P]';
{$ELSEIF SoftVersion = VERENT}
  sVerType:='[E]';
{$IFEND}

  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;

  tSecond:=(GetTickCount() - g_dwStartTick) div 1000;
  wHour:=tSecond div 3600;
  wMinute:=(tSecond div 60) mod 60;
  wSecond:=tSecond mod 60;
  LbRunTime.Caption:= IntToStr(wHour) + ':' +
                      IntToStr(wMinute) + ':' +
                      IntToStr(wSecond) + ' ' + sSrvType + sVerType;
  LbUserCount.Caption:= '(' + IntToStr(UserEngine.MonsterCount) + ')   ' +
                        IntToStr(UserEngine.OnlinePlayObject) + '/' +
                        IntToStr(UserEngine.PlayObjectCount) + '[' +
                        IntToStr(UserEngine.LoadPlayCount) + '/' +
                        IntToStr(UserEngine.m_PlayObjectFreeList.Count) + ']';
  Label1.Caption:= format('处理(%d/%d) 传输(%d/%d) 角色(%d/%d)',[nRunTimeMin,nRunTimeMax,g_nSockCountMin,g_nSockCountMax,g_nUsrTimeMin,g_nUsrTimeMax]);
  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]);
  Label5.Caption:= g_sMonGenInfo1 + ' - ' + g_sMonGenInfo2 + '    ';
  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]);
  MemStatus.Caption:='内存: ' + FormatFloat('0.##', GetAddressSpaceUsed / 1024) + 'MB';// + ' 内存块数: ' + IntToStr(AllocMemCount);

  tTimeCount:=GetTickCount() / (24 * 60 * 60 * 1000);
  if tTimeCount >= 36 then LbTimeCount.Font.Color:=clRed
  else LbTimeCount.Font.Color:=clBlack;
  LbTimeCount.Caption:=CurrToStr(tTimeCount) + '天';
  // GridGate
  nRow:=1;
  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];
    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);
//////////////////////////////////////////////////////////////////////////////
  if GetTickCount - dwCheckMachIdCount > dwCheckMachIdTime then
  begin
    dwCheckMachIdCount:=GetTickCount;
  end;
//////////////////////////////////////////////////////////////////////////////
end;

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

  try
    if not LoadClientFile then
    begin
      Close;
      exit;
    end;

{$IF DBTYPE = BDE}
    FrmDB.Query.DatabaseName:=sDBName;
{$ELSE}
    FrmDB.Query.ConnectionString:=g_sADODBString;
{$IFEND}

    LoadGameLogItemNameList();
    LoadDenyIPAddrList();
    LoadDenyAccountList();
    LoadDenyChrNameList();
    LoadNoClearMonList();
    LoadDisableDropList();       // 读取禁止掉物列表
    LoadDisableDealList();       // 读取禁止交易列表
    LoadDisableStorageList();    // 读取禁止存仓列表
    LoadDisablePlayTakeOnList(); // 读取禁止人物穿戴列表
    LoadDisableYSTakeOnList();   // 读取禁止元神穿戴列表

    LoadTopPlayList();  // 读取TOPpLAYLIST
    MemoLog.Lines.Add('正在加载物品数据库...');
    nCode:=FrmDB.LoadItemsDB;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('物品数据库加载失败!!!' + 'Code: ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('物品数据库加载成功(%d)...',[UserEngine.StdItemList.Count]));
    MemoLog.Lines.Add('正在加载数据图文件...');
    nCode:= FrmDB.LoadMinMap;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('小地图数据加载失败!!!' + 'Code: ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('小地图数据加载成功...');

    MemoLog.Lines.Add('正在加载地图数据...');
    nCode:= FrmDB.LoadMapInfo;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('地图数据加载失败!!!' + 'Code: ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add(format('地图数据加载成功(%d)...',[g_MapManager.Count]));

    MemoLog.Lines.Add('正在加载怪物数据库...');
    nCode:= FrmDB.LoadMonsterDB;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('加载怪物数据库失败!!!' + 'Code: ' + 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('加载技能数据库失败!!!' + 'Code: ' + 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('加载怪物刷新配置信息失败!!!' + 'Code: ' + 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();
    LoadDisableMoveMap;
    ItemUnit.LoadCustomItemName();
    LoadDisableSendMsgList();
    LoadItemBindIPaddr();
    LoadItemBindAccount();
    LoadItemBindCharName();
    LoadUnMasterList();
    LoadUnForceMasterList();
    MemoLog.Lines.Add('正在加载捆装物品信息...');
    nCode:= FrmDB.LoadUnbindList;
    nCode:=nCode + FrmDB.LoadbindList;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('加载捆装物品信息失败!!!' + 'Code: ' + IntToStr(nCode));
      exit;
    end;
    MemoLog.Lines.Add('加载捆装物品信息成功...');

    MemoLog.Lines.Add('正在加载任务地图信息...');
    nCode:= FrmDB.LoadMapQuest;
    if nCode < 0 then
    begin
      MemoLog.Lines.Add('加载任务地图信息失败!!!');
      exit;
    end;
    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;
    if not LoadLineBanner(g_Config.sNoticeDir + 'BannerNotice.TXT') then
    begin
      MemoLog.Lines.Add('加载广告提示信息失败!!!');
    end;

    MemoLog.Lines.Add('加载公告提示信息成功...');

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

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

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

    Sleep(500);
    g_bostartup:= True;
{$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 SoftVersion <> VERDEMO}
    PlugInEngine.StartM2ServerDLL;
{$IFEND}

    SendGameCenterMsg(SG_CHECKCODEADDR,IntToStr(Integer(@g_CheckCode)));

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

⌨️ 快捷键说明

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