light.lsl 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // :SHOW:1
  2. // :CATEGORY:Light
  3. // :NAME:Rene Free Lighting System
  4. // :AUTHOR:Rene10957 Resident
  5. // :KEYWORDS: light,lamp,lighting light
  6. // :CREATED:2015-06-11 14:41:42
  7. // :EDITED:2016-03-30 20:29:27
  8. // :ID:1079
  9. // :NUM:1782
  10. // :REV:2.0
  11. // :WORLD:Opensim
  12. // :DESCRIPTION:
  13. // Light Bulb for Menu-controlled lighting system with many features
  14. // :CODE:
  15. // :LICENSE: CC0 (Public Domain)
  16. // Rene's Free Lighting System - Light Bulb
  17. //
  18. // Author: Rene10957 Resident
  19. // Date: 31-05-2015
  20. // License: CC0 (Public Domain).
  21. // To the extent possible under law, Rene10957 has waived all copyright and related or neighboring rights.
  22. // For more information, see http://creativecommons.org/publicdomain/zero/1.0/.
  23. string title = "Light Bulb"; // title
  24. string version = "2.0"; // version
  25. integer linkSet = TRUE; // LINKSET mode
  26. integer silent = TRUE; // silent startup
  27. // Constants
  28. integer switchChannel = -10957; // switch channel
  29. integer particleChannel = -75901; // particle channel
  30. integer feedbackChannel = -57910; // feedback channel
  31. // Variables
  32. key owner; // object owner
  33. string particleMsg; // message for particle plugin (on/off, color, size)
  34. // Functions
  35. string getGroup()
  36. {
  37. string str = llStringTrim(llGetObjectDesc(), STRING_TRIM);
  38. if (llToLower(str) == "(no description)" || str == "") str = "Default";
  39. return str;
  40. }
  41. unpackMessage(string msg)
  42. {
  43. list msgList = llCSV2List(msg);
  44. integer lightGroups = (integer)llList2String(msgList, 16);
  45. if (lightGroups && llToLower(llList2String(msgList, 0)) != llToLower(getGroup())) return;
  46. integer on = (integer)llList2String(msgList, 1);
  47. vector color = (vector)llList2String(msgList, 2);
  48. float intensity = (float)llList2String(msgList, 3);
  49. float radius = (float)llList2String(msgList, 4);
  50. float falloff = (float)llList2String(msgList, 5);
  51. float alpha = (float)llList2String(msgList, 6);
  52. float glow = (float)llList2String(msgList, 7);
  53. integer fullbright = (integer)llList2String(msgList, 8);
  54. vector primColor = (vector)llList2String(msgList, 9);
  55. vector particleColor = (vector)llList2String(msgList, 10);
  56. float particleSize = (float)llList2String(msgList, 11);
  57. float particleInc = (float)llList2String(msgList, 12);
  58. string particleTexture = llList2String(msgList, 13);
  59. integer particlesOn = (integer)llList2String(msgList, 14);
  60. string faces = llList2String(msgList, 15);
  61. // Placeholder for 16 (see above)
  62. // Forward 10 (particleColor), 11 (particleSize), 12 (particleInc), 13 (particleTexture) and 14 (particlesOn)
  63. // to particle script (same prim)
  64. if (particleMsg == "") particleInc = 999; // first message after script reset: set particle size to default
  65. list pList = [particlesOn, particleColor, particleSize, particleInc, particleTexture];
  66. particleMsg = llList2CSV(pList); // global variable
  67. llMessageLinked(LINK_THIS, particleChannel, particleMsg, "");
  68. // Set light and prim properties
  69. list faceList = llParseString2List(faces, ["<", ",", " ", ">"], []);
  70. integer length = llGetListLength(faceList);
  71. integer face;
  72. integer i;
  73. llSetLinkPrimitiveParamsFast(LINK_THIS, [
  74. PRIM_POINT_LIGHT, on, color, intensity, radius, falloff]);
  75. for (i = 0; i < length; ++i) {
  76. face = (integer)llList2String(faceList, i);
  77. llSetLinkPrimitiveParamsFast(LINK_THIS, [
  78. PRIM_COLOR, face, primColor, alpha,
  79. PRIM_GLOW, face, glow,
  80. PRIM_FULLBRIGHT, face, fullbright]);
  81. }
  82. }
  83. resetParticleSize(string msg)
  84. {
  85. list msgList = llCSV2List(msg);
  86. list pList = llListReplaceList(msgList, [999], 3, 3);
  87. particleMsg = llList2CSV(pList); // global variable
  88. llMessageLinked(LINK_THIS, particleChannel, particleMsg, "");
  89. }
  90. default
  91. {
  92. state_entry()
  93. {
  94. owner = llGetOwner();
  95. if (linkSet) state sLinkSet;
  96. else state sRegion;
  97. }
  98. }
  99. state sLinkSet
  100. {
  101. state_entry()
  102. {
  103. if (!silent) llWhisper(0, title + " " + version + "-LINKSET ready");
  104. }
  105. on_rez(integer start_param)
  106. {
  107. llResetScript();
  108. }
  109. link_message(integer sender_number, integer number, string msg, key id)
  110. {
  111. if (number == switchChannel) {
  112. unpackMessage(msg);
  113. }
  114. else if (number == feedbackChannel) {
  115. if (msg == "READY") {
  116. llSleep(0.2); // give new particle script time to reset
  117. if (particleMsg) resetParticleSize(particleMsg); // start particles with default size
  118. }
  119. }
  120. }
  121. changed(integer change)
  122. {
  123. if (change & CHANGED_INVENTORY) {
  124. llParticleSystem([]); // stop particles in case particle script was removed
  125. if (particleMsg) llMessageLinked(LINK_THIS, particleChannel, particleMsg, ""); // start particles
  126. }
  127. }
  128. }
  129. state sRegion
  130. {
  131. state_entry()
  132. {
  133. llListen(switchChannel, "", "", "");
  134. if (!silent) llWhisper(0, title + " " + version + "-REGION ready");
  135. }
  136. on_rez(integer start_param)
  137. {
  138. llResetScript();
  139. }
  140. listen(integer channel, string name, key id, string msg)
  141. {
  142. if (channel == switchChannel) if (llGetOwnerKey(id) == owner) unpackMessage(msg);
  143. }
  144. link_message(integer sender_number, integer number, string msg, key id)
  145. {
  146. if (number != feedbackChannel) return;
  147. if (msg == "READY") {
  148. llSleep(0.2); // give new particle script time to reset
  149. if (particleMsg) resetParticleSize(particleMsg); // start particles with default size
  150. }
  151. }
  152. changed(integer change)
  153. {
  154. if (change & CHANGED_INVENTORY) {
  155. llParticleSystem([]); // stop particles in case particle script was removed
  156. if (particleMsg) llMessageLinked(LINK_THIS, particleChannel, particleMsg, ""); // start particles
  157. }
  158. }
  159. }