Entity SandBug aka Barricade

Сообщения
839
Реакции
519
Помог
12 раз(а)
А как же отладчик за авторством Garey ?
не чекал, дай ссылку
11 Апр 2024
всё сделать в одном паблике "HologramCreate
нет
я тебе предлагаю на событии установки мешка менять свойства объекта , чтобы из призрачного состояния перевести его в обычный
11 Апр 2024
но как мне заменить класс по нажатию на Е, через проверку если только но какую
в set_barricad'е вместо таска берешь объект, который у тебя записан в szBarricade[pPlayer], проверяешь что он существует и устанавливаешь там свойства
 
Сообщения
107
Реакции
10
BalbuR, Я вот что понял, что как бы я не пробовал вызвать CreateEntity, то он просто не работает...
Код:
public CreateEntity( pPlayer ) {
    static iAllocString;
    if (!iAllocString) iAllocString = engfunc(EngFunc_AllocString, "func_wall");

    new Ent = engfunc(EngFunc_CreateNamedEntity, iAllocString);
    
    set_pev( Ent , pev_classname , Class_Name );
    engfunc( EngFunc_SetModel, Ent,szModels[ random( sizeof szModels ) ] );
    
    new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecOrigin[3], Float:vecAngles[3];
    a_Mins = BARICADE_MINSIZE;
    a_Maxs = BARICADE_MAXSIZE;
    engfunc( EngFunc_SetSize, Ent, a_Mins, a_Maxs );
    set_pev( Ent, pev_mins, a_Mins );
    set_pev( Ent, pev_maxs, a_Maxs );
    set_pev( Ent, pev_absmin, a_Mins );
    set_pev( Ent, pev_absmax, a_Maxs );
    set_pev( Ent, pev_body, 3 );
    
    GetOriginAimEndEyes( Ent, 128, vecOrigin, vecAngles );
    engfunc( EngFunc_SetOrigin, Ent, vecOrigin );

    set_pev( Ent , pev_solid, SOLID_BBOX );
    set_pev( Ent , pev_movetype , MOVETYPE_FLY );
    
    //new Float:p_cvar_health = float(HealthBr[pPlayer]);
    set_pev( Ent, pev_health, HealthBr );
    set_pev( Ent, pev_takedamage, DAMAGE_YES );
    
    static Float:rvec[3];
    pev( pPlayer, pev_v_angle, rvec );
    
    rvec[0] = 0.0;
    
    set_pev( Ent, pev_angles, rvec );
    //set_pev( Ent, pev_owner, pPlayer );
    fm_drop_to_floor( Ent );
}
Хотя сделал как ты указал мне. даже если делать проверку на Мешки, то в данной проверке какими свойствами я должен поставить модель, по факту таким же способом как у меня указано в CreateEntity или есть возможность взять тот же HologramCreate и изменить класс.
Код:
if( szBarricade[ pPlayer ] > 0 )
Для ясности я понял, что мой Think который привязан HologramCreate отвечает за движение модели по прицелу. За это спасибо.
Я наверное уже утомил тебя. Реализовать не могу я. В написании кода я слаб, но если увижу пример, то сразу пойму что к чему)
 
Сообщения
839
Реакции
519
Помог
12 раз(а)
Хотя сделал как ты указал мне. даже если делать проверку на Мешки, то в данной проверке какими свойствами я должен поставить модель, по факту таким же способом как у меня указано в CreateEntity или есть возможность взять тот же HologramCreate и изменить класс.
для создания используй код из HollogramCreate

для установки свойств
PHP:
public CreateEntity( pPlayer ) {
    //static iAllocString;
    //if (!iAllocString) iAllocString = engfunc(EngFunc_AllocString, "func_wall");

    //new Ent = engfunc(EngFunc_CreateNamedEntity, iAllocString);
   
    set_pev( Ent , pev_classname , Class_Name );
    engfunc( EngFunc_SetModel, Ent,szModels[ random( sizeof szModels ) ] );
   
    new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecOrigin[3], Float:vecAngles[3];
    a_Mins = BARICADE_MINSIZE;
    a_Maxs = BARICADE_MAXSIZE;
    engfunc( EngFunc_SetSize, Ent, a_Mins, a_Maxs );
    //set_pev( Ent, pev_mins, a_Mins );
    //set_pev( Ent, pev_maxs, a_Maxs );
    //set_pev( Ent, pev_absmin, a_Mins );
    //set_pev( Ent, pev_absmax, a_Maxs );
    set_pev( Ent, pev_body, 3 );
   
    //GetOriginAimEndEyes( Ent, 128, vecOrigin, vecAngles );
    //engfunc( EngFunc_SetOrigin, Ent, vecOrigin );

    set_pev( Ent , pev_solid, SOLID_BBOX );
    set_pev( Ent , pev_movetype , MOVETYPE_FLY );
   
    //new Float:p_cvar_health = float(HealthBr[pPlayer]);
    set_pev( Ent, pev_health, HealthBr );
    set_pev( Ent, pev_takedamage, DAMAGE_YES );
   
    //static Float:rvec[3];
    //pev( pPlayer, pev_v_angle, rvec );
   
    //rvec[0] = 0.0;
   
    //set_pev( Ent, pev_angles, rvec );
    //set_pev( Ent, pev_owner, pPlayer );
    //fm_drop_to_floor( Ent );
}
12 Апр 2024
в этот блок вставляешь свойства
1712888115004.png
 

Вложения

Сообщения
107
Реакции
10
BalbuR, Привет, ты это имел ввиду?
Код:
public set_barricade( pPlayer ) {
    if(CanBePlaced[ pPlayer ] == 2) {
    HologramCreate( pPlayer );
    return PLUGIN_CONTINUE;
    } else if( szBarricade[ pPlayer ] > 0 ) {
    //CreateEntity( pPlayer );
    new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));
    
    set_pev( Ent , pev_classname , Class_Name );
    engfunc( EngFunc_SetModel, Ent,szModels[ random( sizeof szModels ) ] );
    
    new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecOrigin[3], Float:vecAngles[3];
    a_Mins = BARICADE_MINSIZE;
    a_Maxs = BARICADE_MAXSIZE;
    engfunc( EngFunc_SetSize, Ent, a_Mins, a_Maxs );
    set_pev( Ent , pev_solid, SOLID_BBOX );
    set_pev( Ent , pev_movetype , MOVETYPE_FLY );
    set_pev( Ent, pev_health, HealthBr );
    set_pev( Ent, pev_takedamage, DAMAGE_YES );
    
    szBarricade[ pPlayer ]-= 1
    PlayerOwner[ pPlayer ]-= 1
    }
    return PLUGIN_HANDLED;
}

Хорошо, я понял, что я должен сделать спавн объекта сразу как нажимаю Е, то есть в set_barricade. Но давай пожалуйста решим вопрос, почему у меня на Е не происходит ничего?
Действия: Покупаю екстра --> появляется entity перед прицелом и двигается в направлении его --> Нажимаю Е и ничего не происходит, entity так же таскается за моим прицелом и даже не пропадает.

Код:
public client_PreThink( pPlayer ) {
    new buttons = pev( pPlayer, pev_button )
    new oldbuttons = pev( pPlayer, pev_oldbuttons )
    
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 )
        return PLUGIN_HANDLED;
    
    if ( buttons & IN_USE && ~oldbuttons & IN_USE) {
        set_barricade( pPlayer );
    }
    return PLUGIN_HANDLED;
}

У тебя есть возможность теста плагина? могу дать IP где тест провожу я.
12 Апр 2024
Всё, понял. Добавил в set_barricade код из HologramCreate, вроде установилась , только теперь пропускает всех:pardon:
 
Сообщения
107
Реакции
10
BalbuR, Прочитав по 5 раз, начал понимать что к чему. По итогу оно заработало, но есть другой нюанс.
Первая покупка и установка проходит как задумывалась, но вот второй раз когда покупаешь, то HologramCreate Think не появляется.
Но мне так же выдаёт HUD о том что нужно нажать Е для установки и так же она ставится. Как я думаю где-то я не обновляю
Код:
szBarricade[ pPlayer ] = 0 
PlayerOwner[ pPlayer ] = 0
Но точно ли в этом вся проблема? На данный момент сделано вот так...
Код:
public client_PreThink( pPlayer ) {
    new buttons = pev( pPlayer, pev_button )
    new oldbuttons = pev( pPlayer, pev_oldbuttons )
    
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 )
        return PLUGIN_HANDLED;
    
    if ( buttons & IN_USE && ~oldbuttons & IN_USE) {
        set_barricade( pPlayer );
        szBarricade[ pPlayer ]-= 1
        PlayerOwner[ pPlayer ]-= 1
    }
    return PLUGIN_HANDLED;
}

public set_barricade( pPlayer ) {
    new Int = sz_Br[ pPlayer ];
    Int = create_entity( "info_target" );
    if(CanBePlaced[ pPlayer ] == 2) {
    HologramCreate( pPlayer );
    return PLUGIN_CONTINUE;
    } else if( szBarricade[ pPlayer ] > 0 ) {
    if ( sz_Br[ pPlayer ] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
    if( !Int )
    return PLUGIN_HANDLED;

    new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecAngles[3];
    a_Mins = BARICADE_MINSIZE;
    a_Maxs = BARICADE_MAXSIZE;
    
    GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles );
    
    engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
    engfunc( EngFunc_SetOrigin, Int, szOrigin );
    
    set_pev( Int, pev_classname, Class_Name );
    engfunc( EngFunc_SetSize, Int, a_Mins, a_Maxs );
    set_pev( Int, pev_body, 3 );
    set_pev( Int, pev_nextthink, get_gametime() );
    set_pev( Int, pev_solid, SOLID_BBOX );
    set_pev( Int, pev_movetype , MOVETYPE_FLY );
    set_pev( Int, pev_health, HealthBr );
    set_pev( Int, pev_takedamage, DAMAGE_YES );
    sz_Br[ pPlayer ] = Int;
    
    szBarricade[ pPlayer ] = 0
    PlayerOwner[ pPlayer ] = 0
    }
    return PLUGIN_HANDLED;
}

public HologramCreate( pPlayer ) {
    new Int = sz_Br[ pPlayer ];
    if ( Int > 0 && is_valid_ent( Int ) ) {
        // engfunc( EngFunc_SetOrigin, Int, szOrigin );
        // по идее ниче не делаем, в синке объекта перемещаемся
    } else {
        Int = create_entity( "info_target" );
        if( !Int )
            return PLUGIN_HANDLED;
        static Float:vecAngles[3]
        GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles )
        engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
        engfunc( EngFunc_SetOrigin, Int, szOrigin );
        set_pev( Int, pev_classname, Class_Name_Fake );
        set_pev( Int, pev_owner, pPlayer );
        set_pev( Int, pev_rendermode, kRenderTransAdd );
        set_pev( Int, pev_renderamt, 200.0 );
        set_pev( Int, pev_body, 1 );
        set_pev( Int, pev_nextthink, get_gametime() );
        set_pev( Int, pev_solid, SOLID_NOT );
        set_pev( Int, pev_movetype, MOVETYPE_FLY ); // Movestep <- for Preview   
    
        sz_Br[ pPlayer ] = Int;
    }
    return PLUGIN_HANDLED;
}

public ThinkBarricade( Barricade ) {
    if (pev_valid( Barricade ) != 2)
        return PLUGIN_CONTINUE;

    static pOwner;
    pOwner = pev( Barricade, pev_owner );
    
    if ( !is_user_alive( pOwner ) )
        return PLUGIN_HANDLED;
        
    static iBody, Float:vecColor[3], Float:vecAngles[3];

    GetOriginAimEndEyes( pOwner, 128, szOrigin, vecAngles );
    iBody = 2
    xs_vec_set( vecColor, 100.0, 100.0, 100.0 );
    engfunc( EngFunc_SetOrigin, Barricade, szOrigin );   

    if ( !IsHullVacant( szOrigin, HULL_HEAD, Barricade ) ) {
        if( Check_CreateBr() || Check_HologramBr() ) {
        iBody = 1
        xs_vec_set( vecColor, 0.0, 250.0, 0.0 );
        }
    }   
    
    CanBePlaced[ pOwner ] = iBody;
    set_pev( Barricade, pev_angles, vecAngles );
    set_pev( Barricade, pev_body, iBody );
    set_pev( Barricade, pev_nextthink, get_gametime() + 0.01 );
    
    return PLUGIN_HANDLED;
}

Так же прикреплю видео для лучшего понимания!
 
Сообщения
839
Реакции
519
Помог
12 раз(а)


1712922309999.png



PHP:
public client_PreThink( pPlayer ) {
    new buttons = pev( pPlayer, pev_button )
    new oldbuttons = pev( pPlayer, pev_oldbuttons )
    
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 )
        return PLUGIN_HANDLED;
    
    if ( buttons & IN_USE && ~oldbuttons & IN_USE) {
        set_barricade( pPlayer );
        // Зачем сразу отнимаешь, если ты еще не установил?
        // szBarricade[ pPlayer ]-= 1
        // PlayerOwner[ pPlayer ]-= 1 // это вообще для чего? че оно вщ делает? если считает количество мешков, то нахрена отнимаешь?
    }
    return PLUGIN_HANDLED;
}


public set_barricade( pPlayer ) {
    // new Int = sz_Br[ pPlayer ]; // нет смысла сразу ее подбирать, подбираем после HologramCreate, т.к. в нем обрабатывается валидность и создание
    // Нафига создаешь еще один объект, если у тебя в HologramCreate уже создается и проверяется на наличие?
    // Int = create_entity( "info_target" ); 

    HologramCreate( pPlayer ); // Здесь нужен
    new Int = sz_Br[ pPlayer ];
    // перетащил сюда
    GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles );
    engfunc( EngFunc_SetOrigin, Int, szOrigin );
    if(CanBePlaced[ pPlayer ] == 2) {
       // HologramCreate( pPlayer ); Тут он не нужен!
        // ТУТ ПО УСЛОВИЮ СТАВИШЬ СВОЙСТВА, т.к. ПО УСЛОВИЮ НИЧЕГО НЕ МЕШАЕТ УСТАНОВКЕ (смотри синк объекта)
        
        new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecAngles[3];
        a_Mins = BARICADE_MINSIZE;
        a_Maxs = BARICADE_MAXSIZE;
        
        // GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles );
        
        engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
        // engfunc( EngFunc_SetOrigin, Int, szOrigin );
        
        set_pev( Int, pev_classname, Class_Name );
        engfunc( EngFunc_SetSize, Int, a_Mins, a_Maxs );
        set_pev( Int, pev_body, 3 );
        set_pev( Int, pev_nextthink, get_gametime() );
        set_pev( Int, pev_solid, SOLID_BBOX );
        set_pev( Int, pev_movetype , MOVETYPE_FLY );
        set_pev( Int, pev_health, HealthBr );
        set_pev( Int, pev_takedamage, DAMAGE_YES );
        sz_Br[ pPlayer ] = 0; // сбарываем айди с переменной с таскаемым объектом
        
        //Отнимай количество тут при успешной проверке установки
        szBarricade[ pPlayer ]-= 1 // а зачем их 2
        PlayerOwner[ pPlayer ]-= 1; // все еще не понял
        return PLUGIN_CONTINUE;    
    } 
    // Зачем? не понял
    //else if( szBarricade[ pPlayer ] > 0 ) { 
    // if ( sz_Br[ pPlayer ] && is_valid_ent( sz_Br[ pPlayer ] ) )
        // remove_entity( sz_Br[ pPlayer ] ); 
    
    // Эти свойсвтва ставим выше
    //if( !Int ) 
    // return PLUGIN_HANDLED;
    // new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecAngles[3];
    // a_Mins = BARICADE_MINSIZE;
    // a_Maxs = BARICADE_MAXSIZE;
    
    // GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles );
    
    // engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
    // engfunc( EngFunc_SetOrigin, Int, szOrigin );
    
    // set_pev( Int, pev_classname, Class_Name );
    // engfunc( EngFunc_SetSize, Int, a_Mins, a_Maxs );
    // set_pev( Int, pev_body, 3 );
    // set_pev( Int, pev_nextthink, get_gametime() );
    // set_pev( Int, pev_solid, SOLID_BBOX );
    // set_pev( Int, pev_movetype , MOVETYPE_FLY );
    // set_pev( Int, pev_health, HealthBr );
    // set_pev( Int, pev_takedamage, DAMAGE_YES );
    // sz_Br[ pPlayer ] = Int;
    
    // зачем?
    // szBarricade[ pPlayer ] = 0
    // PlayerOwner[ pPlayer ] = 0
    // }
    return PLUGIN_HANDLED;
}
public HologramCreate( pPlayer ) {
    new Int = sz_Br[ pPlayer ];
    if ( Int > 0 && is_valid_ent( Int ) ) {
        // engfunc( EngFunc_SetOrigin, Int, szOrigin );
        // по идее ниче не делаем, в синке объекта перемещаемся
    } else {
        Int = create_entity( "info_target" );
        if( !Int )
            return PLUGIN_HANDLED;
        static Float:vecAngles[3]
        GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles )
        engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
        engfunc( EngFunc_SetOrigin, Int, szOrigin );
        set_pev( Int, pev_classname, Class_Name_Fake );
        set_pev( Int, pev_owner, pPlayer );
        set_pev( Int, pev_rendermode, kRenderTransAdd );
        set_pev( Int, pev_renderamt, 200.0 );
        set_pev( Int, pev_body, 1 );
        set_pev( Int, pev_nextthink, get_gametime() );
        set_pev( Int, pev_solid, SOLID_NOT );
        set_pev( Int, pev_movetype, MOVETYPE_FLY ); // Movestep <- for Preview   
    
        sz_Br[ pPlayer ] = Int;
    }
    return PLUGIN_HANDLED;
}

сомнительно, но ok
 
Сообщения
107
Реакции
10
BalbuR,
Код:
if(CanBePlaced[ pPlayer ] == 2)
Это вообще проверка на невесомость, по твоему примеру теперь только в воздухе могу ставить мешки/
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
фонтанчик из памяти
Что происходит, когда мы вызываем engfunc(EngFunc_AllocString, "sime_string") ?
Fakemeta EngFunc_AllocString -> ReHLDS enginefuncs_s::pfnAllocString == enginefuncs_t::AllocEngineString

Видим, что в ReHLDS изменили постоянное выделение памяти на строку:
C++:
char *ED_NewString(const char *string)
{
    char *new_s;

    // Engine string pooling
#ifdef REHLDS_FIXES

    // escaping is done inside Ed_StrPool_Alloc()
    new_s = Ed_StrPool_Alloc(string); // <---------

#else // REHLDS_FIXES
...
#endif // REHLDS_FIXES

    return new_s;
}
В Ed_StrPool_Alloc() происходит получение ключа-строки из пула, если имеется, и не выделяется новая память.

Вывод:
При использовании ReHLDS можно вызывать Fakemeta EngFunc_AllocString без предварительного кеширования, память не будет "течь", так как фактического выделения памяти под новую строку, которая уже имеется в пуле строк, не происходит.

Если используется legacy HLDS, там необходимо кешировать вызовы Fakemeta EngFunc_AllocString, во избежание ненамеренного выделения памяти и утечки.
 
Последнее редактирование:
Сообщения
839
Реакции
519
Помог
12 раз(а)
1712927634117.png

если !HullVacant (точка занята), тогда iBody = 1

код проверял?
12 Апр 2024
ты можешь использовать engfunc(EngFunc_WalkMove чтобы drop_to_floor'ить объект, а так же проверять может ли он быть установлен или нет
так даже проще будет
PHP:
            if (!engfunc(EngFunc_WalkMove, iEntity, 0.0, 0.0, WALKMOVE_NORMAL))
            {
                set_ced(iEntity, ced_int, ceCustom_BarricadeState, CANT_BE_PLACED);
                rg_set_ent_render(iEntity, kRenderFxGlowShell, 200, 0, 0, kRenderTransAdd, 15);
            }
            else
            {
                set_ced(iEntity, ced_int, ceCustom_BarricadeState, CAN_BE_PLACED);
                rg_set_ent_render(iEntity, kRenderFxGlowShell, 235, 224, 14, kRenderTransAdd, 15);
            }



Код:
public zp_grenade_postframe(id, grenade, grenadetype, activegrenade, bZombie)
{
    if (bZombie)
        return;

    if (grenadetype == GRENADETYPE)
    {
        if (g_iGrenadeID == activegrenade)
        {
            static Float:flGameTime, bitsOldButtons;

            flGameTime = get_gametime();
            bitsOldButtons = get_entvar(id, var_oldbuttons);

            static iEntity; iEntity = get_ced(grenade, ced_int, ceCustom_BarricadeIndex);

            if (is_nullent(iEntity) || !FClassnameIs(iEntity, szMineClassName) || get_ced(grenade, ced_int, ceCustom_Barricade_Weapon_Key) != get_ced(iEntity, ced_int, ced_global_entity_key))
            {
                iEntity = CreateMine(id, grenade);
                
                if (is_nullent(iEntity))
                {
                    return;
                }
            }
    
            set_ced(grenade, ced_int, ceCustom_BarricadeIndex, iEntity);
            set_ced(iEntity, ced_int, ceCustom_BarricadeWeaponIndex, grenade);
            new Float:flDistance = floatclamp(get_ced(iEntity, ced_float, ceCustom_BarricadeDistance), 30.0, 100.0);

            new Float:flOrigin[3], Float:flAngles[3], Float:flVec[3];

            get_entvar(id, var_origin, flOrigin);
            get_entvar(id, var_v_angle, flAngles);

            angle_vector(flAngles, ANGLEVECTOR_FORWARD, flVec);

            flOrigin[0] += flVec[0] * flDistance;
            flOrigin[1] += flVec[1] * flDistance;
            flOrigin[2] += flVec[2] * flDistance;

            set_entvar(iEntity, var_origin, flOrigin);
            get_entvar(id, var_angles, flAngles);
            flAngles[0] = 0.0;
            set_entvar(iEntity, var_angles, flAngles);

            if (!engfunc(EngFunc_WalkMove, iEntity, 0.0, 0.0, WALKMOVE_NORMAL))
            {
                set_ced(iEntity, ced_int, ceCustom_BarricadeState, CANT_BE_PLACED);
                rg_set_ent_render(iEntity, kRenderFxGlowShell, 200, 0, 0, kRenderTransAdd, 15);
            }
            else
            {
                set_ced(iEntity, ced_int, ceCustom_BarricadeState, CAN_BE_PLACED);
                rg_set_ent_render(iEntity, kRenderFxGlowShell, 235, 224, 14, kRenderTransAdd, 15);
            }

            if (bitsOldButtons & IN_USE)
            {
                if (bitsOldButtons & IN_ATTACK)
                {
                    set_ced(iEntity, ced_float, ceCustom_BarricadeDistance, flDistance + 0.4);
                }
                else if (bitsOldButtons & IN_ATTACK2)
                {
                    set_ced(iEntity, ced_float, ceCustom_BarricadeDistance, flDistance - 0.4);
                }
            }
            else if (bitsOldButtons & IN_ATTACK)
            {
                if (get_ced(iEntity, ced_int, ceCustom_BarricadeState) == CAN_BE_PLACED)
                {
                    set_ced(iEntity, ced_int, ceCustom_BarricadeState, PLACED);
                    engfunc(EngFunc_SetSize, iEntity, flMinSize, flMaxSize);

                    //new Float:flHealth;

                    //flHealth = get_ced(grenade, ced_string, ced_grenade_str_BarricadeHealth);
                    //set_entvar(iEntity, var_health, flHealth == 0.0 ? BARRICADE_HEALTH : flHealth);

                    for (new i = ArraySize(g_aBarricadesHPInBackPack) - 1; i>=0; i--)
                    {
                        if (ArrayGetCell(g_aBarricadesHPInBackPackOwner, i) == id)
                        {
                            set_entvar(iEntity, var_health, Float:ArrayGetCell(g_aBarricadesHPInBackPack, i));
                            
                            ArrayDeleteItem(g_aBarricadesHPInBackPack, i);
                            ArrayDeleteItem(g_aBarricadesHPInBackPackOwner, i--);
                            break;
                        }
                    }

                    set_entvar(iEntity, var_nextthink, flGameTime + 0.01);
                    SetThink(iEntity, "fw_ThinkBarricade");
                    set_entvar(iEntity, var_solid, SOLID_BBOX);
                    zp_grenade_set_ammo(id, grenade, activegrenade, -1);
                    rg_set_ent_render(iEntity);

                    set_ced(grenade, ced_int, ceCustom_BarricadeIndex, 0);

                    ArrayPushCell(g_aBarricades, iEntity);
                    ArrayPushCell(g_aBarricadesKey, zp_register_entity_key(iEntity));

                    zp_traceitem_add(iEntity);
                    zp_tracelogos_add(iEntity);
                }
            }

            set_member(grenade, m_Weapon_flNextSecondaryAttack, 1.0);
            set_member(grenade, m_Weapon_flNextSecondaryAttack, 1.0);
            set_member(grenade, m_Weapon_flTimeWeaponIdle, 1.0);
        }
    }
}
 
Сообщения
107
Реакции
10
BalbuR, Да, но сделал абсолютно как ты указал, ставиться в небе, на земле просто return;
Сейчас поменял местами и всё по сути работает, но не могу понять почему модель при установке в прозрачном виде, а не по стандарту.
Так же если есть возможность как мне сделать проверку на кол-во в общем мешков на игрока на текущий раунд. Что бы к примеру больше 3 установить не мог.

Вот так работает как хотелось.
Код:
public set_barricade( pPlayer ) {
    new Int = sz_Br[ pPlayer ];
    new Float:vecAngles[3]

    GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles );
    engfunc( EngFunc_SetOrigin, Int, szOrigin );
    if(CanBePlaced[ pPlayer ] == 2) {
        client_printcolor( pPlayer, "!y[!gZP!y] Нее, тормози, можно только на земле" )
        HologramCreate( pPlayer );
        return PLUGIN_CONTINUE;
    }   
        new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ];
        a_Mins = BARICADE_MINSIZE;
        a_Maxs = BARICADE_MAXSIZE;
        
        engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
        
        set_pev( Int, pev_classname, Class_Name );
        engfunc( EngFunc_SetSize, Int, a_Mins, a_Maxs );
        set_pev( Int, pev_body, 3 );
        set_pev( Int, pev_nextthink, get_gametime() );
        set_pev( Int, pev_solid, SOLID_BBOX );
        set_pev( Int, pev_movetype , MOVETYPE_FLY );
        set_pev( Int, pev_health, HealthBr );
        set_pev( Int, pev_takedamage, DAMAGE_YES );
        sz_Br[ pPlayer ] = 0; // сбарываем айди с переменной с таскаемым объектом
        
        //Отнимай количество тут при успешной проверке установки
        szBarricade[ pPlayer ]-= 1 // а зачем их 2
        return PLUGIN_CONTINUE;
}

Насчет:
Код:
if ( !IsHullVacant( szOrigin, HULL_HEAD, Barricade ) ) {
        if( Check_CreateBr() || Check_HologramBr() ) {
        iBody = 1
        xs_vec_set( vecColor, 0.0, 250.0, 0.0 );
        }
    }
Как я понял он не блокирует установку, но он меняет субмодель где она красная когда ты объект засовываешь в стену или держишь в воздухе.
12 Апр 2024
Еще где-то в коде дырка, сервер периодически уходит в падение в консоли одна ошибка Segmentation fault (core dumped) .
Каждые 30 минут
 

Вложения

Сообщения
839
Реакции
519
Помог
12 раз(а)
зачем вниз убрал?
у тебя в hologramCreate проверяется есть он уже или требуется создать
конструкция конечно не очень
а падает скорее всего из-за того, что ты не проверяешь на валидность объект ,перед тем как его использовать в функциях и свойствах

1712932862961.png
1712932855194.png
 
Сообщения
107
Реакции
10
BalbuR, zp_extra_item_selected там и изначально был вызов HologramCreate , для того что бы после покупки в магазине сразу выводилась проекция модели перед прицелом. По этому её не нужно вызывать в set_barricade , если только в проверке if(CanBePlaced[ pPlayer ] == 2) для того что бы при срабатывании проекция модели не пропадала а возобновлялась снова. То что ты подчеркнул на первом скриншоте это было взято с твоего ответа с кодом где ты указал по полочкам что за что отвечает вот и всё.
Хотел бы понять что в этом не так и за что это отвечает engfunc( EngFunc_SetOrigin, Int, szOrigin );

Прозрачность модели так и не догнал как убрать:
1712936372447.png

Насчет валидности - достаточно сделать проверку что объект есть ? в set_barricade
Код:
if( !is_valid_ent( sz_Br[ pPlayer ] ) )
        return PLUGIN_HANDLED;
 
Сообщения
107
Реакции
10
BalbuR, Решил вопрос по поводу прозрачности модели, простой командой fm_set_user_rendering( Int );
Ну и помимо этого для реалистичности добавил перед установкой эффект голограммы, можно посмотреть на видео.

Но заметил что купить повторно мне дает только через какое-то время. Это всё из-за get_systime как я понял который у меня в:
Код:
public zp_extra_item_selected( pPlayer, itemid ) {
    if( sz_LastHud[ pPlayer ] > get_systime() )
        return PLUGIN_HANDLED;
    
    if ( itemid == szItem ) {
    if( szBarricade[ pPlayer ] > 0 ) {
        client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
        zp_set_user_ammo_packs( pPlayer, zp_get_user_ammo_packs( pPlayer ) + 5 );
        return PLUGIN_HANDLED;
    }
    szBarricade[ pPlayer ]+= 1
    HologramCreate( pPlayer );
    set_hudmessage( 100, 100, 100, -1.0, 0.8, 0, 6.0, 2.0, 1.0, 1.0 );
    show_hudmessage( pPlayer, "Что бы установить баррикаду^nНажми на [Е]" );
    sz_LastHud[ pPlayer ] = get_systime() + 12
    }
    return PLUGIN_HANDLED;
}
Правильным решением будет если я его перенесу в отдельный паблик и сделаю там HUD, делал всё это для того что бы HUD дольше держался на экране. Если я не прав, поправьте меня :wacko:

 
Сообщения
839
Реакции
519
Помог
12 раз(а)
engfunc( EngFunc_SetOrigin, Int, szOrigin );
устанавливает местоположение объекта
проблема в том, что перед действием не проверяешь объект. Тот что ты хранишь в переменной мог быть уже удален и его место может занять другой объект
 
Сообщения
107
Реакции
10
Насчет валидности - достаточно сделать проверку что объект есть ? в set_barricade
C++:
if( !is_valid_ent( sz_Br[ pPlayer ] ) )
return PLUGIN_HANDLED;
Сделал короче так, сервер больше не падает, кст по поводу блокировки установки для игрока мне не понадобилось, это функция есть в BuyMenu.
Спасибо тебе за помощь, у меня еще есть вопросы, но думаю посижу пока сам погуглю что к чему. Мем с котами смешной :blush2:
 
Сообщения
839
Реакции
519
Помог
12 раз(а)
Насчет валидности - достаточно сделать проверку что объект есть ? в set_barricade
можно еще класснейм проверять

Код:
//если reapi
FClassnameIs(iEnt, Class_Name_Fake)

Код:
//если fakemeta

new g_iAllocClassName;

public plugin_init()
{
g_iAllocClassName = engfunc(EngFunc_AllocString, Class_Name_Fake);
}


// когда создаешь объект и настраиваешь свойства
set_pev_string(iEnt, pev_classname, g_iAllocClassName);

//проверка в функциях
if (pev(iEnt, pev_classname) == Class_Name_Fake) {

}
по факту pev_classname все еще остается строкой, просто передает значение выделенной строки и при проверках все еще будет выдавать строковое значение, если требуется
 
Последнее редактирование:
Сообщения
107
Реакции
10
BalbuR, Спасибо , буду использовать. Подскажи пожалуйста, добавил определение урона и убийства Entity но почему-то по классу оно не видит как будто. В игре не работает крч.
Код:
public fw_TakeDamage( victim, inflictor, attacker, Float:damage, damage_type ) {
    new sz_classname[ 32 ]
    entity_get_string( victim, EV_SZ_classname , sz_classname, 31 )
    new szHealth = pev( victim, pev_health )-floatround( damage );
    
    if( szHealth<=0 ) {
        szHealth=1;
    }
    
    if( !equali( sz_classname, Class_Name ) )
    return HAM_IGNORED;
    
    else if( szHealth < 400 ) {
        fm_set_rendering ( victim, kRenderFxGlowShell, 255, 10, 10, kRenderNormal, 16) // Если меньше 400 хп у баррикады, она будет выделена Красным.
    }
    else if( szHealth < 950 ) {
        fm_set_rendering ( victim, kRenderFxGlowShell, 255, 200, 100, kRenderNormal, 16) // Если меньше 950 хп у баррикады, она будет выделена Желтым.
    }
    else if( szHealth < 1450 ) {
        fm_set_rendering ( victim, kRenderFxGlowShell, 10, 255, 10, kRenderNormal, 16)  // Если меньше 1450 хп у баррикады, она будет выделена Зеленым.
    }
    if( zp_get_user_zombie( attacker ) )
    return HAM_IGNORED;

    return HAM_SUPERCEDE;
}
public fw_PlayerKilled( victim, attacker, shouldgib, pPlayer )
{     
    new sz_classname[ 32 ], Float: health
    entity_get_string( victim , EV_SZ_classname , sz_classname, charsmax( sz_classname ) )
    health = entity_get_float( victim, EV_FL_health )
    if( equal( sz_classname, Class_Name ) && is_valid_ent( victim ) && zp_get_user_zombie( attacker ) && health <= 0.0 ) {
        client_printcolor( pPlayer ,"!t[!gZN!t] !yТы получил !g5 !yAmmoPacks, уничтожив мешки с песком" )
        return HAM_IGNORED;
    }
    if( sz_Br[ pPlayer ] && is_valid_ent( sz_Br[ pPlayer ] ) )
            remove_entity( sz_Br[ pPlayer ] );
    return HAM_IGNORED;
}
13 Апр 2024
Хотя, возможно тут нужно указывать не func_wall ...
Код:
RegisterHam( Ham_TakeDamage,"func_wall","fw_TakeDamage" );
RegisterHam( Ham_Killed, "func_wall", "fw_PlayerKilled", 1 );
 
Сообщения
839
Реакции
519
Помог
12 раз(а)
ham_killed не отловит уничтожение кастомной entity, насколько я помню


а тут у тебя получение ХП неверное.
1712998053162.png

PHP:
new Float:flHealth;
pev(victim, pev_health, flHealth);
flHealth -= damage;

if (flHealth <= 0) {
// тут пишешь что будет, если объект будет удален
// он удалится в любом случае, однако нужно произвести свои действия, например сброс своих переменных в плагине
}
13 Апр 2024
еще тебе нужно избавиться от var_owner, если используешь. Так как он игнорирует для владельца коллизию, трейс до объекта, нанесение урона (вещи взаимосвязанные)
 
Сообщения
107
Реакции
10
Вообще могу я не создавать новую тему , а писать в этой?

Я тут как-то интересовался анимация-ми у моделей. Так вот ты мне дал ответ:
смотришь в модели оружия Frames (кадры) и FPS, далее делишь одно на другое и получаешь время
веапонкей любой, главное чтобы они не пересекались
Я взял модель и поделил, получил значение указал в плагине, но анимации всё ровно криво срабатывают. Хотел бы узнать может я что-то не так сделал?


Данные в коде:
Код:
#define IDLE_ANIM 0
#define IDLE_SPEED 15.0
#define ATTACK1_ANIM 2
#define ATTACK1_SPEED 1.68
#define ATTACK2_ANIM 5
#define ATTACK2_SPEED 1.17
#define STAB_ANIM 4
#define STAB_SPEED 1.56
#define DRAW_ANIM 3
#define DRAW_SPEED 1.03
 

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

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