Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Help : feu de camp et au dodo
un coup de main pour un script
Par rincevent le 18/10/2002 à 11:27:20 (#2356569)
je m'explique:
g un feu de camp, et lorsque un pc clic dessus il lance un dialogue lui proposant de se reposer, quand le pc repond oui j'aimerai forcer le repos:
en gros je voudrai le script metant un pc au repos si quelqu'un peu m'aidé ça serai cool merci
Par eMRaistlin le 18/10/2002 à 11:58:52 (#2356673)
c bon je suis dans le bon forum??
Vi.. desole de t'avoir un peu embete sur ca, mais c'est vrai que si tout le monde poste dans le general, ca va devenir le boon's ^^en gros je voudrai le script metant un pc au repos si quelqu'un peu m'aidé ça serai cool merci
pour ca, il y a void ActionRest();
donc, tu fais ceci (a inclure dans ton dialogue... je pars du prncipe que tu a lance une conversation. Si tu utilise autre chose, oublie pas de changer le GetPc...)
void main()
{
object oPC = GetPCSpeaker();
AssignCommand(oPC, ActionRest());
}
Ca devrait marcher assez bien... bien entendu, tu peut rajouter autant d'effet que tu veux dans ce petit bout de script pour declencher tout les effets que tu souhaite...
merci beaucoup!!!
Par rincevent le 18/10/2002 à 13:27:18 (#2357107)
si tu sais comment fair je t'en serai vraiment reconnaissant.
mais de toute façon merci pske ça marche super!
Par eMRaistlin le 18/10/2002 à 13:37:39 (#2357174)
pour l'interdiction de repos, je vais regarder, et j'edite mon post si je trouve...
(PS : Le assign command ne force pas cette interdiction ? Je le note, ca peut servir ^^)
Par rincevent le 18/10/2002 à 13:49:30 (#2357234)
merci encore
Par Symphonik le 18/10/2002 à 13:59:36 (#2357294)
Par eMRaistlin le 18/10/2002 à 14:10:45 (#2357347)
Donc, de 2 choses l'une :
- tu garde l'area en No rest, et tu fait un truc du genre ApplyEffect(ANIMATION_LOOPING_SIT_CROSS ) pour donner au PC l'illusion du rest (Le pc va s'assoir, et si tu rajoute un heal, il sera a fond en PV))
Le pb de cette solution : Les lanceurs de sorts ne recuperront pas leurs sorts... C'est un peu nul...
- Tu enleve le No-Rest, et tu affecte dans le script OnRest du module (verifie, mais je crois pas qu'il y ai de onRest dans l'area... si il y en a, utilise plutot celle de l'area) un truc qui utilise ca :
GetLastPCRested() pour avoir le dernier PC repose.
Comme ca, tu lui applique un truc pour le reveiller, ou pour spawner une creature a cote, ce qui va le reveiller (et l'attaquer, par la même occasion...)
Voila tout ce que je vois pour le moment...
Si tu decrivais un peu plus ce que tu veux, je pourrais eventuellement completer...
Par rincevent le 18/10/2002 à 14:23:07 (#2357419)
parce que le fait de pouvoir se reposer n'importe où je trouve ça un peu nul (c trop facile, entre chaque combat tu te repose et te voila frai et dispo pour passer l'angle du couloire) c un peu trop simple. voila j'esper avoir été claire dans mes explications.
Par eMRaistlin le 18/10/2002 à 14:28:26 (#2357449)
Bon, je m'y remet, puis je réédite au besoin...
Par eMRaistlin le 18/10/2002 à 14:47:59 (#2357551)
il te suffit de faire ceci :
OnRest :
void main()
{
//la, je declare les variables.
object oPC = GetLastPCRested();
object oFireCamp = GetObjectByTag("TAG_A_REMPLIR ")
//la, je dis que si le joueur est a plus de 2 metres d'un
//feu de camp dont le tag est TAG A REMPLIR, alors, pas de repos
if (GetDistanceBetween(oPC,oFireCamp)> 2.0f)
{
ClearAllActions();
FloatingTextStringOnCreature(oPC,"Impossible de se reposer si loin du feu de camps...",TRUE);
}
}
Je trouve que cette solution sera surement la plus elegante...
Par Thungril le 18/10/2002 à 14:50:44 (#2357565)
http://nwvault.ign.com/Files/scripts/data/1034739964250.shtml
Par eMRaistlin le 18/10/2002 à 14:56:54 (#2357599)
Par rincevent le 18/10/2002 à 15:01:52 (#2357624)
Par rincevent le 18/10/2002 à 15:09:24 (#2357666)
ERREUR : PARSING VARIABLE LIST
kes ça veu dir?
Par eMRaistlin le 18/10/2002 à 15:12:50 (#2357682)
void main()
{
//la, je declare les variables.
object oPC = GetLastPCRested();
object oFireCamp = GetObjectByTag("TAG_A_REMPLIR ");
//la, je dis que si le joueur est a plus de 2 metres d'un
//feu de camp dont le tag est TAG A REMPLIR, alors, pas de repos
if (GetDistanceBetween(oPC,oFireCamp)> 2.0f)
{
ClearAllActions();
FloatingTextStringOnCreature(oPC,"Impossible de se reposer si loin du feu de camps...",TRUE);
}
}
Desole, j'ai forget la virgule... desole...
Par rincevent le 18/10/2002 à 15:21:03 (#2357722)
sans ça, c vrailment sympat de m'aider dit le si t'en a mare!
Par eMRaistlin le 18/10/2002 à 15:27:37 (#2357759)
je sais je suis chiant mais ça marche tjour po!!
Comment ca ? un probleme de compilation, ou bien un probleme dans le jeu ?
PS : tu as bien pensé a remplacer le "TAG_A_REMPLIR " par le Tag de ton feu de camp ?sans ça, c vrailment sympat de m'aider dit le si t'en a mare!
t'inquiete pas pour ca ^^
Par rincevent le 18/10/2002 à 15:35:53 (#2357777)
ça me dit:
ERREUR : UNKNOWN STATE IN COMPILER
sur les deux déclaration de variable
si tu veus voila mon mail comme ça ça évite d'encombr de forum:
rincevent01@wanadoo.fr
merci encore
Par Symphonik le 18/10/2002 à 16:03:16 (#2357922)
FloatingTextStringOnCreature(oPC,"Impossible de se reposer si loin du feu de camps...",TRUE);
il me semble que la syntaxe correcte doit être :
FloatingTextStringOnCreature("Impossible de se reposer si loin du feu de camps...",oPC,TRUE);
Par eMRaistlin le 18/10/2002 à 16:08:08 (#2357954)
mince, grille sur le fil ^^
bon, je recapitule pour ceux qui lisent pas les post au debut :
OnRest du module :
void main()
{
object oPC = GetLastPCRested();
object oFireCamp = GetObjectByTag("TAG_A_REMPLIR");
float fDistance = GetDistanceBetween(oPC,oFireCamp);
if (fDistance > 2.0f)
{
AssignCommand(oPC, ClearAllActions());
FloatingTextStringOnCreature("Impossible de se reposer si loin du feu de camps...", oPC,TRUE);
}
}
[Edit : Clear AllActions => AssignCommand(oPC, ClearAllActions())]
Par rincevent le 18/10/2002 à 16:55:20 (#2358167)
je te doit une fiere chandelle
Par eMRaistlin le 18/10/2002 à 17:00:40 (#2358199)
void main()
{
object oPC = GetLastPCRested();
object oFireCamp = GetObjectByTag(" TAG_A_REMPLIR ");
float fDistance = GetDistanceBetween(oPC,oFireCamp);
if (fDistance > 2.0f)
{
AssignCommand(oPC, ClearAllActions());
FloatingTextStringOnCreature(" Impossible de se reposer si loin du feu de camps... ", oPC,TRUE);
SendMessageToPC(oPC,"Ca fonctionne pourtant") ;
}
else { SendMessageToPC(oPC, "La distance entre le pc et le feu de camp est : "+FloatToString(fDistance)) ;}
}
Par ruru666 le 24/10/2002 à 15:19:23 (#2397606)
Merci d avance...
Par eMRaistlin le 24/10/2002 à 15:58:10 (#2397881)
moi je voudrais un truc dans le style mais plus simple : un repos par jour SVP (la nuit si possible).
Euh, je veux bien, mais en fait, c'est terriblement pas plus simple ^^;
Par contre : Repos que la nuit ? ou Que la nuit en Exterieur, ou juste : une fois par jour, quelle que soit l'heure...?
J'ai besoin de renseignement, pasque si tu me dis 1 fois par jour, et que la nuit, un pC qui veut faire la grasse mat ne pourra pas du tout...
Par ruru666 le 24/10/2002 à 23:29:44 (#2401047)
Par eMRaistlin le 25/10/2002 à 1:06:35 (#2401540)
dans le OnPlayerRest :
void main()
{
object oPC = GetLastPCRested();
int nDejaDodo = GetLocalInt(oPC,"dodo");
if (nDejaDodo==0)
{
if (GetIsNight())
{
SetLocalInt(oPC,"dodo",1);
}
else
{
AssignCommand(oPC,ClearAllActions());
FloatingTextStringOnCreature("Il n'est possible de dormir que la nuit",oPC,FALSE);
}
}
else
{
AssignCommand(oPC,ClearAllActions());
FloatingTextStringOnCreature("Il n'est possible de dormir qu'une seule fois par jour",oPC,FALSE);
}
}
Puis, tu met ca dans le OnHeartBeat du module :
void main()
{
object oPC = GetFirstPC();
if (GetTimeHour()==19)
{
while (oPC != OBJECT_INVALID)
{
SetLocalInt(oPC,"dodo",0);
oPC = GetNextPC();
}
}
}
Avec l'heure de reset de la permission de Dodo a 19heure. Tu peut le modifier facilement (y'a qu'un 19 dans mon script... c'est le bon ^^)
Attention : non-testé... Eventuellement, je veux bien que tu me dise si c'est pas trop lourd (a cause du OnHeartBeat) ou si ca marche pas comme desiré...
Par ruru666 le 25/10/2002 à 8:41:28 (#2402201)
Par ruru666 le 25/10/2002 à 9:31:16 (#2402427)
Par eMRaistlin le 25/10/2002 à 10:01:32 (#2402600)
Essaye la meme chose, mais en chargeant un serveur avec ce module, et en te connectant a toi même.
Par ruru666 le 25/10/2002 à 10:26:34 (#2402767)
la journee impossible de dormir
des ke l heure arrive on pe dormir, et si on ve redormir un otre fois il me dis impossible une seul fois pa jour, apres cette interdiction il me laisse me reposer environ 3 fois avec un nivo 1 et 2 fois avec mon perso maitre de jeu nivo 20
j en conclus (car je ne suis pa programateur) kil me laisse dormir un laps de tps pendant la nuit autant de fois ke je ve, mais peutetre ais je tord...
Par mobidique le 25/10/2002 à 11:25:27 (#2403199)
Par eMRaistlin le 25/10/2002 à 11:44:04 (#2403353)
des ke l heure arrive on pe dormir, et si on ve redormir un otre fois il me dis impossible une seul fois pa jour, apres cette interdiction il me laisse me reposer environ 3 fois avec un nivo 1 et 2 fois avec mon perso maitre de jeu nivo 20
Et la nuit d'apres ? Il te bloque a nouveaux une fois ? ou pas du tout ?
Sinon, je pense que ca vient du OnHeartBeat.
ma gestion des repos
Par Symphonik le 25/10/2002 à 14:19:45 (#2404699)
Je mets ici ma façon de gérer les repos à titre d'information
c'est simpliste mais bon ca marche
Création d'un dialogue d_repos
Voulez-vous vous reposer ?
Oui -> execute le script s_repos_ok
Non -> quitte le dialogue sans rien faire
Script s_repos_ok (a n'attacher à rien de spécial, appelé par le dialogue d_repos)
void main()
{
object oPC=GetLastUsedBy();
SetLocalInt(oPC,"dodo",1);
AssignCommand(oPC,ActionRest());
}
Script s_repos (à mettre dans le OnUsed d'un objet, feu de camp, lit , etc)
void main()
{
BeginConversation("d_repos",GetLastUsedBy());
}
Script s_test_rest (à mettre dans le OnPlayerRest du module)
void main()
{
object oPC = GetLastPCRested();
int nDodo = GetLocalInt(oPC,"dodo");
int nDbltext= GetLocalInt(oPC,"evite_double_text");
if(nDbltext==1)
{
SetLocalInt(oPC,"evite_double_text",0);
return;
}
if(nDodo==1)
{
SetLocalInt(oPC,"dodo",0);
SetLocalInt(oPC,"evite_double_text",1);
}
else
{
AssignCommand(oPC,ClearAllActions());
FloatingTextStringOnCreature("Vous devez etre proximite d'un feu de camps",oPC,FALSE);
SetLocalInt(oPC,"evite_double_text",1);
}
}
En gros le perso ne peut se reposer que si il utilise un objet (feu de camp, lit, ce que vous voulez)
je pense que c'est le but de Rincevent je crois...
Par ruru666 le 25/10/2002 à 18:59:24 (#2407303)
Re: ma gestion des repos
Par rincevent le 26/10/2002 à 10:18:07 (#2410971)
Provient du message de Symphonik
En gros le perso ne peut se reposer que si il utilise un objet (feu de camp, lit, ce que vous voulez)
je pense que c'est le but de Rincevent je crois...
ben oui mais le script qu'il m'a donné marche tres bien pour fair ça... a moin que je me goure et que je ne l'ai pas assé testé??
JOL Archives 1.0.1
@ JOL / JeuxOnLine