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

Weapon USE Pickup

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

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

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

Weapon USE Pickup

Сообщение NightFury » 07 окт 2018, 15:50

Автор: NightFury (406)
Версия: 1.0
Описание: Поднимает оружие при наведении прицела и нажатии кнопки E (аналог CS GO)
Так же выкидывает старое оружие если поднимаешь новое на E
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

#define DISTANCE 80.0
#define COLOR 75, 0, 255

#define PDATA_VALID 2
#define is_entity(%0) (pev_valid(%0) == PDATA_VALID)

new Float:g_Hud[33], g_Entity[33]

public plugin_init()
{
    register_plugin("Weapon USE Pickup", "1.0", "406")
    register_forward(FM_AddToFullPack, "fm_AddToFullPackPost", 1)
    register_forward(FM_ClientDisconnect, "fm_ClientDisconnectPre")
    RegisterHookChain(RG_CBasePlayer_PreThink, "rg_CBasePlayerPreThink")
}

public fm_ClientDisconnectPre(player) g_Entity[player] = 0

public fm_AddToFullPackPost
(es_handle, e, entity, host)
{
    if(!is_user_alive(host) || host == entity || g_Entity[host] != entity) return FMRES_IGNORED
    set_es
(es_handle, ES_RenderMode, kRenderNormal)
    set_es(es_handle, ES_RenderFx, kRenderFxGlowShell)
    set_es(es_handle, ES_RenderAmt, 16)
    set_es(es_handle, ES_RenderColor, {COLOR})
    return FMRES_IGNORED
}

public rg_CBasePlayerPreThink(player)
{
    if(!is_user_alive(player)) return HC_CONTINUE
    new Float
:vOrigin[3], Float:vAngle[3], entity = FM_NULLENT
    ExecuteHam
(Ham_Player_GetGunPosition, player, vOrigin)
    pev(player, pev_v_angle, vAngle)
    angle_vector(vAngle, ANGLEVECTOR_FORWARD, vAngle)
    vAngle[0] = vAngle[0] * DISTANCE + vOrigin[0]
    vAngle[1] = vAngle[1] * DISTANCE + vOrigin[1]
    vAngle[2] = vAngle[2] * DISTANCE + vOrigin[2]
    engfunc(EngFunc_TraceLine, vOrigin, vAngle, DONT_IGNORE_MONSTERS, player, 0)
    get_tr2(0, TR_vecEndPos, vOrigin)
    while((entity = engfunc(EngFunc_FindEntityInSphere, entity, vOrigin, 0.5)))
    {
        if(is_entity(entity) && FClassnameIs(entity, "weaponbox"))
        {
            if(g_Hud[player] <= get_gametime())
            {
                set_hudmessage(COLOR, -1.0, 0.7, 2, 0.0, 1.0, 0.02, 0.5)
                show_hudmessage(player, "Press USE to pick up")
                g_Hud[player] = get_gametime() + 120.0
            
}
            if(pev(entity, pev_flags) & FL_ONGROUND)
            {
                g_Entity[player] = entity
                if
(get_member(player, m_afButtonPressed) & IN_USE)
                {
                    if(is_entity(get_member(entity, m_WeaponBox_rgpPlayerItems, PRIMARY_WEAPON_SLOT)))
                    rg_drop_items_by_slot(player, PRIMARY_WEAPON_SLOT)
                    else if(is_entity(get_member(entity, m_WeaponBox_rgpPlayerItems, PISTOL_SLOT)))
                    rg_drop_items_by_slot(player, PISTOL_SLOT)
                    dllfunc(DLLFunc_Touch, entity, player)
                }
            }
            return HC_CONTINUE
        
}
    }
    g_Entity[player] = 0
    return HC_CONTINUE

Код: Выделить всё
cell AMX_NATIVE_CALL is_entity(AMX *amx, cell *params)
{
    enum args_e { arg_count, arg_index };

    int nIndex = params[arg_index];
    if (nIndex < 0 || nIndex > gpGlobals->maxEntities) {
        return FALSE;
    }

    auto pEntity = getPrivate<CBaseEntity>(nIndex);
    if (!pEntity) {
        return FALSE;
    }

    // if it is the index of the player
    if (pEntity->IsPlayer() && pEntity->has_disconnected) {
        return FALSE;
    }

    return TRUE;
}

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

#define DISTANCE 80.0
#define COLOR 75, 0, 255

#define PDATA_VALID 2
#define is_entity(%0) (pev_valid(%0) == PDATA_VALID)

new Float:g_Hud[33]

public plugin_init()
{
    register_plugin("Weapon USE Pickup", "1.0", "406")
    RegisterHookChain(RG_CBasePlayer_PreThink, "rg_CBasePlayerPreThink")
}

public rg_CBasePlayerPreThink(player)
{
    if(!is_user_alive(player)) return HC_CONTINUE
    new Float
:vOrigin[3], Float:vAngle[3], entity = FM_NULLENT
    ExecuteHam
(Ham_Player_GetGunPosition, player, vOrigin)
    pev(player, pev_v_angle, vAngle)
    angle_vector(vAngle, ANGLEVECTOR_FORWARD, vAngle)
    vAngle[0] = vAngle[0] * DISTANCE + vOrigin[0]
    vAngle[1] = vAngle[1] * DISTANCE + vOrigin[1]
    vAngle[2] = vAngle[2] * DISTANCE + vOrigin[2]
    engfunc(EngFunc_TraceLine, vOrigin, vAngle, DONT_IGNORE_MONSTERS, player, 0)
    get_tr2(0, TR_vecEndPos, vOrigin)
    while((entity = engfunc(EngFunc_FindEntityInSphere, entity, vOrigin, 0.5)))
    {
        if(is_entity(entity) && FClassnameIs(entity, "weaponbox"))
        {
            if(g_Hud[player] <= get_gametime())
            {
                set_hudmessage(COLOR, -1.0, 0.7, 2, 0.0, 1.0, 0.02, 0.5)
                show_hudmessage(player, "Press USE to pick up")
                g_Hud[player] = get_gametime() + 120.0
            
}
            if(pev(entity, pev_flags) & FL_ONGROUND && get_member(player, m_afButtonPressed) & IN_USE)
            {
                if(is_entity(get_member(entity, m_WeaponBox_rgpPlayerItems, PRIMARY_WEAPON_SLOT)))
                rg_drop_items_by_slot(player, PRIMARY_WEAPON_SLOT)
                else if(is_entity(get_member(entity, m_WeaponBox_rgpPlayerItems, PISTOL_SLOT)))
                rg_drop_items_by_slot(player, PISTOL_SLOT)
                dllfunc(DLLFunc_Touch, entity, player)
            }
            return HC_CONTINUE
        
}
    }
    return HC_CONTINUE
}


Утверждено. //Leonidddd
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Подпись: NightFury/406
Поддержка: vk.com/mashakrylova406
Аватара пользователя
NightFury
 
Сообщения: 85
Зарегистрирован: 10 авг 2016, 12:22
Благодарил (а): 8 раз.
Поблагодарили: 24 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, C, C++

Re: Weapon USE Pickup

Сообщение gamingEx » 07 окт 2018, 16:33

NightFury писал(а):
Код: Выделить всё
cell AMX_NATIVE_CALL is_entity(AMX *amx, cell *params)
{
    enum args_e { arg_count, arg_index };

    int nIndex = params[arg_index];
    if (nIndex < 0 || nIndex > gpGlobals->maxEntities) {
        return FALSE;
    }

    auto pEntity = getPrivate<CBaseEntity>(nIndex);
    if (!pEntity) {
        return FALSE;
    }

    // if it is the index of the player
    if (pEntity->IsPlayer() && pEntity->has_disconnected) {
        return FALSE;
    }

    return TRUE;
}

И что мы должны здесь увидеть?
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

Re: Weapon USE Pickup

Сообщение fl0wer » 07 окт 2018, 20:35

Бедный сервер с циклом по всем энтити в синке игрока.

Добавлено спустя 1 конченную минуту и пошел нахуй секунд:
Ещё и пресинк пре.
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Weapon USE Pickup

Сообщение Vaqtincha » 07 окт 2018, 23:33

мой вариант (правда код не идеал)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
админгандонсоси
Аватара пользователя
Vaqtincha
 
Сообщения: 277
Зарегистрирован: 28 мар 2018, 15:05
Забанен
Благодарил (а): 8 раз.
Поблагодарили: 53 раз.

Re: Weapon USE Pickup

Сообщение Vaqtincha » 08 окт 2018, 07:59

gamingEx, я вижу то что автор не в курсе что такое PDATA_VALID (2)
Вы должны зарегистрироваться, чтобы видеть ссылки. ... v.cpp#L454

а натив is_entity уже проверяет приват дату. Так что макрос бесполезен.
админгандонсоси
Аватара пользователя
Vaqtincha
 
Сообщения: 277
Зарегистрирован: 28 мар 2018, 15:05
Забанен
Благодарил (а): 8 раз.
Поблагодарили: 53 раз.

Re: Weapon USE Pickup

Сообщение gamingEx » 08 окт 2018, 08:15

Vaqtincha, я ему на это намекаю уже вторую тему подряд, а в ответ получаю, что "насколько я знаю, is_entity себя плохо ведет и бла бла бла".
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

Re: Weapon USE Pickup

Сообщение NightFury » 08 окт 2018, 08:21

gamingEx, ты не говорил что натива пофикшена
Подпись: NightFury/406
Поддержка: vk.com/mashakrylova406
Аватара пользователя
NightFury
 
Сообщения: 85
Зарегистрирован: 10 авг 2016, 12:22
Благодарил (а): 8 раз.
Поблагодарили: 24 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, C, C++

Re: Weapon USE Pickup

Сообщение gamingEx » 08 окт 2018, 08:30

NightFury, в смысле пофикшена? В реапи эта натива изначально работала прекрасно.
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

Re: Weapon USE Pickup

Сообщение Siska » 24 авг 2021, 14:56

I think this is a wonderful plugin that works better than others on the net...
WWW.CSMEGAGAMING.COM
Аватара пользователя
Siska
 
Сообщения: 1
Зарегистрирован: 24 авг 2021, 14:34
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6


Вернуться в Утвержденные плагины

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13