Entity SandBug aka Barricade

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

Надо что бы при покупке появлялась Фейковая модель (Проекция) и следовала за тем куда я смотрю (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" с свойствами-параметрами.
 
Сообщения
107
Реакции
10
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"
 
Последнее редактирование:
Сообщения
107
Реакции
10
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
 
Последнее редактирование:
Сообщения
107
Реакции
10
izdevalkin, я тебя понял, но самая главная проблема так и не решена =( . Почему моя фейковая модель не следует за моим прицелом?
 
Сообщения
835
Реакции
516
Помог
12 раз(а)
какой кошмар)

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
бочок потик
никогда так не делай
 
Сообщения
107
Реакции
10
Есть пример адекватного создания объекта? От куда можно взять основу и дальше усовершенствовать?
 
Сообщения
835
Реакции
516
Помог
12 раз(а)
а что тут не так?
фонтанчик из памяти

так хотя бы сделай, чтобы память каждый раз не выделялась
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;
    }
}
 
Сообщения
107
Реакции
10
вот тут может несколько мешков создаться, если 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( )
            }
        }
    }
}
Еще подскажите как сделать что бы я не проходил через свой объект. Спасибо
 
Сообщения
835
Реакции
516
Помог
12 раз(а)
проверяет что в этом фрейме игрок нажал Е, но в прошлом кадре не было зафиксировано нажатие
PHP:
if (pev(id, pev_buttons) & IN_USE && ~pev(id, pev_oldbuttons) & IN_USE) {
// действие
}
Еще подскажите как сделать что бы я не проходил через свой объект. Спасибо
pev_owner замени на что-то другое

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

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


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

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

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

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

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