📄 svmain.pas
字号:
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] + #2;
// MemoryStream.Write(s28[1],length(s28));
LogUDP.Send(@s28[1],length(s28));
// finally
// MemoryStream.Free;
// end;
end;
LogStringList.Clear;
if LogonCostLogList.Count > 0 then begin
WriteConLog(LogonCostLogList);
end;
LogonCostLogList.Clear;
finally
LeaveCriticalSection(LogMsgCriticalSection);
end;
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;
//检查线程 运行时间
//g_dwEngineRunTime:=GetTickCount - g_dwEngineTick;
tSecond:=(GetTickCount() - g_dwStartTick) div 1000;
wHour:=tSecond div 3600;
wMinute:=(tSecond div 60) mod 60;
wSecond:=tSecond mod 60;
StatusBar.Panels[0].Text := IntToStr(wHour) + ':' +
IntToStr(wMinute) + ':' +
IntToStr(wSecond) + ' ' + sSrvType;{ +
IntToStr(g_dwEngineRunTime) + g_sProcessName + '-' + g_sOldProcessName;}
StatusBar.Panels[1].Text := '(' + IntToStr(UserEngine.MonsterCount) + ') ' +
IntToStr(UserEngine.OnlinePlayObject) + '/' +
IntToStr(UserEngine.PlayObjectCount) + '[' +
IntToStr(UserEngine.LoadPlayCount) + '/' +
IntToStr(UserEngine.m_PlayObjectFreeList.Count) + ']';
{
Label1.Caption:= 'Run' + IntToStr(nRunTimeMin) + '/' + IntToStr(nRunTimeMax) + ' ' +
'Soc' + IntToStr(g_nSockCountMin) + '/' + IntToStr(g_nSockCountMax) + ' ' +
'Usr' + IntToStr(g_nUsrTimeMin) + '/' + IntToStr(g_nUsrTimeMax);
}
Label1.Caption:= format('处理:%d/%d 传输:%d/%d 角色:%d/%d',[nRunTimeMin,nRunTimeMax,g_nSockCountMin,g_nSockCountMax,g_nUsrTimeMin,g_nUsrTimeMax]);
{
Label2.Caption:= 'Hum' + IntToStr(g_nHumCountMin) + '/' + IntToStr(g_nHumCountMax) + ' ' +
'Mon' + IntToStr(g_nMonTimeMin) + '/' + IntToStr(g_nMonTimeMax) + ' ' +
'UsrRot' + IntToStr(dwUsrRotCountMin) + '/' + IntToStr(dwUsrRotCountMax) + ' ' +
'Merch' + IntToStr(UserEngine.dwProcessMerchantTimeMin) + '/' + IntToStr(UserEngine.dwProcessMerchantTimeMax) + ' ' +
'Npc' + IntToStr(UserEngine.dwProcessNpcTimeMin) + '/' + IntToStr(UserEngine.dwProcessNpcTimeMax) + ' ' +
'(' + IntToStr(g_nProcessHumanLoopTime) + ')';
}
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]);
{
Label20.Caption:='MonG' + IntToStr(g_nMonGenTime) + '/' + IntToStr(g_nMonGenTimeMin) + '/' + IntToStr(g_nMonGenTimeMax) + ' ' +
'MonP' + IntToStr(g_nMonProcTime) + '/' + IntToStr(g_nMonProcTimeMin) + '/' + IntToStr(g_nMonProcTimeMax) + ' ' +
'ObjRun' + IntToStr(g_nBaseObjTimeMin) + '/' + IntToStr(g_nBaseObjTimeMax);
}
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]);
tTimeCount:=GetTickCount() / (24 * 60 * 60 * 1000);
{if tTimeCount >= 36 then LbTimeCount.Font.Color:=clBlue
else LbTimeCount.Font.Color:=clBlack;}
StatusBar.Panels[2].Text := CurrToStr(tTimeCount) + 'Mins';
{
//004E5B78
for i:= Low(RunSocket.GateList) to High(RunSocket.GateList) do begin
GateInfo:=@RunSocket.GateList[i];
if GateInfo.boUsed and (GateInfo.Socket <> nil) then begin
if GateInfo.nSendMsgBytes < 1024 then begin
tGate:=IntToStr(GateInfo.nSendMsgBytes) + 'b ';
end else begin//004E5BDA
tGate:=IntToStr(GateInfo.nSendMsgBytes div 1024) + 'kb ';
end;//004E5C0A
sGate:='[G' + IntToStr(i) + ': ' +
IntToStr(GateInfo.nSendMsgCount) + '/' +
IntToStr(GateInfo.nSendRemainCount) + ' ' +
tGate + IntToStr(GateInfo.nSendedMsgCount) + ']' + sGate;
end;//004E5C90
end;
Label3.Caption:=sGate;
}
// GridGate
nRow:=1;
//for i:= Low(RunSocket.GateList) to High(RunSocket.GateList) do begin
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];
//GateInfo:=@RunSocket.GateList[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);
end;
procedure TFrmMain.StartTimerTimer(Sender: TObject);//004E4848
var
nCode:Integer;
begin
SendGameCenterMsg(SG_STARTNOW,'正在启动游戏主程序...');
StartTimer.Enabled:=False;
FrmDB:=TFrmDB.Create();
StartService();
try
if SizeOf(THumData)<> SIZEOFTHUMAN then begin
ShowMessage('SizeOf(THuman) ' + IntToStr(sizeof(THumData)) + ' <> SIZEOFTHUMAN ' + IntToStr(SIZEOFTHUMAN));
Close;
exit;
end;
if not LoadClientFile then begin
Close;
exit;
end;
FrmDB.InitDBM;
LoadGameLogItemNameList();
LoadDenyIPAddrList();
LoadDenyAccountList();
LoadDenyChrNameList();
LoadNoClearMonList();
//thedeath
nEMKills:=0;//make sure all the em values are set
dwEMSpellTick:=GetTickCount();//em value again
dwEMDied:=0;//em didnt die yet
MemoLog.Lines.Add('加载物品数据库...');
nCode:=FrmDB.LoadItemsDB;
if nCode < 0 then begin
if nCode = -3 then MemoLog.Lines.Add('StdItems.DB:没有物品数据请检查!' + '代码= ' + IntToStr(nCode))
else MemoLog.Lines.Add('StdItems.DB:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add(format('物品数据库已加载(%d).',[UserEngine.StdItemList.Count]));
{$IFDEF UseTXT}
//MemoLog.Lines.Add('文件设置:[文本文件]');
{$ELSE}
MemoLog.Lines.Add('文件设置:[数据库]');
{$ENDIF}
MemoLog.Lines.Add('加载地图文件...');
nCode:= FrmDB.LoadMapInfo;
if nCode < 0 then begin
MemoLog.Lines.Add('MapInfo:发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add(format('地图文件以加载(%d).',[g_MapManager.Count]));
{$IFDEF UseTXT}
MemoLog.Lines.Add('加载小地图...');
nCode:= FrmDB.LoadMinMap;
if nCode < 0 then begin
MemoLog.Lines.Add('Minimap.txt:读取这个文件的时候,发生错误。' + '代码: ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('小地图已加载...');
MemoLog.Lines.Add('加载大地图...');
nCode:= FrmDB.LoadBigMap;
if nCode < 0 then begin
MemoLog.Lines.Add('BigMap.txt:读取这个文件的时候,发生错误。' + '代码: ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('大地图已加载...');
{$ENDIF}
nCode:= FrmDB.LoadDecorationList;
if nCode < 0 then begin
MemoLog.Lines.Add('DecoItem.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('装饰物品已加载...');
MemoLog.Lines.Add('加载公会领土信息...');
g_GuildTerritory.LoadAll();
MemoLog.Lines.Add('加载怪物数据库...');
nCode:= FrmDB.LoadMonsterDB;
if nCode < 0 then begin
MemoLog.Lines.Add('Monster.DB:读取这个文件的时候,发生错误。' + '代码= ' + 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('Magic.DB:读取这个文件的时候,发生错误。' + '代码= ' + 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('MonGen.txt:读取这个文件的时候,发生错误。' + '代码= ' + 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();
LoadAllowSellOffItem();
LoadDisableMoveMap;
ItemUnit.LoadCustomItemName();
LoadDisableSendMsgList();
LoadItemBindIPaddr();
LoadItemBindAccount();
LoadItemBindCharName();
LoadUnMasterList();
LoadUnForceMasterList();
MemoLog.Lines.Add('加载释放物品列表信息...');
nCode:= FrmDB.LoadUnbindList;
if nCode < 0 then begin
MemoLog.Lines.Add('UnbindList.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('释放物品列表信息已加载...');
{MemoLog.Lines.Add('正在加载商城商品数据信息...');
nCode:= FrmDB.LoadGameShopItemList();
if nCode < 0 then begin
MemoLog.Lines.Add('GameShopItem.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end; }
//MemoLog.Lines.Add('加载商城商品数据信息...');
{nCode:= FrmDB.LoadGameShopList;
if nCode < 0 then begin
MemoLog.Lines.Add('GameShopList.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end; }
MemoLog.Lines.Add('商城商品数据信息已加载...');
MemoLog.Lines.Add('加载任务触发信息...');
nCode:= FrmDB.LoadMapQuest;
if nCode < 0 then begin
MemoLog.Lines.Add('MapQuest.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('任务触发信息已加载...');
MemoLog.Lines.Add('正在加载地图触发事件信息...');
nCode := FrmDB.LoadMapEvent;
if nCode < 0 then begin
MemoLog.Lines.Add('MapEvent.txt加载地图触发事件信息失败!!!');
Exit;
end;
MemoLog.Lines.Add('加载地图触发事件信息成功...');
MemoLog.Lines.Add('加载QuestDiary\*.txt...');
nCode:= FrmDB.LoadQuestDiary;
if nCode < 0 then begin
MemoLog.Lines.Add('QuestDiary\*.txt:读取这个文件的时候,发生错误。' + '代码= ' + IntToStr(nCode));
exit;
end;
MemoLog.Lines.Add('QuestDiary信息已加载...');
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('Line Notice.txt:读取失败...');
end;
MemoLog.Lines.Add('滚动公告信息已加载...');
FrmDB.LoadAdminList();
MemoLog.Lines.Add('游戏管理员列表已加载...');
g_GuildManager.LoadGuildInfo();
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -