问题标签 [mmo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
356 浏览

c# - 登录服务器的连接,转发到世界服务器

我有几个关于套接字的问题,我搜索但找不到直接答案。

我有一个登录服务器和一个世界服务器。我从TcpClient to the TcpListener. login server我想要both a Tcp and a Udp connection on the world server,所以一旦登录被检查,我TcpClient使用重定向到世界服务器TcpClient.Connect

在这个过程之后,我告诉客户端通过 连接Udp to the login server,然后使用Socket.Connect再次转发到世界服务器。

我转发而不是将客户端消息发送到客户端进行重定向的原因是我只want to expose the login server IP and port to the client.

我对套接字没有经验,有没有更好的重定向方法而不暴露世界服务器 IP 和端口?

0 投票
1 回答
717 浏览

c# - MMORPG 和游戏客户端

我想知道如何制作一个像你看到的那些 MMORPG 那样的客户端,他们有一个读取游戏文件然后启动游戏的客户端。我已经知道大多数客户端是用 C++ 编写的,但不幸的是我不会这种语言,我只知道 C#。但我不打算做一个完整的客户端,因为我和我的朋友想做一个小型 2D 游戏,我们需要一个客户端来读取包含声音、图像等的外部数据文件,并调用服务器,一旦收到响应,它就会发送 IP 并启动客户端。

由于我不是一个出色的抽屉,我一直在创建客户端。我做了一个小函数,它调用服务器端口并检查它是否在线:

但除此之外,还有其他一些不重要的事情,我不知道该去哪里,我读了无数 C# 书籍,但没有人指出,甚至没有给我一个简单的提示。所以我觉得自己就像一个迷失在公园里的孩子。所以我要问的是,在制作游戏客户端的过程中还使用了哪些其他组件。它不需要直接的“这就是你的做法”。简单的指针会很好。

0 投票
1 回答
1989 浏览

java - MulticastSocket 多人游戏

我正在研究多人游戏中服务器-客户端通信的结构。

我得出的结论是 UDP 是最好的选择,因为它采用“一劳永逸”的使用方式,即使丢包也不会阻塞应用程序。我还将使用 TCP 发送需要可靠性的数据包,例如在登录过程和交换服务器更改、地图更改、更新等信息的过程中。它还将运行基于 IRC 的聊天。(所有命令实际上都是 IRC 样式的自定义消息)。

我想知道在服务器和客户端之间发送交互消息(移动、咒语、对象、动作等)的最佳方式是什么。

阅读了一些文档,我来到了 MulticastSocket。

我的问题是:

最好将连续的信息流发送到为每个播放器启动一个线程的所有客户端(就像我在 TCP 通信中所做的那样),其中每个 DatagramSockets 将侦听一个队列,将每个新消息发送到其客户端。这意味着所有地图和所有动作(假设地图上可能有 50 名玩家)将发送给所有玩家,并且每个数据包必须更大以包含所有这些信息。或者最好为每个地图使用一个线程,仅当某些玩家在该特定地图内时才处于活动状态,使用多播通信,仅向该地图内的玩家发送消息,并使用 MulticastSocket 进行侦听。

我阅读了有关使用多播的防火墙或路由器的问题,但我无法弄清楚这些问题可能是什么(不同于普通的 UDP)。

该应用程序应该由几乎没有配置问题的任何人使用。

0 投票
3 回答
1823 浏览

c# - C# MMO 服务器结构

我正在为演示游戏编写一个简单的 mmo 服务器。我正在使用 UDP 协议(​​UdpClient),但我想知道其他服务器是如何工作的?:

  1. 只有 1 个 UDP 客户端处理所有连接的客户端和消息并响应它们
  2. 服务器为每个连接的播放器创建一个新的 UDP 客户端实例?

我已经测试了连接 50 个发送“Ping”消息的客户端,服务器必须回复“Pong”。第 50 个“Pong”发送大约需要 10 秒(在本地主机上)(同时,服务器应该也向第一个玩家发送 ping,因此队列可以延长到几个小时,这是荒谬的)

0 投票
3 回答
1566 浏览

java - Java 会话实现

我正在开发一款多人在线游戏。我有以下问题:

当用户断开与服务器的连接时,他需要重新连接。在第一个连接处,在注册期间,注册模块会生成一个特殊的 ResponseDispatcher,它保存对连接 Channel 的引用。但是如果用户退出,这个 Channel 就失效了。尽管我可以检测到问题并清理资源,但我必须将注册模块和连接模块的引用存储到游戏模块,以便在用户授权并重新连接时更新 Channel。这在模块之间产生了很多相互依赖,并且很难维护。

我需要的是 Servlet Container 中的 HttpSession 之类的东西,这样我就可以从我的服务器的所有模块中获取对我的通道和会话资源的引用。

Servlet 中的 HttpSession 是如何实现的?它是一个存储所有 JSESSIONID 的全局 hashmap,容器从中确定返回哪个属性映射?如果它是一个全局 sysmbol 表,它是否会影响性能(即使 hashMap 的时间是 O(1),也可能存在会话修改,因此它可能必须同步)?

PS。也许这种情况下的一些设计模式建议也可以。

0 投票
1 回答
3375 浏览

c# - 为什么要使用像 Exit Game 的 Photon 这样的服务器?

我已经完成了我的研究,但我很难理解为什么有人想要使用这些类型的服务器(Photon、SmartFox 等)来进行游戏编程,而他们已经提供了诸如 .Net 框架之类的东西。

对于使用其中一台昂贵的服务器而不是使用自己的服务器的好处,我似乎无法理解。编码游戏网络的大部分工作不是你必须做的吗?

我想创建一个多人服务器/客户端游戏,但我从 StackOverflow 上的专业人士那里听说,像 Photon 这样的东西不值得花钱,因为他可以“在一两天内为他的游戏创建类似的东西”。我的用途将是一款既是单人游戏、多人 COOP(客户端到客户端)的游戏,也可能是 MMO(如果它卖得好,或者我专门为该功能(服务器/客户端架构)获得启动资金)。虽然很可能,我会像 Valve 那样对游戏进行编程,甚至让单人游戏成为服务器/客户端架构,“服务器”位于客户端的离线系统上。

与使用 C# .Net 制作自己的游戏服务器相比,使用 Photon 有什么好处?

0 投票
2 回答
13247 浏览

mmo - 如何制作 MMO(服务器端)?

我曾尝试搜索有关如何制作 MMO 并始终找到相同的回复,这是不可能的或需要很多钱,但从未提供有关如何制作的指南。

我想构建一些非常可扩展的东西,我目前关于如何构建 MMO 的想法如下:


成分:

  • 登录服务器:客户端向该服务器发送用户名和密码,如果成功,则向客户端提供要连接的游戏服务器。
  • 游戏服务器[1..N]:所有游戏逻辑都在这里,客户端连接到这个。
  • 位置数据库:存储当前登录的用户和活动怪物的数据,他们在哪个游戏服务器,他们在地图上的位置和他们采取的行动(移动,攻击等)。
  • 帐户数据数据库:存储有关用户的所有数据(用户名、密码、字符、项目、任务等)
  • 聊天服务器:由于同一个地方的用户可以在不同的服务器上,所以需要多做一个,以便玩家之间进行交流。
  • Monster DB:一个包含所有怪物属性、基地位置和AI脚本的数据库。
  • Monster Server [1..N]:服务器内所有活跃的怪物
  • 日志数据库:存储所有采取的行动和聊天文本。

行动:

  • 登录:
    1. 客户端将用户名和密码发送到登录服务器。
    2. 登录服务器使用Account Data DB验证数据并检查当前未记录的(Position DB),如果成功则转到3,如果不成功,则发回不成功的登录消息。
    3. 登录服务器更新位置数据库,将新连接的用户添加到他将连接的服务器(人数最少/最近)
    4. Position DB 通知相应的游戏服务器用户已连接。
    5. 登录服务器将游戏服务器连接到的客户端发送到客户端。
  • 主循环(客户端):
    1. 客户端在位置数据库中检查他当前的位置和动作以及他附近的人(玩家和怪物),在收到的数据中还包括玩家的最后更新时间(齿轮或等级)。
    2. 客户端将接收到的玩家的日期与当前保存在内存中的玩家进行比较,如果玩家不在内存中或日期不一样,客户会询问账户数据数据库以获得 lvl、齿轮等。
    3. 客户端渲染玩家
    4. 一段时间后转到1。
  • 聊天:
    1. 客户端向聊天服务器发送消息(pm/normal/all)
    2. 如果是 pm,Chat Server 将消息发送到目标
    3. 如果正常,聊天服务器会与位置服务器检查该区域中的玩家(与主循环(客户端)相同。1 当检查附近的玩家时)并将消息发送给这些玩家。
    4. 如果全部,聊天服务器向所有玩家广播
    5. 确认发件人和收件人收到邮件
  • 行动:
    1. 客户端向游戏服务器发送动作(制作、移动、攻击等)。
    2. 游戏服务器处理动作并使用动作效果更新位置数据库(客户端将知道主循环动作发生了什么)。
    3. 在制作或抢劫的情况下,游戏服务器将获得的物品返回给客户端。
  • 主循环(游戏服务器):
    1. 检查所有从客户端接收的数据并处理它们。
    2. 向客户端发送处理结果(伤害、经验、获得的物品等)并使用其效果(新位置等)更新位置数据库。
    3. 一段时间后转到 1。
  • 主循环(怪物服务器):
    1. 检查一个活跃的怪物附近是否有玩家,如果没有,则将其从怪物服务器和位置数据库中删除。
    2. 检查位置数据库中的所有玩家是否附近有任何怪物(来自怪物数据库)并且未激活并激活它(更新位置服务器和怪物服务器)。
    3. Monster 根据存储在 Monster DB 上的脚本采取行动(攻击、移动、什么都不做等)。
    4. 一段时间后转到 1。

以及我的问题:

  1. 这种实施方式会奏效吗?(考虑一张有很多怪物和玩家的大地图)
  2. 我有一种感觉,如果事情发展起来,Position DB 会非常紧张。如果:
    • 制作多个位置数据库
    • 创建一个链接数据库(玩家/怪物、游戏服务器、位置数据库)
    • 制作一个链接的数据库(位置数据库,区域)
    • 这样一个位置数据库基于一个区域(或多个区域),当玩家移动到另一个区域时,他的数据会移动到另一个位置数据库;最后一个 DB (Position DB, area) 是在一个区域有太多玩家的情况下,几个 Position DB 可以共享同一个区域(如果区域没有很多人,一个 Position DB 可以容纳一些区域)
  3. 关于使用的技术,我在考虑以下几点:
    • 登录服务器:scala/django
    • 游戏服务器:C++ 中的原始编程?
    • 定位 DB:scala/django 用于通信和 DB 与 SQL
    • 帐户数据数据库:用于通信的 scala/django 和数据库不确定是使用像 mongoDB 这样的 NoSQL 还是保存在文件中的帐户(这会更好吗?)
    • 聊天服务器:C++ 中的原始编程还是我应该尝试适应 IRC 服务器?
    • 怪物数据库:SQL
    • 怪物服务器:类似游戏服务器
    • 日志数据库:SQL
  4. 客户端-服务器之间的通信应该是 UDP 以便更快的通信?和 TCP 登录?还是应该在客户端和服务器之间始终保持打开的 TCP 套接字?另外,对于聊天,TCP 还是 UDP?
  5. 主循环应该每隔多长时间运行一次才能使游戏流畅运行?每 0.5 秒,0.1,接近 60fps?还让计时器会更好地在每个循环中抛出一个线程?(控制线程的数量,所以如果循环花费的时间比它应该的长)

而且我不认为我暂时忘记了任何要问的问题,并对这篇大文章感到抱歉……

0 投票
1 回答
884 浏览

mmo - Soma MMO 游戏 Bot 的神话 - 地板上物品的内存地址包含垃圾和不断变化的信息

我一直在为一个相对较小的 MMO 编写机器人,主要是作为一种爱好来挑战自己的技能并学习新东西。

我已经克服了许多挑战,并成功构建了一个在游戏中猎杀怪物并进行自我管理的机器人。但是我一直无法找到地板上物品的内存地址。使用作弊引擎,我发现该物品的名称在内存口袋周围存储了 15 次以上,当我拿起物品并放下另一个时,其中一些地址将更改为新物品的名称,但其他地址将全部更改为垃圾信息,其中包括屏幕上的其他文本,例如聊天中发生的事情。

有时,这些内存地址似乎实际上会更改为项目的值,然后它们很快又会再次变为垃圾。

这是某种争先恐后的反作弊吗?我无法想象,因为它是一款非常古老且小型的游戏。它被称为索玛神话。

我曾经找到一个地址,它总是显示地板上的第一个项目,但我找不到其他地址,从那以后我再也没有找到这个地址。

这是一个等距游戏,其中地板上的每个项目都分配了坐标。有人可以在这方面给我一些建议吗?我希望能够对这些项目的内存地址进行逆向工程。

0 投票
1 回答
2002 浏览

algorithm - Unity3D 中的 MMO 服务器功能

我为 Unity 创建了一个多人服务器,其工作方式如下:

  • 每个客户端/玩家都连接到服务器并说“嗨”。
  • 服务器接受玩家并将其添加到玩家在线列表中。
  • 每个客户都开始发送他的位置。
  • 服务器侦听客户端的位置,每秒 X 次将它们发送给所有其他在线玩家。
    • 这是由所有在线玩家上的一个 bucle 制作的,因此服务器配置为每秒向所有玩家发送 10 次更新的位置。
  • 每个客户端都会监听服务器以获取其他玩家的位置。当服务器说“这个玩家刚刚说他在那里”时,客户端将他移动到那里。

有了这个基本系统,我可以轻松地用 Unity 创建多人游戏(已经做到了)。但是,如果在线玩家超过几千人怎么办?然后,假设每个玩家将他的位置发送到服务器大约 10 次/秒。服务器必须将这些位置发送给周围的所有玩家,比如 100m。因此,服务器将为所有在线玩家(2000)运行一个循环,将他的位置与所有 1999 玩家进行比较,如果小于 100m,则将位置发送给玩家。或者,也许更好,将所有玩家更新的位置保存在一个数组中并将其发送给玩家。(每 10 秒向玩家发送一条消息应该比数百条消息要好,对吧?无论如何,循环必须每秒通过 2000*1999 10 次,这可能会很痛苦..

我想使用 Unity3d 作为客户端,我不想在服务器上保存任何物理,因为使用统一的物理引擎很好/快速/易于使用。而且我认为这可能就足够了,也许在服务器端进行一些反作弊检查以摆脱不良玩家。

现在,问题:)

  • 一个合适的 mmo 服务器是如何工作的?是否每个玩家每秒将其位置发送到服务器 X 次,然后它会通过 HEAVY 循环并将其位置发送给周围的所有玩家?性能呢?

  • 我将为下一步实施一个预测系统,并使用从服务器接收到的更新后的位置插入当前位置。这样对吗?

  • 如果我必须检测玩家之间或与物体(子弹等)的碰撞,你会在客户端进行吗?或者在服务器端实现玩家-玩家和玩家-对象碰撞检测系统并在大循环中执行?

  • 如果玩家移动是使用键盘,因此它没有一个位置可以移动,那么您将如何将位置发送到服务器,例如每秒 10 次,并插入其他玩家接收到的位置以创建平滑的移动?

  • 如果玩家的移动是通过给他们设置力物理,比如你前进的时候是因为有一种力量在推动你,你会如何将此信息传递给其他客户端?仅将位置发送到服务器,然后将其发送给其他玩家?但是,物理看起来很奇怪......我想到的计划b)是将使用的力发送到服务器,每个客户端将服务器接收到的力应用到他们周围的所有玩家,这里的物理看起来很棒但是也许存在延迟问题......使用这个系统并每 X 次发送准确的位置会更好吗?说0.5秒?

好吧,我想这就是全部!我希望这篇文章对其他独立开发者有用!

0 投票
2 回答
365 浏览

c# - OOP C# - MMO 力学模拟器的设计模式

我一直在为 FFXIV 开发模拟器;

我一直非常接近完成,然后我陷入了一个对象访问问题,无法访问主要玩家的统计数据。我的项目可以在以下位置找到:https ://github.com/eein/chocobro

我知道,我可以优化很多东西。:P

基本上我是一种蛮力翼翼它让对象可以访问他们需要的对象,但我正在寻找正确的做事方式。

我将开始重写它,所以不要太用力地抓住示例代码,但它在那里可以看到我遇到的问题。:(

理想情况下,在下一次尝试中,这就是我想做的事情:从一个包含有关播放器对象的所有信息的播放器类开始(将来,我想为完整的组模拟创建倍数)。

就像是:

我可能不太清楚,但基本上我希望能够从技能中访问玩家的暴击,并且我假设技能不能以这种方式设置以使其发挥作用。有谁知道我应该使用什么样的设计模式,以便能力中的虚拟功能可以访问父类玩家的统计数据?

理想情况下,我希望吟游诗人类包含与吟游诗人工作有关的所有能力和统计更新,一旦吟游诗人继承了玩家并且对象被更改为引用吟游诗人对象,我该如何使它如此由能力类创建的能力不访问该函数时,需要在创建时对父对象进行对象引用。

我很困惑自己,但非常感谢任何理解我的胡言乱语并且可以提供帮助的人!