aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs156
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs54
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs5
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;