tag:blogger.com,1999:blog-21095357175110615802009-05-25T06:43:39.430-07:00Secondlife Technology TalkRedhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-2109535717511061580.post-58565567948478324342008-11-26T20:26:00.000-08:002008-11-26T20:45:11.099-08:00Region wide door w/ Master ControllerOk, Zanthar on OS Scripters asked about a region wide door... figured I'd code in a blog post for a minute...<br /><br />Concept - Master Controller that you would list all the names in, slave door script that would talk to the master controller.<br /><br />**** Note. I never tried to compile this ******<br /><br />Master Controller<br />--<br /><br /><br />default<br />{<br /> list validusers = ["Redbeard McCellan"];<br /><br /> state_entry()<br /> {<br /> llSetName("DOORCONTROLLER");<br /> llListen(-8988,"", NULL_KEY, "");<br /> //Randomly picked a channel, but it needs to be static. <br /> }<br /><br /> listen( integer channel, string name, key id, string message )<br /> {<br /> if(llListFindList(validusers,(list)message) != -1)<br /> {<br /> llRegionSay(-8989,(string)id);<br /> }<br /> }<br /> <br />}<br /><br /><br /><br /><br />Door Script<br />--<br />default<br />{<br /> state_entry()<br /> {<br /> llListen(-8989, "DOORCONTROLLER", NULL_KEY, (string)llGetKey());<br /> //Randomly picked a channel, but it needs to be static. <br /> }<br /><br /> touch_start(integer total_number)<br /> {<br /> llRegionSay(-8988, (string)llDetectedName(0));<br /> }<br /><br /><br /> listen( integer channel, string name, key id, string message )<br /> {<br /> if(message == (string)llGetKey()) //expects back the it's own key if it is supposed to open<br /> {<br /> llSetTimerEvent(15);<br /> llSetAlpha(0,ALL_SIDES);<br /> llSetStatus(STATUS_PHANTOM,TRUE);<br /> }<br /> }<br /> <br /> timer()<br /> {<br /> llSetTimerEvent(0);<br /> llSetAlpha(1,ALL_SIDES);<br /> llSetStatus(STATUS_PHANTOM,FALSE);<br /> }<br />}<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-5856556794847832434?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0tag:blogger.com,1999:blog-2109535717511061580.post-24855488123517900892008-11-26T20:25:00.000-08:002008-11-26T20:26:38.354-08:00LazyI suppose I should get back into posting here.....<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-2485548812351790089?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0tag:blogger.com,1999:blog-2109535717511061580.post-48837104061163495762008-03-29T14:45:00.000-07:002008-03-30T09:38:40.364-07:00Rezzing obects - rotation adjustmentOn Scripters Support Group today someone asked about adjusting for rotation when rezzing objects.<br /><br />You can use llRot2Fwd, llRot2Up and llRot2Left to adjust.<br /><br />For example: <br /><br /> llRezAtRoot(llGetInventoryName(INVENTORY_OBJECT,0), llGetPos()-llRot2Fwd(llGetRot())+llRot2Left(llGetRot()),llGetVel(),llGetRot(),llGetStartParamater());<br /><br />Would (with not a lot of efficiency) rez the first object in inventory 1m to the rear and to the left.<br /><br />Wiki wiki wiki....<br /><br /><ul><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llRot2Fwd">llRot2Fwd</a><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llRot2Left">llRot2Left</a><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llRot2Up">llRot2Up</a><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llRezAtRoot">llRezAtRoot</a><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llGetVel">llGetVel</a><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llGetRot">llGetRot</a><br /><li><a href="http://lslwiki.net/lslwiki/wakka.php?wakka=llGetStartParamater">llGetStartParamater</a><br /></ul><br /><br />Jansen Miles IM'd me with a modification:<br /><br /><pre><br />//llRot2Fwd() and it's kin represent a normalization of 1.0. So just multiply that by your actual desired vector components!<br />default<br />{<br /><br /> touch_start(integer total_number)<br /> {<br /> //* Rezzed object offset from rezzer center.<br /> vector offset = <0, 0, 0.35>;<br /><br /> llRezObject(llGetInventoryName(INVENTORY_OBJECT,0),<br /> llGetPos() + (llRot2Fwd(llGetRot()) * offset.x) + (llRot2Left(llGetRot()) * offset.y) + (llRot2Up(llGetRot()) * offset.z),<br /> llGetVel(), llGetRot(), llGetStartParameter());<br /> <br /> }<br />}<br /></pre><br /><br /><br /><br />A slightly better example including Jansen's suggestion:<br /><pre><br /><br />string inventory_item;<br /><br />default<br />{<br /> state_entry()<br /> {<br /> inventory_item=llGetInventoryName(INVENTORY_OBJECT,0); // get the name of the first object in inventory<br /> }<br /> touch_start(integer p)<br /> {<br /> rot=llGetRot();<br /><br /> //a vector is used to represent your offset in terms of fwd/back, left,right, up/down<br /> // eg. <-2,0,1> would be 2m back, 1m up<br /><br /> vector offset=<-2,0,1>;<br /><br /><br /> vector rezpos=llGetPos() + (llRot2Fwd(rot) * offset.x) + (llRot2Left(rot) * offset.y) + (llRot2Up(rot) * offset.z);<br /><br /> llRezAtRoot(inventory_item, rezpos, ZERO_VECTOR, rot, 0);<br /> //ZERO_VECTOR is used instead of a velocity. One *could* use llGetVel if you "rezzer" is moving<br /> //the last "0' is the paramater that will be passed to on_rez in teh rezzed object<br /> <br /><br /> }<br />}<br /></pre><br /><br /><br />I like the use of the vector for offsets!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-4883710406116349576?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0tag:blogger.com,1999:blog-2109535717511061580.post-14970396833246558972008-03-20T22:26:00.000-07:002008-03-20T22:28:26.321-07:00A trick for flipping a flag in LSLChatting on the Scripters Support Group, <a href="http://www.slprofiles.com/webtab/Trent Platthy">Trent Platthy</a> posted an interesting trick I hadn't thought of before for flipping a flag variable.<br /><pre><br />flag=!flag;<br /></pre><br /><br />Nice and simple. :)<br /><br />A code example:<br /><pre><br />integer flag=0;<br />default<br />{<br /> state_entry()<br /> {<br /> llSay(0, "Hello, Avatar!");<br /> }<br /><br /> touch_start(integer total_number)<br /> {<br /> if(flag)<br /> {<br /> //flag is set<br /> llSay(0,"Flag is Set");<br /> }<br /> else<br /> {<br /> llSay(0,"Flag is not set.");<br /> }<br /> flag=!flag; //toggle<br /> }<br />}<br /></pre><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-1497039683324655897?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0tag:blogger.com,1999:blog-2109535717511061580.post-23260037072050263942008-03-15T07:47:00.000-07:002008-03-15T08:17:03.562-07:00Detailed example of a Dialog BoxDialog boxes are handled using the <a href="http://wiki.secondlife.com/wiki/LlDialog">llDialog</a> command. See the wiki for more details on the arguments.<br /><br />This example is a low-lag design of using llListen - it is called <b>after</b> touch_start is called so that the user's key can be added as a filter to the llListen call. Adding the user's key is the most efficient filter, but requires us to remember to remove the listen handle using <a href="http://wiki.secondlife.com/wiki/LlListenRemove">llListenRemove</a>. Note that we call this in two spots - in the listen() handler (a user successfully clicks Yes or No) or in the timer() handler to handle a timeout. <br /><br />To handle a timeout we also have to call <a href="http://wiki.secondlife.com/wiki/LlSetTimeEvent">llSetTimerEvent</a> in a few spots. In touch_start to start a timeout countdown, in listen to cancel the timeout if we receive a response and in timer itself to stop trigger a second timeout in th event a timeout occurs.<br /><br />Note the use of <a href="http://wiki.secondlife.com/wiki/LlFrand">llFrand</a> to assign a random channel for the <a href="http://wiki.secondlife.com/wiki/LlListen">llListen</a> and <a href="http://wiki.secondlife.com/wiki/LlDialog">llDialog</a> commands.<br /><br /><br /><pre><br />integer channel;<br />integer listenhandle;<br /><br />default<br />{<br /> state_entry()<br /> {<br /> channel=(integer)llFrand(10000)+100;<br /> }<br /><br /> touch_start(integer total_number)<br /> {<br /> //This example does not handle two people touching the prim at the same time<br /> //You should use a for loop and total_number to handle multiple clicks <br /> if(!listenhandle) // only act on touches if not already waiting for someone to answer<br /> {<br /> llSay(0, "Touched by "+llDetectedName(0));<br /> llSetTimerEvent(30); // give user 30 seconds to click<br /> listenhandle=llListen(channel, "", llDetectedKey(0), ""); // low lag only listen for one user.<br /> llDialog(llDetectedKey(0), "Answer Yes or No", ["Yes","No"],channel);<br /> }<br /> }<br /> timer()<br /> {<br /> llSetTimerEvent(0);<br /> llListenRemove(listenhandle); //stop listening<br /> llSay(0,"Timed out.");<br /><br /> }<br /> listen(integer chan, string name, key id, string message)<br /> {<br /> if(message=="Yes")<br /> {<br /> llSay(0,"Yes");<br /> }<br /> else if (message=="No")<br /> {<br /> llSay(0,"No");<br /> }<br /> llListenRemove(listenhandle); //stop listening<br /> llSetTimerEvent(0);<br /> }<br />}<br /></pre><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-2326003707205026394?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0tag:blogger.com,1999:blog-2109535717511061580.post-13456972697165672122008-03-12T00:45:00.000-07:002008-03-12T00:48:16.163-07:00Taryn London's websiteStayed up late helping Taryn get her blog rolling... Taryn is a great SL Mentor and will have lots of tips on her website. She's also going to be a host blogger here!<br /><br />Check out <a target=_NEW href="http://www.tarynlondon.com/blogengine.net/">www.TarynLondon.com</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-1345697269716567212?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com1tag:blogger.com,1999:blog-2109535717511061580.post-11565309974843106542008-03-11T20:21:00.000-07:002008-03-11T21:02:13.839-07:00Listen event fails after object changes ownershipA problem I often see on the the Scripting chat is about users that are having troubles with listen() events after an object's owner changes. (i.e. someone buys the object).<br /><br />This happens because users often call llListen() in the state_entry() handler and specify llGetOwner() as a filter. Using llGetOwner() as a filter is a good idea because it is the lowest lag option, but then special attention needs to be given on handling ownership changes.<br /><br />Fortunately, the changed() handler gives us an easy fix - simply add to your code a "changed handler" that resets the script [llResetScript()] on change of ownership.<br /><br />The code looks something like this:<br /><blockquote><pre><br />changed(integer change)<br />{<br /> if(change & CHANGED_OWNER)<br /> {<br /> llResetScript();<br /> }<br />}<br /><br /></pre><br /></blockquote><br />Note that the change integer in the arguments is bitwise compared to the constant CHANGED_OWNER. if(change==CHANGED_OWNER) would work most of the time, but it is possible to get a single call to changed() with multiple options bitwise ANDed together.<br /><br />I'll write future posts on how to avoid resetting the script and more about bitwise operations.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-1156530997484310654?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0tag:blogger.com,1999:blog-2109535717511061580.post-67384345843693543832008-03-11T17:21:00.000-07:002008-03-11T17:24:32.870-07:00Welcome to Secondlife Tech TalkWelcome to my new blog to talk about SL builds, scripts, clients, tweaks and easter eggs!<br /><br />I've been playing SL for a year and half; a mentor, a scripter, and a RL technology evangelist.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2109535717511061580-6738434584369354383?l=secondlife-tech.blogspot.com'/></div>Redhttp://www.blogger.com/profile/01219379636813301686noreply@blogger.com0