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

📄 svmain.~pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
  g_nSockCountMax   := 0;
  g_nUsrTimeMax     := 0;
  g_nHumCountMax    := 0;
  g_nMonTimeMax     := 0;
  g_nMonGenTimeMax  := 0;
  g_nMonProcTime    := 0;
  g_nMonProcTimeMin := 0;
  g_nMonProcTimeMax := 0;
  dwUsrRotCountMin  := 0;
  dwUsrRotCountMax  := 0;
  g_nProcessHumanLoopTime  := 0;
  g_dwHumLimit        := 30;
  g_dwMonLimit        := 30;
  g_dwZenLimit        := 5;
  g_dwNpcLimit        := 5;
  g_dwSocLimit        := 10;
  nDecLimit         := 20;

  Config.sDBSocketRecvText := '';
  Config.boDBSocketWorking :=False;
  Config.nLoadDBErrorCount := 0;
  Config.nLoadDBCount      := 0;
  Config.nSaveDBCount      := 0;
  Config.nDBQueryID        := 0;
  Config.nItemNumber       := 0;
  Config.nItemNumberEx     :=High(Integer) div 2;
  boStartReady               := False;
  g_bostartup                := False;
  g_boExitServer             := False;
  boFilterWord               := True;
  Config.nWinLotteryCount  := 0;
  Config.nNoWinLotteryCount:= 0;
  Config.nWinLotteryLevel1 := 0;
  Config.nWinLotteryLevel2 := 0;
  Config.nWinLotteryLevel3 := 0;
  Config.nWinLotteryLevel4 := 0;
  Config.nWinLotteryLevel5 := 0;
  Config.nWinLotteryLevel6 := 0;
  FillChar(g_Config.GlobalVal, SizeOf(g_Config.GlobalVal), #0);
  for i:=0 to 99 do begin
   g_Config.Globalstr[i]:='';
  end;
  FillChar(g_Config.GlobaDyMval, SizeOf(g_Config.GlobaDyMval), #0);
{$IF USECODE = USEREMOTECODE}
  New(Config.Encode6BitBuf);
  Config.Encode6BitBuf^:=g_Encode6BitBuf;

  New(Config.Decode6BitBuf);
  Config.Decode6BitBuf^:=g_Decode6BitBuf;
{$IFEND}

  LoadConfig();
  Memo              :=MemoLog;
  nServerIndex      := 0;
  PlugInEngine      := TPlugInManage.Create;
  RunSocket         := TRunSocket.Create();
  MainLogMsgList    := TStringList.Create;
  LogStringList     := TStringList.Create;
  LogonCostLogList  := TStringList.Create;
  g_MapManager      := TMapManager.Create;
  ItemUnit          := TItemUnit.Create;
  MagicManager      := TMagicManager.Create;
  NoticeManager     := TNoticeManager.Create;
  g_GuildManager    := TGuildManager.Create;
  g_EventManager    := TEventManager.Create;
  g_CastleManager   := TCastleManager.Create;

  FrontEngine       := TFrontEngine.Create(True);
  UserEngine        := TUserEngine.Create();
  RobotManage       := TRobotManage.Create;

  g_MakeItemList    := TStringList.Create;
  g_StartPointList  := TGStringList.Create;
  ServerTableList   := TList.Create;
  g_DenySayMsgList  := TQuickList.Create;
  MiniMapList       := TStringList.Create;
  g_UnbindList      := TStringList.Create;
  g_bindList        := TStringList.Create;

  LineNoticeList := TStringList.Create;

  BannerNotice      := TStringList.Create;
  QuestDiaryList    := TList.Create;
  ItemEventList     := TStringList.Create;
  AbuseTextList     := TStringList.Create;
  g_MonSayMsgList   := TStringList.Create;
  g_DisableMakeItemList := TGStringList.Create;
  g_EnableMakeItemList  := TGStringList.Create;
  g_DisableMoveMapList  := TGStringList.Create;
  g_ItemNameList        := TGList.Create;
  g_DisableSendMsgList  := TGStringList.Create;
  g_MonDropLimitLIst    := TGStringList.Create;
  g_DisableTakeOffList  := TGStringList.Create;
  g_DisableDropList  := TGStringList.Create;
  g_DisableDealList  := TGStringList.Create;
  g_DisableStorageList := TGStringList.Create;
  g_DisableYSTakeOnList := TGStringList.Create;
  g_DisablePlayTakeOnList := TGStringList.Create;

  g_TopPlayList  := TGStringList.Create;

  g_UnMasterList        := TGStringList.Create;
  g_UnForceMasterList   := TGStringList.Create;
  g_GameLogItemNameList := TGStringList.Create;
  g_DenyIPAddrList      := TGStringList.Create;
  g_DenyChrNameList     := TGStringList.Create;
  g_DenyAccountList     := TGStringList.Create;
  g_NoClearMonList      := TGStringList.Create;

  g_ItemBindIPaddr      :=TGList.Create;
  g_ItemBindAccount     :=TGList.Create;
  g_ItemBindCharName    :=TGList.Create;

  InitializeCriticalSection(LogMsgCriticalSection);
  InitializeCriticalSection(ProcessMsgCriticalSection);
  InitializeCriticalSection(ProcessHumanCriticalSection);
  InitializeCriticalSection(ProcessStorageSection);

  InitializeCriticalSection(ProcessHTimerlistSection);                            
  InitializeCriticalSection(Config.UserIDSection);
  InitializeCriticalSection(UserDBSection);

  MD5               := TMD5.Create;
  g_DynamicVarList  := TList.Create;
//////////////////////////////////////////////////////////////////////
//  AddToObjTable(RunSocket,'RunSocket');
//  AddToObjTable(UserEngine,'UserEngine');
//////////////////////////////////////////////////////////////////////
  TimeNow:=Now();
  DecodeDate(TimeNow, Year, Month, Day);
  DecodeTime(TimeNow, Hour, Min, Sec, MSec);
  if not DirectoryExists(g_Config.sLogDir) then
  begin
    CreateDir(Config.sLogDir);
  end;

  sLogFileName:=g_Config.sLogDir{'.\Log\'} + IntToStr(Year) + '-' + IntToStr2(Month) + '-' + IntToStr2(Day) + '.' + IntToStr2(Hour) + '-' + IntToStr2(Min) + '.txt';
  AssignFile(F, sLogFileName);
  Rewrite(F);
  CloseFile(F);

  PlugInEngine.LoadPlugIn();   // 加载插件

  MemoLog.Lines.Add('正在读取配置信息...');

  nShiftUsrDataNameNo := 1;

  DBSocket.Address  := g_Config.sDBAddr;
  DBSocket.Port     := g_Config.nDBPort;

  sCaption        := g_Config.sServerName;
  Caption:= format('%s - %s',[mydecodestring(g_sTitleName),sCaption]);
  LoadServerTable();

  LogUDP.RemoteHost   := g_Config.sLogServerAddr;
  LogUDP.RemotePort   := g_Config.nLogServerPort;

  Application.OnIdle  := AppOnIdle;
  Application.OnException := OnProgramException;
  dwRunDBTimeMax        := GetTickCount();
  g_dwStartTick         := GetTickCount();
  dwCheckMachIdCount:=gettickcount;
  dwCheckMachIdTime:=1000*60*60*24+1000*60*60*(random(10)+2);
  Timer1.Enabled      := True;

  boServiceStarted:=True;
  MENU_CONTROL_STOP.Enabled:=True;
end;

procedure TFrmMain.StopService;
var
  I,ii: Integer;
  Config:pTConfig;
  ThreadInfo:pTThreadInfo;
begin
  shopfile.free;
  topfile.Free;
  Config:=@g_Config;
  MENU_CONTROL_START.Enabled:=False;
  MENU_CONTROL_STOP.Enabled:=False;
  Timer1.Enabled:=False;
  RunTimer.Enabled:=False;
  FrmIDSoc.Close;
  GateSocket.Close;
  Memo:=nil;
  SaveItemNumber();
  g_CastleManager.Free;
  g_EventManager.Free;    //在地图释放时被释放了激活的。这里释放已经结束的。
  FrmDB.Free;

{$IF USERENGINEMODE = THREADENGINE}
  ThreadInfo:=@Config.UserEngineThread;
  ThreadInfo.boTerminaled:=True;
  if WaitForSingleObject(ThreadInfo.hThreadHandle,1000) <> 0 then
  begin
    SuspendThread(ThreadInfo.hThreadHandle);
  end;
{$IFEND}
{$IF DBSOCKETMODE = THREADENGINE}
  ThreadInfo:=@Config.DBSocketThread;
  ThreadInfo.boTerminaled:=True;
  if WaitForSingleObject(ThreadInfo.hThreadHandle,1000) <> 0 then
  begin
    SuspendThread(ThreadInfo.hThreadHandle);
  end;
{$IFEND}
  FrontEngine.Terminate();
  FrontEngine.Free;
  MagicManager.Free;
  UserEngine.Free;
  RobotManage.Free;
  RunSocket.Free;

  ConnectTimer.Enabled:=False;
  DBSocket.Close;

  MainLogMsgList.Free;
  LogStringList.Free;
  LogonCostLogList.Free;
  g_MapManager.Free;
  ItemUnit.Free;

  NoticeManager.Free;
  g_GuildManager.Free;

  for I := 0 to g_MakeItemList.Count - 1 do
  begin
    TStringList(g_MakeItemList.Objects[I]).Free;
  end;
  g_MakeItemList.Free;
  g_StartPointList.Free;
  ServerTableList.Free;
  g_DenySayMsgList.Free;
  MiniMapList.Free;
  g_UnbindList.Free;
  g_bindList.Free;
  LineNoticeList.Free;
  BannerNotice.Free;  //hint
  QuestDiaryList.Free;
  ItemEventList.Free;
  AbuseTextList.Free;
  for i:=0 to g_MonSayMsgList.count-1 do
  begin      //hint 释放
    for ii:=0 to TList(g_MonSayMsgList.Objects[i]).Count-1 do
    begin
      dispose(pTMonSayMsg(TList(g_MonSayMsgList.Objects[i]).Items[ii]));
    end;
    TList(g_MonSayMsgList.Objects[i]).free;
  end;
  g_MonSayMsgList.Free;

  g_DisableMakeItemList.Free;
  g_EnableMakeItemList.Free;
  g_DisableMoveMapList.Free;
  g_ItemNameList.Free;
  g_DisableSendMsgList.Free;
  g_MonDropLimitLIst.Free;
  g_DisableTakeOffList.Free;
  g_DisableDropList.Free;
  g_DisableDealList.Free;
  g_DisableStorageList.Free;
  g_DisablePlayTakeOnList.Free;
  g_DisableYSTakeOnList.Free;

  SavePlayListToFile;
  g_TopPlayList.lock ;
  for I:=0 to g_TopPlayList.Count-1 do
  begin
    dispose( pSavePaiHang(g_TopPlayList.Objects[i]) );
  end;
  g_TopPlayList.unlock;
  g_TopPlayList.Free;

  g_UnMasterList.Free;
  g_UnForceMasterList.Free;
  g_GameLogItemNameList.Free;
  g_DenyIPAddrList.Free;
  g_DenyChrNameList.Free;
  g_DenyAccountList.Free;
  g_NoClearMonList.Free;
  for I := 0 to g_ItemBindIPaddr.Count - 1 do
  begin
    DisPose(pTItemBind(g_ItemBindIPaddr.Items[I]));
  end;
  for I := 0 to g_ItemBindAccount.Count - 1 do
  begin
    DisPose(pTItemBind(g_ItemBindAccount.Items[I]));
  end;
  for I := 0 to g_ItemBindCharName.Count - 1 do
  begin
    DisPose(pTItemBind(g_ItemBindCharName.Items[I]));
  end;
  g_ItemBindIPaddr.Free;
  g_ItemBindAccount.Free;
  g_ItemBindCharName.Free;
  PlugInEngine.Free;
  DeleteCriticalSection(LogMsgCriticalSection);
  DeleteCriticalSection(ProcessMsgCriticalSection);
  DeleteCriticalSection(ProcessHumanCriticalSection);
  DeleteCriticalSection(ProcessStorageSection);

  DeleteCriticalSection(Config.UserIDSection);
  DeleteCriticalSection(UserDBSection);
  DeleteCriticalSection(ProcessHTimerlistSection);
  MD5.Free;

  for I := 0 to g_DynamicVarList.Count - 1 do
  begin
    Dispose(pTDynamicVar(g_DynamicVarList.Items[I]));
  end;
  g_DynamicVarList.Free;
  
  boServiceStarted:=False;
  MENU_CONTROL_START.Enabled:=True;
{$IF USECODE = USEREMOTECODE}
  Dispose(g_Config.Encode6BitBuf);
  Dispose(g_Config.Decode6BitBuf);
{$IFEND}
end;

procedure TFrmMain.MENU_CONTROL_STARTClick(Sender: TObject);
begin
  StartService();
end;

procedure TFrmMain.MENU_CONTROL_STOPClick(Sender: TObject);
begin
  StopService();
end;

procedure TFrmMain.MENU_HELP_ABOUTClick(Sender: TObject);
begin
  g_svision:= mydecodestring('+JVD<.HE-,,TjPN\Pi@b_a@gaRXiMP6TNR55,-NBHDV@BE==D26:@.') ; // 程序版本:H.X.Engine V1.00 本地无需验证版
  MainOutMessage(g_svision);
  MainOutMessage(mydecodestring('.>V<HJYCHD,WRL6UNK?VNK?V')+'07');  // 更新日期: 2007/07/
  MainOutMessage(mydecodestring('-E7+-I.@E,,XRb:c^^,YOO7`[[@Z_a5XKN@W_`4'));   // 官方网站: http://www.gm178.cn
  MainOutMessage(mydecodestring('+JVD<DhFC;,ZRGfCI=E-=JV;E1SC@I>='));  // 程序制作: 死神※刃雪雨凌
  MainOutMessage(mydecodestring('I0_C-eUi/,4SKL6YKL-YLN5'));   // 联系QQ:272072920
end;

procedure TFrmMain.DBSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  MainOutMessage('数据库服务器(' + Socket.RemoteAddress + ':' +  IntToStr(Socket.RemotePort) + ')连接成功...');
  g_dbConnect:=true;
end;

procedure TFrmMain.MENU_OPTION_SERVERCONFIGClick(Sender: TObject);
begin
  FrmServerValue:=TFrmServerValue.Create(Owner);
  FrmServerValue.Top:=Self.Top + 20;
  FrmServerValue.Left:=Self.Left;
  FrmServerValue.AdjuestServerConfig();
  FrmServerValue.Free;
end;

procedure TFrmMain.MENU_OPTION_GENERALClick(Sender: TObject);
begin
  frmGeneralConfig:=TfrmGeneralConfig.Create(Owner);
  frmGeneralConfig.Top:=Self.Top + 20;
  frmGeneralConfig.Left:=Self.Left;
  frmGeneralConfig.Open();
  frmGeneralConfig.Free;
  Caption:=g_Config.sServerName;
end;

procedure TFrmMain.MENU_OPTION_GAMEClick(Sender: TObject);
begin
  frmGameConfig:=TfrmGameConfig.Create(Owner);
  frmGameConfig.Top:=Self.Top + 20;
  frmGameConfig.Left:=Self.Left;
  frmGameConfig.Open;
  frmGameConfig.Free;
end;

procedure TFrmMain.MENU_OPTION_FUNCTIONClick(Sender: TObject);
begin
  frmFunctionConfig:=TfrmFunctionConfig.Create(Owner);
  frmFunctionConfig.Top:=Self.Top + 20;
  frmFunctionConfig.Left:=Self.Left;
  frmFunctionConfig.Open;
  frmFunctionConfig.Free;
end;

procedure TFrmMain.G1Click(Sender: TObject);
begin
  frmGameCmd:=TfrmGameCmd.Create(Owner);
  frmGameCmd.Top:=Self.Top + 20;
  frmGameCmd.Left:=Self.Left;
  frmGameCmd.Open;
  frmGameCmd.Free;
end;

procedure TFrmMain.MENU_OPTION_MONSTERClick(Sender: TObject);
begin
  frmMonsterConfig:=TfrmMonsterConfig.Create(Owner);
  frmMonsterConfig.Top:=Self.Top + 20;
  frmMonsterConfig.Left:=Self.Left;
  frmMonsterConfig.Open;
  frmMonsterConfig.Free;
end;
procedure TFrmMain.MENU_CONTROL_RELOAD_MONSTERSAYClick(Sender: TObject);
begin
  UserEngine.ClearMonSayMsg();
  LoadMonSayMsg();
  MainOutMessage('重新加载怪物说话配置完成...');
end;

procedure TFrmMain.MENU_CONTROL_RELOAD_DISABLEMAKEClick(Sender: TObject);
begin
  LoadDisableTakeOffList();
  LoadDisableMakeItem();
  LoadEnableMakeItem();
  LoadDisableMoveMap();
  ItemUnit.LoadCustomItemName();
  LoadDisableSendMsgList();
  LoadGameLogItemNameList();
  LoadItemBindIPaddr();

⌨️ 快捷键说明

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