Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Bug d'xp lors de respaw en monde persistant

Par Sir Alex DolAerth Lg le 6/12/2002 à 13:00:25 (#2723769)

J'héberge un petit monde persistant depuis un moment avec un system de perte d'xp classique lors d'un respaw. Le problème est que si l'on choisit de quitter le jeu plutot que de faire un respaw. la personne reviens avec le plein de vie et aucune perte d'experience...

Est ce qu'une personne aurait une idée pour regler cela ?

Merci

Par eMRaistlin le 6/12/2002 à 13:21:38 (#2723945)

normalement, ceci devrait fonctionner :

tu met ceci dans ton eventmodule OnClientExit :


void main()
{
object oPC = GetexitingObject();

if (GetIsDead(oPC))
{
ExecuteScript(oPC,"nom_de_ton_script_OnPCRespawn");
}
}

Donc, logiquement, ton PC devrait declencher le script de respawn en partant si il est mort.

Toutefois, ej t'invite a cionfirmer ou infirmer apres test, car je ne suis pas a 100% sur que le oPC soit encore une cible valide lors de l'execution du script. A verifier, je dirait...:p

Par Sir Alex DolAerth Lg le 6/12/2002 à 13:42:05 (#2724157)

ok je vais tester

c pas con ton idee j'y avais pas pensé ;p

Par Sir Alex DolAerth Lg le 6/12/2002 à 19:48:49 (#2727215)

non ca ne marche pas
GetexitingObject() est pour la sortie d'une zone et non d'un module puis ca ne marche pas avec cette syntaxe

J'essais encore de chercher ...

Par eMRaistlin le 6/12/2002 à 19:56:42 (#2727276)

Sisi, GetExitingObject fonctionne avec la sortie du module, car il gere une sortie de zone avant.

Et j'avais oublie la majuscule

Par Sir Alex DolAerth Lg le 6/12/2002 à 20:12:44 (#2727397)

par contre c'est dans le client live qu'il faut le mettre me semble ? :p ya pas de client exit

ok je retente j'ai voulu le remplacer par un GetLastPlayerDying(); ou un GetLastPlayerDead();
mais ca fait rien ...

Par Sir Alex DolAerth Lg le 6/12/2002 à 20:22:38 (#2727455)

ca ne fait rien si je marque strictement cela ...
je l'ai mis dans le onClientLeave
Avec le bon script de respaw
lorsque je reco je suis toujours au meme lieu et avec le meme xp pourtant je suis sur que mon respaw marche ! c testé

>>>>>>>>>>>

void main()
{
object oPC = GetExitingObject();

if (GetIsDead(oPC))
{
ExecuteScript("nw_o0_respawn", oPC); // en plus tu as echanger oPC avec le script sur le tien alors que la syntax c comme ca
}
}

Par eMRaistlin le 7/12/2002 à 17:21:03 (#2732196)

Ca doit venir du fait que l'objet n'est plus valide, vu qu'il est exité.

Si tu veux vraiment faire ca, alors, je t'invite a mettre le script de respawn directement dans le OnExit, avec un IfGetIsDead comme securité. L'objet sortant devrait etre encore valide a ce moment la.


(PS , si tu a pas compris, poste ton script de respawn ici, que je le complete pour test)

Par Tatouine le 7/12/2002 à 17:47:49 (#2732372)

Et bien moi le script ce celui de ce Thread ...
MAis le probleme c ke ce n'est pas a la mort du PC mais lorsqu'il a moin de 0 pv a la deco ...
Pourrais tu le modifier et dire ou le mettre
Voila le script ... a faire si le PC a moin de 0 pv et s il deco .


Merci d avance .Script

Par fauxninja le 7/12/2002 à 17:53:20 (#2732395)

de toutes facon ca peu pas marcher, car quand le gars quit, son perso est plus la donc je voi pas comment on pourrai le faire respawn si il est pas la....

Par eMRaistlin le 7/12/2002 à 18:27:12 (#2732551)

euhy... moi, je veux bien, mais dans le script que tu m'a montré, y'a pas de perte d'Xp. juste de sous et d'item

sinon, pour la correction, tu met ca dans le OnExit :


/************************************************************/
/* OnPlayerRespawn script. It takes all of all your current */
/* equipped and inventory items and transfers them into */
/* a corpse on the location which you died in. */
/************************************************************/
/* Created by: Osthman */
/* Date: Saturday, 9/14/02 */
/************************************************************/

#include "nw_i0_plot"

void main()
{
object oRespawner = GetExitingObject();

if (GetIsDead(oRespawner ))
{
object oItem = GetFirstItemInInventory(oRespawner);
// Items currently equiped of the PC.
object oSlot1 = GetItemInSlot(INVENTORY_SLOT_ARMS,oRespawner);
object oSlot2 = GetItemInSlot(INVENTORY_SLOT_ARROWS,oRespawner);
object oSlot3 = GetItemInSlot(INVENTORY_SLOT_BELT,oRespawner);
object oSlot4 = GetItemInSlot(INVENTORY_SLOT_BOLTS,oRespawner);
object oSlot5 = GetItemInSlot(INVENTORY_SLOT_BOOTS,oRespawner);
object oSlot6 = GetItemInSlot(INVENTORY_SLOT_BULLETS,oRespawner);
object oSlot7 = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oRespawner);
object oSlot8 = GetItemInSlot(INVENTORY_SLOT_CHEST,oRespawner);
object oSlot9 = GetItemInSlot(INVENTORY_SLOT_CLOAK,oRespawner);
object oSlot10 = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oRespawner);
object oSlot11 = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oRespawner);
object oSlot12 = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oRespawner);
object oSlot13 = GetItemInSlot(INVENTORY_SLOT_HEAD,oRespawner);
object oSlot14 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oRespawner);
object oSlot15 = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oRespawner);
object oSlot16 = GetItemInSlot(INVENTORY_SLOT_NECK,oRespawner);
object oSlot17 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oRespawner);
object oSlot18 = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oRespawner);


// Gets the location that was set on the module when he/she died.
location lDeathSpot = GetLocalLocation(GetModule(),"+GetName(oRespawner)+" Death");

// Checks to see if the PC has alteast 1 valid object in their inventory, if not,
// don't create another body.
if (GetFirstItemInInventory(oRespawner) == OBJECT_INVALID && oSlot1 == OBJECT_INVALID
&& oSlot2 == OBJECT_INVALID && oSlot3 == OBJECT_INVALID && oSlot4 == OBJECT_INVALID
&& oSlot5 == OBJECT_INVALID && oSlot6 == OBJECT_INVALID && oSlot7 == OBJECT_INVALID
&& oSlot8 == OBJECT_INVALID && oSlot9 == OBJECT_INVALID && oSlot10 == OBJECT_INVALID
&& oSlot11 == OBJECT_INVALID && oSlot12 == OBJECT_INVALID && oSlot13 == OBJECT_INVALID
&& oSlot14 == OBJECT_INVALID && oSlot15 == OBJECT_INVALID && oSlot16 == OBJECT_INVALID
&& oSlot17 == OBJECT_INVALID && oSlot18 == OBJECT_INVALID && GetGold(oRespawner) == 0)
{
// Jumps the PC immediately to the place(s) you want them to respawn,
// instead of having a delay of 2 seconds.

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
RemoveEffects(oRespawner);

// Location(s) of were the player respawns
AssignCommand(oRespawner,JumpToLocation(GetLocation(GetObjectByTag("TEST_WAYPOINT"))));
}
else
{
DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner));
DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner));
DelayCommand(2.0,RemoveEffects(oRespawner));

// Make sure you have a created a custom placeable object with the apperance
// of a body, has the boxes checked in plot item, useable, has inventory
// and it has the script posted above attached on the "OnClosed" event of the placeable.
// Change the resref tag here if you have a different one on it.
object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE,"corpse",lDeathSpot);

// Takes all currently equiped weapons from the PC.
AssignCommand(oCorpse,ActionTakeItem(oSlot1,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot2,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot3,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot4,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot5,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot6,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot7,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot8,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot9,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot10,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot11,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot12,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot13,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot14,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot15,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot16,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot17,oRespawner));
AssignCommand(oCorpse,ActionTakeItem(oSlot18,oRespawner));

// Takes all items on the PC's inventory.

while (GetIsObjectValid(oItem))
{
if (GetStringUpperCase(GetStringLeft(GetName(oItem),4)) != "CLEF") //ICI MODIF eMRaistlin
{ //ICI MODIF eMRaistlin
AssignCommand(oCorpse,ActionTakeItem(oItem,oRespawner));
} //ICI MODIF eMRaistlin
oItem = GetNextItemInInventory(oRespawner);
}

// Takes gold also.
AssignCommand(oCorpse,TakeGoldFromCreature(GetGold(oRespawner),oRespawner));

// Here make them respawn to the place(s) you want the PC to respawn, but make
// sure that the "jumping" is delayed for 2 seconds since the other effects
// are delayed for 2 seconds also, so if you change that you need to change this.
DelayCommand(2.0,AssignCommand(oRespawner,ActionJumpToLocation(GetLocation(GetObjectByTag("TEST_WAYPOINT")))));
}

}
}


normalement, si je prevoit bien, le PC a pas le temps d'etre exité, donc il devrait perdre ses items et son gold.

Merci quand même de bien vouloir confirmer si cela fonctionne comme je l'attends... (question interessante, s'il en est ;))

Par fauxninja le 7/12/2002 à 18:35:55 (#2732598)

ca marche presk:
ca créé un skelet quand le gars ki kit est mort.

MAIS:
ya rien dans le scelet
car on peu pas prendre les affaires d'un gars qui n'est plus connecté. (le gars a toujours ses affaires quand il reco)
(il n'est plus connecté quand il a quitté, donc quand la programme s'est lancé)

voila..
fau trouver autre chose, j'y travaille

Par Tatouine le 7/12/2002 à 18:48:47 (#2732670)

J avais peut etre une idee ....
Voila se serait de faire:
A la mort : deposer une item
Style clef des enfers


Puis au respawn detruire TOUTES (*) les clef des enfers de l inv .

ET a l'entrée du PC verfier s il a : clef des enfers,
et s il l a alors le tuer .



* : S il a deco reco plusieurs fois avant de comprendre ke sa le tue en boucle ...


Serait t'il possible que quelqu'un script sa et qu'il le post ?

Par fauxninja le 7/12/2002 à 18:56:11 (#2732722)

c pas deposer une clef qu'il fau faire.

c'est (car j'utilise les saignement):

SI les PV <=0 alors lui mettre le crane dans le sac

ensuite, dans ONclientENTER, il fau verifier les sac, et si ya un crane, forcer a respawn

et enfin, dans le respawn, (jutilise un respawn ou tout est perdu) il fau que le crane soi detruit (pas mis sur le corps)

voila ce qu'il nous faudrai.

Par eMRaistlin le 7/12/2002 à 19:55:22 (#2732996)

C'est pas mal... une tres bonne idée, même...

Mais je suppose que si cela fonctionne pour ajouter un crane, le script ci-dessus devrait egalement fonctionner.

En tout cas, je garde l'idée en reserve pour le cas ou vous confirmeriez que le script ci-dessus ne fonctionne pas...

Par Jedaï le 7/12/2002 à 23:16:11 (#2734051)

Non, c'est pas possible eMRaistlin, son script il le met sur le OnDying pas sur le OnClientLeave, ça fait déjà longtemps que les DM se plaigne que le OnClientLeave soit exécuté après que le joueur ait quitté...:( :(

Par Sir Alex DolAerth Lg le 8/12/2002 à 14:50:34 (#2737198)

je vais tester l'histoire du crane ca a l'air pas mal :)

Je vous dit tout

Par contre si on ressussite le PC le crane va rester dans le sac ?
c koi la commande pour reperer la resurection ? (surment le sort a reperer)

Par eMRaistlin le 8/12/2002 à 15:17:51 (#2737371)

T'es pas oligé de mettre un crane. tu peux aussi assigner une variable locale (vu que toute facon, si le serveur est down, ton PJ reviendra au point initial de depart). Sauf si tu utilise itemizer ou PWUM, dans ce cas, il peut revenir ailleurs (mais du coup, autant utiliser une variable quand même ^^)

Pour la resurection, ouvre un nouveau module, et regarde dans les propriete du module l'evenement OnPlayerDeath par defaut, y'a le script de respawn. (avec le ApplyPenalty et le PoPupGUIPanel.)

Par fauxninja le 8/12/2002 à 20:10:53 (#2739270)

est ce que c'est possible pour vous de faire un peu (ou meme beaucoup) ce scripts? enfin ces scripts?
car ton script ne marche pas Raistlin?
ca met un skelet, mais rien dedans. car le joueur est plus la donc on peu pas lui prendre ses affaires (j'ai testé ne t'en fai pas)

Par eMRaistlin le 9/12/2002 à 0:00:49 (#2740898)

Bein, le gros probleme, c'est que si tu utilise le OnDying, c'est pas evident. Avec le OnDeath, Au moins, on sait, mais avec le OnDying...


Ce que je peut te proposer :

Dans le OnDying, au tout debut, tu met ceci :


void main()
{
object oPC = GetLastPlayerDying();
SetLocalInt(oPC,"dead",TRUE);
}


Sur tout les sorts de resurection, ainsi que sur le OnPlayerRest du module, tu met ceci :


//object oTarget = GetLastPCRested();
SetLocalInt(oTarget,"dead",FALSE);


Et sur le OnEntering Client :


void main()
{
object oPC = GetEnteringObject();
if (GetLocalInt(oPC,"dead")==TRUE)
{ApplyEffectToObject(DURATION_TYPE_INSTANT,ExtraordinaryEffect(EffectDeath()),oPC);}
}


Ca devrait marcher, mais si tu veux, c'est dangereux, car un PC qui ressucite, puis quitte le module sans se reposer va revenir mort. C'est un choix. Mais si tu securise bien tout les sorts permettant de rammener a ala vie, ca devrait aller.

Par fauxninja le 9/12/2002 à 2:04:22 (#2741313)

je vai tester.
mais c plus simple d'enlever "la variable mortel" quand on respawn.. non? au lieu de l'enlever quand on rest ou quand on fai un sort de resurection

Par eMRaistlin le 9/12/2002 à 2:10:02 (#2741329)

Bein, vi, mais le probleme, c'est qu'un PC mort ne revient pas forcement a la vie lors d'un respawn.


Or le script OnRespawn ne s'enclenche que si tu presse le bouton Respawn du GUIpanel.

Par fauxninja le 9/12/2002 à 2:26:00 (#2741362)

heu, sisi apres un respawn t vivant dans la plupart des cas...

et oui, ca s'empleche que si tu presse le bouton respawn.. donc le gars n'aurai plus "la variable mortel" que s'il presse le bouton, donc que si il respawn....

je voi pas ou est le probleme non ? si?

Par eMRaistlin le 9/12/2002 à 9:36:31 (#2741960)

Bon, je te resume :


Je suis dans ton module.
Je meurs.
Un ami qui passe me rescussite avec le sort de pretre du niveau 7 qui m'evite d'avoir a me reposer, car je suis full.
Dans la foulée, je dois deconnecter.

Je reviens peu apres, et a la reconnection, je meurs directement, car je n'ai pas remis a zero la variable, vu que je n'ai pas appuyé sur le bouton Respawn.

CQFD ;)

Par Jedaï le 9/12/2002 à 12:02:38 (#2742860)

Oui mais comme l'as dit eMRaistlin, il suffit de remanier les sorts de résurrection : les scripts des sorts commencent par nw_s0_*.nss . Ainsi tu évite le problème, à toi de voir !:)

Par fauxninja le 9/12/2002 à 22:24:51 (#2747684)

ouais bon y pas vraiment de script contre ca en fait.
on se demande a quoi ils pensaient les gars de nwn quand ils ont créé leur jeu

Par coolstar le 9/12/2002 à 22:37:19 (#2747765)

Au fric!! :doute:

Par fauxninja le 9/12/2002 à 23:17:58 (#2748093)

bin ouais, tout le monde ne pense plus qu'au fric de toutes facons.
alala
bon bin je vai m'y mettre au fric alors, c'est peu etre interessant aussi...

Par coolstar le 9/12/2002 à 23:29:30 (#2748175)

Ouai mais t'es plein de vide après! moi je préfère me mettre à l'Art!! :merci:

Par Sir Alex DolAerth Lg le 10/12/2002 à 13:28:07 (#2751355)

Sur tout les sorts de resurection


Comment on accede a l'action d'un sort ?
J'arrive pas a trouver les sorts dans aurora

Par eMRaistlin le 10/12/2002 à 14:07:43 (#2751751)

Les sorts sont tous accessibles dans l'editeur de script.

Ils ont tous un nom du type :
nw_s0_****

Par Sir Alex DolAerth Lg le 10/12/2002 à 14:13:32 (#2751799)

*se sent vraiment nb*
merci :)

Par Sir Alex DolAerth Lg le 10/12/2002 à 20:44:43 (#2755434)

bon j'ai resolu le pb

J'ai attribué la perte d'xp/po lorsque l'on meurt puis sur les sorts de resurection j'ai fais en sorte que l'xp/po soit redonné et le tour est joué :)

merci à tous

JOL Archives 1.0.1
@ JOL / JeuxOnLine