澳门威利斯人_威利斯人娱乐「手机版」

来自 威利斯人娱乐 2019-11-09 21:04 的文章
当前位置: 澳门威利斯人 > 威利斯人娱乐 > 正文

DELPHI版传奇引擎学习菜鸟篇

DELPHI版传说引擎学习生手篇(applem2)-01,applem2-01

或多或少废话:因为非工科出身,又对编制程序有一点点兴趣,杂乱的求学了相当多(C,C ,PYTHON…)等许多言语,最终开采DEKLPI上手比极快,对于不驾驭线代和高数等是什么样的笔者来讲可能是较好的筛选了,毕竟只是兴趣而已,对于DELPHI的质感不是平昔不,便是以为没有本人能够渐步入门的.因为早前玩过一个叫传奇的娱乐,所以知道最初的神话是DELPHI开拓的,感到幸而,那就找了众多服务端学习(呵呵,切磋说不上,因为笔者没到那档次),本人入手架设更改,不常还提要求网上朋友玩公共收益.然后就找神话的DELPHI源码,不算超多,终究今后超多照旧用C写的,也不会开源给我们看,后来听网络死党说APPLEM2引擎不亮堂因为何开源了,就找到八个比较全的(当然照旧少了成都百货上千事物,譬如三方VLC),望着长辈们写的东西,在倾倒的还要也认为本人比较写二遍或许会获取点什么,于是就起来了那些历程,决心从头初阶把代码都敲二次,固然时间非常短,也可以有一点"盗用"(虽说应用程式LEM2开源了,不过架构情势也照旧有学问产权的)狐疑,呵呵…,不管怎么说,作者发觉那样学习东西十分的快,至少对自家来讲是这般的,那样的进度让本身晓得了何等是记录,什么是类,什么是SOCKET,对于初学的本人来讲,收获依然颇丰的,当然也发掘了最先代码有为数不菲的不妥的地方,函数和进度的杂乱让本身一定找不着北,在试着将有些混乱的代码简化后,忽然开采存的函数被自个儿再也写过了,或许这也是大器晚成种提升的方法吗,希望自个儿能持有始有终下去.正题起始.

一连全部内容都是自个儿自身攻读DELPHI进度中对程序设计的一点浅显的问询,有的或然会抓住前辈门笑喷,不过那恰是本人上学的成材进程,也是笔者提升的渠道.

 

1.神话服务端结构:

比很多名字都叫MirServer,基本构造富含八个文本夹和三个GAMECENTE昂Cora.EXE文件和二个CONFIG.INI文件,以下遵照运营顺序表达.

名称 说明 描述
GAMECENTER 控制中心 引导所有服务端程序启动,早期的端我没看到过
DBServer 数据库服务器 管理人物怪物物品魔法数据
LoginSrv 登录服务器 控制账号登录
LogServer 日志服务器 记录玩家操作日志
Mir200 游戏主引擎 管理游戏庞大的脚本和设置
RunGate 游戏网关 呵呵,现在我还不知道什么是网关
SelGate 角色网关 好像进入游戏与角色选择有关吧
LoginGate 登录网关 好像是登录控制和玩家状态检测的
Mud2 数据文件夹 物品魔法怪物数据,应该是paradox的

applem2的还应该有个排名榜的,笔者想大多数分端应该并轨在M2里边了吧.

能够见到的就这么些,既然从头起先,就先把目录硬记下来,固然前边在"抄写"的长河中会改造部分设置.

2.源代码结构

源代码和上述组织相通,除了MUD2,各类都对应多个工程文件,用了许多插件,思索把不供给的都去掉,把具有的服务端程序集中到二个历程之中,一时不思谋品质如何,尽量用不带插件的DELPHI完改编写翻译,版本以二〇〇七为基准吧.先写完了贰个GAMECENTE翼虎和DBServer,效果如下:

//本人包罗的单元 ugamecenter.pas // 主窗口单元 GShare.pas // 全局常量单元 DataBackUp.pas // 数据备份单元 //引用的单元 DBShare.pas // 分享数据单元 HUtil32.pas // 人物操作单元 MD5Unit.pas // 数据校验单元 Common.pas // 通用常量单元

3.1 GShare.pas单元

单元之间的援引很复杂,可能是因为早起代码的原由呢,先说说GShare.pas单元,那么些单元富含了服务器的布置常量,如文件夹名字劳务场地布局文件等全局常量和劳务的开发银行停下函数以至音讯管理进度,先记下一点谈得来能力所能达到知情的.

unit GShare;

interface
uses
  Windows, Messages, Classes, SysUtils, INIFiles, DataBackUp, ComCtrls;

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

  DBSERVERSECTIONNAME2 = 'DBServer';
  DBSERVERDBDIR = 'DB';
  DBSERVERALLOWADDR = 'AllowAddr.txt';
  DBSERVERGATEINFO = 'GateInfo.txt';

  LOGINSRVSECTIONNAME2 = 'LoginSrv';
  LOGINSRVCHRLOGNAME = SERVERLOGDIR   'ChrLog';
  LOGINSRVALLOWADDR = 'LoginSrv_AllowAddr.txt';
  LOGINSRVGETINFO = 'LoginSrv_GateInfo.txt';
  LOGINSRVUSERLIMIT = 'LoginSrv_UserLimit.txt';

  M2SERVERCONFIGFILE = '!Setup.txt';
  M2SERVERSECTIONNAME1 = 'Server';
  M2SERVERSECTIONNAME2 = 'Share';
  M2SERVERSEGuildBase = SERVERGAMEDATADIR   'GuildBase';
  M2SERVERSEGuildDir = M2SERVERSEGuildBase   'Guilds';
  M2SERVERSEGuildFile = M2SERVERSEGuildBase   'GuildList.txt';
  M2SERVERSEConLogDir = SERVERLOGDIR   'M2ConLog';
  M2SERVERSECastleDir = SERVERGAMEDATADIR   'Castle';
  M2SERVERSECastleFile = SERVERGAMEDATADIR   'CastleList.txt';
  M2SERVERSELogDir = SERVERLOGDIR   'M2Log';
  M2SERVERSEEMailDir = SERVERLOGDIR   'M2Log';
  M2SERVERSEnvirDir = 'Envir';
  M2SERVERSMapDir = 'Map';
  M2SERVERSALLOWADDR = 'M2Server_AllowAddr.txt';
  M2SERVERSEmailDir = SERVERGAMEDATADIR   'EMail';

  LOGSERVERSECTIONNAME2 = 'LogDataServer';
  LOGSERVERBaseDir = SERVERGAMEDATADIR   'GameLog';
  RunGateSectionName2 = 'RunGate';
  SelGateSectionName2 = 'SelGate';
  LoginGateSectionName2 = 'LoginGate';
  PlugTopDIR=SERVERGAMEDATADIR  'mir200';

type
  {定义每个服务的应用程序状态结构指针}
  pTProgram = ^TProgram;
  TProgram = packed record
    boGetStart: Boolean; //DBServer启动标志 (源码自带注释)
    boReStart: Boolean; //程序异常停止,是否重新启动 (源码自带注释)
    btStartStatus: Byte;//0,1,2,3 未启动,正在启动,已启动,正在关闭 (源码自带注释)
    sProgramFile: string[50];
    sDirectory: string[100];
    ProcessInfo: TProcessInformation; //服务的进程信息(进程,线程,进程ID,线程ID)
    ProcessHandle: THandle;           //进程句柄
    MainFormHandle: THandle;          //主窗口句柄,后续改为每个服务对应的活动窗口句柄
    nMainFormX: Integer;  //服务端启动后窗口位置
    nMainFormY: Integer;
  end;
  {应该是加载地图文件的结构指针}
  pTDataListInfo = ^TDataListInfo;
  TDataListInfo = packed record
    sFileName: string[255];
    MapFileHandle: THandle;
    MapFileBuffer: PChar;
    DateTime: TDateTime;
    Data: PChar;
    DataSize: Integer;
    Item: TListItem;
  end;
  {检测服务运行状态}
  TCheckCode = packed record
    dwThread0: LongWord;
    sThread0: string;
  end;
  {下边的一堆CONFIG是对应的每个服务状态的结构}
  TDBServerConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    GatePort: Integer;
    ServerPort: Integer;
    GetStart: Boolean;
    ProgramFile: string[50];
  end;

  TLoginSrvConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    GatePort: Integer;
    ServerPort: Integer;
    MonPort: Integer;
    GetStart: Boolean;
    ProgramFile: string[50];
  end;

  TM2ServerConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    GatePort: Integer;
    MsgSrvPort: Integer;
    GetStart: Boolean;
    ProgramFile: string[50];
  end;

  TLogServerConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    Port: Integer;
    GetStart: Boolean;
    ProgramFile: string[50];
  end;

    TPlugTopConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    Port: Integer;
    GetStart: Boolean;
    ProgramFile: string[50];
  end;

  TRunGateConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    GetStart: array[0..MAXRUNGATECOUNT - 1] of Boolean;
    GatePort: array[0..MAXRUNGATECOUNT - 1] of Integer;
    ProgramFile: string[50];
  end;

  TSelGateConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    GatePort: array[0..1] of Integer;
    GetStart1: Boolean;
    GetStart2: Boolean;
    ProgramFile: string[50];
  end;

  TLoginGateConfig = packed record
    MainFormX: Integer;
    MainFormY: Integer;
    GatePort: Integer;
    GetStart: Boolean;
    ProgramFile: string[50];
  end;
  {将所有的服务状态声明为一个结构指针}
  pTConfig = ^TConfig;
  TConfig = packed record
    DBServer: TDBServerConfig;
    LoginSrv: TLoginSrvConfig;
    M2Server: TM2ServerConfig;
    LogServer: TLogServerConfig;
    RunGate: TRunGateConfig;
    SelGate: TSelGateConfig;
    LoginGate: TLoginGateConfig;
    PlugTop: TPlugTopConfig;
  end;

  procedure LoadConfig();  //加载启动设置
  procedure SaveConfig();  //保存启动设置
  {下边2个是启动和停止每个服务的函数}
  function RunProgram(var ProgramInfo: TProgram; sHandle: string; dwWaitTime: LongWord): LongWord;
  function StopProgram(var ProgramInfo: TProgram; dwWaitTime: LongWord): Integer;
  {发送每个服务当前状态的消息处理过程}
  procedure SendProgramMsg(DesForm: THandle; wIdent: Word; sSendMsg: string);

先将学习过的复习一下,然后再将服务器的场所管理连贯做一下记录.

一点废话: 因为非工科出身,又对编制程序有一点兴趣,杂乱的就学了广大(C,C ,PYTHON)等居多语言,末了...

DELPHI版神话引擎学习生手篇(applem2)-02,applem2-02

本文由澳门威利斯人发布于威利斯人娱乐,转载请注明出处:DELPHI版传奇引擎学习菜鸟篇

关键词: 澳门威利斯人