Ninfablanca

23/11/2005 14:32:08

Oye al ¿Sabes que escript se utiliza para memorizar el lugar donde ha muerto un pj y que cuando salga del servidor no aparezca vivo? Había pensado en un objeto de muerte o algo así, pero realmente no tengo ni idea.

Ninfablanca

23/11/2005 14:45:48

Agrego:

He hestado mirando y se que se podría hacer por ejemplo que en el onenter del area chequeara si tienes el objeto muerte y en caso de tenerlo que aplique muerte sobre el pj, pero nuse como hacerlo.

Ninfablanca

24/11/2005 15:54:16

jooo no me cnt ni peter.

24/11/2005 19:14:22

jeje es que de nuevo pides un sistema, que usa varios scripts colocados en diferentes lugares, no es cuestion de un solo script, por eso no responden, es un poco complicado para explicarlo en el foro.

Ninfablanca

24/11/2005 19:48:52

ju........me estoy rayando con todo lo que me pusiste tu de neverun, hay cosas que me sirven de mucho pero otras no las pillo ni por asomo.

Sothus

24/11/2005 22:36:25

Pues yo tengo una solución muy sencilla...

Primero: Instala NWNX2
Segundo: Monta una base de datos MySQL (o lo que te de la gana, pero MySQL es potente y gratuita)
Tercero: Cuando un PJ la palma, lo apuntas en la base de datos
Cuarto: Cuando un PJ se loga de nuevo miras la base de datos y si está muerto, pues le quitas todos los puntos de vida y seguirá muerto.

¿Verdad que es fácil? :wink:

Ah, también puedes guardar el lugar donde estaba y volverlo a meter ahí, puedes mirar que conjuros tenia lanzados y volverselos a marcar como lanzados (aunque he de reconocer que esto yo no se hacerlo), si aún no estaba muerto puedes hacer que vuelva a entrar con los mismo puntos de vida que tenia antes de salir, puedes... :wink:

Gerjo

24/11/2005 22:39:20

Y si no hay un dm en ese momento el tio sigue vivo, paseandose por el server no? :lol: :lol: :lol:

Un saludo

Sothus

24/11/2005 22:42:38

Eh, perdón, Gerjo, es que estaba editando mi post y no se si va por mi mensaje...

Si es así, basta con que el script que se ejecuta al logarte sea quien mire si estabas muerto o no y sea el mismo script quien te mate...

Y si no va por mi... simplemente ignora este mensaje... :wink:

25/11/2005 14:08:35

Jur con la base de datos en MySQL ya la tienes que haber dejado a la pobre al borde del suicidio xDD

Ninfablanca

30/11/2005 20:56:39

Oo....

Ninfablanca

30/11/2005 20:57:28

me bajé un mod de muestra en ingles, que cuando mueres pone que el pj se ha guardado.... eso no sería más facil?

01/12/2005 15:56:15

emm, depende de lo que haga ese mod, xD, asi por lo que dices ni idea de que hace cuando mueres xD

mviper

01/12/2005 18:45:28

Io utilizo un sitema facilito.. cuando el pj palma le incrusto un objeto... cuando entra en el server.. si lo lleva.. lo envio al infierno.. cuando sale del infierno, se le quita el objeto.... si sale :P

Otra opcion es que cuando muere, le incrustas un objeto y sobre el objeto gravas una variable con el nombre de la pantalla, cuando entre le envias a la pantalla con el nombre que tiene gravado en la variable del objeto.

Tambien puedes gravar la variable sobre el propio pj... pero a mi me gusta mas que vea el objeto... da como mas rabia... jijijiji

Pos eso.... quin me hiba decir a mi hace 15 dias.. que daria consejos de estos.... *se va cantando* "la vida te da sorpresas.. sorpresas te da la vida hay dios tiri tiri"


"Si los curas comieran chinas del rioooo... no estarian tan gordos los tios jodiosssss... tiri tiri"



Editado.- Se me olvidaba una tercera opcion... cuando muera crear un ubicado invisible alli dodne ha muerto (o mejor aun, crea un punto de ruta), con el nombre del pj, y cuando le resuciten que desaparezca... si sale del server y cuando entra aun esta el objeto... lo teleportas hay y lo matas mucho :P

Ninfablanca

01/12/2005 20:20:11

jur y no sabrías decirme que scrips pone en cada cosa xfii? porque ando un poco verde y a veces hago mis pinitos pero me pierdo cuando se tratan de tantas cosas

Ninfablanca

01/12/2005 20:23:17

Vale, yo le doy un objeto a un pj cuando muere llamado muerte, pero hay me quedo jajajjaa.

mviper

01/12/2005 20:54:41

Io uso un script que le mete el objeto en el inventario nada mas caer inconsciente (cuando esta entre 0 y -10 de vida) asi si el pjs e sale antes de llegar a -10, al entrar se le considera pj muerto, para eso pongo el escript entre las lineas del script que va en OnPlayerDying.

object oTarget=GetLastPlayerDying();

object oItem=GetFirstItemInInventory();//miramos los objetos del pj para asegurarnos de que no tiene ya uno
int iPiry=0;
while(oItem!=OBJECT_INVALID)
{
if(GetTag(oItem)=="calavera001")
{
iPiry++;
}
oItem=GetNextItemInInventory(oTarget);//aqui terminamos de mirarle el inventario
}

if(iPiry<=0)//si no tenia ya el objeto de muerte, le creamos uno.
{
CreateItemOnObject("calavera001",GetLastPlayerDying());
}

Despues cuando entra el pj entra donde estaba.... y con los pv que habia perdido, salvo que haya habido reset, en cuyo caso entra en una zona de entrada (en el neverun por ejemplo es el sitio ese de los rayitos), justo hay pongo un area que dice lo siguiente:


object oPC=GetEnteringObject();
object oTarget=oPC;
object oItem=GetFirstItemInInventory(oTarget);
location lTarget;

int iMuerte=0;

while(oItem!=OBJECT_INVALID)//comprobamos que tenga el objeto en cuestion...
{
if(GetTag(oItem)=="calavera001")
{
iMuerte++;
}
oItem=GetNextItemInInventory(oTarget);//terminamos de comprobarlo
}

oTarget = GetWaypointByTag("infierno001");//marcamos el punto de destino
lTarget = GetLocation(oTarget);

if(iMuerte>=1)//lo enviamos alli, aqui es donde si lo quieres tener muerto, deberias poner el efecto de muerto :P
{
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, ActionJumpToLocation(lTarget));
}

Sobre lo de gravar una variable para enviarlo dodne estaba muerto.. no me hagas mucho caso pero al ponerle el objeto creo que habria que poner esto:

if(iPiry<=0)
{
CreateItemOnObject("calavera001",GetLastPlayerDying());
CreateObject(OBJECT_TYPE_WAYPOINT,"infierno001",OBJECT_SELF,FALSE,GetTag(oPC));//si no me equivoco, creas un punto de ruta que previemente guardaste en la paleta con el nobre "infierno001" en la localizacion donde esta el pj, y renombras el punto de ruta con el tag del pj (si no es asi ya me corregiran los que por aqui pululan que saben mucho mas que io).
}

Ahora logicamente debes cambiar el punto de destino del area de entrada (el segundo script), deberias cambiar la linea de oTarget, quedando asi (creo):

oTarget=GetWaypointByTag(GetTag(oPC));


Pero a todo esto si has reiniciado el server seguramente salvo que tengas un mundo persistente, el punto de ruta debio desaparecer en el reset, por eso me remito a que uses la primera opcion, ya sea creando un objeto en el inventario o gravando una variable en el propio pj.

Ale, toma parrafada... y scripts que seguro estan llenitos de fallos.. bueno asi me corregis y de paso aprendo algo :P

Ninfablanca

01/12/2005 21:08:12

muchas gracias voy a probarlo ahora mismo ya te cuento con lo que sea ^^

Ninfablanca

01/12/2005 23:59:22

A ver un momento, la primera parte va en el onplayerdying, y el segundo va en un area? no se si te entiendo bien jaja.

Ninfablanca

02/12/2005 01:02:55

Si todo lo que has puesto es en el onplayerdying me dice que ya he usado la variable de objetc oTarget=oPC, que ha decir verdad se repite justo un poco más arriba

mviper

02/12/2005 10:48:39

Bien.. no queria poner el script entero porque me parecia muy grande... peroa hay lo tienes, este va en OnPlayerDying, su funcionamiento es que cuando cae inconsciente le planta el objeto, si se recupera por su cuenta, el objeto desaparece, si le curan el objeto se queda, y debe ir a que le cure un clerigo (lo tengo asi aposta para representar que su alma aun no se ha recuperado de la cercania de la muerte, y de paso refuerzo un poco la profesiond e clerigo :P)

void bleed(int iBleedAmt)
{
effect eBleedEff;
effect eDeath = EffectDeath(FALSE, FALSE);
object oAtacante = GetLastHostileActor(OBJECT_SELF);

AssignCommand(oAtacante, ClearAllActions(TRUE));

/* keep executing recursively until character is dead or at +1 hit points */
if (GetCurrentHitPoints() <= 0)
{

object oTarget=GetLastPlayerDying();
object oItem=GetFirstItemInInventory();
int iPiry=0;
while(oItem!=OBJECT_INVALID)
{
if(GetTag(oItem)=="calavera001")
{
iPiry++;
}
oItem=GetNextItemInInventory(oTarget);
}
if(iPiry<=0)
{
CreateItemOnObject("calavera001",GetLastPlayerDying());
}

/* a positive bleeding amount means damage, otherwise heal the character */
if (iBleedAmt > 0)
{
eBleedEff = EffectDamage(iBleedAmt);
}
else
{
eBleedEff = EffectHeal(-iBleedAmt); /* note the negative sign */
oItem=GetFirstItemInInventory();
while(oItem!=OBJECT_INVALID)
{
if(GetTag(oItem)=="calavera001")
{
DestroyObject(oItem);
}
oItem=GetNextItemInInventory(oTarget);
}
}

ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF);

/* -10 hit points is the death threshold, at or beyond it the character dies */
if (GetCurrentHitPoints() <= -10)
{

//PlayVoiceChat(VOICE_CHAT_DEATH); /* scream one last time */
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), OBJECT_SELF); /* make death dramatic */
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, GetLastPlayerDying()); /* now kill them */
return;
}

if (iBleedAmt > 0)
{ /* only check if character has not stablized */
if (d10(1) == 1)
{ /* 10% chance to stablize */
iBleedAmt = -iBleedAmt; /* reverse the bleeding process */
PlayVoiceChat(VOICE_CHAT_LAUGH); /* laugh at death -- this time */
}
else
{
switch (d6())
{
case 1: PlayVoiceChat(VOICE_CHAT_PAIN1); break;
case 2: PlayVoiceChat(VOICE_CHAT_PAIN2); break;
case 3: PlayVoiceChat(VOICE_CHAT_PAIN3); break;
case 4: PlayVoiceChat(VOICE_CHAT_HEALME); break;
case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
case 6: PlayVoiceChat(VOICE_CHAT_HELP);
}
}
}
DelayCommand(6.0,bleed(iBleedAmt)); /* do this again next round */
}


}


void main()
{
object oDying = GetLastPlayerDying();
int iPetrificado = 0;
effect eDamage = EffectDamage( 10, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_ENERGY );

//Comprobando si el PJ esta petrificado
effect eEfecto = GetFirstEffect(oDying);
while(GetIsEffectValid(eEfecto))
{
if(GetEffectType(eEfecto) == EFFECT_TYPE_PETRIFY) iPetrificado = 1;
eEfecto = GetNextEffect(oDying);
}
AssignCommand(oDying, ClearAllActions(TRUE));
if (!iPetrificado && !GetLocalInt(oDying,"arena")) AssignCommand(oDying, bleed(1));
else ApplyEffectToObject( DURATION_TYPE_INSTANT, eDamage, oDying );
}



Vale, ahora el script que tengo puesto en un desencadenante de area que rodea la zona de entrada al server...

void main()
{
object oPC=GetEnteringObject();
object oTarget=oPC;
object oItem=GetFirstItemInInventory(oTarget);
location lTarget;

int iMuerte=0;

while(oItem!=OBJECT_INVALID)
{
if(GetTag(oItem)=="calavera001"||GetTag(oItem)=="calavera002")
{
iMuerte++;
}
oItem=GetNextItemInInventory(oTarget);
}

oTarget = GetWaypointByTag("infierno001");
lTarget = GetLocation(oTarget);

if(iMuerte>=1)
{
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, ActionJumpToLocation(lTarget));
}

}

Pos eso...

Si te sale el mensage ese de que se repiten cosas en el script, solo comprueba que hace cada una de las cosas que se repiten, y si como en este caso son identicas.... solo borra la segunda y deja la primera tal como estaba, si son diferentes, dejas la primera como estaba y la segunda la cambias de (en este caso):

object oTarget=GetLastPlayerDying();//la que viene en el script
oTarget=......//Aqui pondrias el nuevo oTarget, para el script que incrustas
oTarget=GetLastPlayerDying();//De nuevo oTarget es lo mismo que al principio del script para que el resto del scrip siga funcionando, lo pondrias despues de el script que incrustaste.

Bueno, esto ultimo de los oTarget es por si te pasa alguna otra vez con alguno otro "object", asi sabes como cambiarles la definicion.

Pos eso..... suerte ^^

PD. Por cierto..... odio windows... he tenido el server caido casi 10h, por un error de windows.... algun ia aprendere linuxs.... (que va a ser que no).

Ninfablanca

02/12/2005 14:50:44

jejej muchas gracias de nuevo ^^, voy a probarlo a ver, por cierto calavera002 que es? y otra cosilla, la variable muerte donde se crea?

mviper

02/12/2005 16:20:00

En esos escripts no hay variable de muerte porque uso el objeto en si (es uno de esos de los que no puedes oltar ni vender etc etc), porque juego conq ue si el pj se recupera por si mismo (esoq ue empieza a recuperar vida por si mismo cuando esta entre 0 y -10), el objeto desaparece, pero si le curan o resucitan, el objeto se mantiene dentro de su inventario.

De esta forma el pj ve que lleva el objeto dentro de su inventario y sabe que si un clerigo no se lo quita (pa ello usan un objeto de poder unico que fabrican en su altar sagrado), sabe que si sale del server al entrar ira directo al infierno, asi pues no uso variable.

Con respecto a "calavera002", es un objeto que sustituye a 001, cuando este va al infierno, el efecto es el mismo que el otro, solo que cuando consigue salir del infierno, este desaparece de su inventario, pero si muere estando en posesion de calavera002, pierde 10mil mo o la mitad de oro que tenga (lo que sea mas) y pierde pxs... por lo demas funciona igualq ue calavera001. Con eso hago que el pj al morir solo pierda pxs si esta en el infierno, y si no lo esta... que se valla a el.

Ninfablanca

03/12/2005 14:09:21

Pues yo aplico tu script tal y como dices ahí y cuando matan a un pj, salen del servidor y al entrar sigue vivito, con el objeto pero vivito. Sabes porque puede ser?
No tendre que poner algo en el oncliententer o algo así?

Ninfablanca

05/12/2005 01:03:02

Bueno, ya he dado con la clave jeje gracias por todo, he modificado algunas cosillas como he podido y he añadido un script al oncliententer del modulo ^^

mviper

05/12/2005 13:09:34

eso te pasa porque io no le he puesto el efecto de que s emuera, ya que io no los quero muertos, los quiero vivos pero en el infierno, si los quieres muertos genera el efecto de muerte en el escrip del area de entrada de esta forma:

void main()
{
object oPC=GetEnteringObject();
object oTarget=oPC;
object oItem=GetFirstItemInInventory(oTarget);
location lTarget;
effect eDead=EffectDeath(TRUE,TRUE);//Aqui creas el efecto de muerte, con efectos bonitos y cosas de esas.

int iMuerte=0;

while(oItem!=OBJECT_INVALID)
{
if(GetTag(oItem)=="calavera001"||GetTag(oItem)=="calavera002")
{
iMuerte++;
}
oItem=GetNextItemInInventory(oTarget);
}

oTarget = GetWaypointByTag("infierno001");
lTarget = GetLocation(oTarget);

if(iMuerte>=1)
{
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, ActionJumpToLocation(lTarget));
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDead,oPC,0.0)://Aqui matas al pj que lleva el objeto, tras haberlo teletransportado, y lo haces aplicando el efecto de muerte
}

}

Seguramente te sera mas facil incluir esas dos simples frases que modificar el OnClientEnter, pero eso ya a tu gusto.