follower Script.lsl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // :CATEGORY:Follower
  2. // :NAME:Keyframe Follower
  3. // :AUTHOR:Ferd Frederix
  4. // :KEYWORDS:
  5. // :CREATED:2014-12-04 12:13:47
  6. // :EDITED:2014-12-04
  7. // :ID:1058
  8. // :NUM:1684
  9. // :REV:1
  10. // :WORLD:Second Life
  11. // :DESCRIPTION:
  12. // A avatar folloer thaty works in Opensim
  13. // :CODE:
  14. float minspeed = 0.5;
  15. float maxspeed = 2;
  16. float maxtimer = 10.0; // when no one is around, slow way down.
  17. float maxrange = 96;
  18. float minrange = 20;
  19. float oldZ;
  20. integer isSensorRepeatOn = FALSE;
  21. integer land;
  22. float random_float(float min, float max)
  23. {
  24. return min + llFrand(max - min + 1);
  25. }
  26. rotation NormRot(rotation Q)
  27. {
  28. float MagQ = llSqrt(Q.x*Q.x + Q.y*Q.y +Q.z*Q.z + Q.s*Q.s);
  29. return <Q.x/MagQ, Q.y/MagQ, Q.z/MagQ, Q.s/MagQ>;
  30. }
  31. default
  32. {
  33. state_entry()
  34. {
  35. llSetLinkPrimitiveParamsFast(LINK_ROOT,
  36. [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX,
  37. PRIM_LINK_TARGET, LINK_ALL_CHILDREN,
  38. PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]);
  39. llSensorRepeat("", "", AGENT, 20.0, PI, maxtimer);
  40. }
  41. no_sensor()
  42. {
  43. llSensorRepeat("", "", AGENT, maxrange, PI, maxtimer);
  44. }
  45. sensor(integer num_detected)
  46. {
  47. float speed = random_float(minspeed,maxspeed);
  48. vector ownPosition = llGetPos();
  49. rotation ownRotation = llGetRot();
  50. vector detectedPosition = llDetectedPos(0);
  51. rotation detectedRotation = llDetectedRot(0);
  52. vector size = llGetAgentSize(llDetectedKey(0));
  53. float Z = random_float(0, size.z/2);
  54. if (llFrand(10) < 1) {
  55. Z = -size.z/2;
  56. llMessageLinked(LINK_SET,1,"land","");
  57. land = TRUE;
  58. speed = 0.5;
  59. } else {
  60. land = FALSE;
  61. if (llFrand(10) < 1)
  62. {
  63. llMessageLinked(LINK_SET,1,"flames","");
  64. }
  65. }
  66. float Y = random_float(0, 1);
  67. if (llFrand(2) < 1) {
  68. llMessageLinked(LINK_SET,1,"r","");
  69. Y *= -1;
  70. } else {
  71. llMessageLinked(LINK_SET,1,"l","");
  72. }
  73. if (Z - oldZ > 0.2)
  74. llMessageLinked(LINK_SET,1,"up","");
  75. if (Z - oldZ > -0.2)
  76. llMessageLinked(LINK_SET,1,"down","");
  77. oldZ = Z;
  78. llSetKeyframedMotion(
  79. [(detectedPosition - ownPosition) + <-1, Y, Z>*detectedRotation,
  80. NormRot(detectedRotation/ownRotation), speed],
  81. []);
  82. if (land)
  83. llSensorRepeat("", "", AGENT, maxrange, PI, 10);
  84. else
  85. llSensorRepeat("", "", AGENT, minrange, PI, maxspeed);
  86. }
  87. }