View Single Post
Author Message
Fail!
BANNED
Join Date: Jan 2010
Location: BFTCommunity
Old 05-08-2010 , 13:31   [ZP] Campo de Fuerza
#1

Campo de Fuerza


  • Descripcion: En este tutorial enseñare a crear una nueva clase de bomba con la entidad del campo de fuerza.
  • Code by: lucas_7_94
  • Skins / Models by: Speed! / 01101101

Bueno empecemos, antes que nada abrimos el "zombie_plague40.sma" o como lo tengan.

Luego nos dirigimos al inicio del plugin, debajo de los includes colocamos lo siguiente:

PHP Code:
#define ONE_COLOR // color de la burbuja.
#define CAMPO_TASK // task = cuanto dura el campo de fuerza y lo elimina.

//#define RANDOM_COLOR // color por default.

#if defined ONE_COLOR
new Float:colour_force_shield[3] = { 255.0 255.0 255.0 // color de la burbuja ( red, gree, blue ).
#endif

new g_bubble_bomb[33// variable del campo
new const model_grenade[] = "models/zombie_plague/v_auragren.mdl" // model "v_".
new const model[] = "models/zombie_plague/aura8.mdl" // model de la burbuja.
new const w_model[] = "models/zombie_plague/w_aura.mdl" // model "w_".
new const entclas[] = "campo_grenade_forze" // nombre de la clase de entidad. 
Luego buscamos la siguiente linea:

PHP Code:
public plugin_precache() 
Y debajo del "{" colocamos lo siguiente:

PHP Code:
    engfunc(EngFunc_PrecacheModelmodel_grenade// precacheamos el model "v_".
    
engfunc(EngFunc_PrecacheModelmodel// precacheamos el model de la burbuja.
    
engfunc(EngFunc_PrecacheModelw_model// precacheamos el model "w_". 
Una vez terminado eso vamos a:

PHP Code:
public plugin_init() 
Y colocamos lo siguiente:

PHP Code:
    register_clcmd("BUBBLEBOMB""give_item_bubble"// podemos llamar a la bomba. console_cmd(id, "BUBBLEBOMB")
    
register_event("CurWeapon""hook_curwpn""be""1=1""2!29");
    
cvar_bubblepush register_cvar("zp_bubble_push""100.0"// es la cvar, que al tocar al campo nos retira de el.
    
register_touch(entclas"player""entity_touch"// nose bien que es, por lo que entiendo llamamos a la entidad que rechaza los zm. 
Luego buscamos:

PHP Code:
// pev_ field used to store custom nade types and their values 
Y debajo de:

PHP Code:
const NADE_TYPE_FLARE 4444 // es la flare grenada, es decir su tipo 
Colocamos:

PHP Code:
const NADE_TYPE_CAMPO 5555 // es el nuevo tipo de grenade que vamos a crear, es decir el campo 
Una vez terminado eso nos dirijimos a:

PHP Code:
public fw_SetModel(entity, const model[]) // un forward, donde contiene algunas caracteristicas de las bombas 
Buscamos:

PHP Code:
else if (equal(model[7], "w_sm"4) && get_pcvar_num(cvar_flaregrenades)) // aca especifica en que granada entraran, por ejemplo: Hegren, Flash, Smokegren 
Y todo lo que tiene ese "if" lo remplazamos por este:

PHP Code:
   else if (equal(model[7], "w_sm"4) && get_pcvar_num(cvar_flaregrenades)) // aca especifica en que granada entraran, por ejemplo: Hegren, Flash, Smokegren / con una cvar de activacion o desactivacion
    
{
        if(!
g_zombie[pev(entitypev_owner)] && g_bubble_bomb[pev(entitypev_owner)]) // aca determinamos que la bomba es solo para humanos.
        
{
            
fm_set_rendering(entitykRenderFxGlowShell255255255kRenderNormal16// aca determinamos el color de glow de la granada.
            
message_begin(MSG_BROADCASTSVC_TEMPENTITY// ni idea.
            
write_byte(TE_BEAMFOLLOW// aca determinamos que es un trail la entidad
            
write_short(entity// declaramos que es una entidad
            
write_short(g_trailSpr// el sprite correspondiente al trail.
            
write_byte(10// life. ( nose que es )
            
write_byte(10// width: esto quiere decir el ancho del trail
            
write_byte(255// red: color rojo
            
write_byte(255// green: color verde
            
write_byte(255// blue: color azul
            
write_byte(500// brightness: brillo
            
message_end()
            
            
set_pev(entitypev_flTimeStepSoundNADE_TYPE_CAMPO// tipo de bomba ( NADE_TYPE_CAMPO )
            
            
entity_set_model(entityw_model// llamamos al model de la granada en el piso "w_".
        
}
        else
        {
            
// Make the flare color
            
static rgb[3]
            switch (
get_pcvar_num(cvar_flarecolor))
            {
                case 
0// white
                
{
                    
rgb[0] = 255 // red: rojo
                    
rgb[1] = 255 // green: verde
                    
rgb[2] = 255 // blue: azul
                
}
                case 
1// red
                
{
                    
rgb[0] = random_num(50,255// rer: rojo con un random_num, eso quiere decir que saldra desde el 50 al 255
                    
rgb[1] = // green: verde
                    
rgb[2] = // blue: azul
                
}
                case 
2// green
                
{
                    
rgb[0] = // red: rojo
                    
rgb[1] = random_num(50,255// green: verde con un random_num, eso quiere decir que saldra desde el 50 al 255
                    
rgb[2] = // blue: azul
                
}
                case 
3// blue
                
{
                    
rgb[0] = // red: rojo
                    
rgb[1] = // green: verde
                    
rgb[2] = random_num(50,255// blue: azul con un random_num, eso quiere decir que saldra desde el 50 al 255
                
}
                case 
4// random (all colors): quiere decir que pueden salir varios colores por que los combina
                
{
                    
rgb[0] = random_num(50,200// red: rojo con un random_num, eso quiere decir que saldra desde el 50 al 255
                    
rgb[1] = random_num(50,200// green: verde con un random_num, eso quiere decir que saldra desde el 50 al 255
                    
rgb[2] = random_num(50,200// blue: azul con un random_num, eso quiere decir que saldra desde el 50 al 255
                
}
                case 
5// random (r,g,b): al azar entre rojo, verde, azul
                
{
                    switch (
random_num(13))
                    {
                        case 
1// red
                        
{
                            
rgb[0] = random_num(50,255// red: rojo con un random_num, eso quiere decir que saldra desde el 50 al 255
                            
rgb[1] = // green: verde
                            
rgb[2] = // blue: azul
                        
}
                        case 
2// green
                        
{
                            
rgb[0] = // red: rojo
                            
rgb[1] = random_num(50,255// green: verde con un random_num, eso quiere decir que saldra desde el 50 al 255
                            
rgb[2] = // blue: azul
                        
}
                        case 
3// blue
                        
{
                            
rgb[0] = // red: rojo
                            
rgb[1] = // green: verde
                            
rgb[2] = random_num(50,255// blue: azul con un random_num, eso quiere decir que saldra desde el 50 al 255
                        
}
                    }
                }
            }
            
            
// Give it a glow / toma el glow color, si la bomba fuese de color rojo, el glow de la grana sera rojo...
            
fm_set_rendering(entitykRenderFxGlowShellrgb[0], rgb[1], rgb[2], kRenderNormal16);
            
            
// And a colored trail / le damos un trail
            
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
            
write_byte(TE_BEAMFOLLOW// entidad del trail
            
write_short(entity// decimos que es una entidad
            
write_short(g_trailSpr// sprite correspondiente al trail
            
write_byte(10// life ( nose que es )
            
write_byte(10// width: ancho del trail
            
write_byte(rgb[0]) // red: rojo -- depende de que color sea la bomba (rgb[0] = 1)
            
write_byte(rgb[1]) // green: verde -- depende de que color sea la bomba (rgb[1] = 2)
            
write_byte(rgb[2]) // blue: azul -- depende de que color sea la bomba (rgb[2] = 3)
            
write_byte(200// brightness: brillo del trail
            
message_end() // terminamos la entidad
            
            // Set grenade type on the thrown grenade entity
            
set_pev(entityPEV_NADE_TYPENADE_TYPE_FLARE// tipo de granada ( flare bomb )
            
            // Set flare color on the thrown grenade entity
            
set_pev(entityPEV_FLARE_COLORrgb// Establecer color bengala en la entidad granada lanzada
        
}
    } 
Luego nos vamos a:

PHP Code:
public fw_ThinkGrenade(entity// otro forward que nos llama a la entidad de cada tipo de granada 
Y debajo de:

PHP Code:
     case NADE_TYPE_FROST// Frost Grenade / tipo de granada frost ( hielo )
    
{
        
frost_explode(entity// entidad dela frost ( hielo )
    

Colocamos el Tipo del campo llamando la entidad:

PHP Code:
    case NADE_TYPE_CAMPO// Bubble Grenade / tipo de bomba bubble ( campo )
    
{
        
bubble_explode(entity// llamamos a la entidad del campo
    

Una vez terminado eso nos vamos al final del plugin y colocamos:

PHP Code:
// Bubble Grenade Explosion
public bubble_explode(id)
{
    
// Get origin
    
static Float:originF[3// originF para llamar la entidad de create_blast4
    
pev(idpev_originoriginF// ...
    
    // Create Blast
    
create_blast4(originF// entidad de los anillos de explocion
    
    
new attacker // variable attacker ( ataque )
    
attacker pev(idpev_owner)
    
    
g_bubble_bomb[attacker] = false // variable de la bomba, seteamos en falso
    
    
set_pcvar_num(cvar_flaregrenades,1// tomamos las cvar de la flare, para usarla como activador y desactivador de esta bomba.
    
    // Create entitity
    
new iEntity create_entity("info_target"// creamo la entidad con su determinado objetivo
    
    
if(!is_valid_ent(iEntity)) // determinamos que la entidad esta en false
        
return PLUGIN_HANDLED // tramitamos nuevamente
    
    
new FloatOrigin[3// origen
    
entity_get_vector(idEV_VEC_originOrigin)
    
    
entity_set_string(iEntityEV_SZ_classnameentclas// llamamos ala clase de entidad
    
    
entity_set_vector(iEntity,EV_VEC_originOrigin// no se que es
    
entity_set_model(iEntity,model// modelo dela burbuja
    
entity_set_int(iEntityEV_INT_solidSOLID_TRIGGER// no se que es
    
entity_set_size(iEntityFloat: {-110.0, -110.0, -110.0}, Float: {110.0110.0110.0}) // size de la entidad ( campo ) osea el tamaño
    
entity_set_int(iEntityEV_INT_renderfxkRenderFxGlowShell// le damos el glow
    
entity_set_int(iEntityEV_INT_rendermodekRenderTransAlpha// hacemos que sea transparente
    
entity_set_float(iEntityEV_FL_renderamt50.0// le damos la intensidad
    
    // Colored Aura / aura cuando explota la granada
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_DLIGHT// aura
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x position
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y position
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z position
    
write_byte(15// radius / radio
    
write_byte(255// red: rojo
    
write_byte(255// green: verde
    
write_byte(255// blue: azul
    
write_byte(2// life
    
write_byte(0// decay rate / desintegración de la tasa
    
message_end() // cerramos la entidad
    
    #if defined RANDOM_COLOR // color por default
    
if(is_valid_ent(iEntity)) // entidad valida
    
{
        new 
Float:vColor[3// variable vColor defaul / por defecto
        
        
for(new i3i++) // nose que es
            
vColor[i] = random_float(0.0255.0// color r, g, b
        
        
entity_set_vector(iEntityEV_VEC_rendercolorvColor// el glow de la burbuja
    
}
    
#endif

    #if defined ONE_COLOR
    
entity_set_vector(iEntityEV_VEC_rendercolorcolour_force_shield// declaramos el color cuztomizable al principio
    #endif
    
    #if defined CAMPO_TASK
    
set_task(60.0"DeleteEntity"iEntity// tiempo que demora en removerse el campo
    #endif
    
    
return PLUGIN_CONTINUE;
}

// Bubble Grenade: Yellow Blast
create_blast4(const Float:originF[3])
{
    
// Smallest ring / anillo de explcion 1
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x axis
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y axis
    
engfunc(EngFunc_WriteCoordoriginF[2]+385.0// z axis
    
write_short(g_exploSpr// sprite de los anillos
    
write_byte(0// startframe / fotograma inicial
    
write_byte(0// framerate / imágenes por segundo
    
write_byte(4// life
    
write_byte(60// width / ancho
    
write_byte(0// noise / ruido
    
write_byte(255// red: rojo
    
write_byte(255// green: verde
    
write_byte(255// blue: azul
    
write_byte(200// brightness / brillo
    
write_byte(0// speed / rapidez
    
message_end()
    
    
// Medium ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x axis
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y axis
    
engfunc(EngFunc_WriteCoordoriginF[2]+470.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe / fotograma inicial
    
write_byte(0// framerate / imágenes por segundo
    
write_byte(4// life
    
write_byte(60// width / ancho
    
write_byte(0// noise / ruido
    
write_byte(255// red: rojo
    
write_byte(255// green: verde
    
write_byte(255// blue: azul
    
write_byte(200// brightness / brillo
    
write_byte(0// speed / rapidez
    
message_end()
    
    
// Largest ring
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYoriginF0)
    
write_byte(TE_BEAMCYLINDER// TE id
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y
    
engfunc(EngFunc_WriteCoordoriginF[2]) // z
    
engfunc(EngFunc_WriteCoordoriginF[0]) // x axis
    
engfunc(EngFunc_WriteCoordoriginF[1]) // y axis
    
engfunc(EngFunc_WriteCoordoriginF[2]+555.0// z axis
    
write_short(g_exploSpr// sprite
    
write_byte(0// startframe / fotograma inicial
    
write_byte(0// framerate / imágenes por segundo
    
write_byte(4// life
    
write_byte(60// width / ancho
    
write_byte(0// noise / ruido
    
write_byte(255// red: rojo
    
write_byte(255// green: verde
    
write_byte(255// blue: azul
    
write_byte(200// brightness / brillo
    
write_byte(0// speed / rapidez
    
message_end()
}

// Touch bomb bubble
public entity_touch(touchedtoucher// entidad cuando un zombie o nemesis la toca
{
    
    if(
g_zombie[toucher] || g_nemesis[toucher]) // los nemesis y zombies no pueden pasar
    
{
        new 
Float:pos_ptr[3], Float:pos_ptd[3], Float:push_power get_pcvar_float(cvar_bubblepush// intensidad de rechazo
        
        
pev(touchedpev_originpos_ptr// nose que es
        
pev(toucherpev_originpos_ptd// nose que es
        
        
for(new 03i++)
        {
            
pos_ptd[i] -= pos_ptr[i// nose que es
            
pos_ptd[i] *= push_power // poder cuando lo tocamos y nos rechaza
        
}
        
set_pev(toucherpev_velocitypos_ptd// velocidad del rechazo
        
set_pev(toucherpev_impulsepos_ptd// impulso del rechazo
    
}
}

// Hook bubble bomb
public hook_curwpn(id)
{
    if(!
is_user_alive(id)) // cliente muerto no recibe =D
        
return PLUGIN_CONTINUE;
    
    if(
g_bubble_bomb[id] && !g_zombie[id]) // la bomba solo la puede adquirir un humano
    
{
        new 
wID read_data(2)
        if(
wID == CSW_SMOKEGRENADE// toma el lugar de la smoke grenade
            
set_pev(idpev_viewmodel2model_grenade// modelo de la grana
    
}
    
    return 
PLUGIN_CONTINUE;
}

// Give bubble item / hacemos que nos de el campo
public give_item_bubble(id)
{
    
g_bubble_bomb[id] = true // seteamos la variable a true
    
give_item(id,"weapon_smokegrenade"// le pedimos una smoke ya que el campo la remplaza
}

// Remove Entity / removemos la entidad con el task
public DeleteEntity(entity)
{
    if(
is_valid_ent(entity )) // hacemos valida la entidad
        
remove_entity(entity// la removemos...

Les dejo los SKINS necesarios para que funque y les dejo el SMA con todo el code explicado, de ultima lo sacan de hay para no tener tanto embole...
Attached Files
File Type: zip bubble_camp.zip (558.9 KB, 1830 views)
File Type: sma Get Plugin or Get Source (explicaciones.sma - 1545 views - 17.2 KB)

Last edited by Fail!; 05-09-2010 at 19:00.
Fail! is offline
Send a message via MSN to Fail!