diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
5 files changed, 69 insertions, 33 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 9f6ea35..0c99d8c 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -38,10 +38,11 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
38 | { | 38 | { |
39 | public enum StateSource | 39 | public enum StateSource |
40 | { | 40 | { |
41 | NewRez = 0, | 41 | RegionStart = 0, |
42 | PrimCrossing = 1, | 42 | NewRez = 1, |
43 | ScriptedRez = 2, | 43 | PrimCrossing = 2, |
44 | AttachedRez = 3 | 44 | ScriptedRez = 3, |
45 | AttachedRez = 4 | ||
45 | } | 46 | } |
46 | 47 | ||
47 | public interface IScriptWorkItem | 48 | public interface IScriptWorkItem |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 8903c3b..139b4f1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -68,6 +68,14 @@ using System.Reflection; | |||
68 | 68 | ||
69 | namespace OpenSim.Region.ScriptEngine.Shared.Api | 69 | namespace OpenSim.Region.ScriptEngine.Shared.Api |
70 | { | 70 | { |
71 | // MUST be a ref type | ||
72 | public class UserInfoCacheEntry | ||
73 | { | ||
74 | public int time; | ||
75 | public UserAccount account; | ||
76 | public PresenceInfo pinfo; | ||
77 | } | ||
78 | |||
71 | /// <summary> | 79 | /// <summary> |
72 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. | 80 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. |
73 | /// </summary> | 81 | /// </summary> |
@@ -92,6 +100,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
92 | protected int m_scriptConsoleChannel = 0; | 100 | protected int m_scriptConsoleChannel = 0; |
93 | protected bool m_scriptConsoleChannelEnabled = false; | 101 | protected bool m_scriptConsoleChannelEnabled = false; |
94 | protected IUrlModule m_UrlModule = null; | 102 | protected IUrlModule m_UrlModule = null; |
103 | protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = | ||
104 | new Dictionary<UUID, UserInfoCacheEntry>(); | ||
95 | 105 | ||
96 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 106 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) |
97 | { | 107 | { |
@@ -1934,13 +1944,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1934 | } | 1944 | } |
1935 | else | 1945 | else |
1936 | { | 1946 | { |
1937 | if (llVecDist(new LSL_Vector(0,0,0), targetPos) <= 10.0f) | 1947 | LSL_Vector rel_vec = SetPosAdjust(currentPos, targetPos); |
1938 | { | 1948 | part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z); |
1939 | part.OffsetPosition = new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z); | 1949 | SceneObjectGroup parent = part.ParentGroup; |
1940 | SceneObjectGroup parent = part.ParentGroup; | 1950 | parent.HasGroupChanged = true; |
1941 | parent.HasGroupChanged = true; | 1951 | parent.ScheduleGroupForTerseUpdate(); |
1942 | parent.ScheduleGroupForTerseUpdate(); | ||
1943 | } | ||
1944 | } | 1952 | } |
1945 | } | 1953 | } |
1946 | 1954 | ||
@@ -3250,17 +3258,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3250 | public void llPointAt(LSL_Vector pos) | 3258 | public void llPointAt(LSL_Vector pos) |
3251 | { | 3259 | { |
3252 | m_host.AddScriptLPS(1); | 3260 | m_host.AddScriptLPS(1); |
3253 | ScenePresence Owner = World.GetScenePresence(m_host.UUID); | ||
3254 | LSL_Rotation rot = llEuler2Rot(pos); | ||
3255 | Owner.PreviousRotation = Owner.Rotation; | ||
3256 | Owner.Rotation = (new Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s)); | ||
3257 | } | 3261 | } |
3258 | 3262 | ||
3259 | public void llStopPointAt() | 3263 | public void llStopPointAt() |
3260 | { | 3264 | { |
3261 | m_host.AddScriptLPS(1); | 3265 | m_host.AddScriptLPS(1); |
3262 | ScenePresence Owner = m_host.ParentGroup.Scene.GetScenePresence(m_host.OwnerID); | ||
3263 | Owner.Rotation = Owner.PreviousRotation; | ||
3264 | } | 3266 | } |
3265 | 3267 | ||
3266 | public void llTargetOmega(LSL_Vector axis, double spinrate, double gain) | 3268 | public void llTargetOmega(LSL_Vector axis, double spinrate, double gain) |
@@ -3916,24 +3918,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3916 | m_host.AddScriptLPS(1); | 3918 | m_host.AddScriptLPS(1); |
3917 | 3919 | ||
3918 | UUID uuid = (UUID)id; | 3920 | UUID uuid = (UUID)id; |
3921 | PresenceInfo pinfo = null; | ||
3922 | UserAccount account; | ||
3919 | 3923 | ||
3920 | UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid); | 3924 | UserInfoCacheEntry ce; |
3925 | if (!m_userInfoCache.TryGetValue(uuid, out ce)) | ||
3926 | { | ||
3927 | account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid); | ||
3928 | if (account == null) | ||
3929 | { | ||
3930 | m_userInfoCache[uuid] = null; // Cache negative | ||
3931 | return UUID.Zero.ToString(); | ||
3932 | } | ||
3921 | 3933 | ||
3922 | PresenceInfo pinfo = null; | ||
3923 | PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); | ||
3924 | if (pinfos != null && pinfos.Length > 0) | ||
3925 | pinfo = pinfos[0]; | ||
3926 | 3934 | ||
3927 | if (pinfo == null) | 3935 | PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); |
3928 | return UUID.Zero.ToString(); | 3936 | if (pinfos != null && pinfos.Length > 0) |
3937 | pinfo = pinfos[0]; | ||
3938 | |||
3939 | ce = new UserInfoCacheEntry(); | ||
3940 | ce.time = Util.EnvironmentTickCount(); | ||
3941 | ce.account = account; | ||
3942 | ce.pinfo = pinfo; | ||
3943 | } | ||
3944 | else | ||
3945 | { | ||
3946 | if (ce == null) | ||
3947 | return UUID.Zero.ToString(); | ||
3948 | |||
3949 | account = ce.account; | ||
3950 | pinfo = ce.pinfo; | ||
3951 | } | ||
3952 | |||
3953 | if (Util.EnvironmentTickCount() < ce.time || (Util.EnvironmentTickCount() - ce.time) >= 20000) | ||
3954 | { | ||
3955 | PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); | ||
3956 | if (pinfos != null && pinfos.Length > 0) | ||
3957 | pinfo = pinfos[0]; | ||
3958 | else | ||
3959 | pinfo = null; | ||
3960 | |||
3961 | ce.time = Util.EnvironmentTickCount(); | ||
3962 | ce.pinfo = pinfo; | ||
3963 | } | ||
3929 | 3964 | ||
3930 | string reply = String.Empty; | 3965 | string reply = String.Empty; |
3931 | 3966 | ||
3932 | switch (data) | 3967 | switch (data) |
3933 | { | 3968 | { |
3934 | case 1: // DATA_ONLINE (0|1) | 3969 | case 1: // DATA_ONLINE (0|1) |
3935 | // TODO: implement fetching of this information | 3970 | if (pinfo != null && pinfo.RegionID != UUID.Zero) |
3936 | if (pinfo != null) | ||
3937 | reply = "1"; | 3971 | reply = "1"; |
3938 | else | 3972 | else |
3939 | reply = "0"; | 3973 | reply = "0"; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index fe71ed5..5ae6439 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 06f9426..5da6bb9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -273,9 +273,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
273 | public const int CHANGED_LINK = 32; | 273 | public const int CHANGED_LINK = 32; |
274 | public const int CHANGED_ALLOWED_DROP = 64; | 274 | public const int CHANGED_ALLOWED_DROP = 64; |
275 | public const int CHANGED_OWNER = 128; | 275 | public const int CHANGED_OWNER = 128; |
276 | public const int CHANGED_REGION_RESTART = 256; | 276 | public const int CHANGED_REGION = 256; |
277 | public const int CHANGED_REGION = 512; | 277 | public const int CHANGED_TELEPORT = 512; |
278 | public const int CHANGED_TELEPORT = 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_MEDIA = 2048; | 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; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 3dd381d..6663aa5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -388,17 +388,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
388 | PostEvent(new EventParams("attach", | 388 | PostEvent(new EventParams("attach", |
389 | new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); | 389 | new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); |
390 | } | 390 | } |
391 | else if (m_stateSource == StateSource.NewRez) | 391 | else if (m_stateSource == StateSource.RegionStart) |
392 | { | 392 | { |
393 | // m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script"); | 393 | // m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script"); |
394 | PostEvent(new EventParams("changed", | 394 | PostEvent(new EventParams("changed", |
395 | new Object[] {new LSL_Types.LSLInteger(256)}, new DetectParams[0])); | 395 | new Object[] { (int)Changed.REGION_RESTART }, new DetectParams[0])); |
396 | } | 396 | } |
397 | else if (m_stateSource == StateSource.PrimCrossing) | 397 | else if (m_stateSource == StateSource.PrimCrossing) |
398 | { | 398 | { |
399 | // CHANGED_REGION | 399 | // CHANGED_REGION |
400 | PostEvent(new EventParams("changed", | 400 | PostEvent(new EventParams("changed", |
401 | new Object[] {new LSL_Types.LSLInteger(512)}, new DetectParams[0])); | 401 | new Object[] { (int)Changed.REGION }, new DetectParams[0])); |
402 | } | 402 | } |
403 | } | 403 | } |
404 | else | 404 | else |