| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- // :SHOW:
- // :CATEGORY:Sign
- // :NAME:Hypergrid_Events_Sign
- // :AUTHOR:Anonymous
- // :KEYWORDS:
- // :CREATED:2017-11-19 21:55:09
- // :EDITED:2017-11-19 20:55:09
- // :ID:1111
- // :NUM:1914
- // :REV:1
- // :WORLD:OpenSim
- // :DESCRIPTION:
- // DESCRIPTION: []::Hypergrid_Events_Sign pulls events from a datbase for display in world
- // :CODE:
- //
- // HYPEvents in-world teleporter board script
- //
- // Author: Tom Frost <tomfrost@linkwater.org>
- //
- // GPLv3
- //
- // configuration:
- float refreshTime = 1800;
- // internal, do not touch:
- integer lineHeight = 30;
- integer startY = 90;
-
- integer texWidth = 512;
- integer texHeight = 512;
- key httpRequest;
- list events;
- integer channel;
- integer listenHandle;
- integer listening = 0;
- list avatarDestinations = [];
- //
- // manipulate global avatarDestinations list
- //
- // insert or overwrite destination for agent with dest
- //
- tfSetAvatarDest(key agent, string dest)
- {
- list newList = [];
- integer idx;
- integer len = llGetListLength(avatarDestinations)/2;
- integer set = FALSE;
-
- for(idx=0;idx<len;idx++) {
- key avatar = llList2Key(avatarDestinations, (idx*2));
- if(avatar==agent) {
- newList += [ agent, dest ];
- set = TRUE;
- } else {
- newList += [ avatar, llList2String(avatarDestinations, (idx*2)+1) ];
- }
- }
- if(!set) {
- newList += [ agent, dest ];
- }
-
- avatarDestinations = newList;
- }
- //
- // retrieve avatar dest from global avatarDestination list
- //
- // returns hgurl if destination set, NULL_KEY otherwise
- //
- string tfGetAvatarDest(key agent)
- {
- integer idx;
- integer len = llGetListLength(avatarDestinations)/2;
-
- for(idx=0;idx<len;idx++) {
- if(llList2Key(avatarDestinations, (idx*2))==agent) {
- return llList2String(avatarDestinations, (idx*2)+1);
- }
- }
- return NULL_KEY;
- }
- doRequest()
- {
- httpRequest = llHTTPRequest("http://hypevents.net/events.lsl", [], "");
- }
- string tfTrimText(string in, string fontname, integer fontsize,integer width)
- {
- integer i;
- integer trimmed = FALSE;
-
- for(;llStringLength(in)>0;in=llGetSubString(in,0,-2)) {
-
- vector extents = osGetDrawStringSize("vector",in,fontname,fontsize);
-
- if(extents.x<=width) {
- if(trimmed) {
- return in + "..";
- } else {
- return in;
- }
- }
-
- trimmed = TRUE;
- }
- return "";
- }
- refreshTexture()
- {
- string commandList = "";
-
- integer fontSize=50;
-
- commandList = osMovePen(commandList, 20, 5);
- commandList = osDrawImage(commandList, 400, 70, "http://linkwater.org/dyntex/hypevents_logo.png");
-
- commandList = osSetPenSize(commandList, 1);
- commandList = osDrawLine(commandList, 0, 80, 512, 80);
-
- integer numEvents = llGetListLength(events)/3;
-
- integer i;
- integer y = startY;
-
- commandList = osSetFontName(commandList, "Arial");
- commandList = osSetFontSize(commandList, 20);
-
- for(i=0;i<numEvents;i++) {
- integer base = i*3;
-
- commandList = osMovePen(commandList, 10, y);
-
- string text = llList2String(events, base+1) + " " + llList2String(events, base);
- text = tfTrimText(text, "Arial", 20, texWidth-40);
- commandList = osDrawText(commandList, text);
-
- y += lineHeight;
- }
-
- osSetDynamicTextureData("", "vector", commandList, "width:"+(string)texWidth+",height:"+(string)texHeight, 0);
- }
- tfLoadURL(key avatar)
- {
- llLoadURL(avatar, "Visit the HYPEvents web-site for more detailed event information and technical information.", "http://hypevents.net/");
- }
- tfGoToEvent(key avatar, integer eventIndex)
- {
- integer numEvents = llGetListLength(events)/3;
-
- integer base = eventIndex * 3;
-
- if(eventIndex<numEvents) {
- string text=llList2String(events, base+0);
-
- text += "\n\n";
-
- text += "The hypergrid url for this event is:\n\n"+llList2String(events, base+2)+"\n\n";
-
- text += "Is this hgurl a hypergrid url for you or a local url?\n\n";
-
- tfSetAvatarDest(avatar, llList2String(events, base+2));
-
- llDialog(avatar, text, ["Hypergrid","Local grid", "Cancel"], channel);
- if(listening==0) {
- listenHandle = llListen(channel, "", NULL_KEY, "");
- listening = (integer)llGetTime();
- }
- } else {
- }
- }
-
- default
- {
- state_entry()
- {
- channel = -25673 - (integer)llFrand(1000000);
- listening = 0;
- avatarDestinations = [];
- llSetTimerEvent(refreshTime);
- doRequest();
- }
-
- http_response(key requestID, integer status, list metadata, string body)
- {
- if(status==200) {
- events = llParseString2List(body, ["\n"], []);
- refreshTexture();
- } else {
- llOwnerSay("Unable to fetch event.lsl, status: "+(string)status);
- }
- }
-
- listen(integer chan, string name, key agent, string msg)
- {
- if(chan==channel) {
- if(msg!="Cancel") {
- string dest = tfGetAvatarDest(agent);
- if(dest!=NULL_KEY) {
- string dsturl = dest;
- if(msg=="Local grid") {
- list hgurl = llParseString2List(dest, [":"], []);
- dsturl = llList2String(hgurl, 2);
- }
- osTeleportAgent(agent, dsturl, <128.0,128.0,23.0>, <1.0,1.0,0.0> );
- }
- }
- }
- }
-
- touch_end(integer num)
- {
- integer i;
- for(i=0;i<num;i++) {
- vector touchPos = llDetectedTouchUV(i);
- integer touchX = (integer)(touchPos.x * texWidth);
- integer touchY = texHeight - (integer)(touchPos.y * texHeight);
- key avatar = llDetectedKey(i);
-
- if(touchY < 80) {
- tfLoadURL(avatar);
- } else if(touchY>=startY) {
- integer touchIndex;
-
- touchIndex = (integer)((touchY - startY) / lineHeight);
-
- tfGoToEvent(avatar, touchIndex);
- }
- }
- }
-
- timer()
- {
- // timeout listener
- if(listening!=0) {
- if( (listening + 300) < (integer)llGetTime() ) {
- llListenRemove(listenHandle);
- avatarDestinations=[];
- listening = 0;
- }
- }
- // refresh texture
- doRequest();
- }
- }
|