📄 新建 文本文档.txt
字号:
今天发的是游戏里的全局变量的定义!因为我也是个新手有什么翻译不好的地方请不要骂我呀还有请高手给看看有什么不对的地方谢谢拉以后我回定期的发一些上来直到把正个程序都给大家分析一遍我是逐行分析,不知道可不可以,不过我会坚持的!分析错误的大家一定要指出来,一起学习!有什么不懂的可以加我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; //脚本管理列表指针
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -