From de7fb882e060ec2cd4c3365dccedbdfc9c15c9ef Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 14 Feb 2021 16:43:26 +0100 Subject: [PATCH] add script asset --- .../Assets/MyAssetSet/Kubwa.SmartDoor.lsl | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/AddLibrary/Assets/MyAssetSet/Kubwa.SmartDoor.lsl b/AddLibrary/Assets/MyAssetSet/Kubwa.SmartDoor.lsl index e69de29..56482c9 100644 --- a/AddLibrary/Assets/MyAssetSet/Kubwa.SmartDoor.lsl +++ b/AddLibrary/Assets/MyAssetSet/Kubwa.SmartDoor.lsl @@ -0,0 +1,121 @@ +/* + 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(); + } + } + } +} \ No newline at end of file