User:Cow Taurog/Sky elevator
This script makes a simple elevator that will warp between the ground and a certain height.
Sky elevator
Place this script in the main prim after all other objects have been placed inside. <lsl> integer giPlatChan=-6665; // Change both of these to something unique to each other integer giDialog=55234; // vector gvStartPos; vector gvDestPos; key gkOwner; string gsObjName="Sky platform"; list glBaseMenu=["Set height","Move to height","Move to ground","Rez plat","Unrez plat","Unrez all"]; string gsBaseMenuText="Pick an action"; list glPlatMenu=["10x10","20x20","30x30"]; string gsPlatMenu="Pick a size"; key gkDet; list glHeightMenu=["250","500","800","1000","1300","1600","2000"]; integer giListen0;
warpPos(vector destpos){if(destpos!=ZERO_VECTOR){
integer jumps=(integer)(llVecDist(destpos,llGetPos())/10)+1; if(jumps>411){jumps=411;}list rules=[PRIM_POSITION,destpos];integer count=1; while((count=count<<1)<jumps){rules=(rules=[])+rules+rules;} llSetPrimitiveParams((rules=[])+rules+llList2List(rules,(count-jumps)<<1,count)); if(llVecDist(llGetPos(),destpos)>0.001){while(--jumps){llSetPos(destpos);}}
}} basemenu(){llDialog(gkOwner,gsBaseMenuText,glBaseMenu,giDialog);} heightmenu(){llDialog(gkOwner,"Pick a height",glHeightMenu,giDialog);}
default{
state_entry(){ gkOwner=llGetOwner(); gvStartPos=llGetPos(); giListen0=llListen(giDialog,"",NULL_KEY,""); heightmenu(); state idle; } on_rez(integer param){llResetScript();}
} state idle{
state_entry(){ gkOwner=llGetOwner(); gvStartPos=llGetPos(); giListen0=llListen(giDialog,"",NULL_KEY,""); } touch_start(integer n){ basemenu(); } listen(integer chan,string name,key id,string mess){ if(mess=="Set height"){heightmenu();} if(mess=="Move to height"){state up;} if(mess=="Move to ground"){state down;} if(mess=="Rez plat"){llDialog(gkOwner,gsPlatMenu,glPlatMenu,giDialog);} if(mess=="Unrez plat"){llSay(giPlatChan,"unrez plat");} if(mess=="Unrez all"){llRegionSay(giPlatChan,"unrez plat");llDie();} if(mess=="150"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="250"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="500"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="650"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="800"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="1000"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="1300"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="1600"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="2000"){gvDestPos=<gvStartPos.x,gvStartPos.y,(float)mess>;basemenu();} if(mess=="10x10"){llRezAtRoot(mess+" platform",llGetPos()+<0,0,-2>,ZERO_VECTOR,llGetRot(),0);} if(mess=="20x20"){llRezAtRoot(mess+" platform",llGetPos()+<0,0,-2>,ZERO_VECTOR,llGetRot(),0);} if(mess=="30x30"){llRezAtRoot(mess+" platform",llGetPos()+<0,0,-2>,ZERO_VECTOR,llGetRot(),0);} } on_rez(integer param){llResetScript();}
}
state up{
state_entry(){ warpPos(gvDestPos); state idle; } on_rez(integer param){llResetScript();}
} state down{
state_entry(){ vector pp=llGetPos(); vector dd=<pp.x,pp.y,llGround(<0,0,0.2>)>; warpPos(dd); state idle; } on_rez(integer param){llResetScript();}
} </lsl>
Platform killer
Place this script into the platform objects that go inside the elevator. They will die when the command is issued to kill them from the elevator. <lsl> integer giChan=-6665; // Match this to the script above default{
state_entry(){ llListen(-6665,"",NULL_KEY,""); } listen(integer chan, string name, key id, string mess){ if(mess=="unrez plat"){llDie();} }
} </lsl>