Important
Для разработки проекта используется кастомная сборка движка (Только для Windows). Она отличается названием, цветом иконки и тем, что при работе с векторами и матрицами вместо float используется double.
В проекте используется .NET 8.
Note
Перед тем как начать разработку, ознакомься с Wiki.
Проект разделен на несколько модулей, каждый из которых отвечает за отдельную сцену или функциональность.
- Scenes: Содержит игровые сцены и их обработчики
Root
: Самая верхнеуровневая сцена. Вызывает инициализцию других систем, содержит в себе сцену Game или MainMenu, а также ссылку на PackedScenesContainer.Game
: Сцена с игрой (не меню). Отвечает за инициализацию сети, подключение, управление общеигровым состоянием, содержит в себе сцену SafeWorld или BattleWorld.PackedScenesContainer
: Контейнер, который содержит ссылки на все прототипы сцен в игре (тип PackedScene).Screen
: Содержит набор сцен с интерфейсом пользователя (HUD, меню, экран загрузки, консоль сервера).World
: Содержит верхнеуровневые сцены SafeWorld и BattleWorld, а также все игровые объекты и их логику.
- Scripts: Содержит вспомогательный код, не содержит сцены
Content
: Содержит контейнеры со ссылками на ресурсы игры (музыка, звуки, текстуры, частицы)KludgeBox
: Библиотека с наработками из других проектов (шина событий, перехват сетевых пакетов, логеры, таймеры и т.п.)Net
: Код для сетевого взаимодействия.Utils
: Вспомогательные классы и сервисы (обработка ошибок, работа с аргументами командной строки)
Сцены и обработчики хранятся в одной папке. Например, в папке ClientRoot
хранится ClientRoot.tscn
(сцена) и ClientRoot.cs
(обработчик).
Обработчики могут быть разбиты на несколько partial
классов по функционалу. Например, класс ClientRoot
разбит на файлы ClientRoot.cs
, ClientRootSceneContainer.cs
, ClientRootSingleton.cs
.
Сцены и обработчики для клиента и сервера хранятся в соседних папках. Например:
- Root: Общая папка со всеми файлами связанными со сценой Root
- ClientRoot: Папка с файлами сцены
Root
для клиента.ClientRoot.tscn
ClientRoot.cs
ClientRootSceneContainer.cs
ClientRootSingleton.cs
- ServerRoot: Папка с файлами сцены
Root
для сервера.ServerRoot.tscn
ServerRoot.cs
ServerRootSceneContainer.cs
ServerRootSingleton.cs
RootService.cs
: Статичный класс с общими функциями, которые используются и на клиенте и на сервере.
- ClientRoot: Папка с файлами сцены
Root/StarterScene
- Является точкой входа и определяет, будет ли запускаться
ClientRoot
илиServerRoot
сцена.
- Является точкой входа и определяет, будет ли запускаться
ClientRoot
/ServerRoot
- Вызывает инициализацию других систем в
Init()
и запускает игру вStart()
. - Является контейнером для сцен
MainMenuMainScene
иClientGame
/ServerGame
.
- Вызывает инициализацию других систем в
ClientGame
/ServerGame
- Инициализирует сеть и осуществляет подключение.
- Является контейнером для сцен типа
World
.
- Завершение работы клиента
- Завершение работы клиента осуществляется при помощи вызова функции
ClientRoot#Shutdown()
. - При любом способе уничтожения сцены
ClientGame
(включая завершение игры), автоматически будет вызвана функцияServerShutdowner#_Notification()
. И если данный клиент является хостом (запускал серверный процесс), то будет вызвана функцияOS.Kill()
для завершения работы сервера.
- Завершение работы клиента осуществляется при помощи вызова функции
- Завершение работы сервера
- Завершение работы сервера осуществляется при помощи вызова функции
ServerRoot#Shutdown()
. - Дополнительно на сервере каждые несколько секунд запускается проверка
Server#CheckParentIsDead()
. И если в ОС не будет найден процесс клиента игры, который запустил данный сервер, то сервер автоматически завершит свою работу.
- Завершение работы сервера осуществляется при помощи вызова функции
- Root: Общая папка со всеми файлами связанными со сценой
Root
- ClientRoot: Папка с файлами сцены
Root
для клиента.ClientRoot.tscn
: Техническая сцена без игровых объектов.ClientRoot.cs
: Имеет ссылки наPackedScenesContainer
(клиентская версия),WorldEnvironment
и настройки игрока. При запуске инициализирует все необходимые сервисы, анализирует параметры командной строки и запускает игру.ClientRootSceneContainer.cs
: Отвечает за смену меню (MainMenuMainScene
) на игру (ClientGame
) и обратно.ClientRootSingleton.cs
: Реализация паттерна singleton для доступа к классуClientRoot
из любой точки проекта.PlayerSettings.cs
: Класс для работы с настройками игрока (загрузка из JSON файла и сохранение в JSON файл).
- ServerRoot: Папка с файлами сцены
Root
для сервера.ServerRoot.tscn
: Техническая сцена без игровых объектов.ServerRoot.cs
: Имеет ссылки наPackedScenesContainer
(серверная версия),Console
. При запуске инициализирует все необходимые сервисы, анализирует параметры командной строки и запускает сервер.ServerRootSceneContainer.cs
: Отвечает за создание дочерней сцены (ServerGame
).ServerRootSingleton.cs
: Реализация паттерна singleton для доступа к классуServerRoot
из любой точки проекта.
- StarterScene: Папка с файлами сцены
StarterScene
. Общая для клиента и сервера.StarterScene.tscn
: Техническая сцена без игровых объектов. Сцена выбрана в качестве стартовой сцены в Godot.StarterScene.cs
: Имеет ссылки на прототипы сценClientRoot
иServerRoot
. В зависимости от параметров командной строки заменяет загруженнуюStarterScene.tscn
наClientRoot.tscn
илиServerRoot.tscn
.
RootService.cs
: Статичный класс с общими функциями, которые используются и на клиенте и на сервере. Отвечает за инициализацию сервисов использующихся и на клиенте и на сервере.
- ClientRoot: Папка с файлами сцены
- Game: Общая папка со всеми файлами связанными со сценой
Game
- ClientGame: Папка с файлами сцены
Game
для клиента.ClientGame.cs
: Запускает функции инициализации из другихpartial
классовClientGame
.ClientGameSceneContainer.cs
: Отвечает за переключение междуBattleWorldMainScene
иSafeWorldMainScene
.ClientGameBaseNetwork.cs
: Отвечает за инициализацию сети и подключение к серверу.ClientGameNetworkListener.cs
: Отвечает за обработку сетевых пакетов с сообщениями верхнего уровня (начало игры, смена мира и т.п.).ClientGameLoadingScreen.cs
: Предоставляет возможность отображения загрузочного экрана.ClientGameServerShutdowner.cs
: Отвечает за добавление к сценеClientGame
сценыServerShutdowner
.ServerShutdowner.cs
: Обработчик сцены отвечающий за автоматическое завершение работы сервера в случае уничтожения сценыClientGame
.PingChecker.cs
: Обработчик сцены отвечающий за отправку Ping-пакетов.PingAnalyzer.cs
: Класс, который анализирует результаты Ping-а и считает скользящее среднее, перцентили и т.п.- MainScenes: Папка с файлами сцен типа
WorldMainScene
для клиента. Такая сцена объединяет в себе сценыWorld
иHud
.IWorldMainScene.cs
: Общий интерфейс для всех сцен типаWorldMainScene
- BattleWorld: Папка с файлами сцены типа
WorldMainScene
для боевого мира.BattleWorldMainScene.tscn
: Техническая сцена без игровых объектов. Содержит сценыBattleWorld
иBattleHud
.BattleWorldMainScene.cs
: Просто контейнер со ссылками наBattleWorld
иBattleHud
.
- SafeWorld: Папка с файлами сцены типа
WorldMainScene
для безопасного мира.SafeWorldMainScene.tscn
: Техническая сцена без игровых объектов. Содержит сценыSafeWorld
иSafeHud
.SafeWorldMainScene.cs
: Просто контейнер со ссылками наSafeWorld
иSafeHud
.
- ServerGame: Папка с файлами сцены
Game
для сервера.ServerGame.cs
: Запускает функции инициализации из другихpartial
классовServerGame
.ServerGameSceneContainer.cs
: Отвечает за переключение междуServerBattleWorld
иServerSafeWorld
.ServerGameBaseNetwork.cs
: Отвечает за инициализацию сети.ServerGameNetworkListener.cs
: Отвечает за обработку сетевых пакетов с сообщениями верхнего уровня (игрок подключен, игрок отключен, игрок хочет сменить мир и т.п.).
- ClientGame: Папка с файлами сцены
- PackedScenesContainer:
- ClientPackedScenesContainer:
ClientPackedScenesContainer.tscn
: Техническая сцена без игровых объектов. Необходима, чтобы в редакторе Godot настраивать ссылки на прототипы других сцен клиента.ClientPackedScenesContainer.cs
: Содержит ссылки на прототипы других сцен клиента. Получение прототипа любой сцены (для последующего создания сцены), должно начинаться отсюда.
- ServerPackedScenesContainer:
ServerPackedScenesContainer.tscn
: Техническая сцена без игровых объектов. Необходима, чтобы в редакторе Godot настраивать ссылки на прототипы других сцен сервера.ServerPackedScenesContainer.cs
: Содержит ссылки на прототипы других сцен сервера. Получение прототипа любой сцены (для последующего создания сцены), должно начинаться отсюда.
- ClientPackedScenesContainer: