item_longjump

Сообщения
134
Реакции
40
Помог
2 раз(а)
Как можно отловить использование игроком item_longjump, что бы выставить в дальнейшем кулдаун? Или целесообразнее использовать для этого отдельный плагин целиком, где будет код longjump и туда вносить задержку.
 
Сообщения
1,549
Реакции
1,555
Помог
2 раз(а)
Вот получается так
При спавне у игрока есть иконка большого прыжка
Работа точно такая же как и у хл
Игрок присел + прыжок + движение
Если движения нет - то ничего не работает
+ от себя добавил направление не только прямо,а можно прыгать в разные стороны ( полезно выскочить резко из-за угла и убить жертву )
Убили - иконка пропадает


Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN    "Long Jump"
#define VERSION    "1.0"
#define AUTHOR    "MayroN"

new g_msgStatusIcon;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);

    RegisterHam(Ham_Player_PreThink, "player", "Player_Jump");
    RegisterHam(Ham_Killed, "player", "Hook_Icon");

    register_forward(FM_CmdStart, "Show_Icon");

    g_msgStatusIcon = get_user_msgid("StatusIcon");
}

public Show_Icon(id, uc_handle, seed)
{
    if(!is_user_alive(id))
        return FMRES_IGNORED;

    StatusIcon(id, 1)

    return FMRES_IGNORED;
}

public Player_Jump(id)
{
        static buttons, oldbuttons;

        buttons = pev(id, pev_button);
        oldbuttons = pev(id, pev_oldbuttons);

        if(buttons & IN_DUCK && buttons & IN_JUMP && !(oldbuttons & IN_JUMP) && (pev(id, pev_flags) & FL_ONGROUND))
        {
            set_speed(id, 500.0)

            static Float:velocity[3]
            pev(id, pev_velocity, velocity)

            velocity[2] = 800 / 3.0

            if((pev(id, pev_button) & (IN_LEFT|IN_RIGHT)))
            {
                velocity[0] *= -1
                velocity[1] *= -1
            }

            set_pev(id, pev_velocity, velocity)
        }
}

stock set_speed(ent, Float:speed)
{
    if(!pev_valid(ent))
        return;

    static Float:vangle[3], Float:new_velo[3], Float:y, Float:x
    if(ent<=get_maxplayers())
    {
        pev(ent,pev_v_angle,vangle)
    }

    pev(ent,pev_velocity,new_velo)

    y = new_velo[0]*new_velo[0] + new_velo[1]*new_velo[1]
    if(y) x = floatsqroot(speed*speed / y)

    new_velo[0] *= x
    new_velo[1] *= x

    if(speed<0.0)
    {
        new_velo[0] *= -1
        new_velo[1] *= -1
    }

    set_pev(ent,pev_velocity,new_velo)
}

StatusIcon(id, run)
{   
    if(!is_user_connected(id))
        return;
    
    message_begin(MSG_ONE, g_msgStatusIcon, {0,0,0}, id);
    write_byte(run);
    write_string("item_longjump");
    write_byte(0);
    write_byte(220);
    write_byte(220);
    message_end();
}

public Hook_Icon(id)
{
    StatusIcon(id, 0)
}
 
Сообщения
130
Реакции
7
Excuse me, is it possible that this jump only works when I have a knife in my hand?
 
Сообщения
130
Реакции
7
Excuse me, I did it. I tested it and it works!
But I want to share it with you in case you like the idea and also if you can tell me if it's done right or can be done in a better way.
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN    "Long Jump"
#define VERSION    "1.0"
#define AUTHOR    "MayroN"

new g_msgStatusIcon;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);

    RegisterHam(Ham_Player_PreThink, "player", "Player_Jump");
    RegisterHam(Ham_Killed, "player", "Hook_Icon");

    register_forward(FM_CmdStart, "Show_Icon");

    g_msgStatusIcon = get_user_msgid("StatusIcon");
}

public Show_Icon(id, uc_handle, seed)
{
    if (!is_user_alive(id))
        return FMRES_IGNORED;

    if (get_user_weapon(id) == CSW_KNIFE) // Проверка дали играчът държи нож
    {
        StatusIcon(id, 1);
    }
    else
    {
        StatusIcon(id, 0);
    }

    return FMRES_IGNORED;
}

public Player_Jump(id)
{
    static buttons, oldbuttons;

    buttons = pev(id, pev_button);
    oldbuttons = pev(id, pev_oldbuttons);

    if (buttons & IN_DUCK && buttons & IN_JUMP && !(oldbuttons & IN_JUMP) && (pev(id, pev_flags) & FL_ONGROUND))
    {
        if (get_user_weapon(id) == CSW_KNIFE) // Проверка дали играчът държи нож
        {
            set_speed(id, 500.0);

            static Float:velocity[3];
            pev(id, pev_velocity, velocity);

            velocity[2] = 800 / 3.0;

            if ((pev(id, pev_button) & (IN_LEFT | IN_RIGHT)))
            {
                velocity[0] *= -1;
                velocity[1] *= -1;
            }

            set_pev(id, pev_velocity, velocity);
        }
    }
}

stock set_speed(ent, Float:speed)
{
    if(!pev_valid(ent))
        return;

    static Float:vangle[3], Float:new_velo[3], Float:y, Float:x
    if(ent<=get_maxplayers())
    {
        pev(ent,pev_v_angle,vangle)
    }

    pev(ent,pev_velocity,new_velo)

    y = new_velo[0]*new_velo[0] + new_velo[1]*new_velo[1]
    if(y) x = floatsqroot(speed*speed / y)

    new_velo[0] *= x
    new_velo[1] *= x

    if(speed<0.0)
    {
        new_velo[0] *= -1
        new_velo[1] *= -1
    }

    set_pev(ent,pev_velocity,new_velo)
}

StatusIcon(id, run)
{   
    if(!is_user_connected(id))
        return;
    
    message_begin(MSG_ONE, g_msgStatusIcon, {0,0,0}, id);
    write_byte(run);
    write_string("item_longjump");
    write_byte(0);
    write_byte(220);
    write_byte(220);
    message_end();
}

public Hook_Icon(id)
{
    StatusIcon(id, 0)
}
 
Сообщения
1,549
Реакции
1,555
Помог
2 раз(а)
Huehue,
Готово
Скину плагин как ресурс с моделью на спине большого прыжка
 
Сообщения
130
Реакции
7
I barely made it this far and it's all I can do. If you have better code with such options and want to share it, I will gladly use it.
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN    "Long Jump"
#define VERSION   "1.0"
#define AUTHOR    "MayroN"

new g_msgStatusIcon;
new g_jumps[33];
new g_showJumpMessage[33];
new g_lastJumpTime[33];

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);

    RegisterHam(Ham_Player_PreThink, "player", "Player_Jump");
    RegisterHam(Ham_Killed, "player", "Hook_Icon");

    register_forward(FM_CmdStart, "Show_Icon");

    g_msgStatusIcon = get_user_msgid("StatusIcon");
}

public Show_Icon(id, uc_handle, seed)
{
    if (!is_user_alive(id))
        return FMRES_IGNORED;

    if (g_jumps[id] < 3) // Проверка дали играчът има още скокове
    {
        if (get_user_weapon(id) == CSW_KNIFE) // Проверка дали играчът държи нож
        {
            StatusIcon(id, 1);
            if (g_showJumpMessage[id])
            {
                client_print(id, print_center, "You have the Long Jump ability (Jumps Left: %d/3)", 3 - g_jumps[id]);
                g_showJumpMessage[id] = false; // Скриване на надписа веднага след изписването
            }
        }
        else
        {
            StatusIcon(id, 0);
            g_showJumpMessage[id] = true; // Показване на надписа следващия път при скок с нож
        }
    }
    else
    {
        StatusIcon(id, 0); // Изчезване на иконката след трите скока
        if (g_lastJumpTime[id] > 0.0 && get_gametime() - g_lastJumpTime[id] < 2.0) // Проверка за времето след последния скок
        {
            client_print(id, print_center, "You have used all long jumps");
            g_lastJumpTime[id] = 0.0; // Нулиране на времето на последния скок
            g_showJumpMessage[id] = false; // Скриване на надписа за последния скок
        }
    }

    return FMRES_IGNORED;
}

public Player_Jump(id)
{
    static buttons, oldbuttons;

    buttons = pev(id, pev_button);
    oldbuttons = pev(id, pev_oldbuttons);

    if (buttons & IN_DUCK && buttons & IN_JUMP && !(oldbuttons & IN_JUMP) && (pev(id, pev_flags) & FL_ONGROUND))
    {
        if (g_jumps[id] < 3 && get_user_weapon(id) == CSW_KNIFE) // Добавена проверка за броя на скоковете
        {
            g_jumps[id]++;
            set_speed(id, 500.0);

            static Float:velocity[3];
            pev(id, pev_velocity, velocity);

            velocity[2] = 800 / 3.0;

            if ((pev(id, pev_button) & (IN_LEFT | IN_RIGHT)))
            {
                velocity[0] *= -1;
                velocity[1] *= -1;
            }

            set_pev(id, pev_velocity, velocity);

            if (g_jumps[id] >= 3)
            {
                StatusIcon(id, 0); // Изчезване на иконката след трите скока
                g_showJumpMessage[id] = true; // Показване на надписа за последния скок
            }
            else
            {
                g_showJumpMessage[id] = true; // Показване на надписа при следващ скок с нож
            }

            g_lastJumpTime[id] = get_gametime(); // Запазване на времето на последния скок
        }
    }
    else if (g_lastJumpTime[id] > 0.0 && get_gametime() - g_lastJumpTime[id] > 2.0) // Проверка за изминало време
    {
        g_lastJumpTime[id] = 0.0; // Нулиране на времето на последния скок
        g_showJumpMessage[id] = false; // Скриване на надписа за последния скок
    }
}

stock set_speed(ent, Float:speed)
{
    if(!pev_valid(ent))
        return;

    static Float:vangle[3], Float:new_velo[3], Float:y, Float:x;
    if(ent<=get_maxplayers())
    {
        pev(ent,pev_v_angle,vangle);
    }

    pev(ent,pev_velocity,new_velo);

    y = new_velo[0]*new_velo[0] + new_velo[1]*new_velo[1];
    if(y) x = floatsqroot(speed*speed / y);

    new_velo[0] *= x;
    new_velo[1] *= x;

    if(speed<0.0)
    {
        new_velo[0] *= -1;
        new_velo[1] *= -1;
    }

    set_pev(ent,pev_velocity,new_velo);
}

StatusIcon(id, run)
{   
    if(!is_user_connected(id))
        return;
    
    message_begin(MSG_ONE, g_msgStatusIcon, {0,0,0}, id);
    write_byte(run);
    write_string("item_longjump");
    write_byte(0);
    write_byte(220);
    write_byte(220);
    message_end();
}

public Hook_Icon(id)
{
    StatusIcon(id, 0);
    g_jumps[id] = 0;
    g_lastJumpTime[id] = 0.0;
    g_showJumpMessage[id] = false;
}
 

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

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