Only HS без блокировки крови, блокировка только урона |
Здравствуйте, гость Вход | Регистрация
Наши новости:
|
|
|
Only HS без блокировки крови, блокировка только урона |
SISA
|
13.3.2017, 17:12
Сообщение
|
|
|
Если бы только в крови была проблема. Проблема в том что при блокировки в Ham_TraceAttack попадания игнорируются , то есть человека не колбасит и не приостанавливает от попаданий. Я же хочу реализовать по человечески, что бы только урон не засчитывался. Ну тогда если большинство пуль попало не в голову то считать что в голову не попал вовсе. Или есть вариант в трейсе блокировать и отрисовывать кровь + задерживать (колбасить) жертву ?
ssx, Задержка жертвы происходит в Damage Post, как и часть эффектов. Повторить полный набор эффектов сложновато. Я там вижу звуки при выстреле в каску армора например, изменяемую анимацию игрока, разный коэффициент стопорения в зависимости от хитбокса и ускорения игрока, и т.д. Всё это, конечно, можно повторить на амх, но че та это как-то пипец... Если боишься бага с дробаном, тогда уж лучше подсчитывать количество попаданий в трейсе по всем хитбоксам и по бубну. Соответственно, если по бубну было больше половины попаданий, то его и детектить как попадание в голову. А от 75го оффсета, в таком случае, можно вообще отказаться. Просто записывать на игрока номер хитбокса в трейсе и брать его в дамаге. Но всё это не решает проблему с засчитыванием урона. Короч код такой должен быть: Cкрытый текст Код #include <amxmodx> #include <fakemeta> #include <hamsandwich> #define SPR_BLOODDROP "sprites/blood.spr" // Куски разлетающейся крови #define SPR_BLOODSPRAY "sprites/bloodspray.spr" // Спрайт кнови в точке попадания #define is_user_valid(%1) (1 <= %1 <= g_iMaxPlayers) // Sprites new g_Blood_SprDrop, g_Blood_SprSpray; // Others new Float:g_Player_LastDmgTime[33]; new g_iMaxPlayers // Max players counter /*=============================================================================== ================================================================ [Plugin Init] ================================================================================ ================================================================*/ public plugin_init() { // TraceAttack RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Pre", 0); // Get Max Players g_iMaxPlayers = get_maxplayers(); } /*=============================================================================== ================================================================ [Plugin Precache] ================================================================================ ================================================================*/ public plugin_precache() { g_Blood_SprDrop = precache_model(SPR_BLOODDROP); g_Blood_SprSpray = precache_model(SPR_BLOODSPRAY); } /*=============================================================================== ================================================================ [Ham TraceAttack Pre] ================================================================================ ================================================================*/ public fw_TraceAttack_Pre(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_bits) { // Если Жертва или Аттакер Не Валидны if(!is_user_valid(victim) || !is_user_valid(attacker)) return HAM_IGNORED; // Если Жертве Не попали в Хитбокс Голову if(get_tr2(tracehandle, TR_iHitgroup) != HIT_HEAD) { // Переменные new Float:VecEnd[3]; // Находим текущее игровое Время new Float:flGameTime = get_gametime(); // Если текущее игрокое время Больше Последнего запомненного (фикс множественного урона на Дробанах) if(flGameTime > g_Player_LastDmgTime[attacker]) { // Вызываем фейковый урон, чтобы отбработать все эффекты ExecuteHam(Ham_TakeDamage, victim, attacker, attacker, 0.0, damage_bits); // Запоминаем текущее Время g_Player_LastDmgTime[attacker] = flGameTime; } // Рисуем кровь на стенах ExecuteHam(Ham_TraceBleed, get_tr2(tracehandle, TR_pHit), damage, direction, tracehandle, damage_bits); // Находим оригины точки попадания get_tr2(tracehandle, TR_vecEndPos, VecEnd); // Рисуем вылет кровь из Жертвы Make_SpawnBlood(VecEnd, damage); // Рисуем вылет кровь из Жертвы Make_BloodSplat(victim, VecEnd, direction, damage*5.0); return HAM_SUPERCEDE; } return HAM_IGNORED; } stock Make_SpawnBlood(const Float:vTraceEnd[3], Float:Damage) { // Переводим в целое значение new amount = floatround(Damage); // Умножаем на 2 amount *= 2; // Если размер больше максимального if(amount > 255) amount = 255; // Ставим максимальный размер // Создаем Эффект разлета крови message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_BLOODSPRITE); write_coord(floatround(vTraceEnd[0])); write_coord(floatround(vTraceEnd[1])); write_coord(floatround(vTraceEnd[2])); write_short(g_Blood_SprSpray); // Spray write_short(g_Blood_SprDrop); // Drop write_byte(247); // Color (red) write_byte(min(max(3, amount/10), 16)); // Size message_end(); } stock Make_BloodSplat(victim, const Float:vTraceEnd[3], const Float:direction[3], Float:Damage) { // Переменные new Float:fVelocity[3]; // Переводим урон в целое Число new amount = floatround(Damage); // Находим ускорение Жертвы pev(victim, pev_velocity, fVelocity); // Создаем Брызки Крови engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vTraceEnd, 0); write_byte(TE_BLOODSTREAM); engfunc(EngFunc_WriteCoord, vTraceEnd[0]); // x (положение жертвы) engfunc(EngFunc_WriteCoord, vTraceEnd[1]); // y (положение жертвы) engfunc(EngFunc_WriteCoord, vTraceEnd[2]); // z (положение жертвы) engfunc(EngFunc_WriteCoord, direction[0]); // x (направление вылета крови) engfunc(EngFunc_WriteCoord, direction[1]); // y (направление вылета крови) engfunc(EngFunc_WriteCoord, direction[2]); // z (направление вылета крови) write_byte(223); // color write_byte(amount + random_num(0, 100)); // speed message_end(); }
test222.sma ( 5,29 килобайт )
Кол-во скачиваний: 8Этот код эмулирует полностью всё, что происходит в двигле, с нулевым дамагом.
Отредактировал: SISA, - 13.3.2017, 17:13
|
Поблагодарили 1 раз
|
|
SISA
|
13.3.2017, 18:08
Сообщение
|
|
|
Ага, короч нулевой урон слать нельзя, иначе дирекшенов не будет у игрока на экране, а их там сложновато нарисовать, ещё и спекам их надо.
Короч обновил код. Тут урон фактический наносится, но HP не снимается + перекос экрана:
test222_v3.sma ( 6,29 килобайт )
Кол-во скачиваний: 14
Отредактировал: SISA, - 13.3.2017, 18:09
|
Поблагодарили 1 раз
|
|
![]() ![]() |