📄 svmain.~pas
字号:
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 + -