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

Script para entrega de objetos de quest (nwn1)

quest script recompensa misiones

7 respuestas al tema

#1 Zoraga

Zoraga

    Ancillae

  • Miembro
  • PipPipPip
  • 256 posts

Posteado 22 September 2016 - 08:56 AM

Hola gente, me paso otra vez por aquí para pedir que me echen una mano con algo simple (creo).

Estoy armando un módulo usando el lilac soul, que con un poco de ingenio me ha ayudado a hacer casi todo lo que tengo en mente, y ya llevo varias misiones creadas, onda entregar objetos a cambio de oro y exp, matar a tal bicho, hacer recados, trabajos de medio tiempo, etc. La cosa es que estoy creando una misión donde un pnj te pide unas setas para crear una pócima, que en total serian 3 setas por pócima, el problema viene cuando le voy a dar las 3 setas, pude crear un script para que chequee si tengo las 3, pero necesito uno para que el pnj saque las 3 del inventario, ya que no encontré manera de que sacara las 3 con el lilac soul.

Armé un script para ello, funciona de la siguiente manera:

-Aclaro que el script va en el editor de conversación.
-Primero saca el objeto del inventario, identificado con un tag (setas_01).
-Luego se activa un delay (120 seg.) para simular que el pnj está preparando la pócima a través de una variable (var_setaslistas1) para que el pj vaya a retirar mas tarde y otro que te avisa cuando está lista con un mensaje.

Funciona bien, pero quiero que saque 3 objetos, no 1, probé repitiendo el script 3 veces, pero deduzco que aunque lo repita 3 veces me toma el mismo objeto, aquí el script (sin la repetición que mencioné):
 

void main()
{
 
object oPC = GetPCSpeaker();
 
object oItem;
oItem = GetItemPossessedBy(oPC, "setas_01");
 
if (GetIsObjectValid(oItem))
   DestroyObject(oItem);
 
DelayCommand(120.0, SetLocalInt(oPC, "var_setaslistas1", 1));
 
DelayCommand(120.0, FloatingTextStringOnCreature("Ya esta listo el extracto que pediste.", oPC));
 
}

 


Colaborando en:



Nombre servidor: ES) Rebelión del Submundo
Tipo de servidor: rol/acción/jvj
Jugadores: 1-25
Niveles: 1-30
Base literaria: Reinos Olvidados
IP (conectar directamente): sombrasdefaerun.no-ip.org
Foro: http://usn-rol.foroes.org/



 


#2 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 409 posts

Posteado 22 September 2016 - 10:55 AM

void main()
{
 
object oJugador=GetPCSpeaker();
//object oJugador=GetEnteringObject();
 
SetLocalInt(oJugador, "setas", 0);
//bloque de mirar el inventario
object oSeta=GetFirstItemInInventory(oJugador);
 while (GetIsObjectValid(oSeta))
    {
     if (GetLocalInt(oJugador, "setas")<3)
       {
          string sNombreObjeto=GetTag(oSeta);
          if  (sNombreObjeto=="setas_01")
             {
             SetLocalInt(oJugador, "setas", (GetLocalInt(oJugador, "setas")+1));
             SetLocalInt(oSeta,"destruir",1);
 
             } //fin if
        oSeta = GetNextItemInInventory(oJugador);
      } //fin if getlocalint
     else
     {
      //miramos los objetos marcados para destruir
      object oAdestruir=GetFirstItemInInventory(oJugador);
        while (GetIsObjectValid(oAdestruir))
           {
             if((GetLocalInt(oAdestruir, "destruir")==1) &&(GetTag(oAdestruir)=="setas_01"))
              {
               DestroyObject(oAdestruir, 0.0);
              }
            oAdestruir = GetNextItemInInventory(oJugador);
           }
        //aplico tus delais
        DelayCommand(120.0, SetLocalInt(oJugador, "var_setaslistas1", 1));
        DelayCommand(120.0, FloatingTextStringOnCreature("Ya esta listo el extracto que pediste.", oJugador));
       //fin delais
       oSeta = GetNextItemInInventory(oJugador);
     }
    } //fin while
 
 
}
 
 
he cambiado oPC por oJugador
deberias poner una animacion al pj de beber o algo asi
 
el script funciona de esta manera... hacemos un while y miramos el inventario del pj si tiene una seta, le subimos en uno el valor de la int almacenada en el jugador con nombre "setas" (que previamente al iniciar el script lo pusimos a cero ;) ) cuando la int este a 3, es que tiene 3 setas. y en vez de seguir mirando mas objetos hacemos otro while que va restando la int y destruyendo objetos, las setas....
 
seguro que hay formas más fáciles pero esta es la que se me ha ocurrido...la he testeado en un desencadenante y funciona. ya me contarás

Editado por lavafuego, 22 September 2016 - 11:22 AM.

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


#3 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 374 posts

Posteado 22 September 2016 - 11:29 PM

Maldito lavafuego, matando inocentes setas a mis espaldas ¬¬

 

He hecho un script un poco más optimizado (solo un bucle while) para darles una muerte más digna  :P Sirve para ver un buen uso de las variables locales de objetos y el bucle "for".

 

//Setaka: Script para enviar setas a su creador divino
void main()
{
object oPC = GetPCSpeaker(); //el PJ hablador
object oItem = GetFirstItemInInventory(oPC);//primer objeto del inventario
int iN; //contador de setas que encuentra, 0 por defecto
while(oItem!=OBJECT_INVALID)//mientras encuentre un objeto en el inventario...
{
if( (GetTag(oItem)=="seta") && (iN<3) )//si el objeto tiene de etiqueta "seta"... y aun no hemos encontrado 3 setas...
{
iN++; //...hemos encontrado una, suma +1 al contador
SetLocalObject(oPC, "RecuentoSetas"+IntToString(iN), oItem);//guardamos la seta en una variable referenciando si es la 1, la 2 o la 3 segun el contador
}
oItem = GetNextItemInInventory(oPC);//y seguimos buscando objetos del inventario a por mas
}

if(iN==3)//si ha encontrado 3 setas...
{
int n;
for(n=1; n<4; n++)//...repetira este codigo 3 veces, empezando por la seta 1 (primer ciclo n=1, subira +1 hasta que pase de 3 que parara)
{
string sVar = "RecuentoSetas"+IntToString(n);//buscamos la seta 1, 2 o 3
DestroyObject(GetLocalObject(oPC, sVar));//la destruimos vilmente :'(
//DeleteLocalObject(oPC, sVar);//y la variable que la asocia
}
//y aqui los delays
}
//y edito: mejor reiniciar el sistema de variables si no ha encontrado todas

DeleteLocalObject(oPC, "RecuentoSetas1");
DeleteLocalObject(oPC, "RecuentoSetas2");
DeleteLocalObject(oPC, "RecuentoSetas3");


}

Editado por Setaka, 22 September 2016 - 11:41 PM.

Tutorial NWN Scripting: Click aquí


#4 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 409 posts

Posteado 22 September 2016 - 11:42 PM

Oleeee así si :P eres un crack

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


#5 Zoraga

Zoraga

    Ancillae

  • Miembro
  • PipPipPip
  • 256 posts

Posteado 23 September 2016 - 08:19 AM

Muchas gracias, funcionó como esperaba, lo puse en la conversación del pnj y las quita sin problema.

Y ya que estamos con el script de entrega de setas, usaré el impulso para ver si se puede mejorar el script que es para encontrarlas y regenerarlas, tengo un script que armé, para colocar en el OnUsed del placeable de la seta, pero está muy simplón, el script consiste en lo siguiente: el pj llega, toca el placeable, pide una tirada de dados en buscar (dificultad 25), si no la pasa te dice que no encuentras setas en buen estado (ahí me falta agregar algo para que no sea solo clikear hasta pasar la tirada simplemente), y si la pasa, le entrega una seta (el objeto) y queda en el inventario, luego el placeable desaparece, pero falta que regenere, para eso puse un script en el OnDeath pero no me convence tampoco, aquí coloco el script del el evento OnUsed que le da la seta al pj si es que la encuentra: 

 

string sDeny;

 
 
void main()
{
 
object oPC = GetLastUsedBy();
 
if (!GetIsPC(oPC)) return;
 
if (!GetIsSkillSuccessful(oPC, SKILL_SEARCH, 25))
   {
   sDeny="No encuentras setas en buen estado.";
 
   SendMessageToPC(oPC, sDeny);
 
   return;
   }
 
CreateItemOnObject("setas_01", oPC);
 
object oTarget;
oTarget = OBJECT_SELF;
 
DestroyObject(oTarget, 0.0);
 
}

 

 y para regenerarlas puse un script en OnDeath pero no supe hacer que regenerara como tal, si no que llamara otra copia del placeable desde la paleta y lo colocase en un punto de ruta después de un tiempo, lo malo es tener que llenar de puntos de ruta, sería mejor llamar su regeneración desde el script OnUsed y que el placeable regenerara como una copia de si misma desde su propia ubicación.

Creo que me enredé jajaja, pero para resumir, lo que intento básicamente, es que el pj llega, busca setas clikeando el placeable de la seta, y si encuentra obtenga 1, y si no encuentra que no pase nada, y que en ambos casos tenga que esperar un tiempo para volver a intentar la tirada para encontrar setas, quiza ni sea necesario destruir el placeable y regenerarlo y sea mas simple que eso pero no supe hacerlo.


 


Colaborando en:



Nombre servidor: ES) Rebelión del Submundo
Tipo de servidor: rol/acción/jvj
Jugadores: 1-25
Niveles: 1-30
Base literaria: Reinos Olvidados
IP (conectar directamente): sombrasdefaerun.no-ip.org
Foro: http://usn-rol.foroes.org/



 


#6 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 409 posts

Posteado 23 September 2016 - 12:08 PM

si no la pasa te dice que no encuentras setas en buen estado (ahí me falta agregar algo para que no sea solo clikear hasta pasar la tirada simplemente)

 la solución para eso pasaría por poner al usarlo una variable en el objeto con el nombre del pj, cuando se use, lo primero sacas el nombre del pj y miras la variable si esta en uno, osea usado que salte la frase ya miraste, si esta a cero que haga la tirada. después un delay para resetear y que el pj pueda volver a intentarlo a los 1000.0 segundos por ejemplo.

 

y para regenerar objetos....mi consejo, después de muuuchos quebraderos de cabeza, pinta un desencadenante genérico alrededor del objeto pero alejado, por el que pase un pj al acercarse o al alejarse...incluso en las entradas y salidas del área. Y mediante el script de destrucción aprovechas y le metes una variable al desencadenante. cuando un pj pase por el desencadenante si esa variable esta activa (osea el objeto destruido) comenzamos su creación en el punto de ruta.

 

conclusión mira en la seta en pj con la funcion GetName obtenemos el nombre del pj un string que será el nombre de la variable int. con SetLocalInt metemos la variable (nombre del pj) y le damos el valor 1. la siguiente linea DelayCommand(800.0, SetLocalInt y ponemos en 800 segundos la variable a valor 0

 

ahora solo te queda hacer un cheack    if(GetLocalInt  si es 0 puedes buscar setas......y metemos la parrafada de arriba de la variable....else if(GetLocalInt  es igual a uno que salte frase no puedes buscar más

 

 

si necesitas ayuda te echamos un cable es algo sencillito pero poco a poco y preguntando verás como coges soltura muy pronto ;)

 

el esquema por si acaso xD

 

object oJugador....

string snombre con el get name

if( GetLocalInt(OBJECT_SELF,snombre.......es igual a cero

 {

 SetLocalInt(OBJECT_SELF, el nombre del jugador valor 1

DelayCommand(800.0, SetLocalInt(OBJECT_SELF, valor a cero cuando pasen 800 segundos el valor pasa a ser 0 y puede volver a usar la roca

tirada

   if de tirada

     {

     consigue o no setas

     }

 

}

else if( GetLocalInt(OBJECT_SELF,snombre.......es igual a uno

{

frase de que no puede recoger aun

}

 

 

 

lo importante es que sepas porqué lo haces y como funciona el script....el resto es jugar con las funciones y optimizar (cosa que a setaka se le da 1000 veces mejor que a mi :P )


Editado por lavafuego, 23 September 2016 - 12:10 PM.

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


#7 Zoraga

Zoraga

    Ancillae

  • Miembro
  • PipPipPip
  • 256 posts

Posteado 24 September 2016 - 07:35 AM

Creo que pillo tu idea, algo así como que ¿el placeable salga por un encuentro? voy a probar.


Colaborando en:



Nombre servidor: ES) Rebelión del Submundo
Tipo de servidor: rol/acción/jvj
Jugadores: 1-25
Niveles: 1-30
Base literaria: Reinos Olvidados
IP (conectar directamente): sombrasdefaerun.no-ip.org
Foro: http://usn-rol.foroes.org/



 


#8 Zoraga

Zoraga

    Ancillae

  • Miembro
  • PipPipPip
  • 256 posts

Posteado 25 September 2016 - 07:27 AM

Si me resultó, gracias :D , quedó algo así:

 

int nInt;

object oTarget;
string sDeny;
 
void main()
{
 
object oPC = GetLastUsedBy();
 
if (!GetIsPC(oPC)) return;
 
if (GetLocalInt(oPC, "var_buscasetas")!= 0)
   {
   sDeny="No encuentras setas en buen estado.";
 
   SendMessageToPC(oPC, sDeny);
 
   return;
   }
 
if (GetIsSkillSuccessful(oPC, SKILL_SEARCH, 25))
   {
   CreateItemOnObject("setas_01", oPC);
 
   FloatingTextStringOnCreature("Has encontrado 1 seta rosada.", oPC);
 
   oTarget = OBJECT_SELF;
 
//Visual effects can't be applied to waypoints, so if it is a WP
//the VFX will be applied to the WP's location instead
 
   nInt = GetObjectType(oTarget);
 
   if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEAD_ODD), oTarget);
   else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEAD_ODD), GetLocation(oTarget));
 
   DestroyObject(oTarget, 3.0);
 
   }
SetLocalInt(oPC, "var_buscasetas", 1);
 
DelayCommand(60.0, SetLocalInt(oPC, "var_buscasetas", 0));
 
}

 

También le puse la variable en un desencadenante para reiniciarla.

Gracias a los 2.


Editado por Zoraga, 25 September 2016 - 07:48 AM.

Colaborando en:



Nombre servidor: ES) Rebelión del Submundo
Tipo de servidor: rol/acción/jvj
Jugadores: 1-25
Niveles: 1-30
Base literaria: Reinos Olvidados
IP (conectar directamente): sombrasdefaerun.no-ip.org
Foro: http://usn-rol.foroes.org/



 




Responder



  



También marcado con quest, script, recompensa, misiones

A Bragol. Tus amigos te echan de menos.