• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Laterne soll Nachts automatisch angehen, tagsüber aus und auch nach bedarf leuchten.

Freddy Schwartzman

Aktiver Nutzer
Hallo zusammen! Ich habe mir gerade Gartenlaternen gebastelt die beim darauf klicken an- oder ausgehen. Nun wäre es aber auch noch praktisch wenn diese Laternen automatisch bei beginn der Nacht automatisch angehen und bei Tagesanbruch wieder ausgehen würden... also via Lichtindikator. Ein Script für den Lichtindikator habe ich nur weiß ich nicht wie ich das in das bestehende Lichtscript einbauen soll.
Es sind insgesamt zwei Scripts in den Laternen. Einmal das wo man nur auf die Laternen klicken muß:

Code:
integer an = FALSE;
default
{

    touch_start(integer total_number)
    {
        if(an == TRUE)
        {
            llSay(-250, "aus");   
            an = FALSE;
        }
        else
        {
            llSay(-250, "an");
            an = TRUE;
        }
        
    }
}

dann das Script für das Licht in der Laterne:
Code:
vector white    = <1,1,1>;
default
{
    state_entry()
    {
        llListen(-250, "","","");
        llSetTextureAnim(ANIM_ON | SMOOTH | LOOP, 1 , 1 , 1 , 1.0 , 1 , 0.5);
    }
    on_rez(integer start)
    {
        llListen(-250, "","","");
        llSetTextureAnim(ANIM_ON | SMOOTH | LOOP, 1 , 1 , 1 , 1.0 , 1 , 0.5);
    }

    listen(integer channel, string name, key id, string msg)
    {
        if(msg == "an")
        {
           llSetPrimitiveParams([PRIM_GLOW, ALL_SIDES, 0.30, PRIM_POINT_LIGHT,TRUE, <.9,.7,.3>,0.10, 8.0, 0.75]); llSetAlpha(0.3, -1);
        }
        else if(msg == "aus")
        {
           llSetPrimitiveParams([PRIM_GLOW, ALL_SIDES, 0.0, PRIM_POINT_LIGHT, FALSE, <0,0,0>, 1.0, 0.0, 0.0]);
        }
        
    }
}


und das wäre das Lichtindikator Script:
Code:
integer night=0;

default
{
state_entry()
{
llSetTimerEvent(60); // Check every 1 minutes
}

timer()
{
vector sun = llGetSunDirection();

if (sun.z <= 0) night = 1; // Sun is below the horizon
else
if (sun.z > 0) night = 0; // Sun is above the horizon

if (night == 1)
{
llSetPrimitiveParams([PRIM_FULLBRIGHT,ALL_SIDES,TRUE]);
llSetPrimitiveParams ([PRIM_POINT_LIGHT, TRUE, <.9,.7,.3>, 1.0, 10.0, 0.0 ] );
}
else
{
llSetPrimitiveParams([PRIM_FULLBRIGHT,ALL_SIDES,FALSE]);
llSetPrimitiveParams ([PRIM_POINT_LIGHT, FALSE, <1,1,1>, 1.0, 10.0, 0.0] ); ; llSetAlpha(0, -1);
}
}
}


Hat vielleicht hier jemand Vorschläge wie das zu meistern ist? Ich bekomme immer nur Errors wenn ich an den Scripts was "verunstalte".
Besten Dank :)!
 
Huhu,

erst mal eine Frage: Auf Touch einer der Gartenleuchten sollen alle Gartenleuchten angehen oder ?


Du hast da zwei ;; hintereinander in der Zeile:
Code:
llSetPrimitiveParams ([PRIM_POINT_LIGHT, FALSE, <1,1,1>, 1.0, 10.0, 0.0] ); ; llSetAlpha(0, -1);
Gruss

Sam
 
Zuletzt bearbeitet:
Also bis jetzt ist es so, daß alle Lampen auf Touch angehen wenn sie nahe beieinander stehen. Die weiter außerhalb muß ich immer einzeln an und aus machen.
 
Schau mal ob das evtl funktioniert, nur noch ein Script in der Laterne: (nicht getestet, nur offline geschrieben)

Code:
integer an = FALSE;
integer night= FALSE;
chk_sun()
{
 vector sun = llGetSunDirection();
 if(sun.z <= 0.0) night = 1; // Sun is below the horizon
 else if(sun.z > 0.0) night = 0; // Sun is above the horizon
 if(night)sun_on();
 else if(!night)sun_off();
}
sun_on()
{
 llSetAlpha(0.3,-1);
 llSetPrimitiveParams ([PRIM_FULLBRIGHT,ALL_SIDES,TRUE,PRIM_POINT_LIGHT, TRUE, <.9,.7,.3>, 1.0, 10.0, 0.0 ] );
}
sun_off()
{
 llSetPrimitiveParams ([PRIM_FULLBRIGHT,ALL_SIDES,FALSE,PRIM_POINT_LIGHT, FALSE, <1,1,1>, 1.0, 10.0, 0.0] );
 llSetAlpha(0,-1);
}
default
{
 state_entry()
 {
  chk_sun();
  llSetTimerEvent(60); // Check every 1 minutes
  llListen(-250, "","","");
  llSetTextureAnim(ANIM_ON | SMOOTH | LOOP, 1 , 1 , 1 , 1.0 , 1 , 0.5);
 }
 touch_start(integer total_number)
 {
  if(an)
  {
   llRegionSay(-250,"aus");
   an = FALSE;
  }
  else if(!an)
  {
   llRegionSay(-250,"an");
   an = TRUE;
  }
 }
 listen(integer channel, string name, key id, string msg)
 {
  if(llGetOwnerKey(id) == llGetOwner())
  {
   if(msg == "an")
   {
    sun_on();
   }
   else if(msg == "aus")
   {
    sun_off();
   }
  }
 }
 timer()
 {
  chk_sun();
 }
}

PS: Bevor jemand "meckert" ;) Im Prinzip reicht in einem der Scripte die Überprüfung nach dem "Sonnenstand" und dieses gibt über den llShout dann den Befehl an die Anderen aus. Generell bin ich ja abgeneigt für alles einen Listen zu verwenden, vieles kann mann doch besser über llMessageLinked erledigen, aber hier kommt es natürlich wieder darauf an, wie weit die Laternen auseinander stehen.

Gruss

Sam
 
Zuletzt bearbeitet:
llRegionSay wäre auch noch möglich. Damit kann man dann alle abdecken.

Den Listen auf den Owner begrenzen: llListen(-250, "",llGetOwner(),""); damit muss man dann nicht mal mehr auf den Owner im listen event prüfen, falls überhaupt auf Owner begrenzt werden soll!
 
Zuletzt bearbeitet:
@ Sam

Wenn du sowieso in jede Lampe ein Script legst, koennen sie eigentlich auch alle selber nach dem Sonnanstand fragen und benoetigen keinen Listener.
Dann darf die letzte Lampe auch mal weiter weg als 96m stehen.
Dafuer reicht dann auch ein Timer der lediglich alle 5 Minuten mal nachfragt. Ein netter (realistischer) Nebeneffect ist, das die Lampen nicht Synchron an und aus gehen.

LG
Dae
 
Da fällt mir noch was ein. Der "integer an" sollte im listenevent gesetzt werden, damit alle Lampen den gleichen Status haben bei Änderung:

Code:
integer an = FALSE;
integer night= FALSE;
chk_sun()
{
 vector sun = llGetSunDirection();
 if(sun.z <= 0.0) night = 1; // Sun is below the horizon
 else if(sun.z > 0.0) night = 0; // Sun is above the horizon
 if(night)sun_on();
 else if(!night)sun_off();
}
sun_on()
{
 llSetAlpha(0.3,-1);
 llSetPrimitiveParams ([PRIM_FULLBRIGHT,ALL_SIDES,TRUE,PRIM_POINT_LIGHT, TRUE, <.9,.7,.3>, 1.0, 10.0, 0.0 ] );
}
sun_off()
{
 llSetPrimitiveParams ([PRIM_FULLBRIGHT,ALL_SIDES,FALSE,PRIM_POINT_LIGHT, FALSE, <1,1,1>, 1.0, 10.0, 0.0] );
 llSetAlpha(0,-1);
}
default
{
 state_entry()
 {
  chk_sun();
  llSetTimerEvent(60); // Check every 1 minutes
  llListen(-250, "","","");
  llSetTextureAnim(ANIM_ON | SMOOTH | LOOP, 1 , 1 , 1 , 1.0 , 1 , 0.5);
 }
 touch_start(integer total_number)
 {
  if(an)
  {
   llRegionSay(-250,"aus");
  }
  else if(!an)
  {
   llRegionSay(-250,"an");
  }
 }
 listen(integer channel, string name, key id, string msg)
 {
  if(llGetOwnerKey(id) == llGetOwner())
  {
   if(msg == "an")
   {
    an = TRUE;
    sun_on();
   }
   else if(msg == "aus")
   {
    an = FALSE;
    sun_off();
   }
  }
 }
 timer()
 {
  chk_sun();
 }
}
 
Ok Sam, das hab ich uebersehen, dennoch waeren mir das zu viele Scripte. ^^
Je nachdem wie weit die Lampen auseinander stehen, lohnt es sich vielleicht einige miteinander zu verlinken und dennoch pro Linset nur ein Script zu verwenden.
Beispielsweise 10 Stueck in einer Strasse und in der naechsten Strasse wieder 10, so haettest fuer 20 Lampen insgesamt 2 Scripte.

LG
Dae
 
@Dae Meine Worte ;)

Setzt aber auch voraus, dass Freddy ein bissel was vom Scripten versteht.

LG

Sam
Ähm... ja... es gibt Scripte... sagen wir mal so... die sind für Leute wie ihr es seid, nicht für mich ;).
Vielen Dank auf jedenfall für Eure Bemühungen! Ich werde das heute Abend alles mal ausprobieren. Ich hau mich jetzt erstmal im RL auf die Ohren nach der Nachtschicht.

Beste Grüße,
Freddy
 
Nur ein paar kleine Anpassungen. Das eigene Script hört nicht auf eigene Chatbefehle (seltsam).

Hier mal noch das Script:

Code:
key owner;integer an = FALSE;
integer night= FALSE;
integer chan = -250;
chk_sun()
{
    vector sun = llGetSunDirection();
    if(sun.z <= 0.0) night = 1; // Sun is below the horizon
    else if(sun.z > 0.0) night = 0; // Sun is above the horizon
    if(night)sun_on();
    else if(!night)sun_off();
}


sun_on()
{
    an = TRUE;
    llSetPrimitiveParams ([PRIM_FULLBRIGHT,ALL_SIDES,TRUE,PRIM_POINT_LIGHT, TRUE, <.9,.7,.3>, 1.0, 10.0, 0.0,PRIM_GLOW,-1,0.3] );
    llSetTextureAnim(ANIM_ON | SMOOTH | LOOP, 1 , 1 , 1 , 1.0 , 1 , 0.5);
}


sun_off()
{
    an = FALSE;
    llSetTextureAnim(FALSE,ALL_SIDES,0,0,0.0,0.0,1.0);
    llSetPrimitiveParams ([PRIM_GLOW,-1,0.0,PRIM_FULLBRIGHT,ALL_SIDES,FALSE,PRIM_POINT_LIGHT, FALSE, <1,1,1>, 1.0, 10.0, 0.0] );
}


default
{
    on_rez(integer s_p)
    {
        owner = llGetOwner();
        llResetScript();
    }
    state_entry()
    {
        owner = llGetOwner();
        chk_sun();
        llSetTimerEvent(60); // Check every 1 minutes
        llListen(chan, "",NULL_KEY,"");
    }
    touch_start(integer total_number)
    {
        if(an)
        {
            llRegionSay(chan,"aus");
            sun_off();
        }
        else if(!an)
        {
            llRegionSay(chan,"an");
            sun_on();
        }
    }
    listen(integer channel, string name, key id, string msg)
    {
        if(llGetOwnerKey(id) == owner)
        {
            if(msg == "an")
            {
                sun_on();
            }
            else if(msg == "aus")
            {
                sun_off();
            }
        }
    }
    timer()
    {
        chk_sun();
    }
}

Was jetzt noch nicht eingebaut ist, dass wenn man manuell ein/ausschaltet, das auch so bleibt bei einem Tageswechsel. Aber das war ja auch nicht gefragt ;)

Gruss

Sam
 
Nur ein paar kleine Anpassungen. Das eigene Script hört nicht auf eigene Chatbefehle (seltsam).

(...)
Gruss

Sam

Das mit dem sich nicht hören können ist Absicht, damit so etwas wie das hier kein Chaos anrichtet:
Code:
default
{
    state_entry()
    {
        llListen(-250,"",llGetOwner(),"");
        llSetMemoryLimit(5000);
    }

    changed(integer change)
    {
        if(change & CHANGED_OWNER){
            llResetScript();
        }
    }

    listen(integer channel, string name, key id, string message)
    {
        llWhisper(-250,message);
    }

}

Prims können sich generell nicht selbst hören. D.h. wenn man in einem Script mit einem Listener arbeitet, der auf den eigenen Chat reagieren soll, dann muss man einfach mit einem Relay arbeiten, siehe im Script oben.
 
Naja, sich nicht selbst hoeren ist nicht generell so, sonst wuerden naemlich keine Menues funktionieren.
Das Script fuehrt mit einem llDialog und dem Listener irgend wie ja doch Selbstgespraeche. ;)
Ich glaube aber llDialog und llTextBox sind die grossen ausnahmen.

LG
Dae
 

Users who are viewing this thread

Zurück
Oben Unten