gpt4 book ai didi

java - 在在线游戏中处理玩家速度

转载 作者:行者123 更新时间:2023-12-04 17:43:25 25 4
gpt4 key购买 nike

所以我正在写这个在线游戏,我有点难以处理我应该多久接受一次移动数据包。问题是,如果不信任客户端一些数据,我无法让它工作。基本上我的想法是:

客户端

/**** [game/client] movePlayer ***/


boolean playerCanMove = Date.now() - player.lastMove > 1000;

if(playerCanMove){

player.lastMove = Date.now();
player.move(RIGHT);
client.send(new PacketMove(RIGHT));
}

服务器:

/**** [server] handle a move packet ****/
/** The only data received from the client is the direction(RIGHT) **/
/** the server has its own player.lastMove **/

let playerCanMove = Date.now() - player.lastMove > 1000;

if(playerCanMove){
player.lastMove = Date.now();
player.move(RIGHT);
}
else{
error = "Player is moving too fast";
}

问题在于服务器 player.lastMove由于数据包到达所需的时间,在客户端/服务器中不会​​相同。

因此,如果客户端发送 2 个移动数据包,第一个移动时间为 100ms第二个旅行时间为99ms服务器会认为玩家移动得太快,如果这不是问题,问题是移动时间会变化并且服务器正在保存 player.lastMove有点晚了,在这种情况下,误差幅度听起来也不太好。

enter image description here

有什么想法吗?

编辑:为示例起见,发送到服务器的唯一数据是玩家想要移动的方向,它只是碰巧是相同的变量名称。服务器有自己的player.lastMove变量

解决方案 Thanks to @Lev M.

我还没有实现这个,但是我想了想放弃了,我找不到任何弱点,如果你有,请随时发表评论!

我认为可以肯定地说,客户端唯一可以做的就是更改时间戳,他也可以更改时钟,但这会产生相同的效果,所以我只是在假设他正在更改数据包时间戳的情况下考虑这个

enter image description here

添加一个额外的 && packet.timeStamp < server.clock

boolean isTimeStampValid = packet.timeStamp >= player.lastMove + 1000 && packet.timeStamp < server.clock

不会出错,它会标记攻击 #1 isTimeStampValid为假

最佳答案

这里有一个我认为很容易实现的想法:不要使用 Date.now() 来计算移动之间的时间。

保持某种游戏时钟。整个游戏开始后可以是毫秒,例如 Unix timestamps ,或者对于每个玩家来说,它可能是唯一的,自他们登录以来的毫秒数。

将其独立保存在服务器和客户端中。您可以偶尔使用类似 SNTP 的方式同步它们,尽管在您的情况下这可能有点矫枉过正。

每当玩家移动时,让客户端在数据包中插入基于此时钟的时间戳以及移动数据。

然后,让服务器上的逻辑检查这些时间戳的一致性。这样,移动之间的时间将忽略数据包传输时间。

如果客户端想要作弊,它不能发送两个时间戳相隔小于 1000 毫秒的 Action 。如果是这样,您的服务器将知道忽略该移动。

您还可以实现一些逻辑,如果它检测到数据包一起到达或接近(100-200 毫秒)但时间戳相隔 1000 毫秒或更长时间,则会停止游戏。这将是捕获作弊者的一种简单方法。

如果你想要一个快节奏的游戏,你不得不在客户端保持状态,让玩家看到他们移动的结果,而不用等待服务器对每次击键的响应。

事实上,根据您的游戏速度,您可能希望向服务器分批报告 Action ,而不是每次 Action 都自己报告,这既是为了节省数据(如果该游戏是针对移动设备的),也是因为这会更快。

然后您的服务器可以一起验证整个批处理的一致性。

关于java - 在在线游戏中处理玩家速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53356322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com