network-wiredОсновы сетевого взаимодействия

All Out ориентирована в первую очередь на мультиплеер, но CSL спроектирован так, чтобы вы могли писать игровой процесс почти так же, как в однопользовательской игре.

Ключевая идея:

circle-info

Все игровые состояния автоматически синхронизируются с сервера на клиенты. Вам не нужно писать RPC или «сетевой спавн» объектов.

Авторитет (кто решает что?)

Как правило:

  • Сервер: определяет игровые состояния (урон, награды, появления, победа/поражение, коллизии по запросу и т.д.)

  • Клиент: отображает и проигрывает косметику (интерфейс, частицы, тряску экрана, звук)

На практике большинство вашего кода будет выполняться и на сервере, и на клиентах — вы просто защищаете какая работа выполняется где.

Локальные и серверные проверки

Две проверки, которые вы будете постоянно использовать:

  • is_local_or_server(): для игрового интерфейса и обработки ввода (выполняется на сервере + локальном клиенте)

  • is_local(): для чисто косметических эффектов (выполняется только на локальном клиенте)

Пример:

Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        // Используйте для игрового интерфейса и ввода (выполняется на сервере + локальном клиенте)
        if is_local_or_server() {
            // draw_ability_button(this, Shoot_Ability, 0);
            // Обработка ввода, влияющего на состояние игры
            // Движение обрабатывается автоматически
        }

        // Используйте для чисто косметических эффектов (выполняется только на локальном клиенте)
        if is_local() {
            // UI.text(..., "Ожидание запуска игры хостом...");
            // Частицы, косметический UI и т.д.
        }
    }
}
circle-exclamation

Состояние, специфичное для клиента

Иногда вам нужен локальный стейт, который не должен влиять на игровой процесс и не требует репликации:

  • переключатели открытия/закрытия интерфейса

  • таймеры тряски камеры

  • «последний наведённый предмет» в инвентаре

Храните это как поля, но читайте/записывайте их только за is_local() проверками.

Правила безопасности в мультиплеере

  • Избегайте глобальных переменных для состояния игрока. Если каждому игроку нужно собственное значение, храните его на Player.

  • Будьте осторожны с «одиночками» (singletons). Если вам действительно нужен глобальный менеджер, убедитесь, что он случайно не хранит данные, зависящие от конкретного игрока.

  • Предпочитайте детерминированное состояние на сервере. Клиент должен реагировать на состояние сервера, а не выдумывать его.

Отладка сетевых проблем

  • Добавьте log_info(...) на серверные пути (не только локальные), чтобы вы могли видеть авторитетные решения.

  • Если что-то «работает локально», но не для других игроков, это обычно:

    • код, защищённый is_local() который должен быть авторитетно на сервере, или

    • глобальная переменная, перезаписываемая несколькими игроками.

Сопутствующая документация

Последнее обновление