[VIP] Heal Cube

[VIP] Heal Cube v1.3.1

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
  • Автор ресурса
  • #1
Skeriiz submitted a new resource:

[VIP] Heal Cube - Куб, восстанавливающий здоровье VIP игроку

Добавляет VIP игроку возможность восстанавливать здоровье, как Мэй - герою из Overwatch.

p.s. Модели прекешатся, но не добавляются в список загрузки.

Read more about this resource...
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
Странно... Ресурс выложен 2 минуты назад, но моделька уже есть =\
Есть видео? Не плохо было бы посмотреть
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
  • Автор ресурса
  • #4
Добавил скрины.
Странно... Ресурс выложен 2 минуты назад, но моделька уже есть =\
Моделька из общего доступа. Такую же, как в Over, увы, найти не смог, возможно где то в привате есть у кого...
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Помощь:

PHP:
m_iHealth    = FindSendPropInfo("CCSPlayer", "m_iHealth");
А если этого пропа нет?
PHP:
if(m_iHealth == -1) SetFailState("Bad: CCSPlayer|m_iHealth");

Тебе так удобнее?
PHP:
    if(!_UTIL_Valid(iClient))
       return Plugin_Handled;
   if(!VIP_IsClientVIP(iClient))
       return Plugin_Handled;
   if(!VIP_IsClientFeatureUse(iClient, HEAL_CUBE))
       return Plugin_Handled;
   if(!IsPlayerAlive(iClient))
       return Plugin_Handled;

Может проще сделать вот так:
PHP:
    if(!_UTIL_Valid(iClient) || !IsPlayerAlive(iClient) || !VIP_IsClientFeatureUse(iClient, HEAL_CUBE))
   {
       return Plugin_Handled;
   }

Касательно следующих операций...
PHP:
   float clientPos[3];
   GetClientAbsOrigin(iClient, clientPos);
   int iNewHP = _UTIL_GetNewHP(iClient);
Стоит сделать их после этой проверки:
PHP:
if (iEnt != -1 && IsValidEntity(iEnt) && !bAlreadeActive)

А если entity не существует? Сервер упадет? Timer_HealCube
PHP:
AcceptEntityInput(iEnt, "Kill");

Загрузки файлов я бы все же сделал в исходнике, новички явно столкнулся с проблемой, читать же не умеем.
Добавь:
C-подобный:
AddFileToDownloadsTable("materials/models/hypy/hype.vmt");
AddFileToDownloadsTable("materials/models/spree/spree.vtf");
AddFileToDownloadsTable("models/spree/spree.dx80.vtx");
AddFileToDownloadsTable("models/spree/spree.dx90.vtx");
AddFileToDownloadsTable("models/spree/spree.mdl");
AddFileToDownloadsTable("models/spree/spree.phy");
AddFileToDownloadsTable("models/spree/spree.sw.vtx");
AddFileToDownloadsTable("models/spree/spree.vvd");

̶P̶.̶S̶
̶[̶p̶h̶p̶]̶
̶ ̶ ̶ ̶P̶r̶e̶c̶a̶c̶h̶e̶M̶o̶d̶e̶l̶(̶M̶O̶D̶E̶L̶)̶;̶
̶ ̶ ̶ ̶P̶r̶e̶c̶a̶c̶h̶e̶S̶o̶u̶n̶d̶(̶I̶C̶E̶B̶L̶O̶C̶K̶_̶S̶O̶U̶N̶D̶)̶;̶
̶[̶/̶p̶h̶p̶]̶
̶с̶д̶е̶л̶а̶л̶ ̶б̶ы̶ ̶в̶ ̶>̶>̶
̶[̶p̶h̶p̶]̶
̶p̶u̶b̶l̶i̶c̶ ̶v̶o̶i̶d̶ ̶O̶n̶C̶o̶n̶f̶i̶g̶s̶E̶x̶e̶c̶u̶t̶e̶d̶
̶[̶/̶p̶h̶p̶]̶
[VIP] Heal Cube

P.S.S Для тех кто думает что я выеживаюсь, отвечу сразу - это не так, я помогаю потому что я этого хочу и я не преследую цели как то оскорбить автора. Сам многого не знаю и тоже прошу помощи у более прошаренных скриптеров когда чего то не понимаю, все с чего то начинали.

Я бы на твоем месте еще какой нибудь партикл взял у @2 joints , который бы возле хиллера создавал эффект, было бы интересно, визуально.

Модуль от випки я бы сделал как в мануале...
R1KO/VIP-Core

Как работает сам плагин, обратите внимание на xp.
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
  • Автор ресурса
  • #8
PHP:
m_iHealth    = FindSendPropInfo("CCSPlayer", "m_iHealth");
А если этого пропа нет?
PHP:
if(m_iHealth == -1) SetFailState("Bad: CCSPlayer|m_iHealth");

Тогда уж:
PHP:
if(m_iHealth < 1) SetFailState("Bad: CCSPlayer|m_iHealth");

А если entity не существует? Сервер упадет? Timer_HealCube
PHP:
AcceptEntityInput(iEnt, "Kill");

Тут, скорей, если ее что то убьет раньше таймера.
Загрузки файлов я бы все же сделал в исходнике, новички явно столкнулся с проблемой, читать же не умеем.
Добавь:
C-подобный:
AddFileToDownloadsTable("materials/models/hypy/hype.vmt");
AddFileToDownloadsTable("materials/models/spree/spree.vtf");
AddFileToDownloadsTable("models/spree/spree.dx80.vtx");
AddFileToDownloadsTable("models/spree/spree.dx90.vtx");
AddFileToDownloadsTable("models/spree/spree.mdl");
AddFileToDownloadsTable("models/spree/spree.phy");
AddFileToDownloadsTable("models/spree/spree.sw.vtx");
AddFileToDownloadsTable("models/spree/spree.vvd");
Насколько мне известно, ядро VIP предоставляет возможность подгруза моделек, нужно лишь дописать пути в файлик downloadlist.txt, думаю смогут..



Я бы на твоем месте еще какой нибудь партикл взял у @2 joints , который бы возле хиллера создавал эффект, было бы интересно, визуально.
Можно.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Тогда уж:
PHP:
if(m_iHealth < 1) SetFailState("Bad: CCSPlayer|m_iHealth");
При плохом оффсете ты получаешь значение -1.

Нашел интересный партикл: 4.36

Переделал его под синий цвет, чтобы сочетался с цветом модели.
eT3AgKMnZq0.jpg

Имя:
C-подобный:
"Heal" - heal_ss
"FX_File"   "particles/heal.pcf"

Как реализовать запуск/загрузку/кеширование партикла в самом плагине?
Посмотри пример от Reiko: [Руководство] Создание систем частиц (Particles), часть 2

Дальше дело за тобой.
 

Вложения

  • Heal.7z
    6.4 КБ · Просмотры: 19
Последнее редактирование:

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Под шоп сделать сможешь?
Приятнее глазу было бы, если бы хп прибавлялись постепенно со временем действия куба, а не все сразу под конец.
Ну и если бы сидящий в кубе не мог получать урон от энеми, лишним не было бы (не знаю, может тут или нет, не проверял, в описании не уточнено).
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
  • Автор ресурса
  • #13

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Короучи, я тут решил написать схожий плагин, но без модели...

Суть: игрок юзает шприц и когда он был заюзан(использован) у игрока активировался партикл(эффект) Теперь к самому плагину...

Когда я его почти написал, меня переклинило!
Баг: Если принудительно удалить оружие у игрока, а именно шприц, то эффект соответственно появится тоже, следовательно моя реализация не совсем подходит к моей задумке.

Далее, появилась идея сделать через 'weapon_fire' с учетом продолжительности использования шприца... Что я имею ввиду...
Получить значение и создать таймер или же самому установить свое значание но приближенное к 'времени использования'.
В самом таймере проверять прибавилось ли у игрока хп(хп в принципе не нужно, мало-ли за это время он потеряет больше чем получит, а шприца уже не будет) и есть ли шприц у него в наличии... Но мне было лень это делать, поэтому кому хочется допишет сам или же найдет способ лучше.


PHP:
#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; // Останавливаем цикл т.к он нам не нужен, мы нашли своего игрока!
                   }
               }
           }
       }
   }
}

@Skeriiz, для тебя писал описание, не сомневаюсь что ты сможешь разобраться как встроить партикл к себе в плагин.

Сам эффект который скинул выше:

Пожалуйста, убедительная просьба... Не просите меня дописать плагин, нет желания...
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
  • Автор ресурса
  • #15
@Skeriiz, для тебя писал описание, не сомневаюсь что ты сможешь разобраться как встроить партикл к себе в плагин.
Думаю с этим проблем не будет, мб под конец недели появится обнова, т.к. сейчас делать - времени нема.

А так, хотелось бы найти модель схожую с оригиналом...
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
  • Автор ресурса
  • #19
@Drumanid
Почему то кажется, что эффект сливается с самой моделью куба, возможно, стоит вынести в квар атрибуты партикла, дабы каждый мог выставить нужный ему эффект
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@Drumanid
Почему то кажется, что эффект сливается с самой моделью куба, возможно, стоит вынести в квар атрибуты партикла, дабы каждый мог выставить нужный ему эффект
По моему нормально. Если все же хочешь поправить, то придется либо размер модели уменьшать, либо сам партикл расширять.
Расширил, добавил ограничение.

P.S Создай квары с названием файла партикла и самого эффекта.
 

Вложения

  • heal.zip
    1.7 КБ · Просмотры: 15
Последнее редактирование:
Сверху Снизу