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

Получение id летящей гранаты  [Решено]

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

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

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

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

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

Получение id летящей гранаты

Сообщение Freeman74 » 09 фев 2017, 18:55

Здравствуйте ув. пользователи amx-x.ru
У меня есть вопрос, как получить ид летящей гранаты?
К примеру, я выдал игроку гранату и присвоил объекту значение pev_iuser1 = 377777:
Код: Выделить всё
new iEntity = fm_give_item(id, "weapon_smokegrenade");
set_pev(iEntity, pev_iuser1, 377777);

Теперь мне нужно при броске гранаты изменить ей модель если pev(iEntity, pev_iuser1) == 377777.
Код: Выделить всё
public plugin_init() register_forward(FM_SetModel, "FakeMeta_SetModel_Post", true);
public FakeMeta_SetModel_Post(iEntity, szModel[])
{
    if(/*проверка на то что объект является дымовой гранатой*/)
    {
        if(pev(?, pev_iuser1) == 377777) // Тут мне нужно получить значение pev_iuser1, как мне получить ид того объекта, которому я присваивал значение pev_iuser1 = 377777?
        {
            // Код
        }
    }
}
Контакты:
Вконтакте
Аватара пользователя
Freeman74
 
Сообщения: 126
Зарегистрирован: 02 окт 2014, 15:27
Благодарил (а): 43 раз.
Поблагодарили: 16 раз.
Языки программирования: Counter-Strike 1.6

Re: Получение id летящей гранаты

Сообщение Mistrick » 09 фев 2017, 19:51

Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Получение id летящей гранаты

Сообщение Freeman74 » 09 фев 2017, 20:17

Mistrick писал(а):https://github.com/Mistrick/WeaponSkinSystem/blob/master/weapon_skin_system.sma#L502-L520

Не то, мне нужно получить в хуке смены модели объекту ид объекта которому я присваивал значение pev_iuser1. То есть ид объекта при создании(iEntity = fm_give_item(id, "weapon_smokegrenade")) и ид объекта при отлове смены модели объекту разные. Соответственно при отлове смены модели, у объекта значение pev_iuser1 = 0 так как ид объекта другой.
Контакты:
Вконтакте
Аватара пользователя
Freeman74
 
Сообщения: 126
Зарегистрирован: 02 окт 2014, 15:27
Благодарил (а): 43 раз.
Поблагодарили: 16 раз.
Языки программирования: Counter-Strike 1.6

Re: Получение id летящей гранаты

Сообщение Xelson » 09 фев 2017, 20:23

Код: Выделить всё
new iWeaponID = find_ent_by_owner(FM_NULLENT, "weapon_deagle", iEntity

Я таким образом получал айди оружия и устанавливал ему pev_impusle, после чего хукал Ham_Item_AddToPlayer и проверял weapon_deagle на произвольное значение pev_impusle. В итоге, всё сработало, попробуй по аналогии с этим.
Аватара пользователя
Xelson
 
Сообщения: 365
Зарегистрирован: 06 мар 2016, 14:41
Откуда: Беларусь
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Опыт программирования: Больше трех лет

Re: Получение id летящей гранаты

Сообщение Freeman74 » 09 фев 2017, 20:25

Xelson писал(а):
Код: Выделить всё
new iWeaponID = find_ent_by_owner(FM_NULLENT, "weapon_deagle", iEntity)

Я таким образом получал айди оружия и устанавливал ему pev_impusle, после чего хукал Ham_Item_AddToPlayer и проверял weapon_deagle на произвольное значение pev_impusle. В итоге, всё сработало, попробуй по аналогии с этим.

Пробовал, на гранатах почему то iWeaponID = 0.
Контакты:
Вконтакте
Аватара пользователя
Freeman74
 
Сообщения: 126
Зарегистрирован: 02 окт 2014, 15:27
Благодарил (а): 43 раз.
Поблагодарили: 16 раз.
Языки программирования: Counter-Strike 1.6

Re: Получение id летящей гранаты

Сообщение Mistrick » 09 фев 2017, 20:36

Freeman74, с его будет одинаковый индекс? Брошенная граната и та что в руках разные объекты. Разумеется будет разный индекс. Но данные будут сохранены.
Код: Выделить всё
public FM_SetModel_Pre(const ent)
{
    if(!
is_valid_pev(ent)) return FMRES_IGNORED;

    new 
classname[32]; pev(entpev_classnameclassnamecharsmax(classname));
    if(
equal(classname"grenade"))
    {
        new 
id pev(entpev_owner);
        new 
weaponid fm_cs_get_grenade_type(ent);

        if(
weaponid == CSW_SMOKEGRENADE && pev(entpev_iuser1) == 377777)
        {
            
// code...
        
}
    }

}

// work only for "grenade" classname
stock fm_cs_get_grenade_type(index)
{
    const 
m_iTeam 114;
    new 
bits get_pdata_int(indexm_iTeam);

    if (
bits & (<< 0))
        return 
CSW_HEGRENADE;
    else if (
bits & (<< 1))
        return 
CSW_SMOKEGRENADE;
    else if (!
bits)
        return 
CSW_FLASHBANG;

    return 
0;
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Получение id летящей гранаты

Сообщение Freeman74 » 09 фев 2017, 20:58

Mistrick писал(а):Freeman74, с его будет одинаковый индекс? Брошенная граната и та что в руках разные объекты. Разумеется будет разный индекс. Но данные будут сохранены.
Код: Выделить всё
public FM_SetModel_Pre(const ent)
{
    if(!is_valid_pev(ent)) return FMRES_IGNORED;

    new classname[32]; pev(ent, pev_classname, classname, charsmax(classname));
    if(equal(classname, "grenade"))
    {
        new id = pev(ent, pev_owner);
        new weaponid = fm_cs_get_grenade_type(ent);

        if(weaponid == CSW_SMOKEGRENADE && pev(ent, pev_iuser1) == 377777)
        {
            // code...
        }
    }

}

// work only for "grenade" classname
stock fm_cs_get_grenade_type(index)
{
    const m_iTeam = 114;
    new bits = get_pdata_int(index, m_iTeam);

    if (bits & (<< 0))
        return CSW_HEGRENADE;
    else if (bits & (<< 1))
        return CSW_SMOKEGRENADE;
    else if (!bits)
        return CSW_FLASHBANG;

    return 0;


Это я и пытался сказать что это совсем разные объекты. Но данные pev_iuser1, pev_iuser2, ... он не сохраняются.

Добавлено спустя 14 минут 36 секунд:
Вот варианты которые я пробовал, не один не сработал:
1 вариант:
Код: Выделить всё
#define IUSER1_WEAPONKEY 788332

#define linux_diff_weapon 4
#define m_pWeaponBoxItems 34

public plugin_init()
{
    register_forward(FM_SetModel, "FakeMeta_SetModel_Post", true);
    register_clcmd("test", "test");
}

public test(id)
{
    new iEntity = fm_give_item(id, "weapon_smokegrenade");
    set_pev(iEntity, pev_iuser1, IUSER1_WEAPONKEY);
}

public FakeMeta_SetModel_Post(iEntity, szModel[])
{
    if(strlen(szModel) == 0) return FMRES_IGNORED;
    new szClassName[32]; pev(iEntity, pev_classname, szClassName, charsmax(szClassName));
    if(szClassName[0] == 'g' && szClassName[1] == 'r' && szClassName[3] == 'n' && szModel[9] == 's')
    {
        client_print(0, print_chat, "SetModel Grenade");
        new iIteam;
        for(new i; i < 6; i++)
        {
            iIteam = get_pdata_cbase(iEntity, m_pWeaponBoxItems + i, linux_diff_weapon);
            if(iIteam > 0 && pev(iIteam, pev_iuser1) == IUSER1_WEAPONKEY)
            {
                client_print(0, print_chat, "iEntity = %d", iIteam);
                break;
            }
        }
    }
}


2 вариант:
Код: Выделить всё
#define IUSER1_WEAPONKEY 788332

public plugin_init()
{
    register_forward(FM_SetModel, "FakeMeta_SetModel_Post", true);
    register_clcmd("test", "test");
}

public test(id)
{
    new iEntity = fm_give_item(id, "weapon_smokegrenade");
    set_pev(iEntity, pev_iuser1, IUSER1_WEAPONKEY);
}

public FakeMeta_SetModel_Post(iEntity, szModel[])
{
    if(strlen(szModel) == 0) return FMRES_IGNORED;
    new szClassName[32]; pev(iEntity, pev_classname, szClassName, charsmax(szClassName));
    if(szClassName[0] == 'g' && szClassName[1] == 'r' && szClassName[3] == 'n' && szModel[9] == 's')
    {
        client_print(0, print_chat, "SetModel Grenade");
        new iIteam = fm_find_ent_by_owner(-1, "weapon_smokegrenade", iEntity);
        if(iIteam > 0 && pev(iIteam, pev_iuser1) == IUSER1_WEAPONKEY) client_print(0, print_chat, "iEntity = %d", iIteam);
    }
}

stock fm_find_ent_by_owner(iEntity, const szClassName[], iOwner)
{
    while((iEntity = engfunc(EngFunc_FindEntityByString, iEntity, "classname", szClassName)) && pev(iEntity, pev_owner) != iOwner) {}
    return iEntity;
}


3 вариант:
Код: Выделить всё
#define IUSER1_WEAPONKEY 788332

public plugin_init()
{
    register_forward(FM_SetModel, "FakeMeta_SetModel_Post", true);
    register_clcmd("test", "test");
}

public test(id)
{
    new iEntity = fm_give_item(id, "weapon_smokegrenade");
    set_pev(iEntity, pev_iuser1, IUSER1_WEAPONKEY);
}

public FakeMeta_SetModel_Post(iEntity, szModel[])
{
    if(strlen(szModel) == 0) return FMRES_IGNORED;
    new szClassName[32]; pev(iEntity, pev_classname, szClassName, charsmax(szClassName));
    if(szClassName[0] == 'g' && szClassName[1] == 'r' && szClassName[3] == 'n' && szModel[9] == 's')
    {
        client_print(0, print_chat, "SetModel Grenade");
        if(pev(iEntity, pev_iuser1) == IUSER1_WEAPONKEY) client_print(0, print_chat, "iEntity = %d", iEntity);
    }
}
Контакты:
Вконтакте
Аватара пользователя
Freeman74
 
Сообщения: 126
Зарегистрирован: 02 окт 2014, 15:27
Благодарил (а): 43 раз.
Поблагодарили: 16 раз.
Языки программирования: Counter-Strike 1.6

Re: Получение id летящей гранаты

Сообщение Mistrick » 09 фев 2017, 21:34

Freeman74, не используйте iuser1, его использует и сам gamedll. Пробуйте остальные.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Получение id летящей гранаты  [Решено]

Сообщение Freeman74 » 09 фев 2017, 22:12

Воспользовался стоком который предложил пользователь NEoMASTERR.
Код: Выделить всё
#define linux_diff_weapon 4
#define m_pNext 42
#define m_pWeaponid 43
#define m_rgpPlayerItems 368

#define IUSER1_WEAPONKEY 788332

public plugin_init()
{
    register_forward(FM_SetModel, "FakeMeta_SetModel_Post", true);
    register_clcmd("test", "test");
}

public test(id)
{
    new iEntity = fm_give_item(id, "weapon_smokegrenade");
    set_pev(iEntity, pev_iuser1, IUSER1_WEAPONKEY);
}

public FakeMeta_SetModel_Post(iEntity, szModel[])
{
    if(strlen(szModel) == 0) return FMRES_IGNORED;
    new szClassName[32]; pev(iEntity, pev_classname, szClassName, charsmax(szClassName));
    if(szClassName[0] == 'g' && szClassName[1] == 'r' && szClassName[3] == 'n' && szModel[9] == 's')
    {
        client_print(0, print_chat, "SetModel Grenade");
        new iIteam = fm_find_user_weapon(pev(iEntity, pev_owner), CSW_SMOKEGRENADE);
        if(iIteam > 0 && pev(iIteam, pev_iuser1) == IUSER1_WEAPONKEY) client_print(0, print_chat, "iEntity = %d", iIteam);
    }
}

stock fm_find_user_weapon(pPlayer, iWeapon)
{
    new iEntity;
    for(new i; i < 6; i++)
    {
        iEntity = get_pdata_cbase(pPlayer, m_rgpPlayerItems+i);
        if(iEntity > 0)
        {
            do
            
{
                if(iWeapon == get_pdata_int(iEntity, m_pWeaponid, linux_diff_weapon))
                    return iEntity;
            }
            while((iEntity = get_pdata_cbase(iEntity, m_pNext, linux_diff_weapon)) > 0)
        }
    }
    return 0;
}
Контакты:
Вконтакте
Аватара пользователя
Freeman74
 
Сообщения: 126
Зарегистрирован: 02 окт 2014, 15:27
Благодарил (а): 43 раз.
Поблагодарили: 16 раз.
Языки программирования: Counter-Strike 1.6


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

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

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