[Aurora] Lumières désactivées

Répondre
Partager Rechercher
J'ai un petit soucis avec les plaçables "éclairants" (candélabre, chandelles etc...). J'ai un script qui permet au pj de les allumer qui s'il est équipé d'une torche.

Je crée donc ma zone, je met dans les options, "éclairage de torche uniquement" et dans les propriétés des plaçables, "état initial sur désactivé".

Je contrôle ma zone en jeu pour contrôler mon script (lui fonctionne) mais, horreur et damnation, les plaçables, malgrès qu'ils soient désactivés, émettent de la lumière... Bien, que l'animation des flammes soit off .

Etat initial du plaçable dans ma zone (désactivé en entrant):
Sc_torche01.jpg

Etat du plaçable "actif" normalement:
Sc_torche02.jpg

Alors là, je comprends pas????
Est ce un bug Bioware?
Y a t'il un moyen d'y remédier?

Merci d'avance
oui... c'est un bug qui date de la premiere version de nwn qui n'a jamais été corrigé... tu peux 'essayer' (normalement ça corrige le probleme, mais pas tous le temps... ) de corriger le probleme en collant un

RecomputeStaticLighting(GetArea(OBJECT_SELF));

à la fin du script qui permet d'allumer/eteindre tes placeables...

mais ça ne corrigera le probleme que pour les pj qui sont DANS la zone...

normalement pour ça gere le probleme correctement, il faut en coller à chaque fois qu'un perso entre dans la zone (sur un trigger innevitable devant le pts d'entree par exemple, pas dans le onenter de la zone)
Juste une petite remarque : RecomputeStaticLighting est *extrêmement* gourmand en ressources CPU (dans une zone 32x32, tu peux aller te préparer un café hehe). Utiliser cette fonction en multijoueur est déconseillé.

Tu peux peut-être trouver chaussure à ton pied en utilisant les placeables avec "no ambient light" de SOU. Ces objets sont bien des sources de lumières, mais non "diffusantes".
Bon, oki, les "No ambiant light" règlent le problème de bug et le scripte d'allumage fonctionne... de ce côté, c'est impeccable.

Le seul petit (enfin... pas si petit que ça) que j'y vois, c'est que même allumé, le pj reste toujours dans le noir ... donc je vois pas pourquoi, il s'amuserait à tout allumer juste pour recréer une ambiance 'Halloween"

Alors, je me demandais si il n'y avait pas moyen de lancer un effet de lumière sur l'objet pendant l'allumage avec par exemple la fonction void ApplyEffectToObject()... mais j'avoue que là, ça dépasse un peu mes compétences

Le script de départ:
Code:
  void main()
{
// récupère l'état d'illumination
object oSource = OBJECT_SELF;
int iIllumine = GetPlaceableIllumination(oSource);

// Le placeable émet de la lumière ?
if (!iIllumine)
 {
//Verifie que le PC a une torche
   object oPC = GetLastUsedBy();
   if(GetTag(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC))=="NW_IT_TORCH001")
   {
   PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
   DelayCommand(0.4,SetPlaceableIllumination(oSource, TRUE));
   DelayCommand(0.5,RecomputeStaticLighting(GetArea(oSource)));
   }
   else
   {
   SpeakString ("Vous avez besoins d'une flamme pour allumer");
   }
 }
// Le placable est eteint
else
 {
   PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
   DelayCommand(0.4,SetPlaceableIllumination(oSource, FALSE));
   DelayCommand(0.9,RecomputeStaticLighting(GetArea(oSource)));
 }
}
Si quelqu'un avait une idée?

en même temps, comme toute source de lumière n'est pas inépuisable (on a pas encore inventé l'électricité), je me demandais si on ne pouvais pas limiter l'effet sur par exemple un jet de réflexe de l'objet et après épuisement du temps... impossible de le rallumer... est ce possible à votre avis?
Code PHP:

//::///////////////////////////////////////////////
//:: Light
//:: NW_S0_Light.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Applies a light source to the target for
    1 hour per level
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Aug 15, 2001
//:://////////////////////////////////////////////
//:: VFX Pass By: Preston W, On: June 22, 2001

void main()
{
  
//Declare major variables
  
object oTarget GetSpellTargetObject();
  
effect eVis EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20);
  
effect eDur EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
  
effect eLink EffectLinkEffects(eViseDur);

  
int nDuration GetCasterLevel(OBJECT_SELF);
  
int nMetaMagic GetMetaMagicFeat();
  
//Enter Metamagic conditions
  
if (nMetaMagic == METAMAGIC_EXTEND)
    {
      
nDuration nDuration *2//Duration is +100%
    
}
  
//Fire cast spell at event for the specified target
  
SignalEvent(oTargetEventSpellCastAt(OBJECT_SELFSPELL_LIGHTFALSE));

  
//Apply the VFX impact and effects
  
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeLinkoTargetHoursToSeconds(nDuration));

Je pense qu'on doit pouvoir se servir de ce sort afin de n'utiliser que les effets dont tu as besoin. J'avancerai bien effect eVis = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20); mais il manque peut-etre autre chose (en dehors du ApplyEffectToObject())
Je pense que ton idée devrait marcher, Gaeriel, si le joueur "lance le sort sur le placeable", mais est-ce qu'il n'y avait pas un bug du sort lumière qui limitait la vision au lanceur seul ?

En clair, si le joeur allume la chandelle, est-ce qu'il sera le seul à bénéficier de la lumière ?

EDIT : J'ai fait une recherche pour Clarice, et j'ai trouvé ceci sur le Vault :

http://nwvault.ign.com/Files/scripts...88259389.shtml

C'est malheureusement en Anglais, et j'avoue ne pas l'avoir parcouru extensivement. Ca ressemble quand même furieusement à quelque chose qui devrait pouvoir t'aider.
Je ne pensais pas utiliser le sort mais juste la partie effect. De plus, je pensais que ce serait le placeable qui lancerait l'effet sur lui meme. Mais bon, je pense que le script trouve par Cheyenne sera interessant. J'ai pas tout suivi mais apparement ca remplace les placeables (j'suis pas sur hien j'ai pas tout lu )
Et ben voilà un ptit script permettant d'allumer et d'éteindre des plaçables "No ambiant light" supprimant ainsi le bug bioware des plaçables à diffusion de lumière .

Il utilise je let de réflexe de l'objet pour déterminer sa durée d'allumage, les valeur de temps données en exemple dans le script sont pour le réglage 20 min irl = 1 heure in game .

Code PHP:

void main()
{
object oPC GetLastUsedBy();
object oSource OBJECT_SELF;
int nRef GetReflexSavingThrow(OBJECT_SELF);
effect eVis EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_20);
effect eDur EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink EffectLinkEffects(eViseDur);
float fDelay IntToFloat(StringToInt(IntToString(nRef)+"00"));
   
/* Le score de Réflexe détermine la durée de vie de la bougie. 1 point correspond à 5 minutes.
       6 heures 72
       5 heures 60
       4 heures 48
       3 heures 36
       2 heures 24
       1 heure  12
      30 minutes 6
      15 minutes 3
       5 minutes 1  */

// Le placeable émet de la lumière ?
effect eActif GetFirstEffect(oSource);
if (!
GetIsEffectValid(eActif))
 {
  
//Verifie que le PC a une torche
  
object oPC GetLastUsedBy();
  if(
GetTag(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC))=="NW_IT_TORCH001")
   {
    
// Le placeable n'émet pas de lumière, on active la source
    
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
    
DelayCommand(fDelay,PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeLinkoSourcefDelay);
   }
  else {
SpeakString ("Vous avez besoins d'une flamme pour allumer");}
 }
else
 {
  
// Le placeable émet de la lumière, on coupe la source.
  
PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
  while(
GetIsEffectValid(eActif))
   {
    {
RemoveEffect(oSourceeActif);}//Suppression des effets.
   
eActif GetNextEffect(oSource);
   }
 }

PS: je suis pas une pro du script et j'ai pas fait ça toute seule comme une grande . Merci Archa pour ce script, je t'aime tout plein
Je suis en train de coder un truc similaire, justement. N'ayant pas SOU, j'ai fait un double des placeables avec "ambiant light" pour en avoir une version sans halo (via hakpak.. si quelqu'un en veut, je le file, c'est tout simple).

Le problème du dernier script me paraît que le RemoveEffect ne fonctionne (à ma connaissance) que sur les créatures, et je n'ai jamais réussi à retirer un effet sur un de mes placeables. Quelqu'un confirme qu'on peut ? (le temps que ce dernier script soit dûment testé )

Moi je passe d'un objet "ambiant light" à un "no ambiant light" via Create/DestroyObject, ça marche plutôt bien. On peut faire un Recomputate derrière, ça mange largement moins de ressources que les EffectLight (le sujet avait été évoqué ici : placeables illuminés). Le Create/Destroy peut aussi servir pour nettoyer les effets (mais si on peut faire fonctionner RemoveEffect, c'est encore mieux).

Pour ce qui est des réglages 1 min irl = x min ingame, c'est plus propre de passer par des RoundToSecond qui sont là pour ça.

__

Edit: après relecture, mon histoire de Destroy/Create pour passer d'un objet à halo à un objet sans halo n'est pas claire. L'idée est que les placeables éteints seront transformés en placeables sans halo, et les placeables allumés en placeable avec halo. Si quelqu'un entre dans la zone, il verra des halos sur les placeables allumés, point.

J'avais pensé à l'origine faire le Recomputate sur une AreaOfEffect autour de placeable concerné, mais je ne sais pas bien m'en servir et j'ai eu l'idée des placeables sans halo avant de finir de le débuguer (c'est même pas une idée repompée sur SoU ). Franchement, le Recomputate est loin d'être trop gourmand en ressources, et je dis ça avec mon Duron 700 et ma GeForce 2 Mx.. (bon, c'est sûr que si c'est pour le placer sur le onHB )
Citation :
Edit: après relecture, mon histoire de Destroy/Create pour passer d'un objet à halo à un objet sans halo n'est pas claire. L'idée est que les placeables éteints seront transformés en placeables sans halo, et les placeables allumés en placeable avec halo. Si quelqu'un entre dans la zone, il verra des halos sur les placeables allumés, point.
Tiens, voilà une idée qu'elle semble intéressante.

Est-ce que j'ai bien compris ta façon de faire ?

Placeable A - allumé, avec halo
Placeable B - éteint, sans halo

1- le joueur arrive, et voit la lumière de "A" -> le halo est présent
2- le joueur éteint la lumière, on détruit "A" et on crée "B" -> le halo a disparu (sans "Recompute" ? ou avec ? )

J'avais fait un test rapide, dans un zone désertique 32x32, complètement vide à l'exception d'un feu de camp.

En éteignant le feu de camp, j'avais lancé un "Recomute" et ça m'avait pris des lustres, ceci sur un Athlon 2.0 Ghz, 1 Go Ram

Je vais refaire un test, mais à vrai dire, j'aimerai vraiment pouvoir me passer de cette fonction.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés