logo

Willkommen Gast! Um alle Funktionen zu aktivieren müssen Sie sich Anmelden.Neue Registrierungen sind deaktiviert.

Mitteilung

Icon
Error

Einloggen


Optionen
Ansicht
Gehe zum aktuellsten Beitrag Gehe zum letzten Ungelesenen
Offline MartinRJ Fayray  
#1 Geschrieben : Dienstag, 16. September 2014 03:50:05(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

Mitglied seit: 05.09.2014(UTC)
Beiträge: 84
Germany
Wohnort: Tulln und Rostock

Dankte: 1 mal(e)
Mit diesem Skript kann man die Beleuchtung in seiner Sim vollständig automatisieren.

Sobald sich jemand auf 10 Meter einem Objekt nähert welches das folgende Skript enthält, schaltet sich automatisch die Beleuchtung an.
Und wenn niemand mehr in der Nähe ist, schaltet sich das Licht nach zwei Sekunden wieder aus.

Die Distanz von 10 Metern lässt sich über die Variable 'fDistance' steuern.

Code:

float fTimer = 2.0; //interval to check for nearby agents
float fDistance = 10.0; //range to scan
vector vLight = <1.0, 1.0, 1.0>; //prim_point_light's color
float fIntensity = 1.0; //prim_point_light's intensity
float fRadius = 10.0; //prim_point_light's radius
float fFalloff = 0.5; //prim_point_light's falloff
integer i_bool_On = FALSE; //stores the light's status
default
{
    state_entry()
    { //start a timer on startup of the script
        llSetTimerEvent(fTimer);
    }

    timer()
    {
        list lAvatars = llGetAgentList(AGENT_LIST_PARCEL, []); //retrieve agent list in the parcel
        integer iCount; //helper variable
        integer i_bool_Found = FALSE; //becomes TRUE when an agent was detected within "fDistance"-range
        for (iCount = 0; iCount < llGetListLength(lAvatars); iCount++)
        { //loop through all agents...
            if (llVecDist(llList2Vector(llGetObjectDetails(llList2Key(lAvatars, iCount), [OBJECT_POS]),0), llGetPos()) <= fDistance)
            { //...and calculate distance from this prim
                i_bool_Found = TRUE; //avatar found...
                iCount = llGetListLength(lAvatars); //...break out of the loop
            }
        }
        if (i_bool_Found)
        { //must be on
            if (!i_bool_On)
            { //turn on
                i_bool_On = TRUE; //remember status = TRUE (on)
                llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, vLight, fIntensity, fRadius, fFalloff]);
            }
        }
        else
        { //must be off
            if (i_bool_On)
            { //turn off
                i_bool_On = FALSE; //remember status = FALSE (off)
                llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE, vLight, fIntensity, fRadius, fFalloff]);
            }
        }
    }
}

Bearbeitet vom Moderator Freitag, 19. September 2014 09:34:18(UTC)  | Grund: Nicht angegeben

It is the mark of an educated mind to be able to entertain a thought without accepting it.

Wanna join the discussion?! Login to your forum account.Neue Registrierungen sind deaktiviert.

Offline MartinRJ Fayray  
#2 Geschrieben : Montag, 29. September 2014 13:38:58(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

Mitglied seit: 05.09.2014(UTC)
Beiträge: 84
Germany
Wohnort: Tulln und Rostock

Dankte: 1 mal(e)
Hier ist eine Kombination aus dem zuvor geposteten Tür-Skript, und diesem Lampen-Skript, um eine Türe automatisch zu öffnen oder zu schließen, wenn sich ein Avatar nähert:

Code:

float fTimer = 0.6; //interval to check for nearby agents
float fDistance = 10.0; //range to scan


integer OPEN = FALSE;
integer STEPS = 6;
float SINGLESTEP = 0.7;
float DEGREES = 19.0;
float FRAMEDURATION = 0.03;

float fSleep = 1.6; //wait after opening/closing

integer COUNTER = 0;


ANIMATION()
{
    COUNTER = 0;
    llSetTimerEvent(0.001);
}
STOP_ANIMATION()
{
    llSetTimerEvent(0.0);
}

default
{
    state_entry()
    { //start a timer on startup of the script
        llSetTimerEvent(fTimer);
    }

    timer()
    {
        list lAvatars = llGetAgentList(AGENT_LIST_PARCEL, []); //retrieve agent list in the parcel
        integer iCount; //helper variable
        integer i_bool_Found = FALSE; //becomes TRUE when an agent was detected within "fDistance"-range
        for (iCount = 0; iCount < llGetListLength(lAvatars); iCount++)
        { //loop through all agents...
            if (llVecDist(llList2Vector(llGetObjectDetails(llList2Key(lAvatars, iCount), [OBJECT_POS]),0), llGetPos()) <= fDistance)
            { //...and calculate distance from this prim
                i_bool_Found = TRUE; //avatar found...
                iCount = llGetListLength(lAvatars); //...break out of the loop
            }
        }
        if (i_bool_Found)
        { //must be on
            if (!OPEN)
            { //turn on
                OPEN = TRUE; //remember status = TRUE (on)
                state animation;
            }
        }
        else
        { //must be off
            if (OPEN)
            { //turn off
                OPEN = FALSE; //remember status = FALSE (off)
                state animation;
            }
        }
    }
}
state animation
{
    state_entry()
    {
        ANIMATION();
    }
    timer()
    {
        if (COUNTER == 0)
        {
            llSetTimerEvent(FRAMEDURATION);
        }
 
        vector v; rotation r;
        if (OPEN)
        {
            v = llGetPos() + <0.0, SINGLESTEP, 0.0>;
            r = llGetRot() / llEuler2Rot(<DEGREES, 0, 0> * DEG_TO_RAD);
        }
        else
        {
            v = llGetPos() - <0.0, SINGLESTEP, 0.0>;
            r = llGetRot() * llEuler2Rot(<DEGREES, 0, 0> * DEG_TO_RAD);
        }
        llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_ROTATION, r, PRIM_POSITION, v]);
        COUNTER++;
        if (COUNTER >= STEPS)
        {
            STOP_ANIMATION();
            llSleep(fSleep);
            state default;
        }
    }
}
It is the mark of an educated mind to be able to entertain a thought without accepting it.
Offline MartinRJ Fayray  
#3 Geschrieben : Dienstag, 30. September 2014 13:28:26(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

Mitglied seit: 05.09.2014(UTC)
Beiträge: 84
Germany
Wohnort: Tulln und Rostock

Dankte: 1 mal(e)
Hier ist eine alternative Variante um zu überprüfen, ob ein bestimmter Avatar in der Nähe ist:

Code:

integer isAvatarNearby(key avatar, float distance)
{
    integer iCount;
    if (llGetAgentSize(avatar) != ZERO_VECTOR)
    { //avatar found
        vector vPos = llList2Vector(llGetObjectDetails(avatar, [OBJECT_POS]), 0);
        if (llVecDist(vPos, llGetPos()) <= distance)
        { //avatar is nearby
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    else
    {
        return FALSE;
    }
}


Die Funktion isAvatarNearby gibt TRUE zurück, wenn der Avatar (als Parameter key avatar übergeben) näher als 'distance' an dem Objekt dran ist.
Andernfalls FALSE.
It is the mark of an educated mind to be able to entertain a thought without accepting it.
Rss Feed  Atom Feed
Benutzer, die gerade dieses Thema lesen
OceanSpiders 2.0
Das Forum wechseln  
Du kannst keine neue Themen in diesem Forum eröffnen.
Du kannst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge nicht löschen.
Du darfst deine Beiträge nicht editieren.
Du kannst keine Umfragen in diesem Forum erstellen.
Du kannst nicht an Umfragen teilnehmen.

Powered by YAF.NET | YAF.NET © 2003-2021, Yet Another Forum.NET
Diese Seite wurde in 0.050 Sekunden generiert.

Datenschutzrichtlinie
Haftungsausschluss
Impressum
Datenschutzerklärung
AGB, ToS
Kontakt