夜游神论坛,传奇一条龙,GM论坛,GM部落

 找回密码
 立即注册

QQ登录

只需一步,快速开始

安全 996 php 88A
查看: 17771|回复: 146

[传奇3源码] 传奇3客户端源码研究资料

  [复制链接]

签到天数: 806 天

[LV.10]以坛为家III

3138

主题

3879

帖子

3万

钻石

Rank: 9Rank: 9Rank: 9

积分
7017

最佳新人活跃会员推广达人以坛为家灌水之王热心会员

QQ
发表于 2018-4-14 00:55:03 | 显示全部楼层 |阅读模式
  1. 最近对高性能的服务器比较感兴趣,读过了DELPHI的Socker源码WebService及RemObject之后,高性能的服务器感兴趣。
  2. 你可能需要的以下知识才能更好的读懂一个商业源码:
  3. 1).SOCKET的I/O模型熟悉掌握。
  4. 2).面向对象技术的熟悉掌握。
  5. 3).Socket的API掌握。
  6. 4).多线程技术等。
  7. 5).一门熟悉的开发工具掌握,和多种语言的源码阅读能力。

  8. 我下的源码 LegendOfMir2_Server:共包含AdminCmd, DBSrv, GameGate, GameSvr,LoginGate, LoginSvr, SelGate七个工程文件。传奇的客户端源代码有两个工程,WindHorn和Mir2Ex。
  9. 我分析的, 主要是VC SQL版本的, DELPHI翎风源码不做分析,另外下载了乐都WIL编辑器和乐都MPA地图编辑器这些工具.

  10. 传奇源码分析-客户端(WindHorn简述和传奇文件格式分析)

  11. DirectX类库分析(WindHorn):

  12. 1. RegHandler.cpp 注册表访问(读写)。
  13. 2. CWHApp派生CWHWindow,CWHWindow完成窗口的注册和创建。CWHWindow派生出CWHDXGraphicWindow,CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后再调用CreateDXG()来初始化DirectX。
  14. 3. WHDefProcess.cpp在构造函数中获得CWHDXGraphicWindow句柄。
  15. Clear函数中调用在后台缓存上进行绘图操作,换页至屏幕。
  16. ShowStatus函数,显示状态信息。
  17. DefMainWndProc函数,调用CWHDXGraphicWindow->MainWndProcDXG消息处理。
  18. 4. WHImage.cpp图象处理。加载位图,位图转换。优化处理。
  19. 5. WHSurface.cpp 主页面处理。
  20. 6. WHWilTexture.cpp 材质渲染。
  21. WILTextureContainer: WIL容器类。m_pNext指向下一个WILTextureContainer,单链表。
  22. 7. WHWilImage.cpp 从Data目录中加载Wix文件(内存映射)。
  23. 8. WHDXGraphic.cpp 处理DirectX效果。

  24. 文件类型格式探讨:
  25. Wix文件:索引文件,根据索引查找到相应数据地址(数据文件)。
  26. // WIX 文件头格式
  27. typedef struct tagWIXFILEIMAGEINFO
  28. {
  29. CHARszTmp[40]; // 库文件标题 'WEMADE Entertainment inc.' WIL文件头
  30. INT nIndexCount; // 图片数量
  31. INT*pnPosition;// 位置
  32. }WIXIMAGEINFO, *LPWIXIMAGEINFO;

  33. 我们下载一个Hedit编辑器打开一个Wil文件,分析一下。我们发现Wix文件中,0x23地址(含该地址)以前的内容是都相同的,即为:#INDX v1.0-WEMADE Entertainment inc.
  34. Ofs44 0x2C的地方:存放着0B 00 00 00,高低位转换后为:0xB转换十进制数为11(图片数量)Ofs48 0x30的地方:存放着38 04 00 00,高低位转换后为:0x438 = 1080, 这个就是图象数据的开始位置。

  35. 我们用Wil编辑打开对应的Wil文件,发现,果然有11张图片。另外我们发现,在Ofs = 44 -47之间的数据总是38 04 00 00,终于明白,所有的图片起始位置是相同的。

  36. Wil文件: 数据文件。
  37. 前面我们说了图象数据的开始位置为0x438 = 1080, 1080中有文件开头的44字节都是相同的。所以,就是说有另外的1036字节是另有用途。1036中有1024是一个256色的调色板。
  38. 我们看到图片位置数据为: 20 03 58 02, 转化为十六进制: 0x320, 0x258 刚好就是800*600大小的图片。07 00 D4 FF。图片起始位置为:
  39. Ofs 1088: 0x440 图片大小为480000
  40. 起始位置:0x440 1088 终止位置:0x7573F 481087 为了验证数据是否正确,我们通过Wil工具,把第一幅图片导出来,然后用Hedit编辑器打开,经过对比,我们发现,数据一致。大小一致。
  41. 第二张BMP图片(图片起始位置:0x436 10078) : F0 01 69 01 , 07 00 D4 FF
  42. 刚好大小。第二张Wil起始位置:Ofs:4810960x75748
  43. 知道了图片格式,我们可以写一个抓图片格式的程序了。

  44. 传奇源码分析-客户端(全局变量与总体执行流程)
  45. 客户端:
  46. 传奇的客户端源代码有两个工程,WindHorn和Mir2Ex。
  47. 先剖析一下WindHorn工程。
  48. 1.CWHApp、CWHWindow和CWHDXGraphicWindow。Window程序窗口的创建。
  49. CWHApp派生CWHWindow,CWHWindow又派生CWHDXGraphicWindow。CWHWindow类
  50. 中完成窗口的注册和创建。CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后再调用CreateDXG()来初始化DirectX。

  51. 2.CWHDefProcess派生出CloginProcess、CcharacterProcess、CgameProcess三个类。
  52. 这三个类是客户端处理的核心类。
复制代码
  1. 3. 全局变量:
  2. CWHDXGraphicWindowg_xMainWnd;主窗口类。
  3. CLoginProcess g_xLoginProc; 登录处理。
  4. CCharacterProcess g_xChrSelProc; 角色选择处理。
  5. CgameProcess g_xGameProc; 游戏逻辑处理。

  6. 4.代码分析:
  7. 1.首先从LoginGate.cpp WinMain分析:
  8. g_xMainWnd定义为CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后
  9. 调用DirectDrawEnumerateEx枚举显示设备,(执行回调函数DXGDriverEnumCallbackEx) 再调用CreateDXG()来初始化DirectX(创建DirectDraw对象, 取得独占和全屏模式, 设置显示模式等)。
  10. g_xSound.InitMirSound创建CSound对象。
  11. g_xSpriteInfo.SetInfo();
  12. 初始化声音,加载Socket库之后,进行CWHDefProcess*指针赋值(事件绑定)。g_bProcState变量反应了当前游戏的状态(登录,角色选择,游戏逻辑处理)。调用Load初始化一些操作(登录,角色选择,游戏逻辑处理)。进行消息循环。
  13. case _LOGIN_PROC:
  14. g_xLoginProc.RenderScene(dwDelay);
  15. case _CHAR_SEL_PROC:
  16. g_xChrSelProc.RenderScene(dwDelay);
  17. case _GAME_PROC:
  18. g_xGameProc.RenderScene(dwDelay);
  19. 根据g_bProcState变量标志,选择显示相应的画面。

  20. 2.接收处理网络消息和接收处理窗口消息。
  21. 在不同的状态下(登录,角色选择,游戏逻辑处理),接收到的消息(网络,窗口消息)会分派到不同的函数中处理的。这里是用虚函数处理(调用子类方法,由实际的父类完成相应的处理)。
  22. OnMessageReceive主要处理网络消息。DefMainWndProc则处理窗体消息(按键,重绘等),创建窗体类为CWHDXGraphicWindow,回调函数为:
  23. MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  24. if ( m_pxDefProcess )
  25. m_pxDefProcess->DefMainWndProc(hWnd, uMsg, wParam, lParam);
  26. else
  27. return MainWndProcDXG(hWnd, uMsg, wParam, lParam);

  28. m_pxDefProcess->DefMainWndProc调用父类的实际处理。
  29. 在WM_PAINT事件里: g_xClientSocket
  30. ConnectToServer连接登陆服务器。

  31. 传奇源码分析-客户端(传奇2文件格式分析)
  32. 传奇文件类型格式探讨(一):
  33. Wix文件:索引文件,根据索引查找到相应数据地址(数据文件)。
  34. // WIX 文件头格式
  35. typedef struct tagWIXFILEIMAGEINFO
  36. {
  37. CHARszTmp[40]; // 库文件标题 'WEMADE Entertainment inc.' WIL文件头
  38. INT nIndexCount; // 图片数量
  39. INT*pnPosition;// 位置
  40. }WIXIMAGEINFO, *LPWIXIMAGEINFO;

  41. 我们下载一个Hedit编辑器打开一个Wil文件,分析一下。我们发现Wix文件中,0x23地址(含该地址)以前的内容是都相同的,即为:#INDX v1.0-WEMADE Entertainment inc.
  42. Ofs44 0x2C的地方:存放着0B 00 00 00,高低位转换后为:0xB转换十进制数为11(图片数量)Ofs48 0x30的地方:存放着38 04 00 00,高低位转换后为:0x438 = 1080, 这个就是图象数据的开始位置。

  43. 我们用Wil编辑打开对应的Wil文件,发现,果然有11张图片。另外我们发现,在Ofs = 44 -47之间的数据总是38 04 00 00,终于明白,所有的图片起始位置是相同的。

  44. Wil文件: 数据文件。
  45. 前面我们说了图象数据的开始位置为0x438 = 1080, 1080中有文件开头的44字节都是相同的。所以,就是说有另外的1036字节是另有用途。1036中有1024是一个256色的调色板。而Wil里面的图片格式都是256色的位图储存。
  46. 我们看到图片位置数据为: 20 03 58 02, 转化为十六进制: 0x320, 0x258 刚好就是800*600大小的图片。07 00 D4 FF为固定值(标识)。图片起始位置为:
  47. Ofs 1088: 0x440 图片大小为480000
  48. 起始位置:0x440 1088 终止位置:0x7573F 481087 为了验证数据是否正确,我们通过Wil工具,把第一幅图片导出来,然后用Hedit编辑器打开,经过对比,我们发现,数据一致。大小一致。
  49. 大家看到图片1的结束位置为0fs 481077,减去1080+1 = 480000刚好800*600大小。
  50. 我们用Wil抓图工具打开看一下(确定是800*600大小):

  51. 我们导出第二张BMP图片
  52. 图片的大小为:496* 361, 我们从Wix中读出第二张图片的索引位置:
  53. 根据贴图,我们发现第二张图片的索引位置为: 40 57 07 00,转换为十六进制:0x75740,即为:481088,前面我们讲到第一张图片的结束位置是: 0fs 481077,从Wix中读出来的也刚好为第二张图片的起始位置:
  54. (我们分析Wil中的第二张图片,起始位置:0x75740 481088) : F0 01 69 01为图片长宽: 0x1F0, 0x169 为496* 361 。 07 00 D4 FF为固定值(标识)。
  55. 我们用工具打开第二张BMP图片,从起始位置,一直选取中至结束,发现刚好选496* 361字节大小。两边数据对比之后发现一致。知道了图片格式,我们可以写一个抓图片格式的程序了。
复制代码


查看完整的传奇3客户端研究资料

游客,如果您要查看本帖隐藏内容请回复





上一篇:传奇3源码研究资料说明书
下一篇:传奇3服务端源码 修正版 光通1.45官方源码
锄禾日当午,签到不辛苦...
回复

使用道具 举报

签到天数: 6 天

[LV.2]偶尔看看I

0

主题

22

帖子

4

钻石

Rank: 1

积分
22
发表于 2018-4-14 17:10:42 | 显示全部楼层
看看下载地址!
回复

使用道具 举报

签到天数: 225 天

[LV.7]常住居民III

0

主题

211

帖子

1380

钻石

Rank: 2

积分
211

最佳新人

发表于 2018-4-14 19:59:49 | 显示全部楼层
我就是来看看的~~~~~~~~
G ...
回复

使用道具 举报

签到天数: 17 天

[LV.4]偶尔看看III

0

主题

44

帖子

92

钻石

Rank: 1

积分
44
发表于 2018-4-16 01:55:29 | 显示全部楼层
好东西 收藏了!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

传奇广告代理|传奇脚本|微变传奇|单职业传奇|热血传奇|传奇私服|GM论坛|英雄合击|小黑屋|百度统计|夜游神论坛 |网站地图

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.