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

Простая переливающаяся радужная аура на игроке в 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
Обновил тег. (смотреть историю редактирования)

Это моя подпись.

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

Пример можно посмотреть в этом видео:

 

Это моя подпись.

  • 7 месяцев спустя...
  • Переформатирован синтаксис
  • Сообщения в коде переведены на русский язык
  • Добавлена ссылка в коде на эту тему
  • На 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

Это моя подпись.

  • 2 года спустя...
В 22.07.2022 в 00:30, ryancoolround сказал:

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

Замечательно!

  • 1 месяц спустя...
В 13.09.2024 в 23:37, Darya сказал:

Замечательно!

Рад, что все понравилось!

Это моя подпись.

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

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

Создать аккаунт

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

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

Войти

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

Войти

Последние посетители 0

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