diff options
4 files changed, 136 insertions, 51 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index d41df3d..fa72410 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -2734,32 +2734,57 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2734 | packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1]; | 2734 | packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1]; |
2735 | packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock(); | 2735 | packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock(); |
2736 | 2736 | ||
2737 | packet.QueryReplies = | ||
2738 | new DirPlacesReplyPacket.QueryRepliesBlock[data.Length]; | ||
2739 | |||
2740 | packet.StatusData = new DirPlacesReplyPacket.StatusDataBlock[ | ||
2741 | data.Length]; | ||
2742 | |||
2743 | packet.AgentData.AgentID = AgentId; | 2737 | packet.AgentData.AgentID = AgentId; |
2744 | 2738 | ||
2745 | packet.QueryData[0].QueryID = queryID; | 2739 | packet.QueryData[0].QueryID = queryID; |
2746 | 2740 | ||
2741 | DirPlacesReplyPacket.QueryRepliesBlock[] replies = | ||
2742 | new DirPlacesReplyPacket.QueryRepliesBlock[0]; | ||
2743 | DirPlacesReplyPacket.StatusDataBlock[] status = | ||
2744 | new DirPlacesReplyPacket.StatusDataBlock[0]; | ||
2745 | |||
2747 | int i = 0; | 2746 | int i = 0; |
2748 | foreach (DirPlacesReplyData d in data) | 2747 | foreach (DirPlacesReplyData d in data) |
2749 | { | 2748 | { |
2750 | packet.QueryReplies[i] = | 2749 | int idx = replies.Length; |
2751 | new DirPlacesReplyPacket.QueryRepliesBlock(); | 2750 | Array.Resize(ref replies, idx + 1); |
2752 | packet.StatusData[i] = new DirPlacesReplyPacket.StatusDataBlock(); | 2751 | Array.Resize(ref status, idx + 1); |
2753 | packet.QueryReplies[i].ParcelID = d.parcelID; | 2752 | |
2754 | packet.QueryReplies[i].Name = Utils.StringToBytes(d.name); | 2753 | replies[idx] = new DirPlacesReplyPacket.QueryRepliesBlock(); |
2755 | packet.QueryReplies[i].ForSale = d.forSale; | 2754 | status[idx] = new DirPlacesReplyPacket.StatusDataBlock(); |
2756 | packet.QueryReplies[i].Auction = d.auction; | 2755 | replies[idx].ParcelID = d.parcelID; |
2757 | packet.QueryReplies[i].Dwell = d.dwell; | 2756 | replies[idx].Name = Utils.StringToBytes(d.name); |
2758 | packet.StatusData[i].Status = d.Status; | 2757 | replies[idx].ForSale = d.forSale; |
2759 | i++; | 2758 | replies[idx].Auction = d.auction; |
2759 | replies[idx].Dwell = d.dwell; | ||
2760 | status[idx].Status = d.Status; | ||
2761 | |||
2762 | packet.QueryReplies = replies; | ||
2763 | packet.StatusData = status; | ||
2764 | |||
2765 | if (packet.Length >= 1000) | ||
2766 | { | ||
2767 | OutPacket(packet, ThrottleOutPacketType.Task); | ||
2768 | |||
2769 | packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply); | ||
2770 | |||
2771 | packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock(); | ||
2772 | |||
2773 | packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1]; | ||
2774 | packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock(); | ||
2775 | |||
2776 | packet.AgentData.AgentID = AgentId; | ||
2777 | |||
2778 | packet.QueryData[0].QueryID = queryID; | ||
2779 | |||
2780 | replies = new DirPlacesReplyPacket.QueryRepliesBlock[0]; | ||
2781 | status = new DirPlacesReplyPacket.StatusDataBlock[0]; | ||
2782 | |||
2783 | } | ||
2760 | } | 2784 | } |
2761 | 2785 | ||
2762 | OutPacket(packet, ThrottleOutPacketType.Task); | 2786 | if (replies.Length > 0) |
2787 | OutPacket(packet, ThrottleOutPacketType.Task); | ||
2763 | } | 2788 | } |
2764 | 2789 | ||
2765 | public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data) | 2790 | public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data) |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 32211c4..957c4e8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -658,6 +658,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
658 | m_persistAfter *= 10000000; | 658 | m_persistAfter *= 10000000; |
659 | 659 | ||
660 | m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); | 660 | m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); |
661 | m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine); | ||
661 | 662 | ||
662 | IConfig packetConfig = m_config.Configs["PacketPool"]; | 663 | IConfig packetConfig = m_config.Configs["PacketPool"]; |
663 | if (packetConfig != null) | 664 | if (packetConfig != null) |
@@ -692,9 +693,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
692 | } | 693 | } |
693 | } | 694 | } |
694 | } | 695 | } |
695 | catch | 696 | catch (Exception e) |
696 | { | 697 | { |
697 | m_log.Warn("[SCENE]: Failed to load StartupConfig"); | 698 | m_log.Error("[SCENE]: Failed to load StartupConfig: " + e.ToString()); |
698 | } | 699 | } |
699 | 700 | ||
700 | #endregion Region Config | 701 | #endregion Region Config |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index abb4de6..a7003c4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs | |||
@@ -422,6 +422,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
422 | 422 | ||
423 | public void ResumeScripts() | 423 | public void ResumeScripts() |
424 | { | 424 | { |
425 | if (m_scene.RegionInfo.RegionSettings.DisableScripts) | ||
426 | return; | ||
427 | |||
425 | foreach (SceneObjectPart part in m_parts.Values) | 428 | foreach (SceneObjectPart part in m_parts.Values) |
426 | { | 429 | { |
427 | part.Inventory.ResumeScripts(); | 430 | part.Inventory.ResumeScripts(); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b4134a4..94b9d40 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -5122,7 +5122,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5122 | else if (src.Data[index] is LSL_Float) | 5122 | else if (src.Data[index] is LSL_Float) |
5123 | return Convert.ToDouble(((LSL_Float) src.Data[index]).value); | 5123 | return Convert.ToDouble(((LSL_Float) src.Data[index]).value); |
5124 | else if (src.Data[index] is LSL_String) | 5124 | else if (src.Data[index] is LSL_String) |
5125 | return Convert.ToDouble(Regex.Replace(((LSL_String)src.Data[index]).m_string, "[^0-9]", "")); | 5125 | { |
5126 | string str = ((LSL_String) src.Data[index]).m_string; | ||
5127 | Match m = Regex.Match(str, "^\\s*(-?\\+?[,0-9]+\\.?[0-9]*)"); | ||
5128 | if (m != Match.Empty) | ||
5129 | { | ||
5130 | str = m.Value; | ||
5131 | double d = 0.0; | ||
5132 | if (!Double.TryParse(str, out d)) | ||
5133 | return 0.0; | ||
5134 | |||
5135 | return d; | ||
5136 | } | ||
5137 | return 0.0; | ||
5138 | } | ||
5126 | return Convert.ToDouble(src.Data[index]); | 5139 | return Convert.ToDouble(src.Data[index]); |
5127 | } | 5140 | } |
5128 | catch (FormatException) | 5141 | catch (FormatException) |
@@ -7823,55 +7836,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7823 | m_host.AddScriptLPS(1); | 7836 | m_host.AddScriptLPS(1); |
7824 | UUID objID = UUID.Zero; | 7837 | UUID objID = UUID.Zero; |
7825 | LSL_List result = new LSL_List(); | 7838 | LSL_List result = new LSL_List(); |
7839 | |||
7840 | // If the ID is not valid, return null result | ||
7826 | if (!UUID.TryParse(obj, out objID)) | 7841 | if (!UUID.TryParse(obj, out objID)) |
7827 | { | 7842 | { |
7828 | result.Add(new LSL_Vector()); | 7843 | result.Add(new LSL_Vector()); |
7829 | result.Add(new LSL_Vector()); | 7844 | result.Add(new LSL_Vector()); |
7830 | return result; | 7845 | return result; |
7831 | } | 7846 | } |
7847 | |||
7848 | // Check if this is an attached prim. If so, replace | ||
7849 | // the UUID with the avatar UUID and report it's bounding box | ||
7850 | SceneObjectPart part = World.GetSceneObjectPart(objID); | ||
7851 | if (part != null && part.ParentGroup.IsAttachment) | ||
7852 | objID = part.ParentGroup.RootPart.AttachedAvatar; | ||
7853 | |||
7854 | // Find out if this is an avatar ID. If so, return it's box | ||
7832 | ScenePresence presence = World.GetScenePresence(objID); | 7855 | ScenePresence presence = World.GetScenePresence(objID); |
7833 | if (presence != null) | 7856 | if (presence != null) |
7834 | { | 7857 | { |
7835 | if (presence.ParentID == 0) // not sat on an object | 7858 | // As per LSL Wiki, there is no difference between sitting |
7859 | // and standing avatar since server 1.36 | ||
7860 | LSL_Vector lower; | ||
7861 | LSL_Vector upper; | ||
7862 | if (presence.Animator.Animations.DefaultAnimation.AnimID | ||
7863 | == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) | ||
7836 | { | 7864 | { |
7837 | LSL_Vector lower; | 7865 | // This is for ground sitting avatars |
7838 | LSL_Vector upper; | 7866 | float height = presence.Appearance.AvatarHeight / 2.66666667f; |
7839 | if (presence.Animator.Animations.DefaultAnimation.AnimID | 7867 | lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f); |
7840 | == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) | 7868 | upper = new LSL_Vector(0.3375f, 0.45f, 0.0f); |
7841 | { | ||
7842 | // This is for ground sitting avatars | ||
7843 | float height = presence.Appearance.AvatarHeight / 2.66666667f; | ||
7844 | lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f); | ||
7845 | upper = new LSL_Vector(0.3375f, 0.45f, 0.0f); | ||
7846 | } | ||
7847 | else | ||
7848 | { | ||
7849 | // This is for standing/flying avatars | ||
7850 | float height = presence.Appearance.AvatarHeight / 2.0f; | ||
7851 | lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f); | ||
7852 | upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f); | ||
7853 | } | ||
7854 | result.Add(lower); | ||
7855 | result.Add(upper); | ||
7856 | return result; | ||
7857 | } | 7869 | } |
7858 | else | 7870 | else |
7859 | { | 7871 | { |
7860 | // sitting on an object so we need the bounding box of that | 7872 | // This is for standing/flying avatars |
7861 | // which should include the avatar so set the UUID to the | 7873 | float height = presence.Appearance.AvatarHeight / 2.0f; |
7862 | // UUID of the object the avatar is sat on and allow it to fall through | 7874 | lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f); |
7863 | // to processing an object | 7875 | upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f); |
7864 | SceneObjectPart p = World.GetSceneObjectPart(presence.ParentID); | ||
7865 | objID = p.UUID; | ||
7866 | } | 7876 | } |
7877 | |||
7878 | // Adjust to the documented error offsets (see LSL Wiki) | ||
7879 | lower += new LSL_Vector(0.05f, 0.05f, 0.05f); | ||
7880 | upper -= new LSL_Vector(0.05f, 0.05f, 0.05f); | ||
7881 | |||
7882 | if (lower.x > upper.x) | ||
7883 | lower.x = upper.x; | ||
7884 | if (lower.y > upper.y) | ||
7885 | lower.y = upper.y; | ||
7886 | if (lower.z > upper.z) | ||
7887 | lower.z = upper.z; | ||
7888 | |||
7889 | result.Add(lower); | ||
7890 | result.Add(upper); | ||
7891 | return result; | ||
7867 | } | 7892 | } |
7868 | SceneObjectPart part = World.GetSceneObjectPart(objID); | 7893 | |
7894 | part = World.GetSceneObjectPart(objID); | ||
7869 | // Currently only works for single prims without a sitting avatar | 7895 | // Currently only works for single prims without a sitting avatar |
7870 | if (part != null) | 7896 | if (part != null) |
7871 | { | 7897 | { |
7872 | Vector3 halfSize = part.Scale / 2.0f; | 7898 | float minX; |
7873 | LSL_Vector lower = new LSL_Vector(halfSize.X * -1.0f, halfSize.Y * -1.0f, halfSize.Z * -1.0f); | 7899 | float maxX; |
7874 | LSL_Vector upper = new LSL_Vector(halfSize.X, halfSize.Y, halfSize.Z); | 7900 | float minY; |
7901 | float maxY; | ||
7902 | float minZ; | ||
7903 | float maxZ; | ||
7904 | |||
7905 | // This BBox is in sim coordinates, with the offset being | ||
7906 | // a contained point. | ||
7907 | Vector3[] offsets = World.GetCombinedBoundingBox(new List<SceneObjectGroup> { part.ParentGroup }, | ||
7908 | out minX, out maxX, out minY, out maxY, out minZ, out maxZ); | ||
7909 | |||
7910 | minX -= offsets[0].X; | ||
7911 | maxX -= offsets[0].X; | ||
7912 | minY -= offsets[0].Y; | ||
7913 | maxY -= offsets[0].Y; | ||
7914 | minZ -= offsets[0].Z; | ||
7915 | maxZ -= offsets[0].Z; | ||
7916 | |||
7917 | LSL_Vector lower; | ||
7918 | LSL_Vector upper; | ||
7919 | |||
7920 | // Adjust to the documented error offsets (see LSL Wiki) | ||
7921 | lower = new LSL_Vector(minX + 0.05f, minY + 0.05f, minZ + 0.05f); | ||
7922 | upper = new LSL_Vector(maxX - 0.05f, maxY - 0.05f, maxZ - 0.05f); | ||
7923 | |||
7924 | if (lower.x > upper.x) | ||
7925 | lower.x = upper.x; | ||
7926 | if (lower.y > upper.y) | ||
7927 | lower.y = upper.y; | ||
7928 | if (lower.z > upper.z) | ||
7929 | lower.z = upper.z; | ||
7930 | |||
7875 | result.Add(lower); | 7931 | result.Add(lower); |
7876 | result.Add(upper); | 7932 | result.Add(upper); |
7877 | return result; | 7933 | return result; |