View Single Post
Author Message
Javivi
AlliedModders Donor
Join Date: Dec 2008
Old 11-28-2009 , 14:39   [ES][TUT] C4 Scripting
#1

TRADUCCIÓN DE ESTE INTERESANTE POST DE VEN :
http://forums.alliedmods.net/showthread.php?t=40164


Requisitos
Debes estar familiarizado con lo basico del scripting. Las funciones de Fakemeta Utilities son usadas aqui. Para obtener la id del jugador (solo dentro de "logevent_function_p") debes usar:

PHP Code:
stock get_loguser_index() 
{
    new 
loguser[80], name[32]
    
read_logargv(0loguser79)
    
parse_loguser(logusername31)
 
    return 
get_user_index(name)

Ejemplo
PHP Code:
public logevent_function_p() 
{
    new 
id get_loguser_index()
    
// ...

1. Jugador/C4
PHP Code:
// Esta la bomba tirada/siendo llevada?
    
if (fm_find_ent_by_class(-1"weapon_c4"))
 
// Esta en el suelo?
    
new bomb fm_find_ent_by_class(-1"weapon_c4")
    if (
bomb && pev(bombpev_owner) > get_maxplayers())
 
// La bomba esta siendo llevada/quien la lleva?
    
new carrier 0ownerentbomb fm_find_ent_by_class(-1"weapon_c4")
    if (
bomb && (ownerent pev(bombpev_owner)) <= get_maxplayers())
        
carrier ownerent
    
if (carrier// tenemos al portador
    
else // no lo tenemos
 
// El jugador elegido tiene la bomba?
    
if (user_has_weapon(idCSW_C4)) // metodo #1
    
if (pev(idpev_weapons) & (1<<CSW_C4)) // metodo #2
    
if (fm_find_ent_by_owner(-1"weapon_c4"id)) // metodo #3
 
// Como transferimos la bomba de un jugador a otro?
    
fm_transfer_user_gun(carrierrecipientCSW_C4// devuelve true si tiene exito
 
// Como forzamos a un jugador a tirar la bomba?
    
engclient_cmd(id"drop""weapon_c4")
 
// Como eliminamos la bomba dropeada??
    
new weapboxbomb fm_find_ent_by_class(-1"weapon_c4")
    if (
bomb && (weapbox pev(bombpev_owner)) > get_maxplayers()) {
        
dllfunc(DLLFunc_Thinkweapbox// eliminara el weaponbox + la entidad weapon_c4 
        // elimina la marca roja de la bomba en el radar
        
message_begin(MSG_ALLget_user_msgid("BombPickup"))
        
message_end()
    }
 
// Como damos la bomba a alguien?
    
fm_give_item(id"weapon_c4")
    
// utiliza cs_set_user_plant(id) para permitirle plantar la bomba
 
// Como stripeamos/eliminamos la bomba de un jugador?
    
engclient_cmd(id"weapon_c4")
    
cs_set_user_bpammo(idCSW_C40)
    
engclient_cmd(id"lastinv")
    
// remove bomb hud icon
    
message_begin(MSG_ONEget_user_msgid("StatusIcon"), _id)
    
write_byte(0)
    
write_string("c4")
    
message_end()
 
// Esta la bomba plantada/como la eliminamos?
    
new bomb
    
if ((bomb fm_find_ent_by_model(-1"grenade""models/w_c4.mdl"))) {
        
// la bomba esta plantada
        
fm_remove_entity(bomb// elimina la bomba plantada
    

2. Tirarla/Cogerla
PHP Code:
// Evento. El jugador spawnea con la bomba
    
register_logevent("logevent_function_p"3"2=Spawned_With_The_Bomb")
 
// Evento. Bomba dropeada (incluyendo por conexion/desconexion)
    
register_logevent("logevent_function_p"3"2=Dropped_The_Bomb")
    
// use is_user_alive/is_user_connected to check for disconnect/death
 
// Evento. Bomba recogida (excepto en el spawn)
    
register_logevent("logevent_function_p"3"2=Got_The_Bomb")
 
// Evento. Recibiste una bomba (incluyendo spawn/give_item)
    
register_event("WeapPickup""event_function""be""1=6"
3. Plantar/Defusar
PHP Code:
// Empezando a plantar la bomba
    
register_event("BarTime""event_function""be""1=3")
 
// Bomba plantada
    
register_logevent("logevent_function_p"3"2=Planted_The_Bomb")
 
// Comenzando a desactivar la bomba
    
register_event("BarTime""event_function""be""1=5""1=10")
 
// Comenzando a desactivar la bomba (sin defuse kit)
    
register_logevent("logevent_function_p"3"2=Begin_Bomb_Defuse_Without_Kit")
 
// Comenzando a desactivar la bomba (con defuse kit)
    
register_logevent("logevent_function_p"3"2=Begin_Bomb_Defuse_With_Kit")
 
// Bomba desactivada
    
register_logevent("logevent_function_p"3"2=Defused_The_Bomb")
 
// Interrumpir el plantado/defusado
    
register_event("BarTime""event_function""b""1=0")
    
// debes asegurarte de que se esta plantando/defusando!
 
// Evento. Objetivo asegurado
    
register_logevent("logevent_function"6"3=Target_Saved"
4. Explosion
PHP Code:
// Objetivo bombeado (antes de que acabe la ronda)
    
register_logevent("logevent_function"6"3=Target_Bombed")
 
// Objetivo bombeado (antes/despues del final de la ronda) (descubierto por Ryan)
    
register_event("23""event_function""a""1=17""6=-105""7=17")
 
// Un jugador muere por la explosion de la bomba (forward) (descubierto por Brad/VEN)
    // no va a funcionar si el jugador es matado por la entidad env_explosion que es desencadenada por la explosion
    
public client_death(killervictimwpnindexhitplaceTK) {
        if (
wpnindex == CSW_C4)
    } 
5. Objetivos
PHP Code:
// Esta en el lugar de plantar (func_bomb_target)?
    // Nota: no hay mejor manera de detectarlo
    
new target = -1, class[] = "func_bomb_target"bool:is_inside false
    
while ((target fm_find_ent_by_class(target, class))) {
        if (!
fm_boxents_distance(indextarget)) {
            
is_inside true
            
break
        }
    }
    if (
is_inside)
 
// Tiene el mapa objetivos a bombear?
    
if (fm_find_ent_by_class(-1"func_bomb_target") || fm_find_ent_by_class(-1"info_bomb_target"))
 
// Como eliminamos los objetivos a bombear?
    
new target = -1classname[] = "func_bomb_target"
    
while ((target fm_find_ent_by_class(targetclassname)))
        
fm_remove_entity(target)
    
classname "info_bomb_target"
    
while ((target fm_find_ent_by_class(targetclassname)))
        
fm_remove_entity(target

Saludos,


Javivi.
__________________
Javivi is offline