地图伺服器要判断玩家的移动是否合法 那是不是要载入整个地图数据到内存 出入游戏圈 多谢前辈指点


不是游戏制作人员,靠经验来猜测一下地图地形是封装在客户端里的,障碍和能否越过应该是游戏引擎里写好的东西,不用反馈给伺服器,但是百密总有一疏,所以你可以看到几乎所有的3DMMO都有一些地图上的「死角」

游戏中的地图都是分块载入的,而人物所在的位置数据是用坐标来记录的,伺服器只用判断坐标位置是否在当前这块地图的范围内,即可判断角色的移动是否合法


看情况

比较严格的伺服器是和客户端共享地图数据的,不同只是伺服器不需要地图贴图之类的资源而已。

对于地图格子,碰撞,都是数据而已,伺服器和客户端都会持有对应的数据并运行相同的演算法。

这也是为什么很多游戏有伺服器导航的功能。

但是这些都是老东西了,新项目一般都不会这么干,因为费力不讨好。

客户端作弊这种东西,现在是记录优于防范,目前的流行是伺服器不处理客户端的玩家动作行为,只校验,但是不修正,修正成本太高。尤其是移动互联网,鬼知道他是外挂还是网路不好。

校验不通过就记录,超过一定数量自动封停。省时省力省心。

首先并不是所有游戏都有需要 「判断玩家的移动是否合法」 这个需求的,一般时间收费的游戏更看重这一点,时间收费的就是希望你多多在大地图上跑图,好赚点卡钱,对传送类外挂的打击也比较严厉的,所以服务端校验移动包比较严格的。

那么怎么校验呢,伺服器上有一张地图掩码,比如一个10m×10m的地图,以1m为单位划分单元格。希望校验的更准确就用更小的格子。客户端和伺服器一般统一标准划分,因为客户端也依赖这些划分的小格子做A*。得到一个10×10的二维数组,每一个元素对应一个格子是否可以通行。能,或者不能,仅有两个状态,用1位表示即可。则一个位元组8位,可以表示8个格子。则10m×10m的地图掩码需要 10 × 10 / 8 向上取整,13个位元组即可表示。

客户端滑鼠点击地面,或者点击小地图,寻路这一步一般先由客户端完成,得到一组拐点,包括起点和终点,拐点和拐点之间就是直线行走了。客户端的一次不规则移动,由多次的直线移动组成。客户端每次向伺服器发送下一个拐点(即本次直线移动的目标点),伺服器验证客户端当前坐标和目标点之间的连线,所经过的每一个1m×1m的单元格所对应的地图掩码是否可以通行。如果本次移动的直线路径会穿过不可通行的单元格,伺服器计算一个碰到障碍前的新坐标做为目标点返回客户端(也可以粗暴点,不计算,直接将客户端拉回本次移动的起点)。多次出现非法路径的客户端视为外挂。
有个专门的服务用来处理位置问题,载不进去?全国地图也就几个G.

根据各种图片拼接出来的


服务端是要载入所有地图以及所有在线玩家,按照客户端发送的操作效验后广播给其他玩家。


我说下2D地图:一般做法会把地图分成两部分,一个是显示(图片或者动画),一个是可行走区域的数据(可以用一堆0101.来表示,50*50为一个格子,0表示此格子可行走,1表示此格子不可行走)。显示部分只有客户端需要,行走功能一般是客户端计算可行走区域数据来实现,假如伺服器需要验证当前玩家的位置是否合法,也用数据部分。或者你直接把行走放到伺服器来实现,但这样很浪费.......
伺服器会有一个简略版地图数据

首先,要知道玩家移动合法判断和载入整个地图数据没有任何联系。

其次,你游戏上线的时候伺服器会知道你的位置;

然后,你想要提出移动位置指令的时候,伺服器会经过几个关口的校验把控才会发出让你合法移动的指令。

最后,这个过程想要加挂成本是非常高昂的,基本没有成功的可能。
推荐阅读:
相关文章