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

Подсветка цветом игрока в зависимости от здоровья (ColoredHealth)


ryancoolround

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

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

На этот раз дяде Нику не повезло, я все тесты проделывал на нем.

Скрытый текст

20200831062308_1.jpg20200831062123_1.jpg20200831062137_1.jpg20200831062139_1.jpg20200831062157_1.jpg

Этот плагин устанавливает цвет и прозрачность игроков в зависимости от его здоровья. Кстати, этот плагин полностью настраивается с помощью конфиг файла.

Это особенно полезно для серверов Сражения на реализме.

Компиляция была произведена на SM 1.10.0.6492

Установка:

  • Скомпилировать .sp файл и поместить плагин в /left4dead2/addons/sourcemod/plugins
  • Либо уже готовый .smx файл поместить в /left4dead2/addons/sourcemod/plugins
  • Файл coloredhealth.txt поместить в /left4dead2/addons/sourcemod/configs
  • Сделать рестарт сервера.

 

coloredhealth.smx coloredhealth.sp coloredhealth.txt

«Успех – это приятно, но он не должен быть единственной причиной, по которой вы – музыкант». - Честер Беннингтон

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

  • 3 недели спустя...
  • Администратор
2 часа назад, BLOODY BLADE сказал:

Новый синтаксисcoloredhealth.sp

Из всего пака который ты скинул, только этот вызывает Warning 241 при компиляции. Остальные скомпилировались идеально.

«Успех – это приятно, но он не должен быть единственной причиной, по которой вы – музыкант». - Честер Беннингтон

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

10 часов назад, Ryancoolround сказал:

Из всего пака который ты скинул, только этот вызывает Warning 241 при компиляции. Остальные скомпилировались идеально.

Это для sm 1.10 нормально. Предупреждение просто оповещает на будущее, что "структуры перечислений на основе массивов удалены в sm 1.11".

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

  • Администратор
Только что, BLOODY BLADE сказал:

для sm 1.10 нормально

Я как понял, в 1.11 оно не будет появляться, верно?

«Успех – это приятно, но он не должен быть единственной причиной, по которой вы – музыкант». - Честер Беннингтон

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

3 минуты назад, Ryancoolround сказал:

Я как понял, в 1.11 оно не будет появляться, верно?

На sm 1.11, при компиляции данного плагина компилятор выдаст предупреждения и ошибки:

Цитата

//SourceMod Batch Compiler
// by the SourceMod Dev Team


//// coloredhealth.sp
//
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(9) : error 153: Array-based enum structs have been removed. See https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Enum_Structs
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(17) : error 009: invalid array size (negative, zero or out of bounds)
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(64) : warning 213: tag mismatch (expected "int", got "float")
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(68) : error 032: array index out of bounds (variable "g_levelData")
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(69) : error 032: array index out of bounds (variable "g_levelData")
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(70) : error 032: array index out of bounds (variable "g_levelData")
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(71) : error 032: array index out of bounds (variable "g_levelData")
// D:\Games\Left4Dead2_Repack_by_Pioneer\scripting\sm&mm\sourcemod-1.11.0-git6624-windows\addons\sourcemod\scripting\coloredhealth.sp(92) : error 032: array index out of bounds (variable "g_levelData")
//
// 7 Errors.
//
// Compilation Time: 1,59 sec
// ----------------------------------------

Press enter to exit ...

 

 

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

  • 1 год спустя...
  • Администратор

Все же, есть решение скомпилировать этот плагин на актуальной стабильной версии SM, но так, что бы не было ни ошибок ни предупреждений. Это чисто для перфекционизма. Если что, вот код:

#include <sourcemod>

#define PL_VERSION "1.0.1-stable"

enum LevelAttributes
{
	Float:BiggerThan, 
	R, 
	G, 
	B, 
	A
}

new Handle:g_hConfigFilePath;
new g_levelData[64][LevelAttributes];

public Plugin:myinfo = 
{
	name = "ColoredHealth", 
	author = "alongub", 
	description = "Sets the color and transparency of players based on health.", 
	version = PL_VERSION, 
	url = "http://steamcommunity.com/id/alon"
};

public OnPluginStart()
{
	g_hConfigFilePath = 
	CreateConVar(
		"sm_coloredhealth_configfilepath", 
		"configs/coloredhealth.txt", 
		"Path, relative to root sourcemod directory, to colored health levels config file.", 
		_);
	
	HookEvent("player_hurt", Event_PlayerHurt);
	HookEvent("player_spawn", Event_PlayerSpawn);
	
	AutoExecConfig();
}

public OnConfigsExecuted()
{
	new Handle:kv = CreateKeyValues("levels");
	
	decl String:path[128];
	GetConVarString(g_hConfigFilePath, path, sizeof(path));
	
	BuildPath(Path_SM, path, sizeof(path), path);
	
	FileToKeyValues(kv, path);
	
	if (!KvGotoFirstSubKey(kv))
		return;
	
	decl String:sectionName[4];
	
	do
	{
		KvGetSectionName(kv, sectionName, sizeof(sectionName));
		new count = StringToInt(sectionName);
		
		new r = 255;
		new g = 255;
		new b = 255;
		new a = 255;
		
		g_levelData[count][BiggerThan] = KvGetFloat(kv, "biggerThan");
		
		KvGetColor(kv, "rgba", r, g, b, a);
		
		g_levelData[count][R] = r;
		g_levelData[count][G] = g;
		g_levelData[count][B] = b;
		g_levelData[count][A] = a;
		
	} while (KvGotoNextKey(kv));
	
	CloseHandle(kv)
}

public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	SetEntityRenderMode(client, RenderMode:RENDER_GLOW);
}

public Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	new Float:health = GetEventFloat(event, "health") / GetEntProp(client, Prop_Data, "m_iMaxHealth");
	
	for (new i = 0; i < sizeof(g_levelData); i++)
	{
		if (health >= g_levelData[i][BiggerThan])
		{
			SetEntityRenderColor(client, g_levelData[i][R], g_levelData[i][G], g_levelData[i][B], g_levelData[i][A]);
			return;
		}
	}
} 

 

«Успех – это приятно, но он не должен быть единственной причиной, по которой вы – музыкант». - Честер Беннингтон

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

  • 7 месяцев спустя...
  • Администратор
В 23.11.2021 в 11:05, Райан сказал:

Все же, есть решение скомпилировать этот плагин на актуальной стабильной версии SM

Снова перестал компилироваться на SourceMod 1.11. Что то связано с данным массивом:

enum LevelAttributes
{
	Float:BiggerThan, 
	R, 
	G, 
	B, 
	A
}

 

«Успех – это приятно, но он не должен быть единственной причиной, по которой вы – музыкант». - Честер Беннингтон

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

  • 2 года спустя...
  • Администратор
14 часов назад, Darya сказал:

А что это делает?

В данном коде плагина, перечисление LevelAttributes играет важную роль в определении характеристик уровня игрока, которые затем используются для установки цвета и прозрачности модели игрока в зависимости от его здоровья. Давай разберём, как это работает в контексте:

Перечисление LevelAttributes

enum LevelAttributes
{
	Float:BiggerThan, 
	R, 
	G, 
	B, 
	A
}

Это перечисление описывает атрибуты, связанные с уровнями здоровья игрока:

  • Float:BiggerThan — минимальное значение здоровья, больше которого нужно установить соответствующий цвет (в процентах).
  • R, G, B — значения цвета (красный, зелёный, синий), которые определяют визуальное представление игрока.
  • A — прозрачность (альфа-канал), который определяет, насколько прозрачен игрок.

Как используется LevelAttributes

new g_levelData[64][LevelAttributes];

Массив g_levelData используется для хранения настроек цветов, которые плагин будет применять в зависимости от уровней здоровья. Этот двумерный массив имеет 64 возможных уровня (условно) и для каждого уровня хранит значения для всех атрибутов (минимальное здоровье, цвет и прозрачность).

Чтение данных конфигурации

В функции OnConfigsExecuted() плагин загружает конфигурацию из файла и сохраняет данные в массив g_levelData.

g_levelData[count][BiggerThan] = KvGetFloat(kv, "biggerThan");

KvGetColor(kv, "rgba", r, g, b, a);

g_levelData[count][R] = r;
g_levelData[count][G] = g;
g_levelData[count][B] = b;
g_levelData[count][A] = a;
  • KvGetFloat(kv, "biggerThan") — получает значение, которое определяет, больше какого значения здоровья должен быть игрок, чтобы его цвет и прозрачность изменились.
  • KvGetColor(kv, "rgba", r, g, b, a) — получает значения цветов (RGBA) и сохраняет их в массив.

Применение цвета на основе здоровья

В событии player_hurt (Event_PlayerHurt), когда игрок получает урон:

Извлекается текущее здоровье игрока как доля от максимального здоровья:

new Float:health = GetEventFloat(event, "health") / GetEntProp(client, Prop_Data, "m_iMaxHealth");

Далее цикл проверяет массив g_levelData, чтобы найти подходящее значение BiggerThan:

if (health >= g_levelData[i][BiggerThan])
{
    SetEntityRenderColor(client, g_levelData[i][R], g_levelData[i][G], g_levelData[i][B], g_levelData[i][A]);
    return;
}

Если текущее здоровье игрока больше или равно определённому значению из конфигурации, то устанавливается соответствующий цвет с помощью SetEntityRenderColor().

Таким образом, перечисление LevelAttributes упрощает хранение и управление различными атрибутами цвета для каждого уровня здоровья.

«Успех – это приятно, но он не должен быть единственной причиной, по которой вы – музыкант». - Честер Беннингтон

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

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

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

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

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

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

Войти

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

Войти
×
×
  • Создать...