Script.lsl 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. // :SHOW:
  2. // :CATEGORY:Sign
  3. // :NAME:Hypergrid_Events_Sign
  4. // :AUTHOR:Anonymous
  5. // :KEYWORDS:
  6. // :CREATED:2017-11-19 21:55:09
  7. // :EDITED:2017-11-19 20:55:09
  8. // :ID:1111
  9. // :NUM:1914
  10. // :REV:1
  11. // :WORLD:OpenSim
  12. // :DESCRIPTION:
  13. // DESCRIPTION: []::Hypergrid_Events_Sign pulls events from a datbase for display in world
  14. // :CODE:
  15. //
  16. // HYPEvents in-world teleporter board script
  17. //
  18. // Author: Tom Frost <tomfrost@linkwater.org>
  19. //
  20. // GPLv3
  21. //
  22. // configuration:
  23. float refreshTime = 1800;
  24. // internal, do not touch:
  25. integer lineHeight = 30;
  26. integer startY = 90;
  27. integer texWidth = 512;
  28. integer texHeight = 512;
  29. key httpRequest;
  30. list events;
  31. integer channel;
  32. integer listenHandle;
  33. integer listening = 0;
  34. list avatarDestinations = [];
  35. //
  36. // manipulate global avatarDestinations list
  37. //
  38. // insert or overwrite destination for agent with dest
  39. //
  40. tfSetAvatarDest(key agent, string dest)
  41. {
  42. list newList = [];
  43. integer idx;
  44. integer len = llGetListLength(avatarDestinations)/2;
  45. integer set = FALSE;
  46. for(idx=0;idx<len;idx++) {
  47. key avatar = llList2Key(avatarDestinations, (idx*2));
  48. if(avatar==agent) {
  49. newList += [ agent, dest ];
  50. set = TRUE;
  51. } else {
  52. newList += [ avatar, llList2String(avatarDestinations, (idx*2)+1) ];
  53. }
  54. }
  55. if(!set) {
  56. newList += [ agent, dest ];
  57. }
  58. avatarDestinations = newList;
  59. }
  60. //
  61. // retrieve avatar dest from global avatarDestination list
  62. //
  63. // returns hgurl if destination set, NULL_KEY otherwise
  64. //
  65. string tfGetAvatarDest(key agent)
  66. {
  67. integer idx;
  68. integer len = llGetListLength(avatarDestinations)/2;
  69. for(idx=0;idx<len;idx++) {
  70. if(llList2Key(avatarDestinations, (idx*2))==agent) {
  71. return llList2String(avatarDestinations, (idx*2)+1);
  72. }
  73. }
  74. return NULL_KEY;
  75. }
  76. doRequest()
  77. {
  78. httpRequest = llHTTPRequest("http://hypevents.net/events.lsl", [], "");
  79. }
  80. string tfTrimText(string in, string fontname, integer fontsize,integer width)
  81. {
  82. integer i;
  83. integer trimmed = FALSE;
  84. for(;llStringLength(in)>0;in=llGetSubString(in,0,-2)) {
  85. vector extents = osGetDrawStringSize("vector",in,fontname,fontsize);
  86. if(extents.x<=width) {
  87. if(trimmed) {
  88. return in + "..";
  89. } else {
  90. return in;
  91. }
  92. }
  93. trimmed = TRUE;
  94. }
  95. return "";
  96. }
  97. refreshTexture()
  98. {
  99. string commandList = "";
  100. integer fontSize=50;
  101. commandList = osMovePen(commandList, 20, 5);
  102. commandList = osDrawImage(commandList, 400, 70, "http://linkwater.org/dyntex/hypevents_logo.png");
  103. commandList = osSetPenSize(commandList, 1);
  104. commandList = osDrawLine(commandList, 0, 80, 512, 80);
  105. integer numEvents = llGetListLength(events)/3;
  106. integer i;
  107. integer y = startY;
  108. commandList = osSetFontName(commandList, "Arial");
  109. commandList = osSetFontSize(commandList, 20);
  110. for(i=0;i<numEvents;i++) {
  111. integer base = i*3;
  112. commandList = osMovePen(commandList, 10, y);
  113. string text = llList2String(events, base+1) + " " + llList2String(events, base);
  114. text = tfTrimText(text, "Arial", 20, texWidth-40);
  115. commandList = osDrawText(commandList, text);
  116. y += lineHeight;
  117. }
  118. osSetDynamicTextureData("", "vector", commandList, "width:"+(string)texWidth+",height:"+(string)texHeight, 0);
  119. }
  120. tfLoadURL(key avatar)
  121. {
  122. llLoadURL(avatar, "Visit the HYPEvents web-site for more detailed event information and technical information.", "http://hypevents.net/");
  123. }
  124. tfGoToEvent(key avatar, integer eventIndex)
  125. {
  126. integer numEvents = llGetListLength(events)/3;
  127. integer base = eventIndex * 3;
  128. if(eventIndex<numEvents) {
  129. string text=llList2String(events, base+0);
  130. text += "\n\n";
  131. text += "The hypergrid url for this event is:\n\n"+llList2String(events, base+2)+"\n\n";
  132. text += "Is this hgurl a hypergrid url for you or a local url?\n\n";
  133. tfSetAvatarDest(avatar, llList2String(events, base+2));
  134. llDialog(avatar, text, ["Hypergrid","Local grid", "Cancel"], channel);
  135. if(listening==0) {
  136. listenHandle = llListen(channel, "", NULL_KEY, "");
  137. listening = (integer)llGetTime();
  138. }
  139. } else {
  140. }
  141. }
  142. default
  143. {
  144. state_entry()
  145. {
  146. channel = -25673 - (integer)llFrand(1000000);
  147. listening = 0;
  148. avatarDestinations = [];
  149. llSetTimerEvent(refreshTime);
  150. doRequest();
  151. }
  152. http_response(key requestID, integer status, list metadata, string body)
  153. {
  154. if(status==200) {
  155. events = llParseString2List(body, ["\n"], []);
  156. refreshTexture();
  157. } else {
  158. llOwnerSay("Unable to fetch event.lsl, status: "+(string)status);
  159. }
  160. }
  161. listen(integer chan, string name, key agent, string msg)
  162. {
  163. if(chan==channel) {
  164. if(msg!="Cancel") {
  165. string dest = tfGetAvatarDest(agent);
  166. if(dest!=NULL_KEY) {
  167. string dsturl = dest;
  168. if(msg=="Local grid") {
  169. list hgurl = llParseString2List(dest, [":"], []);
  170. dsturl = llList2String(hgurl, 2);
  171. }
  172. osTeleportAgent(agent, dsturl, <128.0,128.0,23.0>, <1.0,1.0,0.0> );
  173. }
  174. }
  175. }
  176. }
  177. touch_end(integer num)
  178. {
  179. integer i;
  180. for(i=0;i<num;i++) {
  181. vector touchPos = llDetectedTouchUV(i);
  182. integer touchX = (integer)(touchPos.x * texWidth);
  183. integer touchY = texHeight - (integer)(touchPos.y * texHeight);
  184. key avatar = llDetectedKey(i);
  185. if(touchY < 80) {
  186. tfLoadURL(avatar);
  187. } else if(touchY>=startY) {
  188. integer touchIndex;
  189. touchIndex = (integer)((touchY - startY) / lineHeight);
  190. tfGoToEvent(avatar, touchIndex);
  191. }
  192. }
  193. }
  194. timer()
  195. {
  196. // timeout listener
  197. if(listening!=0) {
  198. if( (listening + 300) < (integer)llGetTime() ) {
  199. llListenRemove(listenHandle);
  200. avatarDestinations=[];
  201. listening = 0;
  202. }
  203. }
  204. // refresh texture
  205. doRequest();
  206. }
  207. }