Получить владельца гранаты

Сообщения
9
Реакции
1
Всем здравствуйте, возможно ли получить айди игрока, кинувшего смок при его раскрытии (вроде как есть только энтити айди)? Хотелось бы добавить проверку на випку в плагин Custom Smoke
 
Сообщения
75
Реакции
36
Помог
4 раз(а)
Там вроде бы pev_owner бросивший
 
Сообщения
9
Реакции
1
CSBishop,

new name[33];
new ownerid = pev(iEntity, pev_owner);
get_user_name(ownerid, name, 33);
client_print(0, print_chat, "%s", name);

если я так пишу, то выводит название сервера в чат
Думаю, может попробовать отлавливать сам момент броска гранаты и присваивать как-то через set_pev(iEntity, pev_owner, id)?
31 Июл 2024
zxchain, или вообще массив создать и присваивать ему энтити айди смоков, которые кинули випы на моменте броска гранаты, потому что там вроде как можно ещё айди получить, но это как будто костыль
 
Сообщения
9
Реакции
1
Забыл сказать что это FM_PlaybackEvent, вот код с плагина

В init register_forward(FM_PlaybackEvent, "FwdPlaybackEvent");


Код:
public FwdPlaybackEvent( iFlags , iEntity , iEventindex, Float:fDelay, Float:vOrigin[3], Float:vAngles[3], Float:fParam1, Float:fParam2, iParam1, iParam2, iBparam1, iBparam2 )
{
    if(iEventindex != g_evCreateSmoke || iBparam2 || !g_iCvar_Enebled)
        return FMRES_IGNORED;

    new iEnt = create_entity( "info_target" );

    if( !iEnt )
        return FMRES_IGNORED;
  
    new name[33];
    new ownerid = pev(iEnt, pev_owner);
    get_user_name(ownerid, name, 23);
    client_print(0, print_chat, "%s", name);

    g_iCountSprites = get_pcvar_num( g_Cvar_CountSprites );
    new Float:fDuration = get_pcvar_float( g_Cvar_Duration );

    entity_set_string( iEnt, EV_SZ_classname, g_szClassname );
    entity_set_float( iEnt, EV_FL_nextthink, get_gametime( ));
    entity_set_vector( iEnt, EV_VEC_origin, vOrigin );
    entity_set_float( iEnt, EV_FL_animtime, fDuration );

    return FMRES_SUPERCEDE;
}
Поэтому и нет овнера, а если попытаться вывести именно iEntity, который передаётся в аргументах к эвенту, то опять-таки овнер будет сервер
 
Последнее редактирование:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Можно при броске записать овнера в какой-нибудь var_iuser1, а потом получить.
 
Сообщения
330
Реакции
93
Помог
2 раз(а)
zxchain, reapi не устраивает? как насчёт RG_CGrenade_ExplodeSmokeGrenade + get_entvar(iGrenade, var_owner)?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Сообщения
330
Реакции
93
Помог
2 раз(а)
Ладно-ладно. Последняя попытка на телефоне.
RG_ThrowSmokeGrenade + HookChainReturn(ATYPE_INTEGE) + RG_CGrenade_ExplodeSmokeGrenade
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Noob_with_cheats, ну овнера-то все равно надо где-то хранить)
 
Сообщения
330
Реакции
93
Помог
2 раз(а)
fl0wer, ну да))) либо массив, либо set_entvar, но во 2 случае опасно , вдруг другие плагины юзают) а вот почему нет овнера, хороший вопрос)
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
а вот почему нет овнера, хороший вопрос)
Потому что флешка слепит всех, смок для всех, не нужен овнер.
У хаешки есть овнер, но снимается чтоб можно было нанести урон по себе.
 
Сообщения
9
Реакции
1
Noob_with_cheats, практически всё получилось сделать, получаю овнера и создаю энтити в CGrenade_ExplodeSmokeGrenade_Post, в новую энтити записываю овнера через EV_INT_iuser1, при этом удаляю старую entity_set_int( ent, EV_INT_flags, FL_KILLME ), но даже при таком удалении, обычный смок не исчезает и находится как бы в чёрном из плагина, после чего остаётся только обычный смок (потому что у чёрного урезана длительность)


Код:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <reapi>
#include <revip>

#define VERSION "1.0.0"
#define SMOKE_SPRITE "sprites/thick_gray_gas_puff.spr"
#define VIP_SMOKE_SPRITE "sprites/gas_puff_black_opaque.spr"

new const g_szClassname[] = "custom_smoke";

new g_szSmokeSprite;
new g_szVipSmokeSprite;

new g_Clear = 0;

new Float:g_iSmokeDuration = 10.0;
new Float:g_iVipSmokeDuration = 15.0;
new g_iCountSprites = 50;

public plugin_init()
{
    register_plugin( "ReVip Custom Smoke", VERSION, "zxchain" );

    register_think( g_szClassname, "FwdThink_BlackSmoke" );
    RegisterHookChain(RG_CGrenade_ExplodeSmokeGrenade, "CGrenade_ExplodeSmokeGrenade_Post", true);
    register_logevent("FwdClear", 2, "1=Round_End");
    register_logevent("FwdStart", 2, "1=Round_Start");
    register_event("TextMsg", "FwdClear", "a", "2=#Game_will_restart_in","2=#Game_Commencing");
}

public FwdClear()
{
    g_Clear = 1;
}

public FwdStart()
{
    g_Clear = 0;
}

public plugin_precache()
{
    g_szSmokeSprite = precache_model( SMOKE_SPRITE );
    g_szVipSmokeSprite = precache_model( VIP_SMOKE_SPRITE );
    force_unmodified(force_exactfile, {0,0,0},{0,0,0}, SMOKE_SPRITE);
    force_unmodified(force_exactfile, {0,0,0},{0,0,0}, VIP_SMOKE_SPRITE);
}

public CGrenade_ExplodeSmokeGrenade_Post(const ent)
{
    new iEnt = create_entity( "info_target" );

    if( !iEnt ) {
        return HC_CONTINUE;
    }

    new ownerId = pev(ent, pev_owner);

    new Float:vOrigin[3];
    entity_get_vector( ent, EV_VEC_origin, vOrigin );
  
    entity_set_vector( ent, EV_VEC_origin, Float:{ 9999.9, 9999.9, 9999.9 } );
    entity_set_int( ent, EV_INT_flags, FL_KILLME );
  
    new Float:fDuration;
  
    if(is_user_vip(ownerId)) {
        fDuration = g_iSmokeDuration;
    }
  
    else {
        fDuration = g_iVipSmokeDuration;
    }

    entity_set_int( iEnt, EV_INT_iuser1, ownerId );
    entity_set_string( iEnt, EV_SZ_classname, g_szClassname );
    entity_set_float( iEnt, EV_FL_nextthink, get_gametime( ));
    entity_set_vector( iEnt, EV_VEC_origin, vOrigin );
    entity_set_float( iEnt, EV_FL_animtime, fDuration );

    return HC_CONTINUE;
}

public FwdThink_BlackSmoke( iEntity )
{
    if( !is_valid_ent( iEntity ) ) {
        return PLUGIN_CONTINUE;
    }

    if( g_Clear > 0 )
    {
        entity_set_int( iEntity,EV_INT_flags, FL_KILLME );
        return PLUGIN_CONTINUE;
    }

    new ownerId = entity_get_int( iEntity, EV_INT_iuser1 );

    new Float:vOrigin[3];
    entity_get_vector( iEntity, EV_VEC_origin, vOrigin );

    new smokeSprite;
  
    if(is_user_vip(ownerId)) {
        smokeSprite = g_szVipSmokeSprite;
    }
  
    else {
        smokeSprite = g_szSmokeSprite;
    }

    message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
    write_byte( TE_FIREFIELD );
    engfunc( EngFunc_WriteCoord, vOrigin[ 0 ] );
    engfunc( EngFunc_WriteCoord, vOrigin[ 1 ] );
    engfunc( EngFunc_WriteCoord, vOrigin[ 2 ] + 50 );
    write_short( 100 );
    write_short( smokeSprite );
    write_byte( g_iCountSprites );
    write_byte( TEFIRE_FLAG_ALPHA );
    write_byte( 11 );
    message_end();

    message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
    write_byte( TE_FIREFIELD );
    engfunc( EngFunc_WriteCoord, vOrigin[ 0 ] );
    engfunc( EngFunc_WriteCoord, vOrigin[ 1 ] );
    engfunc( EngFunc_WriteCoord, vOrigin[ 2 ] + 50 );
    write_short( 150 );
    write_short( smokeSprite );
    write_byte( 5 );
    write_byte( TEFIRE_FLAG_ALPHA | TEFIRE_FLAG_SOMEFLOAT );
    write_byte( 11 );
    message_end( );

    new Float:time = entity_get_float(iEntity,EV_FL_animtime);
    time = time - 0.25;

    if( time > 0.0 )
    {
        entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + 0.25 );
        entity_set_float( iEntity, EV_FL_animtime, time );
    }
    else
    {
        entity_set_int( iEntity, EV_INT_flags, FL_KILLME );
    }

    return PLUGIN_CONTINUE;
}
 

Download all Attachments

Сообщения
330
Реакции
93
Помог
2 раз(а)
zxchain, что именно ты хочешь сделать? Чтоб у випов был свой дым?
 
Сообщения
9
Реакции
1
Noob_with_cheats, да, получается свой спрайт дыма с анимацией и увеличенная длительность его действия. is_user_vip в коде это с инклюда самописной вип системы
 
Сообщения
9
Реакции
1
Noob_with_cheats, Сейчас попробую, вот ещё хотел сказать, register_think( g_szClassname, "FwdThink_BlackSmoke" ) который используется в коде, вызывается каждые 0.5с вроде бы после появления нового энтити, поэтому спрайты дыма двигаются.
В оригинале плагина, с которого взята часть кода (прикрепил его ниже), всё работает правильно и дым удаляется или как будто ещё не появляется (я ничего не вижу похожее на удаление), но там используется register_forward(FM_PlaybackEvent, "FwdPlaybackEvent") вместо CGrenade_ExplodeSmokeGrenade
1 Авг 2024
Noob_with_cheats, Да, спасибо, всё работает
 

Вложения

Последнее редактирование:

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

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