Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Bug d'xp lors de respaw en monde persistant
Bug d'xp lors de respaw en monde persistant
Par Sir Alex DolAerth Lg le 6/12/2002 à 13:00:25 (#2723769)
Est ce qu'une personne aurait une idée pour regler cela ?
Merci
Par eMRaistlin le 6/12/2002 à 13:21:38 (#2723945)
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)
c pas con ton idee j'y avais pas pensé ;p
Par Sir Alex DolAerth Lg le 6/12/2002 à 19:48:49 (#2727215)
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)
Et j'avais oublie la majuscule
Par Sir Alex DolAerth Lg le 6/12/2002 à 20:12:44 (#2727397)
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)
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)
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)
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)
Par eMRaistlin le 7/12/2002 à 18:27:12 (#2732551)
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 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)
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'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)
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)
Par Sir Alex DolAerth Lg le 8/12/2002 à 14:50:34 (#2737198)
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)
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)
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)
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)
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)
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)
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)
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)
Par fauxninja le 9/12/2002 à 22:24:51 (#2747684)
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)
Par fauxninja le 9/12/2002 à 23:17:58 (#2748093)
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)
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)
Ils ont tous un nom du type :
nw_s0_****
Par Sir Alex DolAerth Lg le 10/12/2002 à 14:13:32 (#2751799)
merci :)
Par Sir Alex DolAerth Lg le 10/12/2002 à 20:44:43 (#2755434)
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