第一范文网 - 专业文章范例文档资料分享平台

传奇源码分析

来源:用户分享 时间:2025/6/27 6:52:45 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

传奇源码分析

中龙技术论坛 www.zljs.net 2012年8月15号 般若 收录

2010年01月30日 星期六 下午 11:02 简述:

最近对高性能的服务器比较感兴趣,读过了DELPHI的Socker源码WebService及RemObject之后,高性能的服务器感兴趣。 你可能需要的以下知识才能更好的读懂一个商业源码: 1).SOCKET的I/O模型熟悉掌握。 2).面向对象技术的熟悉掌握。 3).Socket的API掌握。 4).多线程技术等。

5).一门熟悉的开发工具掌握,和多种语言的源码阅读能力。

我下的源码 LegendOfMir2_Server:共包含AdminCmd, DBSrv, GameGate, GameSvr,LoginGate, LoginSvr, SelGate七个工程文件。传奇的客户端源代码有两个工程,WindHorn和Mir2Ex。

我分析的, 主要是VC SQL版本的, DELPHI翎风源码不做分析, 另外下载了乐都WIL编辑器和乐都MPA地图编辑器这些工具.

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

DirectX类库分析(WindHorn):

1. RegHandler.cpp 注册表访问(读写)。

2. CWHApp派生CWHWindow,CWHWindow完成窗口的注册和创建。CWHWindow派生出CWHDXGraphicWindow,CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后再调用CreateDXG()来初始化DirectX。

3. WHDefProcess.cpp在构造函数中获得CWHDXGraphicWindow句柄。

Clear函数中调用在后台缓存上进行绘图操作,换页至屏幕。 ShowStatus函数,显示状态信息。

DefMainWndProc函数,调用CWHDXGraphicWindow->MainWndProcDXG消息处理。 4. WHImage.cpp图象处理。加载位图,位图转换。优化处理。 5. WHSurface.cpp 主页面处理。 6. WHWilTexture.cpp 材质渲染。 WILTextureContainer: WIL容器类。m_pNext指向下一个WILTextureContainer,单链表。

7. WHWilImage.cpp 从Data目录中加载Wix文件(内存映射)。 8. WHDXGraphic.cpp 处理DirectX效果。

文件类型格式探讨:

Wix文件:索引文件,根据索引查找到相应数据地址(数据文件)。 // WIX 文件头格式

typedef struct tagWIXFILEIMAGEINFO {

CHAR szTmp[40]; // 库文件标题 'WEMADE Entertainment inc.' WIL文件头

INT nIndexCount; // 图片数量 INT* pnPosition; // 位置 }WIXIMAGEINFO, *LPWIXIMAGEINFO;

我们下载一个Hedit编辑器打开一个Wil文件,分析一下。我们发现Wix文件中,0x23地址(含该地址)以前的内容是都相同的,即为:#INDX v1.0-WEMADE Entertainment inc.

Ofs44 0x2C的地方:存放着0B 00 00 00,高低位转换后为:0xB转换十进制数为11(图片数量)Ofs48 0x30的地方:存放着38 04 00 00,高低位转换后为:0x438 = 1080, 这个就是图象数据的开始位置。

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

Wil文件: 数据文件。

前面我们说了图象数据的开始位置为0x438 = 1080, 1080中有文件开头的44字节都是相同的。所以,就是说有另外的1036字节是另有用途。1036中有1024是一个256色的调色板。

我们看到图片位置数据为: 20 03 58 02, 转化为十六进制: 0x320, 0x258 刚好就是800*600大小的图片。07 00 D4 FF。图片起始位置为: Ofs 1088: 0x440 图片大小为480000

起始位置:0x440 1088 终止位置:0x7573F 481087 为了验证数据是否正确,我们通过Wil工具,把第一幅图片导出来,然后用Hedit编辑器打开,经过对比,我们发现,数据一致。大小一致。

第二张BMP图片(图片起始位置:0x436 10078) : F0 01 69 01 , 07 00 D4 FF

刚好大小。第二张Wil起始位置:Ofs:481096 0x75748 知道了图片格式,我们可以写一个抓图片格式的程序了。

传奇源码分析-客户端(全局变量与总体执行流程) 客户端:

传奇的客户端源代码有两个工程,WindHorn和Mir2Ex。 先剖析一下WindHorn工程。

1.CWHApp、CWHWindow和CWHDXGraphicWindow。Window程序窗口的创建。 CWHApp派生CWHWindow,CWHWindow又派生CWHDXGraphicWindow。CWHWindow类

中完成窗口的注册和创建。CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后再调用CreateDXG()来初始化DirectX。

2.CWHDefProcess派生出CloginProcess、CcharacterProcess、CgameProcess三个类。

这三个类是客户端处理的核心类。

3. 全局变量:

CWHDXGraphicWindow g_xMainWnd; 主窗口类。 CLoginProcess g_xLoginProc; 登录处理。

CCharacterProcess g_xChrSelProc; 角色选择处理。 CgameProcess g_xGameProc; 游戏逻辑处理。

4.代码分析:

1.首先从LoginGate.cpp WinMain分析:

g_xMainWnd定义为CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后

调用DirectDrawEnumerateEx枚举显示设备,(执行回调函数

DXGDriverEnumCallbackEx) 再调用CreateDXG()来初始化DirectX(创建DirectDraw对象, 取得独占和全屏模式, 设置显示模式等)。 g_xSound.InitMirSound创建CSound对象。 g_xSpriteInfo.SetInfo();

初始化声音,加载Socket库之后,进行CWHDefProcess*指针赋值(事件绑定)。g_bProcState变量反应了当前游戏的状态(登录,角色选择,游戏逻辑处理)。调用Load初始化一些操作(登录,角色选择,游戏逻辑处理)。进行消息循环。

case _LOGIN_PROC:

g_xLoginProc.RenderScene(dwDelay); case _CHAR_SEL_PROC:

g_xChrSelProc.RenderScene(dwDelay); case _GAME_PROC:

g_xGameProc.RenderScene(dwDelay);

根据g_bProcState变量标志,选择显示相应的画面。

2.接收处理网络消息和接收处理窗口消息。

在不同的状态下(登录,角色选择,游戏逻辑处理),接收到的消息(网络,窗口消息)会分派到不同的函数中处理的。这里是用虚函数处理(调用子类方法,由实际的父类完成相应的处理)。

OnMessageReceive主要处理网络消息。DefMainWndProc则处理窗体消息(按键,重绘等),创建窗体类为CWHDXGraphicWindow,回调函数为:

MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if ( m_pxDefProcess )

m_pxDefProcess->DefMainWndProc(hWnd, uMsg, wParam, lParam); else

return MainWndProcDXG(hWnd, uMsg, wParam, lParam);

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

传奇源码分析-客户端(传奇2文件格式分析) 传奇文件类型格式探讨(一):

Wix文件:索引文件,根据索引查找到相应数据地址(数据文件)。 // WIX 文件头格式

typedef struct tagWIXFILEIMAGEINFO {

CHAR szTmp[40]; // 库文件标题 'WEMADE Entertainment inc.' WIL文件头

INT nIndexCount; // 图片数量 INT* pnPosition; // 位置 }WIXIMAGEINFO, *LPWIXIMAGEINFO;

我们下载一个Hedit编辑器打开一个Wil文件,分析一下。我们发现Wix文件中,0x23地址(含该地址)以前的内容是都相同的,即为:#INDX v1.0-WEMADE Entertainment inc.

Ofs44 0x2C的地方:存放着0B 00 00 00,高低位转换后为:0xB转换十进制数为11(图片数量)Ofs48 0x30的地方:存放着38 04 00 00,高低位转换后为:0x438 = 1080, 这个就是图象数据的开始位置。

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

Wil文件: 数据文件。

前面我们说了图象数据的开始位置为0x438 = 1080, 1080中有文件开头的44字节都是相同的。所以,就是说有另外的1036字节是另有用途。1036中有1024是一个256色的调色板。而Wil里面的图片格式都是256色的位图储存。

我们看到图片位置数据为: 20 03 58 02, 转化为十六进制: 0x320, 0x258 刚好就是800*600大小的图片。07 00 D4 FF为固定值(标识)。图片起始位置为: Ofs 1088: 0x440 图片大小为480000

起始位置:0x440 1088 终止位置:0x7573F 481087 为了验证数据是否正确,我们通过Wil工具,把第一幅图片导出来,然后用Hedit编辑器打开,经过对比,我们发现,数据一致。大小一致。

大家看到图片1的结束位置为0fs 481077,减去1080+1 = 480000刚好800*600大小。

我们用Wil抓图工具打开看一下(确定是800*600大小):

搜索更多关于: 传奇源码分析 的文档
传奇源码分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c6l2ye1oaqr0fluh9bay7_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top