diff options
Diffstat (limited to '')
3 files changed, 137 insertions, 78 deletions
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index 7370156..b1234fe 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs | |||
@@ -128,104 +128,104 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
128 | m_Clients.Add(remoteClient.AgentId); | 128 | m_Clients.Add(remoteClient.AgentId); |
129 | } | 129 | } |
130 | 130 | ||
131 | try | 131 | OnMapNameRequest(remoteClient, mapName, flags); |
132 | { | ||
133 | OnMapNameRequest(remoteClient, mapName, flags); | ||
134 | } | ||
135 | finally | ||
136 | { | ||
137 | lock (m_Clients) | ||
138 | m_Clients.Remove(remoteClient.AgentId); | ||
139 | } | ||
140 | } | 132 | } |
141 | 133 | ||
142 | private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) | 134 | private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags) |
143 | { | 135 | { |
144 | Util.FireAndForget(x => | 136 | Util.FireAndForget(x => |
145 | { | 137 | { |
146 | List<MapBlockData> blocks = new List<MapBlockData>(); | 138 | try |
147 | if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4)) | ||
148 | { | 139 | { |
149 | // final block, closing the search result | 140 | List<MapBlockData> blocks = new List<MapBlockData>(); |
150 | AddFinalBlock(blocks,mapName); | 141 | if (mapName.Length < 3 || (mapName.EndsWith("#") && mapName.Length < 4)) |
142 | { | ||
143 | // final block, closing the search result | ||
144 | AddFinalBlock(blocks,mapName); | ||
151 | 145 | ||
152 | // flags are agent flags sent from the viewer. | 146 | // flags are agent flags sent from the viewer. |
153 | // they have different values depending on different viewers, apparently | 147 | // they have different values depending on different viewers, apparently |
154 | remoteClient.SendMapBlock(blocks, flags); | 148 | remoteClient.SendMapBlock(blocks, flags); |
155 | remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); | 149 | remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); |
156 | return; | 150 | return; |
157 | } | 151 | } |
158 | 152 | ||
159 | //m_log.DebugFormat("MAP NAME=({0})", mapName); | 153 | //m_log.DebugFormat("MAP NAME=({0})", mapName); |
160 | 154 | ||
161 | // Hack to get around the fact that ll V3 now drops the port from the | 155 | // Hack to get around the fact that ll V3 now drops the port from the |
162 | // map name. See https://jira.secondlife.com/browse/VWR-28570 | 156 | // map name. See https://jira.secondlife.com/browse/VWR-28570 |
163 | // | 157 | // |
164 | // Caller, use this magic form instead: | 158 | // Caller, use this magic form instead: |
165 | // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 | 159 | // secondlife://http|!!mygrid.com|8002|Region+Name/128/128 |
166 | // or url encode if possible. | 160 | // or url encode if possible. |
167 | // the hacks we do with this viewer... | 161 | // the hacks we do with this viewer... |
168 | // | 162 | // |
169 | bool needOriginalName = false; | 163 | bool needOriginalName = false; |
170 | string mapNameOrig = mapName; | 164 | string mapNameOrig = mapName; |
171 | if (mapName.Contains("|")) | 165 | if (mapName.Contains("|")) |
172 | { | 166 | { |
173 | mapName = mapName.Replace('|', ':'); | 167 | mapName = mapName.Replace('|', ':'); |
174 | needOriginalName = true; | 168 | needOriginalName = true; |
175 | } | 169 | } |
176 | if (mapName.Contains("+")) | 170 | if (mapName.Contains("+")) |
177 | { | 171 | { |
178 | mapName = mapName.Replace('+', ' '); | 172 | mapName = mapName.Replace('+', ' '); |
179 | needOriginalName = true; | 173 | needOriginalName = true; |
180 | } | 174 | } |
181 | if (mapName.Contains("!")) | 175 | if (mapName.Contains("!")) |
182 | { | 176 | { |
183 | mapName = mapName.Replace('!', '/'); | 177 | mapName = mapName.Replace('!', '/'); |
184 | needOriginalName = true; | 178 | needOriginalName = true; |
185 | } | 179 | } |
186 | if (mapName.Contains(".")) | 180 | if (mapName.Contains(".")) |
187 | needOriginalName = true; | 181 | needOriginalName = true; |
188 | 182 | ||
189 | // try to fetch from GridServer | 183 | // try to fetch from GridServer |
190 | List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); | 184 | List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20); |
191 | // if (regionInfos.Count == 0) | 185 | // if (regionInfos.Count == 0) |
192 | // remoteClient.SendAlertMessage("Hyperlink could not be established."); | 186 | // remoteClient.SendAlertMessage("Hyperlink could not be established."); |
193 | 187 | ||
194 | //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); | 188 | //m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); |
195 | 189 | ||
196 | MapBlockData data; | 190 | MapBlockData data; |
197 | if (regionInfos.Count > 0) | 191 | if (regionInfos.Count > 0) |
198 | { | ||
199 | foreach (GridRegion info in regionInfos) | ||
200 | { | 192 | { |
201 | data = new MapBlockData(); | 193 | foreach (GridRegion info in regionInfos) |
202 | data.Agents = 0; | 194 | { |
203 | data.Access = info.Access; | 195 | data = new MapBlockData(); |
204 | MapBlockData block = new MapBlockData(); | 196 | data.Agents = 0; |
205 | WorldMap.MapBlockFromGridRegion(block, info, flags); | 197 | data.Access = info.Access; |
198 | MapBlockData block = new MapBlockData(); | ||
199 | WorldMap.MapBlockFromGridRegion(block, info, flags); | ||
206 | 200 | ||
207 | if (flags == 2 && regionInfos.Count == 1 && needOriginalName) | 201 | if (flags == 2 && regionInfos.Count == 1 && needOriginalName) |
208 | block.Name = mapNameOrig; | 202 | block.Name = mapNameOrig; |
209 | blocks.Add(block); | 203 | blocks.Add(block); |
204 | } | ||
210 | } | 205 | } |
211 | } | ||
212 | 206 | ||
213 | // final block, closing the search result | 207 | // final block, closing the search result |
214 | AddFinalBlock(blocks,mapNameOrig); | 208 | AddFinalBlock(blocks,mapNameOrig); |
215 | 209 | ||
216 | // flags are agent flags sent from the viewer. | 210 | // flags are agent flags sent from the viewer. |
217 | // they have different values depending on different viewers, apparently | 211 | // they have different values depending on different viewers, apparently |
218 | remoteClient.SendMapBlock(blocks, flags); | 212 | remoteClient.SendMapBlock(blocks, flags); |
219 | 213 | ||
220 | // send extra user messages for V3 | 214 | // send extra user messages for V3 |
221 | // because the UI is very confusing | 215 | // because the UI is very confusing |
222 | // while we don't fix the hard-coded urls | 216 | // while we don't fix the hard-coded urls |
223 | if (flags == 2) | 217 | if (flags == 2) |
218 | { | ||
219 | if (regionInfos.Count == 0) | ||
220 | remoteClient.SendAgentAlertMessage("No regions found with that name.", true); | ||
221 | // else if (regionInfos.Count == 1) | ||
222 | // remoteClient.SendAgentAlertMessage("Region found!", false); | ||
223 | } | ||
224 | } | ||
225 | finally | ||
224 | { | 226 | { |
225 | if (regionInfos.Count == 0) | 227 | lock (m_Clients) |
226 | remoteClient.SendAgentAlertMessage("No regions found with that name.", true); | 228 | m_Clients.Remove(remoteClient.AgentId); |
227 | // else if (regionInfos.Count == 1) | ||
228 | // remoteClient.SendAgentAlertMessage("Region found!", false); | ||
229 | } | 229 | } |
230 | }); | 230 | }); |
231 | } | 231 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 849d02d..80bb461 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -13758,6 +13758,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
13758 | case ScriptBaseClass.OBJECT_LAST_OWNER_ID: | 13758 | case ScriptBaseClass.OBJECT_LAST_OWNER_ID: |
13759 | ret.Add(new LSL_Key(ScriptBaseClass.NULL_KEY)); | 13759 | ret.Add(new LSL_Key(ScriptBaseClass.NULL_KEY)); |
13760 | break; | 13760 | break; |
13761 | case ScriptBaseClass.OBJECT_CLICK_ACTION: | ||
13762 | ret.Add(new LSL_Integer(0)); | ||
13763 | break; | ||
13764 | case ScriptBaseClass.OBJECT_OMEGA: | ||
13765 | ret.Add(new LSL_Vector(Vector3.Zero)); | ||
13766 | break; | ||
13767 | case ScriptBaseClass.OBJECT_PRIM_COUNT: | ||
13768 | List<SceneObjectGroup> Attachments = av.GetAttachments(); | ||
13769 | int count = 0; | ||
13770 | try | ||
13771 | { | ||
13772 | foreach (SceneObjectGroup Attachment in Attachments) | ||
13773 | count += Attachment.PrimCount; | ||
13774 | } catch { }; | ||
13775 | ret.Add(new LSL_Integer(count)); | ||
13776 | break; | ||
13777 | case ScriptBaseClass.OBJECT_TOTAL_INVENTORY_COUNT: | ||
13778 | List<SceneObjectGroup> invAttachments = av.GetAttachments(); | ||
13779 | int invcount = 0; | ||
13780 | try | ||
13781 | { | ||
13782 | foreach (SceneObjectGroup Attachment in invAttachments) | ||
13783 | { | ||
13784 | SceneObjectPart[] parts = Attachment.Parts; | ||
13785 | int nparts = parts.Count(); | ||
13786 | for(int i = 0; i < nparts; i++) | ||
13787 | invcount += parts[i].Inventory.Count; | ||
13788 | } | ||
13789 | } catch { }; | ||
13790 | ret.Add(new LSL_Integer(invcount)); | ||
13791 | break; | ||
13792 | case ScriptBaseClass.OBJECT_GROUP_TAG: | ||
13793 | ret.Add(new LSL_String(av.Grouptitle)); | ||
13794 | break; | ||
13761 | default: | 13795 | default: |
13762 | // Invalid or unhandled constant. | 13796 | // Invalid or unhandled constant. |
13763 | ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); | 13797 | ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); |
@@ -13930,6 +13964,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
13930 | case ScriptBaseClass.OBJECT_LAST_OWNER_ID: | 13964 | case ScriptBaseClass.OBJECT_LAST_OWNER_ID: |
13931 | ret.Add(new LSL_Key(obj.ParentGroup.LastOwnerID.ToString())); | 13965 | ret.Add(new LSL_Key(obj.ParentGroup.LastOwnerID.ToString())); |
13932 | break; | 13966 | break; |
13967 | case ScriptBaseClass.OBJECT_CLICK_ACTION: | ||
13968 | ret.Add(new LSL_Integer(obj.ClickAction)); | ||
13969 | break; | ||
13970 | case ScriptBaseClass.OBJECT_OMEGA: | ||
13971 | ret.Add(new LSL_Vector(obj.AngularVelocity)); | ||
13972 | break; | ||
13973 | case ScriptBaseClass.OBJECT_PRIM_COUNT: | ||
13974 | ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); | ||
13975 | break; | ||
13976 | case ScriptBaseClass.OBJECT_TOTAL_INVENTORY_COUNT: | ||
13977 | SceneObjectPart[] parts = obj.ParentGroup.Parts; | ||
13978 | int nparts = parts.Count(); | ||
13979 | int count = 0; | ||
13980 | for(int i = 0; i < nparts; i++) | ||
13981 | count += parts[i].Inventory.Count; | ||
13982 | ret.Add(new LSL_Integer(count)); | ||
13983 | break; | ||
13984 | case ScriptBaseClass.OBJECT_GROUP_TAG: | ||
13985 | ret.Add(new LSL_String(String.Empty)); | ||
13986 | break; | ||
13933 | default: | 13987 | default: |
13934 | // Invalid or unhandled constant. | 13988 | // Invalid or unhandled constant. |
13935 | ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); | 13989 | ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index cee66b2..17173a2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -636,6 +636,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
636 | public const int OBJECT_HOVER_HEIGHT = 25; | 636 | public const int OBJECT_HOVER_HEIGHT = 25; |
637 | public const int OBJECT_BODY_SHAPE_TYPE = 26; | 637 | public const int OBJECT_BODY_SHAPE_TYPE = 26; |
638 | public const int OBJECT_LAST_OWNER_ID = 27; | 638 | public const int OBJECT_LAST_OWNER_ID = 27; |
639 | public const int OBJECT_CLICK_ACTION = 28; | ||
640 | public const int OBJECT_OMEGA = 29; | ||
641 | public const int OBJECT_PRIM_COUNT = 30; | ||
642 | public const int OBJECT_TOTAL_INVENTORY_COUNT = 31; | ||
643 | public const int OBJECT_GROUP_TAG = 33; | ||
639 | 644 | ||
640 | // Pathfinding types | 645 | // Pathfinding types |
641 | public const int OPT_OTHER = -1; | 646 | public const int OPT_OTHER = -1; |