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