传奇源码分析---框架

合集下载

framework源码解析

framework源码解析

framework源码解析【原创版】目录1.框架概述2.框架源码结构3.框架核心模块解析4.框架应用实例5.总结正文一、框架概述框架是一种编程工具,可以帮助开发者更高效、更方便地开发软件。

它为开发者提供了一整套完整的解决方案,包括设计模式、代码组织、模块化等。

在众多框架中,较为知名的有 React、Vue 和 Angular 等。

本文将对框架的源码进行解析,以帮助开发者更好地理解框架的原理和实现。

二、框架源码结构框架的源码通常包括以下几个部分:1.核心模块:包括框架的基本功能,如组件管理、生命周期、状态管理等。

2.辅助模块:包括框架的工具函数、数据操作、事件处理等。

3.插件模块:框架通常支持插件,以提供更多的功能和扩展。

4.示例和文档:框架通常会提供一些示例代码和详细的文档,以帮助开发者快速上手。

三、框架核心模块解析框架的核心模块是框架的灵魂,它包括框架的基本功能,如组件管理、生命周期、状态管理等。

1.组件管理:框架通常采用组件化的方式来组织代码,组件是框架的基本单元。

框架通过组件管理模块来管理组件的创建、销毁、挂载等操作。

2.生命周期:框架提供了一套完整的生命周期体系,包括创建、挂载、更新、销毁等阶段。

开发者可以在生命周期钩子中编写自己的逻辑,以实现定制化功能。

3.状态管理:框架通常采用集中式的状态管理方式,如 Redux、Vuex 等。

状态管理模块负责管理应用的状态,并提供一套规范化的操作方式,如状态的创建、更新、删除等。

四、框架应用实例以 React 为例,React 是一个流行的 JavaScript 框架,它采用组件化的方式来构建应用。

React 的源码主要包括以下几个部分:1.核心模块:包括 React 的创建、更新、渲染等基本功能。

2.辅助模块:包括 React 的工具函数、事件处理等。

3.插件模块:React 支持插件,如 React-DOM、React-Router 等。

4.示例和文档:React 提供了一些示例代码和详细的文档,以帮助开发者快速上手。

ASP.NETMVC源码分析(一)

ASP.NETMVC源码分析(一)

MVC源码分析(⼀) MVC 源码分析(⼀) 直接上图: 我们先来看Core的设计: 从项⽬结构来看,.mvc.core有以下⽬录:ActionConstraints:action限制相关AntiForgery:防伪相关ActionResults:action返回对象相关ApiExplorer:API描述和元数据相关接⼝ApplicationModels:应⽤程序模型相关,应该是全局的modelAreas:地区标签Filters:⼤名⿍⿍的过滤器组件Formatters:格式化相关的东东Internal:这个从名称看不出是做什么的,打开⼀看⾥⾯是⼀个路由决策树的实现ModelBinding:模型绑定,从request 对象取值映射到model的实现ParameterBinding: ModelBinding的上下⽂和模型更新⼊⼝Rendering:重量级选⼿,视图渲染逻辑都在这了Routing:路由控制相关ViewComponents:视图组件剩下的⼀些零闪的类⼤致就是controller,controllerFactoary和⼀些限定请求资源的标签的实现,OK 接下来让我们开始探究吧! ⾯对⼀堆的类我们要从哪开始⼊⼿呢?对!我们要找到整个core的⽣命周期的主线,从主线⼊⼿解析相关组件设计,根据整个管道模型的设计(园⼦讲这个的⽂章很多,我就不熬述了),我们可以了解到,.mvc.core 实际上负责的是httphandler⽣命周期中做的⼀些事情,他从获取httpContext.Request 对象进⾏消息路由(Routing),请求过滤(filters,AntiForgery,ActionConstraints),参数映射(⽐如modelBinding,ParameterBinding),参数验证(⽐如modelValidate),逻辑处理,最后返回结果(ActionResults),对结果进⾏渲染输出到流(Rendering,ViewComponents)。

传奇3客户端(wil格式分析)

传奇3客户端(wil格式分析)

传奇3客户端(wil格式分析)绘制mir3的图像/*⽤于压缩图像的绘制,绘制mir3的图像。

该函数使⽤pwSrc所指向的压缩图像数据,rcSrc所指⽰的源图像矩形,给定⽤于保存源图像的矩形的左上⾓由nX, nY 定位。

压缩的图像⽂件映像中图像数据区的格式:标志,如果是C0 00 表⽰是透明像素,如果是C1 00表⽰是正常像素,如果是C2 00函数使⽤wChooseColor1进⾏像素处理,如果是C3 00 函数使⽤wChooseColor2进⾏像素处理,注意: 1、函数的参数有默认值: wChooseColor1 = 0XFFFF, wChooseColor2 = 0XFFFF 这是⽩⾊。

2、注意存在屏幕、显⽰区域、和⽬标矩形三个区域,屏幕坐标系作为显⽰区域和⽬标矩形定位的区域。

++++++++++++++++++++++++++++++++++++++++++++++++++++ | | nY ++---------------|-----------nX ++++++++++++++++ ++ |nStartY + + ++-----nStartX---++++++++++++++++++++++++++++ + ++ + m_stDisplayInfo.wWidth + + ++ + + + + ++ + + + + ++ + ++++++++++++++++ ++ + m_stDisplayInfo.wHeight + ++ + + ++ ++++++++++++++++++++++++++++ ++ ++ ++ ++++++++++++++++++++++++++++++++++++++++++++++++++++*/BOOL CWHDXGraphicWindow::DrawWithImageForComp(INT nX, INT nY, //源图像的左上⾓绘制到屏幕上时的屏幕坐标RECT rcSrc, //源图像矩形WORD* pwSrc, //源图像数据WORD wChooseColor1, //选择的混合颜⾊1WORD wChooseColor2 //选择的混合颜⾊2){RECT rc; //实际绘制矩形DDSURFACEDESC2 ddsd; //dd表⾯特性描述结构////////////////////////////////////////////////////////////////////////////////在屏幕坐标系上(或窗⼝的客户坐标系上)定位源图像的矩形(⽬标矩形)//实际绘制矩形的宽⾼初始化为源图像矩形的⾼宽INT nWidth = rcSrc.right-rcSrc.left;INT nHeight = rcSrc.bottom-rcSrc.top;//实际绘制矩形的左上⾓相对位置INT nXOffset = rcSrc.left;INT nYOffset = rcSrc.top;//在显⽰区域上定位⼀个供图像显⽰的区域,这就像定义⼀个视⼝,这⾥与显⽰屏幕同。

H5传奇世界服务器架设技术及源码

H5传奇世界服务器架设技术及源码

H5传奇世界服务器架设技术及源码以前是传奇迷,虽然现在不玩,但当作兴趣,研究了⼀下H5传奇世界的架设,架设成功并分享给⼤家。

注意,此技术只可⽤于个⼈娱乐,不可⽤于商业⽤途。

⾸先下载传奇世界H5源码 450M的样⼦。

H5传奇世界是⽤nodejs写的服务端,先安装系统必备中的nodejs,然后安照视频教程进⾏修改配置⽂件,修改完后依次点根⽬录中的1.bat、2.bat、3.bat、4.bat批处理⽂件启动游戏。

我设置成了10倍速度,界⾯有点模糊。

【1】⼈物初始属性设置打开:CQSJ_Server\Server\node_modules\uw-user\src\biz\userBiz.js 修改324—363⾏代码常需要修改的属性:/** ⾦币 **/userEntity.gold = 1000000;/*⾦币*//** 总钻⽯即元宝 **/userEntity.diamond = 10000000;/*钻⽯*//** 等级 **/userEntity.lvl = 145;/*等级(不同于英雄等级)*//** VIP等级 **/userEntity.vip = 16;/*VIP等级*//** 战⼒战⼒是⾃动计算的,最好不要改 **/bat = 0;/*战⼒*//** 背包(只存放静态物品) **/userEntity.bag = {};/*背包(只存放静态物品,格式:{"物品id":数量,"物品id":数量.............})*/【2】个性物品属性编辑物品表:CQSJ_Server\WWW\tools\data\xlsx\t_item(物品表).xlsx物品属性类型:1⽣命25⿇痹33⽣命39暴击2⽣命加成28⿇痹时长34攻击40抗暴3攻击29复活次数35物防4攻击加成30复活HP%36法防23伤害加深31抗护⾝37命中24伤害减免32抗护⾝概率38闪避勋章表:CQSJ_Server\WWW\tools\data\xlsx\t_medal(勋章属性).xlsx (t_medalLvl(勋章强化).xlsx)Note:改完之后,需要点击批处理命令刷新数据:CQSJ_Server\WWW\tools\发布excel数据到游戏中.bat【3】增加活动个数和奖励物往uw_activity表插⼊新数据即可。

(分析图源码)全面分析寻找热血传奇装备CALL

(分析图源码)全面分析寻找热血传奇装备CALL

(分析+图+源码)全面分析寻‎找热血传奇‎装备CAL‎L有感于广海‎论坛中的一‎些朋友在找‎热血传奇装‎备CALL‎上存在的一‎些问题,特发以下文‎章全面分析‎一下,以下分三步‎:1.寻找突破口‎:物品在背包‎中的基址2.寻找将物品‎复制到鼠标‎c all3.寻找真正的‎换装备CA‎LL以上三步都‎解决后,用代码注入‎器注入成功‎,并附加到D‎E PHI中‎测试成功。

正在研究热‎血传奇或其‎它游戏的朋‎友,可以加qq‎:10261‎65915‎一起讨论,谈谈思路和‎方法即可。

也可以相互‎交换信息,共同进步。

详细分析见‎附件,辛苦摸索了‎二天,收点小钱,确实花了点‎心血。

一.寻找突破口‎(找背包中第‎一格物品名‎称):先输入00‎00000‎00000‎00000‎任意多个0‎,然后随便添‎个地址到下‎面。

然后将类型‎改为文本,数值中输入‎第一格物品‎的名称,我这里是小‎手镯,大家根据需‎要操作。

如图:做完后,再将其改为‎字节数组,记住,如果是在传‎奇中,请勿勾选U‎N ICOD‎E,而在武林等‎游戏中,因为中文都‎是采用宽字‎符,所以得勾选‎。

最后再采用‎以上图示的‎字节数组,在CE中搜‎一次就可以‎得到两个绿‎色地址,其中第二个‎就是的,最新版的如‎下:63EBA‎5:第一格物品‎名称最后再来测‎试一下,如图:把第一格的‎物品换成其‎它的,看哪个名称‎变,变的这个地‎址就正确了‎,现在最新版‎的传奇应该‎是:63EBA‎5这个地址‎二.先分析将物‎品复制到光‎标上先考虑是否‎将物品复制‎到鼠标上,是否可以使‎用B P SEND下‎断,然后再找。

但是呢使用‎BE SEND下‎断后,然后在背包‎中点一下物‎品,确没有断下‎来,所以这个首‎先排除掉然后再分析‎一下,因为游戏中‎只要在背包‎中点一下就‎可以复制,所以呢,我们从背包‎中物品的地‎址入手,于是在CE‎中手动添加‎物品所在地‎址:63eba‎4然后再找访‎问此地址的‎代码,返回到游戏‎中点击物品‎后,出现如下有‎用信息:4f411‎c:cmp [ebx],005d805‎4:mov ecx,18用OD载入‎4F411‎C处,分析一下,看到没,那个判断,实际上是判‎断这个地址‎中有没物品‎,有就执行下‎面的两个C‎A LL,本人比较懒‎,两个CAL‎L同时注入‎,调用成功原型如下:004F4‎11C 803B 00 CMP BYTE PTR DS:[EBX],0004F4‎11F 0F84 B4030‎000 JE BMir.004F4‎4D9004F4‎125 8BD3 MOV EDX,EBX004F4‎127 A1 F86B5‎F00 MOV EAX,DWORD‎PTR DS:[5F6BF‎8]004F4‎12C 8B00 MOV EAX,DWORD‎PTR DS:[EAX]004F4‎12E E8 91C2F‎9FF CALL BMir.00490‎3C4004F4‎133 B1 01 MOV CL,1004F4‎135 8BD6 MOV EDX,ESI ; 背部首位置‎从下标6开‎始004F4‎137 8BC3 MOV EAX,EBX ; 物品地址004F4‎139 E8 063F0‎E00 CALL BMir.005D8‎044 ; call于是注入如‎下:mov edx,63eba‎4mov eax,[5f6bf‎8]mov eax,[eax]call 4903c‎4mov cl,1mov edx,6mov eax,63eba‎4mov ebx,005D8‎044call ebx当然,为了简便,你也可以仅‎使用下面的‎C A LL三。

传奇源码分析-客户端(游戏逻辑处理源分析二)

传奇源码分析-客户端(游戏逻辑处理源分析二)
SM_NEWMAP: 用户登录后,服务器发送的初始化地图消息。
SM_LOGON: 用户登录消息(服务器处理后返回结果)。用户登录成功后,在本地创建游戏对象,并发送消息,请求返回用户物品清单(魔法,等级,物品等)。
SM_MAPDESCRIPTION: 得到服务器发送的地图的描述信息。
SM_ABILITY:服务器发送的本玩家金钱,职业信息。
5.接受登录成功后,接收GameSrv服务器发送的消息:
接收GameGate发送的消息:CClientSocket::OnSocketMessage的FD_READ事件中,PacketQ.PushQ((BYTE*)pszPacket);把接收到的消息,压入PacketQ队列中。处理PacketQ队列数据是由CGameProcess::Load()时调用OnTimer在CGameProcess::OnTimer中处理的,
SM_USERNAME 获取玩家的游戏角色名字。
SM_MAPDESCRIPTION 地图对应的名字。
SM_BAGITEMS 用户物品清单 (玩家CM_QUERYBAGITEMS消息)
SM_CHARSTATUSCHANGED 通知玩家状态改变消息(攻击力,状态)。
客户端收到消息后相应的处理:
SM_NEWMAP 接受地图消息 OnSvrMsgNewMap
初始化玩家坐标,m_xMyHero.m_wPosX = ptdm->wParam;
m_xMyHero.m_wPosY = ptdm->wTag;
SM_DAYCHANGING
AddProcess(this, RM_SENDUSEITEMS, 0, 0, 0, 0, NULL); 装备
SM_SENDUSEITEMS

百大框架源码解析

百大框架源码解析

百大框架源码解析1.SpringFramework:介绍SpringFramework的基础概念、核心组件和特性,包括IoC、AOP、Bean生命周期、Spring MVC等。

2. Hibernate:详细介绍Hibernate框架的核心概念、工作原理、实体映射、查询语言等。

3. Struts2:介绍Struts2的MVC架构、拦截器机制、表单验证、国际化等特性。

4. Django:从模型、视图、控制器、URL分发、中间件等方面介绍Django框架的基础知识。

5. Flask:介绍Flask框架的路由、模板、表单、数据库等方面的内容。

6. Ruby on Rails:介绍Ruby on Rails框架的MVC架构、路由、模板、ORM等方面的内容。

7. Express.js:介绍Express.js框架的路由、中间件、模板引擎、数据库等方面的内容。

8. AngularJS:介绍AngularJS框架的指令、数据绑定、服务、控制器等方面的内容。

9. React:介绍React框架的虚拟DOM、组件、状态管理、生命周期等方面的内容。

10. Vue.js:介绍Vue.js框架的响应式数据绑定、指令、组件、路由等方面的内容。

11. Bootstrap:介绍Bootstrap框架的基础样式、组件、网格系统、响应式设计等方面的内容。

12. jQuery:介绍jQuery框架的DOM操作、事件处理、动画效果、Ajax等方面的内容。

13. Ember.js:介绍Ember.js框架的路由、控制器、模板、组件等方面的内容。

14. Backbone.js:介绍Backbone.js框架的模型、视图、集合、路由等方面的内容。

15. Meteor:介绍Meteor框架的实时数据通信、模板、集合、路由等方面的内容。

16. Knockout.js:介绍Knockout.js框架的可观察对象、数据绑定、模板、组件等方面的内容。

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

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

DELPHI版传奇引擎学习菜鸟篇(applem2)-01⼀点废话:因为⾮⼯科出⾝,⼜对编程有点兴趣,杂乱的学习了好多(C,C++,PYTHON…)等好多语⾔,最后发现DELPHI上⼿⽐较快,对于不知道线代和⾼数等是什么的我来说也许是较好的选择了,毕竟只是兴趣⽽已,对于DELPHI的资料不是没有,就是觉得没有⾃⼰可以渐进⼊门的.因为以前玩过⼀个叫传奇的游戏,所以知道最早的传奇是DELPHI开发的,感觉还好,这就找了不少服务端学习(呵呵,研究说不上,因为咱没到那层次),⾃⼰动⼿架设修改,有时还提供给⽹友玩公益.然后就找传奇的DELPHI源码,不算很多,毕竟现在⼤部分还是⽤C写的,也不会开源给⼤家看,后来听⽹友说APPLEM2引擎不知道因为什么开源了,就找到⼀个⽐较全的(当然还是少了很多东西,⽐如三⽅VLC),看着前辈们写的东西,在佩服的同时也觉得⾃⼰对照写⼀遍也许会得到点什么,于是就开始了这个过程,决⼼从头开始把代码都敲⼀遍,尽管时间很长,也有点"盗⽤"(虽说APPLEM2开源了,但是架构模式也还是有知识产权的)嫌疑,呵呵…,不管怎么说,我发现这样学习东西很快,⾄少对我来说是这样的,这样的过程让我知道了什么是记录,什么是类,什么是SOCKET,对于初学的我来说,收获还是颇丰的,当然也发现了早期代码有不少的不妥之处,函数和过程的繁杂让我⼀贯找不着北,在试着将⼀些繁杂的代码简化后,突然发现有的函数被我重新写过了,也许这也是⼀种提⾼的⽅式吧,希望我能坚持下去.正题开始.后续所有内容都是我⾃⼰学习DELPHI过程中对程序设计的⼀点浅显的了解,有的也许会引发前辈门笑喷,但是这恰是我学习的成长过程,也是我提⾼的途径.1.传奇服务端结构:⼤部分名字都叫MirServer,基本结构包含⼋个⽂件夹和⼀个GAMECENTER.EXE⽂件和⼀个CONFIG.INI⽂件,以下按照启动顺序说明.名称说明描述GAMECENTER控制中⼼引导所有服务端程序启动,早期的端我没看到过DBServer数据库服务器管理⼈物\怪物\物品\魔法数据LoginSrv登录服务器控制账号登录LogServer⽇志服务器记录玩家操作⽇志Mir200游戏主引擎管理游戏庞⼤的脚本和设置RunGate游戏⽹关呵呵,现在我还不知道什么是⽹关SelGate⾓⾊⽹关好像进⼊游戏与⾓⾊选择有关吧LoginGate登录⽹关好像是登录控制和玩家状态检测的Mud2数据⽂件夹物品\魔法\怪物数据,应该是paradox的applem2的还有个排⾏榜的,我想⼤部分端应该集成在M2⾥边了吧.能够看到的就这些,既然从头开始,就先把⽬录硬记下来,虽然后边在"抄写"的过程中会改变⼀些设置.2.源代码结构源代码和上述结构⼀样,除了MUD2,每个都对应⼀个⼯程⽂件,⽤了好多插件,准备把不需要的都去掉,把所有的服务端程序集中到⼀个进程⾥边,暂时不考虑性能如何,尽量⽤不带插件的DELPHI完整编译,版本以2007为基准吧.先写完了⼀个GAMECENTER和DBServer,效果如下:服务端只有⼀个Server.exe程序,其他服务都集成到⼀个⽗窗⼝中,然后根据主程序设置决定需要启动那些服务,毕竟传奇架设的时候有些服务可能不在⼀个服务器上,虽然是菜鸟,但是咱也得考虑远⼀点,学习前辈们的⼀些先进理念,也是拓展了⾃⼰的学习思路.3.GAMECENTER先说说启动中⼼,不说别的,光是主窗⼝4000多⾏的代码就让我眼花缭乱了,这对我来说太难了,有的过程或函数快300⾏了,阅读⽐较困难,还是先从⾃⼰的⾓度去理解吧.GAMECENTER⼯程架构如下(名字都是从⾃⼰理解的⾓度起的)://本⾝包含的单元ugamecenter.pas // 主窗⼝单元GShare.pas // 全局常量单元DataBackUp.pas // 数据备份单元//引⽤的单元DBShare.pas // 共享数据单元HUtil32.pas // ⼈物操作单元MD5Unit.pas // 数据校验单元Common.pas // 通⽤常量单元3.1 GShare.pas单元单元之间的引⽤很复杂,也许是因为早起代码的原因吧,先说说GShare.pas单元,这个单元包含了服务器的配置常量,如⽂件夹名字\服务状态\配置⽂件等全局常量和服务的启动\停⽌函数以及消息处理过程,先记录⼀点⾃⼰能够理解的.unit GShare;interfaceusesWindows, Messages, Classes, SysUtils, INIFiles, DataBackUp, ComCtrls;constMAXRUNGATECOUNT = 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 + 'Castle\List.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 recordboGetStart: 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 recordsFileName: string[255];MapFileHandle: THandle;MapFileBuffer: PChar;DateTime: TDateTime;Data: PChar;DataSize: Integer;Item: TListItem;end;{检测服务运⾏状态}TCheckCode = packed recorddwThread0: LongWord;sThread0: string;end;{下边的⼀堆CONFIG是对应的每个服务状态的结构}TDBServerConfig = packed recordMainFormX: Integer;MainFormY: Integer;GatePort: Integer;ServerPort: Integer;GetStart: Boolean;ProgramFile: string[50];end;TLoginSrvConfig = packed recordMainFormX: Integer;MainFormY: Integer;GatePort: Integer;ServerPort: Integer;MonPort: Integer;GetStart: Boolean;ProgramFile: string[50];end;TM2ServerConfig = packed recordMainFormX: Integer;MainFormY: Integer;GatePort: Integer;MsgSrvPort: Integer;GetStart: Boolean;ProgramFile: string[50];end;TLogServerConfig = packed recordMainFormX: Integer;MainFormY: Integer;Port: Integer;GetStart: Boolean;ProgramFile: string[50];end;TPlugTopConfig = packed recordMainFormX: Integer;MainFormY: Integer;Port: Integer;GetStart: Boolean;ProgramFile: string[50];end;TRunGateConfig = packed recordMainFormX: Integer;MainFormY: Integer;GetStart: array[0..MAXRUNGATECOUNT - 1] of Boolean;GatePort: array[0..MAXRUNGATECOUNT - 1] of Integer;ProgramFile: string[50];end;TSelGateConfig = packed recordMainFormX: Integer;MainFormY: Integer;GatePort: array[0..1] of Integer;GetStart1: Boolean;GetStart2: Boolean;ProgramFile: string[50];end;TLoginGateConfig = packed recordMainFormX: Integer;MainFormY: Integer;GatePort: Integer;GetStart: Boolean;ProgramFile: string[50];end;{将所有的服务状态声明为⼀个结构指针}pTConfig = ^TConfig;TConfig = packed recordDBServer: 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);先将学习过的温习⼀下,然后再将服务器的状态处理连贯做⼀下记录.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

传奇源码分析---框架
标签:游戏源码框架
2013-10-31 14:09 2253人阅读评论(1) 收藏举报分类:
游戏源码(4)
版权声明:本文为博主原创文章,未经博主允许不得转载。

最近看游戏源码,对于大一点的源码,完全不知道怎么开始,太庞大了,网狐的源码都达到了1G多了,vc6.0打开直接卡死,不得不说vs2010还是很不错的。

大的源码看不懂,最后去看最小的源码,传奇服务端源码。

1.找到winmain函数(GameSvr.cpp),InitApplication()函数注册窗口回调函数MainWndProc(MainWndProc.cpp). InitInstance()函数主要对窗口编程。

2.开启服务回调函数调用OnCommand(),创建了一个线程InitializingServer;在线程里面调用ConnectToServer()函数。

ConnectToServer()里面将监听套接字(没看全局变量,推测的)注册到窗口回调函数里面,消息的ID为:_IDM_CLIENTSOCK_MSG然后,自己连接这个服务器,到此ConnectToServer()函数结束。

3.由于上一步,收到了_IDM_CLIENTSOCK_MSG,窗口函数调用OnClientSockMsg()。

这个函数里面创建了ProcessLogin、ProcessUserHuman、ProcessMonster、ProcessNPC 线程,然后通过调用InitServerSocket创建CreateIOCPWorkerThread完成端口。

继续调用InitThread创建AcceptThread线程,OK到此程序基本框架搭建起来了。

CreateIOCPWorkerThread里面创建了完成端口工作者线程ServerWorkerThread。

到此服务器的基本架构搭建起来了。

直接看图吧,思路清晰一些。

相关文档
最新文档