主要的几个对象类
1.Object类主要功能
1) InWorld判断和操作
2) GUID
Mangos的每个对象都有唯一的GUID,每类GUID的最大值是保存在数据库中,初始化时候从数据库加载。Mangos这样做还是很奢侈的,国内服务器可能都存在合服需求,所以国内服务器操持角色ID不同即可。可能要合服的服务器在开服的时候要把的角色ID范围要规划好(天龙八部的角色ID的最大值是保存在数据库中的)。国内服务器中对于重要物品、宠物可能需要唯一的ID,可以考虑角色ID + 物品、宠物id来实现。uint32应该够用了,但是也要限制重要物品的种类和数量。
3) Object类型TypeId
enum TypeID
{
TYPEID_OBJECT = 0,
TYPEID_ITEM = 1,
TYPEID_CONTAINER = 2,
TYPEID_UNIT = 3,
TYPEID_PLAYER = 4,
TYPEID_GAMEOBJECT = 5,
TYPEID_DYNAMICOBJECT = 6,
TYPEID_CORPSE = 7
};
4) 网络包发送SendUpdateToPlayer
5) 基本状态组包Values、OutOfRange、Movement UpdateBlock等
6) Int, UInt, float等标记数据设置、加载、访问Get/SetXXXValue、SetFlag
union
{
int32 *m_int32Values;
uint32 *m_uint32Values;
float *m_floatValues;
};
Object有很多数据、状态以数组形式存储,访问时候通过类型和标记定位。
7) 任务判断接口hasQuest
2.Item类主要功能
1) 创建和复制Create/CloneItem
2) 所有者Owner(Player)
3) 数据库存取SaveTo/LoadFromDB
Mangos的每个Item在数据中是作为一条记录保存的,一般国内网游是打包保存在玩家记录里面,国内网游的做法在数据库效率上要高很多。
4) 绑定Binding、损坏Broken、是否可交易CanBeTrade、叠放数量、是否装备等一般道具属性
5) 在包中的位置Bag、Slot
6) 增强状态和时效Enhancement
7) Timer更新
8) 状态更新和广播State
9) 技能和魔法相关Skill/Spell
10) 任务相关hasQuest
3.Bag类主要功能
1) 增加、删除、得到某位置的道具Store/RemoveItem
2) 空间IsEmpty、GetFreeSlots
3) 数据库存取SaveTo/LoadFromDB
4) 组包更新BuildCreateUpdateBlockForPlayer
4.WorldObject类主要功能
1) 位置和朝向Relocate、SetOrientation
2) 附近空间位置GetClosePoint
3) 所在地图、区域和地区GetMapId、GetZoneId、GetAreaId
4) 名字GetName
5) 和其它WorldObject位置、角度等关系IsWithinDist、IsInRange
6) 发送网络消息SendMessageToSet
7) 发送聊天、喊叫等消息MonsterSay、MonsterYellToZone
8) 对玩家来说是否可见isVisibleFor
9) 召唤Creature,SummonCreature
5.Unit类主要功能
Unit类是很复杂的一个类,改类具有很多属性和方法,实现了游戏中Player,Creature等主要功能。
1) 渐变状态GetDiminishing
2) 战斗相关(计时器、攻击对象、停止等)setAttackTimer、Attack、getVictim、SendMeleeAttackStop
3) 单元状态addUnitState
4) 等级、种族、职业、装甲、血量、伤害能力等属性getLevel、getGender、getRace、GetArmor、GetHealth、GetPower
5) 友好、敌对等阵营关系IsHostileTo、IsFriendlyTo
6) 站立、行走、骑乘、战斗、飞行、水下、恐惧、死亡等状态getStandState、IsMounted、DeathState
7) 技能和伤害处理DealDamage、MeleeSpellHitResult、GetWeaponSkillValue
8) 类型(商店、银行、飞行点、行会、拍卖行等)isVendor、isBanker
9) 施展法术CastSpell
10) 光环状态和特效以及数值影响HasAura、RemoveAura
11) 广播伤害、攻击状态等消息SendAttackStateUpdate、SendSpellMiss
12) 主人、召唤者、宠物等信息GetOwnerGUID、SetCharmerGUID、GetPet
13) 状态更新广播stat system
14) 可见性处理Visibility system
15) 威胁值处理Threat related methods
16) DynamicObject对象和GameObject对象的附加GetDynObject
17) event处理m_Events
18) MotionMaster
Unit类设计得过大,还包含了战斗、技能、伤害处理、光环状态影响等这些比较复杂的功能模块。
6.Creature类主要功能
1) 加入到世界
2) 加载装备
3) 数据库存取
4) 类型,是否是车辆、宠物、图腾、精英等
5) 能力,能否行走、游泳、飞行
6) 对技能免疫
7) AI和脚本
8) 售卖的道具
9) 状态更新
10) 对话内容
11) 聊天、喊叫
12) 战斗行为,寻求帮助
13) 重生处理
14) 任务相关
7.Player类主要功能
1) 加入到世界
2) 传送
3) 更新
4) 社会关系
5) 飞机
6) 位置
7) 宠物
8) 聊天
9) 装备、背包和仓库
10) 增强状态
11) 完整的任务处理
12) 数据库存取
13) 邮件
14) 技能
15) 天赋
16) 声望
17) 战场
18) 战斗状态和模式更新
19) 竞技场
20) 移动处理
21) 副本
22) 组队
Player类是继Unit类后另外一个很大的类,实现和很多功能。我现在很佩服Mangos服务器的程序员的水平了,这么多功能,居然一个类搞定。这样的代码对后继维护和修改者绝对是噩梦。
其它类比较小,略过。