Администратор ryancoolround Опубликовано 21 ноября, 2021 Администратор Поделиться Опубликовано 21 ноября, 2021 Простая переливающаяся радужная аура на игроке в L4D2, которая включается и выключается по команде. Переменная: rainbow_time 3.0 отвечает за время существование одного цвета в радуге. Команды: !arco - Включить радугу !arcoff - Выключить радугу Установка: Либо готовую версию .smx поместить в /addons/sourcemod/plugins, либо скомпилировать исходник и поместить туда же. Сделать рестарт сервера. rainbow_player.sp rainbow_player.smx Исходник плагина #pragma semicolon 1 #pragma newdecls required #include #include #include int g_iLight[MAXPLAYERS+1]; ConVar g_hRainbowTime; public Plugin myinfo = { name = "[L4D2] Rainbow Flashlight", author = "King", description = "Set Rainbow To flashlight", version = "1.0.0", url = "" }; public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion test = GetEngineVersion(); if (test != Engine_Left4Dead && test != Engine_Left4Dead2) { strcopy(error, err_max, "Plugin only supports Left 4 Dead 1 & 2."); return APLRes_SilentFailure; } return APLRes_Success; } public void OnPluginStart() { g_hRainbowTime = CreateConVar("rainbow_time", "3.0", "time for aura and body change"); HookEvent("player_death", Event_PlayerDeath); HookEvent("round_end", Event_RE); RegAdminCmd("sm_arco", Command_Rainbow, ADMFLAG_ROOT, "make rainbow light_dynamic"); RegAdminCmd("sm_arcoff", Command_RainbowOff, ADMFLAG_ROOT, "kill rainbow light_dynamic"); AutoExecConfig(true, "rainbow_light"); } public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) { RemoveNeon(GetClientOfUserId(event.GetInt("userid"))); } public Action Event_RE(Event event, const char[] name, bool dontBroadcast) { RemoveNeon(GetClientOfUserId(event.GetInt("userid"))); } public void OnClientDisconnect(int iClient) { g_iLight[iClient] = 0; } public Action Command_Rainbow(int client, int args) { SetClientNeon(client); } public Action Command_RainbowOff(int client, int args) { RemoveNeon(client); } int SetClientNeon(int iClient) { RemoveNeon(iClient); g_iLight[iClient] = CreateEntityByName("light_dynamic"); DispatchKeyValue(g_iLight[iClient], "brightness", "4"); float fOrigin[3]; GetClientAbsOrigin(iClient, fOrigin); DispatchKeyValue(g_iLight[iClient], "spotlight_radius", "250"); DispatchKeyValue(g_iLight[iClient], "distance", "255"); DispatchKeyValue(g_iLight[iClient], "style", "0"); SetEntPropEnt(g_iLight[iClient], Prop_Send, "m_hOwnerEntity", iClient); SDKHook(iClient, SDKHook_PreThinkPost, OnRainbowPlayer); if(DispatchSpawn(g_iLight[iClient])) { AcceptEntityInput(g_iLight[iClient], "TurnOn"); TeleportEntity(g_iLight[iClient], fOrigin, NULL_VECTOR, NULL_VECTOR); SetVariantString("!activator"); AcceptEntityInput(g_iLight[iClient], "SetParent", iClient, g_iLight[iClient], 0); SDKHook(g_iLight[iClient], SDKHook_SetTransmit, OnTransmit); return; } g_iLight[iClient] = 0; } void RemoveNeon(int iClient) { if(g_iLight[iClient] && IsValidEdict(g_iLight[iClient])) { AcceptEntityInput(g_iLight[iClient], "TurnOff"); AcceptEntityInput(g_iLight[iClient], "Kill"); SetEntProp(iClient, Prop_Send, "m_glowColorOverride", 0); SetEntProp(iClient, Prop_Send, "m_iGlowType", 0); SetEntProp(iClient, Prop_Send, "m_nGlowRange", 0); SetEntProp(iClient, Prop_Send, "m_nGlowRangeMin", 0); SDKUnhook(iClient, SDKHook_PreThinkPost, OnRainbowPlayer); } g_iLight[iClient] = 0; } public Action OnTransmit(int iEntity, int iClient) { if (g_iLight[iClient] == iEntity) { return Plugin_Continue; } static int iOwner, iTeam; if ((iOwner = GetEntPropEnt(iEntity, Prop_Send, "m_hOwnerEntity")) > 0 && (iTeam = GetClientTeam(iClient)) > 1 && GetClientTeam(iOwner) != iTeam) { return Plugin_Handled; } return Plugin_Continue; } public Action OnRainbowPlayer(int iClient) { if (!(0 < iClient <= MaxClients && IsClientInGame(iClient) && IsPlayerAlive(iClient))) { SDKUnhook(iClient, SDKHook_PreThinkPost, OnRainbowPlayer); return Plugin_Continue; } float flRainbow = g_hRainbowTime.FloatValue; int color[3]; color[0] = RoundToNearest((Cosine((GetGameTime() * flRainbow) + iClient + 0) * 127.5) + 127.5); color[1] = RoundToNearest((Cosine((GetGameTime() * flRainbow) + iClient + 2) * 127.5) + 127.5); color[2] = RoundToNearest((Cosine((GetGameTime() * flRainbow) + iClient + 4) * 127.5) + 127.5); //Light Color char sBuffer[16]; FormatEx(sBuffer, sizeof(sBuffer), "%i %i %i %i", GetRandomColor(color[2]), GetRandomColor(color[1]), GetRandomColor(color[0]), 255); DispatchKeyValue(g_iLight[iClient], "_light", sBuffer); //GLow Color SetEntProp(iClient, Prop_Send, "m_glowColorOverride", color[2] + (color[1] * 256) + (color[0] * 65536)); SetEntProp(iClient, Prop_Send, "m_iGlowType", 3); SetEntProp(iClient, Prop_Send, "m_nGlowRange", 99999); SetEntProp(iClient, Prop_Send, "m_nGlowRangeMin", 0); //Player Color SetEntityRenderColor(iClient, color[2], color[1], color[0], 255); return Plugin_Continue; } stock int GetRandomColor(int color) { return (color == -1 || color < 0 || color > 255) ? GetRandomInt(0, 255) : color; } Мир изменился, он стал другим! Ссылка на комментарий Поделиться на другие сайты Поделиться
Администратор ryancoolround Опубликовано 25 ноября, 2021 Автор Администратор Поделиться Опубликовано 25 ноября, 2021 Пример можно посмотреть в этом видео: Мир изменился, он стал другим! Ссылка на комментарий Поделиться на другие сайты Поделиться
Администратор ryancoolround Опубликовано 21 июля, 2022 Автор Администратор Поделиться Опубликовано 21 июля, 2022 Переформатирован синтаксис Сообщения в коде переведены на русский язык Добавлена ссылка в коде на эту тему На 47, 53, 64, 70 строки добавлено: return Plugin_Handled; Что бы избавится от предупреждений: warning 242: function "Event_PlayerDeath" should return an explicit value warning 242: function "Event_RE" should return an explicit value warning 242: function "Command_Rainbow" should return an explicit value warning 242: function "Command_RainbowOff" should return an explicit value На 95 и 99 строки нужно было добавить: return 0; Что бы избавится от предупреждения: warning 209: function has explicit 'int' tag but does not return a value Готовый вариант плагина скомпилирован на SourceMod 1.11.0.6905 В следующей версии нужно не забыть команду !arco сделать доступной для всех игроков, а не только для админов. rainbow_player.sp rainbow_player.smx Мир изменился, он стал другим! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения