Pulse Control+D para no olvidar este enlace.
 
Pagina principalÍndicePortalFAQBuscarRegistrarseConectarsePagina principal

Compartir | 
 

 Problema eliminar efecto

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
Jastro
Aprendiz
Aprendiz


Masculino
Edad: 25
Localización: Islas Canarias
¿Que me Gusta?: Todo y Nada
Puntos de Actividad: 1703

Cantidad de envíos: 40
Fecha de inscripción: 11/08/2008

Nº. de Miembro: 11
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Problema eliminar efecto   Mar 14 Abr 2009, 9:37 pm

Buenas noches gente, a ver tengo un pequeño problema. He creado un script, que si no tienes equipado un objeto (en este caso un yelmo llamado cascoagua) te haga 10 de daño magico....lo he puesto en el heartbeat de la zona y hasta ahi...de puta madre... el problema se presenta, cuando abandonan la zona, al abandonarla aun sigue haciendole daño, alguien puede decir que hacer o que script ponerle para que en el onexit del area "limpie" el efecto? añado los scripts.

En el Heartbeat:

Código:
void main()
{
effect eEffect;
object oPC = GetEnteringObject();
  if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) != "cascoagua")
{
eEffect = EffectDamage(10, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);

ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);

}
}


En el onexit he puesto este....pero no tira:

Código:
void main()
{
effect eEffect;
object oPC = GetExitingObject();

eEffect = EffectDamage(100, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);

RemoveEffect(oPC, eEffect);

}


Gracias y perdon por las molestias

Un saludo


Última edición por Jastro el Sáb 18 Abr 2009, 12:09 pm, editado 1 vez
Volver arriba Ir abajo
Xiulito
Administrador/a
Administrador/a


Masculino
Edad: 31
Localización: Vivo aqui
Puntos de Actividad: 2146

Cantidad de envíos: 101
Fecha de inscripción: 22/03/2008

Nº. de Miembro: 1
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Mar 14 Abr 2009, 10:56 pm

El script del Heartbeat esta mal declarado, te recomiendo que no pongas ningún script allí y utilices este otro sistema;

Crea este script, de nombre: damage_agua
Código:
void main()
{
object oPC = OBJECT_SELF;
effect eEffect = EffectDamage(10, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);

string sTagAreaPC = GetTag(GetArea(oPC));

string sArea1 = "AreaTagDamage1";
string sArea2 = "AreaTagDamage2";
//string sArea3 = "";
//string sArea4 = "";
//string sArea5 = "";

DelayCommand(10.0, ExecuteScript("damage_agua", oPC));

if (sTagAreaPC==sArea1 || sTagAreaPC==sArea2 /*|| sTagAreaPC==sArea3*/)
    {
    if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) != "cascoagua")
        {
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
        }
    }
}


Este script no va en ningún lado, es suficiente con tenerlo creado, lo único que tienes que cambiar es las etiquetas de las áreas en las que quieres que afecte el daño por no llevar casco y al iniciar el modulo el PJ se lo tienes que activar, por ejemplo en el OnEnter del modulo pones algo así:

Código:
void main()
{
object oPC = GetEnteringObject();

ExecuteScript("damage_agua", oPC);
}


Una vez activado el script no tendrá efecto sobre el PJ pero le seguirá a todos lados hasta que entre en una de las áreas marcadas y entonces comenzara a hacerle el daño, pruébalo como te funciona y me cuentas, saludos.

_________________
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


Fdo.: El Administrador del Foro.
Volver arriba Ir abajo
http://www.nwnforo.com
Jastro
Aprendiz
Aprendiz


Masculino
Edad: 25
Localización: Islas Canarias
¿Que me Gusta?: Todo y Nada
Puntos de Actividad: 1703

Cantidad de envíos: 40
Fecha de inscripción: 11/08/2008

Nº. de Miembro: 11
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Mar 14 Abr 2009, 11:16 pm

Funciona a la perfección, solo un detalle, creo que los npcs también se ven reflejados en este script, porque me ha parecido ver a uno herido de muerte. ¿He hecho algo mal?

Un saludo tio y muchas gracias ^^


EDITO: vale, ya lo he arreglado un poco para evitar el daño a npcs y DMS ahora lo pongo por aqui, para que pueda ponerse en baul de scripts y ser usado, muchas gracias Xiulito menudo crack Wink Añado el mio.


damage_agua
Código:
void main()
{
object oPC = OBJECT_SELF;
if (GetIsDM(oPC) || GetIsDMPossessed(oPC)){//miramos si es dm o ta poseyendo un npc
return;
}
effect eEffect = EffectDamage(10, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);

string sTagAreaPC = GetTag(GetArea(oPC));
string sTagNPC = GetTag(oPC);

string sArea1 = "AreaTagDamage1";//etiqueta del area en "AreaTagDamage1"
string sArea2 = "AreaTagDamage2";//lo mismo que arriba
string sNPC1 = "sirena";//etiqueta de NPC aqui
string sNPC2 = "sirenareina";//mismo arriba
//string sArea4 = "";
//string sArea5 = "";

DelayCommand(5.0, ExecuteScript("damage_agua", oPC));
if (sTagNPC == sNPC1 || sTagNPC == sNPC2)
{
return;
}
if (sTagAreaPC==sArea1 || sTagAreaPC==sArea2 /*|| sTagAreaPC==sArea3*/)
    {
    if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) != "cascoagua")
        {
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
        }
    }
}



Última edición por Jastro el Sáb 18 Abr 2009, 12:09 pm, editado 1 vez
Volver arriba Ir abajo
Xiulito
Administrador/a
Administrador/a


Masculino
Edad: 31
Localización: Vivo aqui
Puntos de Actividad: 2146

Cantidad de envíos: 101
Fecha de inscripción: 22/03/2008

Nº. de Miembro: 1
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 2:51 pm

Me parece que estas haciendo algo mal, lo he probado y me funciona correctamente, míralo de nuevo,

asegúrate de que colocas un "ExecuteScript("damage_agua", oPC);" que actúe sobre el jugador en la entrada del módulo y no en las entradas de las áreas donde quieres que haga daño, este "Execute" solo tiene que afectar una única vez y aunque en teoría es solo para los PJs te pongo el script retocado para que no afecte a PNCs y DMs que lo pusiste un poco entrelazado y te puede dar problemas.

Código:
void main()
{
object oPC = OBJECT_SELF;
effect eEffect = EffectDamage(10, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);//el numero 10 es el daño.

string sTagAreaPC = GetTag(GetArea(oPC));

string sArea1 = "AreaTagDamage1";//etiqueta de las areas
string sArea2 = "AreaTagDamage2";
//string sArea3 = "";
//string sArea4 = "";
//string sArea5 = "";

if (!GetIsPC(oPC) || GetIsDM(oPC)) return;//Corta el script si es NPC o DM.

DelayCommand(10.0, ExecuteScript("damage_agua", oPC));

if (sTagAreaPC==sArea1 || sTagAreaPC==sArea2 /*|| sTagAreaPC==sArea3*/)
    {
    if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) != "cascoagua")
        {
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
        }
    }
}

_________________
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


Fdo.: El Administrador del Foro.
Volver arriba Ir abajo
http://www.nwnforo.com
Jastro
Aprendiz
Aprendiz


Masculino
Edad: 25
Localización: Islas Canarias
¿Que me Gusta?: Todo y Nada
Puntos de Actividad: 1703

Cantidad de envíos: 40
Fecha de inscripción: 11/08/2008

Nº. de Miembro: 11
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 3:02 pm

nah xiulito ha sido mi culpa, deje un script que hacia lo mismo pero sin if y claro eso era lo que fallaba, asi como lo tengo arriba funciona genial, soy un gañan...gracias por tu paciencia muchacho

EDIT: gracias por mejorarlo Smile


Un saludo Smile


Última edición por Jastro el Sáb 18 Abr 2009, 12:09 pm, editado 1 vez
Volver arriba Ir abajo
Xiulito
Administrador/a
Administrador/a


Masculino
Edad: 31
Localización: Vivo aqui
Puntos de Actividad: 2146

Cantidad de envíos: 101
Fecha de inscripción: 22/03/2008

Nº. de Miembro: 1
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 3:10 pm

Ummm... me cambiaste el post mientras posteaba, bueno no importa, se me ocurrió algo realmente mejor para que te sea mas practico, borra el código este que te he puesto y utiliza este otro.

Código:
void main()
{
object oPC = OBJECT_SELF;
effect eEffect = EffectDamage(10, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);//el numero 10 es el daño.

int iVariableAreaPC = GetLocalInt(GetArea(oPC), "AGUA_DAMAGE");

if (!GetIsPC(oPC) || GetIsDM(oPC)) return;//Corta el script si es NPC o DM.

DelayCommand(10.0, ExecuteScript("damage_agua", oPC));

if (iVariableAreaPC)
    {
    if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) != "cascoagua")
        {
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
        }
    }
}


Es parecido pero mas practico, lo creas y te olvidas de el y de ir añadiéndole áreas y toda la historia, lo único que tendrás que hacer es irte a las áreas en las que quieras que haga daño y le das a editar/propiedades del área/avanzado/variables y una vez allí tienes que añadir la siguiente variable; AGUA_DAMAGE, tiene que ser una variable "int" y de valor el que quieras pero siempre tiene que ser mayor a cero, entonces este mismo proceso lo haces con todas las áreas en las que quieres que se produzca daño si el PJ no tiene equipado el casco y solucionado, mira haber que te parece este otro método y me dices, saludos.

_________________
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


Fdo.: El Administrador del Foro.
Volver arriba Ir abajo
http://www.nwnforo.com
Jastro
Aprendiz
Aprendiz


Masculino
Edad: 25
Localización: Islas Canarias
¿Que me Gusta?: Todo y Nada
Puntos de Actividad: 1703

Cantidad de envíos: 40
Fecha de inscripción: 11/08/2008

Nº. de Miembro: 11
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 3:24 pm

Muchisimo mejor y mas comodo, funciona perfectamente. Gracias una vez mas te debo un par de ellas ya ;D


Última edición por Jastro el Sáb 18 Abr 2009, 12:09 pm, editado 1 vez
Volver arriba Ir abajo
Marina
Patos@
Patos@


Edad: 28
Puntos de Actividad: 1260

Cantidad de envíos: 24
Fecha de inscripción: 01/04/2009

Nº. de Miembro: 65
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 4:22 pm

El script esta genial, pero si queremos que sea un bucle continuo?

Me explico, que cada X segundos se repita el script y vuelva a hacer daño si no tienes el objeto equipado hasta que salgas del area

seria obligatoriamente necesario usarlo en el onheart del area o existe alguna orden para formar un bucle infinito?
Volver arriba Ir abajo
Xiulito
Administrador/a
Administrador/a


Masculino
Edad: 31
Localización: Vivo aqui
Puntos de Actividad: 2146

Cantidad de envíos: 101
Fecha de inscripción: 22/03/2008

Nº. de Miembro: 1
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 5:37 pm

Sip... Smile

En realidad el script que he puesto es un bucle, hace algún tiempo empecé a utilizar este sistema de bucle para sustituir el Heartbeat que consume demasiados recursos, lo que pasa que tenemos que tener cuidado a la hora de utilizar este sistema, ya que podemos entrar en un conflicto el cual no he probado todavía y no se exactamente que sucedería...

Te explico, el bucle consiste en crear un script el cual ejecutaremos dentro del propio script gracias al "ExecuteScript(sStringScript, oObject);"... Entonces cada vez que se ejecute el script se ejecutara el ExecuteScript y por lo tanto el propio script de nuevo y así sucesivamente hasta el infinito, he aquí el bucle, hacerlo así nunca lo he hecho ya que no se exactamente que es lo que sucedería, el truco esta en ponerle un "DelayCommand();" al "ExecuteScrpit();" y de esta manera conseguimos un bucle continuo sobre lo que queramos, áreas, modulo, PJs, PNCs, si el script que pretendemos utilizar de esta manera es poca cosa pues prácticamente no consume recursos tengamos la cantidad que sea de jugadores a diferencia del heartbeat que indiferentemente del número de jugadores actuara afectando a todo el módulo.

El único problema que puede suponer es que tenemos que tener un "lanzador", es decir, algo para iniciar el bucle (yo normalmente suelo soltarlo sobre el PJ en el OnClientEnter), esto tampoco supone mucho problema si tenemos un poco de habilidad ya que podremos cortar los scripts con otros o mediante variables y poder ejecutarlos de nuevo en cuanto queramos y sea necesario para el desarrollo de nuestro módulo.

_________________
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


Fdo.: El Administrador del Foro.
Volver arriba Ir abajo
http://www.nwnforo.com
Marina
Patos@
Patos@


Edad: 28
Puntos de Actividad: 1260

Cantidad de envíos: 24
Fecha de inscripción: 01/04/2009

Nº. de Miembro: 65
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 5:48 pm

La verdad es que el sistema que yo uso funciona mediante el onheart del area y del modulo, por lo que, efectivamente consume recursos.

El fallo que tiene mi sistema es que no puedo anularlo mediante equipar un objeto, pues imagino que se deberia añadir la linea:

if (GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC)) != "escafandra")

he probado a ponerla, pero me da error cuando equipo el yelmo (Demasiadas instrucciones)

Aqui os dejo mi script por si me podeis echar un cable (va en el onheart del area)

Citación:
void SSP_LatidoSistema(object oPC)
{

//if(GetIsDM(oPC)) return;

object oArea = GetArea(oPC);



{

{
if(GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND &&
(GetIsAreaNatural(oArea) == AREA_NATURAL ||
GetIsAreaNatural(oArea) == AREA_ARTIFICIAL) &&
!GetIsAreaInterior(oArea))
{

effect eDamage = EffectDamage( 1, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_ENERGY );
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);

}
}

}
}

void main()
{
//Saltar si ya hay una rutina de latido en progreso
if ((GetLocalInt(GetModule(), "LATIDO_EN_PROGRESO") != 1))
{
SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", 1);//Bloqueo de la rutina
object oPC =GetFirstObjectInArea(OBJECT_SELF);

while (GetIsObjectValid(oPC))
{
effect eDamage = EffectDamage( 1, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_ENERGY );
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
oPC = GetNextObjectInArea(OBJECT_SELF);

}
SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", 0);//Activado del latido
}
}
Volver arriba Ir abajo
Xiulito
Administrador/a
Administrador/a


Masculino
Edad: 31
Localización: Vivo aqui
Puntos de Actividad: 2146

Cantidad de envíos: 101
Fecha de inscripción: 22/03/2008

Nº. de Miembro: 1
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 6:42 pm

Te dejo el script a partir del "vaid main()"

Código:
void main()
{
//Saltar si ya hay una rutina de latido en progreso
if (GetLocalInt(GetModule(), "LATIDO_EN_PROGRESO") != TRUE)
    {
    SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", TRUE);//Bloqueo de la rutina

    object oPC =GetFirstObjectInArea(OBJECT_SELF);
    while (GetIsObjectValid(oPC))
        {
        string sCasco = GetTag(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));

        if (sCasco=="escafandra")break;

        effect eDamage = EffectDamage( 1, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_ENERGY );
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);

        oPC = GetNextObjectInArea(OBJECT_SELF);
        }
    SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", FALSE);//Activado del latido
    }
}


Así debería de funcionar, compruébalo y me dices, saludos.

_________________
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


Fdo.: El Administrador del Foro.
Volver arriba Ir abajo
http://www.nwnforo.com
Marina
Patos@
Patos@


Edad: 28
Puntos de Actividad: 1260

Cantidad de envíos: 24
Fecha de inscripción: 01/04/2009

Nº. de Miembro: 65
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Miér 15 Abr 2009, 7:41 pm

EDITO en el post, para no poner otro;

Funciona a la perfección, muchas gracias por tu ayuda Xiulito.
Volver arriba Ir abajo
Jastro
Aprendiz
Aprendiz


Masculino
Edad: 25
Localización: Islas Canarias
¿Que me Gusta?: Todo y Nada
Puntos de Actividad: 1703

Cantidad de envíos: 40
Fecha de inscripción: 11/08/2008

Nº. de Miembro: 11
Respeto por el Foro:
100 / 100100 / 100


MensajeTema: Re: Problema eliminar efecto   Jue 16 Abr 2009, 1:16 pm

el sistema que usa xiulito, el de meter un bucle integrado al script no es para nada mal idea y bastante original, el problema es uno, no se como se presentara usar este script usando nwnx el dia que lo termine lo miro, pero tengo entendido que los scripts de este tipo generan lag con ese sistema, igualmente ya lo comprobare y os diré un saludo ^^

PD: Voy a coger ambos scripts y los metere en el baul, por si algun usuario esta buscando esta gran idea que se nos ocurrio.

Un saludo
Volver arriba Ir abajo
 

Problema eliminar efecto

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Problema al iniciar con mi Pj
» PROBLEMA LAUNCHER 9DRAGONS
» Problema para crear partida en L4D 1
» Problema con VIRIATOS y con VIRIATOS II
» Problema.: Sony Vegas Pro 8.0

Permiso de este foro:No puedes responder a temas en este foro.
Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN :: NWToolSet (Aurora) :: Scripting NWN :: Dudas y Preguntas (Scripting)-