<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Craftish+Resident</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Craftish+Resident"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Craftish_Resident"/>
	<updated>2026-04-06T14:11:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Craftish_Resident/php/SLRequestData&amp;diff=1196196</id>
		<title>User:Craftish Resident/php/SLRequestData</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Craftish_Resident/php/SLRequestData&amp;diff=1196196"/>
		<updated>2015-04-18T09:30:38Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Optimized Second Life HTTP request header-reading class for php&lt;br /&gt;
&lt;br /&gt;
Doesn&#039;t process headers unless they are used&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
slrequestdata.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/* *** -------------------------------------------------- *** */&lt;br /&gt;
/* ***      Copyright (c) 2013 by Craftish Resident       *** */&lt;br /&gt;
/* *** Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) *** */&lt;br /&gt;
/* ***   http://creativecommons.org/licenses/by-sa/3.0/   *** */&lt;br /&gt;
/* *** -------------------------------------------------- *** */&lt;br /&gt;
&lt;br /&gt;
class SLRequestData{&lt;br /&gt;
	private static $object_grid=FALSE;&lt;br /&gt;
	private static $object_name=FALSE;&lt;br /&gt;
	private static $object_key=FALSE;&lt;br /&gt;
	private static $object_pos=FALSE;&lt;br /&gt;
	private static $object_vel=FALSE;&lt;br /&gt;
	private static $object_rot=FALSE;&lt;br /&gt;
	private static $owner_key=FALSE;&lt;br /&gt;
	private static $owner_name=FALSE;&lt;br /&gt;
	private static $region_data=FALSE;&lt;br /&gt;
	private static $region_name=FALSE;&lt;br /&gt;
	private static $region_pos=FALSE;&lt;br /&gt;
	//&lt;br /&gt;
	private static $apachecheck=FALSE;&lt;br /&gt;
	private static $apache=FALSE;&lt;br /&gt;
	private static $headers;&lt;br /&gt;
	//&lt;br /&gt;
	private static function header_get($x){&lt;br /&gt;
		return array_key_exists($x,self::$headers)?self::$headers[$x]:&#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	public static function header($x) {&lt;br /&gt;
		if(self::$apachecheck===FALSE){&lt;br /&gt;
			self::$apache=function_exists(&#039;apache_request_headers&#039;);&lt;br /&gt;
			self::$headers=self::$apache?apache_request_headers():$GLOBALS[&#039;HTTP_ENV_VARS&#039;];&lt;br /&gt;
			self::$apachecheck=TRUE;&lt;br /&gt;
		}&lt;br /&gt;
		switch($x):default:&lt;br /&gt;
			return &#039;&#039;;&lt;br /&gt;
		break;case &#039;object_grid&#039;:&lt;br /&gt;
			return (self::$object_grid!==FALSE)?(self::$object_grid):(self::$object_grid=self::header_get(self::$apache?&#039;X-SecondLife-Shard&#039;:&#039;HTTP_X_SECONDLIFE_SHARD&#039;));&lt;br /&gt;
		break;case &#039;object_name&#039;:&lt;br /&gt;
			return (self::$object_name!==FALSE)?(self::$object_name):(self::$object_name=self::header_get(self::$apache?&#039;X-SecondLife-Object-Name&#039;:&#039;HTTP_X_SECONDLIFE_OBJECT_NAME&#039;));&lt;br /&gt;
		break;case &#039;object_key&#039;:&lt;br /&gt;
			return (self::$object_key!==FALSE)?(self::$object_key):(self::$object_key=self::header_get(self::$apache?&#039;X-SecondLife-Object-Key&#039;:&#039;HTTP_X_SECONDLIFE_OBJECT_KEY&#039;));&lt;br /&gt;
		break;case &#039;object_pos&#039;:&lt;br /&gt;
			if(self::$object_pos!==FALSE)return self::$object_pos;&lt;br /&gt;
			$temp1=self::header_get(self::$apache?&#039;X-SecondLife-Local-Position&#039;:&#039;HTTP_X_SECONDLIFE_LOCAL_POSITION&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#\(([\d.]+), ([\d.]+), ([\d.]+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			return self::$object_pos=@array(&#039;x&#039;=&amp;gt;(float)$temp2[1][0],&#039;y&#039;=&amp;gt;(float)$temp2[2][0],&#039;z&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
		break;case &#039;object_vel&#039;:&lt;br /&gt;
			if(self::$object_vel!==FALSE)return self::$object_vel;&lt;br /&gt;
			$temp1=self::header_get(self::$apache?&#039;X-SecondLife-Local-Velocity&#039;:&#039;HTTP_X_SECONDLIFE_LOCAL_VELOCITY&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#\(([\d.]+), ([\d.]+), ([\d.]+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			return self::$object_vel=@array(&#039;x&#039;=&amp;gt;(float)$temp2[1][0],&#039;y&#039;=&amp;gt;(float)$temp2[2][0],&#039;z&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
		break;case &#039;object_rot&#039;:&lt;br /&gt;
			if(self::$object_rot!==FALSE)return self::$object_rot;&lt;br /&gt;
			$temp1=self::header_get(self::$apache?&#039;X-SecondLife-Local-Rotation&#039;:&#039;HTTP_X_SECONDLIFE_LOCAL_ROTATION&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#\(([\d.]+), ([\d.]+), ([\d.]+), ([\d.]+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			return self::$object_rot=@array(&#039;x&#039;=&amp;gt;(float)$temp2[1][0],&#039;y&#039;=&amp;gt;(float)$temp2[2][0],&#039;z&#039;=&amp;gt;(float)$temp2[3][0],&#039;s&#039;=&amp;gt;(float)$temp2[4][0]);&lt;br /&gt;
		break;case &#039;owner_key&#039;:&lt;br /&gt;
			return (self::$owner_key!==FALSE)?(self::$owner_key):(self::$owner_key=self::header_get(self::$apache?&#039;X-SecondLife-Owner-Key&#039;:&#039;HTTP_X_SECONDLIFE_OWNER_KEY&#039;));&lt;br /&gt;
		break;case &#039;owner_name&#039;:&lt;br /&gt;
			return (self::$owner_name!==FALSE)?(self::$owner_name):(self::$owner_name=self::header_get(self::$apache?&#039;X-SecondLife-Owner-Name&#039;:&#039;HTTP_X_SECONDLIFE_OWNER_NAME&#039;));&lt;br /&gt;
		break;case &#039;region_data&#039;:&lt;br /&gt;
			return (self::$region_data!==FALSE)?(self::$region_data):(self::$region_data=self::header_get(self::$apache?&#039;X-SecondLife-Region&#039;:&#039;HTTP_X_SECONDLIFE_REGION&#039;));&lt;br /&gt;
		break;case &#039;region_name&#039;:&lt;br /&gt;
			if(self::$region_name!==FALSE)return self::$region_name;&lt;br /&gt;
			$temp1=self::header(&#039;region_data&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#([\w ]*)\s\((\d+), (\d+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			self::$region_pos=@array(&#039;x&#039;=&amp;gt;(float)$temp2[2][0],&#039;y&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
			return self::$region_name=@$temp2[1][0];&lt;br /&gt;
		break;case &#039;region_pos&#039;:&lt;br /&gt;
			if(self::$region_pos!==FALSE)return self::$region_pos;&lt;br /&gt;
			$temp1=self::header(&#039;region_data&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#([\w ]*)\s\((\d+), (\d+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			self::$region_name=@$temp2[1][0];&lt;br /&gt;
			return self::$region_pos=@array(&#039;x&#039;=&amp;gt;(float)$temp2[2][0],&#039;y&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
		break;case &#039;print_r&#039;:&lt;br /&gt;
			return print_r(array(&lt;br /&gt;
				&#039;object_grid&#039;=&amp;gt;self::header(&#039;object_grid&#039;),&lt;br /&gt;
				&#039;object_name&#039;=&amp;gt;self::header(&#039;object_name&#039;),&lt;br /&gt;
				&#039;object_key&#039;=&amp;gt;self::header(&#039;object_key&#039;),&lt;br /&gt;
				&#039;object_pos&#039;=&amp;gt;self::header(&#039;object_pos&#039;),&lt;br /&gt;
				&#039;object_vel&#039;=&amp;gt;self::header(&#039;object_vel&#039;),&lt;br /&gt;
				&#039;object_rot&#039;=&amp;gt;self::header(&#039;object_rot&#039;),&lt;br /&gt;
				&#039;owner_key&#039;=&amp;gt;self::header(&#039;owner_key&#039;),&lt;br /&gt;
				&#039;owner_name&#039;=&amp;gt;self::header(&#039;owner_name&#039;),&lt;br /&gt;
				&#039;region_data&#039;=&amp;gt;self::header(&#039;region_data&#039;),&lt;br /&gt;
				&#039;region_name&#039;=&amp;gt;self::header(&#039;region_name&#039;),&lt;br /&gt;
				&#039;region_pos&#039;=&amp;gt;self::header(&#039;region_pos&#039;),&lt;br /&gt;
			),TRUE);&lt;br /&gt;
		break;case &#039;headers&#039;:&lt;br /&gt;
			return print_r(self::$headers,TRUE);&lt;br /&gt;
		break;endswitch;&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
header(&#039;Content-Type: text/plain&#039;);&lt;br /&gt;
&lt;br /&gt;
include &#039;slrequestdata.php&#039;;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Hello &amp;quot; . SLRequestData::header(&#039;owner_name&#039;) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Outputs: Hello Craftish Resident&lt;br /&gt;
&lt;br /&gt;
$pos = SLRequestData::header(&#039;object_pos&#039;);&lt;br /&gt;
echo SLRequestData::header(&#039;object_name&#039;) . &amp;quot;&#039;s z position is {$pos[&#039;z&#039;]}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Outputs: Object&#039;s z position is 1400.5&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=MultiSoundWalker&amp;diff=1196195</id>
		<title>MultiSoundWalker</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=MultiSoundWalker&amp;diff=1196195"/>
		<updated>2015-04-18T09:23:48Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: Extended walker script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Script to have multiple sounds strung together in a walker. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
list soundlengths=[7.000,6.716];	// lengths of all the sounds in seconds; leave empty for automatic 10 second sounds&lt;br /&gt;
float lastsoundlength=10.0;	// used for the last sound only if not all lengths are set&lt;br /&gt;
&lt;br /&gt;
integer smooth_looping=1;	// this will loop sounds smoothly, but the lengths must be perfect&lt;br /&gt;
integer preload_sounds=1;	// this will preload sounds when switching regions&lt;br /&gt;
&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
/* ***   Copyright (c) 2015 by Craftish Resident   *** */&lt;br /&gt;
/* ***    Attribution 3.0 Unported (CC BY 3.0)     *** */&lt;br /&gt;
/* *** http://creativecommons.org/licenses/by/3.0/ *** */&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
/* *** - - - - - -  Walker script 1.1  - - - - - - *** */&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
&lt;br /&gt;
//	advanced settings&lt;br /&gt;
&lt;br /&gt;
list activate=[&amp;quot;Walking&amp;quot;,&amp;quot;Running&amp;quot;,&amp;quot;Turning Left&amp;quot;,&amp;quot;Turning Right&amp;quot;,&amp;quot;CrouchWalking&amp;quot;];&lt;br /&gt;
float interval=0.2;&lt;br /&gt;
float volume_decay=0.12;&lt;br /&gt;
float full_volume=1.0;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
list sounds=[];&lt;br /&gt;
integer totalsounds;&lt;br /&gt;
integer at=0;&lt;br /&gt;
&lt;br /&gt;
integer playing=0;&lt;br /&gt;
integer walking=0;&lt;br /&gt;
integer wasplaying=0;&lt;br /&gt;
integer stopping=0;&lt;br /&gt;
float currentsoundlen;&lt;br /&gt;
float currentplayed;&lt;br /&gt;
float volume=1.0;&lt;br /&gt;
&lt;br /&gt;
integer hasanimation=0;&lt;br /&gt;
integer cananimate=0;&lt;br /&gt;
string animationname;&lt;br /&gt;
key animationkey;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
preload(){&lt;br /&gt;
	if(preload_sounds){&lt;br /&gt;
		integer i=0;&lt;br /&gt;
		for(;i&amp;lt;totalsounds;++i){&lt;br /&gt;
			llPreloadSound(llList2String(sounds,i));&lt;br /&gt;
		}&lt;br /&gt;
		llSleep(2.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
start_animation(){&lt;br /&gt;
	if(hasanimation &amp;amp;&amp;amp; cananimate){&lt;br /&gt;
		llStartAnimation(animationname);&lt;br /&gt;
		animationkey=llList2Key(llGetAnimationList(llGetPermissionsKey()), -1);&lt;br /&gt;
		fixanim();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
start(){&lt;br /&gt;
	at=0;&lt;br /&gt;
	currentplayed=0.0;&lt;br /&gt;
	if(totalsounds&amp;gt;1){&lt;br /&gt;
		currentsoundlen=llList2Float(soundlengths,0);&lt;br /&gt;
		llPlaySound(llList2String(sounds,0),full_volume);&lt;br /&gt;
	}else{&lt;br /&gt;
		llLoopSound(llList2String(sounds,0),full_volume);&lt;br /&gt;
	}&lt;br /&gt;
	stopping=0;&lt;br /&gt;
	if(volume&amp;lt;full_volume){&lt;br /&gt;
		volume=full_volume;&lt;br /&gt;
		llAdjustSoundVolume(volume);&lt;br /&gt;
	}&lt;br /&gt;
	playing=1;&lt;br /&gt;
}&lt;br /&gt;
next(){&lt;br /&gt;
	at++;&lt;br /&gt;
	if(at==totalsounds)at=0;&lt;br /&gt;
	currentsoundlen=llList2Float(soundlengths,at);&lt;br /&gt;
	llPlaySound(llList2String(sounds,at),full_volume);&lt;br /&gt;
}&lt;br /&gt;
stop_animation(){&lt;br /&gt;
	if(hasanimation &amp;amp;&amp;amp; cananimate){&lt;br /&gt;
		llStopAnimation(animationname);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
stop(){&lt;br /&gt;
	llStopSound();&lt;br /&gt;
	currentplayed=0.0;&lt;br /&gt;
	stop_animation();&lt;br /&gt;
	playing=0;&lt;br /&gt;
}&lt;br /&gt;
fixanim(){&lt;br /&gt;
	if(hasanimation &amp;amp;&amp;amp; cananimate){&lt;br /&gt;
		list anims=llGetAnimationList(llGetPermissionsKey());&lt;br /&gt;
		integer len=llGetListLength(anims);&lt;br /&gt;
		integer i=0;&lt;br /&gt;
		for (;i&amp;lt;len;++i){&lt;br /&gt;
			if(llList2Key(anims,i)!=animationkey){&lt;br /&gt;
				llStopAnimation(llList2Key(anims,i));&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
	state_entry(){&lt;br /&gt;
		llStopSound();&lt;br /&gt;
		llSetSoundQueueing(smooth_looping);&lt;br /&gt;
		sounds=[];&lt;br /&gt;
		integer i=0;&lt;br /&gt;
		totalsounds=llGetInventoryNumber(INVENTORY_SOUND);&lt;br /&gt;
		for(i=0;i&amp;lt;totalsounds;++i){&lt;br /&gt;
			sounds+=[llGetInventoryName(INVENTORY_SOUND,i)];&lt;br /&gt;
		}&lt;br /&gt;
		for(i=llGetListLength(soundlengths)-1;i&amp;lt;totalsounds;++i){&lt;br /&gt;
			if(i==totalsounds-1){soundlengths+=[10.0];}else{soundlengths+=[lastsoundlength];}&lt;br /&gt;
		}&lt;br /&gt;
		if(llGetInventoryNumber(INVENTORY_ANIMATION)){&lt;br /&gt;
			hasanimation=1;&lt;br /&gt;
			animationname=llGetInventoryName(INVENTORY_ANIMATION,0);&lt;br /&gt;
			llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
		}&lt;br /&gt;
		volume=full_volume;&lt;br /&gt;
		preload();&lt;br /&gt;
		llSetTimerEvent(interval);&lt;br /&gt;
	}&lt;br /&gt;
	changed(integer x){&lt;br /&gt;
		if (x &amp;amp; CHANGED_INVENTORY){&lt;br /&gt;
			llSleep(3.0);&lt;br /&gt;
			llResetScript();&lt;br /&gt;
		}&lt;br /&gt;
		if(x &amp;amp; CHANGED_REGION){&lt;br /&gt;
			llSleep(1.5);&lt;br /&gt;
			preload();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	run_time_permissions(integer x){&lt;br /&gt;
		if (x &amp;amp; PERMISSION_TRIGGER_ANIMATION){&lt;br /&gt;
			cananimate=1;&lt;br /&gt;
		}else{&lt;br /&gt;
			cananimate=0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	attach(key id){&lt;br /&gt;
		if(id){&lt;br /&gt;
			cananimate=0;&lt;br /&gt;
			if(hasanimation){&lt;br /&gt;
				llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
				preload();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer(){&lt;br /&gt;
		currentplayed+=interval;&lt;br /&gt;
		//&lt;br /&gt;
		string anim=llGetAnimation(llGetOwner());&lt;br /&gt;
		walking=~llListFindList(activate,[anim]);&lt;br /&gt;
		//&lt;br /&gt;
		if(wasplaying!=walking){&lt;br /&gt;
			wasplaying=walking;&lt;br /&gt;
			if(walking){&lt;br /&gt;
				start_animation();&lt;br /&gt;
				if(playing){&lt;br /&gt;
					if(volume&amp;lt;full_volume){&lt;br /&gt;
						volume=full_volume;&lt;br /&gt;
						llAdjustSoundVolume(volume);&lt;br /&gt;
					}&lt;br /&gt;
					stopping=0;&lt;br /&gt;
				}else{&lt;br /&gt;
					start();&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				stopping=1;&lt;br /&gt;
				stop_animation();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if(playing){&lt;br /&gt;
			if(totalsounds&amp;gt;1){&lt;br /&gt;
				if(smooth_looping){&lt;br /&gt;
					if(currentplayed&amp;gt;currentsoundlen/2){&lt;br /&gt;
						currentplayed-=currentsoundlen;&lt;br /&gt;
						next();&lt;br /&gt;
					}&lt;br /&gt;
				}else{&lt;br /&gt;
					if(currentplayed&amp;gt;currentsoundlen-(interval/2)){&lt;br /&gt;
						currentplayed=0;&lt;br /&gt;
						next();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if(walking){&lt;br /&gt;
				fixanim();&lt;br /&gt;
			}else{&lt;br /&gt;
				if(stopping){&lt;br /&gt;
					volume-=volume_decay;&lt;br /&gt;
					llAdjustSoundVolume(volume);&lt;br /&gt;
					if(volume&amp;lt;0.0){&lt;br /&gt;
						stop();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	on_rez(integer x){&lt;br /&gt;
		llResetScript();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=MultiTimer&amp;diff=1196194</id>
		<title>MultiTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=MultiTimer&amp;diff=1196194"/>
		<updated>2015-04-18T09:12:48Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Small library to simplify the use of multiple timers in a script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
/* ***   Copyright (c) 2013 by Craftish Resident   *** */&lt;br /&gt;
/* ***    Attribution 3.0 Unported (CC BY 3.0)     *** */&lt;br /&gt;
/* *** http://creativecommons.org/licenses/by/3.0/ *** */&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
float   c_check_interval=0.5;&lt;br /&gt;
integer s_running_timers=0;&lt;br /&gt;
list    s_timers_nexts=[];&lt;br /&gt;
list    s_timers_intervals=[];&lt;br /&gt;
startTimer(integer x_id,float x_interval){&lt;br /&gt;
    integer shift=1&amp;lt;&amp;lt;x_id;&lt;br /&gt;
    if(s_running_timers==0)llSetTimerEvent(c_check_interval);&lt;br /&gt;
    if(!(s_running_timers&amp;amp;shift)){&lt;br /&gt;
        while(llGetListLength(s_timers_nexts)&amp;lt;=x_id){s_timers_nexts+=0.0;s_timers_intervals+=60.0;}&lt;br /&gt;
        s_timers_nexts=llListReplaceList(s_timers_nexts,[llGetTime()+x_interval],x_id,x_id);&lt;br /&gt;
        s_timers_intervals=llListReplaceList(s_timers_intervals,[x_interval],x_id,x_id);&lt;br /&gt;
        s_running_timers=s_running_timers|shift;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
stopTimer(integer x){&lt;br /&gt;
    integer shift=1&amp;lt;&amp;lt;x;&lt;br /&gt;
    if(s_running_timers&amp;amp;shift)s_running_timers=s_running_timers&amp;amp;(~shift);&lt;br /&gt;
    if(s_running_timers==0)llSetTimerEvent(0);&lt;br /&gt;
}&lt;br /&gt;
quickTimer(integer x){&lt;br /&gt;
    s_timers_nexts=llListReplaceList(s_timers_nexts,[llGetTime()],x,x);&lt;br /&gt;
}&lt;br /&gt;
restartTimer(integer x){&lt;br /&gt;
    if(s_running_timers&amp;amp;(1&amp;lt;&amp;lt;x)){&lt;br /&gt;
        stopTimer(x);&lt;br /&gt;
        startTimer(x,llList2Float(s_timers_intervals,x));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
integer checkTimer(integer x_timer){&lt;br /&gt;
    if(s_running_timers&amp;amp;(1&amp;lt;&amp;lt;x_timer)){&lt;br /&gt;
        float now=llGetTime();&lt;br /&gt;
        float next=llList2Float(s_timers_nexts,x_timer);&lt;br /&gt;
        if(now&amp;gt;next){&lt;br /&gt;
            float interval=llList2Float(s_timers_intervals,x_timer);&lt;br /&gt;
            next=next+interval;&lt;br /&gt;
            if(now&amp;gt;next+interval)next=now+interval;&lt;br /&gt;
            s_timers_nexts=llListReplaceList(s_timers_nexts,[next],x_timer,x_timer);&lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
&lt;br /&gt;
//    Timers can be set from 0 to 31&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        startTimer(0, 10.0);	//Set timer 0 to happen every 10 seconds&lt;br /&gt;
        startTimer(1, 5.0);	//Set timer 1 to happen every 5 seconds&lt;br /&gt;
        quickTimer(1);		//Tell timer 1 to happen right away&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(checkTimer(0))	//Check if timer 0 is ready to go off&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;10!&amp;quot;);&lt;br /&gt;
            stopTimer(0);	//Stop timer 0&lt;br /&gt;
        }&lt;br /&gt;
        if(checkTimer(1))	//Check if timer 1 is ready to go off&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;5!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_end(integer x)&lt;br /&gt;
    {&lt;br /&gt;
        restartTimer(1);	//Restart timer 1&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*    Output:&lt;br /&gt;
5! (Because we told timer 1 to go off right away)&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
10! (Only happens once because the timer is stopped here)&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
...&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Craftish_Resident/php/SLRequestData&amp;diff=1176784</id>
		<title>User:Craftish Resident/php/SLRequestData</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Craftish_Resident/php/SLRequestData&amp;diff=1176784"/>
		<updated>2013-02-16T11:01:28Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: PHP script for reading SL http request headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Optimized Second Life HTTP request header-reading class for php&lt;br /&gt;
&lt;br /&gt;
Doesn&#039;t process headers unless they are used&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
slrequestdata.php&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/* *** -------------------------------------------------- *** */&lt;br /&gt;
/* ***      Copyright (c) 2013 by Craftish Resident       *** */&lt;br /&gt;
/* *** Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) *** */&lt;br /&gt;
/* ***   http://creativecommons.org/licenses/by-sa/3.0/   *** */&lt;br /&gt;
/* *** -------------------------------------------------- *** */&lt;br /&gt;
&lt;br /&gt;
class SLRequestData{&lt;br /&gt;
	private static $object_grid=FALSE;&lt;br /&gt;
	private static $object_name=FALSE;&lt;br /&gt;
	private static $object_key=FALSE;&lt;br /&gt;
	private static $object_pos=FALSE;&lt;br /&gt;
	private static $object_vel=FALSE;&lt;br /&gt;
	private static $object_rot=FALSE;&lt;br /&gt;
	private static $owner_key=FALSE;&lt;br /&gt;
	private static $owner_name=FALSE;&lt;br /&gt;
	private static $region_data=FALSE;&lt;br /&gt;
	private static $region_name=FALSE;&lt;br /&gt;
	private static $region_pos=FALSE;&lt;br /&gt;
	//&lt;br /&gt;
	private static $apachecheck=FALSE;&lt;br /&gt;
	private static $apache=FALSE;&lt;br /&gt;
	private static $headers;&lt;br /&gt;
	//&lt;br /&gt;
	private static function header_get($x){&lt;br /&gt;
		return array_key_exists($x,self::$headers)?self::$headers[$x]:&#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	public static function header($x) {&lt;br /&gt;
		if(self::$apachecheck===FALSE){&lt;br /&gt;
			self::$apache=function_exists(&#039;apache_request_headers&#039;);&lt;br /&gt;
			self::$headers=self::$apache?apache_request_headers():$GLOBALS[&#039;HTTP_ENV_VARS&#039;];&lt;br /&gt;
			self::$apachecheck=TRUE;&lt;br /&gt;
		}&lt;br /&gt;
		switch($x):default:&lt;br /&gt;
			return &#039;&#039;;&lt;br /&gt;
		break;case &#039;object_grid&#039;:&lt;br /&gt;
			return (self::$object_grid!==FALSE)?(self::$object_grid):(self::$object_grid=self::header_get(self::$apache?&#039;X-SecondLife-Shard&#039;:&#039;HTTP_X_SECONDLIFE_SHARD&#039;));&lt;br /&gt;
		break;case &#039;object_name&#039;:&lt;br /&gt;
			return (self::$object_name!==FALSE)?(self::$object_name):(self::$object_name=self::header_get(self::$apache?&#039;X-SecondLife-Object-Name&#039;:&#039;HTTP_X_SECONDLIFE_OBJECT_NAME&#039;));&lt;br /&gt;
		break;case &#039;object_key&#039;:&lt;br /&gt;
			return (self::$object_key!==FALSE)?(self::$object_key):(self::$object_key=self::header_get(self::$apache?&#039;X-SecondLife-Object-Key&#039;:&#039;HTTP_X_SECONDLIFE_OBJECT_KEY&#039;));&lt;br /&gt;
		break;case &#039;object_pos&#039;:&lt;br /&gt;
			if(self::$object_pos!==FALSE)return self::$object_pos;&lt;br /&gt;
			$temp1=self::header_get(self::$apache?&#039;X-SecondLife-Local-Position&#039;:&#039;HTTP_X_SECONDLIFE_LOCAL_POSITION&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#\(([\d.]+), ([\d.]+), ([\d.]+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			return self::$object_pos=@array(&#039;x&#039;=&amp;gt;(float)$temp2[1][0],&#039;y&#039;=&amp;gt;(float)$temp2[2][0],&#039;z&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
		break;case &#039;object_vel&#039;:&lt;br /&gt;
			if(self::$object_vel!==FALSE)return self::$object_vel;&lt;br /&gt;
			$temp1=self::header_get(self::$apache?&#039;X-SecondLife-Local-Velocity&#039;:&#039;HTTP_X_SECONDLIFE_LOCAL_VELOCITY&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#\(([\d.]+), ([\d.]+), ([\d.]+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			return self::$object_vel=@array(&#039;x&#039;=&amp;gt;(float)$temp2[1][0],&#039;y&#039;=&amp;gt;(float)$temp2[2][0],&#039;z&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
		break;case &#039;object_rot&#039;:&lt;br /&gt;
			if(self::$object_rot!==FALSE)return self::$object_rot;&lt;br /&gt;
			$temp1=self::header_get(self::$apache?&#039;X-SecondLife-Local-Rotation&#039;:&#039;HTTP_X_SECONDLIFE_LOCAL_ROTATION&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#\(([\d.]+), ([\d.]+), ([\d.]+), ([\d.]+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			return self::$object_rot=@array(&#039;x&#039;=&amp;gt;(float)$temp2[1][0],&#039;y&#039;=&amp;gt;(float)$temp2[2][0],&#039;z&#039;=&amp;gt;(float)$temp2[3][0],&#039;s&#039;=&amp;gt;(float)$temp2[4][0]);&lt;br /&gt;
		break;case &#039;owner_key&#039;:&lt;br /&gt;
			return (self::$owner_key!==FALSE)?(self::$owner_key):(self::$owner_key=self::header_get(self::$apache?&#039;X-SecondLife-Owner-Key&#039;:&#039;HTTP_X_SECONDLIFE_OWNER_KEY&#039;));&lt;br /&gt;
		break;case &#039;owner_name&#039;:&lt;br /&gt;
			return (self::$owner_name!==FALSE)?(self::$owner_name):(self::$owner_name=self::header_get(self::$apache?&#039;X-SecondLife-Owner-Name&#039;:&#039;HTTP_X_SECONDLIFE_OWNER_NAME&#039;));&lt;br /&gt;
		break;case &#039;region_data&#039;:&lt;br /&gt;
			return (self::$region_data!==FALSE)?(self::$region_data):(self::$region_data=self::header_get(self::$apache?&#039;X-SecondLife-Region&#039;:&#039;HTTP_X_SECONDLIFE_REGION&#039;));&lt;br /&gt;
		break;case &#039;region_name&#039;:&lt;br /&gt;
			if(self::$region_name!==FALSE)return self::$region_name;&lt;br /&gt;
			$temp1=self::header(&#039;region_data&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#([\w ]*)\s\((\d+), (\d+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			self::$region_pos=@array(&#039;x&#039;=&amp;gt;(float)$temp2[2][0],&#039;y&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
			return self::$region_name=@$temp2[1][0];&lt;br /&gt;
		break;case &#039;region_pos&#039;:&lt;br /&gt;
			if(self::$region_pos!==FALSE)return self::$region_pos;&lt;br /&gt;
			$temp1=self::header(&#039;region_data&#039;);&lt;br /&gt;
			$temp2;&lt;br /&gt;
			preg_match_all(&#039;#([\w ]*)\s\((\d+), (\d+)\)#i&#039;,$temp1,$temp2);&lt;br /&gt;
			self::$region_name=@$temp2[1][0];&lt;br /&gt;
			return self::$region_pos=@array(&#039;x&#039;=&amp;gt;(float)$temp2[2][0],&#039;y&#039;=&amp;gt;(float)$temp2[3][0]);&lt;br /&gt;
		break;case &#039;print_r&#039;:&lt;br /&gt;
			return print_r(array(&lt;br /&gt;
				&#039;object_grid&#039;=&amp;gt;self::header(&#039;object_grid&#039;),&lt;br /&gt;
				&#039;object_name&#039;=&amp;gt;self::header(&#039;object_name&#039;),&lt;br /&gt;
				&#039;object_key&#039;=&amp;gt;self::header(&#039;object_key&#039;),&lt;br /&gt;
				&#039;object_pos&#039;=&amp;gt;self::header(&#039;object_pos&#039;),&lt;br /&gt;
				&#039;object_vel&#039;=&amp;gt;self::header(&#039;object_vel&#039;),&lt;br /&gt;
				&#039;object_rot&#039;=&amp;gt;self::header(&#039;object_rot&#039;),&lt;br /&gt;
				&#039;owner_key&#039;=&amp;gt;self::header(&#039;owner_key&#039;),&lt;br /&gt;
				&#039;owner_name&#039;=&amp;gt;self::header(&#039;owner_name&#039;),&lt;br /&gt;
				&#039;region_data&#039;=&amp;gt;self::header(&#039;region_data&#039;),&lt;br /&gt;
				&#039;region_name&#039;=&amp;gt;self::header(&#039;region_name&#039;),&lt;br /&gt;
				&#039;region_pos&#039;=&amp;gt;self::header(&#039;region_pos&#039;),&lt;br /&gt;
			),TRUE);&lt;br /&gt;
		break;case &#039;headers&#039;:&lt;br /&gt;
			return print_r(self::$headers,TRUE);&lt;br /&gt;
		break;endswitch;&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
header(&#039;Content-Type: text/plain&#039;);&lt;br /&gt;
&lt;br /&gt;
include &#039;slrequestdata.php&#039;;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Hello &amp;quot; . SLRequestData::header(&#039;owner_name&#039;) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Outputs: Hello Craftish Resident&lt;br /&gt;
&lt;br /&gt;
$pos = SLRequestData::header(&#039;object_pos&#039;);&lt;br /&gt;
echo SLRequestData::header(&#039;object_name&#039;) . &amp;quot;&#039;s z position is {$pos[&#039;z&#039;]}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Outputs: Object&#039;s z position is 1400.5&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=MultiTimer&amp;diff=1175977</id>
		<title>MultiTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=MultiTimer&amp;diff=1175977"/>
		<updated>2013-01-08T22:43:27Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Small library to simplify the use of multiple timers in a script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
/* ***   Copyright (c) 2013 by Craftish Resident   *** */&lt;br /&gt;
/* ***    Attribution 3.0 Unported (CC BY 3.0)     *** */&lt;br /&gt;
/* *** http://creativecommons.org/licenses/by/3.0/ *** */&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
float   c_check_interval=0.5;&lt;br /&gt;
integer s_running_timers=0;&lt;br /&gt;
list    s_timers_nexts=[];&lt;br /&gt;
list    s_timers_intervals=[];&lt;br /&gt;
startTimer(integer x_id,float x_interval){&lt;br /&gt;
    integer shift=1&amp;lt;&amp;lt;x_id;&lt;br /&gt;
    if(s_running_timers==0)llSetTimerEvent(c_check_interval);&lt;br /&gt;
    if(!(s_running_timers&amp;amp;shift)){&lt;br /&gt;
        while(llGetListLength(s_timers_nexts)&amp;lt;=x_id){s_timers_nexts+=0.0;s_timers_intervals+=60.0;}&lt;br /&gt;
        s_timers_nexts=llListReplaceList(s_timers_nexts,[llGetTime()+x_interval],x_id,x_id);&lt;br /&gt;
        s_timers_intervals=llListReplaceList(s_timers_intervals,[x_interval],x_id,x_id);&lt;br /&gt;
        s_running_timers=s_running_timers|shift;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
stopTimer(integer x){&lt;br /&gt;
    integer shift=1&amp;lt;&amp;lt;x;&lt;br /&gt;
    if(s_running_timers&amp;amp;shift)s_running_timers=s_running_timers&amp;amp;(~shift);&lt;br /&gt;
    if(s_running_timers==0)llSetTimerEvent(0);&lt;br /&gt;
}&lt;br /&gt;
quickTimer(integer x){&lt;br /&gt;
    s_timers_nexts=llListReplaceList(s_timers_nexts,[llGetTime()],x,x);&lt;br /&gt;
}&lt;br /&gt;
restartTimer(integer x){&lt;br /&gt;
    if(s_running_timers&amp;amp;(1&amp;lt;&amp;lt;x)){&lt;br /&gt;
        stopTimer(x);&lt;br /&gt;
        startTimer(x,llList2Float(s_timers_intervals,x));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
integer checkTimer(integer x_timer){&lt;br /&gt;
    if(s_running_timers&amp;amp;(1&amp;lt;&amp;lt;x_timer)){&lt;br /&gt;
        float now=llGetTime();&lt;br /&gt;
        float next=llList2Float(s_timers_nexts,x_timer);&lt;br /&gt;
        if(now&amp;gt;next){&lt;br /&gt;
            float interval=llList2Float(s_timers_intervals,x_timer);&lt;br /&gt;
            next=next+interval;&lt;br /&gt;
            if(now&amp;gt;next+interval)next=now+interval;&lt;br /&gt;
            s_timers_nexts=llListReplaceList(s_timers_nexts,[next],x_timer,x_timer);&lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
&lt;br /&gt;
//    Timers can be set from 0 to 31&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        startTimer(0, 10.0);	//Set timer 0 to happen every 10 seconds&lt;br /&gt;
        startTimer(1, 5.0);	//Set timer 1 to happen every 5 seconds&lt;br /&gt;
        quickTimer(1);		//Tell timer 1 to happen right away&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(checkTimer(0))	//Check if timer 0 is ready to go off&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;10!&amp;quot;);&lt;br /&gt;
            stopTimer(0);	//Stop timer 0&lt;br /&gt;
        }&lt;br /&gt;
        if(checkTimer(1))	//Check if timer 1 is ready to go off&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;5!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_end(integer x)&lt;br /&gt;
    {&lt;br /&gt;
        restartTimer(1);	//Restart timer 1&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*    Output:&lt;br /&gt;
5! (Because we told timer 1 to go off right away)&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
10! (Only happens once because the timer is stopped here)&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
...&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=MultiTimer&amp;diff=1175976</id>
		<title>MultiTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=MultiTimer&amp;diff=1175976"/>
		<updated>2013-01-08T22:22:43Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: Small library to simplify the use of multiple timers in a script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Small library to simplify the use of multiple timers in a script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
/* ***   Copyright (c) 2013 by Craftish Resident   *** */&lt;br /&gt;
/* ***    Attribution 3.0 Unported (CC BY 3.0)     *** */&lt;br /&gt;
/* *** http://creativecommons.org/licenses/by/3.0/ *** */&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
integer	s_running_timers=0;&lt;br /&gt;
list	s_timers_nexts=[];&lt;br /&gt;
list	s_timers_intervals=[];&lt;br /&gt;
startTimer(integer x_id,float x_interval){&lt;br /&gt;
	integer shift=1&amp;lt;&amp;lt;x_id;&lt;br /&gt;
	if(s_running_timers==0)llSetTimerEvent(0.5);&lt;br /&gt;
	if(!(s_running_timers&amp;amp;shift)){&lt;br /&gt;
		while(llGetListLength(s_timers_nexts)&amp;lt;=x_id){s_timers_nexts+=0.0;s_timers_intervals+=60.0;}&lt;br /&gt;
		s_timers_nexts=llListReplaceList(s_timers_nexts,[llGetTime()+x_interval],x_id,x_id);&lt;br /&gt;
		s_timers_intervals=llListReplaceList(s_timers_intervals,[x_interval],x_id,x_id);&lt;br /&gt;
		s_running_timers=s_running_timers|shift;&lt;br /&gt;
}	}&lt;br /&gt;
stopTimer(integer x){&lt;br /&gt;
	integer shift=1&amp;lt;&amp;lt;x;&lt;br /&gt;
	if(s_running_timers&amp;amp;shift)s_running_timers=s_running_timers&amp;amp;(~shift);&lt;br /&gt;
	if(s_running_timers==0)llSetTimerEvent(0);&lt;br /&gt;
}&lt;br /&gt;
quickTimer(integer x){&lt;br /&gt;
	s_timers_nexts=llListReplaceList(s_timers_nexts,[llGetTime()],x,x);&lt;br /&gt;
}&lt;br /&gt;
restartTimer(integer x){&lt;br /&gt;
	if(s_running_timers&amp;amp;(1&amp;lt;&amp;lt;x)){&lt;br /&gt;
		stopTimer(x);&lt;br /&gt;
		startTimer(x,llList2Float(s_timers_intervals,x));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
integer checkTimer(integer x_timer){&lt;br /&gt;
	if(s_running_timers&amp;amp;(1&amp;lt;&amp;lt;x_timer)){&lt;br /&gt;
		float now=llGetTime();&lt;br /&gt;
		float next=llList2Float(s_timers_nexts,x_timer);&lt;br /&gt;
		if(now&amp;gt;next){&lt;br /&gt;
			float interval=llList2Float(s_timers_intervals,x_timer);&lt;br /&gt;
			next=next+interval;&lt;br /&gt;
			if(now&amp;gt;next+interval)next=now+interval;&lt;br /&gt;
			s_timers_nexts=llListReplaceList(s_timers_nexts,[next],x_timer,x_timer);&lt;br /&gt;
			return 1;&lt;br /&gt;
	}	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
/* *** ------------------------------------------- *** */&lt;br /&gt;
&lt;br /&gt;
//	Timers can be set from 0 to 31&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
	state_entry(){&lt;br /&gt;
		startTimer(0,10.0);		//Set timer 0 to happen every 10 seconds&lt;br /&gt;
		startTimer(1,5.0);		//Set timer 1 to happen every 5 seconds&lt;br /&gt;
		quickTimer(1);			//Tell timer 1 to happen right away&lt;br /&gt;
	}&lt;br /&gt;
	timer(){&lt;br /&gt;
		if(checkTimer(0)){		//Check if timer 0 is ready to go off&lt;br /&gt;
			llOwnerSay(&amp;quot;10!&amp;quot;);&lt;br /&gt;
			stopTimer(0);		//Stop timer 0&lt;br /&gt;
		}&lt;br /&gt;
		if(checkTimer(1)){		//Check if timer 1 is ready to go off&lt;br /&gt;
			llOwnerSay(&amp;quot;5!&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	touch_end(integer x){&lt;br /&gt;
		restartTimer(1);		//Restart timer 1&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*	Output:&lt;br /&gt;
5! (Because we told timer 1 to go off right away)&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
10! (Only happens once because the timer is stopped here)&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
5!&lt;br /&gt;
[pause for 5 seconds]&lt;br /&gt;
...&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=String2Hex&amp;diff=1172957</id>
		<title>String2Hex</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=String2Hex&amp;diff=1172957"/>
		<updated>2012-09-30T05:47:47Z</updated>

		<summary type="html">&lt;p&gt;Craftish Resident: Created page with &amp;quot;&amp;lt;lsl&amp;gt;  string c_chr=&amp;quot; !\&amp;quot;#$%&amp;amp;&amp;#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~&amp;quot;;   //	http://wiki.secondlife.com/wiki/Int2Hex string int2h…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
string c_chr=&amp;quot; !\&amp;quot;#$%&amp;amp;&#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//	http://wiki.secondlife.com/wiki/Int2Hex&lt;br /&gt;
string int2hex(integer x){&lt;br /&gt;
	string toret;&lt;br /&gt;
	do{&lt;br /&gt;
		toret=llGetSubString(&amp;quot;0123456789ABCDEF&amp;quot;,x&amp;amp;0x0000000F,x&amp;amp;0x0000000F)+toret;&lt;br /&gt;
	}while (x=x&amp;gt;&amp;gt;4&amp;amp;0x0FFFFFFF);&lt;br /&gt;
	return toret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string str2hex(string str){&lt;br /&gt;
	string ret=&amp;quot;&amp;quot;;&lt;br /&gt;
	integer strlen=llStringLength(str);&lt;br /&gt;
	integer i=0;&lt;br /&gt;
	for(;i&amp;lt;strlen;++i){&lt;br /&gt;
		ret+=int2hex(32+llSubStringIndex(c_chr,llGetSubString(str,i,i)));&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string hex2str(string str){&lt;br /&gt;
	string ret=&amp;quot;&amp;quot;;&lt;br /&gt;
	integer strlen=llStringLength(str);&lt;br /&gt;
	integer i=0;integer index;&lt;br /&gt;
	for(;i&amp;lt;strlen;i+=2){&lt;br /&gt;
		index=((integer)(&amp;quot;0x&amp;quot;+llGetSubString(str,i,i+1)))-32;&lt;br /&gt;
		ret+=llGetSubString(c_chr,index,index);&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
	state_entry(){&lt;br /&gt;
		llOwnerSay(str2hex(&amp;quot;test ~&amp;quot;));&lt;br /&gt;
		llOwnerSay(hex2str(&amp;quot;74657374207E&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craftish Resident</name></author>
	</entry>
</feed>