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

Mirar si hay x combinación de objetos.


5 respuestas al tema

#1 Obsidiana

Obsidiana

    Humano

  • Miembro
  • Pip
  • 38 posts

Posteado 09 May 2018 - 11:21 AM

Hola buenas, estoy pensando en un sistema de oficios y se me presenta una duda.

 

¿Cual es la mejor forma, de aislar una receta, mirando si hay varios objetos?

 

Me intento explicar, lo que estoy buscando es lo siguiente.

Si hay objeto a, objeto b y objeto c, se crea x objeto.

 

Lo estoy intentando adaptar a este sistema encontrado en Neverun, para hacer un sistemilla básico de oficios:

void main()
{

object oPC= GetPCSpeaker();//Identificamos al pj.
object oTarget=OBJECT_SELF;//Marcamos el ubicado contenedor que vamos a usar de mesa de trabajo
object oOb=GetFirstItemInInventory(oTarget);//Marcamos el primer objeto del inventario del objeto contenedor.

string sDado, sNivel, sTotal;//Maracmos unos string que usaremos mas tarde
string sNom=GetName(oPC)+GetPCPlayerName(oPC);//Cogemos el nombre del pj, y de su controlador.

int nDado, nTotal, iNivel;//Marcacmos unas int que usaremos despues
int nRangos=GetAbilityModifier (ABILITY_CONSTITUTION, oPC);//Cogemos la habilidad del pj
int iPx=GetCampaignInt("bdninfa",sNom,oPC);//Recogemosla canmtidad de PX de herreria acumulados.

string sRangos=IntToString(nRangos);

while (oOb!=OBJECT_INVALID)//Comenzamos un bucle que recorrera todos los objetos dela  mesa de trabajo
  {
  if (GetTag(oOb)=="met_oro")
    {
    DestroyObject(oOb);
    nDado=d20();
    sDado=IntToString(nDado);
    iNivel=iPx/10;//Suponiendo que cada 10px de herrero suba un nivel, aqui maracmos el nivel.
    if(iPx<=9)iNivel=0;//Si aun no tinene ni 10px, redondeamos su nivel a 0.
    sNivel=IntToString(iNivel);
    nTotal=nDado+nRangos+iNivel;//Sumamos el nivel al chequeo.
    sTotal=IntToString(nTotal);
    SendMessageToPC(oPC,"Prueba de constitucion, resultado: "+sDado+" Modificador: "+sRangos+" Nivel: "+sNivel+" = "+sTotal+" CD:25");//mandamos un mensage por el canal de datos al pj
    if (nTotal>=25)
      {
      CreateItemOnObject("ling_oro", oTarget);//Creamos el lingote dentro del objeto contenedor (mesa de trabajo)
      SendMessageToPC(oPC,"La fundicion ha resultado existosa");
      iPx++;//Si tubo exito gana 1px extra.
      }
      else
      {
      SendMessageToPC(oPC,"La fundicion ha sido un fracaso");
      }
    }
  oOb=GetNextItemInInventory(oTarget);//Pasamos al siguiente objeto para comprobar si e sun lingote.
  }

SetCampaignInt("bdninfa",sNom,iPx,oPC);//Guardamos en la base de datos la cantidad de PX ganados en herreria
} 

Mi idea con esto es hacer que cuando te crea el lingote (en este caso no me sirve, pero imaginemos que en vez de un lingote es una espada) añadir ahí que coja un objeto básico de la paleta y lo modifique añadiéndole un nombre, descripción y las propiedades. Voy por partes, a ver si lo voy consiguiendo :)

 

Iré poniendo por aquí los avances por si a alguien le interesa.

 

EDITO: poniendo el script tal como me lo expusiste allá arriba; al iniciar la conversación me hace mil veces la tirada y sube tropecientos nv de herrería, creando a partir de una misma pieza de metal 25 paginas de lingotes. Que paranolla :S


Editado por Obsidiana, 09 May 2018 - 01:00 PM.


#2 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1210 posts

Posteado 10 May 2018 - 05:02 AM

¿Cual es la mejor forma, de aislar una receta, mirando si hay varios objetos?

 

Me intento explicar, lo que estoy buscando es lo siguiente.

Si hay objeto a, objeto b y objeto c, se crea x objeto.

 

Mi idea con esto es hacer que cuando te crea el lingote (en este caso no me sirve, pero imaginemos que en vez de un lingote es una espada) añadir ahí que coja un objeto básico de la paleta y lo modifique añadiéndole un nombre, descripción y las propiedades. Voy por partes, a ver si lo voy consiguiendo :)

no mire el script, pero mas o menos lo que necesitas es esto :

void main()
{
 object oJugador;
 int a,b,c;
 object oItem1 = GetItemPossessedBy(oJugador,"ItemTag1");
 object oItem2 = GetItemPossessedBy(oJugador,"ItemTag2");
 object oItem3 = GetItemPossessedBy(oJugador,"ItemTag3");
 if(GetIsObjectValid(oItem1))a = 1;
 if(GetIsObjectValid(oItem2))b = 1;
 if(GetIsObjectValid(oItem3))c = 1;
 if(a && b && c)
 {
  object oNuevoItem = CreateItemOnObject("ResRef",oJugador,1);
  SetName(oNuevoItem,"NuevoNombre");
  SetDescription(oNuevoItem,"NuevaDescripcion");
  AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1,IP_CONST_DAMAGESOAK_5_HP),oNuevoItem);
  DestroyObject(oItem1);
  DestroyObject(oItem2);
  DestroyObject(oItem3);
 }
} 

como te imaginaras tendras que configurar el script a tu gusto, pero la base deberia ser esa. no lo testee, asique si falla algo me avisas.


Editado por MenemDoIt, 10 May 2018 - 05:04 AM.

10016077DS1515734551.gif


#3 Obsidiana

Obsidiana

    Humano

  • Miembro
  • Pip
  • 38 posts

Posteado 10 May 2018 - 02:40 PM

Va perfecto! Aunque tengo que tener un poco de cuidado a la hora de hacer recetas. Porque claro, si una receta tiene: A B C y otra tiene A B, se crean ambas. Aunque creo que se puede jugar con combinaciones de sobra y las cantidades llamar a Z lo que sería dos objetos B y así ampliamos aún más las formulas. Eres una máquina, muchas gracias :)


EDITO: Se podría hacer de alguna forma, de que el script mirara si hubiera mas de 3 objetos en la forja (lo he adaptado a una forja) se parara el script?


Editado por Obsidiana, 10 May 2018 - 03:02 PM.


#4 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1210 posts

Posteado 10 May 2018 - 04:02 PM

Va perfecto! Aunque tengo que tener un poco de cuidado a la hora de hacer recetas. Porque claro, si una receta tiene: A B C y otra tiene A B, se crean ambas.

eso se resuelve facil con un return al final del chequeo de "a && b && c", y a continuacion el chequeo de "a && b", por ejemplo.

EDITO: Se podría hacer de alguna forma, de que el script mirara si hubiera mas de 3 objetos en la forja (lo he adaptado a una forja) se parara el script?

creo que algo asi te serviria :

void main()
{
 object oForja;
 int iMax;
 object oItem = GetFirstItemInInventory(oForja);
 while(oItem != OBJECT_INVALID)
 {
  iMax++;
  oItem = GetNextItemInInventory(oForja);
 }
 if(iMax > 3)
 {
  //Lo que quieras hacer
 }
} 

10016077DS1515734551.gif


#5 Obsidiana

Obsidiana

    Humano

  • Miembro
  • Pip
  • 38 posts

Posteado 10 May 2018 - 04:12 PM

Gracias!

En cuanto al return da igual el orden? Osea me explico:

Da lo mismo poner la receta: ABC  - return - AB o AB - return - ABC?

 

Osea si el orden da lo mismo? A la hora de chequear :S



#6 MenemDoIt

MenemDoIt

    Antediluvian

  • Miembro
  • PipPipPipPipPip
  • 1210 posts

Posteado 10 May 2018 - 04:18 PM

no, primero va el chequeo mas largo ( a && b && c ) y despues los chequeos mas cortos ( a && b ), de otro modo se crearia la receta de a && b y nunca la de a && b && c.


10016077DS1515734551.gif




Responder



  


A Bragol. Tus amigos te echan de menos.