<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.osgrid.org/index.php?action=history&amp;feed=atom&amp;title=Door_script_0.4</id>
	<title>Door script 0.4 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.osgrid.org/index.php?action=history&amp;feed=atom&amp;title=Door_script_0.4"/>
	<link rel="alternate" type="text/html" href="http://wiki.osgrid.org/index.php?title=Door_script_0.4&amp;action=history"/>
	<updated>2026-10-25T11:50:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://wiki.osgrid.org/index.php?title=Door_script_0.4&amp;diff=310&amp;oldid=prev</id>
		<title>Osgridadmin: Created page with &quot;&lt;source lang=lsl&gt;  /*      Fu&#039;s talking door script       v0.4     - Actual door animation swingeryness      v0.3     - Access Control List (acl) for locking mechanism     - a...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.osgrid.org/index.php?title=Door_script_0.4&amp;diff=310&amp;oldid=prev"/>
		<updated>2018-07-20T20:52:13Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;source lang=lsl&amp;gt;  /*      Fu&amp;#039;s talking door script       v0.4     - Actual door animation swingeryness      v0.3     - Access Control List (acl) for locking mechanism     - a...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
    Fu&amp;#039;s talking door script &lt;br /&gt;
&lt;br /&gt;
    v0.4&lt;br /&gt;
    - Actual door animation swingeryness&lt;br /&gt;
&lt;br /&gt;
    v0.3&lt;br /&gt;
    - Access Control List (acl) for locking mechanism&lt;br /&gt;
    - acl check function&lt;br /&gt;
&lt;br /&gt;
    v0.2&lt;br /&gt;
    - locking door latch&lt;br /&gt;
    - &amp;quot;CONSTANTS&amp;quot; for code clarity&lt;br /&gt;
&lt;br /&gt;
    v0.1&lt;br /&gt;
    - state changes&lt;br /&gt;
    - passing data between states&lt;br /&gt;
    - llListen() and listen event handler&lt;br /&gt;
&lt;br /&gt;
    v0.0&lt;br /&gt;
    - basic states&lt;br /&gt;
&lt;br /&gt;
    (c)2017 - Fu Barr (OSGrid)&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
string  code_lock   = &amp;quot;Lockus locke&amp;quot;;&lt;br /&gt;
string  code_unlock = &amp;quot;Unlockus locke&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
list    acl         = [&amp;quot;Fu Barr&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string  latch;&lt;br /&gt;
&lt;br /&gt;
string  txt_unlocked    = &amp;quot;This door is now unlocked.&amp;quot;;&lt;br /&gt;
string  txt_locked      = &amp;quot;This door is now locked.&amp;quot;;&lt;br /&gt;
string  txt_noentry     = &amp;quot;Locked. Your pixels may not pass.&amp;quot;;&lt;br /&gt;
string  txt_noacl       = &amp;quot;You may not command this door.&amp;quot;;&lt;br /&gt;
string  txt_welcome     = &amp;quot;Welcome, &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
vector  door_rot_home   = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
float   door_rot_angle  = -110;&lt;br /&gt;
float   door_rot_time   = 2.0;&lt;br /&gt;
&lt;br /&gt;
key     avatar_uuid;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer acl_check(key uuid) {&lt;br /&gt;
//&lt;br /&gt;
// an empty acl list implies a lock open to all.&lt;br /&gt;
&lt;br /&gt;
    if(DEBUG){llOwnerSay(&amp;quot;acl_check() checking: &amp;quot; + uuid);}&lt;br /&gt;
&lt;br /&gt;
    if(llGetListLength(acl) &amp;gt; 0) {&lt;br /&gt;
&lt;br /&gt;
        if(llListFindList(acl, [llKey2Name(uuid)]) &amp;gt; -1) {&lt;br /&gt;
&lt;br /&gt;
            return TRUE;&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            return FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        if(DEBUG){llOwnerSay(&amp;quot;acl_check(): No ACL entries.&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
        return TRUE;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
door_swing(string direction) {&lt;br /&gt;
&lt;br /&gt;
    list mode;&lt;br /&gt;
&lt;br /&gt;
    if(direction == &amp;quot;OPEN&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
         mode = [KFM_MODE, KFM_FORWARD];&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
         mode = [KFM_MODE, KFM_REVERSE];        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llSetKeyframedMotion([&amp;lt;0.0, 0.0, 0.0&amp;gt;, llEuler2Rot(&amp;lt;0, 0, door_rot_angle&amp;gt; * DEG_TO_RAD), door_rot_time], mode);    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer somevalue) {&lt;br /&gt;
&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry() {&lt;br /&gt;
&lt;br /&gt;
        latch = &amp;quot;UNLOCKED&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        llSetRot(llEuler2Rot(door_rot_home * DEG_TO_RAD));&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;running &amp;quot; + llGetScriptName());&lt;br /&gt;
&lt;br /&gt;
        state closed;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state closed {&lt;br /&gt;
&lt;br /&gt;
    state_entry() {&lt;br /&gt;
&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, NULL_KEY, code_unlock);     // using two llListen() for early channel 0 chat filter&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, NULL_KEY, code_lock);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit() {&lt;br /&gt;
&lt;br /&gt;
        door_swing(&amp;quot;OPEN&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_end(integer num_detected){&lt;br /&gt;
&lt;br /&gt;
        if(latch == &amp;quot;LOCKED&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            llSay(0, txt_noentry);&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            avatar_uuid = llDetectedKey(0);&lt;br /&gt;
&lt;br /&gt;
            state open;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key uuid, string msg) {&lt;br /&gt;
&lt;br /&gt;
        if(DEBUG){llOwnerSay(&amp;quot;closed::listen() key: &amp;quot; + uuid);}&lt;br /&gt;
&lt;br /&gt;
        if(acl_check(uuid)) {&lt;br /&gt;
&lt;br /&gt;
            string txt;&lt;br /&gt;
&lt;br /&gt;
            if(msg == code_unlock){&lt;br /&gt;
&lt;br /&gt;
                latch = &amp;quot;UNLOCKED&amp;quot;;    &lt;br /&gt;
                txt   = txt_unlocked;&lt;br /&gt;
&lt;br /&gt;
            } else if(msg == code_lock) {&lt;br /&gt;
    &lt;br /&gt;
                latch = &amp;quot;LOCKED&amp;quot;;&lt;br /&gt;
                txt   = txt_locked;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            llSay(0, txt);&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            &lt;br /&gt;
            llSay(0, txt_noacl);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state open {&lt;br /&gt;
&lt;br /&gt;
    state_entry() {&lt;br /&gt;
&lt;br /&gt;
        llSay(0, txt_welcome + llKey2Name(avatar_uuid));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_end(integer num_detected) {&lt;br /&gt;
&lt;br /&gt;
        state closed;    &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    state_exit() {&lt;br /&gt;
&lt;br /&gt;
        door_swing(&amp;quot;CLOSE&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osgridadmin</name></author>
	</entry>
</feed>