Rang: Ehrenmitglied
Mitglied seit: 05.09.2014(UTC) Beiträge: 84  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. |
|
|
|
Rang: Ehrenmitglied
Mitglied seit: 05.09.2014(UTC) Beiträge: 84  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. |
|
|
|
Rang: Ehrenmitglied
Mitglied seit: 05.09.2014(UTC) Beiträge: 84  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. |
|
|
|
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.