#include <sdktools>
public Plugin myinfo =
{
name = "Эффект шприца",
author = "Drumanid",
version = "1.0",
url = "Contact: http://hlmod.ru/members/drumanid.81996"
}
char g_sParticle[] = "particles/heal.pcf"; // Название партикла(файл)
char g_sEffect[] = "heal_ss"; // Название эффекта в партикле
char g_sMaterial[] = "materials/effects/healsign.vtf"; // Материал эффекта, если есть
public void OnMapStart()
{
static int iStringTable = INVALID_STRING_TABLE;
if(iStringTable == INVALID_STRING_TABLE) iStringTable = FindStringTable("ParticleEffectNames"); // Хрен его знает зачем проверка... но видимо надо. Находим нужную таблицу.
bool bSave = LockStringTables(false); // Открыли таблицу
AddToStringTable(iStringTable, g_sEffect); // Добавили в таблицу имя эффекта, чтобы система кешировала наш эффект
LockStringTables(bSave); // Закрыли таблицу
PrecacheGeneric(g_sParticle, true); // Кешируем файл
AddFileToDownloadsTable(g_sParticle); // Загружаем сам партикл(файл)
if(g_sMaterial[0]) // Проверяем... Не пуста ли наша строка
{
PrecacheDecal(g_sMaterial, true); // Кешируем материал партикла
AddFileToDownloadsTable(g_sMaterial); // Загружаем материал партикла
}
}
public void OnEntityDestroyed(int iEntity) // Событие уничтожения любого 'entity', т.е когда 'entity' уничтожается вызывается этот паблик
{
if(IsValidEntity(iEntity)) // Проверка валидности 'entity' (Лучше сделать, на всякий)
{
char sWeapon[32];
GetEntityClassname(iEntity, sWeapon, sizeof(sWeapon)); // Получаем имя 'entity', в нашем случае оружия
if(StrContains(sWeapon, "weapon_healthshot", true) == 0) // Сравниваем название полученного имени
{
float fPos[2][3], fDis;
GetEntPropVector(iEntity, Prop_Data, "m_vecOrigin", fPos[0]); // Получаем позицию уничтоженного 'entity'
for(int i = 1; i <= MaxClients; i++) // Цикл | Думал как сделать иначе... Не придумал. Хотя был вариант использовать и weapon_fire и destroy.
{
if(IsClientInGame(i) && IsPlayerAlive(i) & !IsFakeClient(i)) // Проверка - В сети? Живой? Не бот?
{
GetClientAbsOrigin(i, fPos[1]); // Получаем позицию игрока
fDis = GetVectorDistance(fPos[0], fPos[1]); // Получаем дистанцию между позициями(вектор)
if(fDis < 150.0) // Если дистация меньше чем 150.0, то это наш игрок использовал шприц. Можно сделать меньше, если боитесь что эффект будет сделан не тому кто использовал шприц...
{
if((iEntity = CreateEntityByName("info_particle_system")) != -1) // Создаем новый entity(партикл) и проверяем что он действительно создан
{
DispatchKeyValueVector(iEntity, "origin", fPos[1]); // Устанавливаем позицию спавна 'entity'
DispatchKeyValue(iEntity, "effect_name", g_sEffect); // Устанавливаем название эффекта
DispatchKeyValue(iEntity, "start_active", "1"); // Старт активации?
DispatchSpawn(iEntity); // Спавним
ActivateEntity(iEntity); // Активируем
SetVariantString("!activator"); // Я так понимаю устанавливает именное действие 'entity'
AcceptEntityInput(iEntity, "SetParent", i); // Устанавливаем entity за игроком
// Удаляем 'entity'
SetVariantString("OnUser1 !self:kill::2.5:1");
AcceptEntityInput(iEntity, "AddOutput");
AcceptEntityInput(iEntity, "FireUser1");
}
break; // Останавливаем цикл т.к он нам не нужен, мы нашли своего игрока!
}
}
}
}
}
}