Damager

  
Добавил eXcLuZiv Просмотров: 1875 Комментариев: 12
Damager
Недавно очень хороший, человек предложил, сделать "Damager" 
При уроне противника показываеться над его головой спрайт 
урона в цифрах.

Способности:

Отнял 50 hp
Над головой - 50

Дата добавления материала: 2018 » Октябрь » 25 | время: 07:51
ПРИ ПОЛНОМ КОПИРОВАНИИ МАТЕРИАЛА - УКАЗЫВАЙТЕ ССЫЛКУ НА CS-AMBA.RU!
Всего комментариев: 12
DeMNiX
0 DeMNiX 08.11.2018 в 08:54
Код
set_task(REMOVE_TIME, "rmv_entity", TASK_INDEX + iEnt);   // Создаем задачу на удаление Entity.

Незачем создавать таск, можно задать объекту синк на удаление

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


Код
set_pev(iEnt, pev_nextthink, get_gametime() + REMOVE_TIME);   // Создаем задачу на удаление Entity.


Тогда исходя из кода выше меняем так же и этот кусок:
Код
public rmv_entity(iTask) {
     new iEnt = iTask - TASK_INDEX;  // Получаем индекс Entity
      
     if(pev_valid(iEnt)) {   // Проверяем на наличие
         engfunc(EngFunc_RemoveEntity, iEnt);    // Удаляем Entity
     }
}


Код
public rmv_entity(iEnt) {
     if(pev_valid(iEnt)) {   // Проверяем на наличие
         engfunc(EngFunc_RemoveEntity, iEnt);    // Удаляем Entity
     }
}


Не стоит злоупотреблять функцией engfunc(EngFunc_RemoveEntity, iEnt); Фактически вы моментально удаляете объект, сервер ее теряет и начинается чехарда с бесконечной проверкой на валидность объекта. Хорошим решением будет использование set_pev(iEnt, pev_flags, FL_KILLME); Он удаляет ваш объект через 1 серверный фрейм

в итоге правильный код будет таким

Код
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define VERSION "1.0"
#define REMOVE_TIME 0.8
#define SPRITE_CLASSNAME "func_damager"
#define SPRITE_IMPULSE 11082018
#define SPRITE_MODEL "sprites/damager_dm.spr"

new g_Alloc_InfoTarget;

public plugin_precache() {
     engfunc(EngFunc_PrecacheModel, SPRITE_MODEL);   // Кэшируем спрайт

     g_Alloc_InfoTarget = engfunc(EngFunc_AllocString, "info_target");
}

public plugin_init() {
     register_plugin("Damager", VERSION, "OverGame");
     RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_Post", true); // Создаем событие отлова полученного урона
     RegisterHam(Ham_Think, "info_target", "fw_ThinkInfoTarget")
}

public Ham_TakeDamage_Post(iVictim, iWeapon, iAttacker, Float:fDamage) {
     new iEnt = engfunc(EngFunc_CreateNamedEntity, g_Alloc_InfoTarget);  // создаем Entity
      
     if(pev_valid(iEnt)) {   // Проверяем наличие Entity
         new Float:fOrigin[3];
         pev(iVictim, pev_origin, fOrigin);  // Получаем координаты жэртвы
         set_pev(iEnt, pev_classname, SPRITE_CLASSNAME);
         set_pev(iEnt, pev_impulse, SPRITE_IMPULSE);
         fOrigin[2] += 60.0; // Добавляем +60 позиции над головой
          
         engfunc(EngFunc_SetOrigin, iEnt, fOrigin);  // Устанавливаем позицию для Entity
         engfunc(EngFunc_SetModel, iEnt, SPRITE_MODEL); // Задаем модель для Entity
         set_pev(iEnt, pev_nextthink, get_gametime() + REMOVE_TIME); // Создаем задачу на удаление Entity.

         set_pev(iEnt, pev_frame, fDamage);  // Устанавливаем Frame (нанесенный урон) цифру, которую вывести.
     }
}

public fw_ThinkInfoTarget(iEnt) {

     if(pev_valid(iEnt)) {   // Проверяем на наличие и валидность от других кривых плагинов

         if (pev(iEnt, pev_impulse) == SPRITE_IMPULSE) { set_pev(iEnt, pev_flags, FL_KILLME); }  // Удаляем Entity
     }
}


Умалчивая еще тот аспект, что дамагер не должен отображать чужие спрайты. Если поставить его на паблик - куда не шло, но если поставить на какой-либо сервер zp, картина будет ужасной
DeMNiX
+1 DeMNiX 08.11.2018 в 08:37
автор плагина - исправь утечку памяти:
Код
new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));


IngPro
0 IngPro 30.10.2018 в 12:54
Норм плагин )
misterdok2018
0 misterdok2018 26.10.2018 в 01:12
Хороший плагин, но уже где то видел)
MayroN
0 MayroN 25.10.2018 в 17:53
"Написали очень хороший человек" - значит ето я получаеться)))
MayroN
0 MayroN 25.10.2018 в 17:48
Помню я просил человека OverGame сделать такое.Он сделал,но у меня почему то неработало ничего.
Спрайты ети брались из сервера Пушки-Лазеры от flower'a
eXcLuZiv
0 eXcLuZiv 25.10.2018 в 17:56
Все работает )
MayroN
0 MayroN 25.10.2018 в 18:03
Та я верю,значит у меня конфликт с чем то.Будут новости,отпишусь
Mr_DETAL6KA
0 Mr_DETAL6KA 13.01.2019 в 00:22
Тоже скачал классный ))) ogk75amw0fr
AHMED
0 AHMED 25.10.2018 в 16:33
Прикольный плагин, спс, взял!
Godzilla
0 Godzilla 25.10.2018 в 13:09
Для Бабушек и дедушек которые плохо видят.
eXcLuZiv
0 eXcLuZiv 25.10.2018 в 14:30
ахахаххаха. вот ты сказанул
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход
]