commande de plusieurs srcipts par massage

Répondre
Partager Rechercher
Bonjour à tous

J'ai réalisé un chandelier composé de plusieurs prims : il y a le corps (en root prim) ainsi que 6 sources lumineuses (chacune a un script particules de ce type : http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryKeknehvParticles)...

j'aimerai qu'en touchant le chandelier, on puisse allumer/éteindre les 6 lumières en même temps... J'ai donc pensé que je pourrais utiliser un link message dans le root prim disant "light on" et "light off"… :
Code PHP:

default
{
    
touch_start(integer total_number)
    {
             
llMessageLinked(LINK_SET0"Light on"NULL_KEY);
        
state a;
    }
}
state a
{
    
touch_start(integer total_number)
    {
             
llMessageLinked(LINK_SET0"Light off"NULL_KEY);
        
state default;
    }

par contre, dans le code des particules, comment puis-je ajouter ces 2 états ? ("light on" et "light off") ???

Quelqu'un saurait-il comment je pourrais résoudre ce problème ? existe t'il une solution plus simple que le llMessageLinked ?

Merci par avance
Je sais pas, je n'utilise jamais les "states" mais j'aurais procédé par commande vocale :

Chaque prim écoute le canal 0 (ou un autre) et s'allume ou s'éteind suivant l'ordre "vocal" qui reçoit sur ce canal.

Ce qui doit s'écrire quelque chose comme (pas testé) :

state_entry()
{
llListen(0,"",NULL_KEY,"");
}

listen(integer channel, string name, key id, string message)
{
if(message=="on") { MakeParticles(); }
if(message=="off") { llParticleSystem([]); }
}

Et si tu veux utiliser un interrupteur il suffit qu'il llWhisper quand on le touche pour commander l'allumage de tous les prims.
Éviter d'utiliser les messages globaux quand ça n'est pas nessessaire, surtout le canal 0. Si vraiment vous êtes obligés de vous en servir, utilisez des filtres plutôt que d'intercepter n'importe quoi et de faire le tri en LSL.

Les liens de messages sont plus fiables, plus rapides, laguent moins et ne spamment pas. Ils engendre en évenement link_message() sur les scripts des prims sélectionnés.

Code:
link_message(integer sender_num, integer num, string str, key id) {
   if (message == "Light on") { 
      code pour alumer
   } else if (message == "Light off") {
      code pour eteindre
   }
}
Voir http://rpgstats.com/wiki/index.php?title=Link_message

Pour le script maître, il vaut mieux placer l'initialisation de l'état dans la partie ad-hoc que dans l'évenement déclancheur:

Code:
default {
  state_entry() {
     llMessageLinked(LINK_SET, 0, "Light on", NULL_KEY);
  }
  touch_start(integer total_number) {
     state a;
  }
}

state a {
  state_entry() {
     llMessageLinked(LINK_SET, 0, "Light off", NULL_KEY);
  }
  touch_start(integer total_number) {
     llResetScript();
  }
}
Citation :
Publié par Narita
Les liens de messages sont plus fiables, plus rapides, laguent moins et ne spamment pas. Ils engendre en évenement link_message() sur les scripts des prims sélectionnés.
Si je disais ça c'était surtout pour pouvoir commander les lampes à distance avec un objet interrupteur qui ne serait pas lié aux lampes pour par exemple allumer toutes les lampes d'une maison à partir d'un seul interrupteur.
Merci beaucoup Narita et Jideuze pour vos conseils

Je suis pour l'instant parti sur l'idée de Narita mais je ne suis malheureusement pas trés doué, j'ai tenté de compiler mon script de particules avec le script link_message mais je recois un message : erreur de syntaxe...

Voici le script que j'ai modifié : je n'arrive pas du tout à comprendre mon erreur:
Code PHP:

MakeParticles() 
{                
    
llParticleSystem(
    [
PSYS_PART_FLAGS,PSYS_PART_INTERP_COLOR_MASK PSYS_PART_INTERP_SCALE_MASK,
 
PSYS_SRC_PATTERNPSYS_SRC_PATTERN_DROP,
 
PSYS_PART_START_ALPHA1.0,
 
PSYS_PART_START_COLOR, <1.01.01.0>,
 
PSYS_PART_END_ALPHA1.0,
 
PSYS_PART_END_COLOR, <1.01.01.0>,
 
PSYS_PART_START_SCALE, <1.01.00>,
 
PSYS_PART_END_SCALE, <1.01.00>,
 
PSYS_SRC_ACCEL, <000>,
 
PSYS_SRC_OMEGA, <000>,
 
PSYS_PART_MAX_AGE2.0
 
PSYS_SRC_MAX_AGE0.0,
 
PSYS_SRC_ANGLE_BEGIN0.0,
 
PSYS_SRC_ANGLE_END3.14,
 
PSYS_SRC_BURST_PART_COUNT1,
 
PSYS_SRC_BURST_RADIUS1.0,
 
PSYS_SRC_BURST_RATE1.0,
 
PSYS_SRC_BURST_SPEED_MIN0.0,
 
PSYS_SRC_BURST_SPEED_MAX0.0,
 
PSYS_SRC_TEXTURE"" ]
 );
}
link_message(integer sender_numinteger numstring strkey id
{
   if (
message == "Light on"

    
MakeParticles();                //Start making particle
    
llSetPrimitiveParams([PRIM_FULLBRIGHTALL_SIDESTRUE]); //full bright
    
llSetPrimitiveParams([PRIM_POINT_LIGHTTRUE, <111>, 1.010.00.75]); //lumiere blanche
}
}
    else if (
message == "Light off"
{
    
llParticleSystem([]);        //Stop making particles 
    
llSetPrimitiveParams([PRIM_FULLBRIGHTALL_SIDESFALSE]);
    
llSetPrimitiveParams([PRIM_POINT_LIGHTFALSE, <111>, 1.010.00.75]);

Code:
MakeParticles() 
{                
    llParticleSystem(
    [PSYS_PART_FLAGS,0 | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK,
 PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP,
 PSYS_PART_START_ALPHA, 1.0,
 PSYS_PART_START_COLOR, <1.0, 1.0, 1.0>,
 PSYS_PART_END_ALPHA, 1.0,
 PSYS_PART_END_COLOR, <1.0, 1.0, 1.0>,
 PSYS_PART_START_SCALE, <1.0, 1.0, 0>,
 PSYS_PART_END_SCALE, <1.0, 1.0, 0>,
 PSYS_SRC_ACCEL, <0, 0, 0>,
 PSYS_SRC_OMEGA, <0, 0, 0>,
 PSYS_PART_MAX_AGE, 2.0, 
 PSYS_SRC_MAX_AGE, 0.0,
 PSYS_SRC_ANGLE_BEGIN, 0.0,
 PSYS_SRC_ANGLE_END, 3.14,
 PSYS_SRC_BURST_PART_COUNT, 1,
 PSYS_SRC_BURST_RADIUS, 1.0,
 PSYS_SRC_BURST_RATE, 1.0,
 PSYS_SRC_BURST_SPEED_MIN, 0.0,
 PSYS_SRC_BURST_SPEED_MAX, 0.0,
 PSYS_SRC_TEXTURE, "" ]
 );
}
 
default
{
 
link_message(integer sender_num, integer num, string str, key id) 
{
  if (str == "Light on") 
  { 
    MakeParticles();                //Start making particle
    llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, TRUE]); //full bright
    llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, <1, 1, 1>, 1.0, 10.0, 0.75]); //lumiere blanche
  }
  else if (str == "Light off") 
  {
    llParticleSystem([]);        //Stop making particles 
    llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, FALSE]);
    llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE, <1, 1, 1>, 1.0, 10.0, 0.75]);
  }  
}
}
Merci beaucoup Jideuze, effectivement ta rigueur fait fonctionner le script !
Malheureusement, j'ai mis en root prim le script de commande comme Narita me l'avait proposé :
Code PHP:

default {
  
state_entry() {
     
llMessageLinked(LINK_SET0"Light on"NULL_KEY);
  }
  
touch_start(integer total_number) {
     
state a;
  }
}
 
state a {
  
state_entry() {
     
llMessageLinked(LINK_SET0"Light off"NULL_KEY);
  }
  
touch_start(integer total_number) {
     
llResetScript();
  }

et dans les prims lumineux j'y ai mis le script que tu viens de me corriger, mais malheureusement ca ne fonctionne pas ... Vous voyez d'où ca peut venir ? je sèche encore
Code:
integer allume;
default {
  state_entry()
  {
      allume=FALSE;
      llMessageLinked(LINK_SET, 0, "Light off", NULL_KEY);
  }
  touch_start(integer total_number)
  {
     if (allume) { llMessageLinked(LINK_SET, 0, "Light off", NULL_KEY); }
     if (!allume) { llMessageLinked(LINK_SET, 0, "Light on", NULL_KEY); }
     allume=!allume;
  }
}
Commande vocal pour allumer eteindre
Moi j'ai tenter ca mais sa marche pas il le prendre que en toucher

Citation :
// Lamp that turns on and off

vector Color = <0, 255, 0>;
float Falloff = 1.0;
float Intensity = 20.0;
float Radius = 4.0;

default
{
state_entry()
{
llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE, Color, Intensity, Radius, Falloff]);
llMessageLinked(LINK_SET, 0, "Light on", NULL_KEY);
}
touch_start(integer total_number) {
state on;
}
}
// End of default

state on
{
state_entry()
{
llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, Color, Intensity, Radius, Falloff]);
llMessageLinked(LINK_SET, 0, "Light off", NULL_KEY);
}
touch_start(integer total_number) {
state default;
}
}
// End of on
Répondre

Connectés sur ce fil

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