mviper

15/12/2005 01:03:38

Pues eso, tengo 2 scripts que me costo lo mio descubriri como ahcerlos para controlare so tan habitual que es salir del server sin hechizos, casi muerto a 2Pv, y sin usos de dotes,... entrar a los 30segundos y estar repleto de vida, hechizos a tope etc...

El script funciona bien, si un pj sale y entra con mas hechizos o usos de dotes que con los que salio, automaticamente se le ponen los usos a 0 y depaso le clava el dañoq ue tenia antes de salir... bueno va bien el script probando sobre un desencadenante (simulando que era el area).

Sin embargo he detectado que el script OnExit, no gurada las variables de campaña.. o si lo hace lo ahce con valor 0, bueno aqui paso a dejar los 2 scripts y si alguien tiene ganas que lo mire:

---------------------------------------------------------------------
El que se pone al salir del server (el que me da problemas):
---------------------------------------------------------------------
[code:1:a4f2087c46]
void main()
{
object oPC=GetExitingObject();

string sNom=GetName(oPC);

int index, iHec;

//Guardamos los hechizos y sus cargas al salir del server
string sUso;

for(index=0;index<622;index++)
{
iHec = GetHasSpell(index, oPC);
if(iHec >0)
{
sUso+=IntToString(index)+"="+IntToString(iHec)+";";
}
}
//Guardamos las dotes y sus usos al salir del server
string sDot;
index=0;

for(index=0;index<480;index++)
{
iHec = GetHasFeat(index, oPC);
if(iHec >0)
{
sDot+=IntToString(index)+"="+IntToString(iHec)+";";
}
}
//Guardamos los Pv que tiene al salir del server
int iPva=GetCurrentHitPoints(oPC);
if(iPva==0)iPva=-1;
string sPva=sNom+"Pv";
string sPac=sNom+"Dote";

//Lo gravamos todo en una variable de base de datos
SetCampaignString("isnar",sNom,sUso,oPC);
SetCampaignString("isnar",sPac,sDot,oPC);
SetCampaignInt("isnar",sPva,iPva,oPC);
}
[/code:1:a4f2087c46]
-------------------------------------------
Y ahora el script que uso al entrar:
-------------------------------------------

[code:1:a4f2087c46]
void main()
{
object oPC=GetEnteringObject();
string sNom=GetName(oPC);

int index, iHec;

//Controlamos los hechizos, si salio con alguno gastado entra con todos gastados
string sUsa;

for(index=0;index<622;index++)
{
iHec = GetHasSpell(index, oPC);
if(iHec >0)
{
sUsa+=IntToString(index)+"="+IntToString(iHec)+";";
}
}

string sNam=sNom+"local";
SetCampaignString("isnar",sNam,sUsa,oPC);

string gUso,sPos,hUso,sTie,sTen;

gUso=GetCampaignString("isnar",sNom,oPC);
hUso=GetCampaignString("isnar",sNam,oPC);

int iPos,tPos;
index=0;

for(index=0;index<622;index++)
{
iHec=GetHasSpell(index,oPC);
if(iHec>0)
{
sPos=IntToString(index);
iPos=FindSubString(gUso,sPos);
tPos=FindSubString(hUso,sPos);

sTen=GetSubString(gUso,iPos,3);
sTie=GetSubString(hUso,iPos,3);
if(sTen!=sTie)
{
while(iHec>0)
{
DecrementRemainingSpellUses(oPC,index);
iHec-=1;
}
}
}
}
//Controlamos las dotes, si salio con una gastada entra con todas gastadas
string sDot;
index=0;

for(index=0;index<480;index++)
{
iHec = GetHasFeat(index, oPC);
if(iHec >0)
{
sDot+=IntToString(index)+"="+IntToString(iHec)+";";
}
}

string sPac=sNom+"Dote";
string sNem=sNom+"Pac";
SetCampaignString("isnar",sNem,sDot,oPC);

gUso=GetCampaignString("isnar",sPac,oPC);
hUso=GetCampaignString("isnar",sNem,oPC);

index=0;

for(index=0;index<622;index++)
{
iHec=GetHasFeat(index,oPC);
if(iHec>0)
{
sPos=IntToString(index);
iPos=FindSubString(gUso,sPos);
tPos=FindSubString(hUso,sPos);

sTen=GetSubString(gUso,iPos,3);
sTie=GetSubString(hUso,iPos,3);
if(sTen!=sTie)
{
while(iHec>0)
{
DecrementRemainingFeatUses(oPC,index);
iHec-=1;
}
}
}
}
//Controlamos los pv, si salio herido, entra igualde herido
string sPva=sNom+"Pv";
int iPva=GetCampaignInt("isnar",sPva,oPC);
int iPvt=GetMaxHitPoints(oPC);
if(iPva==0)iPva=iPvt;
int iPvp=iPvt-iPva;

effect ePvp=EffectDamage(iPvp,DAMAGE_TYPE_DIVINE,DAMAGE_POWER_PLUS_TWENTY);
AssignCommand(oPC,ApplyEffectToObject(DURATION_TYPE_INSTANT,ePvp,oPC));
}
[/code:1:a4f2087c46]
------------------------------------------------
Ambos son de cosecha propia, por lo que no me extrañaria que el problema sea que tyengo algo mal puesto, sin embargo tengo sospechas de que se trata de algun bug del juegoq ue no permite usar ciertas llamadas o funciones sobre el pj que sale del server.

Bueno si hay suerte ya me contestais.

P.D. Editado para poner el code(las prisas y esas cosas)

15/12/2005 11:51:29

Efectivamente el evento de salida del cliente no funciona, no graba los datos correctamente en la base de datos.

Puedes colocarlo en el evento de heartbeat del modulo, yo lo tube asi un tiempo, pero sobrecarga demasiado, por eso lo quite y actuamente puedes salir y entrar y tener todos los hechizos.

Lo qu esi deje es que guardase la sangre que tienes por heartbeat y en el evento de salida del cliente creo que si lo guardas como variable local si que que te lo guarda en el pj.

mviper

15/12/2005 13:06:46

Asi decia io.... bueno, lo he solucionado a lo salvage, en OnHeartBeat, hago que guarde variables locales sobre el cabezon del pj, y cuando este sale llamo a la variable desde OnClienLeave, de moemnto ya tengo el control de hechis, dotes y pv, voy a ver si pillo tambien que al entrar te aplique los efectos que llevaras puestos.. cuando lo acabe ya lo posteo por aqui si quereis.

Por cierto.. siq ue sobrecarga muchisimo poner OnHeartBeat que guarde variables en campaign, por eso lo he pasado a guardarlos en variables locales sobre cada pj, aunque no me termina de gustar.. bueno a evre que hago, de paso buscare haber si pillo algo por alguna web que pueda ayudarme o servirme ... ya sabeis, al estilo de frankestein, un trozo de aqui, otro de alli.. etc.

A todo esto, estoy trabajando con variables persistentes al salir del server, de esta forma los datos sobreviven a caidas y reset del server.. si consigo que pirule... ya me decis quien loq uiere y se lo paso.

Ninfablanca

18/12/2005 23:52:49

Oye ya que estais con el tema, en qeu se diferencia el OnClientLeave y el OnClientEnter?

mviper

19/12/2005 02:27:13

Si traduces del ingles al español....

OnClienLeave= On Client Leave = El jugador sale
OnClientEnter= On Client Enter = El jugador entra

Las diferencias son obias ¿no?

Por cierto, ya tengo el sistema acabado.. un scirpt en OnClientLeave, otro en OnClientEnter y otro en OnHeartBeat.

No sobrecarga carga casi el server... es un script que encontre por ahi y he modificado escasamente, mas que otra cosa... porque hace loq eu io buscaba, y lo encontre buscando otra cosa, ya es coincidencia.

Bueno, memoriza los hechizos gastados, dotes gastadas, Pv, localizacion de salida (aveces esto falla, en las caidas de server), los efectos sobre el pj (veneno, bajon de nieveles, hechizos activos etc) y si ha pasado el tiempo no et los pone, pero si entras y deberias tenerlos, te los planta de nuevo.

Pos eso si lo quereis ya me lo decis... daos prisa que creo que en enero me quito la adsl una temporadita...

Ninfablanca

19/12/2005 22:21:24

Pues hombre si me lo pasas te lo agradezco de corazón, por que un script así es digno de meterlo en todo server, ahorra trabajo a los dms y evita uno de los peores efectos del nwn.

mviper

19/12/2005 22:59:58

http://nwvault.ign.com/fms/Download.php?id=31840

Bajatelo de hay, son 4 scripts, el de OnModuleLoad no es necesario usarlo, pero si el de OnClientLeave y el OnClientEnter, y el mas importante es el archivo de 3822 lineas... que es elq ue hace todo el trabajo, no va puesto en nigun sitio, solo dejalo en los guiones de tu modulo los de Leave y Enter ya le llaman cuando necesitan algo de el.