<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=User%3AHidenori_Glushenko%2FSmoothOpeningDoor</id>
	<title>User:Hidenori Glushenko/SmoothOpeningDoor - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=User%3AHidenori_Glushenko%2FSmoothOpeningDoor"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Hidenori_Glushenko/SmoothOpeningDoor&amp;action=history"/>
	<updated>2026-07-20T11:09:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Hidenori_Glushenko/SmoothOpeningDoor&amp;diff=579753&amp;oldid=prev</id>
		<title>Hidenori Glushenko: Created page with &#039;== DoorInit ==  &lt;lsl&gt; /**  *    door-init.lsl  *    Released into the public domain by Hidenori Glushenko  */ default {     state_entry() {         list params = llGetPrimitivePa...&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Hidenori_Glushenko/SmoothOpeningDoor&amp;diff=579753&amp;oldid=prev"/>
		<updated>2009-10-07T08:55:03Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;== DoorInit ==  &amp;lt;lsl&amp;gt; &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;*  *    door-init.lsl  *    Released into the public domain by Hidenori Glushenko: &lt;/span&gt; default {     state_entry() {         list params = llGetPrimitivePa...&amp;#039;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== DoorInit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 *    door-init.lsl&lt;br /&gt;
 *    Released into the public domain by Hidenori Glushenko&lt;br /&gt;
 */&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        list params = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
        params = llListReplaceList(params,[&amp;lt;0.125,0.625,0.0&amp;gt;],2,2);&lt;br /&gt;
        llSetPrimitiveParams([PRIM_TYPE]+params+[PRIM_SIZE,&amp;lt;1.6,2.0,0.05&amp;gt;]);&lt;br /&gt;
        llRemoveInventory(llGetScriptName());        &lt;br /&gt;
    }    &lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SmoothOpeningDoor ==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*-------------------------------------------------------------------&lt;br /&gt;
 *  Smooth opening door script&lt;br /&gt;
 *  This door opens toward the directrion opposit to the avatar&amp;#039;s pos.&lt;br /&gt;
 *  Released into the public domain by Hidenori Glushenko&lt;br /&gt;
 *-------------------------------------------------------------------&lt;br /&gt;
 *  Please initialise your prim&amp;#039;s share using door_init.lsl&lt;br /&gt;
 *-------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
rotation    DOOR_ROT_ORG;                       //  base rotation&lt;br /&gt;
float       DOOR_DIV_EULER = 150.0;             //  open angle&lt;br /&gt;
float       DOOR_OPEN_SEC = 10.0;               //  open time(seconds)&lt;br /&gt;
float       DOOR_MOVE_TARGET;&lt;br /&gt;
integer     TIMER_COUNT;&lt;br /&gt;
integer     TIMER_MAX = 40;                     //  open speed&lt;br /&gt;
                                                //  larger is slower&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 *  @state  default state : initialize prim&amp;#039;s status&lt;br /&gt;
 */&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetBuoyancy(1.0);&lt;br /&gt;
        llMinEventDelay( 0.01 );&lt;br /&gt;
        llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
        llSetStatus(STATUS_BLOCK_GRAB, TRUE);&lt;br /&gt;
        state   DoorClose;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 *  @state  closed state&lt;br /&gt;
 */&lt;br /&gt;
state   DoorClose {&lt;br /&gt;
    touch_start(integer total_number) {&lt;br /&gt;
        DOOR_ROT_ORG = llGetRot();&lt;br /&gt;
 &lt;br /&gt;
        //  check the touched avatar&amp;#039;s position&lt;br /&gt;
        vector av_offset = (llDetectedPos(0)-llGetPos())/DOOR_ROT_ORG;&lt;br /&gt;
        float av_offset_z = av_offset.z;&lt;br /&gt;
 &lt;br /&gt;
        //  calculate the angle depend on the avatar&amp;#039;s pos&lt;br /&gt;
        DOOR_MOVE_TARGET = (av_offset_z/llFabs(av_offset_z))&lt;br /&gt;
                            *DOOR_DIV_EULER;&lt;br /&gt;
        state DoorOpen;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 *  @state  opening-opened-closing state&lt;br /&gt;
 */&lt;br /&gt;
state   DoorOpen {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        TIMER_COUNT = 0;&lt;br /&gt;
        llSetTimerEvent(0.05);&lt;br /&gt;
        llSetStatus(STATUS_PHANTOM, TRUE);          //  set phantom&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llSetStatus(STATUS_PHANTOM, FALSE);         //  set non-phantom when leaving this state&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer total_number) {&lt;br /&gt;
        //  restart timer&lt;br /&gt;
        llSetTimerEvent(0.05);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    timer() {&lt;br /&gt;
        rotation rot;&lt;br /&gt;
        ++TIMER_COUNT;                              //  count up&lt;br /&gt;
 &lt;br /&gt;
        //  If counter indicates starting door-close&lt;br /&gt;
        if (TIMER_COUNT == TIMER_MAX + 1) {&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);      //  set phantom&lt;br /&gt;
            llSetTimerEvent(0.05);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //  calculate door-angle from counter&lt;br /&gt;
        float x = PI_BY_TWO*TIMER_COUNT/(float)TIMER_MAX;   //  calculate x(means the ratio)&lt;br /&gt;
        float new_rot_euler = DOOR_MOVE_TARGET * llPow(llSin(x), 2.0);  //  calculate angle&lt;br /&gt;
        llRotLookAt(rot = (llEuler2Rot(&amp;lt;0.0,new_rot_euler,0.0&amp;gt;&lt;br /&gt;
            *DEG_TO_RAD))*DOOR_ROT_ORG,1.0,1.0);    //  set door angle&lt;br /&gt;
 &lt;br /&gt;
        //  stop when opened&lt;br /&gt;
        if (TIMER_COUNT == TIMER_MAX) {&lt;br /&gt;
            //  switch timer to the &amp;#039;open-time&amp;#039;&lt;br /&gt;
            llSetTimerEvent(DOOR_OPEN_SEC);&lt;br /&gt;
            llSleep(0.2);&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);     //  set non-phantom when opened&lt;br /&gt;
            llSetStatus(STATUS_PHYSICS, TRUE);      //  force update rotation&lt;br /&gt;
            llSetStatus(STATUS_PHYSICS, FALSE);     //  force update rotation&lt;br /&gt;
            llSetRot(rot);&lt;br /&gt;
 &lt;br /&gt;
        //  go to close state when closed&lt;br /&gt;
        } else if (TIMER_COUNT &amp;gt;= (TIMER_MAX*2)) {&lt;br /&gt;
            llSleep(0.2);&lt;br /&gt;
            llSetStatus(STATUS_PHYSICS, TRUE);      //  force update rotation&lt;br /&gt;
            llSetStatus(STATUS_PHYSICS, FALSE);     //  force update rotation&lt;br /&gt;
            llSetRot(DOOR_ROT_ORG);&lt;br /&gt;
            state DoorClose;            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hidenori Glushenko</name></author>
	</entry>
</feed>