BLOG [questions] Вопросы от maFFyoZZyk, или над чем я ломаю голову.

Сообщения
1,697
Реакции
1,510
Помог
25 раз(а)
hajimura, да кажись проще и вернее будет таск заюзать
4 Мар 2023

попробовал get_member(id, m_izSBarState, 4); - но ту какие-то магические числа появляются вроде
Код:
1103296205
1105682103
1107093565
1107845865
тебе массив[SBAR_END] нужен, в который ты записываешь через get.
 
Сообщения
75
Реакции
82
Помог
6 раз(а)
Код:
enum sbar_data
{
    SBAR_ID_TARGETCLASS = 1,
    SBAR_ID_TARGEINDEX,
    SBAR_ID_TARGETHEALTH,
    SBAR_END,
};
new sData[SBAR_END];

get_member(id, m_izSBarState, sData);

server_print("SBAR_ID_TARGETCLASS: %i", sData[SBAR_END]);
server_print("SBAR_ID_TARGEINDEX: %i", sData[SBAR_ID_TARGEINDEX]);
server_print("SBAR_ID_TARGETHEALTH: %i", sData[SBAR_ID_TARGETHEALTH]);
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
Flymic24, увы но для моих целей не вариант, там все время по нулям, если делать условие, то моментальное срабатывание. остановимся на таске, всем спасибо

P.S. new sData[sbar_data];
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
что-то захотелось переписать старый плагин reload bar time. на новый лад. Ну естественно столкнулся с проблемами.
первое и самое главное, это создание bartime. конечно же все скажут, ты чего, есть же rg_send_bartime, вставляй в него свои данные и будет тебе счастье. Ну это конечно хорошо, reapi - современность и все дела, но суть проблемы заключается в том, что данный натив использует переменные int формата, а к примеру хук RG_CBasePlayerWeapon_DefaultReload использует float. все бы ничего, умные головы скажут floatround тебе в помощь. и тут я остановлюсь подробнее. К примеру берем в руки usp и начинаем перезарядку (время перезарядки usp - 2.20) в принципе, если округлить до 2х, то ну сильно критичных каких-то грехов нет, но если в руки мы берем к примеру m249 (время перезарядки 4.69), то при округлении до 5, перезарядка кончилась, а полоска то, еще бежит. Про перезарядку дробовика, в принципе можно забыть(скорость перезарядки 0.44), т.е. при округлении 0, а если в нативе бартайма 0, то он останавливавется

P.s. пока идея только одна, запускать таск по delay - оружия и останавливать bartime. а у дроби проверять количество патронов , умножать его на delay и это будет как раз время перезарядки

Возможно есть какой-то способ посылать float значения в мессагу(т.е. отказаться от rg_send_bartime и использовать get_user_msgid("BarTime")), но у меня нет идей как, потому прошу помощи
 
Последнее редактирование:
Сообщения
775
Реакции
293
Помог
11 раз(а)
d3m37r4, ну по факту да, ты просто не пишешь вызов мессаги, а просто ставишь время
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
а у дроби проверять количество патронов , умножать его на delay и это будет как раз время перезарядки
Все бы ничего, если бы хук RG_CBasePlayerWeapon_DefaultShotgunReload вызывался 1 раз, а не считал каждый патрон отдельной перезарядкой
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Сообщения
775
Реакции
293
Помог
11 раз(а)
d3m37r4, чет не ясно ни чего. короче сделал так
Код:
#include <amxmodx>
#include <reapi>

const TASK_INDEX = 0xD5F29;

public plugin_init()
{
    register_plugin("Re: Reload Status Bar", "1.0", "maFFyoZZyk");

    RegisterHookChain(RG_CBasePlayerWeapon_DefaultReload, "CBasePlayerWeapon_DefaultReload_Post", .post = false);
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultShotgunReload, "CBasePlayerWeapon_DefaultShotgunReload_Pre", .post = true);
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", .post = false);
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", .post = true);   
}

public CBasePlayerWeapon_DefaultReload_Post(const this, iClipSize, iAnim, Float:fDelay)
{
    new pPlayer = get_member(this, m_pPlayer);

    if(!is_user_alive(pPlayer))
        return;

    new iAmmo = rg_get_user_ammo(pPlayer, get_member(this, m_iId));
    if(iAmmo == iClipSize)
        return;
    
    if(fDelay < floatround(fDelay))
        set_task(fDelay, "Stop_BarTime", TASK_INDEX + pPlayer);
    
    rg_send_bartime(pPlayer, floatround(fDelay), true);
}

public CBasePlayerWeapon_DefaultShotgunReload_Pre(const this, iAnim, iStartAnim, Float:fDelay, Float:fStartDelay, const pszReloadSound1[], const pszReloadSound2[])
{
    new pPlayer = get_member(this, m_pPlayer);

    if(!is_user_alive(pPlayer))
        return;

    new iAmmo = rg_get_user_ammo(pPlayer, get_member(this, m_iId));
    new iClipSize = rg_get_iteminfo(this, ItemInfo_iMaxClip);
    
    if(iAmmo == iClipSize)
        return;
    
    new Float: fBarDelay = Float:fStartDelay * (iClipSize - iAmmo);
    // client_print(0, print_chat, "Player Next: %0.2f", fBarDelay);   
    
    // if(fBarDelay < floatround(fBarDelay))
        // set_task(fBarDelay, "Stop_BarTime", TASK_INDEX + pPlayer);
    
    if(iAmmo == 0 && get_member(pPlayer, m_Weapon_fInSpecialReload) == 0 && iClipSize ||
        iAmmo != iClipSize && iClipSize)
        rg_send_bartime(pPlayer, floatround(fBarDelay), true);   
    
}

public CBasePlayerWeapon_DefaultDeploy_Pre(const pEntity, szViewModel[], szWeaponModel[], iAnim, szAnimExt[], skiplocal)
{
    new pPlayer = get_member(pEntity, m_pPlayer);

    if(!is_user_alive(pPlayer))
        return;

    rg_send_bartime(pPlayer, 0, true);
}

public CBasePlayer_Killed_Post(pVictim, pAttacker, pGib)
{
    if(!is_user_connected(pVictim) || !is_user_connected(pAttacker))
        return;

    rg_send_bartime(pVictim, 0, true);
}

public Stop_BarTime(pPlayer)
{
    pPlayer -= TASK_INDEX;

    if(!is_user_alive(pPlayer))
        return;
    
    rg_send_bartime(pPlayer, 0, true);
}
При перезарядке дроби, все равно каждый патрон бар-тайм новый юзается
19 Мар 2023
Появился, новый вопрос, вот сваял я тут плугин, все работает, все замечтательно, кроме одного. анимация укола почему-то работает через раз

Код:
#include <amxmodx>
#include <reapi>

#define    MAX_COORDINATES            3
#define IsTeam(%1)                get_member(%1, m_iTeam)

enum any:CVARS
{
    FRI_MP_ACCESS[MAX_NAME_LENGTH],
    FRI_MP_RND_LIMIT,
    FRI_MP_MK_MAX,
    Float: FRI_MP_HP,
    Float: FRI_MP_ADD_HP,
    FRI_MP_ANIMATION[MAX_NAME_LENGTH],
    Float: FRI_MP_SPEED_ANIM,
    FRI_MP_HEAL_SPR,
    FRI_MP_HEALER_SND,
    FRI_MP_HEALED_SND
};
new g_Cvar[CVARS];

new const VIEW_MDL[]    =        "models/injection/v_syringe.mdl";            // Модель шприца в руках
new const PLAYER_MDL[]    =        "models/injection/p_syringe.mdl";            // Модель шприца со стороны
new const SND_HEAL[]    =        "injection/heal.wav";                        // Звук для исцеляемого
new const SND_HEALING[]    =        "injection/medic.wav";                        // Звук для целителя
new const HEALTH_SPR[]    =        "sprites/injection/heal_shape.spr";            // Спрайт после лечения

enum any:
{
    STATUS_HIDE, // 0
    STATUS_SHOW, // 1
    STATUS_FLASH, // 2
}

const TASK_INDEX = 0xA6123;
new const SPRITE_MSG_NAME[] = "plus"; // Спрайт
new g_iMsgStatusIcon;
new g_iHealSprite;
new g_iHealter[MAX_PLAYERS+1];

enum _: INT_VALUES_NAMES
{
    HID,    // id использующего
    PLID,    // на ком используют
    HWPN    // оружие использующего
};

public plugin_init()
{
    register_plugin("Injection Med-Kit", "1.0", "maFFyoZZyk");

    register_dictionary("injection_med-kit.txt");
    RegisterCvars();
    AutoExecConfig(true, "injection_med-kit");   

    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip_Post", .post = true);
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", .post = false);
    g_iMsgStatusIcon = get_user_msgid("StatusIcon")
    RegisterHookChain(RG_CBasePlayer_UseEmpty, "CBasePlayer_UseEmpty", .post = true);
    RegisterHookChain(RG_PlantBomb, "PlantBomb", .post = true);
}

public plugin_precache()
{
    precache_model(VIEW_MDL);
    precache_model(PLAYER_MDL);
    g_iHealSprite = precache_model(HEALTH_SPR);
    precache_sound(SND_HEAL);
    precache_sound(SND_HEALING);
}

public client_disconnected(id)
{
    g_iHealter[id] = 0;
    remove_task(id);
}

public CBasePlayer_OnSpawnEquip_Post(pPlayer)
{
    if(!is_user_alive(pPlayer))
        return HC_CONTINUE;

    remove_task(pPlayer);

    if(!(get_user_flags(pPlayer) & read_flags(g_Cvar[FRI_MP_ACCESS])))
        return HC_CONTINUE;

    g_iHealter[pPlayer] = 0;    //  обнуляем количество попыток лечения
    
    set_msg_status_icon(pPlayer, STATUS_HIDE, SPRITE_MSG_NAME);
    client_print_color(pPlayer, -2, "%L %L", LANG_PLAYER, "FRI_PREFIX", LANG_PLAYER, "FRI_EQUIPMSG");
    set_task(0.1, "task_send_msg_status_icon", TASK_INDEX + pPlayer);
    
    return HC_CONTINUE;
}

public CBasePlayerWeapon_DefaultDeploy_Pre(const pEntity, szViewModel[], szWeaponModel[], iAnim, szAnimExt[], skiplocal)
{
    new pPlayer = get_member(pEntity, m_pPlayer);

    if(!is_user_alive(pPlayer))
        return;

    if(task_exists(pPlayer))
    {
        rg_send_bartime(pPlayer, 0, true);
        remove_task(pPlayer);
        set_msg_status_icon(pPlayer, STATUS_HIDE, SPRITE_MSG_NAME);
        set_msg_status_icon(pPlayer, STATUS_SHOW, SPRITE_MSG_NAME, 0, 128, 0);
    }
}

public task_send_msg_status_icon(pPlayer)
{
    pPlayer -= TASK_INDEX;

    if(!is_user_alive(pPlayer))
        return;
    
    set_msg_status_icon(pPlayer, STATUS_SHOW, SPRITE_MSG_NAME, 0, 128, 0);
}

public CBasePlayer_UseEmpty(id)
{
    if(!is_user_alive(id))
        return HC_CONTINUE;

    if(!(get_user_flags(id) & read_flags(g_Cvar[FRI_MP_ACCESS])))
        return HC_CONTINUE;

    if(~get_entvar(id, var_flags) & FL_ONGROUND)
        return HC_CONTINUE;

    if(g_iHealter[id] >= g_Cvar[FRI_MP_RND_LIMIT])       
    {
        client_print_color(id, -2, "%L %L", LANG_PLAYER, "FRI_PREFIX", LANG_PLAYER, "FRI_EXHAUSTED");
        return HC_CONTINUE;
    }
        
    if((Float:get_entvar(id, var_health) * 100.0 / Float:get_entvar(id, var_max_health)) >= g_Cvar[FRI_MP_HP])
    {
        client_print_color(id, -2, "%L %L", LANG_PLAYER, "FRI_PREFIX", LANG_PLAYER, "FRI_FULL");
        return HC_CONTINUE;
    }
    new sArgValue[INT_VALUES_NAMES];                       
    sArgValue[HID] = id;
    sArgValue[HWPN] = get_member(id, m_pActiveItem);
    
    if(is_nullent(sArgValue[HWPN]))
        return HC_CONTINUE;

    client_print_color(id, -2, "%L %L", LANG_PLAYER, "FRI_PREFIX", LANG_PLAYER, "FRI_USE");
    set_entvar(id, var_viewmodel, VIEW_MDL);
    set_entvar(id, var_weaponanim, 0);
                        
    set_entvar(id, var_weaponmodel, PLAYER_MDL);
    // rg_set_player_animation(id, g_Cvar[FRI_MP_ANIMATION]);
    set_msg_status_icon(id, STATUS_FLASH, SPRITE_MSG_NAME);
    set_task(float(2), "Healing", id, sArgValue, sizeof(sArgValue));
    rg_send_bartime(id, 2, true);

    return HC_CONTINUE;
}

public Healing(sArgValue[], id)
{           
    new Float: fAddHealth = Float:get_entvar(sArgValue[HID], var_health) + g_Cvar[FRI_MP_ADD_HP];
    
    if(fAddHealth > 100.0)
        fAddHealth = 100.0;   
    
    set_entvar(sArgValue[HID], var_health, fAddHealth);
    
    new Float:origin[3];
    get_entvar(sArgValue[HID], var_origin, origin);
    
    if(g_Cvar[FRI_MP_HEAL_SPR] == 1)
        UTIL_SpriteTrail(origin, g_iHealSprite);
    
    rg_switch_weapon(sArgValue[HID], sArgValue[HWPN]);
    client_print_color(sArgValue[HID], -2, "%L %L", LANG_PLAYER, "FRI_PREFIX", LANG_PLAYER, "FRI_USED");

    if(g_Cvar[FRI_MP_HEALER_SND])
        emit_sound(0, CHAN_AUTO, SND_HEALING, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    if(g_Cvar[FRI_MP_HEALED_SND])
        emit_sound(sArgValue[HID], CHAN_AUTO, SND_HEAL, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    
    set_msg_status_icon(sArgValue[HID], STATUS_HIDE, SPRITE_MSG_NAME);
    
    g_iHealter[sArgValue[HID]]++;
    
    if(g_iHealter[sArgValue[HID]] < g_Cvar[FRI_MP_RND_LIMIT])       
        set_task(0.1, "task_send_msg_status_icon", TASK_INDEX + sArgValue[HID]);
    
    remove_task(id);
}

stock UTIL_SpriteTrail(Float:origin[3], const sprite, const cound = 20, const life = 20, const scale = 4, const noise = 20, const speed = 10) {
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY); // MSG_PVS
    write_byte(TE_SPRITETRAIL);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 20.0);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 80.0);
    write_short(sprite);
    write_byte(cound);
    write_byte(life);
    write_byte(scale);
    write_byte(noise);
    write_byte(speed);
    message_end();
}

stock set_msg_status_icon(pPlayer, iStatus, const sSprite[], iRed = 0, iGreen = 0, iBlue = 0)
{
    message_begin(MSG_ONE, g_iMsgStatusIcon, .player = pPlayer);
    write_byte(iStatus);
    write_string(sSprite);

    if(iStatus != STATUS_HIDE)
    {
        write_byte(iRed);
        write_byte(iGreen);
        write_byte(iBlue);
    }

    message_end();
}

stock rg_set_player_animation(const player_id, const anim_name[])
{
    static anim_id, Float:fFrameRate, bool:bLoops, Float:fGroundSpeed;

    if ((anim_id = lookup_sequence(player_id, anim_name, fFrameRate, bLoops, fGroundSpeed)) == -1)
        anim_id = 0;

    new Float:fGameTime = get_gametime();

    set_entvar(player_id, var_frame, 0.0);
    set_entvar(player_id, var_framerate, g_Cvar[FRI_MP_SPEED_ANIM]);
    set_entvar(player_id, var_animtime, fGameTime );
    set_entvar(player_id, var_sequence, anim_id);

    set_member(player_id, m_fSequenceLoops, bLoops);
    set_member(player_id, m_fSequenceFinished, 0); 

    set_member(player_id, m_flFrameRate, fFrameRate);
    set_member(player_id, m_flGroundSpeed, fGroundSpeed);
    set_member(player_id, m_flLastEventCheck, fGameTime);

    set_member(player_id, m_Activity, 28);
    set_member(player_id, m_IdealActivity, 28);
    set_member(player_id, m_flLastEventCheck, fGameTime);   
    set_member(player_id, m_flLastFired, fGameTime );
}

RegisterCvars()
{
    bind_pcvar_string(
        create_cvar(
          .name = "fri_mp_access",
          .string = "z",
          .flags = FCVAR_SERVER,
          .description = fmt("%l", "FRI_CVAR_MP_ACCESS")
          ), g_Cvar[FRI_MP_ACCESS], charsmax(g_Cvar[FRI_MP_ACCESS])
    );
    bind_pcvar_num(
        create_cvar(
            .name = "fri_mp_rnd_limit",
            .string = "1",
            .flags = FCVAR_SERVER,
            .description = fmt("%l", "FRI_CVAR_MP_RND_LIMIT"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_RND_LIMIT]
    );
    bind_pcvar_num(
        create_cvar(
            .name = "fri_mp_mk_max",
            .string = "1",
            .flags = FCVAR_SERVER,
            .description = fmt("%l", "FRI_CVAR_MP_MK_MAX"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_MK_MAX]
    );   
    bind_pcvar_float(
        create_cvar(
            .name = "fri_mp_hp",
            .string = "80.0",
            .flags = FCVAR_SERVER,
            .description =  fmt("%l", "FRI_CVAR_MP_HP"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_HP]
    );   
    bind_pcvar_float(
        create_cvar(
            .name = "fri_mp_add_hp",
            .string = "50.0",
            .flags = FCVAR_SERVER,
            .description =  fmt("%l", "FRI_CVAR_MP_ADD_HP"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_ADD_HP]
    );
    bind_pcvar_string(
        create_cvar(
          .name = "fri_mp_animation",
          .string = "ref_shoot_shieldknife",
          .flags = FCVAR_SERVER,
          .description = fmt("%l", "FRI_CVAR_MP_ANIMATION")
          ), g_Cvar[FRI_MP_ANIMATION], charsmax(g_Cvar[FRI_MP_ANIMATION])
    );
    bind_pcvar_float(
        create_cvar(
            .name = "fri_mp_speed_anim",
            .string = "0.5",
            .flags = FCVAR_SERVER,
            .description =  fmt("%l", "FRI_CVAR_MP_SPEED_ANIM"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_SPEED_ANIM]
    );
    bind_pcvar_num(
        create_cvar(
            .name = "fri_mp_heal_spr",
            .string = "1",
            .flags = FCVAR_SERVER,
            .description = fmt("%l", "FRI_CVAR_MP_HEAL_SPR"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_HEAL_SPR]
    );   
    bind_pcvar_num(
        create_cvar(
            .name = "fri_mp_healer_snd",
            .string = "1",
            .flags = FCVAR_SERVER,
            .description = fmt("%l", "FRI_CVAR_MP_HEALER_SND"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_HEALER_SND]
    );   
    bind_pcvar_num(
        create_cvar(
            .name = "fri_mp_healed_snd",
            .string = "1",
            .flags = FCVAR_SERVER,
            .description = fmt("%l", "FRI_CVAR_MP_HEALED_SND"),
            .has_min = true,
            .min_val = 0.0
        ), g_Cvar[FRI_MP_HEALED_SND]
    );
}
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
конкретно, шприц появляется не всегда, бртайм идет, лечение проходит, а шприц не появляется, то есть модель v_ видно не всегда
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
конкретно, шприц появляется не всегда, бртайм идет, лечение проходит, а шприц не появляется, то есть модель v_ видно не всегда
19 Мар 2023
Спасибо BiZaJe, выход нашелся в замене set_entvar(id, var_weaponanim, 0);
на UTIL_PlayWeaponAnimation(id, 0);
Код:
stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
    set_entvar(Player, var_weaponanim, Sequence);

    message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player);
    write_byte(Sequence);
    write_byte(get_entvar(Player, var_body));
    message_end();
}
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
Вопрос,собственно в следующем. Как сделать проверку, на то я или другой человек.
Объясню по подробнее. Мне нужно сделать так, что я нажав на клавишу USE провел действие либо на себя, либо на союзника.
Пробовал использовать get_user_aiming, а именно
Код:
    new iPlayer, iBody, Float: iDistance;
    iDistance = get_user_aiming(id, iPlayer, iBody, g_Cvar[IMK_MP_DISTANCE] + 60);
Исходя из данного источника
distance - максимальная дистанция для проверки ( допустим поставили 100, а игрок в 150 юнитах, то функция не сработает)
пробовал варианты
Код:
if(iDistance == 0)
{
    действие со мной
}
else
    действие с союзником
,а так же
Код:
if(!iDistance)
{
    действие со мной
}
else
    действие с союзником
и
Код:
 if(iDistance >= 40))
{
    действие со мной
}
else
    действие с союзником
21 Мар 2023
если же сделать if(iDistance >= float(40)), то код работает, но мне надо подойти к игроку, на расстояние примерно в 100-150 юнитов.
 
Последнее редактирование:
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
maFFyoZZyk, если используешь энтити и используешь на нем setuse, то никак. Через синк проверяешь расстояние и выполняешь код
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
steelzzz, нет, я не использую setuse, я делаю проверку на дистанцию и если игрок свой и в досягаемости, то выполняю над ним действие
21 Мар 2023
steelzzz, в планах было, что-то типа " Если я смотрю на игрока и он союзник, то я выполняю действие по отношению к нему, а если же я ни на кого не смотрю или он далеко, тогда я выполняю действие по отношению к себе"
 
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
maFFyoZZyk, попробуй трейс и vector distance
 
Сообщения
833
Реакции
516
Помог
12 раз(а)
раз уж начал, то так и проверяй
PHP:
new iPlayer, iBody, Float: iDistance;

// тут ставишь макс дистанцию
    iDistance = get_user_aiming(id, iPlayer, iBody, g_Cvar[IMK_MP_DISTANCE] + 60);

   if (is_user_alive(iPlayer) && get_member(iPlayer, m_iTeam) == get_member(id, m_iTeam) {
// хил тиммейта
}
    else {
 // хил себя
}
конечно если будешь использовать семиклип , то проверка не сработает, т.к. там отключается трейс по игрокам
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
BalbuR, да он используется на 90 процентах серверов, да и только эта идея пришла в голову, если есть иные верные способы, то хотелось услышать. Желательно с примерами, для лучшего понимания
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Можно StatusText хукнуть, вызывается же когда на игрока наведен прицел.
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
d3m37r4, ну да, можно с помощью булевой и статуса сделать.. чёт я забыл об этом, попробую
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
lol, вообще перестало работать
22 Мар 2023
Код:
new bool: g_bStatus[MAX_PLAYERS+1] = false;

public plugin_init()
{
    register_event("StatusValue", "EventStatusValueShow", "be", "1=2", "2!0");
    register_event("StatusValue", "EventStatusValueHide", "be", "1=1", "2=0");
    RegisterHookChain(RG_CBasePlayer_UseEmpty, "CBasePlayer_UseEmpty", .post = true);
}

public EventStatusValueShow(id)
{
    if(!is_user_alive(id))
        return HC_CONTINUE;
    
    g_bStatus[id] = true;
    client_print(id, print_chat, "%s", g_bStatus ? "видит" : "не_видит");
    
    return HC_CONTINUE;
}

public EventStatusValueHide(id)
{
    if(!is_user_alive(id))
        return HC_CONTINUE;

    g_bStatus[id] = false;
    client_print(id, print_chat, "%s", g_bStatus ? "видит" : "не_видит");
    
    return HC_CONTINUE;
}

public CBasePlayer_UseEmpty(id)
{
    if(!is_user_alive(id))
        return HC_CONTINUE;
    
    new iPlayer, iBody;
    get_user_aiming(id, iPlayer, iBody, g_Cvar[IMK_MP_DISTANCE] + 60);

    if(!is_user_connected(iPlayer))
        return HC_CONTINUE;
    
    if(!(get_user_flags(id) & read_flags(g_Cvar[IMK_MP_ACCESS])) || g_iMedKit[id] == 0)
        return HC_CONTINUE;

    if(~get_entvar(id, var_flags) & FL_ONGROUND)
        return HC_CONTINUE;

    if(g_iHealter[id] >= g_Cvar[IMK_MP_RND_LIMIT])       
    {
        client_print_color(id, -2, "%L %L", LANG_PLAYER, "IMK_PREFIX", LANG_PLAYER, "IMK_EXHAUSTED");
        return HC_CONTINUE;
    }

    if(g_bStatus[id])
    {
        new iAimOrigin[3], iPlayerOrigin[3];
        get_user_origin(iPlayer, iAimOrigin);
        get_user_origin(id, iPlayerOrigin);

        if(get_distance(iPlayerOrigin, iAimOrigin) > g_Cvar[IMK_MP_DISTANCE])
        {
            client_print_color(id, -2, "Вы слишком далеко от раненого");
            return HC_CONTINUE;
        }
            
        if(IsTeam(id) != IsTeam(iPlayer))
        {
            client_print_color(id, -2, "Придурок, товарищей лечить надо");
            return HC_CONTINUE;
        }

        if((Float:get_entvar(iPlayer, var_health) * 100.0 / Float:get_entvar(iPlayer, var_max_health)) >= g_Cvar[IMK_MP_HP])
        {
            client_print_color(id, -2, "Этот чувак еще полон сил");
            return HC_CONTINUE;
        }
    }
    else
    {       
        if((Float:get_entvar(id, var_health) * 100.0 / Float:get_entvar(id, var_max_health)) >= g_Cvar[IMK_MP_HP])
        {
            client_print_color(id, -2, "%L %L", LANG_PLAYER, "IMK_PREFIX", LANG_PLAYER, "IMK_FULL");
            return HC_CONTINUE;
        }
        
        if(rg_is_bomb_planted() && (get_member(id, m_iTeam) == TEAM_CT))
        {   
            new fpOrigin[MAX_COORDINATES];
            get_entvar(id, var_origin, fpOrigin);
                
            if(get_distance(fpOrigin, g_fOrigin) <= 30)
                return HC_CONTINUE;   
        }
        set_entvar(id, var_weaponmodel, PLAYER_MDL);
        UTIL_PlayerAnimation(id, g_Cvar[IMK_MP_ANIMATION], g_Cvar[IMK_MP_SPEED_ANIM]);
    }

    new sArgValue[INT_VALUES_NAMES];                       
    sArgValue[HID] = id;
    sArgValue[PLID] = iPlayer;
    sArgValue[HWPN] = get_member(id, m_pActiveItem);
    
    if(is_nullent(sArgValue[HWPN]))
        return HC_CONTINUE;

    client_print_color(id, -2, "%L %L", LANG_PLAYER, "IMK_PREFIX", LANG_PLAYER, "IMK_USE");
    set_entvar(id, var_viewmodel, VIEW_MDL);
    UTIL_PlayWeaponAnimation(id, 0);       
    set_msg_status_icon(id, STATUS_FLASH, SPRITE_MSG_NAME);
    set_task(float(2), "Healing", id, sArgValue, sizeof(sArgValue));
    rg_send_bartime(id, 2, true);

    return HC_CONTINUE;
}
 

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

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