AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Detect takedamage of entity (https://forums.alliedmods.net/showthread.php?t=225732)

wicho 09-08-2013 12:46

Detect takedamage of entity
 
Hi everybody, well i used a extra item of zombie plague called sandbags, well my question is how i detect when the entity takes damage for example i want when a zombie attack the sandbag i want to show the hp entity to the owner on central print, how i can do this? thx in advance

This is the entity:

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"); 

     


public 
fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type

    
//Victim is not sandbag. 
    
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]-= 
                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,
        
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] = 
                

            } 
        } 
     
    } 
     


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]+= 
    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]+= 
       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   




simanovich 09-08-2013 14:39

Re: Detect takedamage of entity
 
PHP Code:

RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage"); 

It's already in the code

colossus 09-08-2013 14:52

Re: Detect takedamage of entity
 
Use RegisterHamFromEntity in the entity creation... Before create a public...
Example:

Code:
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <fakemeta> #include <hamsandwich> #define PLUGIN "Test Entity" #define VERSION "1.0" #define AUTHOR "colossus" public plugin_init() {     register_plugin(PLUGIN, VERSION, AUTHOR)         // Add your code here...     register_clcmd("say /entity", "MakeEntity")         register_forward( FM_PlayerPreThink, "PlayerThink") } public MakeEntity(id) {     new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));         set_pev(iEnt, pev_classname, "Entity");     set_pev(iEnt, pev_health, 100.0);     static iEntityTake     if(!iEntityTake) { iEntityTake = true; RegisterHamFromEntity(Ham_TakeDamage, iEnt, "PalletsTake"); } } public PalletsTake(iVictim, iAttacker, iGibmode) {     if(!is_user_connected(iAttacker))         return HAM_SUPERCEDE;             static iOwner, szName[33]     iOwner  = pev(iVictim, pev_iuser1) // This is pallet owner     get_user_name(iOwner, szName, charsmax(szName))     client_print(iAttacker, print_chat, "You affect the pallet :( ... Pallet Owner: %s", szName)         return HAM_IGNORED; }   public PlayerThink(id) {     if (!(1 <= id <= get_maxplayers() && is_user_alive(id)))         return             static iEntity, iBody, szClassName[33], iOwner, fHealth, szName[33];     get_user_aiming( id, iEntity, iBody, 350 )     pev( iEntity, pev_classname, szClassName, 32 );         if( equal( szClassName, "Entity"))     {         fHealth = pev(iEntity, pev_health)         iOwner = pev( iEntity, pev_iuser1)         get_user_name(iOwner, szName, charsmax(szName))                 client_print(id, print_center, "Owner: %s   |   Health: %.1f", szName, fHealth)     }     else client_print(id, print_center, "") }

JusTGo 09-08-2013 16:21

Re: Detect takedamage of entity
 
untested does this show pallet health ?;:
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 client_putinserveriClient )
{
  
set_task1.0"Task_CheckAiming"iClient 3389__"b" );
}

public 
client_disconnectiClient )
{
  
remove_taskiClient 3389 );
}

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"); 

     


public 
fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type

    
//Victim is not sandbag. 
    
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]-= 
                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,
        
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] = 
                

            } 
        } 
     
    } 
     


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]+= 
    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_get_user_zombie(id) && is_user_alive(id))
       {
       if(!
done[id]) 
       { 
       
g_bolsas[id]+= 
       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   

}  
public 
Task_CheckAimingiTaskIndex ,id)
{
  static 
iClient;
  
iClient iTaskIndex 3389;

  if( 
is_user_aliveiClient ) )
             if ( !
zp_get_user_zombie(id) ) 
            { 
                new 
entbody, class[32]; 
                
get_user_aiming(identbody); 
                if (
pev_valid(ent))  
                { 
                    
pev(entpev_classname, class, 31); 
                     
                    if (
equal(class, "amxx_pallets"))
                    {
                        
set_hudmessage(01912550.420.1406.012.0)
                        
show_hudmessageiClient"Health: %d"peventpev_health ));
                    }
                }
            }



wicho 09-08-2013 17:25

Re: Detect takedamage of entity
 
i want to show the hp sandbag to the owner when the zombie attack entity i dont want to show when the owner aim the ent, i mean if the entity take damage the hp ent appears on the center screen of the owner (only when zombie attack). This make on takedamage right? but how i can make with entitys can someone give an example..


All times are GMT -4. The time now is 18:49.

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