ouverture par commande de rideaux

Répondre
Partager Rechercher
bonjour, j'ai récupérer il y a quelques temps un script pour animer des rideaux mais il faut cliquer sur chaque partie du rideau pour le fermer ou l'ouvrir, et j'ai beaucoup de fenêtres chez moi.
Alors, l'idée serai d'utilisé une commande pour ouvrir ou fermer tout les rideaux en même temps, si une âme charitable pouvais me modifier le script ci-joint je lui en serait très reconnaissante.

voici le script qur j'utilise actuellement :

//Size in meters when closed, max of 10.0m
float ClosedSize = 2.4;

//Size in meters when open, min of 0.01m
float OpenSize = 0.95;

//Number of steps between open and closed
integer NumberOfSteps = 5;

//Axis of the prim to adjust, either x, y, or z
string AxisToScale = "y";

//seconds till autoclose, 0 to disable
float OpenTime = 0;

//Sound to play on open, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string OpenSound = "";

//Volume to play open sound, 0.0 is same as no sound, 1.0 is max
float OpenVol = 1.0;

//Sound to play on close, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string CloseSound = "";

//Volume to play close sound, 0.0 is same as no sound, 1.0 is max
float CloseVol = 1.0;



//misc variables
float SizeOfSteps;
vector Scale;
integer Open;
float Size;
integer x;

Set_Scale(float size)
{
if(AxisToScale == "x") llSetScale((Scale += <size, 0, 0>));
if(AxisToScale == "y") llSetScale((Scale += <0, size, 0>));
if(AxisToScale == "z") llSetScale((Scale += <0, 0, size>));
}

default
{
state_entry()
{
AxisToScale = llToLower(AxisToScale);
SizeOfSteps = (ClosedSize - OpenSize) / NumberOfSteps;
Scale = llGetScale();
if(AxisToScale == "x") Scale.x = ClosedSize;
if(AxisToScale == "y") Scale.y = ClosedSize;
if(AxisToScale == "z") Scale.z = ClosedSize;
llSetScale(Scale);
}

on_rez(integer param)
{
llResetScript();
}

touch_start(integer total_number)
{
Open = !Open;
if(Open)
{
Scale = llGetScale();
Size = ClosedSize - SizeOfSteps;
if(OpenSound != "") llTriggerSound(OpenSound, OpenVol);
for(x = 0; x < NumberOfSteps; ++x)
{
Set_Scale(-SizeOfSteps);
}
llSetTimerEvent(OpenTime);
}else{
llSetTimerEvent(0);
Size = OpenSize + SizeOfSteps;
if(CloseSound != "") llTriggerSound(CloseSound, CloseVol);
for(x = 0; x < NumberOfSteps; ++x)
{
Set_Scale(SizeOfSteps);
}
}
}

timer()
{
Open = 0;
llSetTimerEvent(0);
Size = OpenSize + SizeOfSteps;
if(CloseSound != "") llTriggerSound(CloseSound, CloseVol);
for(x = 0; x < NumberOfSteps; ++x)
{
Set_Scale(SizeOfSteps);
}
}
}
Réponse rapide sans filet. Remplace le script des rideaux par celui-ci :

Code:
//Size in meters when closed, max of 10.0m
float ClosedSize = 2.4;
//Size in meters when open, min of 0.01m
float OpenSize = 0.95;
//Number of steps between open and closed
integer NumberOfSteps = 5;
//Axis of the prim to adjust, either x, y, or z
string AxisToScale = "y";
//seconds till autoclose, 0 to disable
float OpenTime = 0;
//Sound to play on open, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string OpenSound = "";
//Volume to play open sound, 0.0 is same as no sound, 1.0 is max
float OpenVol = 1.0;
//Sound to play on close, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string CloseSound = "";
//Volume to play close sound, 0.0 is same as no sound, 1.0 is max
float CloseVol = 1.0;
// Canal de commande
integer canal = -584512;
//misc variables
float SizeOfSteps;
vector Scale;
integer Open;
float Size;
integer x;
Set_Scale(float size)
{
 if(AxisToScale == "x") llSetScale((Scale += <size, 0, 0>));
 if(AxisToScale == "y") llSetScale((Scale += <0, size, 0>));
 if(AxisToScale == "z") llSetScale((Scale += <0, 0, size>));
}
command()
{
 Open = !Open;
 if(Open)
 {
  Scale = llGetScale();
  Size = ClosedSize - SizeOfSteps;
  if(OpenSound != "") llTriggerSound(OpenSound, OpenVol);
  for(x = 0; x < NumberOfSteps; ++x)
  {
   Set_Scale(-SizeOfSteps);
  }
  llSetTimerEvent(OpenTime);
 }
 else
 {
  llSetTimerEvent(0);
  Size = OpenSize + SizeOfSteps;
  if(CloseSound != "") llTriggerSound(CloseSound, CloseVol);
  for(x = 0; x < NumberOfSteps; ++x)
  {
   Set_Scale(SizeOfSteps);
  }
 }
}
default
{
 state_entry()
 {
  AxisToScale = llToLower(AxisToScale);
  SizeOfSteps = (ClosedSize - OpenSize) / NumberOfSteps;
  Scale = llGetScale();
  if(AxisToScale == "x") Scale.x = ClosedSize;
  if(AxisToScale == "y") Scale.y = ClosedSize;
  if(AxisToScale == "z") Scale.z = ClosedSize;
  llSetScale(Scale);
  llListen(canal, "", NULL_KEY, "");
 }
 on_rez(integer param)
 {
  llResetScript();
 }
 listen(integer channel, string name, key id, string message)
 {
  if(message == "go") command();
 }
 timer()
 {
  Open = 0;
  llSetTimerEvent(0);
  Size = OpenSize + SizeOfSteps;
  if(CloseSound != "") llTriggerSound(CloseSound, CloseVol);
  for(x = 0; x < NumberOfSteps; ++x)
  {
   Set_Scale(SizeOfSteps);
  }
 }
}
et crée une borne de commande avec ce script :

Code:
// Canal de commande
integer canal = -584512;
default
{
 touch_start(integer total_number)
 {
  llSay(canal, "go");
 }
}
Bon c'est basique mais ça doit marcher. J'ai respecté la philosophie du script qui ne prévoit aucun filtrage d'utilisateur. La portée de la commande est de 20 mètres (fonction llSay). Pour une plus grande portée remplace par un llShout.
merciiiiiiiiiiiiiiiii
Merci bestmomo, tu est vraiment le "best" du script et ta réponse hyper rapide, je vais tester tout cela in-game mais je suis certaine que cela va fonctionner du premier coup. Merci encore et pleins de bisous pour la peine.
Moi j'aime les bisous

Ceci dit tu risques d'avoir des soucis de synchronisation entre tes rideaux en cas de raté de l'un d'eux. C'est même un truc qui peut énerver à la limite . Il y a plusieurs solutions pour éviter cela. La plus sûre est de gérer l'état à partir de la borne de commande qui envoie alors des ordres précis de fermeture ou d'ouverture. Une autre solution encore plus simple est de conserver des commandes individuelles de secours. Enfin.. les joies de la scriptologie
et si ....
oui je pense comprendre, j'aurais du être plus précise j'ai déjà un boîtier de commande dont voici le script
Code:
integer menu_handler;
integer menu_channel;
float menutime = 60.0;
 
menu(key user,string title,list buttons)
{
        llDialog(user,title,buttons,menu_channel);
}
 
default
{
        touch_start(integer t)
        {
                menu_channel = -37641 ;
                menu_handler = llListen(menu_channel,"","","");
                llSetTimerEvent(menutime);
                menu(llDetectedKey(0),"Commande Generale",["Volets","Lumieres","Annuler"]);
        }
        timer()
        {
                llSetTimerEvent(0.0);
                llListenRemove(menu_handler);
        }
        listen(integer channel,string name,key id,string message)
        {
                if (channel == menu_channel)
                {
                        llSetTimerEvent(0.0);
                        if(message=="Retour")
                        {
                            llSetTimerEvent(menutime);
                            menu(id,"Commande Generale",["Volets","Lumieres","Annuler"]); 
                        }
                        else if(message=="Lumieres")
                        {
                            llSetTimerEvent(menutime);
                            menu(id,"Interrupteur Forcer le soleil a nuit, avant utilisation ",["ON","OFF","Retour"]);   
                        }
                        else if(message=="Volets")
                        {
                            llSetTimerEvent(menutime);
                            menu(id,"Commande des volets",["Ouvert","Fermer","Retour"]);   
                        }
                        else if(message == "Ouvert")
                        {
                            llSay(menu_channel,"Ouvert");
                            llSetTimerEvent(0.1);
                        }                       
                        else if(message == "Fermer")
                        {
                            llSay(menu_channel,"Fermer");
                            llSetTimerEvent(0.1);
                        }
                        else if(message == "ON")
                        {
                            llSay(menu_channel,"ON");
                            llSetTimerEvent(0.1);
                        }
                        else if(message == "OFF")
                        {
                            llSay(menu_channel,"OFF");
                            llSetTimerEvent(0.1);
                        }
                        else
                        {   
                            llSetTimerEvent(0.1);
                        }
                }
 
        }
}
merci de voir ce que l'on peut en faire.
des tonnes de bisous a la clef
Il y a un truc très étrange dans ton script de boîtier de commande : il y a un seul canal de communication (menu_channel) qui sert à la fois pour les menus et pour envoyer les commandes. C'est une source potentielle de grande confusion si des commandes sont identiques. Je regarde ça de plus près plus tard
Bon faudrait tout réécrire pour bien faire mais je me suis contenté de bricoler un peu pour faire marcher. Voilà ton nouveau script de commande générale :

Code:
integer menu_handler;
integer menu_channel = -37641;
integer menubis_channel;
integer canal = -584512;
integer rideaux;
float menutime = 60.0;
menu(key user,string title,list buttons)
{
 llDialog(user,title,buttons,menubis_channel);
}
integer genCanal() {return llFloor(llFrand(2000000.0) + 100);}
default
{
 touch_start(integer t)
 {
  menubis_channel = genCanal();
  menu_handler = llListen(menubis_channel,"",NULL_KEY,"");
  llSetTimerEvent(menutime);
  menu(llDetectedKey(0),"Commande Generale",["Volets","Lumieres","Rideaux","Annuler"]);
 }
 timer()
 {
  llSetTimerEvent(0.0);
  llListenRemove(menu_handler);
 }
 listen(integer channel,string name,key id,string message)
 {
  if (channel == menubis_channel)
  {
   llSetTimerEvent(0.0);
   if(message=="Retour")
   {
    llSetTimerEvent(menutime);
    menu(id,"Commande Generale",["Volets","Lumieres","Annuler"]);
   }
   else if(message=="Lumieres")
   {
    llSetTimerEvent(menutime);
    menu(id,"Interrupteur Forcer le soleil a nuit, avant utilisation ",["ON","OFF","Retour"]);
   }
   else if(message=="Volets")
   {
    rideaux = FALSE;
    llSetTimerEvent(menutime);
    menu(id,"Commande des volets",["Ouvert","Fermer","Retour"]);
   }
   else if(message=="Rideaux")
   {
    rideaux = TRUE;
    llSetTimerEvent(menutime);
    menu(id,"Commande des Rideaux",["Ouvert","Fermer","Retour"]);
   }
   else if(message == "Ouvert")
   {
    if(rideaux) llSay(canal,"Ouvert");
    else llSay(menu_channel,"Ouvert");
    llSetTimerEvent(0.1);
   }
   else if(message == "Fermer")
   {
    if(rideaux) llSay(canal,"Fermer");
    else llSay(menu_channel,"Fermer");
    llSetTimerEvent(0.1);
   }
   else if(message == "ON")
   {
    llSay(menu_channel,"ON");
    llSetTimerEvent(0.1);
   }
   else if(message == "OFF")
   {
    llSay(menu_channel,"OFF");
    llSetTimerEvent(0.1);
   }
   else
   {
    llSetTimerEvent(0.1);
   }
  }
 }
}
et le nouveau script des rideaux :

Code:
//Size in meters when closed, max of 10.0m
float ClosedSize = 2.4;
//Size in meters when open, min of 0.01m
float OpenSize = 0.95;
//Number of steps between open and closed
integer NumberOfSteps = 5;
//Axis of the prim to adjust, either x, y, or z
string AxisToScale = "y";
//seconds till autoclose, 0 to disable
float OpenTime = 0;
//Sound to play on open, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string OpenSound = "";
//Volume to play open sound, 0.0 is same as no sound, 1.0 is max
float OpenVol = 1.0;
//Sound to play on close, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string CloseSound = "";
//Volume to play close sound, 0.0 is same as no sound, 1.0 is max
float CloseVol = 1.0;
// Canal de commande
integer canal = -584512;
//misc variables
float SizeOfSteps;
vector Scale;
integer Open;
float Size;
integer x;
Set_Scale(float size)
{
 if(AxisToScale == "x") llSetScale((Scale += <size, 0, 0>));
 if(AxisToScale == "y") llSetScale((Scale += <0, size, 0>));
 if(AxisToScale == "z") llSetScale((Scale += <0, 0, size>));
}
default
{
 state_entry()
 {
  AxisToScale = llToLower(AxisToScale);
  SizeOfSteps = (ClosedSize - OpenSize) / NumberOfSteps;
  Scale = llGetScale();
  if(AxisToScale == "x") Scale.x = ClosedSize;
  if(AxisToScale == "y") Scale.y = ClosedSize;
  if(AxisToScale == "z") Scale.z = ClosedSize;
  llSetScale(Scale);
  Open = TRUE;
  llListen(canal, "", NULL_KEY, "");
 }
 on_rez(integer param)
 {
  llResetScript();
 }
 listen(integer channel, string name, key id, string message)
 {
  if(message == "Ouvert") {
   if(Open) return;
   Open = TRUE;
   llSetTimerEvent(0);
   Size = OpenSize + SizeOfSteps;
   if(CloseSound != "") llTriggerSound(CloseSound, CloseVol);
   for(x = 0; x < NumberOfSteps; ++x)
   {
    Set_Scale(SizeOfSteps);
   }
  }
  else if(message == "Fermer") {
   if(!Open) return;
   Open = FALSE;
   Scale = llGetScale();
   Size = ClosedSize - SizeOfSteps;
   if(OpenSound != "") llTriggerSound(OpenSound, OpenVol);
   for(x = 0; x < NumberOfSteps; ++x)
   {
    Set_Scale(-SizeOfSteps);
   }
   llSetTimerEvent(OpenTime);
  }
 }
 timer()
 {
  Open = 0;
  llSetTimerEvent(0);
  Size = OpenSize + SizeOfSteps;
  if(CloseSound != "") llTriggerSound(CloseSound, CloseVol);
  for(x = 0; x < NumberOfSteps; ++x)
  {
   Set_Scale(SizeOfSteps);
  }
 }
}
Cette fois j'ai testé et ça marche bien, du moins les rideaux, pour le reste je n'ai en principe rien cassé
...
bonsoir
Bestmomo je viens de prendre ton script pour ma maison ou il y a pas mal de rideau mais quand je le met ceux ci se ferment et s'ouvrent des deux cotés a la fois cela est il normal si oui comment faire pour les faire ouvrir que d'un coté a la fois merci a toi
bonsoir

merci a toi Magic cat je n'y avais pas penser mais ça va faire pas mal de prims en plus ça

sinon peut on changer de canal a la télécommande pour que les deux pièces de la maison ont leurs ouvertures de rideaux séparés et non pas ensemble comme c'est maintenant et si oui comment faire et quel canal mettre et ou et peut on réduire la vitesse d'ouverture et de fermeture du rideaux merci baucoup
bonsoir

y a t'il une autre solution que de découper le prim car la je ne peux pas faire bouger le rideau avec le vent car l'axe Y est sur le coté merci encore mille fois
Citation :
Publié par pyhia
bonsoir

y a t'il une autre solution que de découper le prim car la je ne peux pas faire bouger le rideau avec le vent car l'axe Y est sur le coté merci encore mille fois

Oui il y a toujours une solution

L'astuce est de faire un changement de dimension couplé à un déplacement de la moitié de la valeur du changement de dimension, on absorbe ainsi le changement de dimension sur l'un des côtés et ça donne l'illusion que ça diminue d'un seul côté. Le code sera différent si tes rideaux sont liés ou pas. S'ils sont liés le déplacement est relatif à la prim mère, sinon le déplacement se fait en coordonnées régionales. D'autre part comme ton script prévoit de paramétrer la dimension qui doit être redimensionnée il faut en tenir compte dans le codage.

Ce n'est pas encore la solution finale à ton problème mais on s'en rapproche
Ok je t'ai fait ça rapidement en bidouillant ton script. Comme tu m'a pas dit si ta prim est enfant ou pas j'ai prévu une détection automatique. J'ai fait un petit test ça a l'air de marcher :

Code PHP:

//Size in meters when closed, max of 10.0m
float ClosedSize 2.4;
//Size in meters when open, min of 0.01m
float OpenSize 0.95;
//Number of steps between open and closed
integer NumberOfSteps 5;
//Axis of the prim to adjust, either x, y, or z
string AxisToScale "y";
//seconds till autoclose, 0 to disable
float OpenTime 0;
//Sound to play on open, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string OpenSound "";
//Volume to play open sound, 0.0 is same as no sound, 1.0 is max
float OpenVol 1.0;
//Sound to play on close, either a UUID or a name in the door contents
//if a name, it must be exact. Leave at "" for no sound
string CloseSound "";
//Volume to play close sound, 0.0 is same as no sound, 1.0 is max
float CloseVol 1.0;
// Canal de commande
integer canal = -584512;
//misc variables
float SizeOfSteps;
vector Scale;
integer Open;
float Size;
integer x;
commande(vector dim)
{
    
Scale += dim;
    if(
llGetLinkNumber() > 1)
        
llSetPrimitiveParams([PRIM_POSITIONllGetLocalPos() + dim 2.0 llGetLocalRot(), PRIM_SIZEScale]);
    else
        
llSetPrimitiveParams([PRIM_POSITIONllGetPos() + dim 2.0 llGetRot(), PRIM_SIZEScale]);
}
Set_Scale(float size)
{
    if(
AxisToScale == "x"commande(<size00>);
    if(
AxisToScale == "y"commande(<0size0>);
    if(
AxisToScale == "z"commande(<00size>);
}
default
{
    
state_entry()
    {
        
AxisToScale llToLower(AxisToScale);
        
SizeOfSteps = (ClosedSize OpenSize) / NumberOfSteps;
        
Scale llGetScale();
        if(
AxisToScale == "x"Scale.ClosedSize;
        if(
AxisToScale == "y"Scale.ClosedSize;
        if(
AxisToScale == "z"Scale.ClosedSize;
        
llSetScale(Scale);
        
Open TRUE;
        
llListen(canal""NULL_KEY"");
    }
    
on_rez(integer param)
    {
        
llResetScript();
    }
    
listen(integer channelstring namekey idstring message)
    {
        if(
message == "Ouvert") {
            if(
Open) return;
            
Open TRUE;
            
llSetTimerEvent(0);
            
Size OpenSize SizeOfSteps;
            if(
CloseSound != ""llTriggerSound(CloseSoundCloseVol);
            for(
0NumberOfSteps; ++x)
            {
                
Set_Scale(SizeOfSteps);
            }
        }
        else if(
message == "Fermer") {
            if(!
Open) return;
            
Open FALSE;
            
Scale llGetScale();
            
Size ClosedSize SizeOfSteps;
            if(
OpenSound != ""llTriggerSound(OpenSoundOpenVol);
            for(
0NumberOfSteps; ++x)
            {
                
Set_Scale(-SizeOfSteps);
            }
            
llSetTimerEvent(OpenTime);
        }
    }
    
timer()
    {
        
Open 0;
        
llSetTimerEvent(0);
        
Size OpenSize SizeOfSteps;
        if(
CloseSound != ""llTriggerSound(CloseSoundCloseVol);
        for(
0NumberOfSteps; ++x)
        {
            
Set_Scale(SizeOfSteps);
        }
    }

J'ai imposé le côté qui s'ouvre, tu peux obtenir la symétrie avec une rotation de 90°
super bestmomo je vais essayer cela de suite par contre chez moi j'ai 2 grandes pièces et la télécommande ne prends pas les 2 pièces entièrement (ma maison est tout en longueur) peut on mette un canal pour chacune des 2 pièces pour qu'ils souvent indifféremment l'une de l'autre si oui qu'elle canal mettre et ou merci
Citation :
Publié par pyhia
super bestmomo je vais essayer cela de suite par contre chez moi j'ai 2 grandes pièces et la télécommande ne prends pas les 2 pièces entièrement (ma maison est tout en longueur) peut on mette un canal pour chacune des 2 pièces pour qu'ils souvent indifféremment l'une de l'autre si oui qu'elle canal mettre et ou merci
Repère cette ligne dans tes deux scripts :

integer canal = -584512;

Il faut mettre la même valeur dans les deux scripts pour qu'ils communiquent. Tu peux par exemple prendre -584513 pour ta deuxième pièce et ainsi de suite.
Répondre

Connectés sur ce fil

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