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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

udf : Encore et encore !

Par Frolo Xeres le 10/11/2002 à 15:36:31 (#2524892)

Désolé d'aborder encore ce sujet mais là chui désespéré !
J'ai mis ce script dans le onHeartBeat d'une zone :


void main()
{
if( GetIsNight() ) {
if( !GetLocalInt( OBJECT_SELF, "NUIT" ) ) {
SetLocalInt( OBJECT_SELF, "NUIT", 1 );
event eSoir = EventUserDefined( 4000 );
// 4000 : 9H00 du soir, le soleil est couche, signal de Sommeil
SignalEvent( OBJECT_SELF, eSoir );

}
}
else if( GetIsDay() ) {
if( GetLocalInt( OBJECT_SELF, "NUIT" ) ) {
SetLocalInt( OBJECT_SELF, "NUIT", 0 );
event eMatin = EventUserDefined( 4001 );
// 4001 : 7H00 du mat' le soleil est leve, signal de Reveil
SignalEvent( OBJECT_SELF, eMatin );
}
}
}


Et celui-là dans des braseros qui sont dans cette zone ( sur le onUserDefined ) :


void main()
{
int nUser = GetUserDefinedEventNumber();

if( nUser == 4000 ) {
// Il est 20H00
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
DelayCommand(0.4,SetPlaceableIllumination(OBJECT_SELF, TRUE));
SetLocalInt(OBJECT_SELF,"NW_L_AMION",1);
DelayCommand(0.5,RecomputeStaticLighting(GetArea(OBJECT_SELF)));
}
else if( nUser == 4001 ) {
// Il est 6H00
PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
DelayCommand(0.4,SetPlaceableIllumination(OBJECT_SELF, FALSE));
SetLocalInt(OBJECT_SELF,"NW_L_AMION",0);
DelayCommand(0.9,RecomputeStaticLighting(GetArea(OBJECT_SELF)));
}
}


Et rien à faire, veulent pas s'allumer mes braseros !
Où elle est ma couille ?

Edit : J'ai testé avec 2000 et 2001 et avec sur le onHeartBeat du module. J'ai testé aussi sur des PNJ mais aucune réaction... Suis vraiment la pire des quiches sur le onUserDefined, Please some Help !

Par LeProctophantasmiste le 10/11/2002 à 19:22:31 (#2526929)

SignalEvent( OBJECT_SELF, eMatin ); tu signales l'événement à ta zone, les brazéros ne sont pas au courant :).

Pour ce genre de chose je te conseilles d'utiliser un objet que tu crèes quand un PJ rentre dans l'area (il faut tenir le compte des PJ qui y sont mais de façon généralle c'est utile), au lieu de l'area elle même. Cela économise du OnHeartbeat. Pour ton script ce n'est probablement pas la peine car, l'événement n'a pas lieu souvent, et tu y perdrais certainement, mais je me demande aussi s'il ne vaudrait pas parfois le coup de récupérer les références aux objets commandés sur l'OnSpawn de l'objet-commandant et de les lui attacher via un pseudo-tableu de local-object (GetObjectByTag a priori, ce n'est pas très économique). L'idéal, dans certaines situations, étant peut-être de créer l'objet sur le OnEnter et sur son OnSpawn de créer les PNJs (je parle de PNJ parce que c'est jgénéralement là que l'on a les scripts les plus lourds) à commander, tu te retrouves donc avec un contrôleur pour les PNJs de ta zône quand elle est active (puisque le CreateObject renvoie la ref de chaque objet créé tu peux facilement les stocker) et une zône quasi vide sinon. Attention toutefois, créer un objet via NWscript ne doit pas être une opération très légère, vu le nombre de propriété qu'ils ont et leur importance pour le moteur. A force cela pourrait même devenir visible pour les joueurs.

Par Frolo Xeres le 10/11/2002 à 19:57:53 (#2527304)

Un bon conseil que j'utiliserais surement ! Merci mais un problème à la fois !
Disons que mes braseros je peux les allumer autrement...
Bon... Mais par exemple j'ai une vieille dame qui passe son temps assis sur un banc. (ActionSit sur le onSpawn et sur le EndConversation) Le soir, hop elle va se coucher et le matin elle retourne s'assoir...
Attends... En écrivant j'ai eu une petite idée !
Si je la fait s'assoire sur le onEnter des PC !
Avec mon ActionSit sur le endConversation.
Et pour la faire rentrer-sortir, un POST et un NIGHT ou y faut !
J'essaye çà et je reviens !

Par Frolo Xeres le 10/11/2002 à 21:04:52 (#2528093)

Bon ma dernière idée marche au poil ! Mais j'ai toujours un problème !
Avec le code précédent sur le onHeartBeat du Module ( 2000 a la place de 4000 ) j'arrive pas a récupérer l'evenement (s'il est bien declanché ).
J'ai mis ce code sur un PNJ :


void main()
{
int nUser = GetUserDefinedEventNumber();

if( nUser == 2000 ) {
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
FloatingTextStringOnCreature( "Tiens il fait nuit !", oPC, FALSE );
}
}

Je suis allé voir mon PNJ et j'ai attendu le couche du soleil... la nuit... Et RIEN !
"Qu'est-ce -que j'ai fait de mal au M.D. ?" Pourquoi çà marche pas ?

Par Jedaï le 10/11/2002 à 21:20:11 (#2528266)

Soit j'ai mal compris ce que tu as dit :o , soit le problème est le même que la première fois :
Un UserDefinedEvent est caractérisé à la fois par un nombre et par un objet, auquel il est envoyé. Or dans ton premier script :


SignalEvent( OBJECT_SELF, eMatin );

se trouvant dans le OnHeartbat de la zone, le OBJECT_SELF renvoit la zone et l'évènement défini par l'utilisateur numéro 2000 de la ZONE est lancé, PAS celui de ton NPC.

Il faudra donc plutôt mettre à la place :


SignalEvent(GetObjectByTag("Tag_De_Ton_NPC"), EventUserDefined(2000));

(toujours dans le OnHeartbat de ta zone...)

ou mettre ton script, mais dans le OnHeartbat de ton NPC, où OBJECT_SELF renverra bien ce que tu veux.:cool:

Par Stan Kley le 10/11/2002 à 21:26:14 (#2528338)

o fait, pour en revenir a l'allumage des brasero, pq tu le ferai po fèr par un pnj ? le script existe, le voilà

////////////////////////////////////////////////
//:De Tenchi Masaki/Frank V. Schumacher
//:Traduit par MrCocktail pour NWN-fr.com
////////////////////////////////////////////////

void main()
{
object oLightSource = GetObjectByTag("StandingTorch_001");
{
if(GetIsDawn() == TRUE && GetPlaceableIllumination(oLightSource) == TRUE
|| GetIsDay() == TRUE && GetPlaceableIllumination(oLightSource) == TRUE)
{
if(IsInConversation(OBJECT_SELF) == FALSE
|| GetIsInCombat(OBJECT_SELF) == FALSE)
{
ClearAllActions();
ActionInteractObject(oLightSource);
DelayCommand(4.5, ActionRandomWalk());
}
}
else if(GetIsDusk() == TRUE && GetPlaceableIllumination(oLightSource) == FALSE
|| GetIsNight() == TRUE && GetPlaceableIllumination(oLightSource) == FALSE)
{
if(IsInConversation(OBJECT_SELF) == FALSE
|| GetIsInCombat(OBJECT_SELF) == FALSE)
{
ClearAllActions();
ActionInteractObject(oLightSource);
DelayCommand(4.5, ActionRandomWalk());
}
}
}
}


Le placeable Item de ce script (une torche(ici de tag "StandingTorch_001") ou tout objet donnant de la lumière) doit avoir le script "nw_02_onoff" activé dans ses propriétés de script sur le OnUsed.(et évidemment doit être usable!)

Le script ci dessus se place sur le OnHeartBeat du NPC

ps : ce script vien de nwn-fr.com je fé po de la pub, mé vu ke je cite un truc ki vien de chez eux....

Par Frolo Xeres le 10/11/2002 à 21:45:50 (#2528563)

M'excuses j'avais pas vraiment compris le udf.
Au départ je croyais que le signal partais et que tous les objets du module pouvais le recevoir ! ( Imaginez le bordel : à chaque signal parcourir tous les objets et verifier qu'ils traitent pas le signal dans leur udf )

DSL pour mon ignorance, comprends mon erreur merci !

J'y retourne...

Edit : Détail interessant 'Stan' et tous les autres, si tu met ton code entre les balises php et /php avec les crochets autour ( m'enfin si je les mets tu les verra plus ) il est tout coloré, c'est quand même plus joli !

Par Stan Kley le 11/11/2002 à 21:31:13 (#2538630)

ok merci, on avait jamais pensé a me le dire :mdr:
a+

Par coolstar le 12/11/2002 à 8:54:02 (#2541818)

Y'a ce qu'on appelle le Constat Autonome... :ange:

;)

JOL Archives 1.0.1
@ JOL / JeuxOnLine