【问题标题】:PHP battle system integrity [closed]PHP战斗系统完整性[关闭]
【发布时间】:2012-09-18 22:43:32
【问题描述】:

我正在尝试为我一直在设计的一款在线游戏编写一个 php 战斗系统。

简而言之,它将是一款 MMORPG,玩家的统计数据将保存在几个 MySQL 表中,怪物数据也将保存。

简而言之,我担心人们会通过编辑怪物的 hp 来做某事,所以它说他们杀死了怪物,将他们的 HP 最大值保留在计算机上(因为更新不是不切实际每转一个 MySQL 条目?),或者别的什么。

我仍然只是 PHP 的中级,所以我不确定如何隐藏这些值不被用户更改,但又不会通过每次发生攻击时更新 MySQL 表来造成严重的服务器拥塞。

谁能告诉我以下一项或多项:

  1. 有没有办法单独在 PHP 中隐藏这些活动变量以防止被编辑以允许作弊?

  2. 如果没有,或者它对服务器不是很友好,是否有一个相对简单的 Java 小程序或用于控制主机变量的应用程序,可以以相对简单的方式进行编程?

目前怪物只有普通攻击,玩家只有攻击,不过我打算先扩展玩家的技能攻击。

【问题讨论】:

  • 你被否决了,因为这里没有真正的问题。你本可以删掉这个问题的 3/4 并仍然传达信息。我建议您重新考虑您的要求,然后再试一次。
  • 首先,服务器端(PHP)的变量不能被用户编辑。其次,一般来说,游戏防止作弊的工作方式是请求做某事,并处理实际的计算服务器端。 EX:客户端请求攻击,服务器确定他们是否可以,以及它造成了多少损害并将其报告给客户端,客户端已经显示了他们认为应该是什么样子,如果服务器不同意,应该改变。
  • @Alex Luunix 谢谢,我知道 PHP 本身不能被用户编辑。我的问题是,如果您对 Cheat Engine 有所了解,您是否可以更改浏览器属性中的内容。我担心用户会使用某种东西让浏览器始终认为他们仍然拥有最大 HP,并将该值返回给服务器......我的问题是我如何才能高效地执行您最后所说的操作?以 MP 为例,每次施法时不断更新 MP 不会占用带宽吗?

标签: php mysql system


【解决方案1】:

您永远不应该相信浏览器提供给服务器的内容。浏览器可以发出它想要的所有请求(例如,向前移动 5000 英尺),但是如果服务器查看请求并说“哇,你不能那样做!最大速度是 2 英尺/秒”!然后你只是拒绝“移动请求”,或者你忽略它,你的选择取决于实现。

例如,客户端(无论是浏览器还是桌面上的应用程序)可以存储它想要的所有数据。它可以存储HP和资源。服务器也有自己的副本。如果有人要使用一些内存更改工具(例如 Cheat Engine),他们所能做的就是修改客户的数据(例如,而不是 100 美元到 1,000,000 美元)。但这没有任何意义,因为如果客户端请求购买 50,000 美元的商品,服务器将验证该请求。它查看服务器上的资金,而不是客户端,并注意到用户资金不足。只要告诉用户“钱不够”,npo 交易就完成了。

如果客户端试图弄乱客户端的内部存储器,我不会担心客户端不再正常运行。只要确保服务器批准所有游戏状态修改请求,一切都会好起来的。

如果您想避免向网络发送垃圾邮件并保持用户的移动有效,则客户端可以假设服务器将批准请求。因此,您可以允许用户移动一定距离并在几秒钟后发送一个请求,或者您可以发送多个请求并在等待服务器批准请求时显示角色移动。如果您发出多个请求并且服务器需要一段时间来响应,这会为客户端带来与服务器不同步的新问题。

一般来说,您必须发送大量请求,并且每次用户执行某项操作时您都必须发送请求,因为您希望其他用户也看到您正在执行的操作。没有办法解决这个问题,但您可以使用巧妙的压缩和延迟策略让客户端运行更顺畅。

如果您想避免一直访问您的 SQL 服务器,您可以使用缓存工具,例如 Memcache,PHP 非常方便地支持该工具。 Memcache 可以在内存中存储您需要的任何内容,以实现非常快速的数据存储。当然,这有一些注意事项,因为您需要将缓存与数据库同步,反之亦然。

【讨论】:

  • 谢谢,亚历克斯就是这么说的,但我问的是如何在不淹没数据库查询的情况下做到这一点?在您的移动示例中,我如何将其设置为服务器知道我已经移动 6 英尺的位置,而不将其更新为每秒移动 2 英尺,持续 3 秒?在我看来,如果有几个人在做,这不会对连接造成压力吗?我的服务器计算机功能强大,但带宽不太热,正在尝试找出带宽最轻的方式。
  • @Reidmere,上面的其他人是对的:SO 通常针对更具体的问题。我认为回答这个问题可能会帮助您了解更具体的问题。
  • 谢谢,我已经为你所花费的时间和细节投票给了你最佳答案......但我仍然不是一个答案。我喜欢你对运动的想法,但正如我所说,我最初是从回合制开始的。因此,关于 MP 示例的想法,如果有足够的 MP,我如何以 CURRENT MP 不断更新的方式设置它,而不会对带宽造成压力以检查 SQL EACH TIME?或者这只是我注定的命运,直到我制作一个 .exe 载体来实时运行它们?
  • 我不明白你所说的“直到我制作了一个 .exe 载体”是什么意思。 PHP 被解释而不是编译(虽然我想你可以编译 php 代码)。
  • 另外,我更新了关于您的 SQL 问题的答案。
猜你喜欢
  • 2014-10-15
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2012-09-22
相关资源
最近更新 更多