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

[L4D2]Rainbow Light, Glow and Body - Радужная аура на игроке (Радуга в L4D2)


Ryancoolround

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

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

20211121112151_1.jpg

Простая переливающаяся радужная аура на игроке в 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;
}

 

Форум для вас существует бесплатно и без рекламы, однако сервер Minecraft, домен и интернет не бесплатны, поэтому ваша помощь приветствуется.
Поддержите IP-Gamers!

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

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

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

 

Форум для вас существует бесплатно и без рекламы, однако сервер Minecraft, домен и интернет не бесплатны, поэтому ваша помощь приветствуется.
Поддержите IP-Gamers!

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

  • 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

Форум для вас существует бесплатно и без рекламы, однако сервер Minecraft, домен и интернет не бесплатны, поэтому ваша помощь приветствуется.
Поддержите IP-Gamers!

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

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

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

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

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

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

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

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

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

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

Войти

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

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

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