Ertos

27/01/2012 00:03:21

Bueno, el problema que se me plantea con un script que tengo es el siguiente.

El script lo que hace principalmente es copiar el objeto del personaje y reproducir una copia exacta del objeto, pero con un bonificador de +1, luego de +2, y asi hasta +5. El problema es que al PNJ se le queda el inventario lleno y al final acaba dropeando los objetos por falta de espacio en el inventario y eso noooo me gusta xD

Asi que Kaworu me ha dicho que la solucion seria ponerle un script que destruya el objeto anterior (ante anterior diria yo, que si no la funcion de copiar y mejorar del script base no funcionará)

Entonces a ver si me podeis ayudar y ponerme el script...Si necesitais el conjunto de scripts o el script concreto decidmelo, y os lo pongo por aqui.

La otra solucion chapucera que habia pensado era poner un trigger que se meriende todos los objetos dropeados que caigan dentro de el, pero tampoco se como hacerlo. U.u

Cerril

27/01/2012 00:15:02

Puedes colgar el script que estás usando?

AlthorDeMalavir

27/01/2012 01:44:35

No entiendo el problema, las propias funciones de creación ,copiado y obtención de objetos te devuelven un objeto que puedes destruir o modificar o hacer lo que quieras con el a posteriori.

por ejemplo la función que copia un objeto

object CopyItem(object oItem, object oTargetInventory=OBJECT_INVALID, int bCopyVars=FALSE)

ella misma de devuelve el objeto creado, de forma que si se lo asignas a una variable luego puedes hacer lo que quieras con ese objeto.

Asignándole la copia a una variable:

object oObjeto;
oObjeto= CopyItem(oObjetoACopiar, oIntentarioDestino);

Después con el objeto almacenado en la variable oObjeto puedes hacer lo que quieras, como el destruirlo:

DestroyObject(oObjeto);

Ertos

27/01/2012 11:10:43

El problema esta en que soy tan patan que no se escribir una linea en un script por mucho que me digais u.u

Este guion, que va en la conversacion es el que chequea si el objeto es mejorable y va en el "el texto aparece cuando"

[quote:e5485b5f26]int StartingConditional()
{
object item =GetItemInSlot (INVENTORY_SLOT_BELT, GetLastSpeaker());
object new = CopyItem (item, OBJECT_SELF);

itemproperty prop, new_prop;
int n = 0;
int old_value = GetGoldPieceValue (item);

// search for ac bonus enchantment
prop = GetFirstItemProperty (new);
while (GetIsItemPropertyValid (prop)){
if (GetItemPropertyType (prop) == ITEM_PROPERTY_AC_BONUS){

// SendMessageToPC (GetFirstPC(), "*****");
// SendMessageToPC (GetFirstPC(), "Debug: ItemPropertyType = Bonus AC:" + IntToString (GetItemPropertyType (prop)));
// SendMessageToPC (GetFirstPC(), "Debug: GetItemPropertyCostTableValue = " + IntToString (GetItemPropertyCostTableValue (prop)));
// SendMessageToPC (GetFirstPC(), "*****");

n = GetItemPropertyCostTableValue (prop);
// remove the old property
RemoveItemProperty (new, prop);
break;
}
prop = GetNextItemProperty (new);
}

// add the new property
new_prop = ItemPropertyACBonus (n+1);
AddItemProperty (DURATION_TYPE_PERMANENT, new_prop, new);

// calculate & print cost
int cost = GetGoldPieceValue (new) - old_value;
SendMessageToPC (GetLastSpeaker(), "Incrementar el modificador de CA costara " + IntToString (cost) + " monedas.");

if (GetGold (GetLastSpeaker()) < cost) return FALSE;
else return TRUE;
}[/quote:e5485b5f26]

Y luego, una linea de la conversacion mas abajo, tiene esto en " acciones emprendidas"

[quote:e5485b5f26]void main()
{
object item =GetItemInSlot (INVENTORY_SLOT_BELT, GetLastSpeaker());
object new = CopyItem (item, OBJECT_SELF);

itemproperty prop, new_prop;
int n = 0;
int old_value = GetGoldPieceValue (item);

// search for ac bonus enchantment
prop = GetFirstItemProperty (new);
while (GetIsItemPropertyValid (prop)){
if (GetItemPropertyType (prop) == ITEM_PROPERTY_AC_BONUS){

// SendMessageToPC (GetFirstPC(), "*****");
// SendMessageToPC (GetFirstPC(), "Debug: ItemPropertyType = Bonus AC:" + IntToString (GetItemPropertyType (prop)));
// SendMessageToPC (GetFirstPC(), "Debug: GetItemPropertyCostTableValue = " + IntToString (GetItemPropertyCostTableValue (prop)));
// SendMessageToPC (GetFirstPC(), "*****");

n = GetItemPropertyCostTableValue (prop);
// remove the old property
RemoveItemProperty (new, prop);
break;
}
prop = GetNextItemProperty (new);
}

// add the new property
new_prop = ItemPropertyACBonus (n+1);
AddItemProperty (DURATION_TYPE_PERMANENT, new_prop, new);

// remove item cost
int cost = GetGoldPieceValue (new) - old_value;
TakeGoldFromCreature (cost, GetLastSpeaker());

// destroy old item, add new item
DestroyObject (item);
ActionGiveItem (new, GetLastSpeaker());
}

[/quote:e5485b5f26]

Cerril

27/01/2012 19:02:08

No entiendo muy bien lo que te ocurre segun veo en el codigo, en la sentencia:

[code:1:16a7657a1c] DestroyObject (item);
[/code:1:16a7657a1c]

Que está en la penultima linea se destruye el primer objeto del pj.

Segun veo coge un cinturon que tengas equipado y lo copia al inventario, luego le añade un bono de +1 de CA...

No tiene límite de +5 como decias por ejemplo.

Ertos

27/01/2012 22:37:15

Para identificar si el cinturon ya es +5 tengo este script en un paso previo de la conversacion :


[quote:51d2819f04]int StartingConditional()
{
object item = GetItemInSlot (INVENTORY_SLOT_BELT, GetLastSpeaker());
itemproperty prop;
int n;

prop = GetFirstItemProperty (item);
while (GetIsItemPropertyValid (prop)){
if (GetItemPropertyType (prop) == ITEM_PROPERTY_AC_BONUS){

// SendMessageToPC (GetFirstPC(), "*****");
// SendMessageToPC (GetFirstPC(), "Debug: ItemPropertyType = Bonus AC:" + IntToString (GetItemPropertyType (prop)));
// SendMessageToPC (GetFirstPC(), "Debug: GetItemPropertyCostTableValue = " + IntToString (GetItemPropertyCostTableValue (prop)));
// SendMessageToPC (GetFirstPC(), "*****");

n = GetItemPropertyCostTableValue (prop);
if (n >= 5) return TRUE;
else return FALSE;
}
prop = GetNextItemProperty (item);
}
return FALSE;
}[/quote:51d2819f04]

Y si, tengo el DestroyObject (item) ese, pero ...hm...debe de aplicarlo al jugador y no al pnj (que es el que acaba con el inventario petado) o algo asi y ahi supongo que reside el problema.

AlthorDeMalavir

28/01/2012 03:36:36

El problema está en el script del "el texto aparece cuando", que crea un objeto para ver que valdrá la modificación pero luego no lo elimina una vez termina.

El otro script es correcto, elimina tu cinturon y te da el nuevo.

al final del script situado en "el texto aparece cuando" habría que poner

DestroyObject (new);

Tal vez un delay no le iría mal para asegurarse de que no destruye el objeto antes de calcular el precio nuevo, el aurora tiende a ejecutar las funciones y no esperar a que terminen su ejecución, si ya no tienes el problema de que se le llena el inventario de objetos al pnj pero no te va bien el calculo de coste lo dices y te explico el delay.

Ertos

28/01/2012 08:36:50

int StartingConditional()
{
object item =GetItemInSlot (INVENTORY_SLOT_BELT, GetLastSpeaker());
object new = CopyItem (item, OBJECT_SELF);

itemproperty prop, new_prop;
int n = 0;
int old_value = GetGoldPieceValue (item);

// search for ac bonus enchantment
prop = GetFirstItemProperty (new);
while (GetIsItemPropertyValid (prop)){
if (GetItemPropertyType (prop) == ITEM_PROPERTY_AC_BONUS){

// SendMessageToPC (GetFirstPC(), "*****");
// SendMessageToPC (GetFirstPC(), "Debug: ItemPropertyType = Bonus AC:" + IntToString (GetItemPropertyType (prop)));
// SendMessageToPC (GetFirstPC(), "Debug: GetItemPropertyCostTableValue = " + IntToString (GetItemPropertyCostTableValue (prop)));
// SendMessageToPC (GetFirstPC(), "*****");

n = GetItemPropertyCostTableValue (prop);
// remove the old property
RemoveItemProperty (new, prop);
break;
}
prop = GetNextItemProperty (new);
}

// add the new property
new_prop = ItemPropertyACBonus (n+1);
AddItemProperty (DURATION_TYPE_PERMANENT, new_prop, new);

// calculate & print cost
int cost = GetGoldPieceValue (new) - old_value;
SendMessageToPC (GetLastSpeaker(), "Incrementar el modificador de CA costara " + IntToString (cost) + " monedas.");

if (GetGold (GetLastSpeaker()) < cost) return FALSE;
else return TRUE;
[u:b16faa31dd]DestroyObject (new)
}

Lo he puesto así, pero sigue acumulandole las cosas en el inventario al pnj y no me ha dado ningun error al compilarlo

AlthorDeMalavir

28/01/2012 12:34:11

Perdona si lo pones al final del todo no funciona al tener los return que hace que se salga del script en ese punto.

pon el final así

DestroyObject (new);
if (GetGold (GetLastSpeaker()) < cost) return FALSE;
else return TRUE;

Ertos

28/01/2012 13:59:33

Oks, mañana me pondre a aurorear otra vez y te dire

Ertos

29/01/2012 19:54:26

Lo he testeado, y salvo el primer intento(tiene un baston en el inventario), me ha ido bien , ya no acumula mierda en el inventario :D

Graciaaas!