Перейти к содержанию

До Хэллоуина осталось....

 

Плагин добавляет команду !voice на сервер


Ry@N
Перейти к решению Решено Ry@N,

Рекомендуемые сообщения

  • Администратор

Данный плагин добавляет команду !voice на сервер. Игрок ее прописывает, и после, для этого игрока отключаются микрофоны других игроков. Что бы снова активировать микрофоны надо снова прописать команду !voice.

Так как мое файловое хранилище постоянно обновляется, и плагин может быть удален, выкладываю исходники в виде кода.

voice.sp:

#include <sdktools_voice>
#include <clientprefs>

ListenOverride g_userFlag[MAXPLAYERS + 1];
Handle g_hCookie;
bool g_bVoiceEnable[MAXPLAYERS + 1] = true;

public Plugin myinfo =  { name = "Voice", author = "bat9xxx", version = "1.0", url = "vk.com/s_plus2018" };

public void OnPluginStart() {
	RegConsoleCmd("sm_voice", VoiceChange);
	LoadTranslations(GetEngineVersion() == Engine_SourceSDK2006 ? "voice_old.phrases" : "voice.phrases");
	g_hCookie = RegClientCookie("voice_enable", "Включен/выключен", CookieAccess_Public);
}

public void OnClientCookiesCached(int iClient)
{
	char szValue[4];
	
	GetClientCookie(iClient, g_hCookie, szValue, sizeof(szValue));
	if (szValue[0])g_bVoiceEnable[iClient] = view_as<bool>(StringToInt(szValue));
	else g_bVoiceEnable[iClient] = true;
}

public Action VoiceChange(int iClient, int iArgs) {
	char szBuffer[128];
	
	if (g_bVoiceEnable[iClient] == false)
	{
		g_bVoiceEnable[iClient] = true;
		SetClientCookie(iClient, g_hCookie, "1");
		FormatEx(szBuffer, sizeof(szBuffer), "%t %t", "Prefix", "Enable");
		g_userFlag[iClient] = Listen_Yes;
	} else {
		g_bVoiceEnable[iClient] = false;
		SetClientCookie(iClient, g_hCookie, "0");
		FormatEx(szBuffer, sizeof(szBuffer), "%t %t", "Prefix", "Disable");
		g_userFlag[iClient] = Listen_No;
	}
	
	
	PrintToChat2(iClient, szBuffer);
	
	for (int i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i) && !IsFakeClient(i))
		{
			SetListenOverride(iClient, i, g_userFlag[iClient]);
		}
	}
	
}

public void OnClientPutInServer(int iClient) {
	
	g_userFlag[iClient] = g_bVoiceEnable[iClient] ? Listen_Yes : Listen_No;
	
}

stock void PrintToChat2(int iClient, char[] szMessage, any...)
{
	static int iEngine = -1;
	static const int g_iColorsCSSOB[] =  { 0xFFFFFF, 0xFF0000, 0x00AD00, 0x00FF00, 0x99FF99, 0xFF4040, 0xCCCCCC, 0xFFBD6B, 0xFA8B00, 0x99CCFF, 0x3D46FF, 0xFA00FA };
	static const char g_sColorsOldBefore[][] =  { "{DEFAULT}", "{TEAM}", "{GREEN}" }, 
	g_sColorsOldCSS[][] =  { "\x01", "\x03", "\x04" }, 
	g_sColorsBefore[][] =  { "{WHITE}", "{RED}", "{GREEN}", "{LIME}", "{LIGHTGREEN}", "{LIGHTRED}", "{GRAY}", "{LIGHTOLIVE}", "{OLIVE}", "{LIGHTBLUE}", "{BLUE}", "{PURPLE}" }, 
	g_sColorsCSGO[][] =  { "\x01", "\x02", "\x04", "\x05", "\x06", "\x07", "\x08", "\x09", "\x10", "\x0B", "\x0C", "\x0E" };
	
	
	if (iClient && IsClientInGame(iClient) && !IsFakeClient(iClient))
	{
		char szBuffer[PLATFORM_MAX_PATH], szNewMessage[PLATFORM_MAX_PATH];
		
		if (iEngine == -1)
		{
			switch (GetEngineVersion())
			{
				case Engine_CSGO:iEngine = 0;
				case Engine_CSS:iEngine = 1;
				case Engine_SourceSDK2006:iEngine = 2;
			}
		}
		
		Format(szBuffer, sizeof(szBuffer), !iEngine ? " \x01%s" : "\x01%s", szMessage);
		VFormat(szNewMessage, sizeof(szNewMessage), szBuffer, 3);
		
		if (!iEngine)
		{
			for (int i = 0; i < 12; i++)
			{
				ReplaceString(szNewMessage, sizeof(szNewMessage), g_sColorsBefore[i], g_sColorsCSGO[i]);
			}
			ReplaceString(szNewMessage, sizeof(szNewMessage), "{TEAM}", "\x03");
		}
		else
		{
			if (iEngine == 1)
			{
				char sBuff[64];
				switch (GetClientTeam(iClient))
				{
					case 1:Format(sBuff, sizeof(sBuff), "\x07%06X", g_iColorsCSSOB[6]);
					case 2:Format(sBuff, sizeof(sBuff), "\x07%06X", g_iColorsCSSOB[5]);
					case 3:Format(sBuff, sizeof(sBuff), "\x07%06X", g_iColorsCSSOB[9]);
				}
				ReplaceString(szNewMessage, sizeof(szNewMessage), "{TEAM}", sBuff);
				
				for (int i = 0; i < 12; i++)
				{
					Format(sBuff, sizeof(sBuff), "\x07%06X", g_iColorsCSSOB[i]);
					ReplaceString(szNewMessage, sizeof(szNewMessage), g_sColorsBefore[i], sBuff);
				}
			}
			else
			{
				for (int i = 0; i < 3; i++)
				{
					ReplaceString(szNewMessage, sizeof(szNewMessage), g_sColorsOldBefore[i], g_sColorsOldCSS[i]);
				}
			}
		}
		
		Handle hBf = StartMessageOne("SayText2", iClient, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
		if (hBf)
		{
			if (GetUserMessageType() == UM_Protobuf)
			{
				Protobuf hProtoBuffer = UserMessageToProtobuf(hBf);
				hProtoBuffer.SetInt("ent_idx", iClient);
				hProtoBuffer.SetBool("chat", true);
				hProtoBuffer.SetString("msg_name", szNewMessage);
				hProtoBuffer.AddString("params", "");
				hProtoBuffer.AddString("params", "");
				hProtoBuffer.AddString("params", "");
				hProtoBuffer.AddString("params", "");
			}
			else
			{
				BfWrite hBfBuffer = UserMessageToBfWrite(hBf);
				hBfBuffer.WriteByte(iClient);
				hBfBuffer.WriteByte(true);
				hBfBuffer.WriteString(szNewMessage);
			}
		}
		EndMessage();
	}
}

voice.phrases:

"Phrases"
{
    "Prefix"
    {
        "en"        "{RED}[Voice]"
        "ru"        "{RED}[Voice]"
    }
    "Enable"
    {
        "en"        "{BLUE}Now everyone can hear!"
        "ru"        "{BLUE}Теперь слышно всех!"
    }
    "Disable"
    {
        "en"        "{BLUE}Now you can't hear anyone"
        "ru"        "{BLUE}Теперь никого не слышно!"
    }
}

voice_old.phrases:

"Phrases"
{
    "Prefix"
    {
        "en"        "{TEAM}[Voice]"
        "ru"        "{TEAM}[Voice]"
    }
    "Enable"
    {
        "en"        "{GREEN}Now everyone can hear!"
        "ru"        "{GREEN}Теперь слышно всех!"
    }
    "Disable"
    {
        "en"        "{GREEN}Now you can't hear anyone"
        "ru"        "{GREEN}Теперь никого не слышно!"
    }
}

 

Voice.rar

Я не ищу ничего логичного, например денег. Меня нельзя купить, запугать, аргументировать или договориться со мной. Я просто хочу смотреть, как горит мир.

Ссылка на комментарий
Поделиться на другие сайты

  • Администратор

Было обнаружено, что в этой версии плагина присутствует баг. Если я командой !voice заглушу игроков, а потом им снова включу микрофон, то я буду слышать всех игроков, даже тех, которых не должен, из за раздельного чата.

Я не ищу ничего логичного, например денег. Меня нельзя купить, запугать, аргументировать или договориться со мной. Я просто хочу смотреть, как горит мир.

Ссылка на комментарий
Поделиться на другие сайты

  • Администратор
  • Решение

Вот версия, где данный баг исправлен. К сожалению не могу разместить плагин здесь самостоятельно из за правил сообщества, где я скачивал данный плагин. Но ссылку на пост я оставил.

Я не ищу ничего логичного, например денег. Меня нельзя купить, запугать, аргументировать или договориться со мной. Я просто хочу смотреть, как горит мир.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Похожий контент

    • Автор Ry@N
      SPCode - продолжение работы над SPEdit но уже другим разработчиком. То есть это Форк.
      Почему вам надо использовать SPCode вместо SPEdit:
      Редактор работает теперь на .NET Framework 4.8 (раньше работал на 4.5). Исправлен ошибка при закрытии несохраненной вкладки (Очень меня раздражало). Исправлены проблемы с отступом. Обновлены шаблоны плагинов. Помимо указанных четырех пунктов в программе есть еще очень много различных исправлений, плюс редактор сам по себе новее, ну и в него включены новые переводы
      SPCode.Installer.exe
      Требования:
      Что бы попытаться раскомпилировать простейшие плагины этим редактором, вам на PC потребуется последняя версия Java. Добавил это в первый пост.
    • Автор Ry@N
      Новый формат изображений от Google с расширением .webp набирает популярность. Всё чаще его можно встретить на сайтах, так как он оптимизирует картинку под меньший размер без потери качества по сравнению с .jpg. В этом году его стали использовать даже у нас на IP-Gamers.NET.
      Но, при скачивании и открытии в Photoshop, такой файл выдаёт ошибку, которая говорит что Photoshop не может  прочитать этот формат.
      Что бы избежать этого, по пути:
      C:\Program Files\Adobe Photoshop 2020\Plug-ins\File Formats Вставьте файл, что я прикрепил в этом посте.
      Так же рекомендую сохранять ваши JPG теперь именно в WEBP.
      W.rar
       
    • Автор Ry@N
      Версия плагина 2.1.3, изменения:
      Remke code Исправлена ошибка предыдущей памяти Исправлена утечка памяти Powerup возвращается в норму, когда игрок меняет команду или умирает Новая функция:
      Адреналин заставляет вас быстрее реагировать на нокдауны. Обновление cfg:
      Были добавлены новые переменные, поэтому удалите старую конфигурацию переменных, что бы вместо нее сгенерировалась новая. Новая конфигурация:
      // Нужно ли давать игрокам адреналин в начале раунда? l4d_powerups_adren_give_on "0" // Скорость восстановления l4d_powerups_animspeed "2.0" // Следует ли уведомлять игроков при подключении к серверу о бонусах? l4d_powerups_broadcast_on "1" // Как уведомляются игроки? (0 = Чат, 1 = Хинт 2 = Оба) l4d_powerups_broadcast_type "1" // Как долго должны длиться бусты? l4d_powerups_duration "20" // Нужно ли давать игрокам таблетки в начале раунда? l4d_powerups_pills_give_on "0" // Фактор удачи при проглатывании таблеток, которые дадут импульс. (1 = 1/1 2 = 1/2 3 = 1/3 4 = 1/4) l4d_powerups_pills_luck "3" // Включен ли плагин? l4d_powerups_plugin_on "1" // Нужно ли давать игрокам адреналин или таблетки в начале раунда? l4d_powerups_random_give_on "0" // Следует ли игрокам использовать адреналин для супер-перезарядки, стрельбы из оружия и рукопашных ударов? l4d_powerups_use_on "1" // Интервал между выстрелами умножается на это значение. ВНИМАНИЕ: достаточно короткий интервал приведет к искажению точности стрельбы из пистолетов-пулеметов и винтовок. l4d_powerups_weaponfiring_rate "0.6667" // Интервал размахивания холодного оружия l4d_powerups_weaponmelee_rate "0.45" // Интервал, возникающий при перезагрузке, умножается на это значение l4d_powerups_weaponreload_rate "0.5714" Команды плагина:
      sm_giveadren - Дать адреналин всем выжившим. (ADMFLAG_CHEATS) sm_givepills - Дать таблетки всем выжившим. (ADMFLAG_CHEATS) sm_giverandom - Дать или таблетки или адреналин всем выжившим. (ADMFLAG_CHEATS) Плагин мной не проверялся, так как в данный момент у меня нет тестового сервера для Left 4 Dead 2.
      l4d2_powerups_rush.smx l4d2_powerups_rush.sp
    • Автор Ry@N
      У меня сейчас нет тестового сервера по Left 4 Dead 2, поэтому я не проверял этот плагин. Если у вас есть возможность проверить его, будьте добры, не забудьте отписаться здесь после проверки этого плагина. Спасибо.
      Добавлен минимум обратного урона. Добавлены шансы на отсутствие обратного урона. Добавлен таймер для автоматического сброса шансов. Добавлено сообщение о повреждении от коктейля Молотова. Добавлены новые языки в языковой пакет плагина Добавлен подсчет общего урона для уменьшения сообщения в чате Изменен цвет текста для стиля от сервера pan0s. l4d2_reverse_ff.smx l4d2_reverse_ff.sp l4d2_reverse_ff.phrases.txt
    • Автор Ry@N
      Это плагин для менеджмента (управления) каткой. Если админ вводит команду sm_winner ct/t, то игра завершается со счетом в пользу выбранной команды.
      Плагин проверялся в игре Counter-Strike: Source, на версии SourceMod 1.10.0.6501.
      Установка:
      Скомпилируйте .sp файл и поместите его в /addons/sourcemod/plugins Или поместите уже готовый .smx файл в /addons/sourcemod/plugins Сделайте рестарт сервера. #pragma newdecls required #include <sourcemod> #include <sdktools> #include <cstrike> public Plugin myinfo = { name = "Winner", author = "Ilusion9", description = "При прописи команды sm_winner (CT/T) идет принудительное завершение игры и объявление победителя", version = "1.0", url = "https://ip-gamers.net/" }; ConVar g_Cvar_MaxRounds; ConVar g_Cvar_Timelimit; ConVar g_Cvar_RoundRestartDelay; public void OnPluginStart() { g_Cvar_MaxRounds = FindConVar("mp_maxrounds"); g_Cvar_Timelimit = FindConVar("mp_timelimit"); g_Cvar_RoundRestartDelay = FindConVar("mp_round_restart_delay"); RegConsoleCmd("sm_winner", Command_Winner); } public Action Command_Winner(int client, int args) { char arg[64]; GetCmdArg(1, arg, sizeof(arg)); if (StrEqual(arg, "T", false)) { EndGame(CS_TEAM_T); } else if (StrEqual(arg, "CT", false)) { EndGame(CS_TEAM_CT); } return Plugin_Handled; } void EndGame(int winner) { if (winner == CS_TEAM_T) { CS_SetTeamScore(CS_TEAM_T, g_Cvar_MaxRounds.IntValue / 2); SetTeamScore(CS_TEAM_T, g_Cvar_MaxRounds.IntValue / 2); CS_SetTeamScore(CS_TEAM_CT, 0); SetTeamScore(CS_TEAM_CT, 0); CS_TerminateRound(g_Cvar_RoundRestartDelay.FloatValue, CSRoundEnd_TerroristWin); } else { CS_SetTeamScore(CS_TEAM_CT, g_Cvar_MaxRounds.IntValue / 2); SetTeamScore(CS_TEAM_CT, g_Cvar_MaxRounds.IntValue / 2); CS_SetTeamScore(CS_TEAM_T, 0); SetTeamScore(CS_TEAM_T, 0); CS_TerminateRound(g_Cvar_RoundRestartDelay.FloatValue, CSRoundEnd_CTWin); } g_Cvar_Timelimit.SetInt(1); }  
      winner.sp winner.smx
  • Почему мы стираем банные полотенца? Разве мы не чисты; когда используем их?

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу


×
×
  • Создать...