121 lines
3.9 KiB
Plaintext
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();
|
|
}
|
|
}
|
|
}
|
|
} |