Raised This Month: $51 Target: $400
 12% 

Solved [ZP] Block sandbags in modes


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Percib4l
Junior Member
Join Date: May 2021
Old 08-29-2021 , 03:16   [ZP] Block sandbags in modes
Reply With Quote #1

Hio guys, i need block this extra item in specials rounds, say that, just work in gamemode infection/miltiple.

PHP Code:
#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 pnumpluginremove_nrndmaxpalletsphealth;  

// num of pallets with bags  
new palletscout 0;  

new 
bool:done[33]  

/* Models for pallets with bags .  
  Are available 2 models, will be set a random of them  */  
new g_models[][] =  
{  
    
"models/pallet_with_bags2.mdl",  
    
"models/pallet_with_bags.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[] = { "Sandbags" }  
const 
g_item_bolsas 30  
new g_itemid_bolsas  
new ZPSTUCK  

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

new g_iMsgSayTxt

public plugin_init()   
{  
    
/* Register the plugin */  
      
    
register_plugin("HK'| Extra: SandBags""1.1""LARP")  
    
set_task(0.1,"checkstuck",0,"",0,"b")  
    
g_itemid_bolsas zp_register_extra_item(g_item_nameg_item_bolsasZP_TEAM_HUMAN)  
    
/* Register the cvars */  
    
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","100"); // 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("\ySand Bags:"), 1023"menu_command" );  
    
register_clcmd("say /sb","gbuy");  
    
register_clcmd("say_team /sb","gbuy");  
    
    
register_clcmd("say /sb","gbuy");  
    
register_clcmd("say_team /sb","gbuy"); 
       
    
//RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage");   
    //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)  
    
    
g_iMsgSayTxt get_user_msgid("SayText")
}  

public 
fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type)  
{  
    
//Victim is not lasermine.  
    
new sz_classname[32]  
    
entity_get_stringvictim EV_SZ_classname sz_classname31 )  
    if( !
equali(sz_classname,"amxx_pallets") )  
        return 
HAM_IGNORED;  
      
    
//Attacker is zombie  
    
if( zp_get_user_zombieattacker ) )   
        return 
HAM_IGNORED;  
      
    
//Block Damage  
    
return HAM_SUPERCEDE;  
}  

public 
fw_PlayerKilled(victimattackershouldgib
{      
    new 
sz_classname[32], name[32], Floathealth  
    entity_get_string
(victim EV_SZ_classname sz_classnamecharsmax(sz_classname)) 

    
get_user_name(attackernamecharsmax(name)) 
    
health entity_get_float(victimEV_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(attackerzp_get_user_ammo_packs(attacker) + 5
        
print_colored(0"!gHK'| !t%s !yearned !t5 points !yby destroying sandbag!"name)  
        return 
HAM_IGNORED
    }  
   return 
HAM_IGNORED
}  

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"\ySand Bags:^n" );  
        
nLen += formatszMenuBody[nLen], 255-nLen"^n\w1. Place a Sandbags" );  
        
//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;  
    }  
    
print_colored(id"!gHK'| !tThe 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 )  
                {  
                    
print_colored(id"!gHK'| !tYou 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      
            
}  
            
print_colored(id"!gHK'| !tThe 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  
                        print_colored(id, "!gHK'| !tYou are not aiming at a pallet with bags");  
                }  
                else  
                    print_colored(id, "!gHK'| !tYou 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,"!gHK'| !tFor 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)  
    {  
        
print_colored(id,"!gHK'| !tYou 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);  

    
set_pev(entpev_ownerid); 
      
    
// num ..  
    
palletscout++;  


    
set_task(0.1"glow_sandbags"ent_,_"b")
      
    
// confirm message  
     
    
    
new szBuy[33]
    
get_user_name(idszBuycharsmax(szBuy))
    
print_colored(0"!gHK'| !t%s have placed a Sandbags!"szBuy)
     
    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()  
{  
  for ( new 
idid <= get_maxplayers(); id++)  
{  
    if( 
get_pcvar_num remove_nrnd ) == 1)  
        
remove_allpalletswbags();  

    
done[id] = false  
    g_bolsas
[id] = 0   
  
}  
          
}   


/* ====================================================  
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) && !fm_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 
zp_extra_item_selected(iditemid)  
{  
  if (
itemid == g_itemid_bolsas)
   {
    if(!
done[id])  
    {  
    
g_bolsas[id]+= 2  
    set_task
(0.3,"show_the_menu",id)  
    
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])  
    
done[id] = true 
    
     
    
return PLUGIN_CONTINUE 

    


     
    else {  
    
    
print_colored(id"!gHK'| !tMax Sandbags reached !!!")  
    return 
PLUGIN_HANDLED 
    
}  
   
  }  
  return 
PLUGIN_CONTINUE  
}   

public 
gbuy(id

       if ( 
zp_get_user_zombie(id) || !is_user_alive(id)){     
       return 
PLUGIN_HANDLED 
       


       if (
zp_get_user_ammo_packs(id) < g_item_bolsas) { 
       
print_colored(id"!gHK'| !tYou don't have enough !ypoint!t.")     
       return 
PLUGIN_HANDLED 
       


       
//if(!zp_core_is_zombie(id) && is_user_alive(id)) 
       

       if(!
done[id])  
       {  
       
g_bolsas[id]+= 2  
       set_task
(0.3,"show_the_menu",id)  
       
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])  
       
done[id] = true  
       zp_set_user_ammo_packs
(idzp_get_user_ammo_packs(id) - g_item_bolsas
       return 
PLUGIN_CONTINUE 
       


     
       else {  
      
       
print_colored(id"!gHK'| !tMax Sandbags reached !!!")  
       return 
PLUGIN_HANDLED 
       
}  
  
       } 

       return 
PLUGIN_CONTINUE    

}   

stock print_colored(const index, const input [ ], const any:...) 
{  
    new 
message[191
    
vformat(message190input3
    
replace_all(message190"!y""^1"
    
replace_all(message190"!t""^3"
    
replace_all(message190"!g""^4"

    if(
index
    { 
        
//print to single person 
        
message_begin(MSG_ONEg_iMsgSayTxt_index
        
write_byte(index
        
write_string(message
        
message_end() 
    } 
    else 
    { 
        
//print to all players 
        
new players[32], countiid 
        get_players
(playerscount"ch"
        for( 
0count++ ) 
        { 
            
id players[i
            if(!
is_user_connected(id)) continue; 

            
message_begin(MSG_ONE_UNRELIABLEg_iMsgSayTxt_id
            
write_byte(id
            
write_string(message
            
message_end() 
        } 
    } 
}  

public 
glow_sandbags(Ent



    if (!
pev_valid(Ent)) return PLUGIN_HANDLED 



    
new classname[32

    
pev(Entpev_classnameclassnamecharsmax(classname)) 

    if (!
equali(classname"amxx_pallets")) return PLUGIN_HANDLED 



    
if (pev(Entpev_health) >= 600

        
set_rendering(EntkRenderFxGlowShell02550kRenderNormal5

    if (
pev(Entpev_health) < 300

        
set_rendering(EntkRenderFxGlowShell2552550kRenderNormal5

    if (
pev(Entpev_health) < 150

        
set_rendering(EntkRenderFxGlowShell25500kRenderNormal5



    return 
PLUGIN_CONTINUE 



Thanks in advance, whoever helps me.

Last edited by Percib4l; 08-30-2021 at 19:19. Reason: Solved
Percib4l is offline
Old 08-30-2021, 03:15
Dexon
This message has been deleted by Dexon.
Dexon
Member
Join Date: Aug 2019
Old 08-30-2021 , 03:50   Re: [ZP] Block sandbags in modes
Reply With Quote #2

Hello,
due to we have to check the round and print a message in every case if the user attempts to buy or place the item down, we create a little stock:
Code:
ReadyToBuy(){
    if(zp_is_nemesis_round() || zp_is_survivor_round() || zp_is_swarm_round() || zp_is_plague_round()){
        print_colored(id, "!gHK'| !tYou cannot use this item in this round.")
        return 0
    }
    return 1
}
Just paste it in the end of the code.

Now we search up for the cases that i mentioned:
zp_extra_item_selected(); -> Buy
gbuy(); -> Buy
menu_command(); -> Place down

so just edit them:
After the checks went through in the given function, we add one more check for the ReadyToBuy() stock, e.g:
if(!ReadyToBuy()) return PLUGIN_HANDLED;
(the return value 'dnt be necessarry, we are using it because the author wrote the code in this way, so we also should go on this way)

Furthermore just replace the mentioned functions with these ones if you got confused or got stuck:
PHP Code:
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 )  
                {  
                    
print_colored(id"!gHK'| !tYou do not have to place sandbags!")  
                    return 
PLUGIN_CONTINUE  
                
}
                if(!
ReadyToBuy()) return PLUGIN_CONTINUE

                g_bolsas
[id]-= 1
                
place_palletwbags(id);  
                
show_the_menu(id,level,cid);  
                return 
PLUGIN_CONTINUE      
            
}  
            
print_colored(id"!gHK'| !tThe 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  
                        print_colored(id, "!gHK'| !tYou are not aiming at a pallet with bags");  
                }  
                else  
                    print_colored(id, "!gHK'| !tYou 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);  
        }  
            */  
              
    
}  
}  

public 
zp_extra_item_selected(iditemid){  
    if (
itemid != g_itemid_bolsas || !ReadyToBuy()) return PLUGIN_HANDLED;

    if(!
done[id]){
        
g_bolsas[id]+= 2
        set_task
(0.3,"show_the_menu",id)
        
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])
        
done[id] = true
        
return PLUGIN_HANDLED
    
}    
    
print_colored(id"!gHK'| !tMax Sandbags reached !!!"
}

public 
gbuy(id

       if ( 
zp_get_user_zombie(id) || !is_user_alive(id)){     
       return 
PLUGIN_HANDLED 
       


       if (
zp_get_user_ammo_packs(id) < g_item_bolsas) { 
       
print_colored(id"!gHK'| !tYou don't have enough !ypoint!t.")     
       return 
PLUGIN_HANDLED 
       


       if(!
ReadyToBuy()) return PLUGIN_HANDLED

       
//if(!zp_core_is_zombie(id) && is_user_alive(id))
       

       if(!
done[id])  
       {  
       
g_bolsas[id]+= 2  
       set_task
(0.3,"show_the_menu",id)  
       
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])  
       
done[id] = true  
       zp_set_user_ammo_packs
(idzp_get_user_ammo_packs(id) - g_item_bolsas
       return 
PLUGIN_CONTINUE 
       
}
      
       
print_colored(id"!gHK'| !tMax Sandbags reached !!!")
  
       }

Dexon is offline
Percib4l
Junior Member
Join Date: May 2021
Old 08-30-2021 , 08:21   Re: [ZP] Block sandbags in modes
Reply With Quote #3

Quote:
Originally Posted by Dexon View Post
Hello,
due to we have to check the round and print a message in every case if the user attempts to buy or place the item down, we create a little stock:
Code:
ReadyToBuy(){
    if(zp_is_nemesis_round() || zp_is_survivor_round() || zp_is_swarm_round() || zp_is_plague_round()){
        print_colored(id, "!gHK'| !tYou cannot use this item in this round.")
        return 0
    }
    return 1
}
Just paste it in the end of the code.

Now we search up for the cases that i mentioned:
zp_extra_item_selected(); -> Buy
gbuy(); -> Buy
menu_command(); -> Place down

so just edit them:
After the checks went through in the given function, we add one more check for the ReadyToBuy() stock, e.g:
if(!ReadyToBuy()) return PLUGIN_HANDLED;
(the return value 'dnt be necessarry, we are using it because the author wrote the code in this way, so we also should go on this way)

Furthermore just replace the mentioned functions with these ones if you got confused or got stuck:
PHP Code:
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 )  
                {  
                    
print_colored(id"!gHK'| !tYou do not have to place sandbags!")  
                    return 
PLUGIN_CONTINUE  
                
}
                if(!
ReadyToBuy()) return PLUGIN_CONTINUE

                g_bolsas
[id]-= 1
                
place_palletwbags(id);  
                
show_the_menu(id,level,cid);  
                return 
PLUGIN_CONTINUE      
            
}  
            
print_colored(id"!gHK'| !tThe 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  
                        print_colored(id, "!gHK'| !tYou are not aiming at a pallet with bags");  
                }  
                else  
                    print_colored(id, "!gHK'| !tYou 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);  
        }  
            */  
              
    
}  
}  

public 
zp_extra_item_selected(iditemid){  
    if (
itemid != g_itemid_bolsas || !ReadyToBuy()) return PLUGIN_HANDLED;

    if(!
done[id]){
        
g_bolsas[id]+= 2
        set_task
(0.3,"show_the_menu",id)
        
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])
        
done[id] = true
        
return PLUGIN_HANDLED
    
}    
    
print_colored(id"!gHK'| !tMax Sandbags reached !!!"
}

public 
gbuy(id

       if ( 
zp_get_user_zombie(id) || !is_user_alive(id)){     
       return 
PLUGIN_HANDLED 
       


       if (
zp_get_user_ammo_packs(id) < g_item_bolsas) { 
       
print_colored(id"!gHK'| !tYou don't have enough !ypoint!t.")     
       return 
PLUGIN_HANDLED 
       


       if(!
ReadyToBuy()) return PLUGIN_HANDLED

       
//if(!zp_core_is_zombie(id) && is_user_alive(id))
       

       if(!
done[id])  
       {  
       
g_bolsas[id]+= 2  
       set_task
(0.3,"show_the_menu",id)  
       
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])  
       
done[id] = true  
       zp_set_user_ammo_packs
(idzp_get_user_ammo_packs(id) - g_item_bolsas
       return 
PLUGIN_CONTINUE 
       
}
      
       
print_colored(id"!gHK'| !tMax Sandbags reached !!!")
  
       }

I dont know if how i edit it is fine, but it doesnt compile, im really bad with this xD

Thanks for the help Dexon.

PHP Code:
#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 pnumpluginremove_nrndmaxpalletsphealth;  

// num of pallets with bags  
new palletscout 0;  

new 
bool:done[33]  

/* Models for pallets with bags .  
  Are available 2 models, will be set a random of them  */  
new g_models[][] =  
{  
    
"models/pallet_with_bags2.mdl",  
    
"models/pallet_with_bags.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[] = { "Sandbags" }  
const 
g_item_bolsas 30  
new g_itemid_bolsas  
new ZPSTUCK  

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

new g_iMsgSayTxt

public plugin_init()   
{  
    
/* Register the plugin */  
      
    
register_plugin("HK'| Extra: SandBags""1.1""LARP")  
    
set_task(0.1,"checkstuck",0,"",0,"b")  
    
g_itemid_bolsas zp_register_extra_item(g_item_nameg_item_bolsasZP_TEAM_HUMAN)  
    
/* Register the cvars */  
    
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","100"); // 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("\ySand Bags:"), 1023"menu_command" );  
    
register_clcmd("say /sb","gbuy");  
    
register_clcmd("say_team /sb","gbuy");  
    
    
register_clcmd("say /sb","gbuy");  
    
register_clcmd("say_team /sb","gbuy"); 
       
    
//RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage");   
    //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)  
    
    
g_iMsgSayTxt get_user_msgid("SayText")
}  

public 
fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type)  
{  
    
//Victim is not lasermine.  
    
new sz_classname[32]  
    
entity_get_stringvictim EV_SZ_classname sz_classname31 )  
    if( !
equali(sz_classname,"amxx_pallets") )  
        return 
HAM_IGNORED;  
      
    
//Attacker is zombie  
    
if( zp_get_user_zombieattacker ) )   
        return 
HAM_IGNORED;  
      
    
//Block Damage  
    
return HAM_SUPERCEDE;  
}  

public 
fw_PlayerKilled(victimattackershouldgib
{      
    new 
sz_classname[32], name[32], Floathealth  
    entity_get_string
(victim EV_SZ_classname sz_classnamecharsmax(sz_classname)) 

    
get_user_name(attackernamecharsmax(name)) 
    
health entity_get_float(victimEV_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(attackerzp_get_user_ammo_packs(attacker) + 5
        
print_colored(0"!gHK'| !t%s !yearned !t5 points !yby destroying sandbag!"name)  
        return 
HAM_IGNORED
    }  
   return 
HAM_IGNORED
}  

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"\ySand Bags:^n" );  
        
nLen += formatszMenuBody[nLen], 255-nLen"^n\w1. Place a Sandbags" );  
        
//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;  
    }  
    
print_colored(id"!gHK'| !tThe 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 )  
                {  
                    
print_colored(id"!gHK'| !tYou do not have to place sandbags!")  
                    return 
PLUGIN_CONTINUE  
                
}
                if(!
ReadyToBuy()) return PLUGIN_CONTINUE

                g_bolsas
[id]-= 1
                
place_palletwbags(id);  
                
show_the_menu(id,level,cid);  
                return 
PLUGIN_CONTINUE      
            
}  
            
print_colored(id"!gHK'| !tThe 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  
                        print_colored(id, "!gHK'| !tYou are not aiming at a pallet with bags");  
                }  
                else  
                    print_colored(id, "!gHK'| !tYou 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,"!gHK'| !tFor 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)  
    {  
        
print_colored(id,"!gHK'| !tYou 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);  

    
set_pev(entpev_ownerid); 
      
    
// num ..  
    
palletscout++;  


    
set_task(0.1"glow_sandbags"ent_,_"b")
      
    
// confirm message  
     
    
    
new szBuy[33]
    
get_user_name(idszBuycharsmax(szBuy))
    
print_colored(0"!gHK'| !t%s have placed a Sandbags!"szBuy)
     
    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()  
{  
  for ( new 
idid <= get_maxplayers(); id++)  
{  
    if( 
get_pcvar_num remove_nrnd ) == 1)  
        
remove_allpalletswbags();  

    
done[id] = false  
    g_bolsas
[id] = 0   
  
}  
          
}   


/* ====================================================  
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) && !fm_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 
zp_extra_item_selected(iditemid){  
    if (
itemid != g_itemid_bolsas || !ReadyToBuy()) return PLUGIN_HANDLED;

    if(!
done[id]){
        
g_bolsas[id]+= 2
        set_task
(0.3,"show_the_menu",id)
        
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])
        
done[id] = true
        
return PLUGIN_HANDLED
    
}    
    
print_colored(id"!gHK'| !tMax Sandbags reached !!!"

   
  }  
  return 
PLUGIN_CONTINUE  
}   

public 
gbuy(id

       if ( 
zp_get_user_zombie(id) || !is_user_alive(id)){     
       return 
PLUGIN_HANDLED 
       


       if (
zp_get_user_ammo_packs(id) < g_item_bolsas) { 
       
print_colored(id"!gHK'| !tYou don't have enough !ypoint!t.")     
       return 
PLUGIN_HANDLED 
       


       if(!
ReadyToBuy()) return PLUGIN_HANDLED

       
//if(!zp_core_is_zombie(id) && is_user_alive(id))
       
{
       if(!
done[id])  
       {  
       
g_bolsas[id]+= 2  
       set_task
(0.3,"show_the_menu",id)  
       
print_colored(id"!gHK'| !tYou have %i sandbags, to use type 'say / sb'"g_bolsas[id])  
       
done[id] = true  
       zp_set_user_ammo_packs
(idzp_get_user_ammo_packs(id) - g_item_bolsas
       return 
PLUGIN_CONTINUE 
       
}
      
       
print_colored(id"!gHK'| !tMax Sandbags reached !!!")
  
       }


       return 
PLUGIN_CONTINUE    

}   

stock print_colored(const index, const input [ ], const any:...) 
{  
    new 
message[191
    
vformat(message190input3
    
replace_all(message190"!y""^1"
    
replace_all(message190"!t""^3"
    
replace_all(message190"!g""^4"

    if(
index
    { 
        
//print to single person 
        
message_begin(MSG_ONEg_iMsgSayTxt_index
        
write_byte(index
        
write_string(message
        
message_end() 
    } 
    else 
    { 
        
//print to all players 
        
new players[32], countiid 
        get_players
(playerscount"ch"
        for( 
0count++ ) 
        { 
            
id players[i
            if(!
is_user_connected(id)) continue; 

            
message_begin(MSG_ONE_UNRELIABLEg_iMsgSayTxt_id
            
write_byte(id
            
write_string(message
            
message_end() 
        } 
    } 
}  

public 
glow_sandbags(Ent



    if (!
pev_valid(Ent)) return PLUGIN_HANDLED 



    
new classname[32

    
pev(Entpev_classnameclassnamecharsmax(classname)) 

    if (!
equali(classname"amxx_pallets")) return PLUGIN_HANDLED 



    
if (pev(Entpev_health) >= 600

        
set_rendering(EntkRenderFxGlowShell02550kRenderNormal5

    if (
pev(Entpev_health) < 300

        
set_rendering(EntkRenderFxGlowShell2552550kRenderNormal5

    if (
pev(Entpev_health) < 150

        
set_rendering(EntkRenderFxGlowShell25500kRenderNormal5



    return 
PLUGIN_CONTINUE 



ReadyToBuy(){
    if(
zp_is_nemesis_round() || zp_is_survivor_round() || zp_is_swarm_round() || zp_is_plague_round()){
        
print_colored(id"!gHK'| !tYou cannot use this item in this round.")
        return 
0
    
}
    return 
1

Percib4l is offline
Dexon
Member
Join Date: Aug 2019
Old 08-30-2021 , 09:16   Re: [ZP] Block sandbags in modes
Reply With Quote #4

Quote:
I dont know if how i edit it is fine, but it doesnt compile, im really bad with this xD
I didn't look all through, but i think you did all fine, i made it wrong : ))

In the ReadyToBuy() stock we wanted to print a msg to an id, but there was no transfered id, so everywhere we wrote this, we'd have to change it to ReadyToBuy(id).

Also, I fixed warnings about return values(because the compiler thinks like if there is a return value in a native, we may have forgotten to make a default return value), here it is
Attached Files
File Type: sma Get Plugin or Get Source (test.sma - 95 views - 19.1 KB)
Dexon is offline
Percib4l
Junior Member
Join Date: May 2021
Old 08-30-2021 , 09:32   Re: [ZP] Block sandbags in modes
Reply With Quote #5

I compile it perfectly, I will see if it works on the server, I will warn you of any problems.
Percib4l is offline
Percib4l
Junior Member
Join Date: May 2021
Old 08-30-2021 , 16:25   Re: [ZP] Block sandbags in modes
Reply With Quote #6

Quote:
Originally Posted by Dexon View Post
I didn't look all through, but i think you did all fine, i made it wrong : ))

In the ReadyToBuy() stock we wanted to print a msg to an id, but there was no transfered id, so everywhere we wrote this, we'd have to change it to ReadyToBuy(id).

Also, I fixed warnings about return values(because the compiler thinks like if there is a return value in a native, we may have forgotten to make a default return value), here it is
It works fine, last question, how can I block it from starting until it finds zombies?
That is, it cannot be used if I do not start the round.
Percib4l is offline
Dexon
Member
Join Date: Aug 2019
Old 08-30-2021 , 18:35   Re: [ZP] Block sandbags in modes
Reply With Quote #7

Search up to menu_command() function, and take a look to the switch() statement, inside that:
Code:
case 0: 
        {  
            if ( !zp_get_user_zombie(id) )  
            {  
                new money = g_bolsas[id]  
                if ( money < 1 )  
                {  
                    print_colored(id, "!gHK'| !tYou do not have to place sandbags!")  
                    return PLUGIN_CONTINUE  
                }
                if(!ReadyToBuy(id)) return PLUGIN_CONTINUE

                g_bolsas[id]-= 1; 
                place_palletwbags(id);  
                show_the_menu(id,level,cid);  
                return PLUGIN_CONTINUE      
            }  
            print_colored(id, "!gHK'| !tThe zombies can not use this!!")  
            return PLUGIN_CONTINUE      
        }
And after we check if the item is ready to buy, we add an other check whether the round already started ot not:
Code:
if(!zp_has_round_started()){
    //if no,
    /*we print a msg to the player ->*/print_colored(id, "!gHK'| !tYou cant place sandbags before the round start.")
    /*we do a return with value what stops the plugin ->*/return PLUGIN_CONTINUE  
}
That's all
Attached Files
File Type: sma Get Plugin or Get Source (test.sma - 84 views - 19.3 KB)

Last edited by Dexon; 08-30-2021 at 18:35.
Dexon is offline
Percib4l
Junior Member
Join Date: May 2021
Old 08-30-2021 , 19:13   Re: [ZP] Block sandbags in modes
Reply With Quote #8

Quote:
Originally Posted by Dexon View Post
Search up to menu_command() function, and take a look to the switch() statement, inside that:
Code:
case 0: 
        {  
            if ( !zp_get_user_zombie(id) )  
            {  
                new money = g_bolsas[id]  
                if ( money < 1 )  
                {  
                    print_colored(id, "!gHK'| !tYou do not have to place sandbags!")  
                    return PLUGIN_CONTINUE  
                }
                if(!ReadyToBuy(id)) return PLUGIN_CONTINUE

                g_bolsas[id]-= 1; 
                place_palletwbags(id);  
                show_the_menu(id,level,cid);  
                return PLUGIN_CONTINUE      
            }  
            print_colored(id, "!gHK'| !tThe zombies can not use this!!")  
            return PLUGIN_CONTINUE      
        }
And after we check if the item is ready to buy, we add an other check whether the round already started ot not:
Code:
if(!zp_has_round_started()){
    //if no,
    /*we print a msg to the player ->*/print_colored(id, "!gHK'| !tYou cant place sandbags before the round start.")
    /*we do a return with value what stops the plugin ->*/return PLUGIN_CONTINUE  
}
That's all
Much, very much thanks bro.
Percib4l is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 11:45.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode