BANNED
|
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_solid, 2)
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(entWeapon, EV_SZ_classname, "npc_weapon")
entity_set_int(entWeapon, EV_INT_movetype, MOVETYPE_FOLLOW) entity_set_int(entWeapon, EV_INT_solid, SOLID_NOT) entity_set_edict(entWeapon, EV_ENT_aiment, ent) 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_solid, 2) // 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(entWeapon, EV_SZ_classname, "npc_weapon") // Seteamos el tipo de movimiento ( MOVETYPE_FOLLOW ) entity_set_int(entWeapon, EV_INT_movetype, MOVETYPE_FOLLOW) // A la entidad no la hacemos solida. entity_set_int(entWeapon, EV_INT_solid, SOLID_NOT) // Seteamos el aim a la entidad. entity_set_edict(entWeapon, EV_ENT_aiment, ent) // 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 { Mins, Maxs }; enum _:Axis { X, Y, Z };
// 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(id, origin) // creamos el pushable en el lugar que apunto el player create_pushable(g_model, origin) }
// Stock para crear el pushable stock create_pushable( model[], Float:origin[3] ) { new Float:size[Box][Axis], Float:abssize[Box][Axis]; // Floats size y abssize // Creamos la ent new Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_pushable")) // size minimo size[Mins] = Float:{ -20.0, -20.0, -20.0 } // size maximo size[Maxs] = Float:{ 20.0, 20.0, 20.0 } // agregamos al origin el size maximo y el size minimo xs_vec_add(origin, size[Mins], abssize[Mins]) xs_vec_add(origin, size[Maxs], abssize[Maxs]) // Seteamos el origin a la entidad, osea donde apunta el player. engfunc(EngFunc_SetOrigin, Ent, origin) // Seteamos el model correspondiente que vos quieras. engfunc(EngFunc_SetModel, Ent, model) // Seteamos a la entidad el size maximo y minimo engfunc(EngFunc_SetSize, Ent, size[Mins], size[Maxs]) // classname de la entidad set_pev(Ent, pev_classname, "Pushable") // tipo de movimiento ( FLY ) set_pev(Ent, pev_movetype, MOVETYPE_FLY) // Tipo de Solido ( BBOX ) set_pev(Ent, pev_solid, SOLID_BBOX) // Abbsize min set_pev(Ent, pev_absmin, abssize[Mins]) // Abbsize max set_pev(Ent, pev_absmax, abssize[Maxs]) }
PD: No es Google traductor.
Last edited by LittleBody; 05-01-2010 at 16:18.
|
|