Soporte en Español y Recursos para Servidores Privados de WoW

Únete ahora para obtener acceso a todo el foro. Una vez registrado y verificado tu email, podras crear temas, publicar respuestas, dar reputación a usuarios, descargar, obtener soporte en español y mucho más. Es rápido y totalmente gratis, ¿a qué estás esperando?

Pregunta

Haga preguntas y obtenga respuestas de nuestra comunidad

Responder

Responda preguntas y conviértase en un experto en su tema

Contacto

Contacta directamente con un administrador si presentas algún problema

Tutorial de Script C++ World of Warcraft 2:

mariodanny91

Guardian
Capataz
Explorador
Desde
2 Feb 2020
Mensajes
140
Reacciones
128
Honor
75
En esta guía, enseñaré una de las maneras de hacer un script C++ para el emulador JadeCore que está basado en TrinityCore antiguo. Les servirá de conocimiento base para otros emuladores más actualizados y motivarlos a investigar mas sobre el tema. Vale aclarar que todo lo planteado aquí es de manera autodidacta no soy programador, solo comparto lo que he aprendido.
Para esta guia deben tener instalado Visual Studio, Cmake y otras dependencias que exija el core ya sea OpenSSL,Boost,Mysql en sus versiones x86 o x64.

Tutorial anterior:
Por favor, Acceder o Registrarse para ver el contenido!


Punto sobre los cuales hablaré:
-Fases.
-Como hacer un Intro.
-Controlar invocaciones.

-Primero vamos a repasar algunos conceptos basicos de C++ y detalles referente al core:

Operadores Logicos:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

Operadores Relacionales:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

Operadores Matematicos:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Tipos de variables mas utilizadas:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

*La diferencia entre uint8, uint16, uint32, uint64 son los valores que pueden almacenar en memoria.

C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Como declarar una variable:
Los nombres de las variables no pueden tener espacios y no puede coincidir con las palabras claves utilizadas por el compilador:
Ej: auto, else, new, true, case, class, if, return, void, default, break...
C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Despues de declarar le damos un valor a las variables:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Algunos detalles del core que se deben conocer:

-Constantes de Tiempo:
(Los tiempos se declaran en milisegundos)
C++:
Por favor, Acceder o Registrarse para ver los códigos!

1000 milisegundos equivale a 1 segundo.
Seria igual decir 1 * IN_MILLISECONS, es 1 multiplicado por la constante de tiempo IN_MILLISECONDS = 1000.

-Que es urand:
C++:
Por favor, Acceder o Registrarse para ver los códigos!
*El evento va a ocurrir de manera randon en un tiempo entre 15 segundos y 20 segundos.

-Podemos hacer el casteo de una magia tanto con el ID de la magia, como con una asignacion del enum Spell:
* Los enum no son mas que declaraciones constantes con las cuales trabajaremos un poco mas organizado ya que es mas facil
reconocer en el codigo el nombre de la magia que el ID.
C++:
Por favor, Acceder o Registrarse para ver los códigos!

*Tambien se aplica a invocaciones, textos, fases,..

-Estructura de los eventos:
C++:
Por favor, Acceder o Registrarse para ver los códigos!


Despues de repasar estos detalles referente al core y a C++.

Comenzaremos enumerando los datos que vamos a utilizar:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Agregar los eventos con sus respectivos tiempos:
Al declararse en la funcion void EnterCombat empezaran a contar el tiempo en el momento que empiece el combate y tambien empezara la fase PHASE_DK.
C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Crear los eventos con sus respectivos spell, summon, textos, etc:
C++:
Por favor, Acceder o Registrarse para ver los códigos!


-Crear condicion para cambio de fase:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

*Si los evento estan en PHASE_DK y los puntos de vida estan por dejajo del 50% cambiar a fase PHASE_LICH_KING y empezar a ejecutar los eventos de esa fase.

Nota:Las condiciones son un tema delicado en C++ ya que deben estar bien especificadas para no generar errores:
Ej:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

Si el jugador tiene la mision 12345 completada, el npc hablara.
Es decir que mientras el jugador tenga la mision completada el npc hablara y hablara y hablara indefinidamente y obtendriamos esto:
1.png


Pero si agregamos una variable de tipo booleana (bool):
C++:
Por favor, Acceder o Registrarse para ver los códigos!

(!talk es lo mismo que decir talk=false)
En este caso la condicion dice si el jugador tiene la mision 12345 completada y la variable talk es false, el npc hablara y talk sera true.
Al ser talk true se deja de cumplir la condicion y solo hablara una sola vez.

2-Como hacer un intro:

Con estas lineas crearemos un intro de manera practica:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

*El npc creara una lista de los player que esten a su alrededor en un rango de 30 metros, algo asi como un radar.
Se ejecutara una accion si un player entra en ese rango.

-Quedaria asi:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

*Si un player entra en el rango de 30 metros empezara el EVENT_INTRO y la variable timerintro incrementara su valor a medida que pase el tiempo con timerintro++.
Con las siguientes condiciones a medida que el valor de timerintro incremente se ejecutara el intro.

si timerintro es igual que 1
Hablara

si timerintro es igual que 11
casteara una magia

si timerintro es igual que 12
cambiara su displayID, el modelo visual del npc
cambiara su escala a 2

si timerintro es igual que 14
Hablara
cambiara su faccion a 14(Hostil)
casteara una magia
equipara un arma

si timerintro es igual que 18
comenzara a atacar al player

3-Controlar invocaciones:
Hasta el momento las invocaciones atacan por que son hostiles pero las controla el core.
Controlaremos invocaciones con la funcion void JustSummoned.

C++:
Por favor, Acceder o Registrarse para ver los códigos!

*Si la criatura invocada(summon) es NPC_SUMMON_DK o NPC_SUMMON_LK, castera una magia y seleccionara un objetico para atacar.
Cada invocacion casteara una magia, seleccionara un objetivo diferente y atacara en cuanto sea invocada.
La funcion solamente ejecutara cualquier accion en el momento de la invocacion no despues de invocado el npc.
Podemos hacer que castee una magia, que hable, que camine hacia un lugar, etc..

C++:
Por favor, Acceder o Registrarse para ver los códigos!

-Finalmente con la funcion void JustReachedHome() reseteamos el npc:
*Cuando el npc llegue a su posicion inicial antes del combate.
C++:
Por favor, Acceder o Registrarse para ver los códigos!

Llamara a la funcion void Reset():
C++:
Por favor, Acceder o Registrarse para ver los códigos!

*Con ella devolveremos los valores iniciales del npc:
faccion, modelo visual, escala, arma equipada y vuelve a 0 la variable timerintro, asi el npc esta disponible nuevamente.

El Script deberia ir quedando asi:
C++:
Por favor, Acceder o Registrarse para ver los códigos!

Ahora vamos a la parte de SQL:
Crear el NPC con el nombre del script en la columna `ScriptName`:
SQL:
Por favor, Acceder o Registrarse para ver los códigos!

Textos del NPC:
SQL:
Por favor, Acceder o Registrarse para ver los códigos!

Compilamos y que lo disfruten.
 

WoWCreador

Admin
VIP
Guardian
Capataz
Explorador
Desde
1 Oct 2019
Mensajes
989
Reacciones
549
Honor
77
Muchas gracias por este gran tutorial, buen trabajo, gracias por compartir. De seguro a muchos les será muy útil 🙌
 

Remamakiller

Guardian
Capataz
Explorador
Desde
23 Oct 2019
Mensajes
165
Reacciones
81
Honor
62
Muchas gracias por compartir , su conocimiento , desinteresadamente
Espectacular tutorial
 
shape1
shape2
shape3
shape4
shape7
shape8
Top