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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Un respawn

Par Blam le 3/1/2003 à 10:49:27 (#2933440)

Comment faire un respawn par zone

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)

Personnelement, j'utilise une fonction unique, qui lance à un moment donné une liste de monstre par Area, et qui en ressort un string de resref a créer.

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)

je voudrais que les joueurs respawnent dans la zone de leur mort a un endroit securisé
donc un point de respawn par zone.

Merci eM
Interressant ton truc aussi :)

Par eMRaistlin le 3/1/2003 à 11:21:22 (#2933673)

qu'est-ce qui est censé valoriser la difference de respawn ?

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)

et uniquement cela.

C'est une autre vision du respawn pour garder des groupes bien groupés.

Par eMRaistlin le 3/1/2003 à 11:36:49 (#2933796)

Dans ce cas, la solution la plus simple est de creer un WP dans chaque zone, du nom "RSPWNPC", puis, lors de la mort du PC, de le teleporter a la location de GetNearestObjectByTag("RSPWNPC");

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)

2 solutions, ca va si tous pouvaient avoir le choix, ce serait formidable


merci bien a toi !

arg

Par Blam le 3/1/2003 à 12:05:16 (#2934025)

je n'arrive pas a le mettre en forme
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)

Sur l'option de l'interpretation de tag de l'area :


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)

#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 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)

Et les tag de l'area ?

Par coolstar le 3/1/2003 à 12:58:50 (#2934386)

Hi Blam!


Dis-moi déjà... à quoi te sert 'void ApplyPenalty' si tu ne t'en sers pas??
:doute:

ah oui

Par Blam le 3/1/2003 à 13:01:29 (#2934406)

caverneest001
caverneouest002
ect

Par eMRaistlin le 3/1/2003 à 13:13:19 (#2934508)

Ca doit venir de la :


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)

Et ça n'irait pas mieux en mettant ceci?? :D


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)

je viens d'essayer les deux et aucun ne marche, meme en corrigeant le ) manquant sur la modif de eM

merci quand meme de vous pencher sur ce truc pénible :)

Par coolstar le 3/1/2003 à 13:39:45 (#2934718)

C ok! ;)


#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)

la je ne comprends pas

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)

Mais en mettant le SendMessage, il t'ecrit quoi, quand ton PC meurs?

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)

Y'a une chose qui m'échappe (et je suis bien déçu même!)... je teste tout avant de balancer (ou j'avertis sinon si je n'ai pu le faire!)... et là je l'ai fait... Et sa Marche!! :doute:

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)

Jamais utilisé je ne sais meme pas ou il est :)

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)

C'est bien dans le OnPlayerRespawn...

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)

Tiens, essaye ça pour voir! ;)


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)

bien ce ptit truc du message, :)))

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)

euh... c'est bien le Tag dont il s'agit, pour tes cavernes ?


Quels sont les Nom / tag et resref de ton area 001 ?

nom

Par Blam le 3/1/2003 à 14:45:34 (#2935351)

nom de zone
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)

voilà ton problème !

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)

lol

Par eMRaistlin le 3/1/2003 à 14:54:03 (#2935411)

A ton service :D

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
caverneest001
caverneouest002
ect
En lisant ça je croyait vraiment que tout était bon, moi! alors je comprenais pu... :D


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)

OUI CA MARCHE !



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)

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...

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
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...
Et tu ne peux pas faire AssignCommand(oPC, SpeakString("); ?? :doute:


Provient du message de eMRaistlin
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 :)
Ca c bien vu! ;)


Provient du message de eMRaistlin
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...
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





(bon ok, j'arrête!)] :p

JOL Archives 1.0.1
@ JOL / JeuxOnLine