Код
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, картина будет ужасной