依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 38|回复: 0

[游戏架设教程] DELPHI版传奇引擎学习菜鸟篇(applem2)-01

[复制链接] 主动推送

2043

主题

2050

帖子

3114

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3114
发表于 2024-11-2 23:50:26 | 显示全部楼层 |阅读模式
DELPHI版传奇引擎学习菜鸟篇(applem2)-01
后续所有内容都是我自己学习DELPHI过程中对程序设计的一点浅显的了解,有的也许会引发前辈门笑喷,但是这恰是我学习的成长过程,也是我提高的途径.

DELPHI版传奇引擎学习菜鸟篇(applem2)-01

DELPHI版传奇引擎学习菜鸟篇(applem2)-01

大部分名字都叫MirServer,基本结构包含八个文件夹和一个GAMECENTER.EXE文件和一个CONFIG.INI文件,以下按照启动顺序说明.
applem2的还有个排行榜的,我想大部分端应该集成在M2里边了吧.
2.源代码结构
服务端只有一个Server.exe程序,其他服务都集成到一个父窗口中,然后根据主程序设置决定需要启动那些服务,毕竟传奇架设的时候有些服务可能不在一个服务器上,虽然是菜鸟,但是咱也得考虑远一点,学习前辈们的一些先进理念,也是拓展了自己的学习思路.
先说说启动中心,不说别的,光是主窗口4000多行的代码就让我眼花缭乱了,这对我来说太难了,有的过程或函数快300行了,阅读比较困难,还是先从自己的角度去理解吧.
GAMECENTER工程架构如下(名字都是从自己理解的角度起的):
  1. //本身包含的单元
  2. ugamecenter.pas     // 主窗口单元
  3. GShare.pas          // 全局常量单元
  4. DataBackUp.pas      // 数据备份单元
  5. //引用的单元
  6. DBShare.pas         // 共享数据单元
  7. HUtil32.pas         // 人物操作单元
  8. MD5Unit.pas         // 数据校验单元
  9. Common.pas          // 通用常量单元
复制代码
3.1 GShare.pas单元
单元之间的引用很复杂,也许是因为早起代码的原因吧,先说说GShare.pas单元,这个单元包含了服务器的配置常量,如文件夹名字\服务状态\配置文件等全局常量和服务的启动\停止函数以及消息处理过程,先记录一点自己能够理解的.
  1. unit GShare;

  2. interface
  3. uses
  4.   Windows, Messages, Classes, SysUtils, INIFiles, DataBackUp, ComCtrls;

  5. const
  6.   MAXRUNGATECOUNT = 8;  // 最大游戏网关数量
  7.   {以下0-9是每个服务的消息编号常量}
  8.   tDBServer = 0;
  9.   tLoginSrv = 1;
  10.   tLogServer = 2;
  11.   tM2Server = 3;
  12.   tLoginGate = 4;
  13.   tSelGate = 6;
  14.   tRunGate = 8;
  15.   tPlugTop = 9;
  16.   {不言而喻,这里是服务配置INI文件的节名称常量}
  17.   BasicSectionName = 'GameConfig';
  18.   DBServerSectionName = 'DBServer';
  19.   LoginSrvSectionName = 'LoginSrv';
  20.   M2ServerSectionName = 'M2Server';
  21.   LogServerSectionName = 'LogServer';
  22.   RunGateSectionName = 'RunGate';
  23.   SelGateSectionName = 'SelGate';
  24.   LoginGateSectionName = 'LoginGate';
  25.   PlugTopSectionName='PlugTop';
  26.   {IP设置,APPLEM2自带一机双IP设置}
  27.   sAllIPaddr = '0.0.0.0';
  28.   sLocalIPaddr = '127.0.0.1';
  29.   sLocalIPaddr2 = '127.0.0.2';
  30.   nLimitOnlineUser = 2000;    //服务器最高上线人数(源码自带注释)
  31.   {以下是各个服务的配置路径和文件常量}
  32.   SERVERCONFIGDIR = 'Config\';
  33.   SERVERCONFIGFILE = 'Config.ini';
  34.   SERVERGAMEDATADIR = 'GameData\';
  35.   SERVERLOGDIR = 'Log\';

  36.   DBSERVERSECTIONNAME2 = 'DBServer';
  37.   DBSERVERDBDIR = 'DB\';
  38.   DBSERVERALLOWADDR = 'AllowAddr.txt';
  39.   DBSERVERGATEINFO = 'GateInfo.txt';

  40.   LOGINSRVSECTIONNAME2 = 'LoginSrv';
  41.   LOGINSRVCHRLOGNAME = SERVERLOGDIR + 'ChrLog\';
  42.   LOGINSRVALLOWADDR = 'LoginSrv_AllowAddr.txt';
  43.   LOGINSRVGETINFO = 'LoginSrv_GateInfo.txt';
  44.   LOGINSRVUSERLIMIT = 'LoginSrv_UserLimit.txt';

  45.   M2SERVERCONFIGFILE = '!Setup.txt';
  46.   M2SERVERSECTIONNAME1 = 'Server';
  47.   M2SERVERSECTIONNAME2 = 'Share';
  48.   M2SERVERSEGuildBase = SERVERGAMEDATADIR + 'GuildBase\';
  49.   M2SERVERSEGuildDir = M2SERVERSEGuildBase + 'Guilds\';
  50.   M2SERVERSEGuildFile = M2SERVERSEGuildBase + 'GuildList.txt';
  51.   M2SERVERSEConLogDir = SERVERLOGDIR + 'M2ConLog\';
  52.   M2SERVERSECastleDir = SERVERGAMEDATADIR + 'Castle\';
  53.   M2SERVERSECastleFile = SERVERGAMEDATADIR + 'Castle\List.txt';
  54.   M2SERVERSELogDir = SERVERLOGDIR + 'M2Log\';
  55.   M2SERVERSEEMailDir = SERVERLOGDIR + 'M2Log\';
  56.   M2SERVERSEnvirDir = 'Envir\';
  57.   M2SERVERSMapDir = 'Map\';
  58.   M2SERVERSALLOWADDR = 'M2Server_AllowAddr.txt';
  59.   M2SERVERSEmailDir = SERVERGAMEDATADIR + 'EMail\';

  60.   LOGSERVERSECTIONNAME2 = 'LogDataServer';
  61.   LOGSERVERBaseDir = SERVERGAMEDATADIR + 'GameLog\';
  62.   RunGateSectionName2 = 'RunGate';
  63.   SelGateSectionName2 = 'SelGate';
  64.   LoginGateSectionName2 = 'LoginGate';
  65.   PlugTopDIR=SERVERGAMEDATADIR +'\mir200\';

  66. type
  67.   {定义每个服务的应用程序状态结构指针}
  68.   pTProgram = ^TProgram;
  69.   TProgram = packed record
  70.     boGetStart: Boolean; //DBServer启动标志 (源码自带注释)
  71.     boReStart: Boolean; //程序异常停止,是否重新启动 (源码自带注释)
  72.     btStartStatus: Byte;//0,1,2,3 未启动,正在启动,已启动,正在关闭 (源码自带注释)
  73.     sProgramFile: string[50];
  74.     sDirectory: string[100];
  75.     ProcessInfo: TProcessInformation; //服务的进程信息(进程,线程,进程ID,线程ID)
  76.     ProcessHandle: THandle;           //进程句柄
  77.     MainFormHandle: THandle;          //主窗口句柄,后续改为每个服务对应的活动窗口句柄
  78.     nMainFormX: Integer;  //服务端启动后窗口位置
  79.     nMainFormY: Integer;
  80.   end;
  81.   {应该是加载地图文件的结构指针}
  82.   pTDataListInfo = ^TDataListInfo;
  83.   TDataListInfo = packed record
  84.     sFileName: string[255];
  85.     MapFileHandle: THandle;
  86.     MapFileBuffer: PChar;
  87.     DateTime: TDateTime;
  88.     Data: PChar;
  89.     DataSize: Integer;
  90.     Item: TListItem;
  91.   end;
  92.   {检测服务运行状态}
  93.   TCheckCode = packed record
  94.     dwThread0: LongWord;
  95.     sThread0: string;
  96.   end;
  97.   {下边的一堆CONFIG是对应的每个服务状态的结构}
  98.   TDBServerConfig = packed record
  99.     MainFormX: Integer;
  100.     MainFormY: Integer;
  101.     GatePort: Integer;
  102.     ServerPort: Integer;
  103.     GetStart: Boolean;
  104.     ProgramFile: string[50];
  105.   end;

  106.   TLoginSrvConfig = packed record
  107.     MainFormX: Integer;
  108.     MainFormY: Integer;
  109.     GatePort: Integer;
  110.     ServerPort: Integer;
  111.     MonPort: Integer;
  112.     GetStart: Boolean;
  113.     ProgramFile: string[50];
  114.   end;

  115.   TM2ServerConfig = packed record
  116.     MainFormX: Integer;
  117.     MainFormY: Integer;
  118.     GatePort: Integer;
  119.     MsgSrvPort: Integer;
  120.     GetStart: Boolean;
  121.     ProgramFile: string[50];
  122.   end;

  123.   TLogServerConfig = packed record
  124.     MainFormX: Integer;
  125.     MainFormY: Integer;
  126.     Port: Integer;
  127.     GetStart: Boolean;
  128.     ProgramFile: string[50];
  129.   end;

  130.     TPlugTopConfig = packed record
  131.     MainFormX: Integer;
  132.     MainFormY: Integer;
  133.     Port: Integer;
  134.     GetStart: Boolean;
  135.     ProgramFile: string[50];
  136.   end;

  137.   TRunGateConfig = packed record
  138.     MainFormX: Integer;
  139.     MainFormY: Integer;
  140.     GetStart: array[0..MAXRUNGATECOUNT - 1] of Boolean;
  141.     GatePort: array[0..MAXRUNGATECOUNT - 1] of Integer;
  142.     ProgramFile: string[50];
  143.   end;

  144.   TSelGateConfig = packed record
  145.     MainFormX: Integer;
  146.     MainFormY: Integer;
  147.     GatePort: array[0..1] of Integer;
  148.     GetStart1: Boolean;
  149.     GetStart2: Boolean;
  150.     ProgramFile: string[50];
  151.   end;

  152.   TLoginGateConfig = packed record
  153.     MainFormX: Integer;
  154.     MainFormY: Integer;
  155.     GatePort: Integer;
  156.     GetStart: Boolean;
  157.     ProgramFile: string[50];
  158.   end;
  159.   {将所有的服务状态声明为一个结构指针}
  160.   pTConfig = ^TConfig;
  161.   TConfig = packed record
  162.     DBServer: TDBServerConfig;
  163.     LoginSrv: TLoginSrvConfig;
  164.     M2Server: TM2ServerConfig;
  165.     LogServer: TLogServerConfig;
  166.     RunGate: TRunGateConfig;
  167.     SelGate: TSelGateConfig;
  168.     LoginGate: TLoginGateConfig;
  169.     PlugTop: TPlugTopConfig;
  170.   end;

  171.   procedure LoadConfig();  //加载启动设置
  172.   procedure SaveConfig();  //保存启动设置
  173.   {下边2个是启动和停止每个服务的函数}
  174.   function RunProgram(var ProgramInfo: TProgram; sHandle: string; dwWaitTime: LongWord): LongWord;
  175.   function StopProgram(var ProgramInfo: TProgram; dwWaitTime: LongWord): Integer;
  176.   {发送每个服务当前状态的消息处理过程}
  177.   procedure SendProgramMsg(DesForm: THandle; wIdent: Word; sSendMsg: string);
复制代码
先将学习过的温习一下,然后再将服务器的状态处理连贯做一下记录.

关注过程,不知不觉就发现了结果原来如此...

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-11-13 08:51

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表