A variation on the uniform wanderer with the addition that you can touch the primitive in order to toggle the wandering.
/////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3 // // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // // rights of fair usage, the disclaimer and warranty conditions. // /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// vector wasCirclePoint(float radius) { float x = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2); float y = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2); if(llPow(x,2) + llPow(y,2) <= llPow(radius,2)) return <x, y, 0>; return wasCirclePoint(radius); } moveTo(vector position) { llTargetRemove(targetID); targetID = llTarget(position, .8); llLookAt(position, .6, .6); llMoveToTarget(position, dampening); } // track targets integer targetID = 0; // dampening of movement float dampening = 10; // stray from origin float radius = 5; // the origin of the movement vector origin = ZERO_VECTOR; default { state_entry() { llOwnerSay("movement off"); // set the origin to the current position origin = llGetPos(); // stop all physics llSetStatus(STATUS_PHYSICS|STATUS_BLOCK_GRAB, FALSE); llVolumeDetect(FALSE); } touch_start(integer num) { state on; } } state on { state_entry() { llOwnerSay("movement on"); // set the origin to the current position origin = llGetPos(); // start physics llSetStatus(STATUS_PHYSICS|STATUS_BLOCK_GRAB, TRUE); // pass through solids but detect collision llVolumeDetect(TRUE); moveTo(origin + wasCirclePoint(radius)); } touch_start(integer num) { state default; } at_target(integer tnum, vector targetpos, vector ourpos) { moveTo(origin + wasCirclePoint(radius)); } collision_start(integer num) { moveTo(origin + wasCirclePoint(radius)); } on_rez(integer num) { // set the origin to the current position origin = llGetPos(); // stop all physics llSetStatus(STATUS_PHYSICS|STATUS_BLOCK_GRAB, FALSE); llVolumeDetect(FALSE); } }