VC编写,6.0以上版本的VC都可以编译. 说明:   需要在工作目录放入盛大的GROUP.DAT才能显示区域服务器等信息. 在工作目录\DATA下放入MMAP.WIL,MMAP.WIX就可以显示大地图,在工作目录\MAP下放入盛大的地图就可以显示障碍地图. |-MIRGUI.EXE |-GROUP.DAT +-DATA |   |-MMAP.WIL |   \-MMAP.WIX +-MAP     |-*.MAP(盛大传奇的地图文件) DATA/MAP文件夹可以不存在. 但是GROUP.DAT必须存在,没有它就无法显示游戏区域和服务器,也就无法进入游戏. bindef.h 二进制定义文件,看看就知道了,就是定义了一些B00001111类似的序列,方便二进制操作 mircode.cpp 消息解码相关 mircode.h 消息解码相关头文件 mircore.cpp 开始做测试用代码,现在都转移到MIRGAME.CPP中了。 mircore.h mirgame.cpp 消息处理,动作处理的核心代码 mirgame.h mirgamemap.cpp 游戏地图的处理,障碍地图的绘制 mirgamemap.h mirgroup.cpp 对GROUP.DAT的处理 ,得到服务器和区域列表,并且有个接口可以将列表输出到COMBOBOX控件 mirgroup.h mirgroup1.cpp 本来想把上面的处理写到类里面,可是时间问题,我就。。。。 mirgroup1.h mirgui.cpp 界面处理, mirgui.h mirminimap.cpp 小地图处理和绘制类 mirminimap.h mirmsg.cpp 消息发送接收等处理的类 mirmsg.h mirprocmsg.cpp 本来想把消息处理独立开,不过后来没时间就。。。。 mirprocmsg.h mirsocket.cpp 对socket得简单封装。。。。 mirsocket.h MIRCODE的接口说明 mircode.cpp 详细介绍 char ucase(char c); 输入一个字符,如果是小写字母,返回这个字符的大写。如果是其他的,直接返回。 int hex2int(charc); 输入一个十六进制字符,转换成十进制int型,如果不是16进制字符,返回0 char int2hex(int v); 输入一个0-15的十进制,返回16进制字符 int UnNameCode( char * in, char * out ); 对人物出现消息内的人物名字进行解码,in为输入buffer,out为输出 int CodeGateCode( char * in, char * out); 对消息进行加密,就是盛大以前的一个补丁PROTECTMIR的功能 int UnGateCode( char * in,char * out); 对加密的消息进行解密. int UnGameCode( char * p, BYTE*out ); 对游戏消息进行解码,返回解码后长度 int CodeGameCode( BYTE*in, int size,BYTE * out); 对游戏消息进行编码,in,输入缓冲,size输入字节,out输出缓冲,返回编码后长度 这些基本上就是传奇的编码和解码核心了。 传奇的消息格式,(二进制) DWORD dwId; WORD wCmd; WORD wParam01; WORD wParam02; WORD wParam03; char buffer[?] MIRGAME接口说明!^_^ mirgame.cpp DWORD MessageProc( PVOID * p ); 消息处理线程 class CMirGame 传奇游戏类 { public: friend DWORD MessageProc( PVOID * p ); 作为友员函数,方便访问 void Walk( int dir ); 请求行走 参数 方向 BOOL SelectChar( char * charname ); 选择人物 参数 角色名字 BOOL GetSelCharInfo( SELCHARINFO * pInfo ); 取得选人信息 参数 选人信息返回地址 BOOL EnterServer( char * ServerName ); 进入服务器 参数 服务器名字 BOOL Login( char * username, char * password ); 登陆 参数 账号,密码 BOOL OpenGateServer( char * ip ); 连接GATE服务器 参数 ip int GetString( char * string ); 分割/隔开的字符串的函数 参数 字符串 public: void LogToList( HWND hList, char * line ); 向listbox写log void LogChat( char * line,... ); void LogSystem( char * line,... ); public: BOOL EnterGame( int CharIndex ); 进入游戏 参数 人物编号,0/1 BOOL CloseAll(); 关闭所有连接 BOOL EnterSelCharServer(); 进入选人服务器 无参数 BOOL CloseGateServer(); 关闭gate服务器 无参数 BOOL InitLogSystem( HWND hSysLog, HWND hChatLog, int MaxLine); 初始化log listbox BOOL GetMsgInfo( SOCKET s ); 取得消息信息(废除) BOOL GetMsg( MMSG * pMsg ); 得到一条消息 参数 返回消息指针 public: BOOL RunThrough( int dir ); 穿人^_^ 参数 方向 CMirMiniMap * GetMiniMap(); 得到小地图 CMirGameMap * GetGameMap(); 得到游戏障碍地图 void SetCharacterPos( int x, int y ); 设置角色坐标 void Turn( int dir ); 转向 参数 方向 void Run(int dir ); 跑 参数 方向 void HandleCommand( char * command ); 接受控制命令 参数 命令字符串(其实就是用另外一个人来控制该角色) BOOL CloseSelCharServer(); 关闭选人服务器 BOOL Logout(); 退出游戏世界 BOOL Say( char * word, ...); 说话 BOOL StartGame(); 开始游戏(创建消息收取线程) CMirGame(); virtual ~CMirGame(); private: CMsgQueue2 m_MsgQueue; DWORD m_dwGameState; SOCKET m_sGate; SOCKET m_sSelChar; SOCKET m_sGame; SELCHARINFO m_SelCharInfo; BOOL m_bInGame; char m_Account[32]; char m_SelCharIp[20]; char m_GameServerIp[20]; int m_SelCharPort; int m_GameServerPort; char m_SID[32]; private: void ActionFail(); 动作失败处理 void ActionOk(); 动作成功处理 BOOL CanDoAction(); 是否可以做动作(当前是否有动作还没有被确认) private: int m_LeftHours; HWND m_hSysLog; HWND m_hChatLog; TSTRING m_StringList[20]; int m_MaxLogLine; char * m_tmpBuffer; char * m_tmpBuffer2; char * m_MsgLeftBuf; ACTION_LAST m_LastAction; CHARACTERINFO m_CharSelf; CMirMsg m_MirMsg; CMirSocket m_MirSocket; CMirMiniMap m_MiniMap; CMirGameMap m_GameMap; }; MIRGAMEMAP mirgamemap.cpp class CMirGameMap { public: BOOL TestMap( int x, int y ); 测试地图坐标是否有障碍 BOOL TestMapTo( int x, int y, int dir ); 测试坐标的那个方向上的坐标是否有障碍 void SetPersonInfo( DWORD x, DWORD y, DWORD dir ); 设置角色坐标 BOOL SetGameMap( char * mapname, DWORD x, DWORD y ); 设置地图信息和当前坐标 void Draw( HDC dc, int dx, int dy); 在DC的DX,DY位置上绘制障碍地图 CMirGameMap(); virtual ~CMirGameMap(); private: MIRMAPBLOCK* Loadmap( char * map ); 读取地图 MIRMAPHEADER m_Header; MIRMAPBLOCK * m_pData; DWORD m_xpos; DWORD m_ypos; DWORD m_dir; int m_DrawWidth; int m_DrawHeight; int m_DrawMapWidth; int m_DrawMapHeight; MAPDRAWCOLOR m_DrawColor[MOBJ_TELEPORT + 1]; }; MIRGROUP MIRGROUP int SetAreaList( HWND hWnd ); 输出区域信息到指定的LISTBOX或者COMBOBOX int SetServerCaptionList( HWND hWnd, int AreaID ); 输出服务器显示名字到指定的COMBOBOX int GetServerName( int AreaID, int ServerIndex, char * ServerName ); 得到制定区的指定服务器的名字(消息中用到的名字) int SetGroupFile( char * file ); 设置GROUP.DAT的文件 int GetIpAddress( int AreaID, char * IpAddr ); 得到区域登陆服务器的名字 MIRMINIMAP MIRMINIMAP class CMirMiniMap { public: void SetCurPos( int x, int y ); 设置当前坐标 void Draw( HDC dc, int x, int y, int w, int h ); 载dc上的x,y处绘制w,h大小的小地图 BOOL SetMMap( DWORD index ); 设置当前的小地图 BOOL InitMiniMap( char * wixfile, char * wilfile ); 初始化小地图资源信息 CMirMiniMap(); virtual ~CMirMiniMap(); private: DWORD LoadOfs( char * szWixFile, DWORD ** ofsbuf ); 读取每个图片的偏移量信息 char * LoadBuf( DWORD idx, DWORD & width, DWORD & height ); 读取编号为idx的图片,返回大小 BOOL LoadPal( char * ppal); 读取调色板信息 int MakeBitmapHeader( BITMAPFILEHEADER * pBfHeader, BITMAPINFOHEADER * pBiHeader, int width, int height, int bits ); 创建bitmap头,用来绘制图片到dc private: DWORD * m_pResOfs; DWORD m_dwCntMMap; char m_szWixFile[1024]; char m_szWilFile[1024]; char * m_ImageData; DWORD m_dwImageWidth; DWORD m_dwImageHeight; FILE * m_fpWilFile; DWORD m_dwMapIndex; st_mybi m_BitmapHeader; DWORD m_xpos; DWORD m_ypos; }; MirSocket 说明 class CMirSocket { public: CMirSocket(); virtual ~CMirSocket(); int SetNoBlock( SOCKET s ); 设置无阻塞模式 void CloseConnection( SOCKET s ); 关闭连接 SOCKET OpenConnection( char * ip, unsigned short port ); 打开一个连接到IP,PORT BOOL NetCleanup(); 关闭winsock调用 BOOL NetStartup(); 开始winsock调用 };