English | Русский
SAMPVOICE - это набор разработчика для реализации систем голосового общения на языке Pawn под сервера SA:MP.
- Клиент: SA:MP 0.3.7 (R1, R3)
- Сервер: SA:MP 0.3.7 (R2)
- Контролируемая передача голосового потока
- Управление микрофоном игрока
- Привязка голосового потока к игровым объектам
- И ещё множество мелочей...
Для работы плагина, его необходимо установить игрокам и на сервер. Для этого есть клиентская и серверная части плагина.
Игрокам доступны 2 вариант установки: автоматический (через установщик) и ручной (через архив).
- Для того, чтобы скачать установщик перейдите по ссылке и выберите подходящую версию плагина.
- После скачивания запустите установщик, выберите язык установки, затем установщик автоматически определит директорию игры.
- Если директория верна, нажмите "ОК" и дождитесь конца установки. После окончания установки установщик завершит свою работу.
- Перейдите по ссылке и скачайте архив с необходимой версией клиента.
- Распакуйте содержимое архива в корневую директорию игры с заменой файлов.
- Загрузите архив с необходимой версией плагина для вашей платформы по ссылке.
- Распакуйте архив в корневую директорию сервера.
- Добавьте в файл конфигурации сервера 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
Для компиляции клиентской части плагина вам понадобится DirectX SDK. По умолчанию клиентская часть компилируется под версию SA:MP 0.3.7 (R1), но вы также можете явно указать компилятору версию для билда с помощью макросов SAMP_R1 и SAMP_R3. Для того, чтобы собрать клиентскую и серверную части плагина под платформу Win32 откройте проект sampvoice.sln в MS Visual Studio 2019 и скомпилируйте его:
Сборка -> Собрать решение (F7)
Для того, чтобы собрать серверную часть плагина под платформу Linux x86 выполните следующие инструкции:
cd server
make