BANNED
Join Date: Jan 2010
Location: BFTCommunity
|
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.
- 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_PrecacheModel, model_grenade) // precacheamos el model "v_". engfunc(EngFunc_PrecacheModel, model) // precacheamos el model de la burbuja. engfunc(EngFunc_PrecacheModel, w_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(entity, pev_owner)] && g_bubble_bomb[pev(entity, pev_owner)]) // aca determinamos que la bomba es solo para humanos. { fm_set_rendering(entity, kRenderFxGlowShell, 255, 255, 255, kRenderNormal, 16) // aca determinamos el color de glow de la granada. message_begin(MSG_BROADCAST, SVC_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(entity, pev_flTimeStepSound, NADE_TYPE_CAMPO) // tipo de bomba ( NADE_TYPE_CAMPO ) entity_set_model(entity, w_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] = 0 // green: verde rgb[2] = 0 // blue: azul } case 2: // green { rgb[0] = 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] = 0 // blue: azul } case 3: // blue { rgb[0] = 0 // red: rojo rgb[1] = 0 // 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(1, 3)) { 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] = 0 // green: verde rgb[2] = 0 // blue: azul } case 2: // green { rgb[0] = 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] = 0 // blue: azul } case 3: // blue { rgb[0] = 0 // red: rojo rgb[1] = 0 // 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(entity, kRenderFxGlowShell, rgb[0], rgb[1], rgb[2], kRenderNormal, 16); // And a colored trail / le damos un trail message_begin(MSG_BROADCAST, SVC_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(entity, PEV_NADE_TYPE, NADE_TYPE_FLARE) // tipo de granada ( flare bomb ) // Set flare color on the thrown grenade entity set_pev(entity, PEV_FLARE_COLOR, rgb) // 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(id, pev_origin, originF) // ... // Create Blast create_blast4(originF) // entidad de los anillos de explocion new attacker // variable attacker ( ataque ) attacker = pev(id, pev_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 Float: Origin[3] // origen entity_get_vector(id, EV_VEC_origin, Origin) entity_set_string(iEntity, EV_SZ_classname, entclas) // llamamos ala clase de entidad entity_set_vector(iEntity,EV_VEC_origin, Origin) // no se que es entity_set_model(iEntity,model) // modelo dela burbuja entity_set_int(iEntity, EV_INT_solid, SOLID_TRIGGER) // no se que es entity_set_size(iEntity, Float: {-110.0, -110.0, -110.0}, Float: {110.0, 110.0, 110.0}) // size de la entidad ( campo ) osea el tamaño entity_set_int(iEntity, EV_INT_renderfx, kRenderFxGlowShell) // le damos el glow entity_set_int(iEntity, EV_INT_rendermode, kRenderTransAlpha) // hacemos que sea transparente entity_set_float(iEntity, EV_FL_renderamt, 50.0) // le damos la intensidad // Colored Aura / aura cuando explota la granada engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_DLIGHT) // aura engfunc(EngFunc_WriteCoord, originF[0]) // x position engfunc(EngFunc_WriteCoord, originF[1]) // y position engfunc(EngFunc_WriteCoord, originF[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 i; i < 3; i++) // nose que es vColor[i] = random_float(0.0, 255.0) // color r, g, b entity_set_vector(iEntity, EV_VEC_rendercolor, vColor) // el glow de la burbuja } #endif
#if defined ONE_COLOR entity_set_vector(iEntity, EV_VEC_rendercolor, colour_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_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[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_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[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_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0) write_byte(TE_BEAMCYLINDER) // TE id engfunc(EngFunc_WriteCoord, originF[0]) // x engfunc(EngFunc_WriteCoord, originF[1]) // y engfunc(EngFunc_WriteCoord, originF[2]) // z engfunc(EngFunc_WriteCoord, originF[0]) // x axis engfunc(EngFunc_WriteCoord, originF[1]) // y axis engfunc(EngFunc_WriteCoord, originF[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(touched, toucher) // 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(touched, pev_origin, pos_ptr) // nose que es pev(toucher, pev_origin, pos_ptd) // nose que es for(new i = 0; i < 3; i++) { pos_ptd[i] -= pos_ptr[i] // nose que es pos_ptd[i] *= push_power // poder cuando lo tocamos y nos rechaza } set_pev(toucher, pev_velocity, pos_ptd) // velocidad del rechazo set_pev(toucher, pev_impulse, pos_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(id, pev_viewmodel2, model_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...
Last edited by Fail!; 05-09-2010 at 19:00.
|
|