OK.
Basicaly, both prims get the same script as far as movement is concerned.
The difference is that #2 has an additional link message that gets sent just before it starts it's move and #3 has a link message event handler that trigers it's move so it follows #2.
EG: #2 has 2 llLinkMessage statements. One to tell #3 to move up and one to tell #3 to move down. #3 has a link message event handler that you parse. if string == "move up" then setPos up. if string =="move down" then setPos down. etc...
Like much of the LSL language, it sounds more complicated than it is.
If you want the user to be able to touch #3 as well as #2 to make the prims drop down again, you need to have both prims send and listen for messages back and forth to each other (how my doors work).
Here's the basic logic I'm using. (You need to have 2 sends (one for open and one for close) and you need to parse the incomming message and take appropriate action on the receiving side.)
--EDIT--
OK, I've added a LOT more detail to the code. I didn't have much time the other night...

You could link the objects in a specific order and change the LINK_ALL_OTHERS to the specific prim you want in order to make the code below slightly more efficient as well.
door:
integer is_open = FALSE; // assume door starts out closed
vector open_vector;
vector closed_vector;
default
{
state_entry()
{
open_vector = (<YOUR VECTOR>);
closed_vector = (<YOUR VECTOR>);
}
touch_start
{
if ( is_open )
}
llLinkMessage(LINK_ALL_OTHERS, 0, "CLOSE WINDOW", NULL_KEY);
llSetPos(closed_vector);
is_open = TRUE;
{
else
{
llLinkMessage(LINK_ALL_OTHERS, 0, "OPEN WINDOW", NULL_KEY);
llSetPos(open_vector);
is_open = FALSE;
}
}
link_message(integer sender_num, integer num, string str, key id)
{
if ( str == "OPEN DOOR" )
{
llSetPos(open_vector);
is_open = FALSE;
}
if ( str == "CLOSE DOOR" )
{
llSetPos(closed_vector);
is_open = TRUE;
{
}
}
window:
integer is_open = FALSE; // assume window starts out closed
vector open_vector;
vector closed_vector;
default
{
state_entry()
{
open_vector = (<YOUR VECTOR>);
closed_vector = (<YOUR VECTOR>);
}
touch_start
{
if (is_open)
{
llLinkMessage(LINK_ALL_OTHERS, 0, "CLOSE DOOR", NULL_KEY);
llSetPos(closed_vector);
is_open = TRUE;
}
else
{
llLinkMessage(LINK_ALL_OTHERS, 0, "OPEN DOOR", NULL_KEY);
llSetPos(open_vector);
is_open = FALSE;
}
}
link_message(integer sender_num, integer num, string str, key id)
{
if ( str == "OPEN WINDOW" )
{
llSetPos(open_vector);
is_open = FALSE;
}
if ( str == "CLOSE WINDOW" )
{
llSetPos(closed_vector);
is_open = TRUE;
{
}
}
--END EDIT--
Racer P.