1
0
Fork 0
4Creative-Changes/AddLibrary/Assets/MyAssetSet/Kubwa.SmartDoor.lsl

121 lines
3.9 KiB
Plaintext

/*
Script für Smarte Tür
(c) Kubwa
Das Script kann in Türen gelegt werden die rotieren oder sliden.
Die Türen können dann mit dem Haus verlinkt werden (z.b. ein primige Mesh Türen)
Haben zwei Türen den selben Namen öffnen und schließen sie zeitgleich.
Die Tür wird über die Objektbeschreibung gesteuert, dort wird eine komma separierte Befehlsliste eingetragen.
Folgende Einstellungen sind möglich:
Modus, Achse, Bewegung, Status
Modus: Der Modus in dem die Tür funktioniert.
S = Sliding
R = Rotieren (Alles andere als S ist automatisch rotieren)
Achse: Die Achse auf der die Bewegung ausgeführt wird.
X, Y, Z
Bewegung: Die Stärke der Bewegung.
Bei Sliding ist es der Multiplikator der Bewegung. 0.5 bedeutet die Tür beregt sich 50% ihrer Länge nach auf der Achse.
Bei Rotieren sind hier die zu rotierenden ° anzugeben.
Status: Für interne Scriptverwedung.
Das Script merkt sich auf diese Weise den Status der Tür.
Wenn der Scriptspeicher verloren geht kann die Tür so ihre Arbeit wieder aufnehmen.
Beispiel: Slindende Tür, die sich auf der X-Achse bewegt und 85% ihrer Länge gleitet: "S, X, 0.85, 0" (Ohne Anführungszeichen)
*/
integer Open = FALSE;
SetDoor()
{
SetDoorParameter(3, (string)Open);
float Pos = 1;
if (!Open) {Pos = -1;}
if (GetDoorParameter(0) == "s")
{
vector Size = llGetScale();
vector Axis = <0, 0, 0>;
if (GetDoorParameter(1) == "x")
{Axis.x = -Size.x * (float)GetDoorParameter(2) * Pos;}
if (GetDoorParameter(1) == "y")
{Axis.y = -Size.y * (float)GetDoorParameter(2) * Pos;}
if (GetDoorParameter(1) == "z")
{Axis.z = -Size.z * (float)GetDoorParameter(2) * Pos;}
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, llGetLocalPos() + (Axis * llGetLocalRot())]);
}
else
{
vector Axis = <0, 0, 0>;
if (GetDoorParameter(1) == "x")
{Axis.x = (float)GetDoorParameter(2) * Pos;}
if (GetDoorParameter(1) == "y")
{Axis.y = (float)GetDoorParameter(2) * Pos;}
if (GetDoorParameter(1) == "z")
{Axis.z = (float)GetDoorParameter(2) * Pos;}
llSetLocalRot(llGetLocalRot() * llEuler2Rot(Axis * DEG_TO_RAD));
}
}
string GetDoorParameter(integer ParamIndex)
{return llToLower(llList2String(llCSV2List(llGetObjectDesc()), ParamIndex));}
SetDoorParameter(integer ParamIndex, string Data)
{
list Param = llCSV2List(llGetObjectDesc());
Param = llListReplaceList(Param, [Data], ParamIndex, ParamIndex);
llSetObjectDesc(llList2CSV(Param));
}
default
{
on_rez(integer Dummy)
{llResetScript();}
state_entry()
{Open = (integer)GetDoorParameter(3);}
touch_start(integer Dummy)
{
Open = !Open;
if (Open)
{llSetTimerEvent(30);}
else
{llSetTimerEvent(0);}
llMessageLinked(LINK_SET, -503205, llGetObjectName(), (string)Open);
SetDoor();
}
collision_start(integer Dummy)
{
if (!Open)
{
Open = TRUE;
llSetTimerEvent(30);
llMessageLinked(LINK_SET, -503205, llGetObjectName(), (string)Open);
SetDoor();
}
}
timer()
{
Open = FALSE;
llSetTimerEvent(0);
llMessageLinked(LINK_SET, -503205, llGetObjectName(), (string)Open);
SetDoor();
}
link_message(integer Sender, integer Num, string Str, key ID)
{
if (Num == -503205 &&
Str == llGetObjectName() &&
Sender != llGetLinkNumber())
{
if (Open != (integer)ID)
{
Open = (integer)ID;
if (!Open)
{llSetTimerEvent(0);}
SetDoor();
}
}
}
}