[Info - script] Eclairage dynamique.

Répondre
Partager Rechercher
Je n'avais pas trouvé de sujet de topic là-dessus (enfin si, mais avec un script qui ne marche pas ), donc j'ai cherché un peu ce matin : comment modifier dynamiquement l'éclairage d'une case ?

Dans la théorie, c'est tout simple, nous avons les fonctions SetTileMainLightColor(location lTileLocation, int nMainLight1Color, int nMainLight2Color) et SetTileSourceLightColor(location lTileLocation, int nSourceLight1Color, int nSourceLight2Color) (qui fonctionnent de paire avec les GetTile..etc).

Dans le toolset, on sait qu'on peut modifier l'éclairage d'une case avec un clic droit dessus en mode terrain.
Dans un script, pour modifier dynamiquement l'éclairage de la case d'un PJ, je me suis dit qu'on pouvait faire quelque chose comme ça :
Code PHP:

location lPlayer GetLocation(oPlayer);
SetTileSourceLightColor(lPlayer00);
// 0, 0, c'est black et black.
// On peut bien sûr passer par les constantes TILE_MAIN_LIGHT_COLOR_BLACK et autres,
// mais ce sera moins touffu comme ça 
C'est insuffisant, il faut en fait forcer les joueurs à recalculer l'éclairage local pour que les modifications soient prises en compte. On rajoute donc :
Code PHP:

RecomputeStaticLighting(GetArea(oPlayer)); 

Et ça ne marche pas non plus.

Le truc, c'est que l'éclairage n'est pas géré par location, mais par position sur la grille en cases de la zone. L'aide dit : lTileLocation: the vector part of this is the tile grid (x,y) coordinate of the tile.
Donc le GetLocation sur le PJ ne fonctionne pas... Ca paraît bête une fois qu'on le sait, mais vu que c'est un cas particulier, c'est bon à savoir.

En gros, il faut paramétrer sa location à la main, comme ça par exemple :
Code PHP:

object oArea GetArea(oPlayer);
vector vTile GetPosition(oPlayer);
vTile.vTile.10;
vTile.vTile.10;
location lTile Location(oAreavTile0.0); 
GetPosition renvoie la position vectorielle en mètres, on divise par dix pour la convertir en cases sur la grille (dans l'idée : une zone de 10 cases de large fait 100m de large). On ne s'intéresse ici qu'aux x et y, le z ne change évidemment rien sur la grille (du moins je crois pas). Et la location est créée à partir de la zone, du vecteur de coordonnées sur la grille et de l'orientation (je mets 0.0, cette donnée n'a aucune importance pour l'éclairage).

Au final, ça nous fait donc quelque chose comme :
Code PHP:

object oArea GetArea(oPlayer);
vector vTile GetPosition(oPlayer);
vTile.vTile.10;
vTile.vTile.10;
location lTile Location(oAreavTile0.0);
SetTileSourceLightColor(lTile00);
RecomputeStaticLighting(oArea); 
On peut s'amuser à faire des fade to black, des changements de couleurs variés, ou des clignotements, mais il faut penser à mettre le Recompute à chaque changement (ce qui peut faire ramer, donc). A noter que les TILE_MAIN_LIGHT_COLOR_* et TILE_SOURCE_LIGHT_COLOR_* sont des valeurs parmi une liste réduite, et on ne peut pas à ma connaissance donner à une case une valeur différente de celles-ci (avec les composantes RVB par exemple). Il faut jouer avec les deux Main et les deux Source, et avec les cases adjacentes.


Il me reste un problème de taille : l'éclairage inclus dans les tileset. Pour les placeables, no problemo, on a SetPlaceableIllumination (à 'recomputer' aussi à chaque changement). Mais pour ce que l'éditeur désigne comme "Animation" 1, 2, 3, dans les propriétés d'une case ? Les bougies, les torches, par exemple (du tileset, toujours). Je n'ai pas encore trouvé de moyen de les modifier en script, je ne sais pas comment y accéder... Si quelqu'un a une idée...
Citation :
et SetTileSourceLightColor(location lTileLocation, int nSourceLight1Color, int nSourceLight2Color) (qui fonctionnent de paire avec les GetTile..etc).
la voila ta solution..
sert toi de SetTileSourceLightColor

a ce propos je voudrait un script qui a la nuit tomber éclaire toutes les source lumineuse (des tiles donc) de ma zone(16*16) et au petit jour qu'il éteigne toutes ces sources lumineuse..

je suppose qu'il faut se servir de GetIsDay/GetIsNight
mais ou placé ce script pour qu'il prenne le moins de resources possible ?
j'ai penser au OnEnter de la zone mais une fois un PJ entrer si la nuit tomber cela ne va pas marcher...
je pense que le mieux et de se servir d'un PNJ dans la zone...
bref je veux éviter le OnheartBreat surtout si il doit recalculer les lumière toute les 6 seconde ca sera injouable .
ba si, onheartbeat c'est très bien, tu met des return aux endroits stratégiques et hop

est ce que ca ne marcherais pas :

Code PHP:

void main()
{
int nAllu GetLocalInt(OBJECT_SELF"ALLUME");
if((
GetIsNight() && nAllu) || (GetIsDay() && (!nAllu))) return;
else
if(
GetIsNight() && (!nAllu) )
{
//alumer les lampes
SetLocalInt(OBJECT_SELF"ALLUME"TRUE);
}
else if(
GetIsDay() && (nAllu))
{
//eteindre les lampes
SetLocalInt(OBJECT_SELF"ALLUME"FALSE);
}

??
L'éclairage et les animations sont pô la même chose.

Faites gaffe, ya des brasiers dans certaines tuiles qui ne sont pô des sources de lumière, ce sont des animations.

Prenons par exemple "Plate-forme 3" du tileset crypte. Nous avons deux brasiers, chouette! Mais SetTileSourceLightColor n'y peux rien du tout. Ces brasiers sont des animations.
Je dis ça histoire d'éviter des méli-mélo dans le sujet

Maintenant pour répondre à Gadjio, ben heu... non il n'existe pô de moyen de modifier l'animation d'une tuile ou plutôt non je n'ai rien trouvé

Il semble que ce soit un gros oubli, c'est vraiment zarbi

Enfin nous plaignons pô, avant c'était pire: les constantes de couleurs ne correspondaient pas du tout à ce qu'on cherchait à faire, du noir faisait du blanc et pour le noir il fallait utiliser 255

Tout de même, si quelqu'un avait un truc pour lancer ou arréter l'animation d'une tuile, ça serait bigrement intéressant
ca y est j'ai trouver ce script, je l'avait vu passé dans Maskado mais une recherche approfondi n'a rien donner.
trouver sur NWN.fr
Code PHP:

/////////////////////////////////////////////////
//:Dynamic Area Lighting Change
//:par Rehevkor (jcestep17@hotmail.com)
//:Traduit modifié par MrCocktail pour NWN-fr.com
/////////////////////////////////////////////////

void main()
{    
    
//Déclaration des variables de pointage des tiles dans la map
    
vector vTile Vector(0.00.00.0);
    
location lTile Location(GetObjectByTag("AreaTag"0), vTile0.0); //tag de votre area
    
float fx 0.0;
    
float fy 0.0;
    while ((
fx XX.0) && (fy YY.0))//mettez vos valeurs
    
{
        
vTile Vector(fxfy0.0);
        
lTile Location(GetObjectByTag("AreaTag"0), vTile0.0); //Tag de votre aera
        
SetTileMainLightColor (lTileCOULEUR QUE TU VEUXCOULEUR QUE TU VEUX);
        
SetTileSourceLightColor (lTileCOULEUR QUE TU VEUXCOULEUR QUE TU VEUX);
        
fx fx 1.0;
        if(
fx >= XX.0)//vos valeurs
        
{
            
fy fy 1.0;
            
fx 0.0;
        }
    }
    
RecomputeStaticLighting(GetObjectByTag("AreaTag")); //Votre aera tag encore

Citation :
Tout de même, si quelqu'un avait un truc pour lancer ou arréter l'animation d'une tuile, ça serait bigrement intéressant
A mon avis (qui ne vaut rien), ça n'est pas possible , le truc avec les décors statiques, c'est qu'ils ont tendance à être, ben... statiques.

Il faudrait peut être partir de tiles vierges. Danmar a l'air d'avoir trouvé un exécutable très pratique pour riper les tiles... Malheureusement je n'ai rien compris :bouffon:
Great Tool for Tileset "Blanker" Modders
Tiens, en relisant le post, me pose une question dont la réponse doit être facile à obtenir en testant.

Sur les placeables "lumineux", on peut placer un script "on/off", avec un Recomputemachin dedans, ça fonctionne nickel. Le problème c'est quand on donne au placeable l'attribut "off" dans l'éditeur, car visiblement il recompute pas automatiquement et par défaut on a un joli halo sur la lampe ou le chandelier éteints... Ensuite, on peut allumer et re-éteindre, et là ça efface le halo en trop (je suppose que c'est à cause du recalcul des éclairages inclus dans le onUse).

Question : quelqu'un a une méthode simple et efficace pour éviter ces halos sur les lampes éteintes ? (je précise : il n'y a pas d'événement onSpawn sur les placeables ).
Dans le OnEnter de ta zone, ça doit pouvoir marcher:

Code PHP:

void main() {
    
object oPC GetEnteringObject();
    
object oArea GetAreaoPC);
    
object oPlaceable GetFirstObjectInAreaoArea);
    
int bFirstEnter GetLocalIntoArea"FIRST_ENTER");

    if (!
bFirstEnter) {
        while (
GetIsObjectValidoPlaceable)) {
            if (
GetPlaceableIlluminationoPlaceable)) {
                
AssignCommandoPlaceablePlayAnimationANIMATION_PLACEABLE_DEACTIVATE));
                
SetPlaceableIlluminationoPlaceableFALSE);
                
SetLocalIntoPlaceable"NW_L_AMION"0);
                }
            
oPlaceable GetNextObjectInAreaoArea);
            }
        
RecomputeStaticLightingoArea);
        
SetLocalIntoArea"FIRST_ENTER"TRUE);
        }
    } 
Quand un PJ entre dans la zone pour la première fois, un script fait le tour de tous les objets, y compris les créatures et les plaçables non-illuminés.
Ceux qui sont allumés, on les éteint.
Au prochain OnEnter, le script ne sera pas executé à cause d'une variable locale.
À noter que le recompute est lancé après que tous les objets ont été passé au crible.

Dit-moi comment ça marche
Le OnSpawn s'émule pour les placeables grâce au OnHeartBeat et à l'utilisation d'une variable locale.

Code PHP:

void main()
{
     if(
GetLocalInt(OBJECT_SELF"OnSpawn"))
          return;

     
SetLocalInt(OBJECT_SELF"OnSpawn"1);

     
//etc.

Mais mettre un recompute des éclairages là dedans ne donnerait rien, puisque RecomputeStaticLightning fait effet uniquement aux PJs se trouvant dans la zone ou se trouve le placeable qui appelle la fonction.

Et qu'on ne me dise pas que ce OnHeartBeat va manger du processeur
Moui, enfin créer une variable locale à chaque fois, c'est un peu barbare. Bon, quand ça vaut le coup, je dis pas... (Pour Taern)

En fait, le RecomputeStaticLighthning ne vire pas le halo, donc ça règle le problème. :/ Il faut passer par un SetIllumination false, comme propose Skanzo. Ca oblige à une gestion plus poussée si on veut pas tout éteindre dans la zone et surtout à se recopier le onEnter à chaque fois pour les zones avec des bougies éteintes (ce qui n'est pas si rare). Bref, rêvons qu'un jour ils nous corrigent ça.
bon je vous met la un script tester qui marche.
je me suis servi du script que j'ai proposer plus haut en le combinant avec celui de Reyan.
(pour l'éclairage des tiles d'une zone)
Code PHP:

void main()
{
    
//Déclaration des variables de pointage des tiles dans la map
    
vector vTile Vector(0.00.00.0);
    
object area GetArea(OBJECT_SELF);
    
location lTile Location(areavTile0.0); 
    
float fx 0.0;
    
float fy 0.0;
    
int nAllu GetLocalInt(OBJECT_SELF"ALLUME");
    if((
GetIsNight() && nAllu) || (GetIsDay() && (!nAllu))) return;
    else
    if(
GetIsNight() && (!nAllu) )
    {
    while ((
fx 16.0) && (fy 16.0))//mettez vos valeurs
    
{
        
vTile Vector(fxfy0.0);
        
lTile Location(areavTile0.0); 
        
SetTileSourceLightColor (lTile,TILE_SOURCE_LIGHT_COLOR_WHITE,TILE_SOURCE_LIGHT_COLOR_WHITE);
        
fx fx 1.0;
        if(
fx >= 16.0)//vos valeurs
        
{
            
fy fy 1.0;
            
fx 0.0;
        }
    }
    
RecomputeStaticLighting(area);
    
SetLocalInt(OBJECT_SELF"ALLUME"TRUE);
    return;
    }
    else if(
GetIsDay() && (nAllu))
    {
    while ((
fx 16.0) && (fy 16.0))//mettez vos valeurs
    
{
        
vTile Vector(fxfy0.0);
        
lTile Location(areavTile0.0); 
        
SetTileSourceLightColor (lTile,TILE_SOURCE_LIGHT_COLOR_BLACK,TILE_SOURCE_LIGHT_COLOR_BLACK);
        
fx fx 1.0;
        if(
fx >= 16.0)//vos valeurs
        
{
            
fy fy 1.0;
            
fx 0.0;
        }
    }
    
RecomputeStaticLighting(area);
    
SetLocalInt(OBJECT_SELF"ALLUME"FALSE);
    return;
    }

a placer dans le OnEnter des propriété de la zone.

il reste a trouver une solution au cas ou un pj reste assez longtemps dans la zone et que personne y rentre...
je pense qu'on peut mettre ce script sur un OnUsed d'un placeable qu'un pnj viendra activer a des heures précise SI un pj est détecter dans la zone.
mm, pk dans un onenter ?
parce que là, étant donné que y a un return; au bout d'un test, ca doit aps trop manger de ressources si ?
parce que si un if par zone toute les six seconde ca fait ramer ...
là, à moins qu'il y ait des trucs à allumer/éteindre, c a d une fois toutes les 12h, ca arrête tt de suite le script ...

je doute là, c'est vraiment si dangereux que ca onheartbeat
a vrai dire j'ai fait des essais sur le OnHeartBeat de la zone en question.
me suis dit youpi ca marche au début ensuite il m'est arriver un truc vraiment bizarre.
je suis sortie donc de ma zone de ville pour une zone campagne.
et quand je me suis approcher de la porte donnant sur la ville je me suis aperçu qu'il me faisait des recomputestaticlight là a la
campagne. ??? vraiment j'ai pas trop compris.
ceci dit je vais refaire des testes sur OnHeartBeat....
sinon j'avais penser au pnj qui a l'aube et au crépuscule enclenchait 1 placeable avec le script; dans le OnUsed du placeable.
heing ?
t t dans une autre zone, avec chargement entre les 2 zone et tt, sans ce script, et ca faisait des recompute chose ?

et ton PNJ, ca peut être marrant, très même, voir même RP, mais ... ca change rien si ?
parce que puisqu'il n'y a pas d'event OnDay, ba t bien obligé de tester ca dans un onheartbeat, de toute facon ... alors bon ... que ce soit

area = OBJECT_SELF

ou

area = GetArea(OBJECT_SELF);

je vois pas trop la différence si celui la marche mal, y a surement une bonne raison, et rien ne dit que "déléguer" ton onheartbet changeras qq chose .. si ?
bon quand je le met dans le ONHeartBeat il calcul bien quand j'arrive mais aprés il me fait toujours les recompute sans que la lumiere change.
j'ai lu sur les forums de bio que les constante TILES_SOURCES_light...ect on un bug, ca peut venir de la....

sur le OnEnter ca marche quand moi je sort et rentre dans la zones, parcontre quand un pnj sort et rentre ca me fait le même probleme. recompute sans changement de light...

d'ou ma question : es-ce que les settiles...change bien la valeur des sources des tiles quand un PJ est dans la zone ?
je suis pas fortiche en anglais mais j'ai compris sur les forumsbioware qu'on pouvait changer l'éclairage des tiles facilement avec : SetTileSourceLightColor

mais il y a un bug quand on veut remettre les sources de lumières en noir ...

PS: si quelqu'un de + doué en anglais que mois veut jeter un oeil sur les forums de bioware (en faisant une recherche avec :SetTileSourceLightColor).
on trouve un sujet a lire sur la question.

PPS : bizarre quand même avec mon script + haut & avec les lumières éclairer par défaut dans le toolset en arrivant cela a éteins toutes les lumières de la zone mais j'arrive plus a le refaire.

bref c'est comme pour les illuminations de placeables c'est pas au point. j'espère que bio va remédier a cela un de ces 4 quand même.


moi qui me lance a chaque fois dans le toolset en me disant je vais faire des lumiere réalistes ben je suis B*****.
bref le laisse tomber ce sujet pour l'instant pis je passe autre chose
Citation :
Provient du message de Gadjio
Moui, enfin créer une variable locale à chaque fois, c'est un peu barbare. Bon, quand ça vaut le coup, je dis pas... (Pour Taern)

En fait, le RecomputeStaticLighthning ne vire pas le halo, donc ça règle le problème. :/ Il faut passer par un SetIllumination false, comme propose Skanzo. Ca oblige à une gestion plus poussée si on veut pas tout éteindre dans la zone et surtout à se recopier le onEnter à chaque fois pour les zones avec des bougies éteintes (ce qui n'est pas si rare). Bref, rêvons qu'un jour ils nous corrigent ça.
Le problème est identifié : en fait ce halo apparaît systématiquement dès qu'on quitte la zone et que l'on revient. Il faut donc laisser le truc du onEnter s'activer à chaque fois, ce qui est bien lourdingue. Le bug est repertorié par Bioware (en gros on ne peut pas avoir de placeables éteints qui ne brillent pas).
Répondre

Connectés sur ce fil

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