Entity SandBug aka Barricade

Сообщения
60
Реакции
6
Можете помочь, что я делаю не так, указать на ошибки и предложить более рациональные варианты.

Надо что бы при покупке появлялась Фейковая модель (Проекция) и следовала за тем куда я смотрю (Aim), после чего на Е ставилась адекватно и проходить что бы никто не мог! я уже устал... Меню сделано для теста.

Проблема в том, что при покупке объект появляется передо мной там куда смотрю и всё, то есть регается на полу сразу за моим курсором не ходит.

<Код>

Код:
#include < amxmodx >
#include < amxmisc >
#include < fun >
#include < cstrike >
#include < engine >
#include < fakemeta_util >
#include < zombienightmare >

// from fakemeta util by VEN
#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
#define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1)
// this is mine
//#define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1)

#define MAX_COUNT               2                               // макс количество барикад для обычного игрока
#define MAX_COUNT_V             3                                 // макс количество барикад для VIP игрока

#define FLAG_V                    ADMIN_LEVEL_H                    // Флаг VIP игрока (t)

const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

new const Float: BARICADE_MINSIZE[] = { -30.0, -30.0, -30.0 };
new const Float: BARICADE_MAXSIZE[] = { 30.0, 30.0, 30.0 };
new const Float: HealthBr[] = { 550.0 };

new szModels[][] =
{
    "models/ls_sandbags.mdl"
}

new const Class_Name[] = "Barricade"
new const Class_Name_Fake[] = "Barricade_fake"
new CanBePlaced[33], szBarricade[33], PlayerOwner[33], sz_Br[33], szItem, g_iMaxPlayers;
new Float:szOrigin[3];


public plugin_precache() {
    for( new i;i < sizeof szModels;i++ )
    engfunc( EngFunc_PrecacheModel, szModels[i] );
}

public plugin_init() {
    register_plugin(
    "[ZN] Addon: Barricade",
    "0.1 (Beta)",
    "Kulogram"
    );
    register_menu( "clcmd_Menu_Spawn", KEYSMENU, "function" );
    register_clcmd( "say /br", "clcmd_Menu_Spawn" );
    
    register_logevent("RoundEnd",2,"1=Round_End");
    register_think( Class_Name_Fake, "ThinkBarricade" );
    register_forward(FM_OnFreeEntPrivateData, "OnFreeEntPrivateData");
    
    //BarTime = get_user_msgid( "BarTime" );
    szItem = zp_register_extra_item( "Barricade", 10, ZP_TEAM_HUMAN );
}

public RoundEnd() {
    new Ent
    while( ( Ent = find_ent_by_class( Ent, Class_Name) ) )
    if( is_valid_ent( Ent ) )
        remove_allpalletswbags();
}

public zp_user_infected_post( pPlayer ){
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public client_disconnected( pPlayer ) {   
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public zp_fw_core_infect(pPlayer) {
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public OnFreeEntPrivateData(pPlayer)
{
    if (!FClassnameIs(pPlayer, Class_Name_Fake) )
        return FMRES_IGNORED;
    
    new pOwner = pev(pPlayer, pev_owner);

    if ((1 <= pOwner <= g_iMaxPlayers))
        sz_Br[pOwner] = 0;
    return FMRES_IGNORED;
}

public client_PreThink( pPlayer ) {
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 ) return;
    if( get_user_button( pPlayer ) & IN_USE ) {
        szBarricade[ pPlayer ]-= 1
        HologramCreate( pPlayer );
    }
}

public clcmd_Menu_Spawn( pPlayer ) {
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) ) {
        client_printcolor( pPlayer, "!t[!gZP!t] !yДоступно только живым игрокам. (Зомби тоже недоступно)" );
        return PLUGIN_HANDLED;
    }
    
    static Menu[ 650 ], iLen
    iLen = 0
    
    iLen = formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y[*] \wZombieNightmare^n\y[*] \wМеню барьеров^n\y[*] \d(Барикад - %d шт.)^n^n", szBarricade[pPlayer] );
    
    if( szBarricade[ pPlayer ] > 0 )
    iLen += formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y1. \wПоставить палет с мешками^n" );
    else
    iLen += formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y1. \dПоставить палет с мешками \r(У тебя их нет!)^n" );
    
    show_menu( pPlayer , KEYSMENU , Menu , -1 , "clcmd_Menu_Spawn" );
    return PLUGIN_HANDLED;
}

public function( pPlayer, key ) {
    switch( key ) {
    case 0: {
            if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) ) {
                client_printcolor( pPlayer, "!t[!gZP!t] !yДоступно только живым игрокам. (Зомби тоже недоступно)" );
                return PLUGIN_HANDLED;
            }
            if( szBarricade[ pPlayer ] < 1 ) {   
                set_hudmessage( 100, 100, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0 );
                show_hudmessage( pPlayer, "У тебя нет^nкупленных барикад" );
            } else {
                szBarricade[pPlayer] -= 1 ;
                HologramCreate( pPlayer );
                clcmd_Menu_Spawn( pPlayer );
                if(PlayerOwner[ pPlayer ] > 0 ) {
                    PlayerOwner[ pPlayer ] -= 1
                }
            }
        }
    }
    return PLUGIN_HANDLED;
}

public HologramCreate( pPlayer ) {
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
    
    new 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;
}

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

    static pOwner;
    pOwner = pev( Barricade, pev_owner );
    
    if (!(1 <= pOwner <= g_iMaxPlayers) || !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;
}

public 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_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 );
    
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public Check_CreateBr() {
    static victim
    victim = -1
    while ( ( victim = find_ent_in_sphere( victim, szOrigin, 200.0 ) ) != 0 ) {
        new sz_classname[32];
        entity_get_string( victim , EV_SZ_classname , sz_classname, 31 );
        if( !equali( sz_classname, Class_Name ) )
        {
        //our dude has sandbags and wants to place them near to him
        if( is_user_connected( victim ) && is_user_alive( victim ) && PlayerOwner[ victim ] == 0 )
            return false;
        }
    }
    return true
}

public Check_HologramBr() {
    static victim
    victim = -1
    while ( ( victim = find_ent_in_sphere( victim, szOrigin, 200.0 ) ) != 0 ) {
        new sz_classname[32];
        entity_get_string( victim , EV_SZ_classname , sz_classname, 31 );
        if( !equali( sz_classname, Class_Name_Fake ) ) {
        //our dude has sandbags and wants to place them near to him
        if( is_user_connected( victim ) && is_user_alive( victim ) && PlayerOwner[ victim ] == 0 )
            return PLUGIN_HANDLED;
        }
    }
    return true
}

public zp_extra_item_selected( pPlayer, itemid ) {
    if ( itemid == szItem ) {
        if( szBarricade[ pPlayer ] > 3 && get_user_flags( pPlayer ) & FLAG_V ) {
        client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
        return PLUGIN_HANDLED;
    }
        else
    if( szBarricade[ pPlayer ] > 2 ) {
        client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
        return PLUGIN_HANDLED;
    }
        szBarricade[ pPlayer ]+= 1
        PlayerOwner[ pPlayer ]+= 1
        //set_task( 0.3, "clcmd_Menu_Spawn", pPlayer )
        set_hudmessage( 0, 0, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0 );
        show_hudmessage( pPlayer, "Ты купил барикаду^nЧто бы установить нажми Е");
    }
    return PLUGIN_HANDLED;
}

bool:IsHullVacant( const Float:vecSrc[3], iHull, pEntToSkip = 0 ) {
    engfunc( EngFunc_TraceHull, vecSrc, vecSrc, DONT_IGNORE_MONSTERS, iHull, pEntToSkip, 0 );
    return bool:( !get_tr2( 0, TR_AllSolid ) && !get_tr2( 0, TR_StartSolid ) && get_tr2( 0, TR_InOpen ) );
}

GetOriginAimEndEyes( ent, iDistance, Float:vecOut[3], Float:vecAngles[3] ) {
    static Float:vecSrc[3], Float:vecEnd[3], Float:vecViewOfs[3], Float:vecVelocity[3];
    static Float:flFraction;

    pev( ent, pev_origin, vecSrc );
    pev( ent, pev_view_ofs, vecViewOfs );

    xs_vec_add( vecSrc, vecViewOfs, vecSrc );
    velocity_by_aim( ent, iDistance, vecVelocity );
    xs_vec_add( vecSrc, vecVelocity, vecEnd );

    engfunc( EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, ent, 0 );
    
    get_tr2(0, TR_flFraction, flFraction);
    
    if (flFraction < 1.0)
    {
        static Float:vecPlaneNormal[3];

        get_tr2(0, TR_PlaneNormal, vecPlaneNormal);
        get_tr2(0, TR_vecEndPos, vecOut);

        xs_vec_mul_scalar(vecPlaneNormal, 1.0, vecPlaneNormal);
        xs_vec_add(vecOut, vecPlaneNormal, vecOut);
    }
    else
    {
        xs_vec_copy(vecEnd, vecOut);
    }
    
    vecVelocity[2] = 0.0;
    vector_to_angle(vecVelocity, vecAngles);
}

FClassnameIs(Ent, const szClassName[]) {
    if ( pev_valid( Ent ) != 2 )
        return 0;

    new szpClassName[ 32 ];
    pev( Ent, pev_classname, szpClassName, charsmax( szpClassName ) );

    return equal( szClassName, szpClassName );
}

stock remove_allpalletswbags() {
    new pallets = -1;
    while( ( pallets = fm_find_ent_by_class( pallets, Class_Name ) ) )
        fm_remove_entity( pallets );
}

stock client_printcolor( pPlayer, iInput[], any:... ) {
    new iCount = 1, Players[ 32 ]
    static iMsg[ 191 ]
    vformat( iMsg, 190, iInput, 3 )
    
    replace_all( iMsg, 190, "!g", "^4" )
    replace_all( iMsg, 190, "!y", "^1" )
    replace_all( iMsg, 190, "!t", "^3" )
    
    if( pPlayer ) Players[ 0 ] = pPlayer; else get_players( Players, iCount, "ch" )
    {
        for( new i = 0; i < iCount; i++ ) {
            if( is_user_connected( Players[ i ] ) ) {
                message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, Players[ i ] )
                write_byte( Players[ i ] )
                write_string( iMsg )
                message_end( )
            }
        }
    }
}
 

Вложения

Сообщения
16
Реакции
7
Чтобы объект двигался за тобой, посмотри что "ThinkBarricade" делает, минимум еще работает с векторами, и что ты делаешь в "HologramCreate".
В "client_PreThink" где ты создаешь "HologramCreate", очевидно должно что-то еще происходить, "if( get_user_button( pPlayer ) & IN_USE )", ты создаешь прозрачную entity, по отжатию надо удалять.
11 Апр 2024
"CreateEntity" не используется вообще, должно после "HologramCreate" создаваться.
 
Последнее редактирование:
Сообщения
16
Реакции
7
Например, ты зажимаешь E, в "client_PreThink" должна создаваться прозрачная ent "HologramCreate" и с каким-то интервалом удаляться, переместиться курсор, поменяются координаты в "HologramCreate". Отжал E, сделал конечную "CreateEntity" с свойствами-параметрами.
 
Сообщения
60
Реакции
6
izdevalkin, Хорошо, вот например почти такой же плагин и в нём все прекрасно работает :
Открыть код.
Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <xs>
#include <fun>
#include <zombieplague>

// The sizes of models
#define PALLET_MINS Float:{ -27.260000, -22.280001, -22.290001 }
#define PALLET_MAXS Float:{  27.340000,  26.629999,  29.020000 }
// from fakemeta util by VEN
#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
#define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1)
// this is mine
#define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1)
#define fm_get_user_noclip(%1) (pev(%1, pev_movetype) == MOVETYPE_NOCLIP)
// cvars
new remove_nrnd

new const SB_CLASSNAME[] = "FakeSandBag"
// num of pallets with bags
/* Models for pallets with bags .
Are available 2 models, will be set a random of them  */
new g_models[][] =
{
    "models/ls_sandbags.mdl"
}
new stuck[33]
new g_bolsas[33];
new cvar[3]
new const Float:size[][3] = {
    {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}, {0.0, 1.0, 0.0}, {0.0, -1.0, 0.0}, {1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, -1.0},
    {0.0, 0.0, 2.0}, {0.0, 0.0, -2.0}, {0.0, 2.0, 0.0}, {0.0, -2.0, 0.0}, {2.0, 0.0, 0.0}, {-2.0, 0.0, 0.0}, {-2.0, 2.0, 2.0}, {2.0, 2.0, 2.0}, {2.0, -2.0, 2.0}, {2.0, 2.0, -2.0}, {-2.0, -2.0, 2.0}, {2.0, -2.0, -2.0}, {-2.0, 2.0, -2.0}, {-2.0, -2.0, -2.0},
    {0.0, 0.0, 3.0}, {0.0, 0.0, -3.0}, {0.0, 3.0, 0.0}, {0.0, -3.0, 0.0}, {3.0, 0.0, 0.0}, {-3.0, 0.0, 0.0}, {-3.0, 3.0, 3.0}, {3.0, 3.0, 3.0}, {3.0, -3.0, 3.0}, {3.0, 3.0, -3.0}, {-3.0, -3.0, 3.0}, {3.0, -3.0, -3.0}, {-3.0, 3.0, -3.0}, {-3.0, -3.0, -3.0},
    {0.0, 0.0, 4.0}, {0.0, 0.0, -4.0}, {0.0, 4.0, 0.0}, {0.0, -4.0, 0.0}, {4.0, 0.0, 0.0}, {-4.0, 0.0, 0.0}, {-4.0, 4.0, 4.0}, {4.0, 4.0, 4.0}, {4.0, -4.0, 4.0}, {4.0, 4.0, -4.0}, {-4.0, -4.0, 4.0}, {4.0, -4.0, -4.0}, {-4.0, 4.0, -4.0}, {-4.0, -4.0, -4.0},
    {0.0, 0.0, 5.0}, {0.0, 0.0, -5.0}, {0.0, 5.0, 0.0}, {0.0, -5.0, 0.0}, {5.0, 0.0, 0.0}, {-5.0, 0.0, 0.0}, {-5.0, 5.0, 5.0}, {5.0, 5.0, 5.0}, {5.0, -5.0, 5.0}, {5.0, 5.0, -5.0}, {-5.0, -5.0, 5.0}, {5.0, -5.0, -5.0}, {-5.0, 5.0, -5.0}, {-5.0, -5.0, -5.0}
}
const g_item_bolsas = 30
new g_itemid_bolsas
new ZPSTUCK
new Sb_owner[33]
new cvar_units, g_iMaxPlayers;
new iSandBagHealth[33]
new iTeamLimit, gAlreadyBought[33];
new g_pSB[33], iSBCanBePlaced[33]
new Float:ivecOrigin[3]
/*************************************************************
************************* AMXX PLUGIN *************************
**************************************************************/
public plugin_init()
{
    /* Register the plugin */
   
    register_plugin("[ZP] Extra: SandBags", "1.1", "LARP")
    g_itemid_bolsas = zp_register_extra_item("Sandbags", 30, ZP_TEAM_HUMAN)
    /* Register the cvars */
    ZPSTUCK = register_cvar("zp_pb_stuck","1")
    remove_nrnd = register_cvar("zp_pb_remround","1");
    cvar_units = register_cvar("zp_sandbag_units", "42")
   
    g_iMaxPlayers = get_maxplayers();
   
    /* Game Events */
    register_event("HLTV","event_newround", "a","1=0", "2=0"); // it's called every on new round
   
    /* This is for menuz: */
    register_clcmd("say /sb","show_the_menu");
    register_clcmd("say_team /sb","show_the_menu");
    register_think(SB_CLASSNAME, "SB_Think");

    //cvar[0] = register_cvar("zp_autounstuck","1")
    cvar[1] = register_cvar("zp_pb_stuckeffects","1")
    cvar[2] = register_cvar("zp_pb_stuckwait","7")
    RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage");
    RegisterHam(Ham_Killed, "func_wall", "fw_PlayerKilled", 1)
    register_forward(FM_OnFreeEntPrivateData, "OnFreeEntPrivateData");
   
}
public OnFreeEntPrivateData(this)
{
    if (!FClassnameIs(this, SB_CLASSNAME))
        return FMRES_IGNORED;

    new pOwner = pev(this, pev_owner);

    if ((1 <= pOwner <= g_iMaxPlayers))
        g_pSB[pOwner] = 0;
    return FMRES_IGNORED;
}

//Here is what I am tryin to make just owner and zombie to be able to destroy sandbags
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
    //Victim is not aa sandbag.
    new sz_classname[32]
    entity_get_string( victim , EV_SZ_classname , sz_classname, 31 )
    new iHealth = pev( victim, pev_health )-floatround(damage);
    if(iHealth<=0)
    {
        iHealth=1;
    }
   
    if( !equali(sz_classname,"amxx_pallets") )
    return HAM_IGNORED;
   
    else if( iHealth < 400 ) // more than 200 glow a bit blue
    {
        set_rendering ( victim, kRenderFxGlowShell, 255, 10, 10, kRenderNormal, 16)
    }
    else if( iHealth < 700 ) // More than 400 glow green
    {
        set_rendering ( victim, kRenderFxGlowShell, 255, 200, 100, kRenderNormal, 16)
    }
    else if( iHealth < 1000 ) // More than 900 glow green
    {
        set_rendering ( victim, kRenderFxGlowShell, 10, 255, 10, kRenderNormal, 16)
    }
       
    //Attacker is zombie
    if( zp_get_user_zombie( attacker ))
    return HAM_IGNORED;
       
    //Block Damage
    return HAM_SUPERCEDE;
}
public fw_PlayerKilled(victim, attacker, shouldgib, id)
{    
    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, "amxx_pallets") && is_valid_ent(victim) && zp_get_user_zombie(attacker) && health <= 0.0)
    {
        zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + 5)
        new player_name[34]
        get_user_name(attacker, player_name, charsmax(player_name))
        client_printcolor(0,"!y[!gZP!y] !g%s Выиграл !g5 !yAmmoPacks, уничтожив !gмешок с песком",player_name)
        return HAM_IGNORED;
    }
    if (g_pSB[victim] && is_valid_ent(g_pSB[victim]))
        remove_entity(g_pSB[victim]);
    return HAM_IGNORED;
}
public plugin_precache()
{
    for(new i;i < sizeof g_models;i++)
    engfunc(EngFunc_PrecacheModel,g_models[i]);
}
   
public show_the_menu(id)
{
    new Menu = menu_create("\yБарикада \yMenu", "menu_command")
    menu_additem(Menu, "Купить/разместить из дополнительных предметов")
   
    menu_setprop( Menu, MPROP_EXIT, MEXIT_ALL );
   
    if(g_bolsas[id] > 0 && !zp_get_user_zombie(id))
    {
        menu_display(id, Menu, 0 );
        //CreateFakeSandBag(id)
    }  
    else {      
        if(is_user_alive(id)&& !zp_get_user_zombie(id))
        return;
    }
}

public zp_user_infected_post(id) {
    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);
}

public menu_command(id, menu, item)
{
    menu_destroy(menu);
   
    if (!g_pSB[id] || !is_valid_ent(g_pSB[id]))
    return PLUGIN_HANDLED;  
   
    switch(item)
    {
        case 0:
        {
            if ( !zp_get_user_zombie(id) )
            {
                if(iSBCanBePlaced[id] == 2)
                {
                    show_the_menu(id);
                    client_printcolor(id, "!y[!gZP!y] Вы не можете поставить !gБарикаду !yв этом месте!")
                    return PLUGIN_CONTINUE;
                }
                new money = g_bolsas[id]
                if ( money < 1 )
                {
                    return PLUGIN_CONTINUE
                }
                g_bolsas[id]-= 1
                place_palletwbags(id);
                show_the_menu(id);
                if(Sb_owner[id] > 0)
                {
                    Sb_owner[id] -= 1
                }
            }

            else client_printcolor(id, "!tЗомби !yне могут использовать это")
            return PLUGIN_CONTINUE    
        }
        case MENU_EXIT:
        {
            if (g_pSB[id] && is_valid_ent(g_pSB[id]))
                remove_entity(g_pSB[id]);      
        }
    }  
    return PLUGIN_HANDLED;
}

public client_PreThink( id ) {
    if( !is_user_alive( id ) || zp_get_user_zombie( id ) )
        return PLUGIN_CONTINUE;
    if( get_user_button( id ) & IN_USE ) {
        set_barricade( id )
    }
    return PLUGIN_HANDLED;
}

public set_barricade( id ) {
    if(iSBCanBePlaced[id] == 2) {
    set_task(0.3, "CreateFakeSandBag", id);
    return PLUGIN_CONTINUE;
    } else
    if( g_bolsas[ id ] > 0 && Sb_owner[ id ] > 0 ) {
    g_bolsas[ id ]-= 1
    Sb_owner[ id ]-= 1
    place_palletwbags(id);
    set_barricade( id );
    } else    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);
   
    return PLUGIN_HANDLED;
}

public CreateFakeSandBag(id) {
    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);

    new iSB = create_entity("info_target")
   
    if (!iSB)
        return;

    static Float:vecAngles[3]
    GetOriginAimEndEyes(id, 128, ivecOrigin, vecAngles)
    engfunc(EngFunc_SetModel, iSB,g_models[random(sizeof g_models)]);
    engfunc(EngFunc_SetOrigin, iSB, ivecOrigin);
   
    set_pev(iSB, pev_classname, SB_CLASSNAME);
    set_pev(iSB, pev_owner, id);
    set_pev(iSB, pev_rendermode, kRenderTransAdd);
    set_pev(iSB, pev_renderamt, 200.0);
    set_pev(iSB, pev_body, 1);
    set_pev(iSB, pev_nextthink, get_gametime());
    set_pev(iSB, pev_solid, SOLID_NOT);
    set_pev(iSB, pev_movetype, MOVETYPE_FLY); // Movestep <- for Preview
    g_pSB[id] = iSB;
}

public SB_Think(SandBag)
{
    if (pev_valid(SandBag) != 2)
        return;

    static pOwner;
    pOwner = pev(SandBag, pev_owner);
   
    if (!(1 <= pOwner <= g_iMaxPlayers) || !is_user_alive(pOwner))
        return;
       
    static iBody, Float:vecColor[3], Float:vecAngles[3];

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

    if (!IsHullVacant(ivecOrigin, HULL_HEAD, SandBag))
    {
        if(CheckSandBag() || CheckSandBagFake())
        {
        iBody = 1
        xs_vec_set(vecColor, 0.0, 250.0, 0.0);
        }
    }  
   
    iSBCanBePlaced[pOwner] = iBody  
    set_pev(SandBag, pev_angles, vecAngles);
    set_pev(SandBag, pev_body, iBody);
    set_pev(SandBag, pev_nextthink, get_gametime() + 0.01);
   
    return;
}
   
public place_palletwbags(id)
{
    new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));
   
    set_pev(Ent,pev_classname,"amxx_pallets");
   
    engfunc(EngFunc_SetModel,Ent,g_models[random(sizeof g_models)]);
   
    static Float:p_mins[3], Float:p_maxs[3], Float:vecOrigin[3], Float:vecAngles[3];
    p_mins = PALLET_MINS;
    p_maxs = PALLET_MAXS;
    engfunc(EngFunc_SetSize, Ent, p_mins, p_maxs);
    set_pev(Ent, pev_mins, p_mins);
    set_pev(Ent, pev_maxs, p_maxs );
    set_pev(Ent, pev_absmin, p_mins);
    set_pev(Ent, pev_absmax, p_maxs );    
    set_pev(Ent, pev_body, 3);
    //vecOrigin[2] -= 8.0;
    GetOriginAimEndEyes(id, 128, vecOrigin, vecAngles);
    engfunc(EngFunc_SetOrigin, Ent, vecOrigin);
   
    set_pev(Ent,pev_solid,SOLID_BBOX); // touch on edge, block

    //new iHealth = pev( Ent, pev_health );
    //set_rendering ( Ent, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 16)
   
    set_pev(Ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff
   
    new Float:p_cvar_health = float(iSandBagHealth[id])
    set_pev(Ent,pev_health,p_cvar_health);
    set_pev(Ent,pev_takedamage,DAMAGE_YES);

    static Float:rvec[3];
    pev(Ent,pev_v_angle,rvec);
   
    rvec[0] = 0.0;
   
    set_pev(Ent,pev_angles,rvec);
   
    set_pev(Ent, pev_owner, id);

    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);  

    new player_name[34]
    get_user_name(id, player_name, charsmax(player_name))
    client_printcolor(0, "!y[!gZP!y] %s разместил !gБарикаду", player_name)
}

/* ====================================================
get_user_hitpoin stock . Was maked by P34nut, and is
like get_user_aiming but is with floats and better :o
====================================================*/    
stock get_user_hitpoint(id, Float:hOrigin[3])
{
    if ( ! is_user_alive( id ))
    return 0;
   
    new Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3];
    new Float:fTemp[3];
   
    pev(id, pev_origin, fOrigin);
    pev(id, pev_v_angle, fvAngle);
    pev(id, pev_view_ofs, fvOffset);
   
    xs_vec_add(fOrigin, fvOffset, fvOrigin);
   
    engfunc(EngFunc_AngleVectors, fvAngle, feOrigin, fTemp, fTemp);
   
    xs_vec_mul_scalar(feOrigin, 9999.9, feOrigin);
    xs_vec_add(fvOrigin, feOrigin, feOrigin);
   
    engfunc(EngFunc_TraceLine, fvOrigin, feOrigin, 0, id);
    global_get(glb_trace_endpos, hOrigin);
   
    return 1;
}
/* ====================================================
This is called on every round, at start up,
with HLTV logevent. So if the "pallets_wbags_nroundrem"
cvar is set to 1, all placed pallets with bugs will be
removed.
====================================================*/
public event_newround()
{
    iTeamLimit = 0  
    for ( new id; id <= get_maxplayers(); id++)
    {        
        if( get_pcvar_num ( remove_nrnd ) == 1)
        remove_allpalletswbags();
        g_bolsas[id] = 0
        Sb_owner[id] = 0
        gAlreadyBought[id] = 0
       
        if (g_pSB[id] && is_valid_ent(g_pSB[id]))
            remove_entity(g_pSB[id]);
    }

}
/* ====================================================
This is a stock to help for remove all pallets with
bags placed . Is called on new round if the cvar
"pallets_wbags_nroundrem" is set 1.
====================================================*/
stock remove_allpalletswbags()
{
    new pallets = -1;
    while((pallets = fm_find_ent_by_class(pallets, "amxx_pallets")))
    fm_remove_entity(pallets);
}
public checkstuck() {
    if ( get_pcvar_num(ZPSTUCK) == 1 )
    {
        static players[32], pnum, player
        get_players(players, pnum)
        static Float:origin[3]
        static Float:mins[3], hull
        static Float:vec[3]
        static o,i
        for(i=0; i<pnum; i++){
            player = players[i]
            if (is_user_connected(player) && is_user_alive(player)) {
                pev(player, pev_origin, origin)
                hull = pev(player, pev_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN
                if (!is_hull_vacant(origin, hull,player) && !fm_get_user_noclip(player) && !(pev(player,pev_solid) & SOLID_NOT)) {
                    ++stuck[player]
                    if(stuck[player] >= get_pcvar_num(cvar[2])) {
                        pev(player, pev_mins, mins)
                        vec[2] = origin[2]
                        for (o=0; o < sizeof size; ++o) {
                            vec[0] = origin[0] - mins[0] * size[o][0]
                            vec[1] = origin[1] - mins[1] * size[o][1]
                            vec[2] = origin[2] - mins[2] * size[o][2]
                            if (is_hull_vacant(vec, hull,player)) {
                                engfunc(EngFunc_SetOrigin, player, vec)
                                effects(player)
                                set_pev(player,pev_velocity,{0.0,0.0,0.0})
                                o = sizeof size
                            }
                        }
                    }
                }
                else
                {
                    stuck[player] = 0
                }
            }
        }
       
    }
   
}
stock bool:is_hull_vacant(const Float:origin[3], hull,id) {
    static tr
    engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr)
    if (!get_tr2(tr, TR_StartSolid) || !get_tr2(tr, TR_AllSolid)) //get_tr2(tr, TR_InOpen))
    return true
   
    return false
}
public effects(id) {
    if(get_pcvar_num(cvar[1])) {
        set_hudmessage(255,150,50, -1.0, 0.65, 0, 6.0, 1.5,0.1,0.7) // HUDMESSAGE
        show_hudmessage(id,"Автоматическое отклеивание!") // HUDMESSAGE
        message_begin(MSG_ONE_UNRELIABLE,105,{0,0,0},id )      
        write_short(1<<10)   // fade lasts this long duration
        write_short(1<<10)   // fade lasts this long hold time
        write_short(1<<1)   // fade type (in / out)
        write_byte(20)            // fade red
        write_byte(255)    // fade green
        write_byte(255)        // fade blue
        write_byte(255)    // fade alpha
        message_end()
        client_cmd(id,"spk fvox/blip.wav")
    }
}

public zp_extra_item_selected(id, itemid) {
    if (itemid == g_itemid_bolsas) {
    if( g_bolsas[ id ] > 0 ) {
        client_printcolor(id, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто.");
        zp_set_user_ammo_packs(id, zp_get_user_ammo_packs( id ) + 5 );
        return PLUGIN_HANDLED;
    }
    g_bolsas[id]+= 1
    gAlreadyBought[id] = 1
    iTeamLimit++
    set_task(0.3,"CreateFakeSandBag",id)
    Sb_owner[id] = 1
    iSandBagHealth[id] = 1250
    set_hudmessage( 100, 100, 100, -1.0, 0.8, 0, 6.0, 2.0, 1.0, 1.0 );
    show_hudmessage( id, "Что бы установить баррикаду^nНажми на [Е]" );
    }
    return PLUGIN_HANDLED;
}

public client_disconnected(id)
{  
    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);
}

public zp_fw_core_infect(id)
{
    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);
}

public zp_fw_core_cure(id)
{
    if (g_pSB[id] && is_valid_ent(g_pSB[id]))
        remove_entity(g_pSB[id]);
}

bool:IsHullVacant(const Float:vecSrc[3], iHull, pEntToSkip = 0)
{
    engfunc(EngFunc_TraceHull, vecSrc, vecSrc, DONT_IGNORE_MONSTERS, iHull, pEntToSkip, 0);
    return bool:(!get_tr2(0, TR_AllSolid) && !get_tr2(0, TR_StartSolid) && get_tr2(0, TR_InOpen));
}

GetOriginAimEndEyes(this, iDistance, Float:vecOut[3], Float:vecAngles[3])
{
    static Float:vecSrc[3], Float:vecEnd[3], Float:vecViewOfs[3], Float:vecVelocity[3];
    static Float:flFraction;

    pev(this, pev_origin, vecSrc);
    pev(this, pev_view_ofs, vecViewOfs);

    xs_vec_add(vecSrc, vecViewOfs, vecSrc);
    velocity_by_aim(this, iDistance, vecVelocity);
    xs_vec_add(vecSrc, vecVelocity, vecEnd);

    engfunc(EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, this, 0);
   
    get_tr2(0, TR_flFraction, flFraction);
   
    if (flFraction < 1.0)
    {
        static Float:vecPlaneNormal[3];

        get_tr2(0, TR_PlaneNormal, vecPlaneNormal);
        get_tr2(0, TR_vecEndPos, vecOut);

        xs_vec_mul_scalar(vecPlaneNormal, 1.0, vecPlaneNormal);
        xs_vec_add(vecOut, vecPlaneNormal, vecOut);
    }
    else
    {
        xs_vec_copy(vecEnd, vecOut);
    }
   
    vecVelocity[2] = 0.0;
    vector_to_angle(vecVelocity, vecAngles);
}

public CheckSandBag()
{
    static victim
    victim = -1
    while ( ( victim = find_ent_in_sphere(victim,ivecOrigin,get_pcvar_float(cvar_units))) != 0 )
    {
        new sz_classname[32]
        entity_get_string( victim , EV_SZ_classname , sz_classname, 31 )
        //new iHealth = pev( victim, pev_health );
        if( !equali(sz_classname,"amxx_pallets") )
        {
        //our dude has sandbags and wants to place them near to him
        if(is_user_connected(victim) && is_user_alive(victim) && Sb_owner[victim] == 0)
            return false;
        }
    }
    return true
}

public CheckSandBagFake()
{
    static victim
    victim = -1
    while ( ( victim = find_ent_in_sphere(victim,ivecOrigin,get_pcvar_float(cvar_units))) != 0 )
    {
        new sz_classname[32]
        entity_get_string( victim , EV_SZ_classname , sz_classname, 31 )
        //new iHealth = pev( victim, pev_health );
        if( !equali(sz_classname,"FakeSandBag") )
        {
        //our dude has sandbags and wants to place them near to him
        if(is_user_connected(victim) && is_user_alive(victim) && Sb_owner[victim] == 0)
            return false;
        }
    }
    return true
}
FClassnameIs(this, const szClassName[])
{
    if (pev_valid(this) != 2)
        return 0;

    new szpClassName[32];
    pev(this, pev_classname, szpClassName, charsmax(szpClassName));

    return equal(szClassName, szpClassName);
}
stock client_printcolor(const id,const input[], any:...)
{
    new msg[191], players[32], count = 1; vformat(msg,190,input,3);
    replace_all(msg,190,"!g","^4");    // green
    replace_all(msg,190,"!y","^1");    // normal
    replace_all(msg,190,"!t","^3");    // team
       
    if (id) players[0] = id; else get_players(players,count,"ch");
       
    for (new i=0;i<count;i++)
    {
        if (is_user_connected(players[i]))
        {
            message_begin(MSG_ONE_UNRELIABLE,get_user_msgid("SayText"),_,players[i]);
            write_byte(players[i]);
            write_string(msg);
            message_end();
        }
    }
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
Так же прилагаю видео работы плагина:
В нём я реализовал по факту что и хотелось мне, но почему в моем варианте так не работает хотя я брал способ из этого плагина.
Вопрос: почему я просто не использую этот плагин? - Просто наверное из-за самого кода мне не особо нравится, может посчитаете меня дураком, но это что-то типа перфекционизма =). Хотел бы узнать у вас что я не так сделал в своей версии которая выше? и так же узнать может что-то можно поменять на более современное исполнение которое бы не там нагружало сервер и т.д. (Оптимизация)
11 Апр 2024
izdevalkin, Я понимаю что можно это добавить, но не кажется это не правильной работой?
Код:
else if( get_user_oldbutton( id ) & IN_USE )
    {
        CreateFakeSandBag(id);
    }
 
Сообщения
16
Реакции
7
Kulogram, На первый взгляд, минимум, он в "public set_barricade" дергает set_task, чего ты не делаешь с "HologramCreate".
Код:
set_task(0.3, "CreateFakeSandBag", id);
Можешь сделать все в "client_PreThink" с нужной задержкой.

__
И вообще ты там напутал в плагине у себя, переделывай

Код:
new const Class_Name[] = "Barricade"
new const Class_Name_Fake[] = "Barricade_fake"


public plugin_init() {
    register_think( Class_Name_Fake, "ThinkBarricade" );
И еще раз повторяю, ты не делаешь баррикаду свою, не используешь "CreateEntity"
 
Последнее редактирование:
Сообщения
60
Реакции
6
izdevalkin, Да по последнему коду который я скинул я убрал использование CreateEntity, что бы для начала сделать что бы создавалась "Проекция" установки модели. Но она появляется и сразу устанавливается там куда смотрю.

Если посмотреть внимательней в плагине где работает данный метод, то сделано так же как и у меня:
Код:
new const SB_CLASSNAME[] = "FakeSandBag"

public plugin_init()   {
    register_think(SB_CLASSNAME, "SB_Think");
}
Там привязывается класс к синку как раз фейковый вариант, а сами мешки ставятся уже потом!
 
Сообщения
16
Реакции
7
Kulogram, ну так и определись какое имя использовать.

В "client_PreThink"

Код:
    if( get_user_button( pPlayer ) & IN_USE ) {
        szBarricade[ pPlayer ]-= 1
        HologramCreate( pPlayer );
    }
прикрути float:thetime = get_gametime() как условие, в "HologramCreate" или тут же, манипулируй.
new g_barridade[pPlayer] = get_gametime()
и тебе не нужен будет "set_pev(iSB, pev_nextthink, get_gametime());

или как в том рабочем плагине, через set_task
 
Последнее редактирование:
Сообщения
60
Реакции
6
izdevalkin, я тебя понял, но самая главная проблема так и не решена =( . Почему моя фейковая модель не следует за моим прицелом?
 
Сообщения
712
Реакции
476
Помог
10 раз(а)
какой кошмар)

1712837799078.png
на кой черт ты удаляешь объект? перепроверяй что он уже есть и используй его


вот тут может несколько мешков создаться, если szBarricade более чем 1
проверку на ~get_entvar(pPlayer, var_oldbuttons) & IN_USE вместе со своим условием, чтобы проверить одиночное нажатие
1712837863272.png


1712837969232.png

а зачем pdata? достаточно !pev_valid
а у болванки вообще есть pdata? я бы принтанул на самом деле, возможно тут проблема



Зачем? правого достаточно
это секретная техника оптимизации (наверное)
**upd. а че тут вщ происходит? пхахах. Условие некорректное и ты перестаешь слать синк для объекта и даже его не удаляешь. Что? 🥴
1712838023105.png


вообще не понятно зачем тебе два разных объекта fake и обычный мешок. Используй один, просто меняй свойства
11 Апр 2024
1712838396215.png
бочок потик
никогда так не делай
 
Сообщения
60
Реакции
6
Есть пример адекватного создания объекта? От куда можно взять основу и дальше усовершенствовать?
 
Сообщения
712
Реакции
476
Помог
10 раз(а)
а что тут не так?
фонтанчик из памяти

так хотя бы сделай, чтобы память каждый раз не выделялась
PHP:
static iAllocString; 
if (!iAllocString) iAllocString = engfunc(EngFunc_AllocString, "func_wall");

new iEnt = engfunc(EngFunc_CreateNamedEntity, iAllocString);
11 Апр 2024
Код:
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;
    }
}
 
Сообщения
60
Реакции
6
вот тут может несколько мешков создаться, если szBarricade более чем 1
проверку на ~get_entvar(pPlayer, var_oldbuttons) & IN_USE вместе со своим условием, чтобы проверить одиночное нажатие
Можно тут по подробнее, вроде сделал как ты сказал , только не на реапи, а через set_pev и вообще ничего , на Е не ставиться объект.
Уверен что я что-то не так сделал =). Большое спасибо за помощь, теперь фейковая модель ходит за моим прицелом я очень рад.

Хотел бы узнать еще вариант как использовать один класс на фейк и нет.

Код
Код:
#include < amxmodx >
#include < amxmisc >
#include < fun >
#include < cstrike >
#include < engine >
#include < fakemeta_util >
#include < zombienightmare >

// from fakemeta util by VEN
#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
#define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1)
// this is mine
//#define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1)

#define MAX_COUNT               2                               // макс количество барикад для обычного игрока
#define MAX_COUNT_V             3                                 // макс количество барикад для VIP игрока

#define FLAG_V                    ADMIN_LEVEL_H                    // Флаг VIP игрока (t)

const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

new const Float: BARICADE_MINSIZE[] = { -30.0, -30.0, -30.0 };
new const Float: BARICADE_MAXSIZE[] = { 30.0, 30.0, 30.0 };
new const Float: HealthBr[] = { 550.0 };

new szModels[][] =
{
    "models/ls_sandbags.mdl"
}

new const Class_Name[] = "Barricade"
new const Class_Name_Fake[] = "Barricade_fake"
new CanBePlaced[33], szBarricade[33], PlayerOwner[33], sz_Br[33], szItem, g_iMaxPlayers;
new Float:szOrigin[3];


public plugin_precache() {
    for( new i;i < sizeof szModels;i++ )
    engfunc( EngFunc_PrecacheModel, szModels[i] );
}

public plugin_init() {
    register_plugin(
    "[ZN] Addon: Barricade",
    "0.1 (Beta)",
    "Kulogram"
    );
    register_menu( "clcmd_Menu_Spawn", KEYSMENU, "function" );
    register_clcmd( "say /br", "clcmd_Menu_Spawn" );
    
    register_logevent("RoundEnd",2,"1=Round_End");
    register_think( Class_Name_Fake, "ThinkBarricade" );
    register_forward(FM_OnFreeEntPrivateData, "OnFreeEntPrivateData");
    
    //BarTime = get_user_msgid( "BarTime" );
    szItem = zp_register_extra_item( "Barricade", 10, ZP_TEAM_HUMAN );
}

public RoundEnd() {
    new Ent
    while( ( Ent = find_ent_by_class( Ent, Class_Name) ) )
    if( is_valid_ent( Ent ) )
        remove_allpalletswbags();
}

public zp_user_infected_post( pPlayer ){
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public client_disconnected( pPlayer ) {   
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public zp_fw_core_infect(pPlayer) {
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public OnFreeEntPrivateData(pPlayer)
{
    if (!FClassnameIs(pPlayer, Class_Name_Fake) )
        return FMRES_IGNORED;
    
    new pOwner = pev(pPlayer, pev_owner);

    if ((1 <= pOwner <= g_iMaxPlayers))
        sz_Br[pOwner] = 0;
    return FMRES_IGNORED;
}

/*public client_PreThink( pPlayer ) {
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 ) return;
    if( get_user_button( pPlayer ) & IN_USE ) {
        szBarricade[ pPlayer ]-= 1
        HologramCreate( pPlayer );
    }
}*/
public client_PreThink( pPlayer ) {
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 )
        return PLUGIN_HANDLED;
    if( get_user_button( pPlayer ) & IN_USE || ~set_pev(pPlayer, pev_oldbuttons) & IN_USE ) {
        set_barricade( pPlayer )
    }
    return PLUGIN_HANDLED;
}

public set_barricade( pPlayer ) {
    if(CanBePlaced[ pPlayer ] == 2) {
    set_task( 0.3, "HologramCreate", pPlayer );
    return PLUGIN_CONTINUE;
    } else
    if( szBarricade[ pPlayer ] > 0 && PlayerOwner[ pPlayer ] > 0 ) {
    szBarricade[ pPlayer ]-= 1
    PlayerOwner[ pPlayer ]-= 1
    CreateEntity( pPlayer );
    //set_barricade( id );
    } else    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
    
    return PLUGIN_HANDLED;
}

public clcmd_Menu_Spawn( pPlayer ) {
    if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) ) {
        client_printcolor( pPlayer, "!t[!gZP!t] !yДоступно только живым игрокам. (Зомби тоже недоступно)" );
        return PLUGIN_HANDLED;
    }
    
    static Menu[ 650 ], iLen
    iLen = 0
    
    iLen = formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y[*] \wZombieNightmare^n\y[*] \wМеню барьеров^n\y[*] \d(Барикад - %d шт.)^n^n", szBarricade[pPlayer] );
    
    if( szBarricade[ pPlayer ] > 0 )
    iLen += formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y1. \wПоставить палет с мешками^n" );
    else
    iLen += formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y1. \dПоставить палет с мешками \r(У тебя их нет!)^n" );
    
    show_menu( pPlayer , KEYSMENU , Menu , -1 , "clcmd_Menu_Spawn" );
    return PLUGIN_HANDLED;
}

public function( pPlayer, key ) {
    switch( key ) {
    case 0: {
            if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) ) {
                client_printcolor( pPlayer, "!t[!gZP!t] !yДоступно только живым игрокам. (Зомби тоже недоступно)" );
                return PLUGIN_HANDLED;
            }
            if( szBarricade[ pPlayer ] < 1 ) {   
                set_hudmessage( 100, 100, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0 );
                show_hudmessage( pPlayer, "У тебя нет^nкупленных барикад" );
            } else {
                szBarricade[pPlayer] -= 1 ;
                HologramCreate( pPlayer );
                clcmd_Menu_Spawn( pPlayer );
                if(PlayerOwner[ pPlayer ] > 0 ) {
                    PlayerOwner[ pPlayer ] -= 1
                }
            }
        }
    }
    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;
}

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 );
    
    if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
        remove_entity( sz_Br[ pPlayer ] );
}

public Check_CreateBr() {
    static victim
    victim = -1
    while ( ( victim = find_ent_in_sphere( victim, szOrigin, 200.0 ) ) != 0 ) {
        new sz_classname[32];
        entity_get_string( victim , EV_SZ_classname , sz_classname, 31 );
        if( !equali( sz_classname, Class_Name ) )
        {
        //our dude has sandbags and wants to place them near to him
        if( is_user_connected( victim ) && is_user_alive( victim ) && PlayerOwner[ victim ] == 0 )
            return false;
        }
    }
    return true
}

public Check_HologramBr() {
    static victim
    victim = -1
    while ( ( victim = find_ent_in_sphere( victim, szOrigin, 200.0 ) ) != 0 ) {
        new sz_classname[32];
        entity_get_string( victim , EV_SZ_classname , sz_classname, 31 );
        if( !equali( sz_classname, Class_Name_Fake ) ) {
        //our dude has sandbags and wants to place them near to him
        if( is_user_connected( victim ) && is_user_alive( victim ) && PlayerOwner[ victim ] == 0 )
            return PLUGIN_HANDLED;
        }
    }
    return true
}

public zp_extra_item_selected( pPlayer, itemid ) {
    if ( itemid == szItem ) {
        if( szBarricade[ pPlayer ] > 3 && get_user_flags( pPlayer ) & FLAG_V ) {
        client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
        return PLUGIN_HANDLED;
    }
        else
    if( szBarricade[ pPlayer ] > 2 ) {
        client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
        return PLUGIN_HANDLED;
    }
        szBarricade[ pPlayer ]+= 1
        PlayerOwner[ pPlayer ]+= 1
        set_task( 0.3, "HologramCreate", pPlayer )
        set_hudmessage( 0, 0, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0 );
        show_hudmessage( pPlayer, "Ты купил барикаду^nЧто бы установить нажми Е");
    }
    return PLUGIN_HANDLED;
}

bool:IsHullVacant( const Float:vecSrc[3], iHull, pEntToSkip = 0 ) {
    engfunc( EngFunc_TraceHull, vecSrc, vecSrc, DONT_IGNORE_MONSTERS, iHull, pEntToSkip, 0 );
    return bool:( !get_tr2( 0, TR_AllSolid ) && !get_tr2( 0, TR_StartSolid ) && get_tr2( 0, TR_InOpen ) );
}

GetOriginAimEndEyes( ent, iDistance, Float:vecOut[3], Float:vecAngles[3] ) {
    static Float:vecSrc[3], Float:vecEnd[3], Float:vecViewOfs[3], Float:vecVelocity[3];
    static Float:flFraction;

    pev( ent, pev_origin, vecSrc );
    pev( ent, pev_view_ofs, vecViewOfs );

    xs_vec_add( vecSrc, vecViewOfs, vecSrc );
    velocity_by_aim( ent, iDistance, vecVelocity );
    xs_vec_add( vecSrc, vecVelocity, vecEnd );

    engfunc( EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, ent, 0 );
    
    get_tr2(0, TR_flFraction, flFraction);
    
    if (flFraction < 1.0)
    {
        static Float:vecPlaneNormal[3];

        get_tr2(0, TR_PlaneNormal, vecPlaneNormal);
        get_tr2(0, TR_vecEndPos, vecOut);

        xs_vec_mul_scalar(vecPlaneNormal, 1.0, vecPlaneNormal);
        xs_vec_add(vecOut, vecPlaneNormal, vecOut);
    }
    else
    {
        xs_vec_copy(vecEnd, vecOut);
    }
    
    vecVelocity[2] = 0.0;
    vector_to_angle(vecVelocity, vecAngles);
}

FClassnameIs(Ent, const szClassName[]) {
    if ( pev_valid( Ent ) != 2 )
        return 0;

    new szpClassName[ 32 ];
    pev( Ent, pev_classname, szpClassName, charsmax( szpClassName ) );

    return equal( szClassName, szpClassName );
}

stock remove_allpalletswbags() {
    new pallets = -1;
    while( ( pallets = fm_find_ent_by_class( pallets, Class_Name ) ) )
        fm_remove_entity( pallets );
}

stock client_printcolor( pPlayer, iInput[], any:... ) {
    new iCount = 1, Players[ 32 ]
    static iMsg[ 191 ]
    vformat( iMsg, 190, iInput, 3 )
    
    replace_all( iMsg, 190, "!g", "^4" )
    replace_all( iMsg, 190, "!y", "^1" )
    replace_all( iMsg, 190, "!t", "^3" )
    
    if( pPlayer ) Players[ 0 ] = pPlayer; else get_players( Players, iCount, "ch" )
    {
        for( new i = 0; i < iCount; i++ ) {
            if( is_user_connected( Players[ i ] ) ) {
                message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, Players[ i ] )
                write_byte( Players[ i ] )
                write_string( iMsg )
                message_end( )
            }
        }
    }
}
Еще подскажите как сделать что бы я не проходил через свой объект. Спасибо
 
Сообщения
712
Реакции
476
Помог
10 раз(а)
проверяет что в этом фрейме игрок нажал Е, но в прошлом кадре не было зафиксировано нажатие
PHP:
if (pev(id, pev_buttons) & IN_USE && ~pev(id, pev_oldbuttons) & IN_USE) {
// действие
}
Еще подскажите как сделать что бы я не проходил через свой объект. Спасибо
pev_owner замени на что-то другое

Хотел бы узнать еще вариант как использовать один класс на фейк и нет.
тебе достаточно поменять класснейм и эффекты в момент установки
sz_Br[ pPlayer ] после установки в тот же момент почисти
 
Сообщения
60
Реакции
6
BalbuR, Сделал, но при нажатии на Е нет результата, даже 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;
}
Это точно не PreThink , в чём-то другом проблема.
 
Последнее редактирование:
Сообщения
60
Реакции
6
Это точно не PreThink , в чём-то другом проблема
 
Сообщения
712
Реакции
476
Помог
10 раз(а)
Сделал, но при нажатии на Е нет результата, даже Entity не пропадает.
что именно перестало работать? если не понимаешь где и из-за чего перестало работать, советую использовать client_print для отладки, так как банального отладчика у нас нет 💀

Это точно не PreThink , в чём-то другом проблема
1712852791961.png
зачем сет таск?


CreateEntity тебе по сути не нужен, объект тебе создает HologramCreate, у объекта, который ты из этой функции создал, просто поменяй свойства как в функции CreateEntity. Как поменяешь класс на
Class_Name, хук register_think(Class_Name_Fake,... перестанет вызываться для этого объекта

1712852881326.png
 
Сообщения
60
Реакции
6
BalbuR, Я извиняюсь за свои скудные знания:wacko: , я принцип понимаю, что ты говоришь, но как мне заменить класс по нажатию на Е, через проверку если только но какую?

Если я правильно понимаю ты мне предлагаешь CreateEntity удалить в принципе и всё сделать в одном паблике "HologramCreate".
 

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

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