Thread: [Subplugin Submission] [ZP] Extra Item: Sand Bags BETA!
View Single Post
Noam
Member
Join Date: Jun 2019
Old 06-23-2019 , 09:18   Re: [ZP] Extra Item: Sand Bags BETA!
Reply With Quote #111

Quote:
Originally Posted by DON KHAN 1 View Post
can anybody make it for vip?
i tried alot but got some bugs.
PHP Code:
/*================================================================================
    
    -----------------------------------
    -*- [ZP] Sandbags -*-
    -----------------------------------
    
    ~~~~~~~~~~~~~~~
    - Description -
    ~~~~~~~~~~~~~~~
    
    Original by SAMURAI, Upgraded to zp by LARP
    [email protected] (Chile) Languaje spanish!
    
================================================================================*/


#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>
#include <fun>
#include <zombieplague>
#include <zmvip>

// 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)

// cvars
new pnumpluginremove_nrndmaxpalletsphealth;

// num of pallets with bags
new palletscout 0;

/* Models for pallets with bags .
  Are available 2 models, will be set a random of them  */
new g_models[][] =
{
    
"models/zombie_plague/SandBag/SandBag1.mdl",
    
"models/zombie_plague/SandBag/SandBag.mdl"
}

new 
stuck[33]
new 
g_bolsas[33];
new 
cvar[3]

new const 
Float:size[][3] = {
    {
0.00.01.0}, {0.00.0, -1.0}, {0.01.00.0}, {0.0, -1.00.0}, {1.00.00.0}, {-1.00.00.0}, {-1.01.01.0}, {1.01.01.0}, {1.0, -1.01.0}, {1.01.0, -1.0}, {-1.0, -1.01.0}, {1.0, -1.0, -1.0}, {-1.01.0, -1.0}, {-1.0, -1.0, -1.0},
    {
0.00.02.0}, {0.00.0, -2.0}, {0.02.00.0}, {0.0, -2.00.0}, {2.00.00.0}, {-2.00.00.0}, {-2.02.02.0}, {2.02.02.0}, {2.0, -2.02.0}, {2.02.0, -2.0}, {-2.0, -2.02.0}, {2.0, -2.0, -2.0}, {-2.02.0, -2.0}, {-2.0, -2.0, -2.0},
    {
0.00.03.0}, {0.00.0, -3.0}, {0.03.00.0}, {0.0, -3.00.0}, {3.00.00.0}, {-3.00.00.0}, {-3.03.03.0}, {3.03.03.0}, {3.0, -3.03.0}, {3.03.0, -3.0}, {-3.0, -3.03.0}, {3.0, -3.0, -3.0}, {-3.03.0, -3.0}, {-3.0, -3.0, -3.0},
    {
0.00.04.0}, {0.00.0, -4.0}, {0.04.00.0}, {0.0, -4.00.0}, {4.00.00.0}, {-4.00.00.0}, {-4.04.04.0}, {4.04.04.0}, {4.0, -4.04.0}, {4.04.0, -4.0}, {-4.0, -4.04.0}, {4.0, -4.0, -4.0}, {-4.04.0, -4.0}, {-4.0, -4.0, -4.0},
    {
0.00.05.0}, {0.00.0, -5.0}, {0.05.00.0}, {0.0, -5.00.0}, {5.00.00.0}, {-5.00.00.0}, {-5.05.05.0}, {5.05.05.0}, {5.0, -5.05.0}, {5.05.0, -5.0}, {-5.0, -5.05.0}, {5.0, -5.0, -5.0}, {-5.05.0, -5.0}, {-5.0, -5.0, -5.0}
}

new const 
g_item_name[] = { "2 Sandbags" }
new const 
g_item_name1[] = { "For Save You From Zombies" }
const 
g_item_bolsas 45
new g_itemid_bolsas
new ZPSTUCKg_BINDMODEg_MSGMODE

/*************************************************************
************************* AMXX PLUGIN *************************
**************************************************************/


public plugin_init() 
{
    
/* Register the plugin */
    //register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
    
    
register_plugin("[ZP] Extra: SandBags""1.1""LARP")
    
set_task(0.1,"checkstuck",0,"",0,"b")
    
g_itemid_bolsas zv_register_extra_item(g_item_nameg_item_name1g_item_bolsasZV_TEAM_HUMAN)
    
/* Register the cvars */
    
g_BINDMODE    register_cvar("zp_pb_bind","0");        //Auto bind L Key!
    
g_MSGMODE    register_cvar("zp_pb_msg","1");        //
    
ZPSTUCK register_cvar("zp_pb_stuck","1")
    
pnumplugin register_cvar("zp_pb_enable","1"); // 1 = ON ; 0 = OFF
    
remove_nrnd register_cvar("zp_pb_remround","1");
    
maxpallets register_cvar("zp_pb_limit","200"); // max number of pallets with bags
    
phealth register_cvar("zp_pb_health","200"); // set the health to a pallet with bags
    
    /* Game Events */
    
register_event("HLTV","event_newround""a","1=0""2=0"); // it's called every on new round
    
    /* This is for menuz: */
    
register_menucmd(register_menuid("\ySandBags:"), 1023"menu_command" );
    
register_clcmd("say /pb","show_the_menu");
    
register_clcmd("say /sb","show_the_menu");
    
//cvar[0] = register_cvar("zp_autounstuck","1")
    
cvar[1] = register_cvar("zp_pb_stuckeffects","1")
    
cvar[2] = register_cvar("zp_pb_stuckwait","7")

}


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

public 
show_the_menu(id,level,cid)
{
    
// check if user doesen't have admin 
    /*if( ! cmd_access( id,level, cid , 0 ))
        return PLUGIN_HANDLED;
    */
    
    // check if the plugin cvar is turned off
    
if( ! get_pcvar_numpnumplugin ) )
        return 
PLUGIN_HANDLED;
        
        
    
// check if user isn't alive
    
if( ! is_user_aliveid ) )
    {
        
client_printidprint_chat"" ); //msg muerto
        
return PLUGIN_HANDLED;
    }
            
    if ( !
zp_get_user_zombie(id) )
    {        
        new 
szMenuBody[256];
        new 
keys;
        
        new 
nLen formatszMenuBody255"\ySandBags:^n" );
        
nLen += formatszMenuBody[nLen], 255-nLen"^n\w1. Place a Sandbags (%i Remaining)"g_bolsas[id] );
        
//nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. Remove a pallet with bags" );
        
nLen += formatszMenuBody[nLen], 255-nLen"^n^n\w0. Exit" );

        
keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<9)

        
show_menuidkeysszMenuBody, -);

        
// depends what you want, if is continue will appear on chat what the admin sayd
        
return PLUGIN_HANDLED;
    }
    
client_print(idprint_chat"[ZP] The zombies can not use this command!")
    return 
PLUGIN_HANDLED;
}


public 
menu_command(id,key,level,cid)
{
    
    switch( 
key )
    {
        
// place a pallet with bags
        
case 0
        {
            if ( !
zp_get_user_zombie(id) )
            {
                new 
money g_bolsas[id]
                if ( 
money )
                {
                    if ( 
get_pcvar_num(g_MSGMODE) == )
                        {
                            
set_hudmessage(001000.800.8006.02.01.01.0)
                            
show_hudmessage(id"You do not have to^nplace sandbags")
                            return 
PLUGIN_CONTINUE
                        
}
                    
client_print(idprint_chat"[ZP] You do not have to place sandbags!")
                    return 
PLUGIN_CONTINUE
                
}
                
g_bolsas[id]-= 1
                place_palletwbags
(id);
                
show_the_menu(id,level,cid);
                return 
PLUGIN_CONTINUE    
            
}
            
client_print(idprint_chat"[ZP] The zombies can not use this!!")
            return 
PLUGIN_CONTINUE    
        
}
        
        
// remove a pallet with bags
        /*case 1:
        {
            if ( !zp_get_user_zombie(id) )
            {
                new ent, body, class[32];
                get_user_aiming(id, ent, body);
                if (pev_valid(ent)) 
                {
                    pev(ent, pev_classname, class, 31);
                    
                    if (equal(class, "amxx_pallets")) 
                    {
                        g_bolsas[id]+= 1
                        fm_remove_entity(ent);
                    }
                    
                    else
                        client_print(id, print_chat, "[ZP] You are not aiming at a pallet with bags");
                }
                else
                    client_print(id, print_chat, "[ZP] You are not aiming at a valid entity !");
                    
                show_the_menu(id,level,cid);
            }
        }
        */
        
        // remove all pallets with bags
        /*case 2:
        {
            g_bolsas[id]= 0
            remove_allpalletswbags();
            client_print(id,print_chat,"[AMXX] You removed all pallets with bags !");
            show_the_menu(id,level,cid);
        }
            */
            
    
}
    
    return 
PLUGIN_HANDLED;
}



public 
place_palletwbags(id)
{
    
    if( 
palletscout == get_pcvar_num(maxpallets) )
    {
        
client_print(id,print_chat,"[ZP] For security reasons only allow %d Sandbags on the server!",get_pcvar_num(maxpallets));
        return 
PLUGIN_HANDLED;
    }
    
    
// create a new entity 
    
new ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"func_wall"));
    
    
    
// set a name to the entity
    
set_pev(ent,pev_classname,"amxx_pallets");
    
    
// set model        
    
engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]);
    
    
// register a new var. for origin
    
static Float:xorigin[3];
    
get_user_hitpoint(id,xorigin);
    
    
    
// check if user is aiming at the air 
    
if(engfunc(EngFunc_PointContents,xorigin) == CONTENTS_SKY)
    {
        
client_print(id,print_chat,"[ZP] You can not put sandbags in the sky!");
        return 
PLUGIN_HANDLED;
    }
    
    
    
// set sizes
    
static Float:p_mins[3], Float:p_maxs[3];
    
p_mins PALLET_MINS;
    
p_maxs PALLET_MAXS;
    
engfunc(EngFunc_SetSizeentp_minsp_maxs);
    
set_pev(entpev_minsp_mins);
    
set_pev(entpev_maxsp_maxs );
    
set_pev(entpev_absminp_mins);
    
set_pev(entpev_absmaxp_maxs );

    
    
// set the rock of origin where is user placed
    
engfunc(EngFunc_SetOriginentxorigin);
    
    
    
// make the rock solid
    
set_pev(ent,pev_solid,SOLID_BBOX); // touch on edge, block
    
    // set the movetype
    
set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff
    
    // now the damage stuff, to set to take it or no
    // if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags
    // else, if you want to make it destroyable, just set the health > 0 and will be
    // destroyable.
    
new Float:p_cvar_health get_pcvar_float(phealth);
    switch(
p_cvar_health)
    {
        case 
0.0 :
        {
            
set_pev(ent,pev_takedamage,DAMAGE_NO);
        }
        
        default :
        {
            
set_pev(ent,pev_health,p_cvar_health);
            
set_pev(ent,pev_takedamage,DAMAGE_YES);
        }
    }
    
            
    static 
Float:rvec[3];
    
pev(id,pev_v_angle,rvec);
    
    
rvec[0] = 0.0;
    
    
set_pev(ent,pev_angles,rvec);
    
    
// drop entity to floor
    
fm_drop_to_floor(ent);
    
    
// num ..
    
palletscout++;
    
    
// confirm message
    
if ( get_pcvar_num(g_MSGMODE) == )
    {
        
set_hudmessage(001000.800.8006.02.01.01.0)
        
show_hudmessage(id"You placed a SandBag^n%i Remaining"g_bolsas[id])
        return 
PLUGIN_HANDLED
    
}
    
client_print(idprint_chat"[ZP] You have placed a Sandbag.")
    return 
PLUGIN_HANDLED;
}
    
/* ====================================================
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(idFloat:hOrigin[3]) 
{
    if ( ! 
is_user_aliveid ))
        return 
0;
    
    new 
Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3];
    new 
Float:fTemp[3];
    
    
pev(idpev_originfOrigin);
    
pev(idpev_v_anglefvAngle);
    
pev(idpev_view_ofsfvOffset);
    
    
xs_vec_add(fOriginfvOffsetfvOrigin);
    
    
engfunc(EngFunc_AngleVectorsfvAnglefeOriginfTempfTemp);
    
    
xs_vec_mul_scalar(feOrigin9999.9feOrigin);
    
xs_vec_add(fvOriginfeOriginfeOrigin);
    
    
engfunc(EngFunc_TraceLinefvOriginfeOrigin0id);
    
global_get(glb_trace_endposhOrigin);
    
    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()
{
    if( 
get_pcvar_num remove_nrnd ) == 1)
        
remove_allpalletswbags();
        
}


/* ====================================================
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);
        
    
palletscout 0;
}

public 
checkstuck() {
    if ( 
get_pcvar_num(ZPSTUCK) == )
    {
        static 
players[32], pnumplayer
        get_players
(playerspnum)
        static 
Float:origin[3]
        static 
Float:mins[3], hull
        
static Float:vec[3]
        static 
o,i
        
for(i=0i<pnumi++){
            
player players[i]
            if (
is_user_connected(player) && is_user_alive(player)) {
                
pev(playerpev_originorigin)
                
hull pev(playerpev_flags) & FL_DUCKING HULL_HEAD HULL_HUMAN
                
if (!is_hull_vacant(originhull,player) && !get_user_noclip(player) && !(pev(player,pev_solid) & SOLID_NOT)) {
                    ++
stuck[player]
                    if(
stuck[player] >= get_pcvar_num(cvar[2])) {
                        
pev(playerpev_minsmins)
                        
vec[2] = origin[2]
                        for (
o=0sizeof 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(vechull,player)) {
                                
engfunc(EngFunc_SetOriginplayervec)
                                
effects(player)
                                
set_pev(player,pev_velocity,{0.0,0.0,0.0})
                                
sizeof size
                            
}
                        }
                    }
                }
                else
                {
                    
stuck[player] = 0
                
}
            }
        }
    
    }
    
}

stock bool:is_hull_vacant(const Float:origin[3], hull,id) {
    static 
tr
    engfunc
(EngFunc_TraceHulloriginorigin0hullidtr)
    if (!
get_tr2(trTR_StartSolid) || !get_tr2(trTR_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.00.6506.01.5,0.1,0.7// HUDMESSAGE
        
show_hudmessage(id,"Automatic Unstuck!"// 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 
zv_extra_item_selected(playeritemid)
{
    if (
itemid == g_itemid_bolsas)
    {
        
g_bolsas[player]+= 2
        cmd_bind
(player)
        
set_task(0.3,"show_the_menu",player)
        if ( 
get_pcvar_num(g_MSGMODE) == )
        {
            
set_hudmessage(001000.800.8006.02.01.01.0)
            
show_hudmessage(player"Plugin By LLRAP ^nChile 2008 :)")
        }
    }

}

public 
cmd_bind(id)
{
    if ( 
get_pcvar_num(g_BINDMODE) == )
    {
        
client_print(idprint_chat"[ZP] You have %i sandbags, to use with the key 'L'"g_bolsas[id])
        
client_cmd(id,"bind l /pb")
        return 
PLUGIN_HANDLED
    
}
    
client_print(idprint_chat"[ZP] You have %i sandbags, to use type 'say /pb'"g_bolsas[id])
    return 
PLUGIN_HANDLED



Last edited by Noam; 06-23-2019 at 09:19.
Noam is offline