AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   How to give semiclip to owner (https://forums.alliedmods.net/showthread.php?t=222897)

wicho 08-07-2013 20:43

How to give semiclip to owner
 
Hi everybody well i ask on zombie seccion but no one answered so i post here, well i use a item of zombie plague called sandbags i want to add semiclip to the owner i mean only the player who bought the sandbags can cross own and the others humans cant cross, how i can do this?

this is the code:

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


public plugin_init()   
{  
    
/* Register the plugin */  
      
    
register_plugin("[ZP] 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","3000"); // 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 /sandbags","show_the_menu");  
    
register_clcmd("say_team /sandbags","show_the_menu");  
    
    
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");  

      
}  
//Here is what I am tryin to make just owner and zombie to be able to destroy sandbags  
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 
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;  
    }  
    
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 )  
                {  
                    
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  
    
client_print(idprint_chat"[ZP] You have placed a Sandbags, you have %i remaining"g_bolsas[id])  
     
    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)  
    
client_print(idprint_chat"[ZP] You have %i sandbags, to use type 'say / sb'"g_bolsas[id])  
    
done[id] = true  
     
    
return PLUGIN_CONTINUE 

    


     
    else {  
    
    
client_print(idprint_chat"Max 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) { 
       
client_print(idprint_chat"Sorry... you don't have enough ammo pack.")     
       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)  
       
client_print(idprint_chat"[ZP] You 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 {  
      
       
client_print(idprint_chat"Max Sandbags reached !!!")  
       return 
PLUGIN_HANDLED 
       
}  
  
       } 

       return 
PLUGIN_CONTINUE    





All times are GMT -4. The time now is 15:53.

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