diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
4 files changed, 289 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 50ea489..ba1a5f1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -7848,6 +7848,241 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7848 | return res; | 7848 | return res; |
7849 | } | 7849 | } |
7850 | 7850 | ||
7851 | public LSL_List llGetPrimMediaParams(int face, LSL_List rules) | ||
7852 | { | ||
7853 | m_host.AddScriptLPS(1); | ||
7854 | ScriptSleep(1000); | ||
7855 | |||
7856 | // LSL Spec http://wiki.secondlife.com/wiki/LlGetPrimMediaParams says to fail silently if face is invalid | ||
7857 | // TODO: Need to correctly handle case where a face has no media (which gives back an empty list). | ||
7858 | // Assuming silently fail means give back an empty list. Ideally, need to check this. | ||
7859 | if (face < 0 || face > m_host.GetNumberOfSides() - 1) | ||
7860 | return new LSL_List(); | ||
7861 | |||
7862 | return GetPrimMediaParams(face, rules); | ||
7863 | } | ||
7864 | |||
7865 | private LSL_List GetPrimMediaParams(int face, LSL_List rules) | ||
7866 | { | ||
7867 | IMoapModule module = m_ScriptEngine.World.RequestModuleInterface<IMoapModule>(); | ||
7868 | if (null == module) | ||
7869 | throw new Exception("Media on a prim functions not available"); | ||
7870 | |||
7871 | MediaEntry me = module.GetMediaEntry(m_host, face); | ||
7872 | |||
7873 | // As per http://wiki.secondlife.com/wiki/LlGetPrimMediaParams | ||
7874 | if (null == me) | ||
7875 | return new LSL_List(); | ||
7876 | |||
7877 | LSL_List res = new LSL_List(); | ||
7878 | |||
7879 | for (int i = 0; i < rules.Length; i++) | ||
7880 | { | ||
7881 | int code = (int)rules.GetLSLIntegerItem(i); | ||
7882 | |||
7883 | switch (code) | ||
7884 | { | ||
7885 | case ScriptBaseClass.PRIM_MEDIA_ALT_IMAGE_ENABLE: | ||
7886 | // Not implemented | ||
7887 | res.Add(new LSL_Integer(0)); | ||
7888 | break; | ||
7889 | |||
7890 | case ScriptBaseClass.PRIM_MEDIA_CONTROLS: | ||
7891 | if (me.Controls == MediaControls.Standard) | ||
7892 | res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MEDIA_CONTROLS_STANDARD)); | ||
7893 | else | ||
7894 | res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MEDIA_CONTROLS_MINI)); | ||
7895 | break; | ||
7896 | |||
7897 | case ScriptBaseClass.PRIM_MEDIA_CURRENT_URL: | ||
7898 | res.Add(new LSL_String(me.CurrentURL)); | ||
7899 | break; | ||
7900 | |||
7901 | case ScriptBaseClass.PRIM_MEDIA_HOME_URL: | ||
7902 | res.Add(new LSL_String(me.HomeURL)); | ||
7903 | break; | ||
7904 | |||
7905 | case ScriptBaseClass.PRIM_MEDIA_AUTO_LOOP: | ||
7906 | res.Add(me.AutoLoop ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); | ||
7907 | break; | ||
7908 | |||
7909 | case ScriptBaseClass.PRIM_MEDIA_AUTO_PLAY: | ||
7910 | res.Add(me.AutoPlay ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); | ||
7911 | break; | ||
7912 | |||
7913 | case ScriptBaseClass.PRIM_MEDIA_AUTO_SCALE: | ||
7914 | res.Add(me.AutoScale ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); | ||
7915 | break; | ||
7916 | |||
7917 | case ScriptBaseClass.PRIM_MEDIA_AUTO_ZOOM: | ||
7918 | res.Add(me.AutoZoom ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); | ||
7919 | break; | ||
7920 | |||
7921 | case ScriptBaseClass.PRIM_MEDIA_FIRST_CLICK_INTERACT: | ||
7922 | res.Add(me.InteractOnFirstClick ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); | ||
7923 | break; | ||
7924 | |||
7925 | case ScriptBaseClass.PRIM_MEDIA_WIDTH_PIXELS: | ||
7926 | res.Add(new LSL_Integer(me.Width)); | ||
7927 | break; | ||
7928 | |||
7929 | case ScriptBaseClass.PRIM_MEDIA_HEIGHT_PIXELS: | ||
7930 | res.Add(new LSL_Integer(me.Height)); | ||
7931 | break; | ||
7932 | |||
7933 | case ScriptBaseClass.PRIM_MEDIA_WHITELIST_ENABLE: | ||
7934 | res.Add(me.EnableWhiteList ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); | ||
7935 | break; | ||
7936 | |||
7937 | case ScriptBaseClass.PRIM_MEDIA_WHITELIST: | ||
7938 | string[] urls = (string[])me.WhiteList.Clone(); | ||
7939 | |||
7940 | for (int j = 0; j < urls.Length; j++) | ||
7941 | urls[j] = Uri.EscapeDataString(urls[j]); | ||
7942 | |||
7943 | res.Add(new LSL_String(string.Join(", ", urls))); | ||
7944 | break; | ||
7945 | |||
7946 | case ScriptBaseClass.PRIM_MEDIA_PERMS_INTERACT: | ||
7947 | res.Add(new LSL_Integer((int)me.InteractPermissions)); | ||
7948 | break; | ||
7949 | |||
7950 | case ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL: | ||
7951 | res.Add(new LSL_Integer((int)me.ControlPermissions)); | ||
7952 | break; | ||
7953 | } | ||
7954 | } | ||
7955 | |||
7956 | return res; | ||
7957 | } | ||
7958 | |||
7959 | public LSL_Integer llSetPrimMediaParams(int face, LSL_List rules) | ||
7960 | { | ||
7961 | m_host.AddScriptLPS(1); | ||
7962 | ScriptSleep(1000); | ||
7963 | |||
7964 | // LSL Spec http://wiki.secondlife.com/wiki/LlSetPrimMediaParams says to fail silently if face is invalid | ||
7965 | // Assuming silently fail means sending back LSL_STATUS_OK. Ideally, need to check this. | ||
7966 | // Don't perform the media check directly | ||
7967 | if (face < 0 || face > m_host.GetNumberOfSides() - 1) | ||
7968 | return ScriptBaseClass.LSL_STATUS_OK; | ||
7969 | |||
7970 | return SetPrimMediaParams(face, rules); | ||
7971 | } | ||
7972 | |||
7973 | private LSL_Integer SetPrimMediaParams(int face, LSL_List rules) | ||
7974 | { | ||
7975 | IMoapModule module = m_ScriptEngine.World.RequestModuleInterface<IMoapModule>(); | ||
7976 | if (null == module) | ||
7977 | throw new Exception("Media on a prim functions not available"); | ||
7978 | |||
7979 | MediaEntry me = module.GetMediaEntry(m_host, face); | ||
7980 | if (null == me) | ||
7981 | me = new MediaEntry(); | ||
7982 | |||
7983 | int i = 0; | ||
7984 | |||
7985 | while (i < rules.Length - 1) | ||
7986 | { | ||
7987 | int code = rules.GetLSLIntegerItem(i++); | ||
7988 | |||
7989 | switch (code) | ||
7990 | { | ||
7991 | case ScriptBaseClass.PRIM_MEDIA_ALT_IMAGE_ENABLE: | ||
7992 | me.EnableAlterntiveImage = (rules.GetLSLIntegerItem(i++) != 0 ? true : false); | ||
7993 | break; | ||
7994 | |||
7995 | case ScriptBaseClass.PRIM_MEDIA_CONTROLS: | ||
7996 | int v = rules.GetLSLIntegerItem(i++); | ||
7997 | if (ScriptBaseClass.PRIM_MEDIA_CONTROLS_STANDARD == v) | ||
7998 | me.Controls = MediaControls.Standard; | ||
7999 | else | ||
8000 | me.Controls = MediaControls.Mini; | ||
8001 | break; | ||
8002 | |||
8003 | case ScriptBaseClass.PRIM_MEDIA_CURRENT_URL: | ||
8004 | me.CurrentURL = rules.GetLSLStringItem(i++); | ||
8005 | break; | ||
8006 | |||
8007 | case ScriptBaseClass.PRIM_MEDIA_HOME_URL: | ||
8008 | me.HomeURL = rules.GetLSLStringItem(i++); | ||
8009 | break; | ||
8010 | |||
8011 | case ScriptBaseClass.PRIM_MEDIA_AUTO_LOOP: | ||
8012 | me.AutoLoop = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); | ||
8013 | break; | ||
8014 | |||
8015 | case ScriptBaseClass.PRIM_MEDIA_AUTO_PLAY: | ||
8016 | me.AutoPlay = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); | ||
8017 | break; | ||
8018 | |||
8019 | case ScriptBaseClass.PRIM_MEDIA_AUTO_SCALE: | ||
8020 | me.AutoScale = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); | ||
8021 | break; | ||
8022 | |||
8023 | case ScriptBaseClass.PRIM_MEDIA_AUTO_ZOOM: | ||
8024 | me.AutoZoom = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); | ||
8025 | break; | ||
8026 | |||
8027 | case ScriptBaseClass.PRIM_MEDIA_FIRST_CLICK_INTERACT: | ||
8028 | me.InteractOnFirstClick = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); | ||
8029 | break; | ||
8030 | |||
8031 | case ScriptBaseClass.PRIM_MEDIA_WIDTH_PIXELS: | ||
8032 | me.Width = (int)rules.GetLSLIntegerItem(i++); | ||
8033 | break; | ||
8034 | |||
8035 | case ScriptBaseClass.PRIM_MEDIA_HEIGHT_PIXELS: | ||
8036 | me.Height = (int)rules.GetLSLIntegerItem(i++); | ||
8037 | break; | ||
8038 | |||
8039 | case ScriptBaseClass.PRIM_MEDIA_WHITELIST_ENABLE: | ||
8040 | me.EnableWhiteList = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); | ||
8041 | break; | ||
8042 | |||
8043 | case ScriptBaseClass.PRIM_MEDIA_WHITELIST: | ||
8044 | string[] rawWhiteListUrls = rules.GetLSLStringItem(i++).ToString().Split(new char[] { ',' }); | ||
8045 | List<string> whiteListUrls = new List<string>(); | ||
8046 | Array.ForEach( | ||
8047 | rawWhiteListUrls, delegate(string rawUrl) { whiteListUrls.Add(rawUrl.Trim()); }); | ||
8048 | me.WhiteList = whiteListUrls.ToArray(); | ||
8049 | break; | ||
8050 | |||
8051 | case ScriptBaseClass.PRIM_MEDIA_PERMS_INTERACT: | ||
8052 | me.InteractPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); | ||
8053 | break; | ||
8054 | |||
8055 | case ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL: | ||
8056 | me.ControlPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); | ||
8057 | break; | ||
8058 | } | ||
8059 | } | ||
8060 | |||
8061 | module.SetMediaEntry(m_host, face, me); | ||
8062 | |||
8063 | return ScriptBaseClass.LSL_STATUS_OK; | ||
8064 | } | ||
8065 | |||
8066 | public LSL_Integer llClearPrimMedia(LSL_Integer face) | ||
8067 | { | ||
8068 | m_host.AddScriptLPS(1); | ||
8069 | ScriptSleep(1000); | ||
8070 | |||
8071 | // LSL Spec http://wiki.secondlife.com/wiki/LlClearPrimMedia says to fail silently if face is invalid | ||
8072 | // Assuming silently fail means sending back LSL_STATUS_OK. Ideally, need to check this. | ||
8073 | // FIXME: Don't perform the media check directly | ||
8074 | if (face < 0 || face > m_host.GetNumberOfSides() - 1) | ||
8075 | return ScriptBaseClass.LSL_STATUS_OK; | ||
8076 | |||
8077 | IMoapModule module = m_ScriptEngine.World.RequestModuleInterface<IMoapModule>(); | ||
8078 | if (null == module) | ||
8079 | throw new Exception("Media on a prim functions not available"); | ||
8080 | |||
8081 | module.ClearMediaEntry(m_host, face); | ||
8082 | |||
8083 | return ScriptBaseClass.LSL_STATUS_OK; | ||
8084 | } | ||
8085 | |||
7851 | // <remarks> | 8086 | // <remarks> |
7852 | // <para> | 8087 | // <para> |
7853 | // The .NET definition of base 64 is: | 8088 | // The .NET definition of base 64 is: |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index cba46a3..561e3b3 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs | |||
@@ -62,6 +62,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
62 | void llBreakLink(int linknum); | 62 | void llBreakLink(int linknum); |
63 | LSL_Integer llCeil(double f); | 63 | LSL_Integer llCeil(double f); |
64 | void llClearCameraParams(); | 64 | void llClearCameraParams(); |
65 | LSL_Integer llClearPrimMedia(LSL_Integer face); | ||
65 | void llCloseRemoteDataChannel(string channel); | 66 | void llCloseRemoteDataChannel(string channel); |
66 | LSL_Float llCloud(LSL_Vector offset); | 67 | LSL_Float llCloud(LSL_Vector offset); |
67 | void llCollisionFilter(string name, string id, int accept); | 68 | void llCollisionFilter(string name, string id, int accept); |
@@ -162,6 +163,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
162 | LSL_List llGetParcelPrimOwners(LSL_Vector pos); | 163 | LSL_List llGetParcelPrimOwners(LSL_Vector pos); |
163 | LSL_Integer llGetPermissions(); | 164 | LSL_Integer llGetPermissions(); |
164 | LSL_Key llGetPermissionsKey(); | 165 | LSL_Key llGetPermissionsKey(); |
166 | LSL_List llGetPrimMediaParams(int face, LSL_List rules); | ||
165 | LSL_Vector llGetPos(); | 167 | LSL_Vector llGetPos(); |
166 | LSL_List llGetPrimitiveParams(LSL_List rules); | 168 | LSL_List llGetPrimitiveParams(LSL_List rules); |
167 | LSL_Integer llGetRegionAgentCount(); | 169 | LSL_Integer llGetRegionAgentCount(); |
@@ -332,6 +334,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
332 | void llSetParcelMusicURL(string url); | 334 | void llSetParcelMusicURL(string url); |
333 | void llSetPayPrice(int price, LSL_List quick_pay_buttons); | 335 | void llSetPayPrice(int price, LSL_List quick_pay_buttons); |
334 | void llSetPos(LSL_Vector pos); | 336 | void llSetPos(LSL_Vector pos); |
337 | LSL_Integer llSetPrimMediaParams(int face, LSL_List rules); | ||
335 | void llSetPrimitiveParams(LSL_List rules); | 338 | void llSetPrimitiveParams(LSL_List rules); |
336 | void llSetLinkPrimitiveParamsFast(int linknum, LSL_List rules); | 339 | void llSetLinkPrimitiveParamsFast(int linknum, LSL_List rules); |
337 | void llSetPrimURL(string url); | 340 | void llSetPrimURL(string url); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 69f48c9..5da6bb9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -277,6 +277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
277 | public const int CHANGED_TELEPORT = 512; | 277 | public const int CHANGED_TELEPORT = 512; |
278 | public const int CHANGED_REGION_RESTART = 1024; | 278 | public const int CHANGED_REGION_RESTART = 1024; |
279 | public const int CHANGED_REGION_START = 1024; //LL Changed the constant from CHANGED_REGION_RESTART | 279 | public const int CHANGED_REGION_START = 1024; //LL Changed the constant from CHANGED_REGION_RESTART |
280 | public const int CHANGED_MEDIA = 2048; | ||
280 | public const int CHANGED_ANIMATION = 16384; | 281 | public const int CHANGED_ANIMATION = 16384; |
281 | public const int TYPE_INVALID = 0; | 282 | public const int TYPE_INVALID = 0; |
282 | public const int TYPE_INTEGER = 1; | 283 | public const int TYPE_INTEGER = 1; |
@@ -518,6 +519,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
518 | public const int TOUCH_INVALID_FACE = -1; | 519 | public const int TOUCH_INVALID_FACE = -1; |
519 | public static readonly vector TOUCH_INVALID_TEXCOORD = new vector(-1.0, -1.0, 0.0); | 520 | public static readonly vector TOUCH_INVALID_TEXCOORD = new vector(-1.0, -1.0, 0.0); |
520 | public static readonly vector TOUCH_INVALID_VECTOR = ZERO_VECTOR; | 521 | public static readonly vector TOUCH_INVALID_VECTOR = ZERO_VECTOR; |
522 | |||
523 | // constants for llGetPrimMediaParams/llSetPrimMediaParams | ||
524 | public const int PRIM_MEDIA_ALT_IMAGE_ENABLE = 0; | ||
525 | public const int PRIM_MEDIA_CONTROLS = 1; | ||
526 | public const int PRIM_MEDIA_CURRENT_URL = 2; | ||
527 | public const int PRIM_MEDIA_HOME_URL = 3; | ||
528 | public const int PRIM_MEDIA_AUTO_LOOP = 4; | ||
529 | public const int PRIM_MEDIA_AUTO_PLAY = 5; | ||
530 | public const int PRIM_MEDIA_AUTO_SCALE = 6; | ||
531 | public const int PRIM_MEDIA_AUTO_ZOOM = 7; | ||
532 | public const int PRIM_MEDIA_FIRST_CLICK_INTERACT = 8; | ||
533 | public const int PRIM_MEDIA_WIDTH_PIXELS = 9; | ||
534 | public const int PRIM_MEDIA_HEIGHT_PIXELS = 10; | ||
535 | public const int PRIM_MEDIA_WHITELIST_ENABLE = 11; | ||
536 | public const int PRIM_MEDIA_WHITELIST = 12; | ||
537 | public const int PRIM_MEDIA_PERMS_INTERACT = 13; | ||
538 | public const int PRIM_MEDIA_PERMS_CONTROL = 14; | ||
539 | |||
540 | public const int PRIM_MEDIA_CONTROLS_STANDARD = 0; | ||
541 | public const int PRIM_MEDIA_CONTROLS_MINI = 1; | ||
542 | |||
543 | public const int PRIM_MEDIA_PERM_NONE = 0; | ||
544 | public const int PRIM_MEDIA_PERM_OWNER = 1; | ||
545 | public const int PRIM_MEDIA_PERM_GROUP = 2; | ||
546 | public const int PRIM_MEDIA_PERM_ANYONE = 4; | ||
547 | |||
548 | // extra constants for llSetPrimMediaParams | ||
549 | public static readonly LSLInteger LSL_STATUS_OK = new LSLInteger(0); | ||
550 | public static readonly LSLInteger LSL_STATUS_MALFORMED_PARAMS = new LSLInteger(1000); | ||
551 | public static readonly LSLInteger LSL_STATUS_TYPE_MISMATCH = new LSLInteger(1001); | ||
552 | public static readonly LSLInteger LSL_STATUS_BOUNDS_ERROR = new LSLInteger(1002); | ||
553 | public static readonly LSLInteger LSL_STATUS_NOT_FOUND = new LSLInteger(1003); | ||
554 | public static readonly LSLInteger LSL_STATUS_NOT_SUPPORTED = new LSLInteger(1004); | ||
555 | public static readonly LSLInteger LSL_STATUS_INTERNAL_ERROR = new LSLInteger(1999); | ||
556 | public static readonly LSLInteger LSL_STATUS_WHITELIST_FAILED = new LSLInteger(2001); | ||
521 | 557 | ||
522 | // Constants for default textures | 558 | // Constants for default textures |
523 | public const string TEXTURE_BLANK = "5748decc-f629-461c-9a36-a35a221fe21f"; | 559 | public const string TEXTURE_BLANK = "5748decc-f629-461c-9a36-a35a221fe21f"; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 3339995..451163f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs | |||
@@ -1832,5 +1832,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
1832 | { | 1832 | { |
1833 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); | 1833 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); |
1834 | } | 1834 | } |
1835 | |||
1836 | public LSL_List llGetPrimMediaParams(int face, LSL_List rules) | ||
1837 | { | ||
1838 | return m_LSL_Functions.llGetPrimMediaParams(face, rules); | ||
1839 | } | ||
1840 | |||
1841 | public LSL_Integer llSetPrimMediaParams(int face, LSL_List rules) | ||
1842 | { | ||
1843 | return m_LSL_Functions.llSetPrimMediaParams(face, rules); | ||
1844 | } | ||
1845 | |||
1846 | public LSL_Integer llClearPrimMedia(LSL_Integer face) | ||
1847 | { | ||
1848 | return m_LSL_Functions.llClearPrimMedia(face); | ||
1849 | } | ||
1835 | } | 1850 | } |
1836 | } | 1851 | } |