3c989c33f8ddf32419bcd769832a7606089c7f4b
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m19s
GoDot — компактная документация проекта
Кратко
- Язык реализации: Go.
- Серверная часть через WebSocket с использованием
github.com/gorilla/websocket. - Основные концепции: Hub (хаб) хранит состояние игроков, World формирует снимки мира и рассылает их всем клиентам.
- Протокол: MSG_WELCOME, MSG_INPUT, MSG_SNAPSHOT.
1) Архитектура и компоненты
- Client (клиент) — подключается к WebSocket по адресу /ws.
- Hub (сервер) — управляет списком подключённых игроков, обновлениями позиций, рассылкой снимков.
- World (сервер) — формирует снимок мира и передаёт его клиентам.
- Connection WS Handler — принимает соединения и обрабатывает входящие сообщения.
Схема взаимодействия (упрощенная)
- Client <-> Hub <-> World
- Hub: хранит список игроков и их состояния
- World: собирает состояние и отправляет снимок всем клиентам
Пример последовательности:
- Клиент соединяется: ws://host:8080/ws
- Сервер отправляет MSG_WELCOME
- Клиент отправляет MSG_WELCOME (ID, Name)
- Клиент периодически отправляет MSG_INPUT (X, Y)
- Сервер раз в ~50 мс отправляет MSG_SNAPSHOT всем клиентам
2) Протокол и бинарная структура сообщений
Общие принципы
- Заголовок сообщения:
- Type: uint16
- Version: uint16
- PayloadLen: uint16
- Payload — бинарная полезная нагрузка длинной PayloadLen.
Типы сообщений
- MSG_WELCOME = 0
- MSG_INPUT = 1
- MSG_SNAPSHOT = 2
Структуры полезной нагрузки
-
MSG_WELCOME (payload: handshake клиента)
- ID: uint32
- Name: string, кодируется как [uint16 длина][байты]
-
MSG_INPUT (payload: позиционные данные клиента)
- X: float32
- Y: float32
-
MSG_SNAPSHOT (payload: снимок мира)
- Count: uint16 (число игроков)
- Для каждого игрока:
- ID: uint32
- Type: uint8 (обычно EntityPlayer)
- X: float32
- Y: float32
- Z: float32
- Yaw: float32
Примечание
- Версия снимка в Payload зафиксирована как 1 (Version: 1).
3) Модели данных
-
Entity
- ID: uint32
- Type: EntityType (Player/NPC/Bullet)
- X, Y, Z, Yaw: float32
-
Player
- Включает Entity + Name и Conn (websocket.Conn)
-
Message
- Type, Version, Payload ([]byte)
-
Reader / Writer
- Быстрая бинарная сериализация/десериализация полей и строк
4) Основные файлы (кратко)
GoDot/controllers/hub.go— менеджер хаба, запуск сервера, хранение игроков.GoDot/controllers/connection.go— чтение сообщений клиента, handshake, обработка MSG_INPUT.GoDot/controllers/world.go— формирование и рассылка снимков (MSG_SNAPSHOT).GoDot/controllers/ws.go— обработчик WebSocket-подключений.GoDot/models/message.go— структура Message, кодирование/декодирование.GoDot/models/reader.goиGoDot/models/writer.go— бинарная сериализация/десериализация.GoDot/models/player.go— игрок, его сущность и соединение.GoDot/main.go— точка входа, создание Hub и запуск.
5) Как запустить
-
Установи зависимости
go mod download
-
Запусти сервер
go run main.go
-
Открой WebSocket-подключение к:
- ws://<адрес_хоста>:8080/ws
Опционально:
- ограничить Origin в продакшене (сейчас CheckOrigin возвращает true)
- настроить порт через окружение (при необходимости можно добавить ENV-переменную)
6) Быстрая проверка простым клиентом (идея)
- Подключиться к
/ws. - Получить MSG_WELCOME.
- Отправить MSG_WELCOME с Payload: [ID (uint32)][Name (uint16+bytes)].
- Отправлять MSG_INPUT с Payload: [X (float32)][Y (float32)].
- Ожидать MSG_SNAPSHOT от сервера каждые ~50 ms.
7) Mermaid-диаграмма архитектуры (в сыром виде)
Mermaid диаграмма (сырой текст)
graph TD
Client[Client] -->|WebSocket| Hub[Hub]
Hub -->|Broadcast| World[World]
Client --> Hub
Hub --> Client
8) Список файлов и их роль
GoDot/controllers/hub.go— менеджер хаба и запуск сервера.GoDot/controllers/connection.go— чтение сообщений, handshake, обработка input.GoDot/controllers/world.go— формирование и рассылка снимков.GoDot/controllers/ws.go— обработчик WebSocket-подключений.GoDot/models/message.go— структура Message и кодирование/декодирование.GoDot/models/reader.goиGoDot/models/writer.go— бинарная сериализация/десериализация.GoDot/models/player.go— игрок, его сущность и соединение.GoDot/models/entity.go— базовая сущность мира.GoDot/main.go— точка входа, создание Hub и запуск.
9) Примеры команд и конфигураций
-
Запуск сервера напрямую
- go run main.go
-
Запуск с использованием модулей
- go mod download
- go run main.go
-
Порт и origin
- В текущей конфигурации порт жестко задан как 8080, origin не фильтруется. При необходимости можно добавить ENV-переменные и ограничение origin.
Description