Visual check of bullets

wip Visual check of bullets 1.1.1

Нет прав для скачивания
Сообщения
59
Реакции
27
Помог
1 раз(а)
Сообщения
1,668
Реакции
1,495
Помог
24 раз(а)
А если будет не игрок или ворлдспавн? А скажем func_wall/door.
Лучше будет FM_TraceLine, не придется неправильно брать координаты и учитывает недочет выше.
 
Сообщения
59
Реакции
27
Помог
1 раз(а)
fl0wer, если юзать FM_TraceLine, то придется либо отлавливать единичный выстрел, дабы трейс лишний раз не рисовался, либо делать проверку по времени отрисовки, по типу get_gametime,, что мне кажется более логичным и правильным
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
Код:
hook_cvar_change(pCvar, "HookCvarChange_TraceActive");
hook_cvar_change(pCvar, "HookCvarChange_TraceType");

public HookCvarChange_TraceActive(pCvar, const szOldValue[], const szNewValue[])
{
    g_iTraceActive = str_to_num(szNewValue);
}

public HookCvarChange_TraceType(pCvar, const szOldValue[], const szNewValue[])
{
    g_iTraceType = str_to_num(szNewValue);
}
Убрать за ненадобностью

Код:
new iActiveItem = get_member(iAttacker, m_pActiveItem);
new WeaponIdType:iWeaponID = get_member(iActiveItem, m_iId);
if(iWeaponID == WEAPON_HEGRENADE) {}
После броска граната не обязательно будет активайтемом (скорее всего не будет, так как по дефолту HE гранат одна штука). И я не уверен идет ли TraceAttack от них.

Код:
if(!g_iTraceActive)
    {
        return HAM_IGNORED;
    }
Лучше деактивировать хуки
29 Май 2020
И согласен с fl0wer. Не все класснеймы включены. А Это значит что стреляя по всяким ящикам или дверям трейса не будет
 
Сообщения
59
Реакции
27
Помог
1 раз(а)
Код:
hook_cvar_change(pCvar, "HookCvarChange_TraceActive");
hook_cvar_change(pCvar, "HookCvarChange_TraceType");

public HookCvarChange_TraceActive(pCvar, const szOldValue[], const szNewValue[])
{
    g_iTraceActive = str_to_num(szNewValue);
}

public HookCvarChange_TraceType(pCvar, const szOldValue[], const szNewValue[])
{
    g_iTraceType = str_to_num(szNewValue);
}
Убрать за ненадобностью
Это временное решение, в дальнейшем будет меню с настройками
https://dev-cs.ru/threads/2400/post-81618

Код:
new iActiveItem = get_member(iAttacker, m_pActiveItem);
new WeaponIdType:iWeaponID = get_member(iActiveItem, m_iId);
if(iWeaponID == WEAPON_HEGRENADE) {}
После броска граната не обязательно будет активайтемом (скорее всего не будет, так как по дефолту HE гранат одна штука). И я не уверен идет ли TraceAttack от них.
Я проверю еще гранату, эту проверку сделал для перестраховки, она не мешает

Код:
if(!g_iTraceActive)
    {
        return HAM_IGNORED;
    }
Лучше деактивировать хуки
29 Май 2020
И согласен с fl0wer. Не все класснеймы включены. А Это значит что стреляя по всяким ящикам или дверям трейса не будет
Я в поиске более лучшего хука атаки, для отрисовки трейс пуль, скоро будет обновление

Вопрос про деактивацию хука, если при проверке я его деактивирую, он при следующей атаке активируется сам?
И если отключение будет индивидуально для игрока, тот же вопрос, активируется ли?
 
Сообщения
59
Реакции
27
Помог
1 раз(а)
fantom, нравится менять значения кваров на лету
 
Сообщения
162
Реакции
445
Помог
2 раз(а)
На самом деле существует как минимум 3 решения этой задачи:

1. Хукать энтити, которые спавнятся в FM_Spawn и далее хукать их в Ham_TraceAttack что бы на них можно было сделать трейс.
Это довольно костыльно, да и к тому же, TraceAttack может вызваться несколько раз подряд за один выстрел (в зависимости от того, сколько объектов\стен пробьет пуля). То есть это придется фильтровать, что еще более костыльно.

2. Юзать FM_TraceLine, как предложил fl0wer. Но он вызывается не только при выстрелах. То есть помимо трейс лайн еще придется отлавливать выстрелы. Кроме того, здесь та же проблема с несколькими вызовами как и в первом варианте.

3. Юзать ивенты для отлова выстрела. Здесь нет проблем, которые есть в первых двух вариантах и удобно фильтровать оружие, для которого нужно делать трейс (убрать нож и дробовики).

Код:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <reapi>

new const EVENTS[][] = {
    "events/ak47.sc",
    "events/aug.sc",
    "events/awp.sc",
    "events/deagle.sc",
    "events/elite_left.sc",
    "events/elite_right.sc",
    "events/famas.sc",
    "events/fiveseven.sc",
    "events/g3sg1.sc",
    "events/galil.sc",
    "events/glock18.sc",
    //"events/knife.sc",
    "events/m249.sc",
    //"events/m3.sc",
    "events/m4a1.sc",
    "events/mac10.sc",
    "events/mp5n.sc",
    "events/p228.sc",
    "events/p90.sc",
    "events/scout.sc",
    "events/sg550.sc",
    "events/sg552.sc",
    "events/tmp.sc",
    "events/ump45.sc",
    "events/usp.sc",
    //"events/xm1014.sc"
};

new g_beamSprite;
new g_fwd_precache_event;
new g_guns_events_bitsum = 0;

#define is_player(%1)           (0 < %1 <= MaxClients)
#define is_gunshot_event(%1)    (g_guns_events_bitsum & (1 << %1))

public plugin_precache()
{
    g_beamSprite = precache_model("sprites/dot.spr");
    g_fwd_precache_event = register_forward(FM_PrecacheEvent, "on_precache_event_post", true);
}

public on_precache_event_post(type, const szName[])
{
    for (new i = 0; i < sizeof EVENTS; i++) {
        if (equali(szName, EVENTS[i])) {
            g_guns_events_bitsum |= (1 << get_orig_retval());
            break;
        }
    }
}

public plugin_init()
{
    register_plugin("Visual Bullets Check", "1.0.0", "the_hunter");
    register_forward(FM_PlaybackEvent, "on_playback_event_post", true);
    unregister_forward(FM_PrecacheEvent, g_fwd_precache_event, true);
}

public on_playback_event_post(flags, invoker, event)
{
    if (!is_gunshot_event(event) || !is_player(invoker) || is_user_bot(invoker))
        return;

    new clip;
    new weapon = get_user_weapon(invoker, clip);
    new clipSize = rg_get_weapon_info(weapon, WI_GUN_CLIP_SIZE);

    // If ammo left more than 20% - return
    if (!clip || clip > floatround(clipSize * 0.20, floatround_ceil))
        return;

    static vecEndPos[3];
    get_user_origin(invoker, vecEndPos, Origin_AimEndEyes);

    message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, vecEndPos, invoker);
    {
        write_byte(TE_BEAMENTPOINT);
        write_short(invoker | 0x1000);  // start entity
        write_coord(vecEndPos[0]);      // end position X
        write_coord(vecEndPos[1]);      // end position Y
        write_coord(vecEndPos[2]);      // end position Z
        write_short(g_beamSprite);      // sprite index
        write_byte(1);                  // starting frame
        write_byte(5);                  // frame rate in 0.1's
        write_byte(1);                  // life in 0.1's
        write_byte(5);                  // line width in 0.1's
        write_byte(0);                  // noise amplitude in 0.01's
        write_byte(255);                // red
        write_byte(215);                // green
        write_byte(0);                  // blue
        write_byte(200);                // brightness
        write_byte(150);                // scroll speed in 0.1's
    }
    message_end();
}
Это реализация третьего варианта. Отличия от плагина ТС:
Трейс вылетает из дула пушки, а не из глаз xD
Трейс видит только тот игрок, который стреляет (что бы не палится и что бы не слать лишнюю мессагу всем).
Трейс срабатывает когда в обойме остается меньше 20% магазина. Так например из дигла трейс будет лететь если в обойме осталось 2 патрона. Из калаша\мки если патронов осталось 5 или меньше и т.д.
 

Вложения

Последнее редактирование модератором:
Сообщения
494
Реакции
109
Помог
16 раз(а)
Целесообразно я думаю сделать сохранение настроек в nvault,а так каждую карту настраивать неудобно.

в архиве нехватает в lang файле

Код:
BULLET_TRACE_MENU_ITEM_2_TYPE_1

BULLET_TRACE_MENU_ITEM_2_TYPE_2

BULLET_TRACE_MENU_ITEM_2_TYPE_3
там где положение пуль

1591773285149.png
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу