Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
archiv:opensim:downloads:scripts:freeview_media_screen [2024/01/24 16:39] – Externe Bearbeitung 127.0.0.1 | archiv:opensim:downloads:scripts:freeview_media_screen [Unbekanntes Datum] (aktuell) – Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ===== Freeview Media Screen ===== | ||
+ | |||
+ | < | ||
+ | //XEngine: | ||
+ | //FreeView 1.2 WebGuide (revision 3) - By CrystalShard Foo | ||
+ | // | ||
+ | //This script is distributed for free and must stay that way. | ||
+ | |||
+ | // *** DO NOT SELL THIS SCRIPT UNDER ANY CIRCUMSTANCE. *** | ||
+ | |||
+ | //Help for using this script can be obtained at: http:// | ||
+ | |||
+ | //Feel free to modify this script and post your improvement. Leave the credits intact but feel free to add your name at its bottom. | ||
+ | |||
+ | //Whats new: | ||
+ | //- Now using FULL_BRIGHT instead of PRIM_MATERIAL_LIGHT for the screen display | ||
+ | //- Added an ownership-change code to handle cases where FreeView gets deeded to group post Video Init. | ||
+ | //- Renamed WebGuide to TV-Guide to reflect what this thing does better. | ||
+ | //- Added a 'Fix Scale' button to Picture mode to help against user texture-scale changes. | ||
+ | //- Additional minor help-tips and code improvements | ||
+ | |||
+ | //Enjoy! | ||
+ | |||
+ | |||
+ | //Constants | ||
+ | integer PICTURE_ROTATION_TIMER = 60; //In whole seconds | ||
+ | |||
+ | integer DISPLAY_ON_SIDE = ALL_SIDES; //Change this to change where the image will be displayed | ||
+ | |||
+ | key VIDEO_DEFAULT = " | ||
+ | key BLANK = " | ||
+ | string NOTECARD = " | ||
+ | |||
+ | integer VIDEO_BRIGHT = TRUE; // | ||
+ | integer PICTURE_BRIGHT = TRUE; // | ||
+ | |||
+ | integer REMOTE_CHANNEL = 9238742; | ||
+ | |||
+ | integer mode = 0; // | ||
+ | //Mode 0 - Power off | ||
+ | //Mode 1 - Picture viewer | ||
+ | //Mode 2 - Video | ||
+ | |||
+ | integer listenHandle = -1; //Dialog menu listen handler | ||
+ | integer listenUrl = -1; // | ||
+ | integer listenTimer = -1; // | ||
+ | integer listenRemote = -1; //listen handler for the remote during initial setup | ||
+ | integer encryption = 0; | ||
+ | integer numberofnotecardlines = 0; //Stores the current number of detected notecard lines. | ||
+ | integer notecardline = 0; // | ||
+ | |||
+ | integer loop_image = FALSE; | ||
+ | integer current_texture = 0; //Current texture number in inventory being displayed (picture mode) | ||
+ | integer chan; // | ||
+ | integer notecardcheck = 0; | ||
+ | key video_texture; | ||
+ | |||
+ | string moviename; | ||
+ | string tempmoviename; | ||
+ | key notecardkey = NULL_KEY; | ||
+ | key tempuser; | ||
+ | string tempurl; | ||
+ | |||
+ | integer isGroup = TRUE; | ||
+ | key groupcheck = NULL_KEY; | ||
+ | key last_owner; | ||
+ | key XML_channel; | ||
+ | |||
+ | pictures() | ||
+ | { | ||
+ | //Initilize variables | ||
+ | | ||
+ | //Change prim to Light material while coloring face 0 black to prevent light-lag generation. | ||
+ | llSetPrimitiveParams([PRIM_BUMP_SHINY, | ||
+ | |||
+ | integer check = llGetInventoryNumber(INVENTORY_TEXTURE); | ||
+ | |||
+ | if(check == 0) | ||
+ | { | ||
+ | report(" | ||
+ | llSetTexture(BLANK, | ||
+ | return; | ||
+ | } | ||
+ | else | ||
+ | if(current_texture > check) | ||
+ | //Set to first texture if available | ||
+ | current_texture = 0; | ||
+ | | ||
+ | display_texture(current_texture); | ||
+ | } | ||
+ | |||
+ | video() | ||
+ | { | ||
+ | //Change prim to Light material while coloring face 0 black to prevent light-lag generation. | ||
+ | llSetPrimitiveParams([PRIM_BUMP_SHINY, | ||
+ | | ||
+ | report(" | ||
+ | if(finditem(NOTECARD) != -1) | ||
+ | tempuser = llGetNumberOfNotecardLines(NOTECARD); | ||
+ | video_texture = llList2Key(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE]), | ||
+ | if(video_texture == NULL_KEY) | ||
+ | { | ||
+ | video_texture = VIDEO_DEFAULT; | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE, | ||
+ | llSay(0," | ||
+ | if(llGetLandOwnerAt(llGetPos()) != llGetOwner()) | ||
+ | llSay(0," | ||
+ | } | ||
+ | | ||
+ | llSetTexture(video_texture, | ||
+ | } | ||
+ | |||
+ | off() | ||
+ | { | ||
+ | report(" | ||
+ | llSetPrimitiveParams([PRIM_BUMP_SHINY, | ||
+ | } | ||
+ | |||
+ | integer finditem(string name) // | ||
+ | { | ||
+ | integer i; | ||
+ | for(i=0; | ||
+ | if(llGetInventoryName(INVENTORY_NOTECARD, | ||
+ | return i; | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | seturl(string url, key id) //Set parcel media URL | ||
+ | { | ||
+ | if(mode != 2) | ||
+ | { | ||
+ | video(); | ||
+ | mode = 2; | ||
+ | } | ||
+ | moviename = tempmoviename; | ||
+ | if(moviename) | ||
+ | moviename = " [" | ||
+ | tempmoviename = ""; | ||
+ | string oldurl = llList2String(llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL]), | ||
+ | if(oldurl != "" | ||
+ | llOwnerSay(" | ||
+ | |||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL, | ||
+ | if(id!=NULL_KEY) | ||
+ | menu(id); | ||
+ | else | ||
+ | { | ||
+ | report(" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]); | ||
+ | } | ||
+ | |||
+ | if(isGroup) | ||
+ | llSay(0," | ||
+ | else | ||
+ | llOwnerSay(" | ||
+ | } | ||
+ | |||
+ | string mediatype(string ext) //Returns a string stating the filetype of a file based on file extension | ||
+ | { | ||
+ | ext = llToLower(ext); | ||
+ | if(ext == " | ||
+ | return " | ||
+ | if(ext == " | ||
+ | return " | ||
+ | if(ext == " | ||
+ | return " | ||
+ | if(ext == " | ||
+ | return " | ||
+ | if(ext == " | ||
+ | return " | ||
+ | return " | ||
+ | } | ||
+ | |||
+ | browse(key id) //Image browser function for picture viewer mode | ||
+ | { | ||
+ | integer check = llGetInventoryNumber(INVENTORY_TEXTURE); | ||
+ | string header; | ||
+ | if(check > 0) | ||
+ | header = " | ||
+ | else | ||
+ | header = "No pictures found."; | ||
+ | llDialog(id," | ||
+ | extendtimer(); | ||
+ | } | ||
+ | |||
+ | report(string str) | ||
+ | { | ||
+ | llSetObjectDesc(str); | ||
+ | } | ||
+ | |||
+ | extendtimer() | ||
+ | { | ||
+ | if(listenHandle == -1) | ||
+ | listenHandle = llListen(chan,"","","" | ||
+ | listenTimer = (integer)llGetTime() + 120; | ||
+ | if(loop_image == FALSE) | ||
+ | llSetTimerEvent(45); | ||
+ | } | ||
+ | |||
+ | config(key id) // | ||
+ | { | ||
+ | extendtimer(); | ||
+ | llDialog(id," | ||
+ | } | ||
+ | |||
+ | tell_remote(string str) | ||
+ | { | ||
+ | llShout(REMOTE_CHANNEL, | ||
+ | } | ||
+ | |||
+ | menu(key id) //Dialog menus for all 3 modes | ||
+ | { | ||
+ | list buttons = []; | ||
+ | string title = "** Monitor control **"; | ||
+ | | ||
+ | extendtimer(); | ||
+ | |||
+ | if(mode != 0) | ||
+ | { | ||
+ | if(mode == 1) // | ||
+ | { | ||
+ | title+=" | ||
+ | buttons+=[" | ||
+ | if(loop_image == FALSE) | ||
+ | buttons+=[" | ||
+ | else | ||
+ | buttons+=[" | ||
+ | buttons+=[" | ||
+ | } | ||
+ | else //Video menu | ||
+ | { | ||
+ | title+=" | ||
+ | buttons+=[" | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | buttons += [" | ||
+ | | ||
+ | llDialog(id, | ||
+ | } | ||
+ | |||
+ | display_texture(integer check) | ||
+ | { //" | ||
+ | string name = llGetInventoryName(INVENTORY_TEXTURE, | ||
+ | llSetTexture(name, | ||
+ | report(" | ||
+ | } | ||
+ | | ||
+ | |||
+ | next() | ||
+ | { // | ||
+ | current_texture++; | ||
+ | integer check = llGetInventoryNumber(INVENTORY_TEXTURE); | ||
+ | if(check == 0) | ||
+ | { | ||
+ | llSetTexture(BLANK, | ||
+ | current_texture = 0; | ||
+ | report(" | ||
+ | return; | ||
+ | } | ||
+ | if(check == current_texture) | ||
+ | current_texture = 0; | ||
+ | | ||
+ | display_texture(check); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | default | ||
+ | { | ||
+ | state_entry() | ||
+ | { | ||
+ | chan = (integer)llFrand(1000) + 1000; // | ||
+ | if(PICTURE_ROTATION_TIMER <= 0) // | ||
+ | PICTURE_ROTATION_TIMER = 1; | ||
+ | llListenRemove(listenHandle); | ||
+ | listenHandle = -1; | ||
+ | last_owner = llGetOwner(); | ||
+ | groupcheck = llRequestAgentData(llGetOwner(), | ||
+ | off(); | ||
+ | llOpenRemoteDataChannel(); | ||
+ | } | ||
+ | | ||
+ | on_rez(integer i) | ||
+ | { | ||
+ | llResetScript(); | ||
+ | } | ||
+ | |||
+ | touch_start(integer total_number) | ||
+ | { | ||
+ | // | ||
+ | //Listen only to owner or group member. Edit this code to change access controls. | ||
+ | if(llDetectedKey(0) != llGetOwner() && llDetectedGroup(0) == FALSE) | ||
+ | return; | ||
+ | // | ||
+ | |||
+ | if(llGetOwnerKey(llGetKey()) != last_owner) | ||
+ | { | ||
+ | isGroup = TRUE; | ||
+ | last_owner = llGetOwner(); | ||
+ | groupcheck = llRequestAgentData(llGetOwner(), | ||
+ | | ||
+ | if(mode == 2) | ||
+ | { | ||
+ | llSay(0," | ||
+ | video(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | menu(llDetectedKey(0)); | ||
+ | } | ||
+ | | ||
+ | changed(integer change) | ||
+ | { | ||
+ | if(change == CHANGED_INVENTORY) //If inventory change | ||
+ | if(mode == 1) //If picture mode | ||
+ | { | ||
+ | integer check = llGetInventoryNumber(INVENTORY_TEXTURE); | ||
+ | if(check != 0) | ||
+ | { | ||
+ | current_texture = 0; | ||
+ | display_texture(check); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | llSetTexture(BLANK, | ||
+ | report(" | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | if(mode == 2) //If video mode | ||
+ | if(finditem(NOTECARD) != -1) //And bookmarks notecard present | ||
+ | if(notecardkey != llGetInventoryKey(NOTECARD)) | ||
+ | tempuser = llGetNumberOfNotecardLines(NOTECARD); | ||
+ | } | ||
+ | | ||
+ | listen(integer channel, string name, key id, string message) | ||
+ | { | ||
+ | if(message == " | ||
+ | { | ||
+ | if(mode == 2) | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]); | ||
+ | pictures(); | ||
+ | mode = 1; | ||
+ | menu(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | video(); | ||
+ | mode = 2; | ||
+ | menu(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == "Power off") | ||
+ | { | ||
+ | if(mode == 2) | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]); | ||
+ | off(); | ||
+ | mode = 0; | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | llSay(0," | ||
+ | if(isGroup) | ||
+ | { | ||
+ | if(id == NULL_KEY) | ||
+ | { | ||
+ | llSay(0," | ||
+ | llSay(0," | ||
+ | } | ||
+ | else | ||
+ | tell_remote(" | ||
+ | } | ||
+ | else | ||
+ | llLoadURL(id," | ||
+ | } | ||
+ | if(mode == 1) | ||
+ | { | ||
+ | if(message == " | ||
+ | { | ||
+ | loop_image = FALSE; | ||
+ | browse(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | extendtimer(); | ||
+ | next(); | ||
+ | browse(id); | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | extendtimer(); | ||
+ | current_texture--; | ||
+ | integer check = llGetInventoryNumber(INVENTORY_TEXTURE); | ||
+ | if(check == 0) | ||
+ | { | ||
+ | llSetTexture(BLANK, | ||
+ | current_texture = 0; | ||
+ | report(" | ||
+ | return; | ||
+ | } | ||
+ | if(current_texture < 0) | ||
+ | current_texture = check - 1; | ||
+ | | ||
+ | display_texture(check); | ||
+ | | ||
+ | browse(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | menu(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | llSetTimerEvent(PICTURE_ROTATION_TIMER); | ||
+ | loop_image = TRUE; | ||
+ | llOwnerSay(" | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | loop_image = FALSE; | ||
+ | llOwnerSay(" | ||
+ | return; | ||
+ | } | ||
+ | if(message == "Fix scale" | ||
+ | { | ||
+ | llSay(0," | ||
+ | llScaleTexture(1, | ||
+ | llOffsetTexture(0, | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | if(mode == 2) | ||
+ | { | ||
+ | if(channel == REMOTE_CHANNEL) | ||
+ | { | ||
+ | if(encryption == 0) | ||
+ | encryption = (integer)message; | ||
+ | llListenRemove(listenRemote); | ||
+ | listenRemote = -1; | ||
+ | llSay(0," | ||
+ | } | ||
+ | | ||
+ | if(message == "TV Guide" | ||
+ | { | ||
+ | if(isGroup) | ||
+ | { | ||
+ | if(!encryption) | ||
+ | { | ||
+ | llSay(0," | ||
+ | llSay(0," | ||
+ | return; | ||
+ | } | ||
+ | tell_remote((string)id+(string)XML_channel+(string)llGetOwner()); | ||
+ | } | ||
+ | else | ||
+ | llLoadURL(id, | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | string header = "Video mode" | ||
+ | | ||
+ | if(message == "<< | ||
+ | { | ||
+ | notecardline--; | ||
+ | if(notecardline < 0) | ||
+ | notecardline = numberofnotecardlines - 1; | ||
+ | tempuser = id; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | return; | ||
+ | } | ||
+ | if(message == "Next >>" | ||
+ | { | ||
+ | notecardline++; | ||
+ | if(notecardline >= numberofnotecardlines) | ||
+ | notecardline = 0; | ||
+ | tempuser = id; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | if(tempurl == "** No URL specified! **") | ||
+ | tempurl = ""; | ||
+ | seturl(tempurl, | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | if(message == " | ||
+ | { | ||
+ | menu(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | config(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | if(notecardcheck != -1) | ||
+ | { | ||
+ | llDialog(id," | ||
+ | return; | ||
+ | } | ||
+ | if(finditem(NOTECARD) != -1) | ||
+ | { | ||
+ | tempuser = id; | ||
+ | if(numberofnotecardlines < notecardline) | ||
+ | notecardline = 0; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | } | ||
+ | else | ||
+ | llDialog(id," | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | if(llGetLandOwnerAt(llGetPos()) != llGetOwner()) | ||
+ | { | ||
+ | llSay(0," | ||
+ | menu(id); | ||
+ | return; //Abort | ||
+ | } | ||
+ | | ||
+ | if(listenUrl != -1 && channel == 1) //Incoming data from "Set URL" command (user spoke on channel 1) | ||
+ | { | ||
+ | llListenRemove(listenUrl); | ||
+ | listenUrl = -1; | ||
+ | tempmoviename = ""; | ||
+ | seturl(message, | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | report(header+" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | report(header+" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP]); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | report(header+" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PAUSE]); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | report(header+" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]); | ||
+ | return; | ||
+ | } | ||
+ | if(message == " | ||
+ | { | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_LOOP]); | ||
+ | return; | ||
+ | } | ||
+ | //URL , Auto-Scale, | ||
+ | if(message == "Set URL") | ||
+ | { | ||
+ | report(header+" | ||
+ | listenUrl = llListen(1,"", | ||
+ | llDialog(id," | ||
+ | return; | ||
+ | } | ||
+ | if(message == "Align ON") | ||
+ | { | ||
+ | report(header+" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN, | ||
+ | menu(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == "Align OFF") | ||
+ | { | ||
+ | report(header+" | ||
+ | llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN, | ||
+ | menu(id); | ||
+ | return; | ||
+ | } | ||
+ | if(message == "Set Remote" | ||
+ | { | ||
+ | llSay(0," | ||
+ | encryption = 0; | ||
+ | llListenRemove(listenRemote); | ||
+ | listenRemote = llListen(REMOTE_CHANNEL,"","","" | ||
+ | llSay(REMOTE_CHANNEL," | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | dataserver(key queryid, string data) | ||
+ | { | ||
+ | if(queryid == groupcheck) | ||
+ | { | ||
+ | groupcheck = NULL_KEY; | ||
+ | isGroup = FALSE; | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | if(queryid == tempuser) //If just checking number of notecard lines | ||
+ | { | ||
+ | numberofnotecardlines = (integer)data; | ||
+ | notecardkey = llGetInventoryKey(NOTECARD); | ||
+ | notecardcheck = 0; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | return; | ||
+ | } | ||
+ | if(notecardcheck != -1) | ||
+ | { | ||
+ | if(data != EOF) | ||
+ | { | ||
+ | if(data == "" | ||
+ | { | ||
+ | notecardcheck++; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | notecardcheck = -1; | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if(data == "" | ||
+ | { | ||
+ | notecardline++; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | if(data == EOF) | ||
+ | { | ||
+ | notecardline = 0; | ||
+ | llGetNotecardLine(NOTECARD, | ||
+ | return; | ||
+ | } | ||
+ | list parsed = llParseString2List(data, | ||
+ | string name = llList2String(parsed, | ||
+ | tempurl = llList2String(parsed, | ||
+ | if(tempurl == "" | ||
+ | tempurl = "** No URL specified! **"; | ||
+ | | ||
+ | tempmoviename = name; | ||
+ | | ||
+ | llDialog(tempuser," | ||
+ | } | ||
+ | | ||
+ | remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) | ||
+ | { | ||
+ | if (type == REMOTE_DATA_CHANNEL) | ||
+ | { | ||
+ | XML_channel = channel; | ||
+ | } | ||
+ | else if(type == REMOTE_DATA_REQUEST) | ||
+ | { | ||
+ | list media_info = llParseString2List(sval, | ||
+ | tempmoviename = llList2String(media_info, | ||
+ | seturl(llList2String(media_info, | ||
+ | llRemoteDataReply(channel, | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | timer() | ||
+ | { | ||
+ | if(llGetTime() > listenTimer) | ||
+ | { | ||
+ | llListenRemove(listenHandle); | ||
+ | llListenRemove(listenUrl); | ||
+ | llListenRemove(listenRemote); | ||
+ | listenHandle = -1; | ||
+ | listenUrl = -1; | ||
+ | listenRemote = -1; | ||
+ | listenTimer = -1; | ||
+ | if(loop_image == FALSE || mode != 1) //If we're not looping pictures or are in picture mode at all | ||
+ | llSetTimerEvent(0.0); | ||
+ | } | ||
+ | | ||
+ | if(loop_image == TRUE && mode == 1) //If we're looping pictures and and we're in picture mode... | ||
+ | next(); //Next picture | ||
+ | } | ||
+ | } | ||
+ | </ | ||