Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Un respawn
Un respawn
Par Blam le 3/1/2003 à 10:49:27 (#2933440)
par exemple zone 1 respawn dans zone1
zone 2 dans zone 2
je suis parti du respawn par alignement que j'ai modifié mais ca marche pas.
Qui a une idée ?
Par eMRaistlin le 3/1/2003 à 11:16:32 (#2933637)
un truc du genre :
En entrée : l'area qui lance le script, definit par une int que jue calcule par les 3 premiers chiffres de son tag, et un chiffre random choisit entre 1 et 100
string RandomSelect(int nArea,int nRandom)
{
switch (nArea)
{
case 1: //AREA Petits joueurs
if (nRandom = 50)
{
return "resref_2";
}
break;
case 2: //AREA Dangers publiques
if (nRandom = 50)
{
return "resref_4";
}
break;
default : {return "resref_0"}
Mais je sais pas si c'eszt ca que tu veux...
mal exprimé ma pensée
Par Blam le 3/1/2003 à 11:19:32 (#2933658)
donc un point de respawn par zone.
Merci eM
Interressant ton truc aussi :)
Par eMRaistlin le 3/1/2003 à 11:21:22 (#2933673)
je veux dire, a partir de quel critere decide tu que le joueur doit respawn a l'endroit 1 ou a l'endroit 2 ?
juste le fait qu'il soit mort dans la zone
Par Blam le 3/1/2003 à 11:23:49 (#2933688)
C'est une autre vision du respawn pour garder des groupes bien groupés.
Par eMRaistlin le 3/1/2003 à 11:36:49 (#2933796)
l'autre solution, plus compliquée, consiste a parafer chaque area par un numero (en debuten fin de tag, afin de le faire ressortir par un getSubString) puis de faire un Jump vers l'objet :
GetObjectByTag("RSPWN_"+IntToString(nNum));
voila... je pense que l'un comme l'autre fonctionneront bien...
merci !
Par Blam le 3/1/2003 à 11:38:49 (#2933810)
merci bien a toi !
arg
Par Blam le 3/1/2003 à 12:05:16 (#2934025)
faut dire que sans ma scripteuse préférée j'en suis réduit a poster
désolé !!! (sur le ton de Denisot aux guignols de l'info)
Par eMRaistlin le 3/1/2003 à 12:20:26 (#2934143)
void main()
{
//... le reste du script de respawn (dont la guerison du PC)
object oPC = GetLastRespawnButtonPresser();
string sArea = GetTag(GetArea(oPC));
sArea = GetSubString(sArea,GetStringLength(sArea)-2,3);
object oWPRespawn = GetObjectByTag("RSPWNPC_"+sArea);
AssignCommand(oPC,JumpToObject(oWPRespawn));
}
Voila : un PC qui meurs dans l'Area "Goblin_001" va respawn sur le WP taggé "RSPWNPC_001"
Par Blam le 3/1/2003 à 12:51:57 (#2934339)
// * Applies an XP and GP penalty
// * to the player respawning
void ApplyPenalty(object oDead)
{
int nXP = GetXP(oDead);
int nPenalty = 50 * GetHitDice(oDead);
int nHD = GetHitDice(oDead);
// * You can not lose a level with this respawning
int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
int nNewXP = nXP - nPenalty;
if (nNewXP 10000)
{
nGoldToTake = 10000;
}
AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));
}
void main()
{
object oRespawner = GetLastRespawnButtonPresser();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
RemoveEffects(oRespawner);
//* Return PC to temple
object oPC = GetLastRespawnButtonPresser();
string sArea = GetTag(GetArea(oPC));
sArea = GetSubString(sArea,GetStringLength(sArea)-2,3);
object oWPRespawn = GetObjectByTag("RSPWNPC_"+sArea);
AssignCommand(oPC,JumpToObject(oWPRespawn));
}
voila le respawn et voici les waypoints de respawn
RSPWNPC_001
RSPWNPC_002
ect
malgré cela (ou a cause) ca respawn sur place aux pieds des monstres :)
Par eMRaistlin le 3/1/2003 à 12:56:04 (#2934365)
Par coolstar le 3/1/2003 à 12:58:50 (#2934386)
Dis-moi déjà... à quoi te sert 'void ApplyPenalty' si tu ne t'en sers pas?? :doute:
Par eMRaistlin le 3/1/2003 à 13:13:19 (#2934508)
sArea = GetSubString(sArea,GetStringLength(sArea)-2,3);
essaye de mettre ca en dessous :
sArea = GetSubString(sArea,GetStringLength(sArea)-2,3);
SendMessageToPC(oPC,"sArea = "+sArea));
Ca va servir de debug...
Par coolstar le 3/1/2003 à 13:15:48 (#2934526)
string sGetArea = GetTag(GetArea(oPC));
string sArea = GetSubString((sGetArea), GetStringLength(sGetArea)-2 ,3);
Ni l'un ni l'autre
Par Blam le 3/1/2003 à 13:29:46 (#2934632)
merci quand meme de vous pencher sur ce truc pénible :)
Par coolstar le 3/1/2003 à 13:39:45 (#2934718)
#include "nw_i0_plot"
// * Applies an XP and GP penalty
// * to the player respawning
void ApplyPenalty(object oDead)
{
int nXP = GetXP(oDead);
int nPenalty = 50 * GetHitDice(oDead);
int nHD = GetHitDice(oDead);
// * You can not lose a level with this respawning
int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
int nNewXP = nXP - nPenalty;
if (nNewXP 10000)
nGoldToTake = 10000;
AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));
}
void main()
{
object oPC = GetLastRespawnButtonPresser();
string sGetArea = GetTag(GetArea(oPC));
string sArea = GetSubString((sGetArea), GetStringLength(sGetArea)-3 ,3);
object oWPRespawn = GetObjectByTag("RSPWNPC_"+sArea);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetMaxHitPoints(oPC)), oPC);
RemoveEffects(oPC);
ApplyPenalty(oPC);
AssignCommand(oPC, JumpToObject(oWPRespawn));
}
toujours respawn sur place
Par Blam le 3/1/2003 à 13:55:44 (#2934881)
les waypoints sont : de type RSPWNPC_001 puis 002 puis 003
les zones sont de type Nomdezone001 puis 002 puis 003
le scripts du module respawn est celui de coolstar et...........
Rien !
Par eMRaistlin le 3/1/2003 à 14:07:08 (#2934992)
Normalment, il doit te faire un un message de Type CombatMessage, non ?
Que te dis ce message ?
Par coolstar le 3/1/2003 à 14:13:46 (#2935056)
En fait... eMR s'était mépris en mettant '-2' alors qu'il fallait mettre '-3' (rien de bien grave quoi... et merci d'ailleurs pour le tuyau eMR!)... mais tout est corrigé maitenant (et c'était sans compter 2 Déclarations redondantes de 'GetLastRespawnButtonPresser'!)... ;)
Quoi qu'il en soit, je me demande même si tu as bien mis le Script dans le OnPlayerRespawn Blam?? (as-tu les messages de perte d'XP et d'Or comme il se doit?)... :D
...
send message
Par Blam le 3/1/2003 à 14:14:13 (#2935061)
voila voila :)
et Coolstar oui j'ai bien la perte d'XP et tout et tout mais je respawn sur place
je vais verifier si sur le tag il faut pas etre en minuscules
genre rspwnpc au lieu de RSPWNPC car je ne comprends pas que cela ne marche pas.
arg pas dans le OnSpawm mais dans le respawn !
tiens, un OnSpawn ? dans les propriétées du modules ?????
pas de changements du OnDeath ni du OnDying, j'aurais du ?
Par eMRaistlin le 3/1/2003 à 14:25:35 (#2935171)
Le sendMessageToPc est dans la ligne que j'ai rajoute, dans la page precedente...
Ca envoi un message de type CombatText sur l'interface du joueur...
c'est super pratique pour les quetes et autres info utiles... mais c'est aussi genial pour faire du Debug (c'est mieux que le SpeakString,en terme de Debug)...
Donc, rajoute la Ligne SendMessageToPC telle que dans la page precedente, et regarde ce que cela te donne lorsque tu respawn.
PS : sans vouloir etre lourd, reverifie aussi tout tes tags, vue que rien ne ressemble plus a RSPWNPC que RSWPNPC ^^
Par coolstar le 3/1/2003 à 14:26:01 (#2935175)
void main()
{
object oPC = GetLastRespawnButtonPresser();
string sGetArea = GetTag(GetArea(oPC));
string sArea = GetSubString((sGetArea), GetStringLength(sGetArea)-3 ,3);
object oWPRespawn = GetObjectByTag("RSPWNPC_"+sArea);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetMaxHitPoints(oPC)), oPC);
//RemoveEffects(oPC);
//ApplyPenalty(oPC);
AssignCommand(oPC, JumpToObject(oWPRespawn));
// Test Debug :
string sMess = "RSPWNPC_"+sArea;
SendMessageToPC(oPC, sMess);
}
ok
Par Blam le 3/1/2003 à 14:37:48 (#2935280)
bon ca me dit:
RSPWNPC_EST
sArea=est
alors que le pj est mort dans Caverneest001 et que le wp de respawn s'appelle RSPWPC_001
Par eMRaistlin le 3/1/2003 à 14:41:33 (#2935322)
Quels sont les Nom / tag et resref de ton area 001 ?
nom
Par Blam le 3/1/2003 à 14:45:34 (#2935351)
Caverneest001
tag
Caverneest
ResRef
caverneest
J'AI TROUVE CHERCHEZ PLUS
Le tag doit etre 001 ou 002 ect
toutes mes excuses pour cette erreur de débutant !!!!!!
je me fait l'effet d'un boulet que deux proffessionnels poncent concientieusement afin que ca roule !!!! Bouhhhhhhhhhhhh!
merci a vous :) et a votre patience :)
NB bouhhhhhhh! laid (aussi)
Par Archamedes_Fr le 3/1/2003 à 14:52:02 (#2935391)
le numéro dois être sur le TAG et le resref ( comme je sais pas vraiment lequel, tout mes TAG ( en majuscule) sont devenues identique au resref (en minuscule) ), et non sur le nom de la zone.
Par coolstar le 3/1/2003 à 14:52:13 (#2935392)
Par eMRaistlin le 3/1/2003 à 14:54:03 (#2935411)
Par coolstar le 3/1/2003 à 15:00:31 (#2935459)
Provient du message de eMRaistlin
Et les tag de l'area ?
Provient du message de Blam
En lisant ça je croyait vraiment que tout était bon, moi! alors je comprenais pu... :D
caverneest001
caverneouest002
ect
Tiens nous au courant dès que ça marche, ok? ;)
PS: Oui oui, 'OnPlayerRespawn' (quelle Quiche je fais!)...
PSBis: Au fait eMR? pourquoi, selon toi, 'SendMessageToPC' c mieux que 'SpeakString' pour le Debug??
Msg n°30
Par Blam le 3/1/2003 à 15:05:45 (#2935503)
Encore merci a tous
euh ca serait bien de le mettre dans les scripts permanents car facilement utilisable (par ceux qui savent ce qu'est un tag !)
Par eMRaistlin le 3/1/2003 à 15:14:05 (#2935573)
Enfin, tu peux faire un test de if GetIsDM(oPC){SendMessage...;} et garder el dubbugging en jeu sans que les joueurs le voient...
Bref : plein de petits plus, même si le concept est le même :)
PS : Blam, le post est un peu trop long pour etre mis en permanent...
J'essairait de l'editer ce soir, et de l'inclure dans la liste...
Par coolstar le 3/1/2003 à 15:35:58 (#2935754)
Provient du message de eMRaistlin
Et tu ne peux pas faire AssignCommand(oPC, SpeakString("); ?? :doute:
To simplement pasque si tu met un speakstring, tu ne peux debugger que des creatures, et qui plus est, tu doit etre a portée de voix... Alors qu'avec le SendMessageToPC, tu peux garder les memes fonctionnalitées, et en plus, tu teste plus de choses...
Provient du message de eMRaistlin
Ca c bien vu! ;)
Enfin, tu peux faire un test de if GetIsDM(oPC){SendMessage...;} et garder el dubbugging en jeu sans que les joueurs le voient...
Bref : plein de petits plus, même si le concept est le même :)
Provient du message de eMRaistlin
Comment trop long? ça sera pas une première... Et pis, c dommage d'Editer un Fil (le cheminement en est aussi important!)... Pourquoi ne pas présenter plutôt sur le Fixe la Solution Finale accompagnée d'un lien à ce Topic?? A moins que c qu'est-ce que tu voulais dire? :D
PS : Blam, le post est un peu trop long pour etre mis en permanent...
J'essairait de l'editer ce soir, et de l'inclure dans la liste...
(bon ok, j'arrête!)] :p
JOL Archives 1.0.1
@ JOL / JeuxOnLine