Articles of mmo

MMO游戏中的水平加载理念

我在项目上工作了很长一段时间,我已经回到关于级别加载的困境。 问题是我相信与它的本地水平加载客户端,当它完成加载它告诉服务器join到服务器机房数据stream和服务器启动发送数据。 我目前的设置 客户端login,在login服务器上发送字符。 客户端select字符并开始在本地加载级别。 当客户端场景完成加载时,请求添加到房间。 客户端收到他需要的数据。 我担心用户可能会破解客户端,并实际加载其他场景,导致玩家和角色穿过道具和模型,也可能是利用隐藏的数据和项目。 相反,在服务器发送选定的字符之后,它可以“等待”用户发送已经完成加载的响应。 之后,服务器将角色join空间并将数据发送给用户。 这样,客户端不知道任何关于房间或它的名字。 有什么建议么?

一个MMORPG服务器应该排队的数据包

我不知道在哪里问这个问题。 我有一个服务,我们将调用GameDB连接到一个MySQL数据库。 这个GameDB是与数据库交互的唯一服务。 我有另一个服务器,我们会打电话给GameSV模拟世界等。 在某些时候,GameSV将数据包发送到GameDB,然后GameDB根据数据包数据更新数据库中的一些logging。 当我踢出GameSV的所有玩家进行一些维护时,会发生奇怪的事情。 GameDB应该在这一点上保存一些数据。 每个连接的用户约10个更新/插入语句。 所以如果有500个用户在线并同时踢了,GameDB会尝试同时更新/插入大约5000条logging。 这是我注意到一些数据没有提交/更新数据库。 虽然这只有在我同时踢全部球员时才会发生。 目前,GameDB的编码方式是一旦它到达并直接更新/插入到数据库中,就会处理数据包。 没有在应用程序级别排队。 我明白,TCP / IP已经排队数据包本身。 所以现在我认为它一定是数据库。 但所有这些只是一个猜测。 所以我的问题是, 请问使用队列来排队数据包有什么不同? 你怀疑别的东西是真正的罪魁祸首吗? 我是一个业余networking游戏开发者,所以我不确定服务器的devise。 如果有问题,我正在使用Go-lang的服务。

在MMO中​​同步移动

我正试图决定如何在MMORPG中实现玩家动作。 玩家位置必须以符合以下要求的方式进行同步: 低滞后 很难入侵或作弊 权威的服务器,持续准确地掌握玩家的位置 相当简单的实施 我已经知道了两种方法: 客户端发送位置:每隔一段时间,客户端将该玩家的当前位置发送到服务器。 这是最简单的。 客户端发送input:基本上,玩家的机器将按键发送到服务器,服务器处理所有的模拟和状态,每隔一段时间发回一次玩家的位置。 这两个系统都有其优点和缺点。 是一个优于另一个,还是有更好的select?

服务器成本和移动设备的反载

一家公司找我devise一个移动平台的MMO,我对他们有完美的想法。 我的问题是一个FTP游戏同时拥有PVE元素和PVP成本的服务器多less钱? 你也认为这会更好,或者甚至有可能将数据加载到手机上(在紧急情况下试图想出一些备份数据的有趣方法)。 我不希望游戏完全依赖于在线(我不仅希望吸引电话用户,还希望吸引iPod touch用户),并且让他们成为一种离线模式。 如果你不能说这是我的第一个游戏,除了我已经完成的简单的项目。 任何帮助将不胜感激。

玩家和墙壁的在线MMO碰撞检测

我们假设如下: 我有一个存储玩家位置的服务器(float x,float y,float z) 客户端发送服务器的更新位置是250ms左右。 服务器具有所有建筑物和玩家的边界框(假设每个墙都有自己的AABB或OBB) 对于广义相位碰撞检测,我使用基于边界框的空间散列。 客户端在本地进行全面的三角级碰撞。 我的问题: – 如果玩家仅通过AABB或OBB穿过服务器上的墙,我如何快速计算出来。 或者,没有三角级的碰撞检测,没有办法做到这一点。 也许一些其他的数据结构? 任何帮助,将不胜感激。

基于networking的游戏基于networking聊天的结构示例

什么是最好的工具来创建一个基于Web的聊天/消息系统? 为客户端我们有:浏览​​器(任何JS解决scheme – 最好不使用像Flash中的jsocket) 对于服务器,我们有:PHP / Python /(node.js不能确定这个)可扩展的MySQL结构可扩展的MongoDB集群可扩展的redis服务器memcache服务器(每个128GB ram)一堆服务器与路由器(socket基础负载平衡器stage- 4)零-MQ和/或rabbitMQ 我们将有公会聊天,区域聊天(在Xkm内)/领土聊天/ PM 我们有超过一百万的玩家,两万个同时在线的玩家将会分组聊天 根据地理位置,每个小组将有大约100-2k的玩家 客户端将拥有移动应用程序(android和iphone),如果他们select(并推送PM的通知) 我的问题是什么将使用客户端服务器技术的最佳组合? 谢谢

MMORPGdevise问题:在客户端计算机上存储一个瓦片地图,安全问题

在我的游戏中,客户端login并从服务器接收由瓦片(高度和地形types不同)组成的地图。 我将这些瓷砖存储在客户端上的SQLite数据库中。 客户端下一次login时,它将与服务器通信它已经拥有地图。 这可以节省服务器上的networking负载和CPU,并减less加载时间。 现在我想知道我是否做对了。 因为玩家很容易在当地的SQLite数据库中修改图块,所以把一座山变成平坦的客户端,然后走过去。 我当然会在服务器上实现一个一次挑选一个或几个玩家的系统,并检查他们的报告位置是否有效(如在他们不是黑客攻击),但是我不能经常对所有人执行这些检查出于性能原因。 这带来了以下问题: 我可以在本地encryptionSQLite数据库吗? 我会隐藏代码中的密钥吗? 那安全吗? 客户能find钥匙吗? 即使我没有将其存储在数据库中,地图是否可以在客户端上进行更改? 感谢大家

更新数以百万计的随时间变化的实体的最正确/有效的方法?

云中有一台服务器和一个数据库。 我们有一个游戏,每个玩家可以在一个巨大的x,y网格上种植一个农场。 每个小时都是一个成长周期。 所有玩家都可以收获任何人的植物。 玩家A种植一些种子并注销。 玩家B在五小时后login并收获玩家A的植物。 在下午3点,x,y网格上会有一场全球性降雨,为植物提供一个奖励增长周期。 场景1:服务器给每个玩家的行为加上时间戳,而全局雨为全局效果添加一个反作用,当玩家login并应用到他们所看到的区域时读取全局效果,这个效果每天只能发生一次,并且在夜间维护中被删除。 玩家A:植物种子1:00 PM。 (服务器时间戳为1:00 PM的工厂实体)并注销。 玩家B:在下午6:00logging收获种子(植物生长周期为5 + 1(雨))= 6(当玩家B在他的视野区域中看到植物时,计算生长周期) scheme2:服务器在所有实体上进行全局更新。 玩家A:种子1:00 PM。 (没有时间戳)。 注销生长周期每小时:2:00 PM +1,3:00 PM(雨)+2等 玩家B:login并收获植物。 情景1似乎是最好的情况,同时也检查玩家周围的视图区域,并在小时或雨后更新植物,因此保持login的玩家将看到植物生长。 我觉得我缺less一些东西,比如全局的closures服务器。 两种情况对不同的function都有用吗?

服务器的值和状态栏显示的同步(健康,耐力,魔力…)

我正在努力为我的MMO实施耐力体系。 简而言之,我计算出了通知客户端的服务器上的所有内容。 在客户端,我有一个耐力栏,显示耐力数额。 我的问题是,服务器上的值和客户端上的值往往不同步,因为networking延迟,并导致在酒吧奇怪的行为。 编辑2: 有些东西可以影响一个属性的重生/消耗。 我的架构是服务器的权威性,服务器负责处理平面变化和每秒变化量的变化,这是一个约束。 结束编辑2。 客户端(C)和服务器(S)之间的通信scheme如下: C:我想用耐力 S:好的,你的耐力是X / Y下降 C:将耐力设置为X,并相应地将该杆设为Y / s 这个初始握手后每隔1秒 S:这是你的耐力X_i,它正在以Y_i / s递减 C:使用信息以一种类似于线性的方式连贯地animation耐力杆 只要S知道耐力是0 S:你的耐力是0 C:将耐力棒设置为0 由于丢失同步,当真实值不是真的0时,可能会出现0值。客户端在每帧显示时都保持一个减less/增加的浮动量,并将其上限为int。 我已经尝试的选项: – 每当服务器更新你的时候,强迫它的价值:导致跳跃行为,并没有达到假线性 – 当服务器更新你时,计算客户端的再生/损失因子(服务器数量+每秒增量) – 客户端数量。 导致最多的过冲(当客户端值不为0时,客户端值将变为零)。 – 每当服务器更新您并且您发现服务器值和客户端值之间的增量时,运行一个协同程序可以添加/减去超过客户端值的两个或三个帧。 还是太蠢了,有时错误是如此之大,使酒吧做出巨大的飞跃。 语言c#,networking库光子,引擎统一。 编辑1: 我的部分解决scheme是: 服务器向您发送一个更新,包括持续时间和目标值,该持续时间已经过去了。 客户端在每次更​​新时都会从当前值开始调整(DOTween库),直到超过该持续时间的目标值。 我有问题,有时客户端将显示0,当不是在服务器上的情况下,由于networking延迟,没有及时停止客户端, 如果你达到0在我的情况下,我不得不执行冷却等待那不是发生服务器发出的冷却时间的命令。 所以我所做的一直是让服务器接受来自客户端的情况。 这似乎是行得通的,但每秒变化的增量值,有时可能会减慢,或者变得更快一些,有时候这是明显的。 结束编辑1。 编辑3: 额外的调整,使它看起来更好一点。 当在客户端发生开始/停止使用统计的事件时,我停止统计栏并等待服务器更新。 结束编辑3。

cron工作为MMO浏览器比赛

我必须在我的MMO浏览器游戏中实现cron作业。 就像在Travian游戏中 – 你建立了一些东西,然后等待几分钟或几小时..但是问题是,shedulers所做的每一秒/每分钟/每天等工作。但在我的游戏中,我需要shedule成千上万同样的工作,必须分开运行,经过一段独特的时间后才能发布。 到目前为止,我对这个想法感到不幸。 我正在使用Node.js,我只是尝试了这么多的节点shedulers,他们似乎不应该有成千上万的工作..我可以运行几个唯一的唯一。 我也许可以做一个类似cron的工作,每运行1秒钟,检查Redis DB是否完成任何工作。 但是,这听起来很疯狂..如果我只有几个工作,他们只在24 hous,我的服务器检查,每1秒..任何想法我该怎么办? 到目前为止,最好的select是删除cron作业。 我正在做一些没有cron工作的stream程。 但其他进程真的很难计算,而且用cron作业要容易得多。 但我更深入,我认为有可能计算eveyrthing和模拟一切没有cron工作。 例如,用户具有统计模型内的资源。 我有小时资源收入那里。 如果用户想要构建任何东西,例如陷阱,我必须重新计算用户资源并保存新值,请设置新的updatedAt。 这是我如何更新我的用户资源(内部统计模型),当一些用户想要建立一个陷阱。 Stats.findOne({user_id: user_id}).exec(function (err, newstats){ var time_in_ms = (new Date()).getTime() – new Date(newstats.updatedAt).getTime(); var ressources_per_second = (newstats.base_income + newstats.field_income) / 60 / 60; var current_ressources = newstats.resources + parseInt(time_in_ms / 1000 * ressources_per_second) – traps_price; if(current_ressources < traps_price) […]