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

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


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
      Версия плагина 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
    • Автор Ry@N
      Как я понял, администраторы делаю випам цветной чат. Если тот, у кого цветной чат использует специальный символ, например @, то цветное сообщение блокируется, и отправляется обычное. Плагин понравился тем, что у него простой и очень маленький код.
      /* [ Includes ] */ #include <sourcemod> /* [ Compiler Options ] */ #pragma newdecls required #pragma semicolon 1 /* [ Defines ] */ #define MAX_MESSAGE_LENGTH 512 /* [ Chars ] */ static const char g_sSymbols[][] = { "", "", "", "", "", "", "", "", "", "", "", " " }; // White | Green | Blue | Darkblue | Darkred | Gold | Grey | Lightgreen | Lightred | Lime | Purple | Yellow /* [ Plugin Author And Informations ] */ public Plugin myinfo = { name = "[CS:GO] Pawel - [ Block Color Chat ]", author = "Pawel", description = "Block color messages for CS:GO servers by Pawel.", version = "1.0.0", url = "https://steamcommunity.com/id/pawelsteam" }; /* [ Message Modify ] */ public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] sName, char[] sMessage) { for (int i = 0; i < sizeof(g_sSymbols); i++) { while (StrContains(sMessage, g_sSymbols[i]) != -1) { ReplaceString(sMessage, MAX_MESSAGE_LENGTH, g_sSymbols[i], ""); return Plugin_Changed; } } return Plugin_Continue; }  
      pBlockColorChat.sp pBlockColorChat.smx
    • Автор Ry@N
      Этот плагин позволяет игрокам носить маски, защищающие их от Covid-19. Внимание, плагин работает только в Team Fortress 2.
      Пропишите команду !covid что бы использовать маску.

      Ниже код, на случай того, если я буду удалять файлы в своем профиле:
      #include <sourcemod> #include <tf2_stocks> #include <clientprefs> #include <morecolors> #pragma semicolon 1 #pragma newdecls required #define PLUGIN_VERSION "1.0" #define MASK_INDEX 31163 Handle g_hWearableEquip; Handle g_hCookie; int g_Mask[MAXPLAYERS+1] = {false,...}; public Plugin myinfo = { name = "[TF2] Covid-19", author = "Tair", description = "Gives TF2 players mask against Covid-19", version = PLUGIN_VERSION, url = "https://forums.alliedmods.net" } public void OnPluginStart() { RegConsoleCmd("sm_covid", Command_Mask); HookEvent("post_inventory_application", OnResupply); g_hCookie = RegClientCookie("covid_mask", "", CookieAccess_Private); GameData hTF2 = new GameData("sm-tf2.games"); // sourcemod's tf2 gamdata if (!hTF2) SetFailState("This plugin is designed for a TF2 dedicated server only."); StartPrepSDKCall(SDKCall_Player); PrepSDKCall_SetVirtual(hTF2.GetOffset("RemoveWearable") - 1); // EquipWearable offset is always behind RemoveWearable, subtract its value by 1 PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer); g_hWearableEquip = EndPrepSDKCall(); if (!g_hWearableEquip) SetFailState("Failed to create call: CBasePlayer::EquipWearable"); delete hTF2; } public Action OnResupply(Handle event, char[] name, bool dontBroadcast) { int client = GetClientOfUserId(GetEventInt(event, "userid")); if(g_Mask[client]) CreateMask(client); } public Action Command_Mask(int client, int args) { if (!g_Mask[client]) { g_Mask[client] = true; SetClientCookie(client, g_hCookie, "true"); CPrintToChat(client,"{gold}★ Covid-19 {white}| Mask is now on! Touch resupply to receive!"); } else { g_Mask[client] = false; SetClientCookie(client, g_hCookie, "false"); CPrintToChat(client,"{gold}★ Covid-19 {white}| Mask is now off. Touch resupply to remove it!"); } return Plugin_Handled; } public void OnClientDisconnect(int client) { g_Mask[client] = false; } public void OnClientCookiesCached(int client) { char value[9]; GetClientCookie(client, g_hCookie, value, sizeof(value)); if (StrEqual(value, "true")) g_Mask[client] = true; } bool CreateMask(int client) { int hat = CreateEntityByName("tf_wearable"); if (!IsValidEntity(hat)) { return false; } char entclass[64]; GetEntityNetClass(hat, entclass, sizeof(entclass)); SetEntProp(hat, Prop_Send, "m_iItemDefinitionIndex", MASK_INDEX); SetEntProp(hat, Prop_Send, "m_bInitialized", 1); SetEntData(hat, FindSendPropInfo(entclass, "m_iEntityQuality"), 10); SetEntProp(hat, Prop_Send, "m_iEntityLevel", 1); DispatchSpawn(hat); SDKCall(g_hWearableEquip, client, hat); return true; }  
      Covid.smx Covid.sp
  • Если вампиры не видят своих отражений; почему их волосы всегда такие аккуратные?

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

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




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