Первая загрузка мира

Получение игрового мира

Результатом подключение к локации будет массив в формате json всех сущностей со всеми полями текущей локации и смежных если настроен открытый мир.

Все пакеты которые отправляем сервер и приходят игрокам сжимаются методом Gzip (пакеты отправляемые игроками сжимать не надо тк это сделало бы их только больше и лишнее время тратилось бы сервером на распаковку)

Ниже пример как такой пакет можно распаковать в C#:

string text;
using (MemoryStream source = new MemoryStream(<пришедший пакет>))
{
	using (MemoryStream target = new MemoryStream())
	{
		using (var decompressStream = new GZipStream(source, CompressionMode.Decompress))
		{
			decompressStream.CopyTo(target);
			text = Encoding.UTF8.GetString(target.ToArray());
		}
	}
}

Формат ответа следующий:

{
  "action": "load",
  "sides": {
    "ид карты": {
      "x": <позиция X относительно локации игрока в открытом мире>,
      "y": <позиция Y относительно локации игрока в открытом мире>,
      "ip": <адрес сервера локации для http запроса данных локации и графики>,
      "port": порт ws сервера локации>,
    }
  },
  "world": {
    "ид карты": {
	"enemys": {
        "enemys_14788": {
          "id": 14788,
          "prefab": "Skeleton",
          "action": "walk",
          "sort": 0,
          "x": 51,
          "y": -88,
          "z": 0,
          "forward_x": 0,
          "forward_y": 1,
          "forward_z": 0,
          "lifeRadius": 0,
          "map_id": 3,
          "created": "2024-03-19 12:06:55",
          "components": {
            "hp": 5,
            "hpmax": 5,
            "mp": 5,
            "mpmax": 5
          },
          "events": {
            "fight/attack": {
              "action": "",
              "remain": 0
            },
            "move/walk": {
              "action": "",
              "remain": 0
            }
          }
        },
	...
	},
	"players": {
		...
	},
	"animals": {
		...
	},
	"objects": {
		...
	}
    }
  }
}


Пакет самого игрока придет следом со всеми полями по аналогии структуры 

Часть 4. Обновление данных в клиенте игры

Как уже было сказано выше – при изменении данных сущностей сервер отправляет сообщение в виде массива, где ключами является тип сущности (players, enemys, animals, objects) и вложенный массив – сами сущности которые изменились и их компоненты. Каждая сообщение имеет идентификатор сущности id . Иногда полезно описать какие поля ожидаются от сервера: пример как это сделано в C# для Unity

Изменение значений компонентов сущности – задача событий . Вы можете создать неограниченное количество компонентов в админ панели к которым необходимо написать код на языке программирования – Lua . Любой игровой процесс - это манипуляция с данными сущностями .

Наш сервис уже имеет образцы событий для популярных механик. Вы можете изменить их код или написать свои

Поля Events

Представляют собой список групп механик которые сейчас весят на исполнении у существа. Одна группа может содержать разные виды ее механик , но активна на существе может быть только одна в рамках группы и она указана в поле action.
Для того что бы события могли исполняться их нужно повесить на сущность. Для этого в админ панели предусмотрена возможность добавить свой код который будет выполняться когда указанная сущность добавляется в игру. С помощью него можно добавить необходимые события. Так же код других событий и тригеров компонентов может вешать события. Если событие помечено в настройках игры как публичное - его можно вызвать командой игрока и оно будет добавлено и исполнено в следующем кадре.

Стандартные поля сущностей

Поля компонентов можно добавить в неограниченном количестве , как и вовсе не иметь ни одного. Однако имеются системные поля сущностей которые есть всегда и их нельзя удалить. Список этих полей:

  • id – идентификатор сущности в базе данных (может совпадать с id других сущностей)
  • key – уникальный текстовый идентификатор сущности на карте. Выглядит как id_тип сущности
  • map_id – текущая карта. Если в процессе игры она меняется – объект удаляется из игры, приходит ответ от сервера с action = remove на данную сущность
  • prefab – текстовое поле. Рекомендуется использовать как название графического пакета сущности
  • x – координата по оси х
  • y – координата по оси y
  • z – координата по оси z
  • sort – сортировка объекта (в некоторых случаях аналог z)
  • forward_... - сторона в которую смотри наш персонаж (полезно связывать с другими игровыми действиями которые будут выполнятся в указанную сторону, например - атака)
  • action – текстовое поле. Рекомендуется использовать как название текущей анимации при разработки серверных игровых механик (например при движении игрока или при отталкивании придут лишь новые координаты, поле action уточнить каким образом они были сменены, а с полем side можно определить направление)
  • components – массив компонентов. Все компоненты являются элементами этого массива. Где ключ – название компонента. Редактируется через админ панель
  • events – массив событий сущности на находящихся исполнении. Полезно для анимации в игре. 
  • login – имя пользователя игрока. Только у сущности - игроки





Что нового?


Статьи про разработку продукта

PHP, Программирование, Разработка игр, Unity, Unreal Engine, php, игровой сервер, разработка сервисов, онлайн-игры, разработка онлайн-игр

В предыдущей статье я рассказывал об архитектуре приложения , где ее отдельные компоненты могли бы работать параллельно не блокируя выполнения друг друга.

В этой статье я расскажу о причинах , по которым пришлось сменить взаимодействие между потоками на процессы и выделить компоненты в отдельные сервисы.

Бонус - архитектура игрового сервера в картинках.

Читать далее
Создание сервера для онлайн ММО игр на PHP ч.14 — Сетевая карта и задержка кадра (Latency frame) по RFC 2544 (1242)
PHP, Проектирование и рефакторинг, Разработка игр, Сетевые технологии, Параллельное программирование, php, go, c#, онлан игры
Создание сервера для онлайн ММО игр на PHP ч.13 — Event-driven паттерн, JSON-RPC и почему не сервисная (SOA) архитектура
PHP, Программирование, Проектирование и рефакторинг, Разработка игр, Алгоритмы, php, event-driven, разработка игр, mmo, mmorpg, шаблон проектирования
Создание сервера для онлайн ММО игр на PHP ч. 12 — Очереди и параллельное программирование на CPU
PHP, Анализ и проектирование систем, Разработка игр, Сетевые технологии, Параллельное программирование, php, go, онлайн-игры, очереди, очереди задач, очереди сообщений, очереди с приоритетом, websocket, unity, ммо

Кабинет

Игры