Ertos27/01/2012 00:03:21Bueno, 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 Cerril27/01/2012 00:15:02Puedes colgar el script que estás usando?AlthorDeMalavir27/01/2012 01:44:35No 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); Ertos27/01/2012 11:10:43El problema esta en que soy tan patan que no se escribir una linea en un script por mucho que me digais u.uEste 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] Cerril27/01/2012 19:02:08No 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. Ertos27/01/2012 22:37:15Para 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. AlthorDeMalavir28/01/2012 03:36:36El 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. Ertos28/01/2012 08:36:50int 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 AlthorDeMalavir28/01/2012 12:34:11Perdona 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; Ertos28/01/2012 13:59:33Oks, mañana me pondre a aurorear otra vez y te direErtos29/01/2012 19:54:26Lo he testeado, y salvo el primer intento(tiene un baston en el inventario), me ha ido bien , ya no acumula mierda en el inventario :DGraciaaas! |