传奇私服文章
传奇私服技术

传奇源码分析

来源:PHong新开传奇私服网 作者:PHong.Cn 时间:2008/4/8 23:31:31 Tag: 点击:

传奇源码分析-序言
简述:
     最近对高性能的服务器比较感兴趣,读过了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

 


本文[传奇源码分析]由PHong.Cn于2008/4/8 23:31:31录入本站!欢迎更多朋友投稿!
文章搜索
标题  内容