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

Как получить owner'а inflictor?

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

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

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

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

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

Как получить owner'а inflictor?

Сообщение Ancient » 20 авг 2017, 18:19

Код: Выделить всё
public plugin_init( )
{
    RegisterHam( Ham_TakeDamage, "func_breakable", "Hook__TakeDamage_Pre", .Post = true );
}

public Hook__TakeDamage_Pre( iVictim, iInflictor, iAttacker, Float: flDamage, iBitsDamage )
{
    if ( !is_user_connected( iAttacker ) )
        return;

    static Float: flHealth;
    pev( iVictim, pev_health, flHealth );    

    if 
( flHealth <= 0.0 )
    {
        if ( iAttacker == iInflictor )
        {
            aaa = iAttacker;
            client_print( iAttacker, print_center, "-A-" );
        }
        else
        
{
            new aaa = pev( iInflictor, pev_owner );
            client_print( aaa, print_center, "-B-" );
        }
    }


Знания в скриптинге очень маленькие поэтому не могу понять как получить ownera(
Аватара пользователя
Ancient
 
Сообщения: 3
Зарегистрирован: 20 авг 2017, 18:00
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: -

Re: Как получить owner'а inflictor?

Сообщение артист666 » 20 авг 2017, 18:39

iInflictor - это iAttacker, и только когда это граната - объект.
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Как получить owner'а inflictor?

Сообщение Ancient » 20 авг 2017, 20:58

артист666 писал(а):iInflictor - это iAttacker, и только когда это граната - объект.

Я это понял уже, но мне нужно узнать кто owner iInflictor ( этой гранаты которая сломала func_breakable ).
Аватара пользователя
Ancient
 
Сообщения: 3
Зарегистрирован: 20 авг 2017, 18:00
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: -

Re: Как получить owner'а inflictor?

Сообщение артист666 » 20 авг 2017, 21:00

Так iAttacker это должен быть вроде как...

pev_owner не работает?
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Как получить owner'а inflictor?

Сообщение NEoMASTERR » 20 авг 2017, 21:03

У гранаты помоему нет owner'a, попробуйте при броске задать в любое другое поле типа pev_iuser1 id бросившего. Могу ошибаться.

Добавлено спустя 2 минуты 3 секунды:
Попробуйте вывести в логи всё что передаётся при разрушении гранатой func_breakable'а
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Как получить owner'а inflictor?

Сообщение Ancient » 20 авг 2017, 21:22

артист666 писал(а):pev_owner не работает?

Не.

Код: Выделить всё
{
"model" "*66"
"rendermode"
 "4"
"material"
 "2"
"health"
 "500"
"rendercolor"
 "0 0 0"
"renderamt"
 "255"
"classname"
 "func_breakable"

Забыл упомянуть, что объект разрушается при таче с гранатой.


При разрушении с оружия: Attacker: 1| Inflictor: 1 , гранатой: ничего.
Код: Выделить всё
client_print( 0, print_chat, "Attacker: %d| Inflictor: %d", iAttacker, iInflictor );
Аватара пользователя
Ancient
 
Сообщения: 3
Зарегистрирован: 20 авг 2017, 18:00
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: -

Re: Как получить owner'а inflictor?

Сообщение fl0wer » 20 авг 2017, 21:41

Ancient писал(а):
артист666 писал(а):pev_owner не работает?

Не.

Код: Выделить всё
{
"model" "*66"
"rendermode"
 "4"
"material"
 "2"
"health"
 "500"
"rendercolor"
 "0 0 0"
"renderamt"
 "255"
"classname"
 "func_breakable"
}

Забыл упомянуть, что объект разрушается при таче с гранатой.


При разрушении с оружия: Attacker: 1| Inflictor: 1 , гранатой: ничего.
Код: Выделить всё
client_print( 0, print_chat, "Attacker: %d| Inflictor: %d", iAttacker, iInflictor ); 

Либо мешает проверка на коннект у аттакера, либо тейкдмг не вызывается, а вызывается Die синк у разрушаемого.

Код: Выделить всё
void CBreakable::BreakTouch(CBaseEntity *pOther)
{
    
float flDamage;
    
entvars_t *pevToucher pOther->pev;

    
// only players can break these right now
    
if (!pOther->IsPlayer() || !IsBreakable())
    {
        if (
pev->rendermode == kRenderNormal || !FClassnameIs(pOther->pev"grenade"))
            return;

        
pev->angles.m_angle;
        
UTIL_MakeVectors(pev->angles);

        
g_vecAttackDir gpGlobals->v_forward;

#ifndef REGAMEDLL_FIXES
        
pev->takedamage DAMAGE_NO;
        
pev->deadflag DEAD_DEAD;
        
pev->effects EF_NODRAW;
#endif

        
Die();
    }

    
// can be broken when run into
    
if (pev->spawnflags SF_BREAK_TOUCH)
    {
        
flDamage pevToucher->velocity.Length() * 0.01f;

        if (
flDamage >= pev->health)
        {
            
SetTouch(NULL);
            
TakeDamage(pevToucherpevToucherflDamageDMG_CRUSH);

            
// do a little damage to player if we broke glass or computer
            
pOther->TakeDamage(pevpevflDamage 4DMG_SLASH);
        }
    }

    
// can be broken when stood upon
    
if ((pev->spawnflags SF_BREAK_PRESSURE) && pevToucher->absmin.>= pev->maxs.2)
    {
        
// play creaking sound here.
        
DamageSound();

        
SetThink(&CBreakable::Die);
        
SetTouch(NULL);

        
// BUGBUG: why doesn't zero delay work?
        
if (m_flDelay == 0.0f)
        {
            
m_flDelay 0.1f;
        }

        
pev->nextthink pev->ltime m_flDelay;
    }
}
 
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Как получить owner'а inflictor?

Сообщение артист666 » 21 авг 2017, 08:12

Когда граната разбивает стекло от взрыва:
vict = 151 inflict = 126 attack = 1 dmg = 0.000000 type = 16777216


Когда от прикосновения - даже и не вызывается...

Через тач отлавливай...

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

public plugin_init()
{
    RegisterHam(Ham_Touch, "func_breakable", "touch", 1)
}
public touch(ptr, ptd)
{
    client_print(0, print_chat, "ptr = %i ptd = %i owner = %i", ptr, ptd, pev(ptd, pev_owner))
}


Код: Выделить всё
pev(ptrpev_spawnflags) == 0
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn


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

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

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