(如果你不知道我在讲什么,可以先读读这个,但总之这些文章更多是科普性质)
这篇文章是对VisionUpdateMessage的结构的大体解释,它也涉及到BS的对战结构
(这是服务器加密结构,服务器将需要发送的信息按顺序加密(加密其实就是以指定的数据结构写入,如血量在33模式中是用16位二进制的压缩整数(VInt)写出,上限是65535),并把一堆0和1用UDP连接发送给客户端,客户端按照预定的解密方法按顺序解密,得到战场信息,并稍微处理和添加特效后渲染在屏幕上,这个过程每秒进行20次)
(服务器不会把所有的东西都发给客户端,比如在草丛里的敌人显然根本不用加密)
(这是v36.218巴兹版本的结构,所以不要问“装备去哪了?”)
(下文中英文为SC具体存在的结构,中文为我自己的总结,粗体为只给自己发的信息)
StartLoadingMessage
这其实不是战斗包,但它会让客户端开始加载并为解密战斗包做好准备,而且它也包含了至关重要的信息:
玩家数量
玩家信息(队伍编号、角色、皮肤、等级、星辉、妙具、表情、名字)
地图编号
VisionUpdateMessage
GameObjectManager
包括:
自己的游戏物件的全局ID
地图信息(每个可摧毁物块是否被摧毁)
玩家信息加密(我自己概括的)
对于每个玩家:
是否有大招(蓝圈)
单鸡数据(未知)
发送表情信息
Accessory(妙具加密,如果有)
妙具加密:
妙具剩余次数
妙具冷却
妙具不可用状态(0=可以使用(绿色),1=正在使用,4=用完,5=正在冷却,10=“生命值已满”,12=“子弹已满”......)
妙具正在使用信息(开始使用时间及一些妙具的额外角度、如佩佩一妙具)
是否按住大招(黄圈)
大招充能
一些模式的特殊信息
击杀列表(击杀公告)
每个GameObject的全局ID
每个GameObject的DataReference
(DataReference是一个含有两个整数的数组,可以表示游戏中的任何“数据”,前一项表示CSV ID,后一项表示对应数据在CSV中的编号(行数-2),如雪莉是(16,0),雪莉大招子弹是(6,1) ,CSV ID见下)
依次对每个GameObject进行加密
(SC应该使用了某种高级编程语言(最有可能是Java)的继承功能,GameObject有自己的加密方式,同时Character AreaEffect Projectile Item都继承了GameObejct加密并各有自己的加密方式)
GameObject
X坐标
Y坐标
“编号”(队伍编号x16+队伍中编号,游戏将这个数整除16得出是否一个队伍)
Z坐标(为什么不和XY放在一起?)
(如果不是Projectile)FadeCounter(渐变的隐身程度,0~10,但其实=0时根本不会将这个GameObject加密给客户端)(没错这也是服务器控制)
Character(继承自GameObject)
上身角度
下身角度(瞎起的名字)
是否脱离控制(冲锋和眩晕时为否,客户端会停止发送输入并停止移动预测使冲锋平滑)
状态(1=移动,3=攻击,4=不动)
攻击刻数(用于播放动画)
一些特效(紫、眩晕、瞬移粒子、脚下星辉标志)
纳尼飞机坐标(用于摄像机移动,但游戏中似乎不使用)
更多的特效(加速、减速、压制治疗、贝尔大招、贝尔普攻、红(装弹)、脚滑(客户端不会自动判断是否在小罗大招上))
冰冻槽积累程度
毒特效(可以有多个)
治疗特效(只能有一个)
注意:有些特效有皮肤变种(如黑鸦皮肤和贝尔皮肤),这时候需要再加密一个整数告诉客户端显示什么,对应projectiles.csv中的PoisonType和AddEffectType
血量(会根据游戏模式不同使用不同的字节数加密)
(,召唤物没有,除了里昂的分身会读取一部分信息)
一些特殊英雄的特殊信息(贝亚的充能子弹数、瑟奇等级)
特殊宠物信息(你猜ShouldEncodePetStatus是干啥用的?)
充能条(比比和莫提斯二星辉(现在是被动))
其他特殊信息(首领阶段、可见状态、黄色眼睛)
加速/减速信息(用于预测移动)
伤害指示器信息(红色、白色、绿色、“免疫”)
技能信息(激活时间、冷却时间、子弹数、可切换技能的角色的当前技能(机甲首领、山姆、切斯特)
Projectile(继承自GameObject)
谁在乎?
AreaEffect(继承自GameObject)
谁在乎?
Item(继承自GameObject)
谁在乎?