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

Ayuda creación de objetos, por favor


11 respuestas al tema

#1 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 01 March 2018 - 07:51 AM

Hola, amigos.

Quiero crear un sistema de alquimia, a través de la conversación, 

 

 

 

 /*BLACKSMITH SCRIPT
Created by
Lilac Soul's NWN Script Generator, v. 2.3
for download info please visit
*/
 
int lsn=1;
//lsstype=3
 
void SetItemLocals()
{
SetLocalString(OBJECT_SELF, "lsn1", "nw_it_mpotion006");
SetLocalInt(OBJECT_SELF, "lsc_nw_it_mpotion006", 3);
SetLocalString(OBJECT_SELF, "lsi1_nw_it_mpotion006", "agua");
 
//ya he probado con solo un agua, pero no funciona, le meto otro agua  ^^
SetLocalString(OBJECT_SELF, "lsi2_nw_it_mpotion006", "agua");
SetLocalString(OBJECT_SELF, "lsi3_nw_it_mpotion006", "veneno1");
SetLocalInt(OBJECT_SELF, "lss_nw_it_mpotion006", -10);
SetLocalInt(OBJECT_SELF, "lsv_nw_it_mpotion006", -10);
 
}
 
void CreateGold(object oTarget, int nAmount)
{
CreateItemOnObject("nw_it_gold001", oTarget, nAmount);
}
 
void main()
{
object oOwner=GetPCSpeaker();
 
SetItemLocals();
 
if (lsn==0) return;
 
object oItem;
int bOkay, nGold, nCount, nNum, nLoop, nLoops, nHasGold, nVis;
string sCur, sReq;
 
for (nLoop=1; nLoop<=lsn; nLoop++)
   {
   sCur=GetLocalString(OBJECT_SELF, "lsn"+IntToString(nLoop));
 
   nNum=GetLocalInt(OBJECT_SELF, "lsc_"+sCur);
 
   for (nLoops=1; nLoops<=nNum; nLoops++)
      {
 
      sReq=GetLocalString(OBJECT_SELF, "lsi"+IntToString(nLoops)+"_"+sCur);
      if (GetStringLeft(sReq, 8)=="  gold  ")
         {
         nGold=StringToInt(GetStringRight(sReq, GetStringLength(sReq)-8));
         if (GetGold(oOwner)>=nGold) nCount++;
 
         }
      else if (GetItemPossessedBy(oOwner, sReq)!=OBJECT_INVALID)
         {
         SetLocalObject(OBJECT_SELF, "ls__"+IntToString(nLoops), GetItemPossessedBy(oOwner, sReq));
 
         nCount++;
         }
      }
 
   if (GetLocalInt(OBJECT_SELF, "lss_"+sCur)==-10) bOkay=TRUE;
   else if (GetLastSpell()==GetLocalInt(OBJECT_SELF, "lss_"+sCur)) bOkay=TRUE;
   else bOkay=FALSE;
 
   if (bOkay && (nCount==nNum)) bOkay=TRUE;
   else bOkay=FALSE;
   if (bOkay==TRUE)
      {
 
      if (nGold>0)
      TakeGoldFromCreature(nGold, oOwner, TRUE);
      for (nLoops=1; nLoops<=nNum; nLoops++)
         {
         oItem=GetLocalObject(OBJECT_SELF, "ls__"+IntToString(nLoops));
         DestroyObject(oItem);
         }
      CreateItemOnObject(sCur, oOwner);
      int nVis=GetLocalInt(OBJECT_SELF, "lsv_"+sCur);
      if (nVis!=-10) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(nVis), oOwner);
      }
 
   oItem=OBJECT_INVALID;
   bOkay=FALSE;
   nGold=0;
   nCount=0;
   sCur="";
   sReq="";
   nNum=0;
 
 
 
   }
//como solo me coge uno.. le he dado al copy&paste :D 
 
      object oPC = GetPCSpeaker();
 
  oItem = GetItemPossessedBy(oPC, "agua");
 
if (GetIsObjectValid(oItem))
   DestroyObject(oItem);
 
  }
 
 

 

 

Pero sigue sin funcionaaar, me crea el objeto  (una poción de curar venenos) y me quita uno miscelaneo de veneno, pero solo uno de agua, en vez dos

 

 

Me da igual si es través de sistema de forge o de take&giveitem normal, lo que quiero es poder coger varios objetos del mismo tag -en este caso, "agua" (miscelaneo no apilable), me podéis ayudar?

 

*(Ya he usado el sistema del Lilac Script 2, que es mas avanzado..pero no me arranca el script..)

 

***Por cierto, estoy haciendo una versión del MyM7, para verano o así  puedo pasar  algo semidecente, si alguno le interesa-....   :thumb: .pero me atasco taaanto en estas chorradas :(



#2 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1213 posts

Posteado 01 March 2018 - 12:32 PM

tal vez algo asi te funcione :

al principio del script añade esto :

void DestroyWater(object oPC)
{
 if(GetIsObjectValid(oPC) && GetIsObjectValid(GetArea(oPC)))
 {
  object oItem = GetItemPossessedBy(oPC,"agua");
  if(GetIsObjectValid(oItem))DestroyObject(oItem);
 }
}

y al final del script añade esto :

 DestroyWater(oPC);
 DelayCommand(0.1,DestroyWater(oPC));


10016077DS1515734551.gif


#3 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 08 March 2018 - 09:39 AM

:drinks:  voy a probar...



#4 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 08 March 2018 - 10:33 AM

se resiste  T_T



#5 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 395 posts

Posteado 08 March 2018 - 08:24 PM

haber...crea tu el propio script...poco a poco y ayudándote por aquí seguro que lo dejas como quieres. Es mas o menos lo que pides, en vez de conversación en desencadenante que me es más facil para testear y crear y en vez de poner de tag "agua" pues le toca NW_WSWDG001 que es una daga normal. Básicamente mira el inventario del pj (ojo no lo que tiene equipado) si hay 2 dagas normales o mas elimina una y crea una daga+1...ajustalo con tus objetos y al dialogo.

 

void main()
{
object oJugador=GetEnteringObject(); //jugador que entra en el desencadenante
int iCantidad=0; //vamos a contar objetos tralara
object oObjetoInventario=GetFirstItemInInventory(oJugador); //miramos el primer objeto del inventario del pj...ojo los equipados no cuentan
while(GetIsObjectValid(oObjetoInventario))
    {
      string sTagObjeto= GetTag(oObjetoInventario); //miramos el tag del objeto
      if  (sTagObjeto=="NW_WSWDG001")//si es una daga normal
        {
         iCantidad=iCantidad+1;//sumamos uno a iCantidad
        }
       else
        {
        //a rellenar si se quieren cosas
        }
 
     oObjetoInventario=GetNextItemInInventory(oJugador);//miramos el siguiente objeto del inventario hasta terminar bucle
    }
 
 if  (iCantidad>=2)//si hay mas de dos objetos en este caso dagas normales
   {
    object oObjetoAdestruir=GetItemPossessedBy(oJugador, "NW_WSWDG001");//miramos uno de ellos
    DestroyObject(oObjetoAdestruir,0.0); //lo destruimos
    object oObjetoAcrear=CreateItemOnObject("NW_WSWMDG002", oJugador, 1); //creamos en su lugar una daga +1
 
   }
 else //si no finalizamos
  {
   return;
  }
}

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


#6 Txibi

Txibi

    Antediluvian

  • Miembro DLAN
  • PipPipPipPipPip
  • 4665 posts

Posteado 09 March 2018 - 05:46 PM

Saludos.

 

Mira a ver si esto te sirve:

 

http://www.txibi.com...forjasimple.zip

 

Vale, es para crear una forja en vez de alquimia, pero el principio del script es el mismo... en cuanto encuentre un ordeador con el nwn instalado, transcribo más a fondo.

 

Lo tenía por aquí tirado... ( http://www.clandlan....scargas-varias/ )

 

Txibi.



#7 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 09 March 2018 - 05:56 PM

Gracias, amigoooos!!!  :thumb:



#8 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 09 March 2018 - 06:02 PM

Uff, gran trabajo!!  ^^



#9 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 09 March 2018 - 06:05 PM

Ya puedo seguir avanzando  :flip:

 

 

:OffTopic:

El sistema de alquimia funciona así:-->

 

* Objeto portable de poder único->desencadena dialogo

 

¿Hacer alquimia?

Si

* pociones de Sanacion y Restauración mágica

 Crear poción curar heridas graves (la mas sencilla) (2 belladonas( apilable)+1 agua(no apilable)

Texto aparece cuando (ya se incluyen todas las condiciones de objetos y skills)

Acciones taken (Crear las pociones directamente) 

 

Naturalmente, el sistema se complicará con las pociones mas elevadas,(que serán de poder único) he pensado hacerlo en varios pasos de dialogo.. ¿crees que es un sistema adecuado?


Editado por Komanche, 09 March 2018 - 06:13 PM.


#10 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 395 posts

Posteado 09 March 2018 - 06:17 PM

pues te va a tocar tirar horas de script.... si no te aclaras con lo de txibi (que yo me quedaría con su sistema)....te va a tocar hacer algo asi(con las puñeteras dos dagas que crean una mas uno y eliminan solo dos del inventario aunque tengas mil):

 

 

///creamos una funcion para mirar la cantidad de objetos que tiene con sNombreObjeto al no estar definido vale para todos los objetos que queramos testear
void mirarCantidad(object oJugador, string sNombreObjeto,int CantidadObjetosTieneTipo)
 {
  int iCantidad=0; //ponemos el contador a cero
  object oObjetoInventario=GetFirstItemInInventory(oJugador);//miramos el inventario del pj
    while(GetIsObjectValid(oObjetoInventario))
      {
         string sTagObjeto= GetTag(oObjetoInventario); //sacamos el tag del objeto
         if  (sTagObjeto== sNombreObjeto)//si coincide con el de sNombreObjeto sumamos uno a la cantidad
            {
             iCantidad=iCantidad+1;
            }
          else
           {
            //a rellenar si se quieren cosas
           }
 
     oObjetoInventario=GetNextItemInInventory(oJugador);
    } //FIN WHILE
  //damos valor a la variable con la cantidad de objetos
 
  SetLocalInt(oJugador, "CantidadObjetosTieneTipo", iCantidad);
 }
 
//creamos funcion para crear UN objeto y que valga para todo el script
 
void ObjetoaCrear(string sNombreObJetoAcrear,object oJugador)
 {
  CreateItemOnObject(sNombreObJetoAcrear, oJugador, 1);
 }
 
 
///////iniciamos funcion
 void main()
{
object oJugador=GetEnteringObject();//oJugador quien entra en el desencadenante
string sNombreObjeto; //declaramos que va a haber un string de nombre sNombreObjeto que daremos valor mas adelante
SetLocalInt(oJugador, "CantidadObjetosTieneTipo",0);//nos aseguramos que la variable de contar objetos esta a cero
int CantidadObjetosTieneTipo=GetLocalInt(oJugador, "CantidadObjetosTieneTipo");//y creamos la variable   CantidadObjetosTieneTipo que tendra valor cero
int iTotal=0; //creamos variable int con valor cero
string sNombreObJetoAcrear; //declaramos que hay un string de nombre sNombreObJetoAcrear al cual daremos valor mas adelante
 
 
 
 
/////////////////////////funcion con dos dagas y hacer daga+1 ////////////////////////////
 
            ///////damos el tag del objeto a mirar daga normal
                      sNombreObjeto="NW_WSWDG001";
 
             /////tag del objeto que vamos a crear
                 sNombreObJetoAcrear="NW_WSWMDG002";
 
          ///////////funcion contar dagas///////////
     mirarCantidad(oJugador,sNombreObjeto ,CantidadObjetosTieneTipo);
 
////////si la funcion de contar devuelve 2 o mas dagas destruimos dos y creamos daga +1
//////////////esta parte se puede hacer con funcion y poner al principio del script...ando corto de tiempo lo dejo asi
if (GetLocalInt(oJugador, "CantidadObjetosTieneTipo")>=2)
   {
    object oObjetoInventario=GetFirstItemInInventory(oJugador);
    while(GetIsObjectValid(oObjetoInventario))
      {
       string sTagObjeto= GetTag(oObjetoInventario);
 
       if  ((sTagObjeto=="NW_WSWDG001")&& (iTotal<=1)) //el primero es cero y el segundo 1
          {
           DestroyObject(oObjetoInventario,0.0);
           iTotal=iTotal+1;
          }
        else
          {
 
          }
        oObjetoInventario=GetNextItemInInventory(oJugador);
      }
     ObjetoaCrear(sNombreObJetoAcrear,oJugador);
   }
   /////////////para asegurarnos que no es necesaio dejamos las variables a cero
                      iTotal=0;
             SetLocalInt(oJugador, "CantidadObjetosTieneTipo",0);
 
 
 
 
/////////////////////////////////si quisieramos hacerlo con otros objetos repetimos secuencia de arriba///////////////
 
 
////////////////////////////////////////////////////////////////////////////////////////////////
}//fin void main

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


#11 Txibi

Txibi

    Antediluvian

  • Miembro DLAN
  • PipPipPipPipPip
  • 4665 posts

Posteado 09 March 2018 - 07:01 PM

Saludos.

 

He probado con una variación, que sería cambiar el script dom_forja_daga_1 por tx_pociones_1 en la conversación, (que le puse un nombre más acorde, pero eso ya a gustos)

 

/*

Txibi, Script de prueba de hacer pociones.
Tal da como hoy, es un 9 de marzo del 2018

Creación de Objetos.

   Primero crear el objeto con una etiqueta y resref personalizados y ¡ojo!,
que sean el mismo nombre, por ejemplo dom_daga_01 o mis_hacha_01 o tx_armad_01.

Ejemplo: Crear una poción especial.

Objeto.                     Etiqueta.      Resref.
Botella con vino.           tx_vino01      tx_vino01
Líquido extraño.            tx_cocacola    tx_cocacola

Alambique para mezclar.     tx_botellon    tx_botellon

Poción Terminada.           tx_kalimotxo   tx_kalimotxo


-----------------------FIN DEL COMENTARIO----------------------------------
*/


//CUERPO PRINCIPAL
void main()
{
    //Cogemos el alambique más cercano donde se mezcla la poción.
    object oAlambique= GetNearestObjectByTag("tx_botellon");
    //Decimos que el "Mezclador" es quien "habla" con el alambique mientras mezcla.
    object oMezclador = GetLastSpeaker();
    //Creamos las cadenas de texto que recuerdan los objetos que metemos.
    string sObjetoPrimero, sObjetoSegundo, sObjetoTercero;
    //Creamos las variables numericas que validan esos objetos.
    int iPrimero, iSegundo, iTercero;

    //Creamos el object que mira los objetos de la forja.
    object oInventarioAlambique = GetFirstItemInInventory(oAlambique);
    //Creamos la variable que comprobara que sea valido.
    int bValido = GetIsObjectValid(oInventarioAlambique);

    //Contador a cero (i es el contador)
    int i=0;

    //Creamos los object que recuerdan los liquidos a borrar.
    object oBorraLiquido_1, oBorraLiquido_2, oBorraLiquido_3;

    //Variables definidas iniciando el programa en si.

    //Mientras el objeto de forja sea igual a valido ejecuta este bucle.
    while (bValido == TRUE)
    {
        i = i + 1; //Incrementamos el contador en 1.

        sObjetoPrimero = GetTag(oInventarioAlambique);
        if (sObjetoPrimero == "tx_vino01")
        {
            iPrimero = 1;
            oBorraLiquido_1 = oInventarioAlambique;
        }//fin if sObjetoPrimero.


        sObjetoSegundo = GetTag(oInventarioAlambique);
        if (sObjetoSegundo == "tx_vino01")
        {
            iSegundo = 1;
            oBorraLiquido_2 = oInventarioAlambique;
        }//fin if sObjetoSegundo.

        sObjetoTercero = GetTag(oInventarioAlambique);
        if (sObjetoTercero == "tx_cocacola")
        {
            iTercero = 1;
            oBorraLiquido_3 = oInventarioAlambique;
        }//fin if sObjetoSegundo.

        //Pasamos al siguiente objeto de la forja.
        oInventarioAlambique = GetNextItemInInventory(oAlambique);
        //Miramos que sea valido.
        bValido = GetIsObjectValid(oInventarioAlambique);

        //Si ya son mas de tres líquidos finalizar bucle.
        if (i>3)
        {
            bValido = FALSE;
        }
    }//Fin while de comprobacion de objetos.

    //Comprobar coinciden los líquidos usados.
    if ((iPrimero == 1) && (iSegundo == 1) && (iTercero == 1))
    {
        SendMessageToPC(oMezclador, "Mezclando la misteriosa pócima.");
        //Destruyendo los objetos usados.
        DestroyObject(oBorraLiquido_1);
        DestroyObject(oBorraLiquido_2);
        DestroyObject(oBorraLiquido_3);

        //Opcional; dar un efecto.
        ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_MAGICAL_VISION),oAlambique);
        //Crear el objeto AL FIN.
        CreateItemOnObject("tx_kalimotxo",oAlambique,1); //Ese 1 es la cantidad creada...
    }//Fin creacion de objeto.

    //Si no tiene los objetos correctos, pues nada.
    else
    {
        SendMessageToPC(oMezclador, "Parece que algo falla...");
        //Opcional; que pase algo malo si mezcla incorrectamente, poner aqui habilidad libre.

    }//Fin de fallo de creacion de objetos.

}//Fin del cuerpo principal.

 

Hay que crear los objetos personalizados, claro. Editar copia en el objeto y lo renombras al gusto con la etiqueta y resref personalizados.

 

Este script sería para pociones simples y habría que hacer uno por poción, para un sistema de pociones, habría que hacerlo más complejo... de forma que en unos pocos script pudieran ser infinidad de pociones y combinaciones... igual miro, si me acuerdo de algo.

 

T.


Editado por Txibi, 09 March 2018 - 07:04 PM.


#12 Komanche

Komanche

    Humano

  • Miembro
  • Pip
  • 67 posts

Posteado 10 March 2018 - 01:07 AM

Gracias a los dos,  grandisimo curro!!

 

No será tantas pociones un total de 20 , con las especiales, para hacerlo interesante 

 

De momento, ya he terminado Isla Esmeralda, y estoy dándole a Harmondale y las afueras :D





Responder



  


A Bragol. Tus amigos te echan de menos.