13/11/2015, 08:52 PM
Tutorial de Entidades.
Bueno comenzemos con el tutorial, cabe destacar que este tutorial va de engine, lo que me llevo a la creación de este tutorial es que hay gente que no entendio bien otros tutoriales, puede ser que con este tutorial pueda encontrar información util, algo que no encontro en otro post/tutorial.
¿Como creo la entidad?
Primero de lo primero, ¿como creo una entidad y le seteo classname en engine?, muy simple:Código PHP:
new NAME_ENTITY = create_entity("") // NAME_ENTITY = variable identificadora de la entidad, se puede cambiar obviamente.
entity_set_string(NAME_ENTITY, EV_SZ_classname, "ENTITY") // Seteamos CLASSNAME
Dentro de "Create_Entity" hay que poner el tipo de entidad que va a ser.
Ejemplos para poner en create_entity:
Cita:- info_target // Para entidad sin uso, una entidad sin función.
- envsprite // Para colocar un sprite.
- func_button // Hace la función de un "Button". (Boton...)
- func_door // Función que se encuentran en las puertas que se abren de costado.
- func_door_rotating // Función que se encuentran en las puertas que rotan
- func_breakable // Entidad rompible, no se hasta que punto.
¿Como seteo el origin?
Bueno despues de esto, hay que asignarle un "origin", lugar donde spawnear a la entidad, yo se lo asigno a travez de una float.Código PHP:
new iOriginI[3] // Variable con Enteros.
new Float:iOriginF[3] // Variable con Decimales. (Float)
get_user_origin(index, iOriginI, 3) // Tercer Parametro obtiene el AIM del jugador.
IVecFVec(iOriginI, iOriginF) // Convertimos Entero a Decimal
entity_set_vector(NAME_ENTITY, EV_VEC_origin, iOriginF) // Seteamos el Origin
Otra manera... (Con cordenadas definidas)
Código PHP:
new iOriginDEF[] = {99999.0, 99999.0, 99999.0} // (Variable Definida)
entity_set_vector(NAME_ENTITY, EV_VEC_origin, iOriginDEF) // Seteamos el Origin
¿Como seteo tipo de solido?
Tipico, como setear tipos de solidos, traspasables, solido etc.Código PHP:
entity_set_int(NAME_ENTITY, EV_INT_solid, SOLID_) // Seteamos el tipo de solido
Tipos de solidos:
Código PHP:
#define SOLID_NOT 0 // No interactua toca ningun objeto y es traspasable.
#define SOLID_TRIGGER 1 // Es Tocable pero traspasable.
#define SOLID_BBOX 2 // Se toca pero es solido.
#define SOLID_SLIDEBOX 3 // Es Tocable en el aire, pero no en el suelo.
#define SOLID_BSP 4 // Es solido, tocable, pero no sé para que sirve :'v
¿Como le doy un tamaño a la entidad?
Dandosela okno PD: Me tome como 10 mins haciendo esa foto e.e
Código PHP:
new Float:mins[3] = {-10.0, -25.0, 0.0}
// MINS:
// Parametro 1 = Size Atras
// Parametro 2 = Size Derecha
// Parametro 3 = Size Abajo
new Float:maxs[3] = {10.0, 25.0, 75.0}
// MAXS :
// Parametro 1 = Size Adelante
// Parametro 2 = Size Izquierda
// Parametro 3 = Size Arriba
entity_set_size(NAME_ENTITY, mins, maxs) // Seteamos el tamaño
¿Como seteo los MOVETYPE_?
Como setear movetype, como se va a mover el objeto etc, si vuelva camina corre etc.Código PHP:
entity_set_int(NAME_ENTITY, EV_INT_movetype, MOVETYPE_)
Tipos de movetype_:
Código PHP:
#define MOVETYPE_NONE 0 // No se mueve NUNCA O.O .
#define MOVETYPE_WALK 3 // Solo para player - se Mueve en el suelo/piso.
#define MOVETYPE_STEP 4 // Tiene physics cuando le pegas.
#define MOVETYPE_FLY 5 // Vuela, es colisionable.
#define MOVETYPE_TOSS 6 // Vuela y colisiona :v
#define MOVETYPE_PUSH 7 // No clip to world, push and crush - dejo esta traducción temporalmente
#define MOVETYPE_NOCLIP 8 // Vuela, no colisiona, tiene velocidad oh si.
#define MOVETYPE_FLYMISSILE 9 // Mismo solo que para 'monsters'
#define MOVETYPE_BOUNCE 10 // Rebota y bota y bota, depende de cuando le peges va mas rapido.
#define MOVETYPE_BOUNCEMISSILE 11 // Bounce w/o Gravity :'v
#define MOVETYPE_FOLLOW 12 // Sigue al player, sirve para armar hats etc.
#define MOVETYPE_PUSHSTEP 13 // Necesita physics y un model BSP
¿Como le seteo un model?
Es muy simple colocar un model a una entidad.Código PHP:
new const model_entity[] = "models/can.mdl" // No hace falta crear la variable pero bue
entity_set_model(NAME_ENTITY, model_entity) // Seteamo modelo a la entidad
¿Como setearle vida y ver si murio?
Pues, simplemente una entidad es como un player, es casi lo mismo solo cambia el classname, pues en este caso para ver si murio voy a comprobarlo con "Ham_Killed"Código PHP:
public plugin_init(){
RegisterHam(Ham_Killed, "ENTITY", "Ham_Killed_Entity", 1)
}
public create_entity1(id){
new NAME_ENTITY = create_entity("info_target") // Creamos la entidad
entity_set_string(NAME_ENTITY, EV_SZ_classname, "ENTITY") // Seteamos classname
entity_set_model(NAME_ENTITY, "models/can.mdl") // Seteo model de lata, lo modifican a su gusto.
entity_set_float(NAME_ENTITY, EV_FL_takedamage, 1.0) // Activa el daño resivido
entity_set_float(NAME_ENTITY, EV_FL_health, 100.0) // Setea 100.0 de HP/LIFE/VIDA/FORLIVE (?
}
public Ham_Killed_Entity(Victim, Attacker){
client_print(0, print_chat, "Entidad Muerta :'v") // Muestra un mensaje cuando mata a la entidad.
// En este caso pueden hacer lo que quieran
// PLAYER = ATTACKER
// ENTIDAD CREADA = VICTIM
}
¿Como usar la función func_button?
Como coloque al principio, solo es setear la classname cuando creas la entidad en func_button y listo.Código PHP:
public plugin_init() {
RegisterHam(Ham_Use, "func_button", "Ham_use_entity", 1)
}
public create_entity1(id){
new NAME_ENTITY = create_entity("func_button") // Creamos la entidad con la propiedad "func_button"
entity_set_string(NAME_ENTITY, EV_SZ_classname, "ENTITY") // Seteamos classname para identificarlo
entity_set_model(NAME_ENTITY, "models/can.mdl") // Le seteamos un model
}
public Ham_use_entity(iEnt, index){
new classname[8];entity_get_string(iEnt, EV_SZ_classname, classname, 7) // Obtenemos classname para identificar a la entidad.
if(equal(classname, "ENTITY")){ // Verificamos si es la que buscamos.
client_print(index, print_chat, "Apretastes E en la entidad.")
}
}
¿Como se cuando un jugador toca una entidad?
La verdad es que hay varias maneras de verificar esto.Código PHP:
public plugin_init() {
register_touch("ENTITY", "player", "Touch_Register")
// Parametro 1 Es el Classname con el cual identificaremos a la entidad
// Parametro 2 Es la entidad que lo va a tocar para que accione la función
// Parametro 3 Obviamente es la función que va a ejecutar cuando lo toque
}
public Touch_Register(iEnt, index){
new name[33];get_user_name(index, name, 32)
new classname[8];entity_get_string(NAME_ENTITY, EV_SZ_classname, classname, 7)
client_print(0, print_chat, "%s Toco la Entidad %s", name, classname)
}
¿Como setear una secuencia/submodel/skin?
No vi varios tutos con este tipo de cosas, como setear submodels etc pero weno.Código PHP:
entity_set_int(NAME_ENTITY, EV_INT_body, SUBMODEL_NUM) // Seteamos SUBMODEL
entity_set_int(NAME_ENTITY, EV_INT_skin, SKIN_NUM) // Seteamos SKIN
entity_set_int(NAME_ENTITY, EV_INT_sequence, animacion); // Secuencia de animación a reproducir.
entity_set_float(NAME_ENTITY, EV_FL_frame, 0.0); // Hacemos que la animación empieze de 0.
¿Como eliminar/borrar una entidad?
Facilmente:Código PHP:
remove_entity(NAME_ENTITY)
Formas de obtener una entidad in-game.
Forma 1: Encontrar entidadesh :0
Código PHP:
new iEnt = -1
// Usamos IF si es una sola entidad
// Usamos WHILE si son varias...
while( (iEnt = find_ent_by_class(iEnt, "ENTITY")) )
{
//....
}
Forma 2: (Obteniendolo con la Aiming/Mira)
Código PHP:
public entity_get(index){ // Obtiene la entidad que mira el jugador.
new iEnt, body // Variables a crear para usarlas en aiming
get_user_aiming(index, iEnt, body) // Obtiene lo que mira el jugador..
if(is_valid_ent(iEnt)){
// Si la entidad es valida bueno, esten satisfechos (?
}
}
¿Como doy Vuelta/Rotar/Girar una entidad?
Simplemente para cambiar de angulo etc se hace de la siguiente manera:Código PHP:
public entity_set_angle(index){
new iEnt, body // Variables a crear para usarlas en aiming
get_user_aiming(index, iEnt, body) // Obtiene lo que mira el jugador..
new vAngles[3] // Creamos la variables con 3 celdas.
entity_get_vector(iEnt, EV_VEC_angles, vAngles); // Obtenemos el angulo actual
vAngles[1] += 90.0 // Lo modificamos, en este caso lo giro por qué soy la jeta.
// Angles tiene 3 Celdas, en cada una se guarda un angulo.
// vAngles[0] = El Operador Aritmetico " - " Hace que voltee hacia la Izquierda.
// vAngles[0] = El Operador Aritmetico " + " Hace que voltee hacia la Derecha.
// vAngles[1] = El Operador Aritmetico " - " Hace que Gire hacia la Derecha.
// vAngles[1] = El Operador Aritmetico " + " Hace que Gire hacia la Izquierda.
// vAngles[2] = El Operador Aritmetico " - " Hace que voltee hacia Adelante.
// vAngles[2] = El Operador Aritmetico " + " Hace que voltee hacia Atras.
entity_set_vector(iEnt, EV_VEC_angles, vAngles); // Seteamos el angulo modificado
}
¿Como detecto si alguien le pega a una entidad? (Función)
Bueno, despues de crear una entidad y asignarle todos los valores etc y dejarlo divino, para detectar el daño no es como detectarlo en un player:Código PHP:
//Dentro de donde creaste la entidad...
// Creditos a I'mBuggimen, Metrikcz y Heber[$]ource por decirme lo de la syntax.
//Parametro 1 = Ham_ a detectar.. en este caso TakeDamage.
//Parametro 2 = NAME_ENTITY, o variable con la que crearon la entidad.
//Parametro 3 = Función que va a ejecutar cuando alguien le pege.
RegisterHamFromEntity(Ham_TakeDamage, agrunt, "agrunt_has_damaged");
public agrunt_has_damaged(Victim, Inflictor, Attacker, Float:fDamage, DmgTypeBits){
//11 = limite de caracteres de la entidad, en este caso es agrunt y le pongo 11 :v
new classname[11];entity_get_string(Victim, EV_SZ_classname, classname, 10)
if(containi(classname, "agrunt") != -1){
client_print(Attacker, print_chat, "Agrunt Has Damaged!") // Emite un mensaje.
}
}
¿Como detecto si una entidad esta atascada? (Función)
Función para detectar si esta trabado las entidades creado por meTaLiCroSS
Modo de uso de esta función:
Función:
Código PHP:
new vectores[3];entity_get_vector(NAME_ENTITY, EV_VEC_origin, vectores)
if(IsEntityStucked(NAME_ENTITY, vectores)){
client_print(index, print_chat, "ENTITY TRABADA")
}
Función:
Código PHP:
bool:IsEntityStucked(iEnt, const Float:vecPosition[3])
{
engfunc(EngFunc_TraceMonsterHull, iEnt, vecPosition, vecPosition, DONT_IGNORE_MONSTERS, iEnt, 0);
return (get_tr2(0, TR_StartSolid) || get_tr2(0, TR_AllSolid) || !get_tr2(0, TR_InOpen))
}
¿Como controlar 'controller', o mover la cabeza de un personaje? (Función)
Frecuentemente, la primera vez que cree un npc me aparecio con la cabeza torcida y bueno, no encontre yo ningun dato sobre como hacer esto ;_; , aca lo tienen:PD: No todos los personajes tienen esto, lo que significa que algunos tienen para modificar algunas otras cosas que no tienen nada que ver con la cabeza.
Código PHP:
entity_set_byte(NAME_ENTITY, EV_BYTE_controller1, CANTIDAD_ROTACIÓN); // cantidad_rotación default = 125, cabeza centrada.
// Hay 4 tipos de controller, '1', '2', '3' y '4'.
Explicaciones de algunas funciones.
Cita:[Pregunta] = ¿Para que sirve CLASSNAME?
[Respuesta] = Sirve para identificar una entidad de las demas, no vas a querer encontrar tu entidad con todas las entidades que hay en el mapa.
Cita:[Pregunta] = ¿Para que sirven los SUBMODELS & SKIN?
[Respuesta] = Para comprimir varios models, como los de CTF o JAILBREAK, tienen todos los models de los presos en 1 model solo, y para esto se tiene que cambiar el SKIN/SUBMODEL.
Cita:[Pregunta] = ¿Que son y para que sirven las Secuencias?
[Respuesta] = Son tipos de animaciones o movimientos, por ejemplo cuando se mueve un player o algo asi, esa es una animación.
Cita:[Pregunta] = ¿Porque mi Entidad se puede traspasar o es solida pero es solida ala mitad?
[Respuesta] = Puede ser Traspasable porque no seteastes bien el tipo de solido, y ¿por que esta ala mitad?, es por qué cuando seteastes size te quedastes corto con el tercer parametro.
Cita:[Pregunta] = ¿Como puedo crear mi sprite en esta entidad?
[Respuesta] = Remplaza la función de create_entity por envsprite, y también remplaza el model por el sprite. (colocando la secuencia ya tendrias hecho un sprite bien pro)
Cita:[Pregunta] = ¿Porque mi NPC/Entidad tiene la cabeza chueca?
[Respuesta] = Es por la simple razón de que no modificastes 'controller', en la guia explica como modificarlo a tu gusto.
Bueno, si falta algo o esta incompleto, cualquier error o cualquier duda comentar .
PD: Prohibido que comente metalicross y sus comentarios inentendibles