Skip to content
This repository has been archived by the owner on Feb 18, 2021. It is now read-only.

Latest commit

 

History

History
172 lines (141 loc) · 11.5 KB

README.ru.md

File metadata and controls

172 lines (141 loc) · 11.5 KB

SAMPVOICE

English | Русский

Описание


SAMPVOICE - это набор разработчика для реализации систем голосового общения на языке Pawn под сервера SA:MP.

Поддержка версий


  • Клиент: SA:MP 0.3.7 (R1, R3)
  • Сервер: SA:MP 0.3.7 (R2)

Основные возможности


  • Контролируемая передача голосового потока
  • Управление микрофоном игрока
  • Привязка голосового потока к игровым объектам
  • И ещё множество мелочей...

Установка


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

Для игроков


Игрокам доступны 2 вариант установки: автоматический (через установщик) и ручной (через архив).

Автоматический вариант

  1. Для того, чтобы скачать установщик перейдите по ссылке и выберите подходящую версию плагина.
  2. После скачивания запустите установщик, выберите язык установки, затем установщик автоматически определит директорию игры.
  3. Если директория верна, нажмите "ОК" и дождитесь конца установки. После окончания установки установщик завершит свою работу.
Ручной вариант

  1. Перейдите по ссылке и скачайте архив с необходимой версией клиента.
  2. Распакуйте содержимое архива в корневую директорию игры с заменой файлов.

Для разработчиков


  1. Загрузите архив с необходимой версией плагина для вашей платформы по ссылке.
  2. Распакуйте архив в корневую директорию сервера.
  3. Добавьте в файл конфигурации сервера server.cfg строку "plugins sampvoice" для Win32 и "plugins sampvoice.so" для Linux x86. (Если у вас стоит плагин Pawn.RakNet обязательно разместите SampVoice после него)

Использование


Для того, чтобы начать использовать плагин, прочтите документацию, которая входит в комплект с серверной частью. Для этого откройте файл sampvoice.chm с помощью справочника Windows. (Если документация не открывается, нажмите на файл документации правой кнопкой мыши, затем "Свойства" -> "Разблокировать" -> "ОК")

Чтобы начать использовать функционал плагина, подключите заголовочный файл:

#include <sampvoice>

Краткая справка


Вам необходимо знать, что в плагине используется своя система типов и констант. Не смотря на то, что это всего лишь оболочка над базовыми типами Pawn, она помогает ориентироваться в типах самого плагина и не путать указатели.

Для того, чтобы перенаправить аудиотрафик от игрока A к игроку B вам необходимо создать звуковой поток (например глобальный, с помощью SvCreateGStream), затем подключить к потоку игрока A как спикера (с помощью SvAttachSpeakerToStream), после чего подключить к потоку игрока B как слушателя (с помощью SvAttachListenerToStream). Готово. Теперь при активации микрофона у игрока A (например, функцией SvStartRecord), его аудиотрафик будет передан, а затем услышан игроком B.

Звуковые потоки довольно удобная вещь. Наглядно их можно представить на примере Discord'а:

  • Поток - это аналог комнаты (или канала).
  • Спикеры - это участники комнаты с отключенным звуком, но включенным микрофоном.
  • Слушатели - это участники комнаты с отключенным микрофоном, но включенным звуком.

Игроки могут быть и спикерами и слушателями одновременно. При этом аудиотрафик игрока не будет ему переотправлен.

Пример


Давайте рассмотрим некоторые возможности плагина на практическом примере. Ниже мы создадим сервер, который будет привязывать всех подключившихся игроков к глобальному потоку, а также создавать под каждого игрока локальный поток. Таким образом, игроки смогут общаться через глобальный (слышен одинаково в любой точке карты) и локальный (слышен только рядом с игроком) чаты.

#include <sampvoice>

new SV_GSTREAM:gstream = SV_NULL;
new SV_LSTREAM:lstream[MAX_PLAYERS] = { SV_NULL, ... };

/*
    Паблики OnPlayerActivationKeyPress и OnPlayerActivationKeyRelease
    нужны для того, чтобы при нажатии соответствующих клавиш перенаправлять
    аудиотрафик игрока в соответствующие потоки.
*/

public SV_VOID:OnPlayerActivationKeyPress(SV_UINT:playerid, SV_UINT:keyid) 
{
    // Подключаем игрока к локальному потоку как спикера, если нажата клавиша 'B'
    if (keyid == 0x42 && lstream[playerid]) SvAttachSpeakerToStream(lstream[playerid], playerid);
    // Подключаем игрока к глобальному потоку как спикера, если нажата клавиша 'Z'
    if (keyid == 0x5A && gstream) SvAttachSpeakerToStream(gstream, playerid);
}

public SV_VOID:OnPlayerActivationKeyRelease(SV_UINT:playerid, SV_UINT:keyid)
{
    // Отключаем игрока от локального потока, если отпущена клавиша 'B'
    if (keyid == 0x42 && lstream[playerid]) SvDetachSpeakerFromStream(lstream[playerid], playerid);
    // Отключаем игрока от глобального потока, если отпущена клавиша 'Z'
    if (keyid == 0x5A && gstream) SvDetachSpeakerFromStream(gstream, playerid);
}

public OnPlayerConnect(playerid)
{
    // Проверяем наличие плагина
    if (SvGetVersion(playerid) == SV_NULL)
    {
        SendClientMessage(playerid, -1, "Не удалось обнаружить плагин sampvoice.");
    }
    // Проверяем наличие микрофона
    else if (SvHasMicro(playerid) == SV_FALSE)
    {
        SendClientMessage(playerid, -1, "Не удалось обнаружить микрофон.");
    }
    // Создаём локальный поток с дистанцией слышимости 40.0, неограниченным количеством слушателей
    // и именем 'Local' (имя 'Local' будет отображено красным цветом в speakerlist'е у игроков)
    else if ((lstream[playerid] = SvCreateDLStreamAtPlayer(40.0, SV_INFINITY, playerid, 0xff0000ff, "Local")))
    {
        SendClientMessage(playerid, -1, "Нажмите Z, чтобы говорить в глобальный чат и B, чтобы говорить в локальный чат.");

        // Подключаем игрока к глобальному потоку как слушателя
        if (gstream) SvAttachListenerToStream(gstream, playerid);

        // Назначаем игроку клавиши активации микрофона
        SvAddKey(playerid, 0x42);
        SvAddKey(playerid, 0x5A);
    }
}

public OnPlayerDisconnect(playerid, reason)
{
    // Удаляем локальный поток игрока после отключения
    if (lstream[playerid])
    {
        SvDeleteStream(lstream[playerid]);
        lstream[playerid] = SV_NULL;
    }
}

public OnGameModeInit()
{
    // Раскомментируйте строку, чтобы включить режим отладки
    // SvDebug(SV_TRUE);

    gstream = SvCreateGStream(0xffff0000, "Global");
}

public OnGameModeExit()
{
    if (gstream) SvDeleteStream(gstream);
}

Компиляция


Плагин компилируется под платформы Win32 и Linux x86.

Ниже прилагаются подробные инструкции:

Склонируйте репозиторий себе на компьютер и перейдите в директорию плагина:

git clone https://github.com/CyberMor/sampvoice.git
cd sampvoice

Windows (Client/Server)


Для компиляции клиентской части плагина вам понадобится DirectX SDK. По умолчанию клиентская часть компилируется под версию SA:MP 0.3.7 (R1), но вы также можете явно указать компилятору версию для билда с помощью макросов SAMP_R1 и SAMP_R3. Для того, чтобы собрать клиентскую и серверную части плагина под платформу Win32 откройте проект sampvoice.sln в MS Visual Studio 2019 и скомпилируйте его:

Сборка -> Собрать решение (F7)

Linux (Server)


Для того, чтобы собрать серверную часть плагина под платформу Linux x86 выполните следующие инструкции:

cd server
make