服务端与客户端
永远不能相信客户端
从游戏行业诞生起,反作弊就存在。客户端发来的数据不能轻易相信。
曾有人在 GitHub 发了个作弊 Mod,研究了各大主流 Mod 的协议包漏洞,发现这些 Mod 接收玩家客户端数据时,对数据合理性几乎不判定。打个比方:客户端说自己有一百万个钻石,服务端就真认为有一百万个钻石——于是针对每个 Mod 都写了作弊方案。
开发铁律
你的插件要接收的信息,只要不是你自己指定的(而是服主配的、或客户端发的),都要仔细校验合理性。哪怕你写的不是反作弊插件,警惕意识也不能丢——先虑忧患,享于安乐。
客户端与服务端的关系
先斩后奏
装过领地插件(Residence)的人有体会:把玩家关进一个禁移动的领地,玩家不是完全动不了,而是能动一下、过一小段时间被"弹回来"。为什么不是一点都动不了?
因为客户端移动玩家时,先在客户端显示出移动后的样子,再把这个信号发给服务端。服务端收到后触发 PlayerMoveEvent,你的插件才能取消它。也就是说:
客户端不管服务端取不取消,先斩后奏——先显示出来再说。
想让玩家一点动不了?
单纯取消 PlayerMoveEvent 只能"弹回"。真要完全禁移动,常见做法是把玩家移动速度设为 0,或用透明方块卡住。社区已有成熟方案。
转身也算移动
注意:玩家没改 X/Y/Z、只用鼠标转了下身,也触发 PlayerMoveEvent。高频事件监听要小心性能。
这意味着什么
- 数据权威在服务端:玩家背包、血量、坐标等,都以服务端为准。客户端只是展示
- 客户端可被篡改:所以关键判断必须在服务端做,不能依赖客户端传值
- 反应有延迟:因为"先斩后奏",取消事件总有短暂的客户端表现,这正常
理解了这点,你才能写出安全的插件——尤其涉及经济、权限、玩家数据的部分。
基本概念到此结束。接下来进入基础内容,写出你的第一个插件。
