Ejemplo de fix de quest: Destroy the Forges! (12988)

Quest: http://www.wowhead.com/quest=12988/destroy-the-forges
Fix terminado:

-- Destroy the Forges! (12988)
-- By Fearz


SET @NForge :=30209; -- North Lightning Forge - guid 95645
SET @CForge :=30211; -- Central Lightning Forge - guid 96491
SET @SForge :=30212; -- South Lightning Forge - guid 96864
SET @Bomb :=56275; -- Bouldercrag's Bomb - Spell
SET @Explosion :=64079; -- Cosmetic - Explosion (explosión random q encontré)

UPDATE creature_template SET `AIName`='SmartAI' WHERE entry IN (@NForge,@SForge,@CForge);

DELETE FROM `smart_scripts` WHERE entryorguid IN (@NForge,@SForge,@CForge) AND `source_type`=0;
INSERT INTO `smart_scripts` VALUES
(@NForge, 0, 0, 1, 8, 0, 100, 0, @Bomb, 0, 0, 0, 11, @Explosion, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'North Lightning Forge - On spell hit - Cast Cosmetic Explosion'),
(@NForge, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 33, @NForge, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'North Lightning Forge - Linked - Give credit'),
(@CForge, 0, 0, 1, 8, 0, 100, 0, @Bomb, 0, 0, 0, 11, @Explosion, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Central Lightning Forge - On spell hit - Cast Cosmetic Explosion'),
(@CForge, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 33, @CForge, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Central Lightning Forge - Linked - Give credit'),
(@SForge, 0, 0, 1, 8, 0, 100, 0, @Bomb, 0, 0, 0, 11, @Explosion, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'South Lightning Forge - On spell hit - Cast Cosmetic Explosion'),
(@SForge, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 33, @SForge, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'South Lightning Forge - Linked - Give credit');

-- reubicación de los npcs invis para que no loseen.
DELETE FROM `creature` WHERE id IN (30209,30211,30212);
INSERT INTO `creature` (guid,id,map,spawnMask,phaseMask,modelid,equipment _id,position_x,position_y,position_z,orientation,s pawntimesecs,spawndist,currentwaypoint,curhealth,c urmana,MovementType,npcflag,unit_flags,dynamicflag s) VALUES
(95645,@NForge,571,1,1,11686,0,8024.99,-221.888,848.054,1.85285,300,5,0,41,60,1,0,0,0),
(96491,@CForge,571,1,1,11686,0,8023.35,-259.327,847.246,3.01943,300,5,0,41,60,1,0,0,0),
(96864,@SForge,571,1,1,11686,0,8008.19,-308.353,848.124,5.37366,300,5,0,41,60,1,0,0,0);


Por lo general, para arreglar una misión, necesitamos usar varias tablas.. algunas solo para consultar datos, y otras para modificarlos o crear un script. Para la gran mayoría, necesitamos hacer algun script en la tabla: smart_scripts



Recolectar y organizar información

El problema que tenía esta misión, era que usábamos el item para explotar las forges y no pasaba nada. Vamos con el gm a la zona y vemos que cada forge tiene un npc invisible, que es el que debe recibir el spell del item que usamos.
El problema era que los npcs (@NForge,@SForge,@CForge) que recibían el impacto del spell, no tenian ninguna instrucción.. entonces no realizaban ninguna acción, nunca nos completaba la misión.
Sabiendo cual es el problema, procedemos a juntar la info que necesitamos.

Primero que nada, dejamos comentado arriba de que se trata el archivo que estamos creando, nombre de npc/quest que vamos a fixear, y el id.
Buscamos en wowhead/headarg todos los npcs-spells-gob (game objects)-etc que vamos a utilizar en el mismo.. y vemos algún video de como debería de funcionar. También revisamos la zona con el GM de ser posible por si hay npcs invisibles.
Recolectamos info que creamos que sea importante de lo que ya esté ingresado en la base de datos. Revisar el post Introducción de ser necesario.
En este caso la misión esta pide matar 3 npcs:
Código:
SELECT RequiredNpcOrGo1,RequiredNpcOrGo2,RequiredNpcOrGo3 FROM `quest_template` WHERE `id`=12988;
si hacen esa búsqueda, los resultados serán los ids de los 3 forges que usamos (@NForge,@SForge,@CForge), pero esos npcs son invisibles (y están spawneados, se pueden ver con .gm on), entonces lo que haremos es simular que los matamos.

Después, para que sea todo mas claro de leer, con tantos números dando vueltas, creamos 'constantes' (SET) que facilitarán la lectura del fix, a nosotros y para quien lo vea luego.
Código:
-- Destroy the Forges! (12988)
-- By Fearz

SET @NForge	:=30209; -- North Lightning Forge - guid 95645
SET @CForge	:=30211; -- Central Lightning Forge - guid 96491
SET @SForge	:=30212; -- South Lightning Forge - guid 96864
SET @Bomb	:=56275; -- Bouldercrag's Bomb - Spell
SET @Explosion	:=64079; -- Cosmetic - Explosion (explosión random q encontré)



Haciendo el código

Necesitamos agregarle un script a los npcs, entonces editamos el `creature_template` de cada uno de ellos, para avisarle al emulador que esos npcs tienen script en la tabla `smart_script` que tiene que hacer. Si no indicamos esto, por mas que agreguemos info en la tabla de scripts, no va a hacer nada ningún npc.
Código:
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE entry IN (@NForge,@SForge,@CForge);
Como solo necesitamos modificar esa columna, realizamos un UPDATE nomás.
Al utilizar "update", se actualiza la columna que indiquemos, con el valor que le demos.

Ahora agregaremos el script a cada npc. Como dijimos en el post de Introducción, siempre checkeamos que no haya datos en las tablas.. en este caso no hay, pero puede haber npcs que ya tengan información de algo y debemos incorporarlo a nuestro script o ser mas específicos en el DELETE FROM para no borrar lo que ya está ingresado.
Como no hay nada, borramos todo y agregamos nuestra info:
Código:
DELETE FROM `smart_scripts` WHERE entryorguid IN (@NForge,@SForge,@CForge) AND `source_type`=0;
INSERT INTO `smart_scripts` VALUES 
(@NForge, 0, 0, 1, 8, 0, 100, 0, @Bomb, 0, 0, 0, 11, @Explosion, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'North Lightning Forge - On spell hit - Cast Cosmetic Explosion'),
(@NForge, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 33, @NForge, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'North Lightning Forge - Linked - Give credit'),
Pongo el script solo de @NForge, ya que los tres son iguales. Ver el fix completo arriba de ser necesario. Explico solo este.

En la primer linea, el id 0 del script de @NForge, ponemos que cuando reciba el hit de un spell (event 8. el spell en cuestión es el @bomb), nuestro npc invisible @Nforge va a castear (action 11) el spell @Explosion sobre si mismo. Con eso, damos la sensación de que lo destruimos.
No pude encontrar si habia algún spell específico de la explosión esta (busqué spells en wowhead con nombre de Forge, nombre de la quest, etc), así que le puse uno cosmético de por ahí.
Si terminamos ahí el fix, solo haría la explosión pero no nos daría crédito, así que necesitamos otra linea mas para darnos el crédito.
Linkeamos a la linea 1.

En la linea del id 1 tiene el evento linkeado de arriba (event 61), así que no lleva ningun parámetro. Esa linea ocurrirá a la vez que ocurre el id 0, y solo si ocurre el id 0.
Le ponemos action 33 (CALL_KILLEDMONSTER), para decirle al emulador de que "matamos uno de los monstruos que la quest pide como objetivo". Hay varias maneras de completar una misión, una de ellas es matando los npcs que nos pide matar. Con el action 33 le decimos al emulador que matamos un npc, por mas que no lo hayamos hecho en la realidad con nuestro personaje.
Entonces, en linea id 1 del fix, usamos action 33 y ponemos que matamos el npc @NForge.
¿Quien lo mató? el que casteó el spell que desencadenó las acciones en el npc.. el target 7.

En los otros dos npcs forges, va lo mismo. Obviamente cambiamos el npc "que matamos" para que coincida con el npc que hace el script. Ver el script entero arriba.


Ahí estaría listo el fix. Sin embargo, me pasaba que el npc invisible a veces loseaba (se 'escondia') el spell del item que yo usaba, y no se activaba el script porque nunca reciba el spell.
Para solucionar esto, lo que hice en este caso, fué reacomodar los npcs. Podría haber deshabilitado el LoS al spell del item, pero bueno.. en su momento no sabía hacerlo.
Código:
-- reubicación de los npcs invis para que no loseen.
DELETE FROM `creature` WHERE id IN (@NForge,@SForge,@CForge);
INSERT INTO `creature` (guid,id,map,spawnMask,phaseMask,modelid,equipment_id,position_x,position_y,position_z,orientation,spawntimesecs,spawndist,currentwaypoint,curhealth,curmana,MovementType,npcflag,unit_flags,dynamicflags) VALUES
(95645,@NForge,571,1,1,11686,0,8024.99,-221.888,848.054,1.85285,300,5,0,41,60,1,0,0,0),
(96491,@CForge,571,1,1,11686,0,8023.35,-259.327,847.246,3.01943,300,5,0,41,60,1,0,0,0),
(96864,@SForge,571,1,1,11686,0,8008.19,-308.353,848.124,5.37366,300,5,0,41,60,1,0,0,0);
Acá lo único que se hizo, fue mover los npcs con el gm (.npc move) a una ubicación que me funcionaba bien, luego tirar un SELECT a cada npc en la tabla `creature`, tomar todos los datos teniendo las coordenadas bien, y después borrar la info y volver a agregarla.