Raised This Month: $51 Target: $400
 12% 

[ES][TUT] Como hacer una NPC.


  
 
 
Thread Tools Display Modes
Author Message
LittleBody
BANNED
Join Date: Apr 2010
Old 05-01-2010 , 15:48   [ES][TUT] Como hacer una NPC.
#1

Bueno, esto es una traducción del tutorial de Twilight Suzuka de como hacer una NPC.
http://forums.alliedmods.net/showthread.php?t=11756

Non-Playable-Character.

Bueno, Va a ser dividido en 2 partes.

1. La creación de una NPC
2. La creación de un bot.


Pasos:

1. Haciendo la entidad.
2. Haciendolo Solido.
3. Hacer que reciba damage.
4. Seteando el Model.
5. Animación.
6. Hacer pensar a la NPC correctamente.
7. Le vamos a dar un arma.



1. Hacemos una Función.

PHP Code:
public spawn_npc(id
Entonces, vamos a hacer la entidad.

PHP Code:
    new Ent create_entity("info_target"
Nota: Esto crea la entidad.

También necesitamos darle a la entidad un "Origin" y también que el player "Salte", Solo para propósitos de prueba.

PHP Code:
    new Float:origin[3]

    
entity_get_vector(id,EV_VEC_origin,origin)
    
entity_set_origin(ent,origin);

    
origin[2] += 300.0
    entity_set_origin
(id,origin
Nota: Seteamos el Origin.

2. Ok, dejamos al jugador fuera del camino, ahora tenes que hacer esto sólido.

PHP Code:
    new Float:maxs[3] = {16.0,16.0,36.0}
    new 
Float:mins[3] = {-16.0,-16.0,-36.0}
    
entity_set_size(ent,mins,maxs)
    
entity_set_int(ent,EV_INT_solid2
Nota: Le seteamos a esto BBOX sólido, y le damos a esto un bbox.


3. Es sólido, pero invensible. Ahora vamos a hacer para que pueda recibir daño.

PHP Code:
    entity_set_float(ent,EV_FL_takedamage,1.0)
    
entity_set_float(ent,EV_FL_health,100.0
Nota: Cambiamos el take damage a 1, y le damos vida.

Entonces "Health", es la vida de la entidad,Pero debes ponerlo más alto de lo normal.
La entidad parece tener menos vida de alguna manera.

4. Ahora le seteamos el "Model", es tan fácil como esto:


PHP Code:
    entity_set_string(ent,EV_SZ_classname,"npc_onna");
    
entity_set_model(ent,"models/onna.mdl"); 
Nota: Seteamos el model y el classname.

Yo sé que setear el classname no está seteando el model, pero debes setearle un similar classname.

5. Ok, ahora le damos a esto una animación por defecto.


PHP Code:
    entity_set_float(ent,EV_FL_animtime,2.0)
    
entity_set_float(ent,EV_FL_framerate,1.0)
    
entity_set_int(ent,EV_INT_sequence,0); 
Nota: Seteamos el framerate (framerate para la entidad), El tiempo de la animación(tiempo máximo para una animación,
y la secuencia (la animación en sí). Usted realmente no debe setear el animtime, pero creo que más vale prevenir a continuación, lo siento.

6. Hacer esto es un poco más difícil.

Primero tenemos que registrar esto en plugin_init.

PHP Code:
register_think ("npc_onna""npc_think"); 
Nota: El primer parámetro debe ser el mismo que el classname que ha establecido.

Ahora bien, tenemos que empezar a hacer pensar a la entidad.
En la función de creación NPC:


PHP Code:
entity_set_float(ent,EV_FL_nextthink,halflife_time() + 0.01
Nota: Esto hace que la entidad piense realmente rápido. 1/100o de segundo.

Esto necesita pensar MUY rápido, con el fin de quedarse sin los frames del servidor, esto suele causar un montón de retraso,
ya que es manejado en su mayoría en el engine.

Ahora, la función npc_think será llamada cada vez que piensa. Usted puede hacer todo tipo de mierda aquí.

Por ejemplo, usted puede comprobar si la VIDA ha bajado, y hacerla sangrar, reproducir la animación derecha, etc.

O, usted podría hacerlo caminar alrededor, dándole la velocidad y el cambio de la animación.

Por encima de todo, usted debe llamar a la función de pensar de nuevo (npc_think):


PHP Code:
    public npc_think(id)
    {  
        
// Pon las cosas que deseas que piense aquí.
        
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)
    } 
Todo lo demás que hago aquí es a su gusto.
Voy a poner algunos ejemplos más de cómo hacer que caminar o disparar.

7. Le mostraré cómo agregar un arma así:


PHP Code:
    public give_weapon(ent)
    {
        new 
entWeapon create_entity("info_target")

        
entity_set_string(entWeaponEV_SZ_classname"npc_weapon")

        
entity_set_int(entWeaponEV_INT_movetypeMOVETYPE_FOLLOW)
        
entity_set_int(entWeaponEV_INT_solidSOLID_NOT)
        
entity_set_edict(entWeaponEV_ENT_aimentent)
        
entity_set_model(entWeapon"models/p_gauss.mdl")
    } 
Asegúrese de que el model que ha definido este precacheado, sino no le va a funcionar.
el modelo es el modelo P_PLAYER, que por lo general va a funcionar.
He utilizado un arma por defecto HL porque mi modelo fue HLDM.

Ahora vamos a ver como queda:


PHP Code:
#include <amxmodx>
#include <engine>

public plugin_init()
{
    
// Registramos el "onna" para luego al escribir onna en consola creara la entidad.
    
register_clcmd("onna""onna")
    
// Esta es la función de pensar.
    
register_think("npc_onna","npc_think");
}

public 
plugin_precache()
{
    
// Precacheamos el model onna y p_gauss.
    
precache_model("models/onna.mdl")
    
precache_model("models/p_gauss.mdl")
}

public 
onna(id)
{
    
// Creamos un Float de 3 dimensiones ( creo que asi se llamaba )
    
new Float:origin[3];
    
    
// Obtenemos el el vector del id, y donde apunte se creara el origin.
    
entity_get_vector(id,EV_VEC_origin,origin)
    
    
// Creamos la entidad.
    
new ent create_entity("info_target")
    
// Le damos el arma a la entidad
    
give_weapon(ent)
    
    
// Enviamos la entidad al origin donde apunto el player.
    
entity_set_origin(ent,origin);
    
// Al origin 2 le aumentamos 300, creo que era para adelante
    
origin[2] += 300.0
    
// seteamos al id, en origin.
    
entity_set_origin(id,origin)
    
    
// Hacemos para que la entidad Pueda recibir damage
    
entity_set_float(ent,EV_FL_takedamage,1.0)
    
// Le damos un valor de 100 de vida a la entidad
    
entity_set_float(ent,EV_FL_health,100.0)
    
    
// Seteamos el classname de la entidad
    
entity_set_string(ent,EV_SZ_classname,"npc_onna");
    
// Seteamos el model a la entidad
    
entity_set_model(ent,"models/onna.mdl");
    
// Hacemos la entidad solida
    
entity_set_int(ent,EV_INT_solid2)
    
    
// Seteamos a la entidad el control 1,2,3,4 para el mov.
    
entity_set_byte(ent,EV_BYTE_controller1,125);
    
entity_set_byte(ent,EV_BYTE_controller2,125);
    
entity_set_byte(ent,EV_BYTE_controller3,125);
    
entity_set_byte(ent,EV_BYTE_controller4,125);
    
    
// Maximo y minimo size.
    
new Float:maxs[3] = {16.0,16.0,36.0}
    new 
Float:mins[3] = {-16.0,-16.0,-36.0}
    
entity_set_size(ent,mins,maxs)
    
    
// Seteamos el animtime a la entidad en 2.0
    
entity_set_float(ent,EV_FL_animtime,2.0)
    
// Le damos a la entidad framerate
    
entity_set_float(ent,EV_FL_framerate,1.0)
    
// Y le damos una secuencia de 0
    
entity_set_int(ent,EV_INT_sequence,0);
    
    
// Tiempo que tarda en pensar la entidad.
    
entity_set_float(ent,EV_FL_nextthink,halflife_time() + 0.01)
    
    
// Tiramos al suelo la entidad.
    
drop_to_floor(ent)
    return 
1;
}

public 
give_weapon(ent)
{
    
// Creamos la entidad del arma.
    
new entWeapon create_entity("info_target")
    
    
// Seteamos el classname de la entidad.
    
entity_set_string(entWeaponEV_SZ_classname"npc_weapon")
    
    
// Seteamos el tipo de movimiento ( MOVETYPE_FOLLOW )
    
entity_set_int(entWeaponEV_INT_movetypeMOVETYPE_FOLLOW)
    
// A la entidad no la hacemos solida.
    
entity_set_int(entWeaponEV_INT_solidSOLID_NOT)
    
// Seteamos el aim a la entidad.
    
entity_set_edict(entWeaponEV_ENT_aimentent)
    
// Le damos el model a la entidad ( arma )
    
entity_set_model(entWeapon"models/p_gauss.mdl")
}

public 
npc_think(id)
{
    
// Tiempo en pensar el id.
    // Pon las cosas que deseas que piense aquí.
    
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)

Esto solo es una prueba de que funciona, vos si querés podes hacerla a tu gusto.

Hacer un robot, o un NPC que puede moverse con facilidad y que ocupe un slot, es tan simple como 1,2,3.

1. Siga la guía anterior
2. sustituir "create_entity (" info_target "con engfunc (EngFunc_CreateFakeClient," Onna ")

3. Establezca el model del nuevo bot sando las funciones específicas del mod.

Ahora puede:
Utilice el comando engfunc FM, EngFunc_RunPlayerMove para que se muevan como un jugador normal

Muy sencillo.

EDIT:

Ejemplo de pushable.

PHP Code:
#include <amxmodx>
#include <fakemeta_util>

// Max y min sizes y el lugar que se mueve, según donde esta el player
enum _:Box MinsMaxs };
enum _:Axis XY};

// Direccion del model
new g_model[] = "models/rockgibs.mdl"

public plugin_init()
{
    
register_plugin("PLUGIN""VERSION""AUTHOR")
    
    
//cuando escriba lala en consola crea el pushable
    
register_clcmd("lala","CmdLala")
}
public 
plugin_precache()
    
precache_model(g_model// precacheamos el model
    
public CmdLala(id)
{
    
// Creamos un float de 3 dimensiones.
    
new Float:origin[3]
    
// Obtenemos en donde está apuntando el player
    
fm_get_aim_origin(idorigin)
    
    
// creamos el pushable en el lugar que apunto el player
    
create_pushable(g_modelorigin)
}

// Stock para crear el pushable
stock create_pushablemodel[], Float:origin[3] )
{
    new 
Float:size[Box][Axis], Float:abssize[Box][Axis]; // Floats size y abssize
    
    // Creamos la ent
    
new Ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"func_pushable"))
    
    
// size minimo
    
size[Mins] = Float:{ -20.0, -20.0, -20.0 }
    
// size maximo
    
size[Maxs] = Float:{ 20.020.020.0 }
    
    
// agregamos al origin el size maximo y el size minimo
    
xs_vec_add(originsize[Mins], abssize[Mins])
    
xs_vec_add(originsize[Maxs], abssize[Maxs])
    
    
// Seteamos el origin a la entidad, osea donde apunta el player.
    
engfunc(EngFunc_SetOriginEntorigin)
    
// Seteamos el model correspondiente que vos quieras.
    
engfunc(EngFunc_SetModelEntmodel)
    
// Seteamos a la entidad el size maximo y minimo
    
engfunc(EngFunc_SetSizeEntsize[Mins], size[Maxs])
    
    
// classname de la entidad
    
set_pev(Entpev_classname"Pushable")
    
// tipo de movimiento ( FLY )
    
set_pev(Entpev_movetypeMOVETYPE_FLY)
    
// Tipo de Solido ( BBOX )
    
set_pev(Entpev_solidSOLID_BBOX)
    
// Abbsize min
    
set_pev(Entpev_absminabssize[Mins])
    
// Abbsize max
    
set_pev(Entpev_absmaxabssize[Maxs])

PD: No es Google traductor.

Last edited by LittleBody; 05-01-2010 at 16:18.
LittleBody is offline
frk_14
Senior Member
Join Date: Jan 2009
Location: Argentina
Old 05-01-2010 , 15:51   Re: [ES][TUT] Como hacer una NPC.
#2

Buen aporte, pero me parece que ya lo habia traducido Javivi
EDIT: estaria bueno que pongan y expliquen algunas funciones en el think
frk_14 is offline
Send a message via MSN to frk_14 Send a message via Skype™ to frk_14
LittleBody
BANNED
Join Date: Apr 2010
Old 05-01-2010 , 15:54   Re: [ES][TUT] Como hacer una NPC.
#3

Quote:
Originally Posted by frk_14 View Post
Buen aporte, pero me parece que ya lo habia traducido Javivi
EDIT: estaria bueno que pongan y expliquen algunas funciones en el think
Huy no sabía! u.u


Ok, ahora le agrego explicaciones, y gracias.
LittleBody is offline
joropito
AlliedModders Donor
Join Date: Mar 2009
Location: pfnAddToFullPack
Old 05-01-2010 , 17:36   Re: [ES][TUT] Como hacer una NPC.
#4

Quote:
Originally Posted by frk_14 View Post
Buen aporte, pero me parece que ya lo habia traducido Javivi
EDIT: estaria bueno que pongan y expliquen algunas funciones en el think
No entendi lo de funciones en el think.
Lo que importa es saber cuando sucede el Think y que otras llamadas son realizadas durante el Think real.
__________________

Divide et vinces
approved plugins | steam account

I don't accept PM for support. Just ask on forums.
If you're looking for private work, PM me.
joropito is offline
Send a message via MSN to joropito
frk_14
Senior Member
Join Date: Jan 2009
Location: Argentina
Old 05-01-2010 , 21:55   Re: [ES][TUT] Como hacer una NPC.
#5

me referia a que ponga ejemplos en el think, explicando las lineas del code y cual es el resultado... para hacer un thread mas interactivo, poder mostrar formas distintas para realizar la misma accion,nose...etc
frk_14 is offline
Send a message via MSN to frk_14 Send a message via Skype™ to frk_14
apuu
BANNED
Join Date: Oct 2009
Location: Argentina
Old 05-01-2010 , 22:30   Re: [ES][TUT] Como hacer una NPC.
#6

Quote:
Originally Posted by frk_14 View Post
me referia a que ponga ejemplos en el think, explicando las lineas del code y cual es el resultado... para hacer un thread mas interactivo, poder mostrar formas distintas para realizar la misma accion,nose...etc
idem
apuu is offline
Kiske
Veteran Member
Join Date: May 2009
Old 05-02-2010 , 02:32   Re: [ES][TUT] Como hacer una NPC.
#7

Si quiero crear un Func_Breakeable, estaría bien algo de esto.

Es solamente una parte:

PHP Code:
stock bool:CrearBreakeableFloat:Origin], Creador )
{
    static 
Float:HitPoint]
    static 
Float:OriginDown]
    
OriginDown Origin
    OriginDown
] = -5000.0

    trace_line
0OriginOriginDownHitPoint )

    static 
Floatistancia vector_distanceOriginHitPoint )
    static 
Floatiferencia 36.0 Distancia
    
if( Diferencia < -15 || Diferencia 15 )
        return 
false;

    static 
EntBreak create_entity("func_breakable")

    if( !
EntBreak )
        return 
false;

    static 
BreakHealth Level[Creador] * LevelBreak[Creador]

    
DispatchKeyValueEntBreak"health"BreakHealth )
    
DispatchKeyValueEntBreak"material""2" )

    
DispatchSpawnEntBreak )

    return 
true;

Ya que estoy también quiero preguntar si en el "material", el 2 es el Wood, porque no se si la lista empieza con 0, 1, 2 o 1, 2
__________________


Last edited by Kiske; 05-02-2010 at 02:35.
Kiske is offline
Send a message via Skype™ to Kiske
Exc3ll@N
Veteran Member
Join Date: Oct 2009
Location: Donde me lleve el viento
Old 05-02-2010 , 04:59   Re: [ES][TUT] Como hacer una NPC.
#8

Quote:
Originally Posted by Kiske View Post
Si quiero crear un Func_Breakeable, estaría bien algo de esto.

Es solamente una parte:

PHP Code:
stock bool:CrearBreakeableFloat:Origin], Creador )
{
    static 
Float:HitPoint]
    static 
Float:OriginDown]
    
OriginDown Origin
    OriginDown
] = -5000.0

    trace_line
0OriginOriginDownHitPoint )

    static 
Floatistancia vector_distanceOriginHitPoint )
    static 
Floatiferencia 36.0 Distancia
    
if( Diferencia < -15 || Diferencia 15 )
        return 
false;

    static 
EntBreak create_entity("func_breakable")

    if( !
EntBreak )
        return 
false;

    static 
BreakHealth Level[Creador] * LevelBreak[Creador]

    
DispatchKeyValueEntBreak"health"BreakHealth )
    
DispatchKeyValueEntBreak"material""2" )

    
DispatchSpawnEntBreak )

    return 
true;

Ya que estoy también quiero preguntar si en el "material", el 2 es el Wood, porque no se si la lista empieza con 0, 1, 2 o 1, 2

no creo que sepa talvez pero mejor testea kiske XD
Exc3ll@N is offline
Send a message via MSN to Exc3ll@N
joropito
AlliedModders Donor
Join Date: Mar 2009
Location: pfnAddToFullPack
Old 05-02-2010 , 10:01   Re: [ES][TUT] Como hacer una NPC.
#9

Quote:
Originally Posted by frk_14 View Post
me referia a que ponga ejemplos en el think, explicando las lineas del code y cual es el resultado... para hacer un thread mas interactivo, poder mostrar formas distintas para realizar la misma accion,nose...etc
Ah ok, igual es una traduccion de un tutorial y no uno hecho por el.
Es grande la diferencia como para pedirle que ponga ejemplos.
__________________

Divide et vinces
approved plugins | steam account

I don't accept PM for support. Just ask on forums.
If you're looking for private work, PM me.
joropito is offline
Send a message via MSN to joropito
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


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


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