Neverwinter Nights
Menú
Gamersmafia es ahora un archivo de solo lectura.

ya, ya se que soy un pesaoooo, sorry.....

Si, si en esta feroz lucha llena de bajas por ambas partes el nwnscript me gana por goleada, aunque ya me voy empapando un poco mas de como rula esto. Pero como no me surgen mas problemas. Os cuento. Se me ocurrio, bueno la idea la base en un script que vi por ahi de un tal… vaya no lo encuentro……, bueno la idea no es mia, que no me voy a colocar falsas medallas, pues eso consiste en un script que te impide descansar a no ser que tengas provisiones en tu inventario. Hasta ahi sin problemas…. ahora, lo ideal seria que cada vez que descansaras, hiciera un recuento de las provisiones que te quedan y con un SendMessage de esos te informara de las provisiones que te quedan, y aqui surgen los problemas, el autor del script lo intento con objetos stakables (es decir que los puedes amontonar uno encima de otro) pero el mismo reconoce que incomprensiblemente hace el recuento mal de las provisiones que quedan, asi que io lo intente con objetos Miscelanea pequeño, estos ulltimos no son stakables, pero tampoco consigo hacer un recuento de provisiones del inventario, personalmente creo que el problema es que uso el commando GetitemposessedBy, y por lo que he observado en caso de que haya varias provisiones en el inventario, coge la que ha entrado la ultima, ya que al hacer un destroy(getItem…….) en el juego desaparece siempre la ultima en entrar y luego la anterior y asi cuando inicializo el contador de las provisiones siempre me da como resultado 1, y creo que es porque al hacer la comparacion solo es capaz de identificar como igual la ultima. Es decir la que esta dentro de la objeto getitempossessedby. De todas formas creo que me he enrollao como una persiana, aparte me explico muy mal asi que lo mejor que puedo hacer es poner el script, a ver si alguien me puede ayudar, o se le ocurre otra manera de hacerlo. void main() { if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) { object racion = GetItemPossessedBy(GetLastPCRested(),”provisiones”); if (GetIsObjectValid(racion) == FALSE) { SendMessageToPC(GetLastPCRested(),”Tu no puedes descansar sin provisiones”); AssignCommand(GetLastPCRested(),ClearAllActions()); } else { int cuantas = 0; DestroyObject(racion); object iNum2 = (GetFirstItemInInventory(GetLastPCRested())); object racion = GetItemPossessedBy(GetLastPCRested(),”provisiones”); while (GetIsObjectValid(iNum2) == TRUE) { //Esto se supone que es el contador de provisiones que no cuenta if (iNum2 == racion) cuantas++; iNum2 = (GetNextItemInInventory(GetLastPCRested())); //sin embargo si que realiza un recuento de todos los objetos del //inventario si le quitas el if y dejas el contador. } if (cuantas != 0) SendMessageToPC(GetLastPCRested(),”Te quedan “+IntToString(cuantas)+” raciones”); else SendMessageToPC(GetLastPCRested(),”Consumiste tu ultima racion, debes conseguir mas provisiones.”);} } } Salud.

…

El autentico autor del script en el que base uso provisiones stackables y usaba el GetNumStacked y le daba problemas….

  1. El comando DestroyObject no destruye 1 solo elemento del grupo si no todos, es decir si tengo la provision en 10 unidades agrupadas cuando haces DestroyObject no destruye solo 1 y te deja el grupo en 9, si no que destruye todo el grupo entero tengas 10 o 1.2. Entonces intento solventar este problema obteniendo el numero de stackables guardandolo en una variable, luego el programa borra to el grupo y el crea otro con el numero de stackables de la variable -1.

mira mejor lo dejo aki y lo miras.

void main()
{

if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
    object oProv = GetItemPossessedBy(GetLastPCRested(),"GZ_IT_PROVISIONS");
    if (oProv == OBJECT_INVALID)
    {
        SendMessageToPC(GetLastPCRested(),"You cannot rest without provisions!");
        AssignCommand(GetLastPCRested(),ClearAllActions());
    }
        else
    {
        int iNum = GetNumStackedItems(GetItemPossessedBy(GetLastPCRested(),"GZ_IT_PROVISIONS"));
        DestroyObject(GetItemPossessedBy(GetLastPCRested(),"GZ_IT_PROVISIONS"));
        //the number printed here is correct
        SendMessageToPC(GetLastPCRested(),"Found "+IntToString(iNum)+" provs");
        // most interesting: create object creates less items in stack than promised
        if (iNum >=1)
            CreateItemOnObject("gz_it_provisions",GetLastPCRested(),iNum-1);//yes im using the blueprintresref
    }
} }

Bien creo que he dado con una solucion que trae otro problema, me explico :

Use el siguiente script :[code:1:3243f611c1]
void main()
{
int cAntd = GetNumStackedItems(GetItemPossessedBy(GetLastPCRested(),"provisiones"));
object oProv = GetItemPossessedBy(GetLastPCRested(),"provisiones");
int cAntda = cAntd - 1;
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
if (oProv == OBJECT_INVALID)
{
SendMessageToPC(GetLastPCRested(),"No puedes descansar sin provisiones.");
AssignCommand(GetLastPCRested(),ClearAllActions());
}
else
{
DestroyObject(GetItemPossessedBy(GetLastPCRested(),"provisiones"));
SendMessageToPC(GetLastPCRested(),"Te quedan "+IntToString(cAntd)+" provisiones");
if (cAntd >=1)
CreateItemOnObject("provisionez",GetLastPCRested(),cAntda);
}
}
}[/code:1:3243f611c1]

con esto consegui lo que quieres, el pj recibe las provisiones restantes, pero me surgio un problema que la primera vez que descansa le quita 1 provision, la segunda le quita 2 provisiones, la tercera le quita 4 provisiones y asi sucesivamente, ante lo cual decidi añadir dos lineas al script :
[code:1:3243f611c1]
void main()
{
int cAntd = GetNumStackedItems(GetItemPossessedBy(GetLastPCRested(),"provisiones"));
object oProv = GetItemPossessedBy(GetLastPCRested(),"provisiones");
int cAntda = cAntd - 1;
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
if (oProv == OBJECT_INVALID)
{
SendMessageToPC(GetLastPCRested(),"No puedes descansar sin provisiones.");
AssignCommand(GetLastPCRested(),ClearAllActions());
}
else
{
DestroyObject(GetItemPossessedBy(GetLastPCRested(),"provisiones"));
SendMessageToPC(GetLastPCRested(),"Te quedan "+IntToString(cAntd)+" provisiones");
if (cAntd >=1)
CreateItemOnObject("provisionez",GetLastPCRested(),cAntda);
int cAntd = GetNumStackedItems(GetItemPossessedBy(GetLastPCRested(),"provisiones"));
int cAntda = cAntd - 1;
}
}
}[/code:1:3243f611c1]

Como veras las dos lineas que añadi son definiendo de nuevo las variables (No se si es correcta la manera), pero sigue pasando lo mismo.

Probar el script que asi funciona y ver si podeis resolver el fallito ese del multiplicador por 2 a mi no se me ocurre nada.

Las Dawuid gracias por la visita ¿ Ya consigues ver la web ?.

Pues haber gran maestro de la arcana orden del scriptin :P:P jejeje he probado tu script, rula tb a las 1000 maravillas, pero el problema que da es el mismo que con el mio, resta primero 1 provision, luego 2, luego 4, etc…. es decir va quitando de forma progresiva el doble y es algo extraño, no se por que pasa, puesto que las variables que indican la cantidad a quitar, en ambos scripts creo vamos yo no veo ningun fallo, yo las veo bien

Buffff hoy no creo tal vez mañana ke toy mu liado con los modulos ke toy asiendo jejeje algo nuevo ke me vas a enseñar, juas juas juas pa variar

puto script decididamente estamos ante un bug, eso de debuggear escapa a mis conocimientos (de momento) asi que nada me jodo es una pena
ya que no me hace gracia que la peña descanse cada 2*3 pero bueno, el autor del script tb se encontro con este bug, a lo mejor lo que hare es asignar la accion de rest a algunos placeables tipo camas y catres u algo asi ya que si no consigo hacer bien el recuento de las provisiones es una putada porque te puedes quedar sin comida si previo aviso y tp es plan de toparte con un campamento orco y no poder descansar porque no te has dao cuenta de las provisiones que quedaban.

De todas formas agradeceros que os tomeis las molestias que os tomais con migo, gracias.

Salud.

Maese Dawuid podrias explicarme lo de :

… Habrá que poner unos cuantos mensajes en el log …

como ta el tema ese del log ??? eso es nuevo para mi estado mental de enfermedad conocidada como “ Programing-scripticus graviticus “, no se que es eso, ¿ Que durante la partida guarda algun tipo de archivo .log estilo los de irc de los privates o algo similar ??.

Grasias por su presencia y aportacion por adelantado y pa varia

Buenas, este script me gusto mucho, pero vi que todavía no estaba del todo completo y quise poner mi granito de arena . Que conste que he utilizado como base, las magnificas ideas de los tres.

Las provisiones deben se un [i:a9eba43872]item[/i:a9eba43872] que se pueda apilar (stack) y que debe terner “provisiones” como [i:a9eba43872]Item name[/i:a9eba43872], [i:a9eba43872]Tag[/i:a9eba43872] y [i:a9eba43872]Blueprint ResRef[/i:a9eba43872]

El script lo ponemos en el evento OnPlayerRest, dentro de las propiedades del modulo.

[code:1:a9eba43872]
#include "nw_i0_plot"

void main()
{
object oProv = GetItemPossessedBy(GetLastPCRested(),"provisiones");
int iCantidadTotal = GetNumItems(GetLastPCRested(),"provisiones");
int iCantidad = GetNumStackedItems(oProv);
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) {
if (oProv == OBJECT_INVALID) {
SendMessageToPC(GetLastPCRested(),"No puedes descansar sin provisiones.");
AssignCommand(GetLastPCRested(),ClearAllActions());
}
else {
DestroyObject(oProv);
iCantidadTotal–;
iCantidad–;
switch (iCantidadTotal) {
case 0:
SendMessageToPC(GetLastPCRested(),"Ya no te quedan provisiones, no podras descandar");
break;
case 1:
SendMessageToPC(GetLastPCRested(),"Cuidado, sólo te queda una provision");
CreateItemOnObject("provisiones",GetLastPCRested(),1);
break;
default:
SendMessageToPC(GetLastPCRested(),"Te quedan "+IntToString(iCantidadTotal)+" provisiones");
CreateItemOnObject("provisiones",GetLastPCRested(),iCantidad);
break;
}
}
}
}
[/code:1:a9eba43872]

He hecho varias pruebas y funciona, pero probarlo en situaciones raras.

Los más activos en Scripting