Skip to content

Dev-DAA/exp-map-client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

exp-map-client

Клиент для экспериментального игрового сервера

Открыть

Структуры

Далее будет приведно описание структур и типов даынных. Несмотря на отличие применяемого языка программирования, описания и примеры структур и типов будут приведены на С++.

Так же все структуры должны быть упакованы. В примерах на C++ соответсвующие директивы опущены.

Все структуры начинаются с поля type, которое определяет тип структуры при обмене между клиентом и сервером.

/// Тип передаваемой структуры
enum class Type : uint8_t
{
  COMMAND   = 0, ///< Команда
  PLACEMENT = 1  ///< Положение
};

Структура Command описывает команды, поступающие от клиентов.

/// Идентифкаторы команд
enum class CommandID : uint8_t
{
  CONNECT    = 0,   ///< Отправляется при подключении клиента
  DISCONNECT = 1,   ///< Отправляется при отключение клиента
  PING       = 2,   ///< Отправляется для поддержания присутсвия
  ERROR      = 0xFF ///< Отправляется сервером при ошибке
}

/// Команда от клиента
class Command
{
  Type      type = Type::COMMAND; ///< Тип команды
  uint32_t  id;                   ///< Идентификатор клиента
  CommandID cmd;                  ///< Идентифкатор команды
};

Структура Placement описывает положение и ориентацию в пространстве клиента.

/// Положение и ориентацию в пространстве клиента
class Placement
{
  Type      type = Type::PLACEMENT; ///< Тип команды
  uint32_t  id;                     ///< Идентификатор клиента
  float     x;                      ///< Координата по оси X
  float     y;                      ///< Координата по оси Y
  float     z;                      ///< Координата по оси Z
  float     rotX;                   ///< Поворот вокруг оси X
  float     rotY;                   ///< Поворот вокруг оси Y
  float     rotZ;                   ///< Поворот вокруг оси Z
};

Описание взаимодействия

Взаимодействие между клиентом и сервером происходит с использованием WebSocket.

При подключенни клиент отправляет структуру Command со своим ID и cmd == CommandID::CONNECT. В ответ сервер присылает массив структур Placement всех подключенных клиентов.

Далее клиент периодически отправляет структуру Placement со своим ID, положением и ориентацией в пространстве. Если изменений нет, то, не реже чем раз в 5 секунд, необходимо отправлять структуру Command со своим ID и cmd == CommandID::PING. Отсутствие обновлений структуры Placement или команды Ping будет воспринято сервером как потеря соединения.

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

При отключении клиента (по команде или отсутсвию пингов), сервер рассылает оставшимся клиентам структуру Command с ID отключенного клиента и cmd == CommandID::DISCONNECT.

Если клиентом направлена структура с ошибкой, то сервер должен ответить структурой Command с ID == 0xFFFFFFFF и cmd == CommandID::ERROR.

Возможные варианты ошибок:

  • не поддерживаемое значение поля type;
  • не поддерживаемое значение поля cmd структуры Command;
  • нарушение flow (подключение -> Command{Connect} -> Placement или Command{Ping} -> Command{Disconnect} -> отключение)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors