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