Join us in Outworldz at www.outworldz.com:9000 or follow us:

Search dozens of selected web sites for OpenSim and LSL script

New! Script Meta-Search will search thousands of scripts here and at other sites for LSL or Opensim scripts.
Loading

Want to add a script or a project? Upload it and a half million people will see it and your name here this year.

Home   Show All
Category: Contributor: Creator
Bird Roaming Owl  

Roaming Owl

Owl wing

Category: Bird
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life

the Zip file

Download all files for Roaming Owl
Contents are in zip format, with .LSL (text) source code and LSLEdit (text + Solution) formats.
Get file # 1. flap wing.lsl
Get file # 2. animator.lsl
Get file # 3. controller.lsl
Get file # 4. Owl script.lsl
Get file # 5. squirrel.lsl

This script by Ferd Frederix may be used in any manner, modified, and republished.  Unless specified otherwise, my scripts are always free and open source.  Objects made with these scripts may be sold with no restrictions.  All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.

1
2 // wing flap timer
3
4 default
5 {
6
7
8 timer()
9 {
10 llMessageLinked(LINK_SET,0,"down","");
12
13 }
14
15 link_message(integer sender,integer num, string str, key id)
16 {
17
18 if(str == "flap")
19 {
20 llMessageLinked(LINK_SET,0,"up","");
21 llSetTimerEvent(0.5);
22 }
23
24 }
25
26 }

Roaming Owl

Prim animator

Category: Bird
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life


This script by Ferd Frederix may be used in any manner, modified, and republished.  Unless specified otherwise, my scripts are always free and open source.  Objects made with these scripts may be sold with no restrictions.  All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.

1
2
3
4 //You can now animate any object, with just one script!  Setup is very simple. Just drop the script and a blank notecard into the object, click the object, and give your animation a name.  Move all the prims around, and click Record. When done, click the Animation Name, and watch it play back every move!
5
6 // Downloaded from : http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1519
7
8 // This program is free software; you can redistribute it and/or modify it.
9 // Additional Licenes may apply that prevent you from selling this code
10 // and these licenses may require you to publish any changes you make on request.
11 //
12 // There are literally thousands of hours of work in these scripts. Please respect
13 // the creators wishes and follow their license requirements.
14 //
15 // Any License information included herein must be included in any script you give out or use.
16 // Licenses are included in the script or comments by the original author, in which case
17 // the authors license must be followed.
18
19 // A GNU license, if attached by the author, means the original code must be FREE.
20 // Modifications can be made and products sold with the scripts in them.
21 // You cannot attach a license to make this GNU License
22 // more or less restrictive. see http://www.gnu.org/copyleft/gpl.html
23
24 // Creative Commons licenses apply to all scripts from the Second Life
25 // wiki and script library and are Copyrighted by Linden Lab. See
26 // http://creativecommons.org/licenses/
27
28 // Please leave any author credits and headers intact in any script you use or publish.
29 // If you don't like these restrictions, then don't use these scripts.
30 //////////////////////// ORIGINAL AUTHORS CODE BEGINS ////////////////////////////////////////////
31 // One Script Prim Animation
32
33 // Original Script by: Ferd Frederix
34 // No Spam version by: Gino Rascon
35
36 integer runtime = TRUE; // set to TRUE after making the notecard
37
38 string NOTECARD = "Movement"; // the notecard for this script, you can add more than 1 script and notecard, just change this line to match
39 integer playchannel = 1; // the playback channel, this is the channel you use in LinkMessages
40
41
42 integer debug = FALSE; // if set to TRUE, debug info appears
43
44
45 // notecard reading
46 string priorname; // the prior animation name so we can spot differences as we read them in
47 integer iIndexLines; // lines in a card
48 integer inotecardIndex = 0; // notecard counter;
49 integer move = 0; // N movements rea from the notecard
50
51 key kNoteCardLines; // the key of the notecard
52 key kGetIndexLines; // the key of the current line
53
54 //communications
55 integer dialogchannel ; // dialog boxes
56
57 integer nPrims; // total number of prims
58 integer PrimsCounter = 0; // how many have checked in
59 integer timercounter = 0; // how many seconds have gone by
60 integer wantname; // flag indicating we are waiting for a name to be chatted
61
62
63 // the list of coords
64 list masterlist; // master list of all positions
65 list llastPrimList; // storage of the last prim position we learned
66 string curranimation; // what we are playing
67
68 integer STRIDE = 5; // size of the master list
69 integer lastSTRIDE = 4; // size of the last prim list
70
71 integer listener; // temp listener when we are waiting for them to give us a name
72
73 vector InitSize; // the initial size when the prims were recorded
74 list LoadedAnims; // animations read from the notecard added to the Menu display
75
76 // in case of hand editing, we wupe out extra stuff at end
77 string Getline(list Input, integer line)
78 {
79 return llStringTrim(llList2String(Input, line),STRING_TRIM);
80 }
81
82 Record()
83 {
84 if(llStringLength(curranimation) > 0)
85 {
86 integer foundmovement = 0; // will be set if any child moved
87 integer PrimCounter ; // skip past the root prim
88 for (PrimCounter =2; PrimCounter <= nPrims; PrimCounter++ )
89 {
90 list my_list = llGetLinkPrimitiveParams(PrimCounter,[PRIM_POSITION,PRIM_ROTATION, PRIM_SIZE ]);
91 // position is always in region coordinates, even if the prim is a child or the root prim of an attachment.
92 // rot is always the global rotation, even if the prim is a child or the root prim of an attachment.
93
94 // get current prim pos, rot and size
95 vector vrealPrimPos = llList2Vector(my_list,0) - llGetPos(); // position subtract Global Pos
96 vrealPrimPos /= llGetRot();
97 rotation rrealPrimRot = llList2Rot(my_list,1) / llGetRot(); // rotation subtract Global Rot
98 vector vrealPrimSize = llList2Vector(my_list,2); // size
99
100 // compare it to the last one we had, stride of list is a 4, and it is already sorted
101 integer iindex = (PrimCounter - 2) * lastSTRIDE; // zeroth position is PrimCounter - start, or 2
102
103 // get the last thing we remembered about this prim
104 float fprimNum = llList2Integer(llastPrimList, iindex); // must be 0,1,2, in order
105 vector vlastPrimPos = llList2Vector(llastPrimList, iindex+1);
106 rotation rlastPrimRot = llList2Rot(llastPrimList, iindex+2);
107 vector vlastPrimSize = llList2Vector(llastPrimList, iindex+3);
108
109 // if anything changed on this prim, we must record it.
110 if(vlastPrimPos != vrealPrimPos ||
111 rlastPrimRot != rrealPrimRot ||
112 vlastPrimSize!= vrealPrimSize
113 )
114 {
115 foundmovement++;
116
117 // show owner any changes they mnade
118 if(debug)
119 {
120 llOwnerSay("prim:" + (string) PrimCounter);
121
122 if(vlastPrimPos != vrealPrimPos)
123 llOwnerSay("pos delta :" + (string) (vrealPrimPos - vlastPrimPos));
124
125 if(rlastPrimRot != rrealPrimRot)
126 llOwnerSay("rot delta:" + (string) (llRot2Euler(rrealPrimRot - rlastPrimRot) * RAD_TO_DEG));
127
128 if(vlastPrimSize != vrealPrimSize)
129 llOwnerSay("size delta:" + (string) (vrealPrimSize - vlastPrimSize));
130 }
131
132 //Save them in the master list of all animations
133 masterlist += curranimation;
134 masterlist += PrimCounter;
135 masterlist += vrealPrimPos;
136 masterlist += rrealPrimRot;
137 masterlist += vrealPrimSize;
138
139 // save them in the last movement list
140 integer saved = FALSE;
141 integer i;
142 integer imax = llGetListLength(llastPrimList);
143 // save the changes in the last prim list so we can keep our lists smaller
144 for ( i=0; i < imax; i += lastSTRIDE )
145 {
146 if(llList2Float(llastPrimList,i) == PrimCounter)
147 {
148 llastPrimList = llListReplaceList(llastPrimList,[vrealPrimPos],i+1,i+1);
149 llastPrimList = llListReplaceList(llastPrimList,[rrealPrimRot],i+2,i+2);
150 llastPrimList = llListReplaceList(llastPrimList,[vrealPrimSize],i+3,i+3);
151 if(debug) llOwnerSay("In history at position " + (string) (i/lastSTRIDE));
152 saved++;
153 }
154 }
155
156 // never moved before? add it then
157 if(! saved)
158 {
159 if(debug) llOwnerSay("Someone added a new prim and then clicked Record");
160 llastPrimList += PrimCounter;
161 llastPrimList += vrealPrimPos;
162 llastPrimList += rrealPrimRot;
163 llastPrimList += vrealPrimSize;
164 }
165 } // if
166 } // for
167 if(debug) llOwnerSay("history:" + llDumpList2String(llastPrimList,":"));
168
169 if(!foundmovement)
170 llOwnerSay("You must move at least one child prim.");
171 }
172 else
173 {
174 llOwnerSay("You must name your animation.");
175 llOwnerSay("Type the new animation name on channel /" + (string) dialogchannel);
176 wantname++;
177 }
178 }
179
180 // on reset, record the base position in history so we can see changes
181 Clear()
182 {
183 LoadedAnims = []; // wipe out Menu
184 masterlist = []; // wipe all recordings
185 llastPrimList = []; // wipe last animations
186 integer PrimCounter ; // skip 1, which is the root prim
187 integer counter = 0;
188 // save all the current settings in memory
189 for (PrimCounter=2; PrimCounter <= nPrims; PrimCounter++ )
190 {
191 list my_list = llGetLinkPrimitiveParams(PrimCounter,[PRIM_POSITION,PRIM_ROTATION, PRIM_SIZE ]);
192
193 // save the local pos and rot, since llGetLinkPrimitiveParams returns global pos and rot
194 vector primpos = llList2Vector(my_list,0) - llGetPos();
195 rotation primrot = llList2Rot(my_list,1) / llGetRot();
196 vector primsize = llList2Vector(my_list,2) ;
197
198 llastPrimList += PrimCounter;
199 llastPrimList += primpos;
200 llastPrimList += primrot;
201 llastPrimList += primsize;
202 counter++;
203 }
204 if(debug) llOwnerSay("Saved " + (string) counter + " prims initial position in history");
205 }
206
207 DumpBack ()
208 {
209 integer i;
210 integer imax = llGetListLength(masterlist);
211 integer howmany = imax / STRIDE ;
212 llOwnerSay((string) howmany + " movements recorded - copy these and paste them into the notecard");
213
214 integer flag = 0;
215 for (i = 0; i < imax; i+= STRIDE)
216 {
217 if( i == 0 )
218 llOwnerSay( "|start|" + (string) llGetScale());
219
220 string saniName = llList2String(masterlist,i);
221 curranimation = saniName;
222
223 float fprimNum = llList2Integer(masterlist, i+1);
224 integer iprimNum = (integer) fprimNum;
225 vector vprimPos = llList2Vector(masterlist, i+2);
226 rotation rprimRot = llList2Rot(masterlist, i+3) ;
227 vector vprimSize = llList2Vector(masterlist, i+4);
228
229 llOwnerSay("|"+ saniName + "|" + (string) iprimNum + "|" + (string) vprimPos + "|" + (string) rprimRot + "|" + (string) vprimSize );
230 flag++;
231 }
232 if(! flag)
233 llOwnerSay("No recording was made, nothing to play back." );
234 }
235
236
237 rotation calcChildRot(rotation rdeltaRot)
238 {
239
241 return rdeltaRot/llGetLocalRot();
242 else
243 return rdeltaRot/llGetRootRotation();
244
245 }
246
247
248 PlayBack (string name)
249 {
250 integer i;
251 integer imax = llGetListLength(masterlist);
252
253 integer linknum = 0;
254
255 for (i = 0; i < imax; i+= STRIDE)
256 {
257 string saniName = llList2String(masterlist,i);
258 if(saniName == name)
259 {
260 float fprimNum = llList2Float(masterlist,i+1);
261 vector vPos = llList2Vector(masterlist,i+2);
262 rotation rRot = llList2Rot(masterlist,i+3) ;
263 vector vprimSize = llList2Vector(masterlist,i+4) ;
264
265 vector scale = llGetScale();
266 float delta = scale.x / InitSize.x ; // see if the root prim has grown or shrunk as a percentage
267
268 vPos *= delta; // add any difference in size to it positions there
269 vprimSize *= delta; // grow the child prim, too
270
271
272 // support negative prim numbers as a delay
273 if(fprimNum < 0)
274 {
275 if(debug) llOwnerSay("Sleeping " + (string) (fprimNum * -1));
276 llSleep((float) fprimNum * -1);
277 }
278 else
279 {
280 if(fprimNum > 1 )
281 {
282 // set the local pos and locat rot to the prims orientation and position
283 rRot = calcChildRot(rRot);
284
285 list actions = [PRIM_POSITION,vPos,PRIM_ROTATION,rRot,PRIM_SIZE,vprimSize];
286 if(debug) llOwnerSay("Moving prim :" + (string) fprimNum + ":" + llDumpList2String(actions,":"));
287
288 llSetLinkPrimitiveParamsFast((integer) fprimNum,actions);
289 }
290 }
291 }
292 }
293 }
294
295 MakeMenu()
296 {
297 list amenu = ["Reset","Record","Help","Name","Notecard","Pause"] + LoadedAnims;
298
299 llListenRemove(listener);
300 listener = llListen(dialogchannel,"","","");
301
302 amenu = llDeleteSubList(amenu,12,99);
303
304 llDialog(llGetOwner(), "Pick a command",amenu,dialogchannel);
305 }
306
307
308
309 default
310 {
312 {
313 InitSize = llGetScale(); // save the size when we recorded the prims
314 nPrims = llGetNumberOfPrims(); // how many we are recording
315 if(debug) llOwnerSay(" Total Prims = " + (string) nPrims);
316 Clear();
317
319
320 if(llStringLength(notecardname) > 0)
321 {
322 kNoteCardLines = llGetNumberOfNotecardLines(NOTECARD);
323 kGetIndexLines = llGetNotecardLine(NOTECARD,0);
324 }
325 else
326 {
327 llOwnerSay("If you add a notecard, you can save your animations permanently in a notecard named " + NOTECARD);
328 }
329 dialogchannel = (integer) (llFrand(100) +600);
330
331 }
332
333 // read notecard on bootup
334 dataserver(key queryid, string data)
335 {
336 if(queryid == kNoteCardLines)
337 {
338 iIndexLines = (integer) data;
339 }
340
341 if(queryid == kGetIndexLines)
342 {
343 if(data != EOF)
344 {
345 queryid = llGetNotecardLine(NOTECARD, inotecardIndex);
346 list lLine = (llParseString2List(data, ["|"], []));
347
348 string junk = llList2String(lLine,0);
349 string aniname = llList2String(lLine,1);
350 string aNum = (string) Getline(lLine,2);
351
352 // check for the prim size,and save it, the fiorst line will look like this:
353 // [18:06] prim position 1.2: |start|<1.02306, 1.02306, 1.02306>
354
355 if(inotecardIndex == 0 && aniname == "start")
356 {
357 InitSize = (vector) aNum;
358 }
359 else if(inotecardIndex == 0 && aniname != "start")
360 {
361 llOwnerSay("The notecard " + NOTECARD + " is incorrect, it must begin with 'start|<x,y,z>' with the size of the original prim");
362 }
363 else
364 {
365
366 float Num = (float) aNum;
367
368 vector vPos = (vector) Getline(lLine,3); // global for calcChild()
369 rotation rRot = (rotation) Getline(lLine,4); // global for calcChild()
370 vector Size = (vector) Getline(lLine,5);
371
372 vector scale = llGetScale();
373 float delta = scale.x / InitSize.x ; // see if the root prim has grown or shrunk as a percentage
374
375
376 if(aniname != priorname)
377 {
378 llOwnerSay("Loading animation " + aniname);
379 priorname = aniname;
380 LoadedAnims += aniname;
381 }
382
383 if(Num != 1) // skip root prim
384 {
385 masterlist += [aniname];
386 masterlist += [Num];
387 masterlist += [vPos];
388 masterlist += [rRot];
389 masterlist += [Size];
390
391 if(Num > 1) // not the pauses
392 {
393 rRot = calcChildRot(rRot);
394 vPos *= delta; // add any difference in size to it positions there
395 Size *= delta; // grow the child prim, too
396
397 llSetLinkPrimitiveParamsFast((integer) Num,[PRIM_POSITION,vPos,PRIM_ROTATION,rRot,PRIM_SIZE,Size]);
398 move++;
399 }
400
401 }
402 }
403 inotecardIndex++;
404 integer InitPerCent = (integer) llRound(( (inotecardIndex+1) / (float) iIndexLines) * 100);
405 llSetText("Initialising... \n" + (string) InitPerCent + "%" , <1,1,1>, 1.0);
406 if(InitPerCent >= 100)
407 llSetText("" , <1,1,1>, 1.0);
408 kGetIndexLines = llGetNotecardLine(NOTECARD,inotecardIndex);
409
410 }
411 else
412 {
413 llOwnerSay("initialized with " + (string) move + " movements");
414 llSetText("" , <1,1,1>, 1.0);
415 }
416 }
417 }
418
419
420 touch_start(integer total_number)
421 {
422 if(llDetectedKey(0) == llGetOwner() && ! runtime)
423 {
424 MakeMenu();
425 }
426
427 // add any control code here
428 // example:
429 // llMessageLinked(LINK_SET,playchannel,"All",""); // will play Animation named "All"
430
431 }
432
433 listen( integer channel, string name, key id, string message )
434 {
435
436 if(channel == dialogchannel)
437 {
438 if(message == "Reset")
439 {
440 Clear();
441 if(debug) llOwnerSay("Reset = " + llDumpList2String(llastPrimList,":"));
442 MakeMenu();
443 }
444 else if(message =="Pause")
445 {
446 masterlist += curranimation;
447 masterlist += -1;
448 masterlist += <0,0,0>; // pos
449 masterlist += <0,0,0,1>;// rot
450 masterlist += <0,0,0>; // size
451 MakeMenu();
452 }
453 else if(message == "Record")
454 {
455 Record();
456
457 MakeMenu();
458 }
459 else if(message == "Name")
460 {
461 llOwnerSay("Type the current animation name on channel /" + (string) dialogchannel);
462 wantname++;
463 MakeMenu();
464 }
465 else if(message =="Menu")
466 {
467 MakeMenu();
468 }
469 else if(message == "Notecard")
470 {
471 DumpBack();
472 MakeMenu();
473 }
474 else if(message == "Help")
475 {
476 llLoadURL(llGetOwner(),"View online help", "http://secondlife.mitsi.com/secondlife/Posts/Prim-Animator");
477 }
478 else if(wantname)
479 {
480 curranimation = message;
481
482 LoadedAnims += message;
483
484 MakeMenu();
485 llOwnerSay("Recording is ready for animation '" + curranimation + "'");
486 llOwnerSay("Position all child prims, then select the Menu item 'Record', and repeat as necessary. When finished, click 'PlayBack' to play back the animation, or click the animation name. Click 'Name' to start a new animation sequence");
487 wantname = 0;
488 PrimsCounter = 0;
489 timercounter = 0;
490 llSetTimerEvent(1.0);
491 }
492 else
493 {
494 if(llListFindList(LoadedAnims,[message]) != -1)
495 {
496 PlayBack(message);
497 MakeMenu();
498 }
499 }
500
501
502 }
503 }
504
505
506
507 link_message(integer sender_num, integer num, string message, key id)
508 {
509 if(num == playchannel)
510 {
511 if(debug) llOwnerSay("playback animation " + message);
512 PlayBack(message);
513 }
514 }
515
516
517
518
519 }

Roaming Owl

Controller

Category: Bird
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life


This script by Ferd Frederix may be used in any manner, modified, and republished.  Unless specified otherwise, my scripts are always free and open source.  Objects made with these scripts may be sold with no restrictions.  All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.

1
2 // ______ _ ______ _ _
3 // | ___| | | | ___| | | (_)
4 // | |_ ___ _ __ __| | | |_ _ __ ___ __| | ___ _ __ ___ __
5 // | _/ _ \ '__/ _` | | _| '__/ _ \/ _` |/ _ \ '__| \ \/ /
6 // | || __/ | | (_| | | | | | | __/ (_| | __/ | | |> <
7 // \_| \___|_| \__,_| \_| |_| \___|\__,_|\___|_| |_/_/\_\
8 //
9 // fred@mitsi.com
10 // owl bird script
11 //
12
13
14 integer tick;
15 integer count;
16
17 default
18 {
20 {
21 llMessageLinked(LINK_SET,0,"sit","");
22 }
23
24 timer()
25 {
26 if(tick++ %2 )
27 llMessageLinked(LINK_SET,0,"up","");
28 else
29 llMessageLinked(LINK_SET,0,"down","");
30
31 }
32
33 link_message(integer sender,integer num, string str, key id)
34 {
35 if(str == "fly")
36 {
37 llSetTimerEvent(1.0);
38 }
39 else if(str == "land")
40 {
42 }
43 else if(str == "sit")
44 {
46 }
47
48 }
49
51 {
52
53
54 if(count == 0) {
55 llMessageLinked(LINK_SET,1,"sit","");
56 // llSay(0,"sit");
57 } else if(count == 1) {
58 llMessageLinked(LINK_SET,1,"fly","");
59 //llSay(0,"fly");
60 } else if(count == 2) {
61 llMessageLinked(LINK_SET,1,"land","");
62 // llSay(0,"land");
63 }
64
65
66 count++;
67 if(count > 2)
68 count = 0;
69
70 }
71 }

Roaming Owl

main script

Category: Bird
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life


This script by Ferd Frederix may be used in any manner, modified, and republished.  Unless specified otherwise, my scripts are always free and open source.  Objects made with these scripts may be sold with no restrictions.  All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.

1
2 // ______ _ ______ _ _
3 // | ___| | | | ___| | | (_)
4 // | |_ ___ _ __ __| | | |_ _ __ ___ __| | ___ _ __ ___ __
5 // | _/ _ \ '__/ _` | | _| '__/ _ \/ _` |/ _ \ '__| \ \/ /
6 // | || __/ | | (_| | | | | | | __/ (_| | __/ | | |> <
7 // \_| \___|_| \__,_| \_| |_| \___|\__,_|\___|_| |_/_/\_\
8 //
9 // fred@mitsi.com
10 // owl bird script
11 //
12 //Revisions:
13 // 1/28/2010 initial release
14
15 string CRY = "Bubo-virginianus";
16 string SHORT = "Bubo-virginianus short";
17 string SURPRISE = "Scotopelia-peli";
18 string prey = "Squirrel and feeder";
19
20
21 // fly sit, catch land
22
23 integer debug = 0;
24 vector rezpoint; // home point
25 rotation rezrot;
26 integer Flying;
27
28 integer listen_chan;
29 integer listener;
30 float i ; //counter for timer moving
31 vector up_vel = <10,0,9>; // speed and direction away
32 vector down_vel = <6,0,-8>; // and to go home, small numbers for less speed and mass objects
33 float STRENGTH = 2.0; // how hard to turn
34 float DAMPING = 0.2; // and how soon
35 float MAX = 3.0; // MAX strength ( slow turns)
36 float MIN = 1.0; // fast turns
37
38 float timerate = 0.215;
39 float roam_range = 10; // default range
40 string flag ; // what menu item thay need integers for
41
42
43
44
45
46 vector direction;
47 vector Destination;
48 float atimer;
49 float INTERVAL = .050; // seconds to move
50 integer SeekingFish = FALSE;
51
52 Dialog()
53 {
54 listener = llListen(listen_chan,"","","");
55 llDialog(llGetOwner(),"Flight Controls: Home: current place is the roost\nTime: How often to fly when no one is near\nRange: Distance to roam\nFlap: Flap wings\nHelp: get notecard",["Range","Flap","Help","Home","Time","Ferd"],listen_chan);
56 }
57
58 CheckDir()
59 {
60 vector currPos = llGetPos();
61 if(currPos.z > Destination.z)
62 {
63 direction = down_vel;
64 // if(debug) llOwnerSay("D");
65 }
66 else
67 {
68 direction = up_vel;
69 //if(debug) llOwnerSay("U");
70 }
71
72 if(! SeekingFish)
73 {
74 // go no lower than the rez point plus some slop
75 if(currPos.z < rezpoint.z )
76 {
77 //if(debug) llOwnerSay("U");
78 Destination.z = rezpoint.z + 1.0;
79 direction = up_vel;
80 }
81 }
82 }
83
84 DoMove()
85 {
86
87
88 llMessageLinked(LINK_SET,1,"flap",""); // hop up
89 CheckDir();
90
92 //llStopLookAt();
93 llRotLookAt(llRotBetween(<1,0,0>, Destination - llGetPos()), STRENGTH, DAMPING);
94 llSleep(DAMPING*3);
96 llSleep(.1);
99
100
101 }
102
103
104 NewDest()
105 {
106 // random direction
107 Destination = llGetPos();
108 Destination.x += llFrand(roam_range) - 0.5 * roam_range;
109 Destination.y += llFrand(roam_range) - 0.5 * roam_range;
110 Destination.z += (llFrand(1.0) -.5 ) + .5;
111
112 if(Destination.z < rezpoint.z )
113 {
114 Destination.z = rezpoint.z + 4.0;
115 direction = up_vel;
116 }
117 }
118
119
120 Fly()
121 {
122 if(debug ) llOwnerSay("Fly");
123
124 Flying = 1;
125 i = 50;
126 STRENGTH = MAX; // how hard to turn
127
128 NewDest();
129
130 llPlaySound(CRY,1.0);
131
132 SeekingFish = FALSE;
133 llSensorRepeat(prey,"", ACTIVE|PASSIVE|SCRIPTED, 96, PI, 10.0);
134
136 llMessageLinked(LINK_SET,1,"fly",""); // hop up
137
138 llSetTimerEvent(.1); // fast
139 }
140
141 default
142 {
143
145 {
147 }
148
150 {
151 llMessageLinked(LINK_SET,1,"sit",""); // hop up
153 llSetBuoyancy(0.8);
154 rezpoint = llGetPos();
155 rezrot = llGetRot();
156
160
167 llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, .1);
170 llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, .1);
171
174
177
180 llGroundRepel(2.0, TRUE, 0.2);
181
182
183
184 atimer = 60;
185 llOwnerSay("Flight range is 10 meters. Timer is 1 minute. Click bird to change settings");
186 state moving;
187 }
188 }
189
190
191 state moving
192 {
193
195 {
197 }
198
199 timer()
200 {
201
202 if(! Flying)
203 {
204 if(debug ) llOwnerSay("Was not flying");
205 Fly();
206 }
207
208 if(--i == 0)
209 {
210 if(debug ) llOwnerSay("Too long");
211 SeekingFish = FALSE;
212 i = 50;
213 Flying ++; // force HOME
214 Destination = rezpoint;
215 llPlaySound(CRY,1.0);
216 STRENGTH = MIN; // turn sharply
217 }
218
219
220 DoMove();
221
222 if(llVecDist(Destination,llGetPos()) < 2)
223 {
224 if(debug) llOwnerSay("At Dest");
225 i = 50;
226 Flying++;
227 }
228
229 if(! SeekingFish && Flying < 8)
230 {
231 if((integer) i % 10 == 0)
232 {
233 NewDest();
234 if(debug ) llOwnerSay("New dest");
235 }
236
237 if((llVecDist(rezpoint,llGetPos()) > roam_range) )
238 {
239 if(debug ) llOwnerSay("Too far");
240 Destination = rezpoint;
241 Flying++;
242 STRENGTH = MIN; // turn sharply
243 llPlaySound(CRY,1.0);
244 }
245 }
246
247
248 if(SeekingFish && llVecDist(Destination,llGetPos()) < 2)
249 {
250 if(debug ) llOwnerSay("Caught Fish");
251 llPlaySound(SURPRISE,1.0);
252 llWhisper(2222,"fish");
253
254 //llMessageLinked(LINK_SET,1,"sit",""); // grab the fish
255 llMessageLinked(LINK_SET,1,"catch",""); // grab the fish
256 SeekingFish = FALSE;
257 Flying = 8;
258 i=50; // need some time to get home
259 }
260
261 if(Flying == 9)
262 {
263 // back on the ground
264 Destination = rezpoint;
265 i=50;
266
267 if(debug ) llOwnerSay("Heading Home");
268 }
269
270 if(Flying >= 10)
271 {
272
273 float dist = llVecDist(rezpoint,llGetPos());
274
275 // if(dist < 2)
276 // {
277 llMessageLinked(LINK_SET,1,"land",""); // hop up
278 // }
279 llPlaySound(SHORT,1.0);
280
281 llSleep(0.5);
282
284 llMessageLinked(LINK_SET,1,"sit",""); // hop up
285
286 llSetRot(rezrot);
287 llSetPos(rezpoint);
288
289
290 // we may not have made it home, could have run into something
291 if(dist > 1)
292 {
293 if(debug) llOwnerSay("Forced Home");
294 state setposition; //contingency
295 }
296 //if(debug) llOwnerSay("At Home");
297
298 SeekingFish = FALSE;
299 Flying = 0;
300 llSetTimerEvent(atimer);
301
302 llSensorRepeat("","",AGENT,roam_range,PI,5);
303
304 }
305 }
306
308 {
309 llSensorRepeat("","",AGENT,roam_range,PI,5);
310 SeekingFish = FALSE;
311 Fly(); // Fly at startup
312 }
313
314
315
316
317 sensor(integer total_number)
318 {
319 if(Flying)
320 {
321 if(debug ) llOwnerSay("Found Fish");
322 llPlaySound(SURPRISE,1.0);
323 Destination = llDetectedPos(0);
324 Destination.z += 2.0;
325 SeekingFish = TRUE;
327 STRENGTH = 1.0; // how hard to turn
328 i = 50; // need time to catch a fish
329 }
330 else
331 {
332 if(atimer)
333 Fly();
334 }
335 }
336
338 {
340 {
341 listen_chan=llCeil(llFrand(10000) + 10000);
342 Dialog();
343 }
344 else
345 {
346 if(atimer)
347 Fly();
348 }
349 }
350
351 listen(integer channel,string name, key id, string msg)
352 {
353 if(msg == "Range")
354 {
355 llDialog(llGetOwner(),"Range from Home place in meters",["10","15","20","25","30","35","40","45","50"],listen_chan);
356 flag = "R";
357 }
358 else if((integer) msg >= 10 && flag == "R")
359 {
360 roam_range = (integer) msg;
361 flag = "";
362 Dialog();
363 }
364
365 else if(msg == "Help")
367 else if(msg == "Flap")
368 {
369 llMessageLinked(LINK_SET,1,"land",""); // hop up
370 llPlaySound(CRY,1.0);
371 llSleep(1); // time to see it
372 llMessageLinked(LINK_SET,1,"sit",""); // hop up
373 Dialog();
374 }
375 else if(msg == "Home")
376 {
377 rezpoint = llGetPos();
378 llOwnerSay("Position is set to " + (string) rezpoint);
379 Dialog();
380 }
381 else if(msg =="Time")
382 {
383 llDialog(llGetOwner(),"How often they auto fly in seconds",["Off","15s","30s","1min","2min","3min","5min","15min","hour"],listen_chan);
384 }
385 else if(msg =="Off")
386 {
387 atimer = 0;
388 }
389 else if(msg =="15s")
390 atimer = 15;
391 else if(msg =="30s")
392 atimer = 30;
393 else if(msg =="1min")
394 atimer = 60;
395 else if(msg =="2min")
396 atimer = 120;
397 else if(msg =="5min")
398 atimer = 300;
399 else if(msg =="15min")
400 atimer = 900;
401 else if(msg =="hour")
402 atimer = 3600;
403
404 else if(msg =="Ferd")
405 llLoadURL(llGetOwner(),"More Info at our web site","http://secondlife.mitsi.com");
406
407 llOwnerSay("Flight range is " + (string) roam_range + " meters. ");
408 if(atimer)
409 llOwnerSay("The bird will fly every " + (string) atimer + " seconds");
410 else
411 llOwnerSay("The bird will fly only when someone is near");
412
413 if(! Flying)
414 {
415 llSetTimerEvent(atimer);
416 }
417 }
418 }
419
420
421
422 state setposition //contingency
423 {
425 {
426 if(debug)llOwnerSay("Oops, forcing home");
427 llSetTimerEvent(INTERVAL);
428 }
429
431 {
433 }
434
435 timer()
436 {
437 if(llVecMag(llGetPos() - rezpoint) > 5)
438 {
439 llSetPos((llVecNorm(Destination - llGetPos()) * 0.5) + llGetPos());
440 }
441 else
442 {
443 llSetRot(rezrot);
444 llSetPos(rezpoint);
445 if(debug)llOwnerSay("Homed");
446 llMessageLinked(LINK_SET,1,"sit",""); // hop up
447 state moving;
448 }
449
450 }
452 {
454 }
455
456 }

Roaming Owl

Squirrel scrip gets grabbed by the owl

Category: Bird
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life


This script by Ferd Frederix may be used in any manner, modified, and republished.  Unless specified otherwise, my scripts are always free and open source.  Objects made with these scripts may be sold with no restrictions.  All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.

1
2 // put this in a prim named 'Squirrel and feeder' for the owl to catch.
3
4 default
5 {
7 {
8 llListen(2222,"","","fish");
9 }
10
11
12
13 listen( integer channel, string name, key id, string message )
14 {
15 llDie();
16 }
17
18
19 on_rez(integer param)
20 {
22 }
23 }

Roaming Owl

Movement notecard for the owl

Category: Bird
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life


This script by Ferd Frederix may be used in any manner, modified, and republished.  Unless specified otherwise, my scripts are always free and open source.  Objects made with these scripts may be sold with no restrictions.  All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.

1 [22:24] Barn Owl: |start|<0.10219, 0.10219, 0.10219>
2 [22:24] Barn Owl: |start|2|<-0.21120, 0.37080, 0.00319>|<-0.48392, -0.06311, -0.06499, 0.87041>|<0.73898, 0.01525, 0.86360>
3 [22:24] Barn Owl: |start|3|<0.25070, 0.01350, -0.12652>|<0.10609, 0.12595, 0.72746, 0.66610>|<0.26274, 0.30544, 0.36192>
4 [22:24] Barn Owl: |start|4|<-0.29330, 0.04250, -0.20191>|<0.01729, -0.01843, 0.73325, 0.67949>|<0.32280, 0.30544, 0.37368>
5 [22:24] Barn Owl: |start|5|<-0.09331, -0.02380, -0.42002>|<0.11169, 0.08381, 0.72868, 0.67047>|<0.32280, 0.30544, 0.28795>
6 [22:24] Barn Owl: |start|6|<-0.28490, -0.06630, -0.19861>|<0.01729, -0.01843, 0.73325, 0.67949>|<0.32280, 0.30544, 0.39164>
7 [22:24] Barn Owl: |start|7|<-0.13260, 0.01880, -0.12891>|<0.40277, 0.29964, 0.63859, 0.58326>|<0.26274, 0.42047, 0.40765>
8 [22:24] Barn Owl: |start|8|<0.27020, 0.45689, 0.06199>|<-0.57795, 0.03225, -0.23815, 0.77988>|<0.73898, 0.01525, 0.97975>
9 [22:24] Barn Owl: |start|9|<-0.14819, -0.18970, -0.14921>|<0.30814, 0.29905, 0.66975, 0.60585>|<0.66023, 0.66023, 0.66023>
10 [22:24] Barn Owl: |start|10|<-0.09920, 0.05560, -0.41591>|<0.11169, 0.08381, 0.72868, 0.67047>|<0.32280, 0.30544, 0.28795>
11 [22:24] Barn Owl: |start|11|<0.34201, 0.03290, -0.24467>|<0.08858, 0.10685, 0.73048, 0.66868>|<0.06132, 0.08995, 0.10230>
12 [22:24] Barn Owl: |start|12|<-0.51199, -0.03619, -0.16111>|<0.41508, -0.35529, -0.57885, 0.60532>|<0.61750, 0.02000, 0.53095>
13 [22:24] Barn Owl: |start|13|<-0.12891, -0.02721, -0.13121>|<0.29818, 0.39788, 0.63455, 0.59171>|<0.26274, 0.42047, 0.40765>
14 [22:24] Barn Owl: |start|14|<-0.19431, -0.18491, -0.42122>|<0.50076, 0.51466, 0.52259, 0.45964>|<0.32280, 0.30544, 0.28795>
15 [22:24] Barn Owl: |start|15|<-0.20650, -0.02260, -0.41291>|<0.50076, 0.51466, 0.52259, 0.45964>|<0.32280, 0.30544, 0.28795>
16 [22:24] Barn Owl: |start|16|<0.34767, 0.08550, -0.17068>|<0.06784, 0.04386, 0.79441, 0.60198>|<0.04818, 0.04818, 0.04818>
17 [22:24] Barn Owl: |start|17|<0.35654, 0.00810, -0.17037>|<0.03255, 0.07494, 0.68866, 0.72046>|<0.04818, 0.04818, 0.04818>
18 [22:24] Barn Owl: |start|18|<0.27521, -0.36360, 0.12479>|<0.46530, 0.08664, 0.21990, 0.85302>|<0.73898, 0.01525, 0.97975>
19 [22:24] Barn Owl: |start|19|<-0.11169, -0.35899, 0.01059>|<0.47878, -0.00565, 0.19548, 0.85588>|<0.73898, 0.01525, 0.86360>
20 [22:24] Barn Owl: |fly|2|<-0.21120, 0.37080, 0.00798>|<-0.48392, -0.06311, -0.06499, 0.87041>|<0.73898, 0.01525, 0.86360>
21 [22:24] Barn Owl: |fly|3|<0.25070, 0.01350, -0.12172>|<0.10609, 0.12595, 0.72746, 0.66610>|<0.26274, 0.30544, 0.36192>
22 [22:24] Barn Owl: |fly|4|<-0.29330, 0.04250, -0.19712>|<0.01729, -0.01843, 0.73325, 0.67949>|<0.32280, 0.30544, 0.37368>
23 [22:24] Barn Owl: |fly|5|<-0.09331, -0.02380, -0.41522>|<0.11169, 0.08381, 0.72868, 0.67047>|<0.32280, 0.30544, 0.28795>
24 [22:24] Barn Owl: |fly|6|<-0.28490, -0.06630, -0.19382>|<0.01729, -0.01843, 0.73325, 0.67949>|<0.32280, 0.30544, 0.39164>
25 [22:24] Barn Owl: |fly|7|<-0.13260, 0.01880, -0.12412>|<0.40277, 0.29964, 0.63859, 0.58326>|<0.26274, 0.42047, 0.40765>
26 [22:24] Barn Owl: |fly|8|<0.27020, 0.45689, 0.06678>|<-0.57795, 0.03225, -0.23815, 0.77988>|<0.73898, 0.01525, 0.97975>
27 [22:24] Barn Owl: |fly|9|<-0.14819, -0.18970, -0.14442>|<0.30814, 0.29905, 0.66975, 0.60585>|<0.66023, 0.66023, 0.66023>
28 [22:24] Barn Owl: |fly|10|<-0.09920, 0.05560, -0.41112>|<0.11169, 0.08381, 0.72868, 0.67047>|<0.32280, 0.30544, 0.28795>
29 [22:24] Barn Owl: |fly|11|<0.34200, 0.03290, -0.23992>|<0.08858, 0.10685, 0.73048, 0.66868>|<0.06132, 0.08995, 0.10230>
30 [22:24] Barn Owl: |fly|12|<-0.51199, -0.03619, -0.15632>|<0.41508, -0.35529, -0.57885, 0.60532>|<0.61750, 0.02000, 0.53095>
31 [22:24] Barn Owl: |fly|13|<-0.12891, -0.02721, -0.12642>|<0.29818, 0.39788, 0.63455, 0.59171>|<0.26274, 0.42047, 0.40765>
32 [22:24] Barn Owl: |fly|14|<-0.19431, -0.18491, -0.41642>|<0.50076, 0.51466, 0.52259, 0.45964>|<0.32280, 0.30544, 0.28795>
33 [22:24] Barn Owl: |fly|15|<-0.20650, -0.02260, -0.40812>|<0.50076, 0.51466, 0.52259, 0.45964>|<0.32280, 0.30544, 0.28795>
34 [22:24] Barn Owl: |fly|16|<0.34770, 0.08550, -0.16592>|<0.06784, 0.04386, 0.79441, 0.60198>|<0.04818, 0.04818, 0.04818>
35 [22:24] Barn Owl: |fly|17|<0.35651, 0.00810, -0.16562>|<0.03255, 0.07494, 0.68866, 0.72046>|<0.04818, 0.04818, 0.04818>
36 [22:24] Barn Owl: |fly|18|<0.27521, -0.36360, 0.12958>|<0.46530, 0.08664, 0.21990, 0.85302>|<0.73898, 0.01525, 0.97975>
37 [22:24] Barn Owl: |fly|19|<-0.11169, -0.35899, 0.01538>|<0.47878, -0.00565, 0.19548, 0.85588>|<0.73898, 0.01525, 0.86360>
38 [22:24] Barn Owl: |sit|2|<-0.00755, 0.37080, -0.22411>|<-0.39426, -0.47078, -0.28801, 0.73483>|<0.73898, 0.01525, 0.86360>
39 [22:24] Barn Owl: |sit|3|<0.39813, 0.01350, 0.09429>|<0.03583, 0.06150, 0.73428, 0.67511>|<0.26274, 0.30544, 0.36192>
40 [22:24] Barn Owl: |sit|4|<0.11974, 0.04250, -0.40468>|<-0.33469, -0.34043, 0.65265, 0.58834>|<0.32280, 0.30544, 0.37368>
41 [22:24] Barn Owl: |sit|5|<0.41158, -0.02380, -0.35573>|<-0.24955, -0.24629, 0.69366, 0.62921>|<0.32280, 0.30544, 0.28795>
42 [22:24] Barn Owl: |sit|6|<0.12155, -0.06630, -0.39583>|<-0.33469, -0.34043, 0.65265, 0.58834>|<0.32280, 0.30544, 0.39164>
43 [22:24] Barn Owl: |sit|7|<0.14604, 0.01880, -0.23014>|<0.04925, -0.01497, 0.75339, 0.65556>|<0.26274, 0.42047, 0.40765>
44 [22:24] Barn Owl: |sit|8|<0.20532, 0.45689, 0.21165>|<-0.39427, -0.34379, -0.48509, 0.70075>|<0.73898, 0.01525, 0.97975>
45 [22:24] Barn Owl: |sit|9|<0.15457, -0.18970, -0.25428>|<-0.04879, -0.02628, 0.73562, 0.67512>|<0.66023, 0.66023, 0.66023>
46 [22:24] Barn Owl: |sit|10|<0.40492, 0.05560, -0.35844>|<-0.24955, -0.24629, 0.69366, 0.62921>|<0.32280, 0.30544, 0.28795>
47 [22:24] Barn Owl: |sit|11|<0.51028, 0.03290, -0.00432>|<0.01815, 0.04222, 0.73560, 0.67585>|<0.06132, 0.08995, 0.10230>
48 [22:24] Barn Owl: |sit|12|<-0.03358, -0.03619, -0.56587>|<0.64097, -0.60108, -0.31066, 0.36242>|<0.61750, 0.02000, 0.53095>
49 [22:24] Barn Owl: |sit|13|<0.14998, -0.02721, -0.22830>|<-0.04074, 0.06733, 0.69994, 0.70986>|<0.26274, 0.42047, 0.40765>
50 [22:24] Barn Owl: |sit|14|<0.35757, -0.18491, -0.44109>|<0.19073, 0.23297, 0.69821, 0.64950>|<0.32280, 0.30544, 0.28795>
51 [22:24] Barn Owl: |sit|15|<0.34398, -0.02260, -0.44679>|<0.19073, 0.23297, 0.69821, 0.64950>|<0.32280, 0.30544, 0.28795>
52 [22:24] Barn Owl: |sit|16|<0.50179, 0.08550, 0.06940>|<-0.00865, -0.01409, 0.79727, 0.60340>|<0.04818, 0.04818, 0.04818>
53 [22:24] Barn Owl: |sit|17|<0.51036, 0.00810, 0.07137>|<-0.03362, 0.00548, 0.68861, 0.72433>|<0.04818, 0.04818, 0.04818>
54 [22:24] Barn Owl: |sit|18|<0.15538, -0.36360, 0.25005>|<0.30400, -0.33090, 0.41525, 0.79098>|<0.73898, 0.01525, 0.97975>
55 [22:24] Barn Owl: |sit|19|<0.04044, -0.35899, -0.13663>|<0.32749, -0.41336, 0.40025, 0.74945>|<0.73898, 0.01525, 0.86360>
56 [22:24] Barn Owl: |sit|2|<0.06921, 0.37080, -0.24217>|<-0.35621, -0.55683, -0.33391, 0.67198>|<0.73898, 0.01525, 0.86360>
57 [22:24] Barn Owl: |sit|3|<0.38582, 0.01350, 0.16492>|<-0.05394, -0.02125, 0.73316, 0.67758>|<0.26274, 0.30544, 0.36192>
58 [22:24] Barn Owl: |sit|4|<0.23640, 0.04250, -0.38658>|<-0.41175, -0.40961, 0.60699, 0.54244>|<0.32280, 0.30544, 0.37368>
59 [22:24] Barn Owl: |sit|5|<0.50774, -0.02380, -0.26848>|<-0.33224, -0.32114, 0.65807, 0.59450>|<0.32280, 0.30544, 0.28795>
60 [22:24] Barn Owl: |sit|6|<0.23602, -0.06630, -0.37755>|<-0.41175, -0.40961, 0.60699, 0.54244>|<0.32280, 0.30544, 0.39164>
61 [22:24] Barn Owl: |sit|7|<0.21971, 0.01880, -0.21086>|<-0.04294, -0.09478, 0.75378, 0.64884>|<0.26274, 0.42047, 0.40765>
62 [22:24] Barn Owl: |sit|8|<0.17035, 0.45689, 0.23215>|<-0.33222, -0.42663, -0.52953, 0.65361>|<0.73898, 0.01525, 0.97975>
63 [22:24] Barn Owl: |sit|9|<0.23383, -0.18970, -0.23221>|<-0.13810, -0.10837, 0.72420, 0.66688>|<0.66023, 0.66023, 0.66023>
64 [22:24] Barn Owl: |sit|10|<0.50194, 0.05560, -0.27272>|<-0.33224, -0.32114, 0.65807, 0.59450>|<0.32280, 0.30544, 0.28795>
65 [22:24] Barn Owl: |sit|11|<0.51849, 0.03290, 0.09637>|<-0.07164, -0.04049, 0.73233, 0.67595>|<0.06132, 0.08995, 0.10230>
66 [22:24] Barn Owl: |sit|12|<0.12663, -0.03619, -0.58007>|<0.67404, -0.64079, -0.23023, 0.28646>|<0.61750, 0.02000, 0.53095>
67 [22:24] Barn Owl: |sit|13|<0.22308, -0.02721, -0.20812>|<-0.12576, -0.01970, 0.68975, 0.71277>|<0.26274, 0.42047, 0.40765>
68 [22:24] Barn Owl: |sit|14|<0.47598, -0.18491, -0.36437>|<0.10421, 0.15207, 0.71625, 0.67305>|<0.32280, 0.30544, 0.28795>
69 [22:24] Barn Owl: |sit|15|<0.46417, -0.02260, -0.37319>|<0.10421, 0.15207, 0.71625, 0.67305>|<0.32280, 0.30544, 0.28795>
70 [22:24] Barn Owl: |sit|16|<0.49242, 0.08550, 0.16585>|<-0.10578, -0.08755, 0.79026, 0.59719>|<0.04818, 0.04818, 0.04818>
71 [22:24] Barn Owl: |sit|17|<0.50026, 0.00810, 0.16983>|<-0.11732, -0.08287, 0.67937, 0.71960>|<0.04818, 0.04818, 0.04818>
72 [22:24] Barn Owl: |sit|18|<0.11259, -0.36360, 0.25733>|<0.25111, -0.42485, 0.44920, 0.74476>|<0.73898, 0.01525, 0.97975>
73 [22:24] Barn Owl: |sit|19|<0.09462, -0.35899, -0.14568>|<0.27626, -0.50161, 0.43719, 0.69349>|<0.73898, 0.01525, 0.86360>
74 [22:24] Barn Owl: |land|2|<0.04686, 0.37080, -0.23893>|<-0.36766, -0.53302, -0.32128, 0.69101>|<0.73898, 0.01525, 0.86360>
75 [22:24] Barn Owl: |land|3|<0.39110, 0.01350, 0.14508>|<-0.02832, 0.00240, 0.73459, 0.67791>|<0.26274, 0.30544, 0.36192>
76 [22:24] Barn Owl: |land|4|<0.20357, 0.04250, -0.39465>|<-0.39033, -0.39045, 0.62099, 0.55638>|<0.32280, 0.30544, 0.37368>
77 [22:24] Barn Owl: |land|5|<0.48248, -0.02380, -0.29577>|<-0.30910, -0.30022, 0.66925, 0.60533>|<0.32280, 0.30544, 0.28795>
78 [22:24] Barn Owl: |land|6|<0.20383, -0.06630, -0.38562>|<-0.39033, -0.39045, 0.62099, 0.55638>|<0.32280, 0.30544, 0.39164>
79 [22:24] Barn Owl: |land|7|<0.19917, 0.01880, -0.21820>|<-0.01662, -0.07210, 0.75481, 0.65176>|<0.26274, 0.42047, 0.40765>
80 [22:24] Barn Owl: |land|8|<0.18085, 0.45689, 0.22717>|<-0.35051, -0.40359, -0.51762, 0.66808>|<0.73898, 0.01525, 0.97975>
81 [22:24] Barn Owl: |land|9|<0.21178, -0.18970, -0.24048>|<-0.11275, -0.08505, 0.72857, 0.67025>|<0.66023, 0.66023, 0.66023>
82 [22:24] Barn Owl: |land|10|<0.47641, 0.05560, -0.29959>|<-0.30910, -0.30022, 0.66925, 0.60533>|<0.32280, 0.30544, 0.28795>
83 [22:24] Barn Owl: |land|11|<0.51866, 0.03290, 0.06744>|<-0.04604, -0.01690, 0.73440, 0.67695>|<0.06132, 0.08995, 0.10230>
84 [22:24] Barn Owl: |land|12|<0.08057, -0.03619, -0.58002>|<0.66558, -0.63041, -0.25362, 0.30864>|<0.61750, 0.02000, 0.53095>
85 [22:24] Barn Owl: |land|13|<0.20273, -0.02721, -0.21570>|<-0.10163, 0.00516, 0.69371, 0.71303>|<0.26274, 0.42047, 0.40765>
86 [22:24] Barn Owl: |land|14|<0.44412, -0.18491, -0.38921>|<0.12914, 0.17546, 0.71219, 0.66733>|<0.32280, 0.30544, 0.28795>
87 [22:24] Barn Owl: |land|15|<0.43172, -0.02260, -0.39719>|<0.12914, 0.17546, 0.71219, 0.66733>|<0.32280, 0.30544, 0.28795>
88 [22:24] Barn Owl: |land|16|<0.49750, 0.08550, 0.13857>|<-0.07815, -0.06668, 0.79348, 0.59987>|<0.04818, 0.04818, 0.04818>
89 [22:24] Barn Owl: |land|17|<0.50560, 0.00810, 0.14200>|<-0.09355, -0.05771, 0.68304, 0.72206>|<0.04818, 0.04818, 0.04818>
90 [22:24] Barn Owl: |land|18|<0.12498, -0.36360, 0.25632>|<0.26662, -0.39862, 0.44015, 0.75914>|<0.73898, 0.01525, 0.97975>
91 [22:24] Barn Owl: |land|19|<0.07893, -0.35899, -0.14445>|<0.29135, -0.47710, 0.42727, 0.71058>|<0.73898, 0.01525, 0.86360>

Back to the Best Free Tools in Second Life and OpenSim.