vector last_vel; vector last_pos; integer STAYING = 1; integer FOLLOWING = 2; integer mouse_state = FOLLOWING; integer total = 0; play_sound() { integer num = llGetInventoryNumber(INVENTORY_SOUND); integer rand = (integer)(llFrand(num)); llTriggerSound(llGetInventoryName(INVENTORY_SOUND, rand), 1.0); } default { on_rez(integer p) { llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE); llSetStatus(STATUS_DIE_AT_EDGE | STATUS_PHYSICS, TRUE); llSensorRepeat("", llGetOwner(), AGENT, 50.0, PI, 5.0); llListen(0, "", llGetOwner(), ""); llSetTimerEvent(1.0); } listen(integer channel, string name, key id, string message) { if (message == "stay") { mouse_state = STAYING; } else if (message == "follow") { mouse_state = FOLLOWING; } } sensor(integer total_number) { llSetTimerEvent(1.0); last_vel = llDetectedVel(0); last_pos = llDetectedPos(0); vector direction = last_pos - llGetPos(); float distance = llVecMag(direction); direction = llVecNorm(direction); float frot = llFrand(TWO_PI); rotation rot = llEuler2Rot(<0,0,frot>); llRotLookAt(rot, 0.1, 0.1); if (llVecMag(last_vel) < 0.25) { last_vel = direction; } else { last_vel = llVecNorm(last_vel); last_vel.z += 1.0; } if (distance > 10.0) { direction += last_vel; direction.z += 3.0; } else if (distance > 2.0) { direction.z += 1.0; direction *= 0.75; } else { direction = <0,0,1>; } if (mouse_state == FOLLOWING) llApplyImpulse(direction*0.1, FALSE); else llApplyImpulse(<0,0,0.1>, FALSE); } timer() { if (total > 10) { while (llEdgeOfWorld(llGetPos(), last_vel)) { last_vel =; } float frot = llFrand(TWO_PI); rotation rot = llEuler2Rot(<0,0,frot>); llRotLookAt(rot, 0.1, 0.1); if (mouse_state == FOLLOWING) llApplyImpulse(last_vel*0.1, FALSE); else llApplyImpulse(<0,0,0.1>, FALSE); total = 0; } else { total += 1; if (llFrand(1.0) > 0.75) { play_sound(); } } } }