ayuda con un bucle por favor
He hecho un script para que las puertas permanezcan abiertas por el dia y cerradas por la noche, pero solo me lo hace una vez, es decir, de dia estan abiertas y cuando llega la noche se cierran, pero al volver a ser de dia no se abren. ¿Alguien podria decirme como hacer para que sea un bucle continuo?. El script que he hecho es este (le he colocado en la opcion de onheardbread o algo asi de la puerta) : void main() { if (GetIsDay()) { ActionOpenDoor(OBJECT_SELF); } else { ActionCloseDoor(OBJECT_SELF); ActionSpeakString(“Cerramos por las noches, disculpen las molestias”,TALKVOLUME_TALK); } } Muchas gracias. P.D.: referente a lo que pregunte de hacer visible una puerta por medio de un hechizo, se me ha ocurrido una idea, es la siguiente: crear un desencadenante que al situarte sobre el y lanzar un hechizo, cree una puerte en un punto deternimado, y pasado cierto tiempo esa puerta desaparezca (se destruya), lo que pasa es que no se muy bien como hacerlo. Gracias de nuevo por vuestra atencion.
Neverwinter Nights
ya lo he resuelto, simplemente hay que esperar un poco de tiempo a que el script actue de nuevo. Por cierto, he modificado el script para que solo se cierre con llave por la noche, mientras que por el dia se que abierta, el script es este:
void main()
{
if (GetIsDay())
{
SetLocked (OBJECT_SELF, FALSE);
}
else
{
SetLocked (OBJECT_SELF, TRUE);
ActionSpeakString(“Cerramos por las noches, disculpen las molestias”,TALKVOLUME_TALK);
}
}
lo poneis en onheratbread (o algo asi) y en las propiedades de la puerte marcais la opcion de que cuando se cierre se necesita una llave (esto es porque cualquiera que tenga abrir cerraduras un poco alto va lograr abrirla, mientras que asi le pide una llave)
inclusive para ahorrar el heartbeat puedes ponerese escript en el OnEnter del area asi cada vez que un pj entre al area se checara si la puerta debe estar abierta o cerrada
No sirve poner solo en el OnEnter. Que pasa si se hace de noche mientras el jugador esta en el area? Lo que si que puede hacerse, es un script que se llame a si mismo cada x segundos, compruebe si hay alguien en el area, y abra o cierre la puerta segun sea necesario.
cierto cierto cierto
un cheuqo de cada 6 segundos parece ser mas util entonces
Depende. Cada 6 segundos puede que no sea necesario. Quizas con cada 30 tienes suficiente.
La forma de hacerlo cada 30 es la siguiente:
En el script OnEnter creas una funcion que chequee las puertas. Seria algo asi (De memoria)
[code:1:33e41aab7f]
void ChequeaPuerta ()
{
int iAreallena = GetLocalInt(OBJECT_SELF,iAreallena);
if iAreallena == 0
{
SetLocalInt(OBJECT_SELF,iChequeaPuertas,0);
Return; //Si el area esta vacia rompemos el bucle.
}
SetLocalInt(OBJECT_SELF,iChequeaPuertas,1); //Marcamos que esta corriendo el bucle.
//Codigo para controlar las puertas aqui
//
//
//
//Fin del codigo de las puertas.
DelayCommand (30.0,ChequeaPuerta());
}
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC)) return;
int iAreallena = GetLocalInt(OBJECT_SELF,iAreallena);
int iChequeaPuertas = GetLocalInt(OBJECT_SELF,iChequePuertas);
SetLocalInt(OBJECT_SELF,iAreallena,(iAreallena + 1));
if iChequeaPuertas == 0 //Si no esta corriendo el chequeo.
{
AssignCommand (OBJECT_SELF, DelayCommand (30.0,ChequeaPuerta);
}
}
[/code:1:33e41aab7f]
y en OnExit ponemos algo del estilo…
[code:1:33e41aab7f]
void main()
{
object oPC = GetExitingObject();
if (!GetIsPC(oPC)) return;
int iAreallena = GetLocalInt(OBJECT_SELF,iAreallena);
SetLocalInt(OBJECT_SELF,iAreallena,(iAreallena - 1));
}
[/code:1:33e41aab7f]
Asi puedes controlar cualquier evento con el temporizador que quieras, en este caso cada 30 segundos, parando la comprobacion en cuanto el area esta vacia.
Basicamente, lo que se hace es controlar 2 variables. iAreaLlena es un contador de los jugadores que hay en el area, sumamos 1 cuando entra un jugador, y restamos cuando sale. iChequeaPuertas controla si la funcion de chequeo esta activa. Asi nos evitamos llamarla de nuevo cuando ya tenemos una instancia en funcionamiento.
La funcion de chequeo se llama a si misma con un retraso de 30 segundos, y cuando el area esta vacia, rompe el bucle, para ahorrarnos ciclos de reloj.
El mismo truco se puede usar para muchas mas cosas, por supuesto. De todas formas, si estas usando algun sistema de respawn persistente, quizas ya tengas el control de las areas llenas, el PWHelper lo hace, y parte del codigo seria redundante, pero la implementacion basica seria la misma.