Ertos

20/11/2011 10:58:49

Pues nada, hallome en un dilema y las petadas del ordenador y mis largos tiempos sin trastear al aurora me han dejado sin poderes Aurorativos.

Mi problema es que necesito hacer que en una conversacion un pnj haga lo siguiente:

-Te de un objeto a cambio de otro. (Ñae, hasta aqui bien)
-Te de un objeto a cambio de dos de los otros. (Meeec, error, ya no puedo hacerlo con las conversaciones basicas)
-Te de un objeto """""""""""""" tres """""""
-Te de un objeto """""" cuatro y asi seguidamente

Y que si no tienes ningun objeto de estos no te los de evidentemente (que las conversaciones basicas de nwn aunque no tengas oro va el pnj y te hace viajar en barco por ejemplo)

Los objetos que te cojan seran monedas (que me gustaria fueran apilables, pero oiga no nos vamos a poner exigentes).

Tambien se que habia una manera de que no pudieran trampearte con esto y quedarse las monedas y conseguir el objeto. ¿Era poniendo la conversacion asi, no?

PJ-Dame el objeto.
PNJ-Dame tu las monedas antes.
PJ-Aqui las tienes.(Le da las monedas)
PNJ-Firme aqui y aqui...
PJ- Hecho
PNJ- Toma el objeto(Le da el objeto)

_Kaworu_

20/11/2011 15:44:06

Haz el intercambio en un solo paso en vez de 2, y te ahorras cualquier problema, recuerda que una convesacion se puede cancelar en cualquier momento dandole al ESC.

Si no sabes programar, puedes sacarte de la manga un script con el Lilac soul's script generator porque eso que dices es trivial.

http://nwvault.ign.com/View.php?view=other.detail&id=625

Ertos

26/11/2011 14:27:09

Lo he probado pero no me da opcion a especificar el numero de items

AlthorDeMalavir

26/11/2011 16:43:10

No veo el problema que podrías tener, si el objeto es apilable (con stack) con usar las funciones siguientes puedes crear el script.

[code:1:e3b86954ee]
// Returns stack size of an item
// - oItem: item to query
GetItemStackSize(object oItem)

// Sets stack size of an item.
// - oItem: item to change
// - nSize: new size of stack. Will be restricted to be between 1 and the
// maximum stack size for the item type. If a value less than 1 is passed it
// will set the stack to 1. If a value greater than the max is passed
// then it will set the stack to the maximum size
SetItemStackSize(object oItem, int nSize)

// Take oItem from oTakeFrom
// If oItem is not a valid item, or oTakeFrom is not a valid object, nothing
// will happen.
ActionTakeItem(object oItem, object oTakeFrom)
[/code:1:e3b86954ee]

Ertos

27/11/2011 00:39:44

Entonces a ver, que yo me entienda...

En esto que has puesto ¿donde pondría yo "2 Moneditas" a cambio de este objeto y como lo pondría?

A ver si me he enterado:

GetItemStackSize(object oMoneditas)

SetItemStackSize(object oMoneditas, int n2)

ActionTakeItem(object oMoneditas, object oPC)

¿Esta bien asi o acabo de asesinar a todos los scripters del foro?

:lol:

AlthorDeMalavir

27/11/2011 10:59:58

*se cae de espaldas*

Parece que no tienes ni idea de scripts, es mejor que te busques un scripter sino vas apañado, yo mas allá de ayudarte en alguna duda o indicarte esta o aquella función no puedo hacer mas.

Ertos

08/12/2011 14:03:47

Bueno, tengo estos dos scripts de conversacion que funcionan quitando 5 objetos apilables y dejando el resto y otorgando un objeto.

Mi problema es que quiero hacer otro script que cobre 10 objetos, otro que cobre 25, etc etc. Vamos que quiero variar el coste y que de otro objeto distinto cuando cuesta mas.

"El texto aparece cuando" tiene este script:



[quote:2b35eea37e]int StartingConditional()
{
int iResult;

// Just change this variable for each script.
int iScript = 5;

object oPC = GetPCSpeaker();

object oItem = GetFirstItemInInventory(oPC);
int iStack = 0;
int x = 0;

// Set a variable on the PC so we know what to do if they abort the dialogue.
//SetLocalInt(oPC, "HX_PC_STARTED_FIRE", 1);

while(GetIsObjectValid(oItem))
{
if(GetTag(oItem) == "pum_mondesbl")
{
iStack = GetItemStackSize(oItem);
x = x + iStack;
}
oItem = GetNextItemInInventory(oPC);
}

if(x >= iScript)
{
return TRUE;
}
else
{
return FALSE;
}
}
[/quote:2b35eea37e]

Y la accion a ejecutar (despues de decir "Sí, acepto el intercambio"):


[quote:2b35eea37e]
void main()
{
// Just change this variable for each script.
int iScript = 5;

object oPC = GetPCSpeaker();

location lLoc = GetLocation(OBJECT_SELF);

object oItem = GetFirstItemInInventory(oPC);
int iStack = 1;

// Dale el objeto
CreateItemOnObject("desbloqueo20", oPC, 1);

// Coge las monedas
while(GetIsObjectValid(oItem))
{
if(GetTag(oItem) == "pum_mondesbl")
{
iStack = GetItemStackSize(oItem);
if(iScript >= iStack)
{
DestroyObject(oItem);
iScript = iScript - iStack;
if(iScript <= 0)
{
return;
}
}
else
{
SetItemStackSize(oItem, iStack - iScript);
return;
}
}
oItem = GetNextItemInInventory(oPC);
}
}[/quote:2b35eea37e]


¿Que deberia ir cambiando para ir ajustandolo a cada coste y objeto?

Se decirle al script que tipo de objeto tiene que coger, y cual dar, pero no hallo el lugar donde especificar el numero de objetos a cambio del otro.

Cerril

08/12/2011 14:27:58

la variable

[code:1:03f62821df]int iScript = 5[/code:1:03f62821df]

Es la que marca el número de objetos a quitar, vasta con modificar su valor, aunque dado que el primer script es una función con valor de retorno, se podría haber hecho directamente para que el usuario final seleccione el número de objetos a pillar...

Es complicado de explicar :P

Ertos

08/12/2011 19:13:11

Pues es raro por que estaba cambiando eso mismo y siempre me acababa cogiendo 5 en vez de lo que yo le dictaba. ¿Alomejor es que debo cambiarlo en ambos scripts?.

Ertos

18/12/2011 08:09:04

Si, tenia que cambiarlos en los dos scripts y ya está.

Bengue

18/12/2011 12:48:43

Cuenta una leyenda que cada vez que Ertos abre la boca muere un scripter.

Cerril

18/12/2011 13:11:15

Lo cierto es que ese script es un poco limitado, ya que obliga a crear tantos scripts como objetos apilables a qutar...

Por ejemplo hacer uno para quitar 5
Otro para quitar 10 y otro para 25.

Lo suyo es hacer uno y decirle cuantos tiene que quitar.

Ertos

20/12/2011 06:56:12

Ya esta hecho el mal Cerril xD