Tutorial de Script C++ World of Warcraft 2:

mariodanny91

Guardian
Desde
2 Feb 2020
Mensajes
207
Reacciones
221
Honor
80
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:


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++:
Necesitas, Acceder o Registrarse para ver el contenido.

Operadores Relacionales:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

Operadores Matematicos:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

-Tipos de variables mas utilizadas:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

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

C++:
Necesitas, Acceder o Registrarse para ver el contenido.

-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++:
Necesitas, Acceder o Registrarse para ver el contenido.

-Despues de declarar le damos un valor a las variables:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

-Algunos detalles del core que se deben conocer:

-Constantes de Tiempo:
(Los tiempos se declaran en milisegundos)
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

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++:
Necesitas, Acceder o Registrarse para ver el contenido.
*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++:
Necesitas, Acceder o Registrarse para ver el contenido.

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

-Estructura de los eventos:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.


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

Comenzaremos enumerando los datos que vamos a utilizar:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

-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++:
Necesitas, Acceder o Registrarse para ver el contenido.

-Crear los eventos con sus respectivos spell, summon, textos, etc:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.


-Crear condicion para cambio de fase:
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

*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++:
Necesitas, Acceder o Registrarse para ver el contenido.

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++:
Necesitas, Acceder o Registrarse para ver el contenido.

(!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++:
Necesitas, Acceder o Registrarse para ver el contenido.

*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++:
Necesitas, Acceder o Registrarse para ver el contenido.

*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++:
Necesitas, Acceder o Registrarse para ver el contenido.

*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++:
Necesitas, Acceder o Registrarse para ver el contenido.

-Finalmente con la funcion void JustReachedHome() reseteamos el npc:
*Cuando el npc llegue a su posicion inicial antes del combate.
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

Llamara a la funcion void Reset():
C++:
Necesitas, Acceder o Registrarse para ver el contenido.

*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++:
Necesitas, Acceder o Registrarse para ver el contenido.

Ahora vamos a la parte de SQL:
Crear el NPC con el nombre del script en la columna `ScriptName`:
SQL:
Necesitas, Acceder o Registrarse para ver el contenido.

Textos del NPC:
SQL:
Necesitas, Acceder o Registrarse para ver el contenido.

Compilamos y que lo disfruten.
 

Create an account or login to comment

You must be a member in order to leave a comment

Create account

Create an account on our community. It's easy!

Log in

Already have an account? Log in here.

3,543Temas
23,371Mensajes
14,959Usuarios
mistërioÚltimo usuario
Top