Saltar al contenido

Más en DLAN: Nuestras Traducciones | Otras Traducciones | Mods y modding | Revisiones y Guías | Videojuegos | Arte | Literatura | Rol y Rol por foro e IRC | Mapa de la web
Foto

Spell-Hooking


6 respuestas al tema

#1 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 409 posts

Posteado 18 July 2014 - 02:08 PM

Viendo un tema anterior y ya que alguno me ha preguntado por wass, me ha parecido interesante abrir un post sobre el sistema spell-hooking ya que es un gran aliado de los mapeadores. ¿Qué es lo que nos permite exactamente? Pues hacer lo que queramos con los conjuros, modificarlos , crear áreas de magia muerta, de magia salvaje...lo que nos imaginemos.

 

¿Cómo lo logramos?

Pues como bien dijo Setaka (qué seguro que sabe más que yo que he aprendido a base de horas de ensayo y error a scriptear...nada de manuales como buen español que soy) ahi esta todo:

 http://www.nwnlexico...-_Spell-Hooking

 

para los vagos y que no quieren mirar cosas en ingles (porque les da dolor de cabeza o cosas similares jaja) la cosa es tan sencilla como lo siguiente:

 

-1 nos vamos a nuestro modulo, vamos a "editar"--->"Propiedades del módulo"

-2 se nos abre la ventanita de las propiedades, vamos a "avanzado"--->variables

-3 vamos a meter una variable string:

       

       NOMBRE--->X2_S_UD_SPELLSCRIPT 

    TIPO---> string

       VALOR---> aquí ponemos el nombre del script que queremos que se ejecute ejemplo: magia 

 

guardamos y ya tenemos el sistema montado, bien ahora vamos a montar el script  "magia" para que lo reclame cuando se ejecute un hechizo.

 

 

lo primero es que en este sistema para parar y modificar conjuros hay que incluir--->#include "x2_inc_switches" al inicio del script

lo segundo esta linea --->SetModuleOverrideSpellScriptFinished(); hace que se detenga el conjuro que llamamos en el script, si modificamos el conjuro y no paramos el original, se ejecutaría el original después de lo que le mandemos hacer (soy muy malo explicandome)... a ver cogemos y decimos :

identificamos el conjuro...si es curar heridad leves...tirada de dados y si sale un 1 zaz¡¡¡ hace pupa, vamos y lo hacemos en script...muy bien lanza el conjuro un pj, curar heridas leves, se ejecuta el script..saca un 1 y le hace daño pero como no dijimos que finalizara el curar leves,se ejecutara seguidamente después de hacer la pupa y...cura al pj...por  eso hay que finalizar (si se quiere) el original con--->SetModuleOverrideSpellScriptFinished(); lo veremos en los ejemplos.

 

luego tenemos varias funciones que nos ayudan como ponen en la página del nwn lexicom:

GetSpellId(); // returns the SPELL_* constant of the spell cast
GetSpellTargetObject(); // returns the targeted object of the spell, if valid
GetSpellTargetLocation(); // returns the targeted location of the spell, if valid
GetLastSpellCastClass(); // gets the class the PC cast the spell as
GetSpellCastItem(); // if an item cast the spell, this function gets that item
GetSpellSaveDC(); // gets the DC required to save against the effects of the spell
GetCasterLevel(OBJECT_SELF); // gets the level the PC cast the spell as

 

no hace falta comentar mucho jeje...bueno un ejemplo para que veáis el potencial:

 

 

 

Vamos a crear un área de magia muerta:

 

 

 

#include "x2_inc_switches"
 
void main()
{
 
//-----zona magia muerta
if(GetTag(GetArea(OBJECT_SELF)) == "IslaMaldita2")//tag del area donde queremos que no funcione la magia
  {
    SetModuleOverrideSpellScriptFinished();//paramos los hechizos
    SendMessageToPC(OBJECT_SELF, "En esta zona parece que la magia no funciona");//avismaos con texto al pj
  }
 
 
 
Fácil,sencillo y para toda la familia....este script esta guardado con el nombre "magia" para que lo reclame el sistema como comenté arriba.
 
Una cosa a tener en cuenta es que el OBJECT_SELF se pone porque el script se ejecuta cuando se lanza el conjuro y es el pj que lo ejecuta (si si reíros pero la primera vez que monte el sistema yo poniendo object oJugador=GetLastSpellCaster()....ect )
 
bueno como nos parece poco que no se pueda ejecutar mágia en un lugar queremos meter un área con magia salvaje....pues completamos el script:
 
#include "x2_inc_switches"
 
void main()
{
 
//-----zona magia muerta
if(GetTag(GetArea(OBJECT_SELF)) == "IslaMaldita2")
  {
    SetModuleOverrideSpellScriptFinished();
    SendMessageToPC(OBJECT_SELF, "En esta zona parece que la magia no funciona");
  }
 
//----------zona magia salvaje
else if(GetTag(GetArea(OBJECT_SELF)) == "ProfundidadesCaminoProfundo")//tag area de magia salvaje
  {
 
 
 
     if (d100()>=25)   //25% de probabilidad de lanzar el conjuro y que se ejecute normal
        {
 
           int dado=d3(); //esta int de tirada de dados va aqui porque si va dentro del case da error
           int nSpell    = GetSpellId(); // obtenemos el conjuro que es un int "SPELL_CREEPING_DOOM"....
           int nSpellDC  = GetSpellSaveDC(); //la tirada de salvacion del conjuro
           int nCastLevel= GetCasterLevel(OBJECT_SELF); //nivel del lanzador
           object oTarjet;
           oTarjet= GetSpellTargetObject();//objetivo del conjuro
           int iTipoobjeto=GetObjectType(oTarjet);
           if  (iTipoobjeto==OBJECT_TYPE_ITEM)
               {
                oTarjet=GetItemPossessor(oTarjet);// para conjuros que el objetivo son objetos no pjs
               }
 
           switch (nSpell)   //switch para los casos del echizo
               {
                 case SPELL_CREEPING_DOOM:
                 case SPELL_DOOM:  //si es el conjuro creeping doom o doom
 
                                ApplyEffectToObject(DURATION_TYPE_INSTANT,
                                EffectDamage(d10(3),
                                DAMAGE_TYPE_DIVINE,
                                DAMAGE_POWER_ENERGY),
                                OBJECT_SELF); //aplicamos 3 d10 de pupa
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");//mensaje al pj de que la magia //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////no va bien
                           break;
 
 
 
                case SPELL_MAGIC_MISSILE:
                case SPELL_MELFS_ACID_ARROW:
                case SPELL_MORDENKAINENS_DISJUNCTION:
                case SPELL_STONESKIN:
                case SPELL_SUMMON_CREATURE_I:
                case SPELL_SUMMON_CREATURE_II:
                case SPELL_SUMMON_CREATURE_III:
                case SPELL_SUMMON_CREATURE_IV:
                case SPELL_SUMMON_CREATURE_VI:
                case SPELL_SUMMON_CREATURE_VIII://si es cualquiera de estos conjuros
 
                    if (dado==1)
                               {
                                ApplyEffectToObject(DURATION_TYPE_INSTANT,
                                EffectDamage(d10(2),
                                DAMAGE_TYPE_DIVINE,
                                DAMAGE_POWER_ENERGY),
                                OBJECT_SELF);
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               } //aplicamos pupa, mensaje y se ejecuta conjuro original
                    else if (dado==2)
                               {
                               ApplyEffectToObject(DURATION_TYPE_INSTANT,
                               EffectHeal(d10(2)),
                               OBJECT_SELF);
                               SetModuleOverrideSpellScriptFinished();
                               SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               }  //curamos 2 d10 terminamos el conjuro y lanzamos mensaje al pj
                    else if (dado==3)
                               {
                                ApplyEffectToObject(DURATION_TYPE_INSTANT,
                                EffectSlow(),
                                OBJECT_SELF,
                                120.0);
                                SetModuleOverrideSpellScriptFinished();
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               } // efecto lentitud mensaje y fin de conjuro original
 
 
 
                       break;
               case SPELL_HEAL:
               case SPELL_HEALING_CIRCLE:
               case SPELL_HEALING_STING:
               case SPELL_CURE_CRITICAL_WOUNDS:
               case SPELL_CURE_LIGHT_WOUNDS:
               case SPELL_CURE_MINOR_WOUNDS:
               case SPELL_CURE_MODERATE_WOUNDS:
               case SPELL_CURE_SERIOUS_WOUNDS:
                     if (dado==1)
                               {
                                ApplyEffectToObject(DURATION_TYPE_INSTANT,
                                EffectDamage(d10(2),
                                DAMAGE_TYPE_DIVINE,
                                DAMAGE_POWER_ENERGY),
                                oTarjet);
                                SetModuleOverrideSpellScriptFinished();
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               }
                    else if (dado==2)
                               {
                               ApplyEffectToObject(DURATION_TYPE_INSTANT,
                               EffectMovementSpeedDecrease(50),
                               oTarjet,
                               120.0);
                               SetModuleOverrideSpellScriptFinished();
                               SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               }
                    else if (dado==3)
                               {
                                ApplyEffectToObject(DURATION_TYPE_INSTANT,
                                 EffectHeal(d10(2)),
                                oTarjet,
                                120.0);
                                SetModuleOverrideSpellScriptFinished();
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               }
               break;
               case SPELL_BLADE_THIRST://espada sangrienta
               case SPELL_BLESS_WEAPON: //bendecir arma
               case SPELL_DARKFIRE://fuego oscuro
               case SPELL_FLAME_WEAPON:
               case SPELL_MAGIC_WEAPON:
               case SPELL_GREATER_MAGIC_WEAPON:
                              if (dado==1)
                               {
                                ApplyEffectToObject(DURATION_TYPE_INSTANT,
                                EffectDamage(d10(2),
                                DAMAGE_TYPE_DIVINE,
                                DAMAGE_POWER_ENERGY),
                                 oTarjet);
                                SetModuleOverrideSpellScriptFinished();
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               }
                               if ((dado==2)||(dado==3))
                               {
                                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                               }
 
                 break;
               default: //si es cualquier conjuro no comentado arriba el "defecto"
              if (dado==1)
                       {
                            if (!WillSave(OBJECT_SELF, nSpellDC, SAVING_THROW_TYPE_MIND_SPELLS))
                             {
                              ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
                                    EffectStunned(),
                                    oTarjet,/*OBJECT_SELF*/
                                    IntToFloat(Random(nCastLevel)+1));
                              SetModuleOverrideSpellScriptFinished();
                              SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                              }
                             else
                GiveXPToCreature(OBJECT_SELF, nCastLevel*5);
                SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
 
                     }
 
                else if (dado==2)
                     {
                     ApplyEffectToObject( DURATION_TYPE_PERMANENT,
                                           EffectPolymorph(POLYMORPH_TYPE_CHICKEN),
                                           oTarjet,
                                          30.0);
                     SetModuleOverrideSpellScriptFinished();
                     }
                else if (dado==3)
                     {
 
                      ApplyEffectToObject( DURATION_TYPE_PERMANENT,
                                           EffectPolymorph(POLYMORPH_TYPE_COW),
                                           oTarjet,
                                          30.0);
                      SetModuleOverrideSpellScriptFinished();
                      SendMessageToPC(OBJECT_SELF, "En esta zona la magia se ha vuelto loca");
                     }
 
 
               }//fin switch
 
           }//fin porcentaje
 
          }//fin inicio area salvaje
 
 
 
} //fin void main
 
 
 
 
es el sistema iba a poner cosas para muuuuchos de los conjuros y variados efectos pero...soy un vago. Realmente es un sistema con un gran potencial y al que se le puede sacar mucho partido.  es más fácil modificar aquí conjuros que modificar un original.
  que queremos quitar un conjuro de nuestro servidor, con este sistema ,  con int nSpell    = GetSpellId(); identificamos el conjuro, si nSpell    == SPELL_BLESS_WEAPON (nombre del conjuro) SetModuleOverrideSpellScriptFinished(); paramos el conjuro.... o lo paramos y creamos un efecto diferente en su lugar etc.
 
 
ahora el sistema de magia muerta esta incompleto...en el área de magia muerta en el onenter yo puse este script:
 
void main()
{
 
   object oJugador = GetEnteringObject();
   effect eDisipacionTotal = EffectDispelMagicAll(40);
   ApplyEffectToObject(DURATION_TYPE_INSTANT, eDisipacionTotal, oJugador);
 
   //-----------inventario
 
object oPimerObjeto= GetFirstItemInInventory(oJugador);
while  (GetIsObjectValid(oPimerObjeto))
 
     {
        itemproperty ip = GetFirstItemProperty(oPimerObjeto);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oPimerObjeto, ip);
                        }
                    ip = GetNextItemProperty(oPimerObjeto);
               }
        oPimerObjeto=GetNextItemInInventory(oJugador);
 
      }
 
 //---fin inventario
 
 
 
 
object oArmas=GetItemInSlot(INVENTORY_SLOT_ARMS,oJugador);
object oFlechas=GetItemInSlot(INVENTORY_SLOT_ARROWS,oJugador);
object oCinturon=GetItemInSlot(INVENTORY_SLOT_BELT,oJugador);
object oPiedrecita=GetItemInSlot(INVENTORY_SLOT_BOLTS,oJugador);
object oBotas=GetItemInSlot(INVENTORY_SLOT_BOOTS,oJugador);
object oBala=GetItemInSlot(INVENTORY_SLOT_BULLETS,oJugador);
object oNiIdea=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oJugador);
object oPecho=GetItemInSlot(INVENTORY_SLOT_CHEST,oJugador);
object oCapa=GetItemInSlot(INVENTORY_SLOT_CLOAK,oJugador);
object oArmaB=GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oJugador);
object oArmaL=GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oJugador);
object oArmaR=GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oJugador);
object oCabeza=GetItemInSlot(INVENTORY_SLOT_HEAD,oJugador);
object oManoI=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oJugador);
object oAnilloI=GetItemInSlot(INVENTORY_SLOT_LEFTRING,oJugador);
object oCollar=GetItemInSlot(INVENTORY_SLOT_NECK,oJugador);
object oManoD=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oJugador);
object oAnilloD=GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oJugador);
 
      itemproperty ip;
 
 
 
//---armas
        ip = GetFirstItemProperty(oArmas);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oArmas, ip);
                        }
                    ip = GetNextItemProperty(oArmas);
               }
//----flechas
      ip = GetFirstItemProperty(oFlechas);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oFlechas, ip);
                        }
                    ip = GetNextItemProperty(oFlechas);
               }
//----cinturon
 
        ip = GetFirstItemProperty(oCinturon);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oCinturon, ip);
                        }
                    ip = GetNextItemProperty(oCinturon);
               }
 
//----oPiedrecita
              ip = GetFirstItemProperty(oPiedrecita);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oPiedrecita, ip);
                        }
                    ip = GetNextItemProperty(oPiedrecita);
               }
//----oBotas
             ip = GetFirstItemProperty(oBotas);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oBotas, ip);
                        }
                    ip = GetNextItemProperty(oBotas);
               }
//----oBala
 
           ip = GetFirstItemProperty(oBala);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oBala, ip);
                        }
                    ip = GetNextItemProperty(oBala);
               }
//----oNiIdea
             ip = GetFirstItemProperty(oNiIdea);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oNiIdea, ip);
                        }
                    ip = GetNextItemProperty(oNiIdea);
               }
 //----oPecho
            ip = GetFirstItemProperty(oPecho);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oPecho, ip);
                        }
                    ip = GetNextItemProperty(oPecho);
               }
 
//---oCapa
ip = GetFirstItemProperty(oCapa);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oCapa, ip);
                        }
                    ip = GetNextItemProperty(oCapa);
               }
//----oArmaB
ip = GetFirstItemProperty(oArmaB);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oArmaB, ip);
                        }
                    ip = GetNextItemProperty(oArmaB);
               }
//----oArmaL
ip = GetFirstItemProperty(oArmaL);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oArmaL, ip);
                        }
                    ip = GetNextItemProperty(oArmaL);
               }
//----oArmaR
ip = GetFirstItemProperty(oArmaR);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oArmaR, ip);
                        }
                    ip = GetNextItemProperty(oArmaR);
               }
//----oCabeza
ip = GetFirstItemProperty(oCabeza);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oCabeza, ip);
                        }
                    ip = GetNextItemProperty(oCabeza);
               }
//----oManoI
ip = GetFirstItemProperty(oManoI);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oManoI, ip);
                        }
                    ip = GetNextItemProperty(oManoI);
               }
//----oAnilloI
ip = GetFirstItemProperty(oAnilloI);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oAnilloI, ip);
                        }
                    ip = GetNextItemProperty(oAnilloI);
               }
//----oCollar
ip = GetFirstItemProperty(oCollar);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oCollar, ip);
                        }
                    ip = GetNextItemProperty(oCollar);
               }
//----oManoD
ip = GetFirstItemProperty(oManoD);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oManoD, ip);
                        }
                    ip = GetNextItemProperty(oManoD);
               }
//----oAnilloD
ip = GetFirstItemProperty(oAnilloD);
 
        while (GetIsItemPropertyValid(ip))
               {
 
                   if (GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY)
                       {
                         RemoveItemProperty(oAnilloD, ip);
                        }
                    ip = GetNextItemProperty(oAnilloD);
               }
 
 
 
 
 
}
 
 
 
 
con eso logro quitar todos los conjuros lanzados sobre objetos del pj.... no me arriesgué a dejar los objetos sin propiedades por el tema reinicio lag me saca etc y que se queden sin objetos si alguien sabe de un sistema se lo agradezco
 
 
 
unas cosillas que se me quedaron en el tintero, los hechizos incluye los que lanzan los objetos como varitas, y este sistema no funciona con pnjs a no ser que pongamos una variable en las áreas dónde queramos que sirva también para ellos, la variable es un int---> X2_L_WILD_MAGIC  valor---> TRUE 
Espero que haya servido de ayuda.
 
 
 
 
      
 
 

 

 

 

 

 

 

    

    


Editado por lavafuego, 19 July 2014 - 01:15 PM.

http://tierrasdenemar.mi-foro.es/  (abierto para test 79.109.30.79:5121 )


#2 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 375 posts

Posteado 18 July 2014 - 06:14 PM

¡Grande! Yo en el sistema de magia salvaje me compliqué menos. Puse para estas áreas un ubicado invisible a lo alto de estas áreas, definí unos 60 conjuros entre beneficiosos y perjudiciales, y según la tirada Random el ubicado "conjuraba" uno de estos conjuros, con el ActionCastSpellAtObject dirigido al PC caster. Tanto te puede salir una vengadora sagrada como convertirte en vaca xD

 

También hice una minifunción para que a cada conjuro lanzado informara al DM que hay en el área, cosa que para este es muy útil.


Tutorial NWN Scripting: Click aquí


#3 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 409 posts

Posteado 18 July 2014 - 07:53 PM

También...meterlo en la paleta y ale... que quiero un área de magia salvaje, pues ahí pongo el placeable jeje se me olvidaba decir también que una cosa a favor de modificar los conjuros con el spell-hooking, es que si ponemos haks, actualizaciones etc que toquetean los conjuros originales, si hemos modificado el conjuro en su script original...error, alerta roja, sobreescritura encima de nuestra modificación ect. con este sistema pueden modificar lo que quieran que no nos afecta jeje

 

 

PD:lo que pasa que tú, txibi, kabuto y cia estáis tres peldaños por encima de mi en esto del script jaja sois mis maestros y cuando yo he pensado en algo...tenéis ideas de mejorarlo y...¡¡¡lo hacéis más fácil!!! :rabia:  :rabia:  jaja por eso me gusta este foro nunca dejas de aprender cosas y siempre hay alguien dispuesto a echar un cable.


Editado por lavafuego, 18 July 2014 - 07:54 PM.

http://tierrasdenemar.mi-foro.es/  (abierto para test 79.109.30.79:5121 )


#4 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 375 posts

Posteado 18 July 2014 - 09:16 PM

No no, si el sistema ya lo tienes bien, comprobar el área. Aunque yo hice distinto, con desencadenante, para que pudiera haber zona de magia salvaje/muerte en una sola zona de esta, por ejemplo. Y según una variable, definía si era para la muerta o para la salvaje. El ubicado solo lo utilicé en la de magia salvaje, para que fuera el origen de los conjuros aleatorios.

 

Lo de las actualizaciones y haks es muy cierto. Aunque ahora actualizaciones no creo que hayan y haks lo controlas tú, yo por esto prefiero modificar los conjuros desde el script original, y hacer backups para conservarlos todos.

 

Y por cierto, yo también aprendí a base de prueba y error. Muchos, muchos errores xD Y me atrevería a decir que así es cómo aprendemos todos los scripters. Después a base de utilizar el lexicon encuentras alguna perlita cómo esta guía, pero en principio si no sabes cómo hacer algo y realmente quieres aprender, antes de pedir ayuda o buscar una guía, lo mejor es intentarlo hasta el punto en el que estés a un solo error más de dar un puñetazo a la pantalla xD


Tutorial NWN Scripting: Click aquí


#5 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 82 posts

Posteado 17 December 2015 - 12:58 PM

Geniaaal ¿Se puede hacer que los hechizos sean muuuuucho mas potentes? Porque a niveles de personajes épicos, la magia se vuelven un poco inútiles.. Hechizos comunes, tipo bola de fuego, misiles mágico de Issac, incinerar...



#6 Ferenghy

Ferenghy

    Neonato

  • Miembro
  • PipPip
  • 107 posts

Posteado 17 December 2015 - 01:51 PM

Hola comanche, si es muy fácil cambiar el daño de los conjuros

¿el problema? que tienes que cambiar cada conjuro y eso es bastante tiempo porque son muchos

 

en el vault hay un paquete con todos los spell scripts de 1.69

contiene cientos de archivos tipo: nw_s0_1brntoth.nss

 

Coges su contenido (un script) lo copias como script de tu modulo y le pones exactamente el mismo nombre que el archivo original

Te dirá que ya existe un recurso con ese nombre y si lo utilizas, al lanzar el modulo se usará tu script personalizado en lugar del script base del nwn

 

y listo



#7 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1229 posts

Posteado 17 December 2015 - 04:53 PM

Geniaaal ¿Se puede hacer que los hechizos sean muuuuucho mas potentes? Porque a niveles de personajes épicos, la magia se vuelven un poco inútiles.. Hechizos comunes, tipo bola de fuego, misiles mágico de Issac, incinerar...

muchos spells estan limitados dentro del script en cuanto a daño, efectos, CD, etc, por lo que como dice Ferenghy necesitaras modificar uno por uno los scripts, o bien mediante el spell-hooking agregar +daño/+duracion/+efectos/+CD segun el tipo de conjuro que sea.


Editado por MenemDoIt, 17 December 2015 - 04:53 PM.




Responder



  


A Bragol. Tus amigos te echan de menos.