游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8124|回复: 18

我分析的SQL版传奇2的的源代码有不足的地方请高手指出

[复制链接]

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-7-22 23:42:00 | 显示全部楼层 |阅读模式
今天发的是游戏里的全局变量的定义!因为我也是个新手有什么翻译不好的地方请不要骂我呀还有请高手给看看有什么不对的地方谢谢拉以后我回定期的发一些上来直到把正个程序都给大家分析一遍我是逐行分析,不知道可不可以,不过我会坚持的!分析错误的大家一定要指出来,一起学习!有什么不懂的可以加我QQ:170301048大家一起研究!顺便给大家说一下数据里的定义数据的表示方法其实基本是是遵循的是匈牙利表示法 如 全局标量都是以  g_  开头 句柄类都是以 h  开头不明白的可以重网上查一下,我只说几个特别的   比如 定义一个变量为int 如
int         g_nMirDayTime;  第一个g_ 表示此为全局变量 后边跟的 _n就是表示此变量为 int型的在后边跟的才是游戏的数据的表示这里可以翻译成 MirDayTime 为int型的全局变量 下边的我就不多少了大家可以很容易的看出来看不出来的在回贴我告诉大家!并且把别人分析的一篇关于网络传奇的个模块的通讯方式发给大家!
LoginGate模块
=============
    只起到LoginSvr和Client之间的消息中介作用 <== 这种做法真的能起到加快响应速度吗?
1、将所有从客户端收到的消息直接转发给LoginSvr
2、将所有从LoginSvr收到的消息直接转发给客户端

SelGate模块
===========
    结构简直跟LoginGate一模一样,只不过它连接到DBSvr上


LoginSvr模块
============
    基本相当于AccountServer
    实现的功能包括:
1、帐号密码验证
2、选择服务器
3、创建新帐号


GameGate模块
============
1、所有从客户端收到的消息都直接转发给GameSvr
2、所有从GameSvr收到的消息除了几个需要处理的GM_开头消息外,
   GM_DATA消息直接压入相应UserInfo的发送缓冲区,在连接客户
   端的完成端口模型工作线程中一起发送给客户端。


GameSvr模块
===========
主服务器模块。
需要连接到DBSvr和LoginSvr,接受GameGate的连接。

从代码上看,GameSvr的结构类似流水线作业方式,多线程分别处理流水线的几个步骤。
GameSvr内部流水线主要分以下几个部分:

1、ServerWorkerThread:GameGate消息接收处理
   1) 处理GM_OPEN, GM_CLOSE, GM_CHECKCLIENT等消息
   2) 把客户端消息分类后调用AddProcess加入PlayerObject的Operate处理队列

2、ProcessLogin:登录、退出处理
   由于GameGate发送GM_OPEN消息到GameSvr, OpenNewUser的操作只是新建一个UserInfo插入等待表,
   GM_CLOSE的CloseOpenedUser操作也只是将UserInfo加入等待表,并返回通知GameGate GM_CLOSE,
   因此这里的循环只是检查等待表,根据UserInfo的状态做登录或者退出的操作

3、ProcessUserHuman:
   1) 遍历UserInfoList,依次调用每个UserInfo的Operate来处理命令队列中的所有操作;
   2) 遍历GateList,依次调用每个GateInfo的xSend函数将发送缓冲区中的消息发往GameGate;

4、ProcessMonster:
   循环遍历所有MonsterObject,更新视线范围内目标,执行Operate;
   如果是尸体,并且时间到,就删除;

5、ProcessNPC:
   遍历所有的脚本,分别找到它们的目标对象CScripterObject,执行Operate(相当于AI系统了)
   调用ProcessMerchants和ProcessEvents;
ProcessMerchants:
1) 初始化所有MerchantObject
2) 更新视线范围内目标,执行RunRace

ProcessEvents:
1) 顺序执行事件队列中的事件(火墙之类的都可以用这个实现)

   更新NPC视线范围内的目标;


    一、与LoginSvr的通讯
只保持连接,不做任何消息处理
估计只是为了让LoginSvr知道GameSvr是否活动

    二、与DBSvr的通讯
1、连接建立以后,启动ProcessLogin, ProcessUserHuman, ProcessMonster, ProcessNPC等几个工作线程。
2、处理DBSvr发来的几个类型消息:
DBR_LOADHUMANRCD2,
DBR_LOADHUMANRCD,
DBR_MAKEITEMRCD,
DBR_MAKEITEMRCD2

    三、与GameGate的通讯
GameGate于GameSvr相当于LoginGate之于LoginSvr


DBSvr模块
=========
1、创建完成端口模型socket, 处理从GameSvr发来的几个常用并且耗时间的数据库操作消息:
DB_LOADHUMANRCD
DB_SAVEHUMANRCD
DB_MAKEITEMRCD
DB_MAKEITEMRCD2

2、创建AsyncSelect模型socket, 处理SelGate发来的以下消息:
CM_QUERYCHR
CM_NEWCHR
CM_DELCHR
CM_SELCHR





#pragma once

extern HANDLE                g_hIOCP; //服务器通讯句柄

extern HINSTANCE                g_hInst; //句柄实列
extern HWND                g_hMainWnd;  //主窗口
extern HWND                g_hLogMsgWnd; //窗口消息日志窗口
extern HWND                g_hToolBar; //工具条窗口

extern HWND                g_hStatusBar; //窗口状态条窗口
extern int                        g_nStatusPartsWidths[_NUMOFMAX_STATUS_PARTS];
                                                         //窗口宽度

extern TBBUTTON                tbButtons[5]; //按钮类

extern CDatabase                g_MirDB; //游戏中到的数据库着里用的是SQL数据库
extern CConnection                *g_pConnCommon;  //公共连接指针
extern CConnection                *g_pConnGame;  //游戏连接指针

extern CWHList<char *>        g_xAdminCommandList;  //管理人员命令列表指针
extern CWHList<char *>        g_xUserCommandList;  //用户命令命令列表指针


extern CWHList<CUserInfo*>        g_xLoginOutUserInfo; //外部用户登陆信息
extern CWHList<CUserInfo*>        g_xReadyList;  //等待登陆的用户列表
extern CWHList<CUserInfo*>        g_xUserInfoList;  //用户信息列表
extern CStaticArray<CUserInfo>        g_xUserInfoArr;  //接收用户登陆
extern CStaticArray<CPlayerObject>     g_xPlayerObjectArr; //接收游戏玩家

extern CWHList<CReadyUserInfo*>        g_xReadyUserInfoList; //等待用户登陆网关1指针
extern CWHList<CReadyUserInfo2*>    g_xReadyUserInfoList2; //等待用户登陆网关2指针

extern CWHList<CEvent*>        g_xEventList;  //事件列表指针
extern CWHList<CEvent*>        g_xEventCloseList;  //事件关闭列表指针

extern CWHList<CHolySeizeInfo*>           g_xHolySeizeList; //这里应该是定义的魔法的

extern CWHList<CMerchantObject*>        g_xMerchantObjList;  //商人清单
extern BOOL                        g_fInitMerchant;  //用做什么用途的商人
extern CWHList<CNPCObject*>                g_xNPCObjList; //NPC列表

extern CWHList<CGateInfo*>                g_xGateList; //网关列表
extern int                                        g_nMirDayTime;  //游戏时间日期


// 常规数据定义
extern CWHList<CMirMap*>        g_xMirMapList;  //游戏地图列表指针
extern CMoveMapEventInfo*        g_pMoveMapEventInfo;  //地图切换信息事件指针
extern int                        g_nNumOfMoveMapEventInfo; //地图切换个数
extern CMagicInfo*                g_pMagicInfo;  //魔法信息指针
extern int                        g_nNumOfMagicInfo;  //魔法信息个数
extern CMonsterGenInfo*        g_pMonGenInfo;  //刷怪信息指针
extern int                        g_nNumOfMonGenInfo;  //刷怪信息个数
extern CMonRaceInfo*                g_pMonRaceInfo;  //怪物种族信息指针
extern int                        g_nNumOfMonRaceInfo;  //怪物种族信息个数
extern CStdItemSpecial*        g_pStdItemSpecial;  //特殊物品指针
extern int                        g_nStdItemSpecial;  //特殊物品个数
extern CStdItem*                g_pStdItemEtc;  //其他物品指针
extern int                        g_nStdItemEtc;  //其他物品个数
extern CMerchantInfo*                g_pMerchantInfo;  //商人信息指针
extern int                        g_nNumOfMurchantInfo; //商人信息个数
extern int                        g_nNumOfMapInfo;  //游戏地图个数

extern BOOL                g_fTerminated;  //停止 为BOOL

extern SOCKET                g_ssock;  //服务器端游戏SOCKET
extern SOCKADDR_IN                g_saddr;  //服务器端游戏IP

extern SOCKET                g_csock;  //客户端SOCKET
extern SOCKADDR_IN                g_caddr;  //客户端IP

extern SOCKET                g_clsock;  //客户登陆SOCKET
extern SOCKADDR_IN                g_claddr;  //客户登陆IP

extern _TSEARCHTABLE        g_SearchTable[_MAX_SEARCHTABLE];  //最大搜索表

extern char                        g_szGoldName[8]; //金钱

extern DWORD                NEEDEXPS[MAXLEVEL]; //升级所需经验[等级]

extern HANDLE                g_hThreadForComm; //全局线程句柄
extern HANDLE                g_hSvrMsgEvnt; //GameSvr事件句柄

extern CWHList<CScripterObject*>           g_xScripterList; //脚本管理列表指针

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-7-23 12:30:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

好啊,我很喜欢,我把你的文章下载来晚上慢慢研究,还有楼主,请你把客户端怎么编译告诉我可以吗?我编译不了,系统需要安装一些什么东西,谢谢你了,我帮你顶顶顶顶顶顶~!!

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2005-7-23 13:55:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

我是安装的 DX8 SDK 你可以把你的错误信息发过来 大家一起看看

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-7-23 18:11:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

我的错误信息在这里,请楼主帮看看感激不尽,我装了DX SDK9,开始我没有装SDK编译的时候提示没有DSHOW.h文件,后来我装了DX SDK9提示更多
http://www.gameres.com/bbs/showthread.asp?threadid=33229

还有个问题,服务端主引擎编译了但是启动的时候报错,提示遇到困难,程序意外退出,我想楼主一定知道是什么原因吧,当然我也希望和楼主共同研究,可是我技术太垃圾,希望帮助我~!

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2005-7-23 18:46:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

我编译的时候也是通不过,我安装的是DX 7 SDK  也报错 不过就一出错误 缺少 dshow.h 不过我是重 DX 8a SDK 提取的 dshow.h 又把DX 8a SDK 装上了 结果通过拉

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2005-7-23 18:49:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

你可以把你服务器的主引擎解图发过来,看一下

3

主题

130

帖子

130

积分

注册会员

Rank: 2

积分
130
发表于 2005-7-24 09:25:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

用delphi写的,没有太大参考价值。更要命的是代码不全,就失去了整体架构的宝贵参考意义。还有就是该服务器端的结构已经是古董级的结构,根本不能适应现在商业运营的要求,很难再利用。不过自己玩完还可以。

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-7-24 10:39:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

那么你告诉我现在为止什么游戏能和传奇比,不要说以前,我们就说现在吧,你看看每个SF里面有多少人在冲级,这个是delphi写的吗?真的很好笑,我不知道楼主是不是能看懂delphi语言代码,但是我可以明确的告诉你这个是使用VC++6.0编写的,至于这个引擎能做什么我们中国人还需要多看看就算是垃圾你都写不出来,等楼主有天可以开发这样的东西的时候在说没用吧,好吗?

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2005-7-24 10:43:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

不是我的是用 C++ 写的 我调试通过 可以进入游戏,占用资源也很低 只是个别的地方需要修改整理

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2005-7-24 10:46:00 | 显示全部楼层

Re:我分析的SQL版传奇2的的源代码有不足的地方请高手指出

我的现在就是想那这个服务器端 修改成传奇世界的 现在我已经成功的进入的传奇世界的游戏只是问题多多需要解决,住要还是他的通讯方式和封包的加密解密方式不对所以自己写了个客户端他传奇世界的通讯方式改成了传奇2的通讯方式 达到可以用传奇2的服务器端玩传奇世界的游戏 只是要解决的问题还很多 努力ING!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 15:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表