svmain.pas
来自「FIR引擎最新源码+注册」· PAS 代码 · 共 1,941 行 · 第 1/5 页
PAS
1,941 行
unit svMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, JSocket, ExtCtrls, Buttons, StdCtrls, IniFiles, M2Share,
Grobal2, SDK, HUtil32, RunSock, Envir, ItmUnit, Magic, NoticeM, Guild, Event,
Castle, FrnEngn, UsrEngn, Mudutil, SyncObjs, Menus, ComCtrls, Grids, ObjBase,
IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, RzCommon, Common,
RzEdit, RzPanel, RzSplit, RzGrids, ImgList;
type
TFrmMain = class(TForm)
Timer1: TTimer;
RunTimer: TTimer;
DBSocket: TClientSocket;
ConnectTimer: TTimer;
StartTimer: TTimer;
SaveVariableTimer: TTimer;
CloseTimer: TTimer;
MainMenu: TMainMenu;
MENU_CONTROL: TMenuItem;
MENU_CONTROL_EXIT: TMenuItem;
MENU_CONTROL_RELOAD_CONF: TMenuItem;
MENU_CONTROL_CLEARLOGMSG: TMenuItem;
MENU_HELP: TMenuItem;
MENU_HELP_ABOUT: TMenuItem;
MENU_MANAGE: TMenuItem;
MENU_CONTROL_RELOAD: TMenuItem;
MENU_CONTROL_RELOAD_ITEMDB: TMenuItem;
MENU_CONTROL_RELOAD_MAGICDB: TMenuItem;
MENU_CONTROL_RELOAD_MONSTERDB: TMenuItem;
MENU_MANAGE_PLUG: TMenuItem;
MENU_OPTION: TMenuItem;
MENU_OPTION_GENERAL: TMenuItem;
MENU_OPTION_SERVERCONFIG: TMenuItem;
MENU_OPTION_GAME: TMenuItem;
MENU_OPTION_FUNCTION: TMenuItem;
MENU_CONTROL_RELOAD_MONSTERSAY: TMenuItem;
MENU_CONTROL_RELOAD_DISABLEMAKE: TMenuItem;
MENU_CONTROL_GATE: TMenuItem;
MENU_CONTROL_GATE_OPEN: TMenuItem;
MENU_CONTROL_GATE_CLOSE: TMenuItem;
MENU_VIEW: TMenuItem;
MENU_VIEW_SESSION: TMenuItem;
MENU_VIEW_ONLINEHUMAN: TMenuItem;
MENU_VIEW_LEVEL: TMenuItem;
MENU_VIEW_LIST: TMenuItem;
MENU_MANAGE_ONLINEMSG: TMenuItem;
MENU_VIEW_KERNELINFO: TMenuItem;
MENU_TOOLS: TMenuItem;
MENU_TOOLS_MERCHANT: TMenuItem;
MENU_TOOLS_NPC: TMenuItem;
MENU_OPTION_ITEMFUNC: TMenuItem;
MENU_TOOLS_MONGEN: TMenuItem;
MENU_CONTROL_RELOAD_STARTPOINT: TMenuItem;
G1: TMenuItem;
MENU_OPTION_MONSTER: TMenuItem;
MENU_TOOLS_IPSEARCH: TMenuItem;
MENU_MANAGE_CASTLE: TMenuItem;
MENU_HELP_REGKEY: TMenuItem;
IdUDPClientLog: TIdUDPClient;
RzSplitter: TRzSplitter;
MemoLog: TRzMemo;
RzSplitter1: TRzSplitter;
Panel: TRzPanel;
Label1: TLabel;
Label2: TLabel;
Label20: TLabel;
Label5: TLabel;
Lbcheck: TLabel;
LbRunSocketTime: TLabel;
LbRunTime: TLabel;
LbTimeCount: TLabel;
LbUserCount: TLabel;
MemStatus: TLabel;
GridGate: TRzStringGrid;
QFunctionNPC: TMenuItem;
LabelVersion: TLabel;
QManageNPC: TMenuItem;
RobotManageNPC: TMenuItem;
MonItems: TMenuItem;
MENU_OPTION_HERO: TMenuItem;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure MemoLogChange(Sender: TObject);
procedure MemoLogDblClick(Sender: TObject);
procedure MENU_CONTROL_EXITClick(Sender: TObject);
procedure MENU_CONTROL_RELOAD_CONFClick(Sender: TObject);
procedure MENU_CONTROL_CLEARLOGMSGClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure MENU_CONTROL_RELOAD_ITEMDBClick(Sender: TObject);
procedure MENU_CONTROL_RELOAD_MAGICDBClick(Sender: TObject);
procedure MENU_CONTROL_RELOAD_MONSTERDBClick(Sender: TObject);
procedure MENU_HELP_ABOUTClick(Sender: TObject);
procedure MENU_OPTION_SERVERCONFIGClick(Sender: TObject);
procedure MENU_OPTION_GENERALClick(Sender: TObject);
procedure MENU_OPTION_GAMEClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MENU_OPTION_FUNCTIONClick(Sender: TObject);
procedure MENU_CONTROL_RELOAD_MONSTERSAYClick(Sender: TObject);
procedure MENU_CONTROL_RELOAD_DISABLEMAKEClick(Sender: TObject);
procedure MENU_CONTROL_GATE_OPENClick(Sender: TObject);
procedure MENU_CONTROL_GATE_CLOSEClick(Sender: TObject);
procedure MENU_CONTROLClick(Sender: TObject);
procedure MENU_VIEW_GATEClick(Sender: TObject);
procedure MENU_VIEW_SESSIONClick(Sender: TObject);
procedure MENU_VIEW_ONLINEHUMANClick(Sender: TObject);
procedure MENU_VIEW_LEVELClick(Sender: TObject);
procedure MENU_VIEW_LISTClick(Sender: TObject);
procedure MENU_MANAGE_ONLINEMSGClick(Sender: TObject);
procedure MENU_VIEW_KERNELINFOClick(Sender: TObject);
procedure MENU_TOOLS_MERCHANTClick(Sender: TObject);
procedure MENU_OPTION_ITEMFUNCClick(Sender: TObject);
procedure MENU_TOOLS_MONGENClick(Sender: TObject);
procedure MENU_CONTROL_RELOAD_STARTPOINTClick(Sender: TObject);
procedure MENU_MANAGE_PLUGClick(Sender: TObject);
procedure G1Click(Sender: TObject);
procedure MENU_OPTION_MONSTERClick(Sender: TObject);
procedure MENU_TOOLS_IPSEARCHClick(Sender: TObject);
procedure MENU_MANAGE_CASTLEClick(Sender: TObject);
procedure MENU_HELP_REGKEYClick(Sender: TObject);
procedure QFunctionNPCClick(Sender: TObject);
procedure QManageNPCClick(Sender: TObject);
procedure RobotManageNPCClick(Sender: TObject);
procedure MonItemsClick(Sender: TObject);
procedure MENU_OPTION_HEROClick(Sender: TObject);
private
boServiceStarted: Boolean;
procedure GateSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure GateSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure GateSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure GateSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure DBSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure DBSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure DBSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure StartTimerTimer(Sender: TObject);
procedure CloseTimerTimer(Sender: TObject);
procedure SaveVariableTimerTimer(Sender: TObject);
procedure RunTimerTimer(Sender: TObject);
procedure ConnectTimerTimer(Sender: TObject);
procedure StartService();
procedure StopService();
procedure SaveItemNumber;
function LoadClientFile(): Boolean;
procedure StartEngine;
procedure MakeStoneMines;
procedure ReloadConfig(Sender: TObject);
procedure ClearMemoLog();
procedure CloseGateSocket();
{ Private declarations }
public
GateSocket: TServerSocket;
procedure AppOnIdle(Sender: TObject; var Done: Boolean);
procedure OnProgramException(Sender: TObject; E: Exception);
procedure SetMenu(); virtual;
procedure MyMessage(var MsgData: TWmCopyData); message WM_COPYDATA;
{ Public declarations }
end;
procedure SaveItemsData;
function LoadAbuseInformation(FileName: string): Boolean;
procedure LoadServerTable();
procedure WriteConLog(MsgList: TStringList);
procedure ChangeCaptionText(Msg: PChar; nLen: Integer); stdcall;
procedure UserEngineThread(ThreadInfo: pTThreadInfo); stdcall;
procedure ProcessGameRun();
procedure TFrmMain_ChangeGateSocket(boOpenGateSocket: Boolean; nCRCA: Integer); stdcall;
var
FrmMain: TFrmMain;
g_GateSocket: TServerSocket;
implementation
uses
LocalDB, InterServerMsg, InterMsgClient, IdSrvClient, FSrvValue, PlugIn,
GeneralConfig, GameConfig, FunctionConfig, ObjRobot, ViewSession,
ViewOnlineHuman, ViewLevel, ViewList, OnlineMsg, ViewKernelInfo,
ConfigMerchant, ItemSet, ConfigMonGen, PlugInManage, EDcode, EDcodeUnit,
GameCommand, MonsterConfig, RunDB, CastleManage, PlugOfEngine, EngineRegister, AboutUnit, HeroConfig;
var
sCaption: string;
l_dwRunTimeTick: LongWord;
boRemoteOpenGateSocket: Boolean = False;
boRemoteOpenGateSocketed: Boolean = False;
boSaveData: Boolean = False;
sChar: string = ' ?';
sRun: string = 'Run';
{$R *.dfm}
procedure ChangeCaptionText(Msg: PChar; nLen: Integer); stdcall;
var
sMsg: string;
begin
if (nLen > 0) and (nLen < 50) then begin
setlength(sMsg, nLen);
Move(Msg^, sMsg[1], nLen);
sCaptionExtText := sMsg;
end;
end;
procedure TFrmMain_ChangeGateSocket(boOpenGateSocket: Boolean; nCRCA: Integer); stdcall;
begin
if nCRCA = nUserLicense then
boRemoteOpenGateSocket := boOpenGateSocket;
end;
function LoadAbuseInformation(FileName: string): Boolean;
var
I: Integer;
sText: string;
begin
Result := False;
if FileExists(FileName) then begin
AbuseTextList.Clear;
AbuseTextList.LoadFromFile(FileName);
I := 0;
while (True) do begin
if AbuseTextList.Count <= I then Break;
sText := Trim(AbuseTextList.Strings[I]);
if sText = '' then begin
AbuseTextList.Delete(I);
Continue;
end;
Inc(I);
end;
Result := True;
end;
end;
procedure LoadServerTable();
var
I, II: Integer;
LoadList: TStringList;
GateList: TStringList;
SrvNetInfo: pTSrvNetInfo;
sLineText, sGateMsg: string;
sServerIdx, sIPaddr, sPort: string;
begin
for I := 0 to ServerTableList.Count - 1 do begin
TList(ServerTableList.Items[I]).Free;
end;
ServerTableList.Clear;
if FileExists('.\!servertable.txt') then begin
LoadList := TStringList.Create;
LoadList.LoadFromFile('.\!servertable.txt');
for I := 0 to LoadList.Count - 1 do begin
sLineText := Trim(LoadList.Strings[I]);
if (sLineText <> '') and (sLineText[1] <> ';') then begin
sGateMsg := Trim(GetValidStr3(sLineText, sGateMsg, [' ', #9]));
if sGateMsg <> '' then begin
GateList := TStringList.Create;
for II := 0 to 30 do begin
if sGateMsg = '' then Break;
sGateMsg := Trim(GetValidStr3(sGateMsg, sIPaddr, [' ', #9]));
sGateMsg := Trim(GetValidStr3(sGateMsg, sPort, [' ', #9]));
if (sIPaddr <> '') and (sPort <> '') then begin
GateList.AddObject(sIPaddr, TObject(Str_ToInt(sPort, 0)));
end;
end;
ServerTableList.Add(GateList);
end;
end;
end;
FreeAndNil(LoadList);
end else begin
ShowMessage('文件!servertable.txt未找到!!!');
end;
end;
procedure WriteConLog(MsgList: TStringList);
var
I: Integer;
Year, Month, Day, Hour, Min, Sec, MSec: Word;
sLogDir, sLogFileName: string;
LogFile: TextFile;
begin
if MsgList.Count <= 0 then Exit;
DecodeDate(Date, Year, Month, Day);
DecodeTime(Time, Hour, Min, Sec, MSec);
if not DirectoryExists(g_Config.sConLogDir) then begin
//CreateDirectory(PChar(g_Config.sConLogDir),nil);
CreateDir(g_Config.sConLogDir);
end;
sLogDir := g_Config.sConLogDir + IntToStr(Year) + '-' + IntToStr2(Month) + '-' + IntToStr2(Day);
if not DirectoryExists(sLogDir) then begin
CreateDirectory(PChar(sLogDir), nil);
end;
sLogFileName := sLogDir + '\C-' + IntToStr(nServerIndex) + '-' + IntToStr2(Hour) + 'H' + IntToStr2((Min div 10 * 2) * 5) + 'M.txt';
AssignFile(LogFile, sLogFileName);
if not FileExists(sLogFileName) then begin
Rewrite(LogFile);
end else begin
Append(LogFile);
end;
for I := 0 to MsgList.Count - 1 do begin
Writeln(LogFile, '1' + #9 + MsgList.Strings[I]);
end; // for
CloseFile(LogFile);
end;
procedure TFrmMain.SaveItemNumber();
var
I: Integer;
begin
try
Config.WriteInteger('Setup', 'ItemNumber', g_Config.nItemNumber);
Config.WriteInteger('Setup', 'ItemNumberEx', g_Config.nItemNumberEx);
for I := Low(g_Config.GlobalVal) to High(g_Config.GlobalVal) do begin
Config.WriteInteger('Setup', 'GlobalVal' + IntToStr(I), g_Config.GlobalVal[I])
end;
for I := Low(g_Config.GlobalAVal) to High(g_Config.GlobalAVal) do begin
Config.WriteString('Setup', 'GlobalStrVal' + IntToStr(I), g_Config.GlobalAVal[I])
end;
Config.WriteInteger('Setup', 'WinLotteryCount', g_Config.nWinLotteryCount);
Config.WriteInteger('Setup', 'NoWinLotteryCount', g_Config.nNoWinLotteryCount);
Config.WriteInteger('Setup', 'WinLotteryLevel1', g_Config.nWinLotteryLevel1);
Config.WriteInteger('Setup', 'WinLotteryLevel2', g_Config.nWinLotteryLevel2);
Config.WriteInteger('Setup', 'WinLotteryLevel3', g_Config.nWinLotteryLevel3);
Config.WriteInteger('Setup', 'WinLotteryLevel4', g_Config.nWinLotteryLevel4);
Config.WriteInteger('Setup', 'WinLotteryLevel5', g_Config.nWinLotteryLevel5);
Config.WriteInteger('Setup', 'WinLotteryLevel6', g_Config.nWinLotteryLevel6);
except
end;
end;
procedure TFrmMain.AppOnIdle(Sender: TObject; var Done: Boolean);
begin
// MainOutMessage ('空闲');
end;
procedure TFrmMain.OnProgramException(Sender: TObject; E: Exception);
begin
MainOutMessage(E.Message);
end;
procedure TFrmMain.DBSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode := 0;
Socket.Close;
end;
procedure TFrmMain.DBSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
tStr: string;
begin
EnterCriticalSection(UserDBSection);
try
tStr := Socket.ReceiveText;
g_Config.sDBSocketRecvText := g_Config.sDBSocketRecvText + tStr;
// MainOutMessage(sDBSocStr[1]);
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;
// sGate,tGate :String;
LogFile: TextFile;
s28: string;
begin
Caption := sCaption + ' [' + sCaptionExtText + ']';
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);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?