📄 svmain.pas
字号:
{$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('服务器启动异常:' + E.Message);
end;
end;
procedure TFrmMain.StartEngine(); //004E5F2C
var
nCode:Integer;
nCheckCode:Integer;
ResourceString
sExceptionMsg = '[例外] TFrmMain:启动引擎 - Code=%d';
begin
nCheckCode := 0;
try
{$IF IDSOCKETMODE = TIMERENGINE}
FrmIDSoc.Initialize;
MemoLog.Lines.Add('登录服务器连接初始化...');
{$IFEND}
nCheckCode := 1;
g_MapManager.LoadMapDoor;
MemoLog.Lines.Add('地图环境已加载...');
nCheckCode := 2;
MakeStoneMines();
MemoLog.Lines.Add('矿石信息已加载...');
nCheckCode := 3;
nCode:= FrmDB.LoadMerchant;
if nCode < 0 then begin
MemoLog.Lines.Add('Merchant.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('商人脚本已加载...');
nCheckCode := 4;
if not g_Config.boVentureServer then begin
nCode:= FrmDB.LoadGuardList;
if nCode < 0 then begin
MemoLog.Lines.Add('Guardlist.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
end;
MemoLog.Lines.Add('卫士列表脚本已加载...');
end;
nCheckCode := 5;
nCode:= FrmDB.LoadNpcs;
if nCode < 0 then begin
MemoLog.Lines.Add('Npc.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('Npc脚本已加载...');
nCheckCode := 6;
nCode:= FrmDB.LoadMakeItem;
if nCode < 0 then begin
MemoLog.Lines.Add('MakeItem.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('物品合成脚本已加载...');
nCheckCode := 7;
nCode:= FrmDB.LoadStartPoint;
if nCode < 0 then begin
MemoLog.Lines.Add('StartPoint.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
Close;
end;
MemoLog.Lines.Add('安全区复活点脚本已加载...');
nCheckCode := 8;
FrontEngine.Resume;
MemoLog.Lines.Add('人物数据引擎启动成功..');
nCheckCode := 9;
UserEngine.Initialize;
MemoLog.Lines.Add('游戏处理引擎初始化成功..');
nCheckCode := 10;
if (not DirectoryExists(g_Config.sEnvirDir+ 'Memo_Saved')) then begin
if (not CreateDir(g_Config.sEnvirDir+ 'Memo_Saved')) then
MemoLog.Lines.Add('错误:Memo_Saved目录不能被创建.');
end;
if not DirectoryExists(g_Config.sEnvirDir+ 'Friend_Saved') then begin
if (not CreateDir(g_Config.sEnvirDir+ 'Friend_Saved')) then
MemoLog.Lines.Add('错误:Friend_Saved目录不能被创建.');
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('加载客户端版本信息和服务器名字...');
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('加载客户端版本信息失败,检测!setup.txt文件 -> [setup] -> clientfile1,..');
MemoLog.Lines.Add('确定你的版本信息文件复制于客户段exe文件到M2文件夹,而且有相同的名字设置到!setup.txt');
Result:=TRUE;
end;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
var
nX,nY:Integer;
ResourceString
sGateIdx = '网关';
sGateIPaddr = '网关地址';
sGateListMsg = '队列数据';
sGateSendCount = '发送数据';
sGateMsgCount = '剩余数据';
sGateSendKB = '平均流量';
sGateUserCount = '最高人数';
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);
GateSocket.OnClientConnect := GateSocketClientConnect;
GateSocket.OnClientDisconnect := GateSocketClientDisconnect;
GateSocket.OnClientError := GateSocketClientError;
GateSocket.OnClientRead := GateSocketClientRead;
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;
StartTimer.Enabled := True;
end;
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
ResourceString
sCloseServerYesNo = '你确定你想要关服务器吗?';
sCloseServerTitle = '确定';
begin
if not boServiceStarted then begin
// Application.Terminate;
exit;
end;
if g_boExitServer then begin
boStartReady:=False;
StopService();
// Sleep(500);
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;
RunSocket.CloseAllGate;
GateSocket.Close;
CloseTimer.Enabled:=True;
{$IF IniSystem = 1}
SaveSettings;
{$IFEND}
end;
end;
procedure TFrmMain.CloseTimerTimer(Sender: TObject);
ResourceString
sCloseServer = '%s [玩家信息保存中(%d/%d)...]';
begin
Caption:=format(sCloseServer,[g_Config.sServerName,UserEngine.OnlinePlayObject,FrontEngine.SaveListCount]);
if UserEngine.OnlinePlayObject = 0 then begin
if FrontEngine.IsIdle then begin
CloseTimer.Enabled:=False;
Application.Terminate;
end;
end;
end;
procedure TFrmMain.SaveVariableTimerTimer(Sender: TObject);
begin
{$IF IniSystem = 1}
SaveSettings;
{$ELSE}
SaveItemNumber();
{$IFEND}
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.Run;
{$IF IDSOCKETMODE = TIMERENGINE}
FrmIDSoc.Run;
{$IFEND}
UserEngine.Run;
g_GuildTerritory.Run;
{$IF USERENGINEMODE = TIMERENGINE}
ProcessGameRun();
{$IFEND}
//EventManager.Run;
if nServerIndex = 0 then
FrmSrvMsg.Run
else FrmMsgClient.Run;
end;
Inc(n4EBD1C);
if (GetTickCount - g_dwRunTick) > 250 then begin
g_dwRunTick:=GetTickCount();
nRunTimeMin:=n4EBD1C;
if nRunTimeMax > nRunTimeMin then nRunTimeMax:=nRunTimeMin;
n4EBD1C:=0;
end;
if boRemoteOpenGateSocket then begin
if not boRemoteOpenGateSocketed then begin
boRemoteOpenGateSocketed:=True;
try
if assigned(g_GateSocket) then begin
g_GateSocket.Active:=True;
end;
except
on e: Exception do begin
MainOutMessage(E.Message);
end;
end;
end;
end;
end;
procedure TFrmMain.ConnectTimerTimer(Sender: TObject);
begin
if DBSocket.Active then exit;
DBSocket.Active:=True;
end;
procedure TFrmMain.ReloadConfig(Sender: TObject);
begin
try
{$IF IniSystem = 1}
LoadSettings;
{$ELSE}
LoadConfig();
{$IFEND}
// LoadMonSayMsg();
FrmIDSoc.Timer1Timer(Sender);
if not (nServerIndex = 0) then begin
if not FrmMsgClient.MsgClient.Active then begin
FrmMsgClient.MsgClient.Active:=True;
end;
end;
LogUDP.Close;
LogUDP.Proto := 'UDP';
LogUDP.Addr :=g_Config.sLogServerAddr;
LogUDP.Port := inttostr(g_Config.nLogServerPort);
LogUDP.Connect;
LoadServerTable();
LoadClientFile();
finally
end;
end;
procedure TFrmMain.MemoLogChange(Sender: TObject);
begin
if MemoLog.Lines.Count > 500 then MemoLog.Clear;
end;
procedure TFrmMain.MemoLogDblClick(Sender: TObject);
begin
ClearMemoLog();
end;
procedure TFrmMain.MENU_CONTROL_EXITClick(Sender: TObject);
begin
Close;
end;
procedure TFrmMain.MENU_CONTROL_RELOAD_CONFClick(Sender: TObject);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -