Skip to content

服务端与客户端 ​

永远不能相信客户端 ​

从游戏行业诞生起,反作弊就存在。客户端发来的数据不能轻易相信。

曾有人在 GitHub 发了个作弊 Mod,研究了各大主流 Mod 的协议包漏洞,发现这些 Mod 接收玩家客户端数据时,对数据合理性几乎不判定。打个比方:客户端说自己有一百万个钻石,服务端就真认为有一百万个钻石——于是针对每个 Mod 都写了作弊方案。

开发铁律

你的插件要接收的信息,只要不是你自己指定的(而是服主配的、或客户端发的),都要仔细校验合理性。哪怕你写的不是反作弊插件,警惕意识也不能丢——先虑忧患,享于安乐。

客户端与服务端的关系 ​

先斩后奏 ​

装过领地插件(Residence)的人有体会:把玩家关进一个禁移动的领地,玩家不是完全动不了,而是能动一下、过一小段时间被"弹回来"。为什么不是一点都动不了?

因为客户端移动玩家时,先在客户端显示出移动后的样子,再把这个信号发给服务端。服务端收到后触发 PlayerMoveEvent,你的插件才能取消它。也就是说:

客户端不管服务端取不取消,先斩后奏——先显示出来再说。

想让玩家一点动不了?

单纯取消 PlayerMoveEvent 只能"弹回"。真要完全禁移动,常见做法是把玩家移动速度设为 0,或用透明方块卡住。社区已有成熟方案。

转身也算移动 ​

注意:玩家没改 X/Y/Z、只用鼠标转了下身,也触发 PlayerMoveEvent。高频事件监听要小心性能。

这意味着什么 ​

  • 数据权威在服务端:玩家背包、血量、坐标等,都以服务端为准。客户端只是展示
  • 客户端可被篡改:所以关键判断必须在服务端做,不能依赖客户端传值
  • 反应有延迟:因为"先斩后奏",取消事件总有短暂的客户端表现,这正常

理解了这点,你才能写出安全的插件——尤其涉及经济、权限、玩家数据的部分。


基本概念到此结束。接下来进入基础内容,写出你的第一个插件。