Русское сообщество по скриптингу

Блокировка надписи "Это оружие нельзя выкинуть"  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Блокировка надписи "Это оружие нельзя выкинуть"

Сообщение newtramp1 » 03 июн 2022, 14:33

Приветствую. В общем есть плагин в котором выводится client_print с отсчетом до готовности способности. Нужно сделать, чтобы во время этого самого отсчета при нажатии на кнопку Drop - отсчет не перекрывался надписью "This weapon cannot be dropped", грубо говоря хукнуть это сообщение во время отсчета


302-311 строка отсчета

Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <zombieplague>
#include <fun>

#define IsValidPrivateData(%0)          ( pev_valid( %0 ) == 2 )
 
#define linux_diff_weapon             4
#define m_pPlayer                41
#define GRENADE                "models/zombie_plague/banchee/v_bomb_banchee.mdl"

new const zclass_name[] = "Witch"
new const zclass_info[] = "Witch"
new const zclass_model[] = "undead_banchee"
new const zclass_clawmodel[] = "banchee/v_banchee.mdl"
const zclass_health = 5600
const zclass_speed 
= 240
const Float
:zclass_gravity = 0.9
const Float
:zclass_knockback = 1.0

new const SOUND_FIRE
[] = "sound_effect_zombie/banchee/banchee_skill.wav"
new const SOUND_BAT_HIT[] = "sound_effect_zombie/banchee/banchee_skillsucceed.wav"
new const SOUND_BAT_MISS[] = "sound_effect_zombie/banchee/banchee_skillfail.wav"
new const MODEL_BAT[] = "models/zombie_plague/banchee/bat_banchee.mdl"
new const BAT_CLASSNAME[] = "bat_banchee"
new spr_skull

const Float
:banchee_skull_bat_speed = 800.0
const Float
:banchee_skull_bat_flytime = 3.0
const Float
:banchee_skull_bat_catch_time = 4.0
const Float
:banchee_skull_bat_catch_speed = 300.0
const Float
:bat_timewait = 30.0

new g_CurWeapon
[33]

new g_stop[33]
new g_bat_time[33]
new g_bat_stat[33]
new g_bat_enemy[33]
new g_no_fly[33] //отключаем возможность летать на парашюте
new Float:g_temp_speed[33]
new g_cooldown[33]
new idclass_banchee
new g_maxplayers
new g_roundend
new g_msgSayText

enum 
(+= 100)
{
    TASK_BOT_USE_SKILL = 2367,
    TASK_REMOVE_STAT,
    TASK_COOLDOWN
}


#define ID_BOT_USE_SKILL (taskid - TASK_BOT_USE_SKILL)
#define ID_TASK_REMOVE_STAT (taskid - TASK_REMOVE_STAT)

public plugin_precache()
{
    precache_sound(SOUND_FIRE)
    precache_sound(SOUND_BAT_HIT)
    precache_sound(SOUND_BAT_MISS)
    
    precache_model
(MODEL_BAT)
    
    engfunc
(EngFunc_PrecacheModel, GRENADE);
    
    spr_skull 
= precache_model("sprites/banchee/shoot_bat_banchee.spr")
    
    idclass_banchee 
= zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
}

public plugin_init()
{
        
    register_event
("HLTV", "EventHLTV", "a", "1=0", "2=0")
    register_event("DeathMsg", "EventDeath", "a")
    register_logevent("logevent_round_end", 2, "1=Round_End")
    
    register_clcmd
("drop", "cmd_bat")
    
    register_forward
(FM_PlayerPreThink,"fw_PlayerPreThink")
    
    register_event
("CurWeapon", "Event_CurrentWeapon", "be", "1=1")

    RegisterHam(Ham_Touch,"info_target","EntityTouchPost",1)
    RegisterHam(Ham_Think,"info_target","EntityThink")
    
    new const GRENADES_ENTITY
[][] = { "weapon_hegrenade", "weapon_flashbang", "weapon_smokegrenade" };
    for(new i = 0; i < sizeof GRENADES_ENTITY; i++)
    RegisterHam(Ham_Item_Deploy, GRENADES_ENTITY[i], "Grenade_DeployPost", true);
    
    g_maxplayers 
= get_maxplayers()
    g_msgSayText = get_user_msgid("SayText")
}

public Grenade_DeployPost(iItem)
{
    new iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);

    if(!zp_get_user_zombie(iPlayer) || zp_get_user_nemesis(iPlayer))
        return;

    if(zp_get_user_zombie_class(iPlayer) == idclass_banchee)
        set_pev(iPlayer, pev_viewmodel2, GRENADE);
}


public plugin_natives()
{
    register_native("bat_buff", "native_bat_buff", 1);
}

public native_bat_buff(id)
{
    return g_no_fly[id];
}

public client_putinserver(id)
{
    reset_value_player(id)
}

public client_disconnected(id)
{
    reset_value_player(id)
}

public EventHLTV()
{
    g_roundend = 0
    
    for
(new id = 1; id <= g_maxplayers; id++)
    {
        if (!is_user_connected(id)) continue;
        
        remove_task
(id+TASK_COOLDOWN)        
        reset_value_player
(id)
    }
}

public logevent_round_end()
{
    g_roundend = 1
    
    for
(new id = 1; id <= g_maxplayers; id++)
    {
        if (!is_user_connected(id)) continue;
        remove_task(id+TASK_COOLDOWN)
        reset_value_player(id)
    }
}


public EventDeath()
{
    new id = read_data(2)
    
    reset_value_player
(id)
}
public Event_CurrentWeapon(id) g_CurWeapon[id] = read_data(2)

public fw_Weapon_Deploy_Post(weapon_ent)
{
    if( !IsValidPrivateData( weapon_ent ) )
    {
         return HAM_IGNORED;
    }
    static id; id = get_pdata_cbase(weapon_ent, 41, 4)

    static weaponid ; weaponid = cs_get_weapon_id(weapon_ent)

    g_CurWeapon[id] = weaponid
    
    return HAM_IGNORED
;
}


public zp_user_infected_post(id)
{
    remove_task(id+TASK_COOLDOWN)
    reset_value_player(id)
    if(zp_get_user_nemesis(id))    return;
    
    if
(zp_get_user_zombie_class(id) == idclass_banchee && !zp_get_user_nemesis(id))
    {
        g_cooldown[id] = 0    
    
}
}

public zp_user_humanized_post(id)
{
    reset_value_player(id)
    remove_task(id+TASK_COOLDOWN)
}

public cmd_bat(id)
{
    if(g_roundend) return PLUGIN_CONTINUE
    
    if
(!is_user_alive(id) || !zp_get_user_zombie(id) || zp_get_user_nemesis(id)) return PLUGIN_CONTINUE
    
    if
(zp_get_user_zombie_class(id) == idclass_banchee && !g_bat_time[id] && !g_cooldown[id])
    {
        g_bat_time[id] = 1
        
        g_cooldown
[id] = 30
        set_task
(1.0, "RemoveCooldown", id+TASK_COOLDOWN, _, _, "a",g_cooldown[id])    
        
        set_task
(bat_timewait,"clear_stat",id+TASK_REMOVE_STAT)
        
        new ent 
= engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
        
        if
(!pev_valid(ent)) return PLUGIN_HANDLED
        
        new Float
:vecAngle[3],Float:vecOrigin[3],Float:vecVelocity[3],Float:vecForward[3]
        fm_get_user_startpos(id,5.0,2.0,-1.0,vecOrigin)
        pev(id,pev_angles,vecAngle)
        
        engfunc
(EngFunc_MakeVectors,vecAngle)
        global_get(glb_v_forward,vecForward)
        
        velocity_by_aim
(id,floatround(banchee_skull_bat_speed),vecVelocity)
        
        set_pev
(ent,pev_origin,vecOrigin)
        set_pev(ent,pev_angles,vecAngle)
        set_pev(ent,pev_classname,BAT_CLASSNAME)
        set_pev(ent,pev_movetype,MOVETYPE_FLY)
        set_pev(ent,pev_solid,SOLID_BBOX)
        engfunc(EngFunc_SetSize,ent,{-20.0,-15.0,-8.0},{20.0,15.0,8.0})
        
        engfunc
(EngFunc_SetModel,ent,MODEL_BAT)
        set_pev(ent,pev_animtime,get_gametime())
        set_pev(ent,pev_framerate,1.0)
        set_pev(ent,pev_owner,id)
        set_pev(ent,pev_velocity,vecVelocity)
        set_pev(ent,pev_nextthink,get_gametime()+banchee_skull_bat_flytime)
        emit_sound(ent, CHAN_WEAPON, SOUND_FIRE, 1.0, ATTN_NORM, 0, PITCH_NORM)
        
        g_stop
[id] = ent
        
        PlayWeaponAnimation
(id, 2)

        pev(id, pev_maxspeed, g_temp_speed[id])
        
        return PLUGIN_HANDLED
    
}
    
    return PLUGIN_CONTINUE
}

stock Player_SetAnimation(const iPlayer, const szAnim[])
{
   #define ACT_RANGE_ATTACK1   28
   
   
// Linux extra offsets
   #define extra_offset_player   5
   #define extra_offset_animating   4
   
   
// CBaseAnimating
   #define m_flFrameRate      36
   #define m_flGroundSpeed      37
   #define m_flLastEventCheck   38
   #define m_fSequenceFinished   39
   #define m_fSequenceLoops   40
   
   
// CBaseMonster
   #define m_Activity      73
   #define m_IdealActivity      74
   
   
// CBasePlayer
   #define m_flLastAttackTime   220
   
   new iAnimDesired
, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
      
   if 
((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
   {
      iAnimDesired = 0;
   }
   
   new Float
: flGametime = get_gametime();

   set_pev(iPlayer, pev_frame, 0.0);
   set_pev(iPlayer, pev_framerate, 1.0);
   set_pev(iPlayer, pev_animtime, flGametime  );
   set_pev(iPlayer, pev_sequence, iAnimDesired);
   
   set_pdata_int
(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating);
   set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating);
   
   set_pdata_float
(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating);
   set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating);
   set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating);
   
   set_pdata_int
(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player);
   set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player);   
   set_pdata_float
(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player);
}

public RemoveCooldown(taskid)
{
    new id = taskid - TASK_COOLDOWN
    
    if
(is_user_alive(id))
    {
        g_cooldown[id]--
        client_print(id, print_center, "[Способность через: %d сек]",g_cooldown[id])
    }
    else remove_task(id+TASK_COOLDOWN)
}

public fw_PlayerPreThink(id)
{
    if(!is_user_alive(id)) return FMRES_IGNORED
    
    if
(g_bat_stat[id])
    {
        new owner = g_bat_enemy[id], Float:ownerorigin[3]
        pev(owner,pev_origin,ownerorigin)
        static Float:vec[3]
        aim_at_origin(id,ownerorigin,vec)
        engfunc(EngFunc_MakeVectors, vec)
        global_get(glb_v_forward, vec)
        vec[0] *= banchee_skull_bat_catch_speed
        vec
[1] *= banchee_skull_bat_catch_speed
        vec
[2] = 0.0
        set_pev
(id,pev_velocity,vec)
    }
    
    return FMRES_IGNORED
}

public EntityThink(ent)
{
    if(!pev_valid(ent)) return HAM_IGNORED
    
    new classname
[32]
    pev(ent,pev_classname,classname,31)
    
    if
(equal(classname,BAT_CLASSNAME))
    {
        static Float:origin[3];
        pev(ent,pev_origin,origin);
        
        message_begin
(MSG_BROADCAST,SVC_TEMPENTITY); 
        write_byte
(TE_EXPLOSION); // TE_EXPLOSION
        write_coord(floatround(origin[0])); // origin x
        write_coord(floatround(origin[1])); // origin y
        write_coord(floatround(origin[2])); // origin z
        write_short(spr_skull); // sprites
        write_byte(40); // scale in 0.1's
        write_byte(30); // framerate
        write_byte(14); // flags 
        message_end(); // message end
        
        emit_sound
(ent, CHAN_WEAPON, SOUND_BAT_MISS, 1.0, ATTN_NORM, 0, PITCH_NORM)
        
        new owner 
= pev(ent, pev_owner)
        g_stop[owner] = 0
        set_pev
(owner,pev_maxspeed,g_temp_speed[owner])
        
        engfunc
(EngFunc_RemoveEntity,ent)
    }
    
    return HAM_IGNORED
}

public EntityTouchPost(ent,ptd)
{
    if(!pev_valid(ent)) return HAM_IGNORED
    
    new classname
[32]
    pev(ent,pev_classname,classname,31)
    
    if
(equal(classname,BAT_CLASSNAME))
    {
    
        if
(!pev_valid(ptd))
        {
            static Float:origin[3];
            pev(ent,pev_origin,origin);
            
            message_begin
(MSG_BROADCAST,SVC_TEMPENTITY); 
            write_byte
(TE_EXPLOSION); // TE_EXPLOSION
            write_coord(floatround(origin[0])); // origin x
            write_coord(floatround(origin[1])); // origin y
            write_coord(floatround(origin[2])); // origin z
            write_short(spr_skull); // sprites
            write_byte(40); // scale in 0.1's
            write_byte(30); // framerate
            write_byte(14); // flags 
            message_end(); // message end
            
            emit_sound
(ent, CHAN_WEAPON, SOUND_BAT_MISS, 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            new owner 
= pev(ent, pev_owner)
            g_stop[owner] = 0
            set_pev
(owner,pev_maxspeed,g_temp_speed[owner])
            
            engfunc
(EngFunc_RemoveEntity,ent)
            
            return HAM_IGNORED
        
}
        
        new owner 
= pev(ent,pev_owner)
        
        if
(< ptd && ptd <= g_maxplayers && is_user_alive(ptd) && ptd != owner)
        {
            g_bat_enemy[ptd] = owner
            
            if
(!zp_get_user_zombie(ptd)) set_user_rendering(ptd, kRenderFxGlowShell, 255, 255, 255, kRenderNormal, 30)
            
            set_pev
(ent,pev_nextthink,get_gametime()+banchee_skull_bat_catch_time)
            set_task(banchee_skull_bat_catch_time,"clear_stat2",ptd+TASK_REMOVE_STAT)
            set_pev(ent,pev_movetype,MOVETYPE_FOLLOW)
            set_pev(ent,pev_aiment,ptd)
            
            emit_sound
(owner, CHAN_VOICE, SOUND_BAT_HIT, 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            g_bat_stat
[ptd] = 1
        
}
    }
    
    return HAM_IGNORED
}

public clear_stat(taskid)
{
    new id = ID_TASK_REMOVE_STAT
    
    g_bat_stat
[id] = 0
    g_bat_time
[id] = 0
    
    zp_colored_print
(id, "^x04[ZP]^x01 Ваша способность ^x04 'Летучие мыши'^x01 - готова!")
}

public clear_stat2(idx)
{
    new id = idx-TASK_REMOVE_STAT
    
    g_bat_enemy
[id] = 0
    g_bat_stat
[id] = 0
    g_no_fly
[id] = true;
    set_task(3.0, "can_fly", id)
}
 
public can_fly
(id)
{
    if(is_user_alive(id))
    {
        g_no_fly[id] = false;
        set_user_rendering(id)
    }
}


public bot_use_skill(taskid)
{
    new id = ID_BOT_USE_SKILL
    
    if 
(!is_user_alive(id)) return;
    
    cmd_bat
(id)
    
    set_task
(random_float(5.0,15.0), "bot_use_skill", id+TASK_BOT_USE_SKILL)
}

fm_get_user_startpos(id,Float:forw,Float:right,Float:up,Float:vStart[])
{
    new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    
    pev
(id, pev_origin, vOrigin)
    pev(id, pev_v_angle, vAngle)
    
    engfunc
(EngFunc_MakeVectors, vAngle)
    
    global_get
(glb_v_forward, vForward)
    global_get(glb_v_right, vRight)
    global_get(glb_v_up, vUp)
    
    vStart
[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    vStart
[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    vStart
[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}

aim_at_origin(id, Float:target[3], Float:angles[3])
{
    static Float:vec[3]
    pev(id,pev_origin,vec)
    vec[0] = target[0] - vec[0]
    vec[1] = target[1] - vec[1]
    vec[2] = target[2] - vec[2]
    engfunc(EngFunc_VecToAngles,vec,angles)
    angles[0] *= -1.0
    angles
[2] = 0.0
}

PlayWeaponAnimation(id, animation)
{
    set_pev(id, pev_weaponanim, animation)
    message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, id)
    write_byte(animation)
    write_byte(pev(id, pev_body))
    message_end()
}

reset_value_player(id)
{
    g_stop[id] = 0
    g_bat_time
[id] = 0
    g_bat_stat
[id] = 0
    g_bat_enemy
[id] = 0
    g_cooldown
[id] = 0
    g_no_fly
[id] = false;

    remove_task(id+TASK_BOT_USE_SKILL)
    remove_task(id+TASK_REMOVE_STAT)
}

zp_colored_print(target, const message[], any:...)
{
    static buffer[512], i, argscount
    argscount 
= numargs()
    
    if 
(!target)
    {
        static player
        for 
(player = 1; player <= g_maxplayers; player++)
        {
            if (!is_user_connected(player))
                continue;
            
            static changed
[5], changedcount
            changedcount 
= 0
            
            for 
(= 2; i < argscount; i++)
            {
                if (getarg(i) == LANG_PLAYER)
                {
                    setarg(i, 0, player)
                    changed[changedcount] = i
                    changedcount
++
                }
            }
            
            vformat
(buffer, charsmax(buffer), message, 3)
            
            message_begin
(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
            write_byte(player)
            write_string(buffer)
            message_end()
            
            for 
(= 0; i < changedcount; i++)
                setarg(changed[i], 0, LANG_PLAYER)
        }
    }
    else
    
{
        vformat(buffer, charsmax(buffer), message, 3)
        
        message_begin
(MSG_ONE, g_msgSayText, _, target)
        write_byte(target)
        write_string(buffer)
        message_end()
    }
}

stock Anim(ent, sequence)
{
        set_pev(ent, pev_sequence, sequence)
        set_pev(ent, pev_animtime, halflife_time())
        set_pev(ent, pev_framerate, 1.0)       
}
 
Аватара пользователя
newtramp1
 
Сообщения: 15
Зарегистрирован: 30 янв 2017, 15:24
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Блокировка надписи "Это оружие нельзя выкинуть"

Сообщение RockTheStreet » 03 июн 2022, 15:25

Код: Выделить всё
#include <amxmodx>
#include <reapi>

new MsgIdTextMsg;

public plugin_init()
{
    
    MsgIdTextMsg 
= get_user_msgid("TextMsg");
    RegisterHookChain(RG_CBasePlayer_DropPlayerItem, "RG_CBasePlayer_DropPlayerItem_Pre", false);
}

public RG_CBasePlayer_DropPlayerItem_Pre() {
    set_msg_block(MsgIdTextMsg, BLOCK_ONCE);
}
Касательно телепатии: если Вы передаете Ваши проблемы телепатическим путем - ответы будут передаваться тоже телепатически.
Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком.
Аватара пользователя
RockTheStreet
 
Сообщения: 97
Зарегистрирован: 12 авг 2021, 23:13
Забанен
Благодарил (а): 7 раз.
Поблагодарили: 16 раз.
Опыт программирования: Больше трех лет
Языки программирования: JS, PHP

Re: Блокировка надписи "Это оружие нельзя выкинуть"

Сообщение newtramp1 » 03 июн 2022, 15:45

Ну это я так понимаю полноценный плагин, который полностью убирает надпись с использованием reapi. У меня к сожалению сборка древняя и на REHLDS тупо не запустится. А если говорить о коде в самом плагине? Как пример кинул код другого плагина, где эта надпись не появляется. Но что-то я не нашел код, который отвечает за это.


public task_ShowCooldown(taskid)
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <fun>
#include <fakemeta_util>
#include <zombieplague>

new Float:g_fLastUse[33]

#define TASK_COOLDOWN 4578
#define TASK_END 457845

#define ID_COOLDOWN (taskid - TASK_COOLDOWN)
#define ID_END (taskid - TASK_END)

#define linux_diff_weapon             4
#define m_pPlayer                41
#define GRENADE                "models/zombie_plague/hunter/v_bomb_hunter.mdl"

new g_zcHunter, g_msgSayText, g_msgScreenFade, g_maxplayers

new const zclass_name
[] = "Hunter"
new const zclass_info[] = "\y[ Разгон \r[G]\y ]"
new const zclass_model[] = "undead_hunter" 
new const zclass_clawmodel
[] = "hunter/v_hunter.mdl" 
const zclass_health 
= 4500 
const zclass_speed 
= 250
const Float
:zclass_gravity = 0.67 
const Float
:zclass_knockback =  0.43 

new const sound_hunter_sprint
[] = "sound_effect_zombie/hunter/hunter_skill.wav"  
new const sound_hunter_endspr
[] = "sound_effect_zombie/hunter/hunter_endskill.wav" 

#define FAST_SPEED 700

#define COOLDOWN_RUN 14.0
#define TIME_RUN 3.0

new bool:g_SkillActive[33]

public plugin_precache() {
    g_zcHunter = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)    
    
    precache_sound
(sound_hunter_sprint)
    precache_sound(sound_hunter_endspr)    
    
    engfunc
(EngFunc_PrecacheModel, GRENADE);
}

public plugin_init() {
    register_clcmd("drop", "use_ability_one")

    register_forward(FM_PlayerPreThink, "client_prethink")
    
    RegisterHam
(Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1)
    
    g_msgScreenFade 
= get_user_msgid("ScreenFade")
    g_msgSayText = get_user_msgid("SayText")
    g_maxplayers = get_maxplayers()
    
    new const GRENADES_ENTITY
[][] = { "weapon_hegrenade", "weapon_flashbang", "weapon_smokegrenade" };
    for(new i = 0; i < sizeof GRENADES_ENTITY; i++)
    RegisterHam(Ham_Item_Deploy, GRENADES_ENTITY[i], "Grenade_DeployPost", true);
}

public Grenade_DeployPost(iItem)
{
    new iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);

    if(!zp_get_user_zombie(iPlayer) || zp_get_user_nemesis(iPlayer))
        return;

    if(zp_get_user_zombie_class(iPlayer) == g_zcHunter)
        set_pev(iPlayer, pev_viewmodel2, GRENADE);
}

public use_ability_one(id)
{
    if (is_user_alive(id) && zp_get_user_zombie_class(id) == g_zcHunter && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))
    {        
        if
(g_fLastUse[id]+COOLDOWN_RUN > get_gametime())
            return PLUGIN_HANDLED;
            
        g_SkillActive
[id] = true
        
        fm_set_rendering
(id, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 0)
        
        emit_sound
(id, CHAN_STREAM, sound_hunter_sprint, 1.0, ATTN_NORM, 0, PITCH_NORM)
            
        message_begin
(MSG_ONE,g_msgScreenFade,_,id)
        write_short(8192)
        write_short(8192)
        write_short(0x0000)
        write_byte(255)
        write_byte(0)
        write_byte(0)
        write_byte(125)
        message_end()
            
        g_fLastUse
[id]=get_gametime()
            
        set_task
(1.0, "task_ShowCooldown", id+TASK_COOLDOWN, _, _, "b")
        set_task(TIME_RUN, "task_RemoveSpeed", id+TASK_END)
        
        return PLUGIN_HANDLED
;
    }
    return PLUGIN_CONTINUE;
}

public fw_TakeDamage_Post(victim)
{
    if(is_user_alive(victim)&&zp_get_user_zombie(victim)&&g_SkillActive[victim])
        set_pdata_float(victim, 108, 1.0, 5)
}

public client_prethink(id)
{
    if(is_user_alive(id) && zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_zcHunter) && !zp_get_user_nemesis(id) && g_SkillActive[id])
        set_pev(id, pev_maxspeed, float(FAST_SPEED))
}

public task_RemoveSpeed(taskid)
{
    if (is_user_alive(ID_END) && zp_get_user_zombie_class(ID_END) == g_zcHunter && zp_get_user_zombie(ID_END) && !zp_get_user_nemesis(ID_END))
    {
        g_SkillActive[ID_END] = false
        
        set_pev
(ID_END, pev_maxspeed, float(zclass_speed)) 
        
        fm_set_user_rendering
(ID_END)
        
        emit_sound
(ID_END, CHAN_VOICE, sound_hunter_endspr, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
}

public task_ShowCooldown(taskid)
{
    if(!is_user_connected(ID_COOLDOWN) || !is_user_alive(ID_COOLDOWN) || !zp_get_user_zombie(ID_COOLDOWN) || zp_get_user_nemesis(ID_COOLDOWN))
    {
        remove_task(taskid)
        return
    
}
    
    if
(get_gametime()-g_fLastUse[ID_COOLDOWN]>=COOLDOWN_RUN)
    {
        remove_task(taskid)
        return
    
}
    
    client_print
(ID_COOLDOWN, print_center, "[Способность через: %d сек]", floatround(get_gametime()-COOLDOWN_RUN-g_fLastUse[ID_COOLDOWN])*-1)
}

public zp_user_infected_post(id, infector)
{
    if ((zp_get_user_zombie_class(id) == g_zcHunter) && !zp_get_user_nemesis(id))
    {
        g_SkillActive[id] = false
        
        g_fLastUse
[id] = 0.0
        
        zp_colored_print
(id, "^x04[^x01Охотник^x04]^x01 Ваша способность: ^x04[^x01Ускорение^x04]^x01 | Активация: ^x04[^x01G^x04]^x01 | Кулдаун: ^x04[^x01%d^x04]^x01", floatround(COOLDOWN_RUN))
    }
}

zp_colored_print(target, const message[], any:...)
{
    static buffer[512], i, argscount
    argscount 
= numargs()
    vformat(buffer, charsmax(buffer), message, 3)
    
    
// Send to everyone
    if (!target)
    {
        static player
        for 
(player = 1; player <= g_maxplayers; player++)
        {
            // Not connected
            if (!is_user_connected(player))
                continue;
            
            
// Remember changed arguments
            static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
            changedcount = 0
            
            
// Replace LANG_PLAYER with player id
            for (= 2; i < argscount; i++)
            {
                if (getarg(i) == LANG_PLAYER)
                {
                    setarg(i, 0, player)
                    changed[changedcount] = i
                    changedcount
++
                }
            }
            
            
// Send it
            message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
            write_byte(player)
            write_string(buffer)
            message_end()
            
            
// Replace back player id's with LANG_PLAYER
            for (= 0; i < changedcount; i++)
                setarg(changed[i], 0, LANG_PLAYER)
        }
    }
    // Send to specific target
    else
    
{            
        
// Send it
        message_begin(MSG_ONE, g_msgSayText, _, target)
        write_byte(target)
        write_string(buffer)
        message_end()
    }
}
Аватара пользователя
newtramp1
 
Сообщения: 15
Зарегистрирован: 30 янв 2017, 15:24
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Блокировка надписи "Это оружие нельзя выкинуть"  [Решено]

Сообщение БиЗоН » 03 июн 2022, 21:40

newtramp1, замени функцию
Код: Выделить всё
RegisterHookChain(RG_CBasePlayer_DropPlayerItem"RG_CBasePlayer_DropPlayerItem_Pre"false); 

на
Код: Выделить всё
register_clcmd("drop""RG_CBasePlayer_DropPlayerItem_Pre"); 

в коде товарища RockTheStreet

И убери подключение инклуда reapi.
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет

Re: Блокировка надписи "Это оружие нельзя выкинуть"

Сообщение RockTheStreet » 04 июн 2022, 10:29

newtramp1 писал(а):Ну это я так понимаю полноценный плагин, который полностью убирает надпись с использованием reapi. У меня к сожалению сборка древняя и на REHLDS тупо не запустится. А если говорить о коде в самом плагине? Как пример кинул код другого плагина, где эта надпись не появляется. Но что-то я не нашел код, который отвечает за это.


public task_ShowCooldown(taskid)
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <fun>
#include <fakemeta_util>
#include <zombieplague>

new Float:g_fLastUse[33]

#define TASK_COOLDOWN 4578
#define TASK_END 457845

#define ID_COOLDOWN (taskid - TASK_COOLDOWN)
#define ID_END (taskid - TASK_END)

#define linux_diff_weapon             4
#define m_pPlayer                41
#define GRENADE                "models/zombie_plague/hunter/v_bomb_hunter.mdl"

new g_zcHunter, g_msgSayText, g_msgScreenFade, g_maxplayers

new const zclass_name
[] = "Hunter"
new const zclass_info[] = "\y[ Разгон \r[G]\y ]"
new const zclass_model[] = "undead_hunter" 
new const zclass_clawmodel
[] = "hunter/v_hunter.mdl" 
const zclass_health 
= 4500 
const zclass_speed 
= 250
const Float
:zclass_gravity = 0.67 
const Float
:zclass_knockback =  0.43 

new const sound_hunter_sprint
[] = "sound_effect_zombie/hunter/hunter_skill.wav"  
new const sound_hunter_endspr
[] = "sound_effect_zombie/hunter/hunter_endskill.wav" 

#define FAST_SPEED 700

#define COOLDOWN_RUN 14.0
#define TIME_RUN 3.0

new bool:g_SkillActive[33]

public plugin_precache() {
    g_zcHunter = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)    
    
    precache_sound
(sound_hunter_sprint)
    precache_sound(sound_hunter_endspr)    
    
    engfunc
(EngFunc_PrecacheModel, GRENADE);
}

public plugin_init() {
    register_clcmd("drop", "use_ability_one")

    register_forward(FM_PlayerPreThink, "client_prethink")
    
    RegisterHam
(Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1)
    
    g_msgScreenFade 
= get_user_msgid("ScreenFade")
    g_msgSayText = get_user_msgid("SayText")
    g_maxplayers = get_maxplayers()
    
    new const GRENADES_ENTITY
[][] = { "weapon_hegrenade", "weapon_flashbang", "weapon_smokegrenade" };
    for(new i = 0; i < sizeof GRENADES_ENTITY; i++)
    RegisterHam(Ham_Item_Deploy, GRENADES_ENTITY[i], "Grenade_DeployPost", true);
}

public Grenade_DeployPost(iItem)
{
    new iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);

    if(!zp_get_user_zombie(iPlayer) || zp_get_user_nemesis(iPlayer))
        return;

    if(zp_get_user_zombie_class(iPlayer) == g_zcHunter)
        set_pev(iPlayer, pev_viewmodel2, GRENADE);
}

public use_ability_one(id)
{
    if (is_user_alive(id) && zp_get_user_zombie_class(id) == g_zcHunter && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))
    {        
        if
(g_fLastUse[id]+COOLDOWN_RUN > get_gametime())
            return PLUGIN_HANDLED;
            
        g_SkillActive
[id] = true
        
        fm_set_rendering
(id, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 0)
        
        emit_sound
(id, CHAN_STREAM, sound_hunter_sprint, 1.0, ATTN_NORM, 0, PITCH_NORM)
            
        message_begin
(MSG_ONE,g_msgScreenFade,_,id)
        write_short(8192)
        write_short(8192)
        write_short(0x0000)
        write_byte(255)
        write_byte(0)
        write_byte(0)
        write_byte(125)
        message_end()
            
        g_fLastUse
[id]=get_gametime()
            
        set_task
(1.0, "task_ShowCooldown", id+TASK_COOLDOWN, _, _, "b")
        set_task(TIME_RUN, "task_RemoveSpeed", id+TASK_END)
        
        return PLUGIN_HANDLED
;
    }
    return PLUGIN_CONTINUE;
}

public fw_TakeDamage_Post(victim)
{
    if(is_user_alive(victim)&&zp_get_user_zombie(victim)&&g_SkillActive[victim])
        set_pdata_float(victim, 108, 1.0, 5)
}

public client_prethink(id)
{
    if(is_user_alive(id) && zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_zcHunter) && !zp_get_user_nemesis(id) && g_SkillActive[id])
        set_pev(id, pev_maxspeed, float(FAST_SPEED))
}

public task_RemoveSpeed(taskid)
{
    if (is_user_alive(ID_END) && zp_get_user_zombie_class(ID_END) == g_zcHunter && zp_get_user_zombie(ID_END) && !zp_get_user_nemesis(ID_END))
    {
        g_SkillActive[ID_END] = false
        
        set_pev
(ID_END, pev_maxspeed, float(zclass_speed)) 
        
        fm_set_user_rendering
(ID_END)
        
        emit_sound
(ID_END, CHAN_VOICE, sound_hunter_endspr, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
}

public task_ShowCooldown(taskid)
{
    if(!is_user_connected(ID_COOLDOWN) || !is_user_alive(ID_COOLDOWN) || !zp_get_user_zombie(ID_COOLDOWN) || zp_get_user_nemesis(ID_COOLDOWN))
    {
        remove_task(taskid)
        return
    
}
    
    if
(get_gametime()-g_fLastUse[ID_COOLDOWN]>=COOLDOWN_RUN)
    {
        remove_task(taskid)
        return
    
}
    
    client_print
(ID_COOLDOWN, print_center, "[Способность через: %d сек]", floatround(get_gametime()-COOLDOWN_RUN-g_fLastUse[ID_COOLDOWN])*-1)
}

public zp_user_infected_post(id, infector)
{
    if ((zp_get_user_zombie_class(id) == g_zcHunter) && !zp_get_user_nemesis(id))
    {
        g_SkillActive[id] = false
        
        g_fLastUse
[id] = 0.0
        
        zp_colored_print
(id, "^x04[^x01Охотник^x04]^x01 Ваша способность: ^x04[^x01Ускорение^x04]^x01 | Активация: ^x04[^x01G^x04]^x01 | Кулдаун: ^x04[^x01%d^x04]^x01", floatround(COOLDOWN_RUN))
    }
}

zp_colored_print(target, const message[], any:...)
{
    static buffer[512], i, argscount
    argscount 
= numargs()
    vformat(buffer, charsmax(buffer), message, 3)
    
    
// Send to everyone
    if (!target)
    {
        static player
        for 
(player = 1; player <= g_maxplayers; player++)
        {
            // Not connected
            if (!is_user_connected(player))
                continue;
            
            
// Remember changed arguments
            static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
            changedcount = 0
            
            
// Replace LANG_PLAYER with player id
            for (= 2; i < argscount; i++)
            {
                if (getarg(i) == LANG_PLAYER)
                {
                    setarg(i, 0, player)
                    changed[changedcount] = i
                    changedcount
++
                }
            }
            
            
// Send it
            message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
            write_byte(player)
            write_string(buffer)
            message_end()
            
            
// Replace back player id's with LANG_PLAYER
            for (= 0; i < changedcount; i++)
                setarg(changed[i], 0, LANG_PLAYER)
        }
    }
    // Send to specific target
    else
    
{            
        
// Send it
        message_begin(MSG_ONE, g_msgSayText, _, target)
        write_byte(target)
        write_string(buffer)
        message_end()
    }

Я код предоставил в качестве примера. От него можно отталкиваться.
Подобное реализовать можно и с Хам'ом, там также можно словить момент дропа и заблокировать сообщение, не прибегая к отлову нажатия кнопки дроп'а

По поводу отлова кнопки: данная реализация не совсем имеет место быть лишь по причине того что может вызываться дроп другими методами, не использовав кнопку. Например, в каком-либо плагине.
Тут уже вопрос в том, какая реализация по-душе. Если писать сборку с нуля, зная что в ней не будет использоваться дроп не использовав кнопку, то можно ловить само нажатие кнопки. Если будет дроп не использовав кнопку - ловить само событие дропа. Всё легко и просто.
Касательно телепатии: если Вы передаете Ваши проблемы телепатическим путем - ответы будут передаваться тоже телепатически.
Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком.
Аватара пользователя
RockTheStreet
 
Сообщения: 97
Зарегистрирован: 12 авг 2021, 23:13
Забанен
Благодарил (а): 7 раз.
Поблагодарили: 16 раз.
Опыт программирования: Больше трех лет
Языки программирования: JS, PHP

Re: Блокировка надписи "Это оружие нельзя выкинуть"

Сообщение Dart_Begep » 04 июн 2022, 10:50

В коде твоего плагина во время отображения отсчета может срабатывать команда "drop", соответственно необходим код, который тебе предложил БиЗоН. Код в событии перехвата команды ниже:
Код: Выделить всё
    if(zp_get_user_zombie_class(id) == idclass_banchee && !g_bat_time[id] && !g_cooldown[id])
    {
        g_bat_time[id] = 1
        
        g_cooldown
[id] = 30
        set_task
(1.0, "RemoveCooldown", id+TASK_COOLDOWN, _, _, "a",g_cooldown[id])    
        
        set_task
(bat_timewait,"clear_stat",id+TASK_REMOVE_STAT)
        
        new ent 
= engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
        
        if
(!pev_valid(ent)) return PLUGIN_HANDLED
        
        new Float
:vecAngle[3],Float:vecOrigin[3],Float:vecVelocity[3],Float:vecForward[3]
        fm_get_user_startpos(id,5.0,2.0,-1.0,vecOrigin)
        pev(id,pev_angles,vecAngle)
        
        engfunc
(EngFunc_MakeVectors,vecAngle)
        global_get(glb_v_forward,vecForward)
        
        velocity_by_aim
(id,floatround(banchee_skull_bat_speed),vecVelocity)
        
        set_pev
(ent,pev_origin,vecOrigin)
        set_pev(ent,pev_angles,vecAngle)
        set_pev(ent,pev_classname,BAT_CLASSNAME)
        set_pev(ent,pev_movetype,MOVETYPE_FLY)
        set_pev(ent,pev_solid,SOLID_BBOX)
        engfunc(EngFunc_SetSize,ent,{-20.0,-15.0,-8.0},{20.0,15.0,8.0})
        
        engfunc
(EngFunc_SetModel,ent,MODEL_BAT)
        set_pev(ent,pev_animtime,get_gametime())
        set_pev(ent,pev_framerate,1.0)
        set_pev(ent,pev_owner,id)
        set_pev(ent,pev_velocity,vecVelocity)
        set_pev(ent,pev_nextthink,get_gametime()+banchee_skull_bat_flytime)
        emit_sound(ent, CHAN_WEAPON, SOUND_FIRE, 1.0, ATTN_NORM, 0, PITCH_NORM)
        
        g_stop
[id] = ent
        
        PlayWeaponAnimation
(id, 2)

        pev(id, pev_maxspeed, g_temp_speed[id])
        
        return PLUGIN_HANDLED
    
}
    
    return PLUGIN_CONTINUE

В коде же второго плагина во время "отсчета" блокируется срабатывание команды "drop", поэтому там незачем блокировать сообщение. Код в событии перехвата команды ниже:
Код: Выделить всё
if(g_fLastUse[id]+COOLDOWN_RUN > get_gametime())
            return PLUGIN_HANDLED;


Добавлено спустя 4 минуты 39 секунд:
RockTheStreet писал(а):
newtramp1 писал(а):Ну это я так понимаю полноценный плагин, который полностью убирает надпись с использованием reapi. У меня к сожалению сборка древняя и на REHLDS тупо не запустится. А если говорить о коде в самом плагине? Как пример кинул код другого плагина, где эта надпись не появляется. Но что-то я не нашел код, который отвечает за это.


public task_ShowCooldown(taskid)
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <fun>
#include <fakemeta_util>
#include <zombieplague>

new Float:g_fLastUse[33]

#define TASK_COOLDOWN 4578
#define TASK_END 457845

#define ID_COOLDOWN (taskid - TASK_COOLDOWN)
#define ID_END (taskid - TASK_END)

#define linux_diff_weapon             4
#define m_pPlayer                41
#define GRENADE                "models/zombie_plague/hunter/v_bomb_hunter.mdl"

new g_zcHunter, g_msgSayText, g_msgScreenFade, g_maxplayers

new const zclass_name
[] = "Hunter"
new const zclass_info[] = "\y[ Разгон \r[G]\y ]"
new const zclass_model[] = "undead_hunter" 
new const zclass_clawmodel
[] = "hunter/v_hunter.mdl" 
const zclass_health 
= 4500 
const zclass_speed 
= 250
const Float
:zclass_gravity = 0.67 
const Float
:zclass_knockback =  0.43 

new const sound_hunter_sprint
[] = "sound_effect_zombie/hunter/hunter_skill.wav"  
new const sound_hunter_endspr
[] = "sound_effect_zombie/hunter/hunter_endskill.wav" 

#define FAST_SPEED 700

#define COOLDOWN_RUN 14.0
#define TIME_RUN 3.0

new bool:g_SkillActive[33]

public plugin_precache() {
    g_zcHunter = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)    
    
    precache_sound
(sound_hunter_sprint)
    precache_sound(sound_hunter_endspr)    
    
    engfunc
(EngFunc_PrecacheModel, GRENADE);
}

public plugin_init() {
    register_clcmd("drop", "use_ability_one")

    register_forward(FM_PlayerPreThink, "client_prethink")
    
    RegisterHam
(Ham_TakeDamage, "player", "fw_TakeDamage_Post", 1)
    
    g_msgScreenFade 
= get_user_msgid("ScreenFade")
    g_msgSayText = get_user_msgid("SayText")
    g_maxplayers = get_maxplayers()
    
    new const GRENADES_ENTITY
[][] = { "weapon_hegrenade", "weapon_flashbang", "weapon_smokegrenade" };
    for(new i = 0; i < sizeof GRENADES_ENTITY; i++)
    RegisterHam(Ham_Item_Deploy, GRENADES_ENTITY[i], "Grenade_DeployPost", true);
}

public Grenade_DeployPost(iItem)
{
    new iPlayer = get_pdata_cbase(iItem, m_pPlayer, linux_diff_weapon);

    if(!zp_get_user_zombie(iPlayer) || zp_get_user_nemesis(iPlayer))
        return;

    if(zp_get_user_zombie_class(iPlayer) == g_zcHunter)
        set_pev(iPlayer, pev_viewmodel2, GRENADE);
}

public use_ability_one(id)
{
    if (is_user_alive(id) && zp_get_user_zombie_class(id) == g_zcHunter && zp_get_user_zombie(id) && !zp_get_user_nemesis(id))
    {        
        if
(g_fLastUse[id]+COOLDOWN_RUN > get_gametime())
            return PLUGIN_HANDLED;
            
        g_SkillActive
[id] = true
        
        fm_set_rendering
(id, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 0)
        
        emit_sound
(id, CHAN_STREAM, sound_hunter_sprint, 1.0, ATTN_NORM, 0, PITCH_NORM)
            
        message_begin
(MSG_ONE,g_msgScreenFade,_,id)
        write_short(8192)
        write_short(8192)
        write_short(0x0000)
        write_byte(255)
        write_byte(0)
        write_byte(0)
        write_byte(125)
        message_end()
            
        g_fLastUse
[id]=get_gametime()
            
        set_task
(1.0, "task_ShowCooldown", id+TASK_COOLDOWN, _, _, "b")
        set_task(TIME_RUN, "task_RemoveSpeed", id+TASK_END)
        
        return PLUGIN_HANDLED
;
    }
    return PLUGIN_CONTINUE;
}

public fw_TakeDamage_Post(victim)
{
    if(is_user_alive(victim)&&zp_get_user_zombie(victim)&&g_SkillActive[victim])
        set_pdata_float(victim, 108, 1.0, 5)
}

public client_prethink(id)
{
    if(is_user_alive(id) && zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_zcHunter) && !zp_get_user_nemesis(id) && g_SkillActive[id])
        set_pev(id, pev_maxspeed, float(FAST_SPEED))
}

public task_RemoveSpeed(taskid)
{
    if (is_user_alive(ID_END) && zp_get_user_zombie_class(ID_END) == g_zcHunter && zp_get_user_zombie(ID_END) && !zp_get_user_nemesis(ID_END))
    {
        g_SkillActive[ID_END] = false
        
        set_pev
(ID_END, pev_maxspeed, float(zclass_speed)) 
        
        fm_set_user_rendering
(ID_END)
        
        emit_sound
(ID_END, CHAN_VOICE, sound_hunter_endspr, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
}

public task_ShowCooldown(taskid)
{
    if(!is_user_connected(ID_COOLDOWN) || !is_user_alive(ID_COOLDOWN) || !zp_get_user_zombie(ID_COOLDOWN) || zp_get_user_nemesis(ID_COOLDOWN))
    {
        remove_task(taskid)
        return
    
}
    
    if
(get_gametime()-g_fLastUse[ID_COOLDOWN]>=COOLDOWN_RUN)
    {
        remove_task(taskid)
        return
    
}
    
    client_print
(ID_COOLDOWN, print_center, "[Способность через: %d сек]", floatround(get_gametime()-COOLDOWN_RUN-g_fLastUse[ID_COOLDOWN])*-1)
}

public zp_user_infected_post(id, infector)
{
    if ((zp_get_user_zombie_class(id) == g_zcHunter) && !zp_get_user_nemesis(id))
    {
        g_SkillActive[id] = false
        
        g_fLastUse
[id] = 0.0
        
        zp_colored_print
(id, "^x04[^x01Охотник^x04]^x01 Ваша способность: ^x04[^x01Ускорение^x04]^x01 | Активация: ^x04[^x01G^x04]^x01 | Кулдаун: ^x04[^x01%d^x04]^x01", floatround(COOLDOWN_RUN))
    }
}

zp_colored_print(target, const message[], any:...)
{
    static buffer[512], i, argscount
    argscount 
= numargs()
    vformat(buffer, charsmax(buffer), message, 3)
    
    
// Send to everyone
    if (!target)
    {
        static player
        for 
(player = 1; player <= g_maxplayers; player++)
        {
            // Not connected
            if (!is_user_connected(player))
                continue;
            
            
// Remember changed arguments
            static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
            changedcount = 0
            
            
// Replace LANG_PLAYER with player id
            for (= 2; i < argscount; i++)
            {
                if (getarg(i) == LANG_PLAYER)
                {
                    setarg(i, 0, player)
                    changed[changedcount] = i
                    changedcount
++
                }
            }
            
            
// Send it
            message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
            write_byte(player)
            write_string(buffer)
            message_end()
            
            
// Replace back player id's with LANG_PLAYER
            for (= 0; i < changedcount; i++)
                setarg(changed[i], 0, LANG_PLAYER)
        }
    }
    // Send to specific target
    else
    
{            
        
// Send it
        message_begin(MSG_ONE, g_msgSayText, _, target)
        write_byte(target)
        write_string(buffer)
        message_end()
    }

Я код предоставил в качестве примера. От него можно отталкиваться.
Подобное реализовать можно и с Хам'ом, там также можно словить момент дропа и заблокировать сообщение, не прибегая к отлову нажатия кнопки дроп'а

По поводу отлова кнопки: данная реализация не совсем имеет место быть лишь по причине того что может вызываться дроп другими методами, не использовав кнопку. Например, в каком-либо плагине.
Тут уже вопрос в том, какая реализация по-душе. Если писать сборку с нуля, зная что в ней не будет использоваться дроп не использовав кнопку, то можно ловить само нажатие кнопки. Если будет дроп не использовав кнопку - ловить само событие дропа. Всё легко и просто.

Верно, можно и так поступить - отлавливать событие дропа и блокировать сообщение. Ну или вообще блокировать событие.
Аватара пользователя
Dart_Begep
 
Сообщения: 131
Зарегистрирован: 19 апр 2017, 22:29
Благодарил (а): 11 раз.
Поблагодарили: 27 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
Php
JavaScript

Re: Блокировка надписи "Это оружие нельзя выкинуть"

Сообщение БиЗоН » 04 июн 2022, 20:27

RockTheStreet писал(а):По поводу отлова кнопки: данная реализация не совсем имеет место быть лишь по причине того что может вызываться дроп другими методами, не использовав кнопку.

Я просто предложил ему простой вариант изменения твоего кода под не реапи.
Я бы вообще заюзал такой вариант:
Код: Выделить всё
#include <amxmodx>

new const MSG_DROP[] = "#Weapon_Cannot_Be_Dropped";

public plugin_init()
{
    register_message(get_user_msgid("TextMsg"), "message_TextMsg");
}

public message_TextMsg()
{
    if(get_msg_arg_int(1) != print_center)
        return PLUGIN_CONTINUE;

    static sMsg[sizeof(MSG_DROP)+1];
    get_msg_arg_string(2, sMsg, charsmax(MSG_DROP));

    return equal(sMsg, MSG_DROP) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;

Исходя из того, что нужно просто заблокировать сообщение.
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 15