[Плагин] Admin ESP Разьяснения

Сообщения
95
Реакции
21
Добрый день, начал активно изучать скриптинг +- начального уровня, но возникают опеределенные сложности в понимании.
Одним из таких недопониманий кода, является admin esp (автоp Neugomon).


Код:
new bool:g_IsAlive[33]; // глобальная булевая для проверки жив ли игрок в других функциях

public client_putinserver(id)
    g_IsAlive[id] = false;    // по дефолту выставляется, что игрок мертв и обозначается как false
  
public eDeathMsg()
    g_IsAlive[read_data(2)] = false; // в функции при смерти, выставляем снова false если умер

public eResetHud(id)
    g_IsAlive[id] = true; // в функции выставляем, так игрок жив
  
public eSpecMode(id) // все понятно вроде, если наблюдатель, то запускаем таск
{
if(entity_get_int(id, EV_INT_iuser1) == 4)
        set_task(0.3, "EspTimer", id, .flags="b");
    else
        remove_task(id);
}

public EspTimer(id)
{
    switch(g_IsAlive[id])
    {
        case false:
        {
            static iTarget; iTarget = entity_get_int(id, EV_INT_iuser2); //получаем id наблюдаемого игрока

            if(iTarget && is_user_alive(iTarget) && is_valid_ent(iTarget))   /////// самый непонятный мне кусок
                SendQuadro(id, iTarget);
        }
        case true: remove_task(id);
      
    } 
}

//////////////////////////////////////////////////
if(iTarget && is_user_alive(iTarget) && is_valid_ent(iTarget))
                SendQuadro(id, iTarget);
  
1. Почему мы пишем iTarget - если это просто получаемый id записаный в статику с названием iTarget

2. Зачем использовать is_user_alive(iTarget), если есть булевая g_IsAlive ?
2.1  Можно же использовать g_IsAlive[iTarget] ?

3. is_valid_ent(iTarget) допустим еще понимаю, что для проверки валидности,
но тоже есть сомнения, что в связке с is_user_alive необходимо
Техника призыва ----> fl0wer
 
Последнее редактирование:
Сообщения
578
Реакции
338
Предупреждения
2
Помог
9 раз(а)
неудачный ты пример взял для изучения
 
Сообщения
95
Реакции
21
steelzzz, другие admin esp сверх заумные, тут вроде проще некуда, но вот такие моменты (выше указал) мне непонятны, почему именно так, а не иначе....формирую правильное понимание кода
 
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
1. Потому что это ж неугомон. Конечно, никакого смысла в статике нет.
2. Потому что это ж неугомон.
2.1. Зачем использовать переменную, ещё и так ненадежно в эвентах. Лучше будет натив амхх.
3. Потому что это ж неугомон. Думаю валидность не нужна. А если и нужна, то перед аливе.
 
Сообщения
95
Реакции
21
fl0wer, тоесть в более менее нормальном вид должен быть такой?

Код:
public eSpecMode(id)
{
    if(entity_get_int(id, EV_INT_iuser1) == 4)
        set_task(0.3, "EspTimer", id, .flags="b");
    else
        remove_task(id);
}

public EspTimer(id)
{
    switch(g_IsAlive[id])
    {
        case false:
        {
            new iTarget = entity_get_int(id, EV_INT_iuser2);

            if(is_user_alive(iTarget) )
                SendQuadro(id, iTarget);
        }
        
        case true: remove_task(id);
    }
}
// Следующий прикол

Код:
register_event("TextMsg", "eSpecMode", "b", "2&#Spec_M");

public eSpecMode(id) // Вызывается 3-4 раза само по себе или же при каждом нажатии space 
{
    if(entity_get_int(id, EV_INT_iuser1) == 4)
        set_task(0.3, "EspTimer", id, .flags="b");
    else
        remove_task(id);
}

public EspTimer(id)
{
    switch(g_IsAlive[id])
    {
        case false:
        {
            new iTarget = entity_get_int(id, EV_INT_iuser2);

            if(is_user_alive(iTarget) )
                SendQuadro(id, iTarget);
        }
        
        case true: remove_task(id);
    }
1. При каждом вызове функции таск: не создается заново? создается новый, с удалением старого? накладывается?
если он создается несколько раз это ж дрочь нереальная
 
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
1. При каждом вызове функции таск: не создается заново? создается новый, с удалением старого? накладывается?
Хз как оно вообще работает и явно можно сделать нормально, а потом и лучше.

дрочь нереальная
Это ж неугомон.
 
Сообщения
95
Реакции
21
fl0wer, вот весь код с которым решил побаловаться, но я смотрю что здесь проблема на проблеме уже висит... дергать is_user_alive каждые 3 деятые секунды несусветная дичь, при этом еще и таск создается
Код:
#include <amxmodx>
#include <engine>

new g_iLaser;
new bool:g_bAdmin[33];
new bool:g_IsAlive[33];

public plugin_precache()
    g_iLaser = precache_model("sprites/laserbeam.spr");

public plugin_end()
{
    new pl[32], pnum; get_players(pl, pnum);
    for(new i; i < pnum; i++)
        remove_task(pl[i]);
}   
    
public plugin_init()
{
#define VERSION "1.0"
    register_plugin("Lite Admin ESP", VERSION, "neygomon");
    register_cvar("lite_aesp", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
    
    register_event("DeathMsg", "eDeathMsg", "a", "1>0");
    register_event("ResetHUD", "eResetHud", "be");
    register_event("TextMsg", "eSpecMode", "b", "2&#Spec_M");
}

public client_putinserver(id)
{
    g_bAdmin[id]  = (get_user_flags(id) & ADMIN_KICK) ? true : false;
    g_IsAlive[id] = false;
}

public client_disconnect(id)
{
    if(g_bAdmin[id])
        remove_task(id);
}

public eDeathMsg()
    g_IsAlive[read_data(2)] = false;

public eResetHud(id)
    g_IsAlive[id] = true;

public eSpecMode(id)
{
    if(!g_bAdmin[id]) return;

    if(entity_get_int(id, EV_INT_iuser1) == 4)
        set_task(0.3, "EspTimer", id, .flags="b");
    else
        remove_task(id);
}

public EspTimer(id)
{
    switch(g_IsAlive[id])
    {
        case false:
        {
            static iTarget; iTarget = entity_get_int(id, EV_INT_iuser2);

            if(iTarget && is_user_alive(iTarget) && is_valid_ent(iTarget))
                SendQuadro(id, iTarget);
        }
        case true: remove_task(id);
        
    }   
}

SendQuadro(id, iTarget)
{
    static pl[32], pnum, my_team;
    static Float:my_origin[3], Float:target_origin[3], Float:v_middle[3], Float:v_hitpoint[3];
    static Float:distance, Float:distance_to_hitpoint, Float:distance_target_hitpoint, Float:scaled_bone_len;
    static Float:v_bone_start[3], Float:v_bone_end[3], Float:offset_vector[3], Float:eye_level[3];

    entity_get_vector(iTarget, EV_VEC_origin, my_origin);
    my_team = get_user_team(iTarget);
    get_players(pl, pnum, "ah");
    for(new i; i < pnum; i++)
    {
        if(pl[i] == iTarget) continue;
        if(my_team == get_user_team(pl[i])) continue;

        entity_get_vector(pl[i], EV_VEC_origin, target_origin);
        distance = vector_distance(my_origin, target_origin);

        trace_line(-1, my_origin, target_origin, v_hitpoint);
        
        subVec(target_origin, my_origin, v_middle);
        normalize(v_middle, offset_vector, (distance_to_hitpoint = vector_distance(my_origin, v_hitpoint)) - 10.0);

        copyVec(my_origin, eye_level);
        eye_level[2] += 17.5;
        addVec(offset_vector, eye_level);

        copyVec(offset_vector, v_bone_start);
        copyVec(offset_vector, v_bone_end);
        v_bone_end[2] -= (scaled_bone_len = distance_to_hitpoint / distance * 50.0);

        if(distance_to_hitpoint == distance)
            continue;
        
        distance_target_hitpoint = (distance - distance_to_hitpoint) / 12;
        MakeQuadrate(id, v_bone_start, v_bone_end, floatround(scaled_bone_len * 3.0), (distance_target_hitpoint < 170.0) ? (255 - floatround(distance_target_hitpoint)) : 85)
    }
}

stock normalize(Float:Vec[3], Float:Ret[3], Float:multiplier)
{
    static Float:len; len = vector_distance(Vec, Float:{ 0.0, 0.0, 0.0 });
    copyVec(Vec, Ret);

    Ret[0] /= len;
    Ret[1] /= len;
    Ret[2] /= len;
    Ret[0] *= multiplier;
    Ret[1] *= multiplier;
    Ret[2] *= multiplier;
}

stock copyVec(Float:Vec[3], Float:Ret[3])
{
    Ret[0] = Vec[0];
    Ret[1] = Vec[1];
    Ret[2] = Vec[2];
}

stock subVec(Float:Vec1[3], Float:Vec2[3], Float:Ret[3])
{
    Ret[0] = Vec1[0] - Vec2[0];
    Ret[1] = Vec1[1] - Vec2[1];
    Ret[2] = Vec1[2] - Vec2[2];
}

stock addVec(Float:Vec1[3], Float:Vec2[3])
{
    Vec1[0] += Vec2[0];
    Vec1[1] += Vec2[1];
    Vec1[2] += Vec2[2];
}

MakeQuadrate(id, Float:Vec1[3], Float:Vec2[3], width, brightness)
{
    message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, { 0, 0, 0 }, id);
    write_byte(0);
    write_coord(floatround(Vec1[0]));
    write_coord(floatround(Vec1[1]));
    write_coord(floatround(Vec1[2]));
    write_coord(floatround(Vec2[0]));
    write_coord(floatround(Vec2[1]));
    write_coord(floatround(Vec2[2]));
    write_short(g_iLaser);
    write_byte(3);
    write_byte(0);
    write_byte(3);
    write_byte(width);
    write_byte(0);
    write_byte(0);
    write_byte(255);
    write_byte(0);
    write_byte(brightness);
    write_byte(0);
    message_end();
}
30 Дек 2019
Хз как оно вообще работает и явно можно сделать нормально, а потом и лучше.


Это ж неугомон.
озвучь ценник )
 
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
@fl0wer, вот весь код с которым решил побаловаться, но я смотрю что здесь проблема на проблеме уже висит... дергать is_user_alive каждые 3 деятые секунды несусветная дичь, при этом еще и таск создается
Ужас!!
 
Сообщения
271
Реакции
347
Помог
15 раз(а)
Опять боятся. Спидометр посмотрите.
 
Сообщения
95
Реакции
21
Denzer, боятся чего?
30 Дек 2019
Denzer, ты наверное не так строчку понял выше. Я не боюсь что натив вызывается каждые 0.3 секунды, меня смущало, что в спектаторах таск создается каждый раз при вызове евента и не понятно, или он пересоздался или создался, а старый так же остался
 
Сообщения
271
Реакции
347
Помог
15 раз(а)
thegame, ну тогда else убери и remove_task выше.
 

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

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