// // Script for changing the Music link on your land by clicking a sign or other object. // Written by Second Life resident DangerDave Writer on March 17 and 18, 2007. // Free to use, modify, and share - enjoy! // // Scan full circle around area every 5 seconds for 10 meters out: // // How far away do want to scan for approaching avatars? float scan_meters = 10.0; // How many seconds inbetween scans? float scan_seconds = 5.0; // Peripheral vision: how far to the left and right do we scan? float Two_PI = 6.283185306; float scan_radius = Two_PI; // PI times 2 = full circle, PI = half circle. // Basic text to display above sign: string sign_text = "Touch me to change the station."; // Here is the list of channels available (from http://www.sky.fm Internet Radio). // First line is the URL of the music (or other streaming audio) // Second line is the description to be displayed on the sign. // Finally, a blank line to make it easer to read and change. list channel_list = [ "http://64.236.98.50:80/stream/1002", "New Age", "http://205.188.215.225:8004", "Progressive House", "http://205.188.215.226:8020", "Classical & Flamenco Guitar", "http://64.236.98.50:80/stream/1006", "Classical", "http://64.236.98.50:80/stream/1035", "Chillout - ambient psy chillout", "http://64.236.98.50:80/stream/1007", "House - silky sexy house music", "http://64.236.98.50:80/stream/1009", "Lounge - sit back and enjoy the lounge grooves", "http://216.32.93.104:8044", "Radio Panamericana, Peru", "http://87.106.30.141:8088", "Jade's Jazz Club", "http://205.188.215.231:8010", "Salsa", "http://207.200.96.228:8078/", "Arabic", "http://38.96.148.26:7890", "UK Blues", "http://207.200.96.231:8026", "Rock", "http://211.43.215.172:8320", "Ballroom 1", "http://222.122.131.95:8000", "Ballroom 2", "http:", "Off", 0 // Mark end of list ]; //////////////////////////////////////////////////////////////////////////////////////////////////// // // // The programming starts here. Do not modify below here unless you know what you are doing. // // //////////////////////////////////////////////////////////////////////////////////////////////////// integer radio_station = 0; integer num_radio_stations = 0; string nearby = ""; string music_type = ""; string playing_text = ""; // playing_text = "Now Playing Station " + (string)(1 + radio_station) + " " + music_type; string current_text = ""; string last_touched_by = ""; string date_selected = ""; string time_selected = ""; list channel_type = []; list channel_URL = []; integer init_stations() { integer radio_station_max_index = -1; integer i = 0; integer entry_type = 0; string temp_text = ""; channel_type = []; channel_URL = []; llSetText("Scanning Stations...", <1,1,1>, 1.0); // radio_station = (integer)(llFrand(1.0) * 4.0); for( i = 0; i < llGetListLength( channel_list ); i++ ) { if ( llGetListEntryType( channel_list, i ) == TYPE_STRING ) { radio_station_max_index = i; if( llGetSubString( llList2String( channel_list, i ), 0, 4 ) == "http:" ) { if ( llStringLength( temp_text ) > 0 ) { channel_type += temp_text; } temp_text = ""; channel_URL += llList2String( channel_list, i ); num_radio_stations++; } else { if( llStringLength( temp_text ) > 0 ) { temp_text = temp_text + "\n"; } temp_text = temp_text + llList2String( channel_list, i ); } } } if ( llStringLength( temp_text ) > 0 ) channel_type += temp_text; if( radio_station >= num_radio_stations ) radio_station = 0; if( radio_station < 0 ) radio_station = 0; music_type = llList2String( channel_type, radio_station ); if( llGetSubString( llList2String( channel_URL, radio_station ), 0, 6 ) == "http://" ) llSetParcelMusicURL( llList2String( channel_URL, radio_station ) ); else llSetParcelMusicURL( "" ); return num_radio_stations; } string set_playing_text() { playing_text = "Now Playing Station " + (string)(1 + radio_station) + " " + music_type; if ( llStringLength( last_touched_by ) > 0 ) playing_text += "\nSelected by " + last_touched_by; if ( llStringLength (date_selected) > 0 ) playing_text += " on " + date_selected; if ( llStringLength (time_selected) > 0 ) playing_text += " at " + time_selected; return playing_text; } string now_as_hhmmss() { integer t = 0; integer hours = 0; integer minutes = 0; integer seconds = 0; string time_now = ""; t = (integer)llGetWallclock(); // seconds since midnight // one hour has 3600 seconds hours = t / 3600; // get hours (integer division chops off the decimals) // the modulo operator % gets the remainder of a divison // in this case, the remaining seconds after removing the full hours minutes = (t % 3600) / 60; // divide by 60 because we want minutes, chops off decimals again seconds = t % 60; // get the seconds that didn't fit into full minutes time_now = ""; if ( hours < 12 ) time_now += "0"; time_now += (string)hours; time_now += ":"; if ( minutes < 10 ) time_now += "0"; time_now += (string)minutes; time_now += ":"; if ( seconds < 10 ) time_now += "0"; time_now += (string)seconds; return time_now; } default { state_entry() { init_stations(); llSetText(sign_text, <1,1,1>, 1.0); llSensorRepeat( "", NULL_KEY, AGENT, scan_meters, scan_radius, scan_seconds ); } sensor(integer num_detected) { integer i = 0; string visitors = "visitors"; nearby = ""; for(i = 0; i < num_detected; ++i) { if ( i > 0 ) nearby = nearby + ","; nearby = nearby + " " + llKey2Name(llDetectedKey(i)); } if ( num_detected == 1 ) visitors = "visitor"; else visitors = "visitors"; set_playing_text(); current_text = (string)num_detected + " " + visitors + " detected. Welcome" + nearby + "!\n" + sign_text + "\n" + playing_text; llSetText(current_text, <1,1,1>, 1.0); } touch_start(integer num_detected) { integer i = 0; vector avatar_size = <0.0, 0.0, 0.0>; float meters_tall = 0.0; integer inches_tall = 0; integer feet_tall = 0; integer inches_left = 0; string feet = "feet"; string inches = "inches"; string height = ""; llSetText( "Stations = " + (string)num_radio_stations, <1,1,1>, 1.0 ); if ( num_radio_stations == 0 ) init_stations(); radio_station = radio_station + 1; if( radio_station >= num_radio_stations ) radio_station = 0; music_type = llList2String( channel_type, radio_station ); if( llGetSubString( llList2String( channel_URL, radio_station ), 0, 6 ) == "http://" ) llSetParcelMusicURL( llList2String( channel_URL, radio_station ) ); else llSetParcelMusicURL( "" ); date_selected = llGetDate(); time_selected = now_as_hhmmss(); // http://205.188.215.226:8020 // http://209.247.146.99:8000 // http://64.236.98.50:80/stream/1002 for(i = 0; i < num_detected; ++i) { avatar_size = llGetAgentSize(llDetectedKey(i)); meters_tall = avatar_size.z; inches_tall = (integer)(0.5 + meters_tall * 39.3700787); feet_tall = (integer)(inches_tall / 12.0); inches_left = (integer)(inches_tall - (feet_tall * 12.0)); // llWhisper(0, "Size is " + (string)llGetAgentSize(llDetectedKey(i))); if( feet_tall == 1) feet = "foot"; else feet = "feet"; if ( inches_left == 1 ) inches = "inch"; else inches = "inches"; height = ""; if ( feet_tall > 0 ) { height = (string)feet_tall + " " + feet; if ( inches_left > 0 ) height = height + ", "; } if ( inches_left > 0 ) { height = height + (string)inches_left + " " + inches; } last_touched_by = llKey2Name(llDetectedKey(i)); // llEmail( "youremail@yourdomain.com", "Visitor Alert", llKey2Name(llDetectedKey(i)) + " has changed your radio station." ); // llWhisper(0, llKey2Name(llDetectedKey(i)) + ", you are " + height + " tall."); } set_playing_text(); current_text = sign_text + " " + playing_text; llSetText( current_text, <1,1,1>, 1.0); } }