aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/Hypergrid
diff options
context:
space:
mode:
authorJeff Ames2008-11-25 16:00:55 +0000
committerJeff Ames2008-11-25 16:00:55 +0000
commit518a8b9f2ac09a5060e2e59c913dfbe7faf397ef (patch)
tree8b3e39fbd54452e031873d31ff099e7db064cdee /OpenSim/Region/Environment/Scenes/Hypergrid
parent* minor: eliminate mono compiler warnings (diff)
downloadopensim-SC_OLD-518a8b9f2ac09a5060e2e59c913dfbe7faf397ef.zip
opensim-SC_OLD-518a8b9f2ac09a5060e2e59c913dfbe7faf397ef.tar.gz
opensim-SC_OLD-518a8b9f2ac09a5060e2e59c913dfbe7faf397ef.tar.bz2
opensim-SC_OLD-518a8b9f2ac09a5060e2e59c913dfbe7faf397ef.tar.xz
Update svn properties.
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/Hypergrid')
-rw-r--r--OpenSim/Region/Environment/Scenes/Hypergrid/HGAssetMapper.cs754
-rw-r--r--OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.Inventory.cs304
-rw-r--r--OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.cs156
-rw-r--r--OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs526
4 files changed, 870 insertions, 870 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Environment/Scenes/Hypergrid/HGAssetMapper.cs
index 1715ffe..889c77e 100644
--- a/OpenSim/Region/Environment/Scenes/Hypergrid/HGAssetMapper.cs
+++ b/OpenSim/Region/Environment/Scenes/Hypergrid/HGAssetMapper.cs
@@ -1,377 +1,377 @@
1/** 1/**
2 * Copyright (c) 2008, Contributors. All rights reserved. 2 * Copyright (c) 2008, Contributors. All rights reserved.
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without modification, 5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met: 6 * are permitted provided that the following conditions are met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright notice, 8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice, 10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation 11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution. 12 * and/or other materials provided with the distribution.
13 * * Neither the name of the Organizations nor the names of Individual 13 * * Neither the name of the Organizations nor the names of Individual
14 * Contributors may be used to endorse or promote products derived from 14 * Contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission. 15 * this software without specific prior written permission.
16 * 16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25 * OF THE POSSIBILITY OF SUCH DAMAGE. 25 * OF THE POSSIBILITY OF SUCH DAMAGE.
26 * 26 *
27 */ 27 */
28 28
29using System; 29using System;
30using System.Collections; 30using System.Collections;
31using System.Collections.Generic; 31using System.Collections.Generic;
32using System.Reflection; 32using System.Reflection;
33using System.Threading; 33using System.Threading;
34 34
35using log4net; 35using log4net;
36using Nini.Config; 36using Nini.Config;
37using OpenMetaverse; 37using OpenMetaverse;
38 38
39using OpenSim.Framework; 39using OpenSim.Framework;
40using OpenSim.Framework.Communications; 40using OpenSim.Framework.Communications;
41using OpenSim.Framework.Communications.Cache; 41using OpenSim.Framework.Communications.Cache;
42using OpenSim.Framework.Servers; 42using OpenSim.Framework.Servers;
43using OpenSim.Region.Environment; 43using OpenSim.Region.Environment;
44using OpenSim.Region.Environment.Scenes; 44using OpenSim.Region.Environment.Scenes;
45 45
46//using HyperGrid.Framework; 46//using HyperGrid.Framework;
47//using OpenSim.Region.Communications.Hypergrid; 47//using OpenSim.Region.Communications.Hypergrid;
48 48
49namespace OpenSim.Region.Environment.Scenes.Hypergrid 49namespace OpenSim.Region.Environment.Scenes.Hypergrid
50{ 50{
51 public class HGAssetMapper 51 public class HGAssetMapper
52 { 52 {
53 #region Fields 53 #region Fields
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 55
56 // This maps between asset server URLs and asset server clients 56 // This maps between asset server URLs and asset server clients
57 private Dictionary<string, GridAssetClient> m_assetServers = new Dictionary<string, GridAssetClient>(); 57 private Dictionary<string, GridAssetClient> m_assetServers = new Dictionary<string, GridAssetClient>();
58 58
59 // This maps between asset UUIDs and asset servers 59 // This maps between asset UUIDs and asset servers
60 private Dictionary<UUID, GridAssetClient> m_assetMap = new Dictionary<UUID, GridAssetClient>(); 60 private Dictionary<UUID, GridAssetClient> m_assetMap = new Dictionary<UUID, GridAssetClient>();
61 61
62 private Scene m_scene; 62 private Scene m_scene;
63 #endregion 63 #endregion
64 64
65 #region Constructor 65 #region Constructor
66 66
67 public HGAssetMapper(Scene scene) 67 public HGAssetMapper(Scene scene)
68 { 68 {
69 m_scene = scene; 69 m_scene = scene;
70 } 70 }
71 71
72 #endregion 72 #endregion
73 73
74 #region Internal functions 74 #region Internal functions
75 75
76 private string UserAssetURL(UUID userID) 76 private string UserAssetURL(UUID userID)
77 { 77 {
78 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID); 78 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
79 if (uinfo != null) 79 if (uinfo != null)
80 return (uinfo.UserProfile.UserAssetURI == "") ? null : uinfo.UserProfile.UserAssetURI; 80 return (uinfo.UserProfile.UserAssetURI == "") ? null : uinfo.UserProfile.UserAssetURI;
81 return null; 81 return null;
82 } 82 }
83 83
84 private bool IsHomeUser(UUID userID) 84 private bool IsHomeUser(UUID userID)
85 { 85 {
86 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID); 86 CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
87 87
88 if (uinfo != null) 88 if (uinfo != null)
89 { 89 {
90 //if ((uinfo.UserProfile.UserAssetURI == null) || (uinfo.UserProfile.UserAssetURI == "") || 90 //if ((uinfo.UserProfile.UserAssetURI == null) || (uinfo.UserProfile.UserAssetURI == "") ||
91 // uinfo.UserProfile.UserAssetURI.Equals(m_scene.CommsManager.NetworkServersInfo.AssetURL)) 91 // uinfo.UserProfile.UserAssetURI.Equals(m_scene.CommsManager.NetworkServersInfo.AssetURL))
92 if (HGNetworkServersInfo.Singleton.IsLocalUser(uinfo.UserProfile.UserAssetURI)) 92 if (HGNetworkServersInfo.Singleton.IsLocalUser(uinfo.UserProfile.UserAssetURI))
93 { 93 {
94 m_log.Debug("[HGScene]: Home user " + uinfo.UserProfile.FirstName + " " + uinfo.UserProfile.SurName); 94 m_log.Debug("[HGScene]: Home user " + uinfo.UserProfile.FirstName + " " + uinfo.UserProfile.SurName);
95 return true; 95 return true;
96 } 96 }
97 } 97 }
98 98
99 m_log.Debug("[HGScene]: Foreign user " + uinfo.UserProfile.FirstName + " " + uinfo.UserProfile.SurName); 99 m_log.Debug("[HGScene]: Foreign user " + uinfo.UserProfile.FirstName + " " + uinfo.UserProfile.SurName);
100 return false; 100 return false;
101 } 101 }
102 102
103 private bool IsInAssetMap(UUID uuid) 103 private bool IsInAssetMap(UUID uuid)
104 { 104 {
105 return m_assetMap.ContainsKey(uuid); 105 return m_assetMap.ContainsKey(uuid);
106 } 106 }
107 107
108 private bool FetchAsset(GridAssetClient asscli, UUID assetID, bool isTexture) 108 private bool FetchAsset(GridAssetClient asscli, UUID assetID, bool isTexture)
109 { 109 {
110 // I'm not going over 3 seconds since this will be blocking processing of all the other inbound 110 // I'm not going over 3 seconds since this will be blocking processing of all the other inbound
111 // packets from the client. 111 // packets from the client.
112 int pollPeriod = 200; 112 int pollPeriod = 200;
113 int maxPolls = 15; 113 int maxPolls = 15;
114 114
115 AssetBase asset; 115 AssetBase asset;
116 116
117 // Maybe it came late, and it's already here. Check first. 117 // Maybe it came late, and it's already here. Check first.
118 if (m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset)) 118 if (m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset))
119 { 119 {
120 m_log.Debug("[HGScene]: Asset already in asset cache. " + assetID); 120 m_log.Debug("[HGScene]: Asset already in asset cache. " + assetID);
121 return true; 121 return true;
122 } 122 }
123 123
124 124
125 asscli.RequestAsset(assetID, isTexture); 125 asscli.RequestAsset(assetID, isTexture);
126 126
127 do 127 do
128 { 128 {
129 Thread.Sleep(pollPeriod); 129 Thread.Sleep(pollPeriod);
130 130
131 if (m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset) && (asset != null)) 131 if (m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset) && (asset != null))
132 { 132 {
133 m_log.Debug("[HGScene]: Asset made it to asset cache. " + asset.Name + " " + assetID); 133 m_log.Debug("[HGScene]: Asset made it to asset cache. " + asset.Name + " " + assetID);
134 // I think I need to store it in the asset DB too. 134 // I think I need to store it in the asset DB too.
135 // For now, let me just do it for textures and scripts 135 // For now, let me just do it for textures and scripts
136 if (((AssetType)asset.Type == AssetType.Texture) || 136 if (((AssetType)asset.Type == AssetType.Texture) ||
137 ((AssetType)asset.Type == AssetType.LSLBytecode) || 137 ((AssetType)asset.Type == AssetType.LSLBytecode) ||
138 ((AssetType)asset.Type == AssetType.LSLText)) 138 ((AssetType)asset.Type == AssetType.LSLText))
139 { 139 {
140 AssetBase asset1 = new AssetBase(); 140 AssetBase asset1 = new AssetBase();
141 Copy(asset, asset1); 141 Copy(asset, asset1);
142 m_scene.AssetCache.AssetServer.StoreAsset(asset1); 142 m_scene.AssetCache.AssetServer.StoreAsset(asset1);
143 } 143 }
144 return true; 144 return true;
145 } 145 }
146 } while (--maxPolls > 0); 146 } while (--maxPolls > 0);
147 147
148 m_log.WarnFormat("[HGScene]: {0} {1} was not received before the retrieval timeout was reached", 148 m_log.WarnFormat("[HGScene]: {0} {1} was not received before the retrieval timeout was reached",
149 isTexture ? "texture" : "asset", assetID.ToString()); 149 isTexture ? "texture" : "asset", assetID.ToString());
150 150
151 return false; 151 return false;
152 } 152 }
153 153
154 private bool PostAsset(GridAssetClient asscli, UUID assetID) 154 private bool PostAsset(GridAssetClient asscli, UUID assetID)
155 { 155 {
156 AssetBase asset1; 156 AssetBase asset1;
157 m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset1); 157 m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset1);
158 158
159 if (asset1 != null) 159 if (asset1 != null)
160 { 160 {
161 // See long comment in AssetCache.AddAsset 161 // See long comment in AssetCache.AddAsset
162 if (!asset1.Temporary || asset1.Local) 162 if (!asset1.Temporary || asset1.Local)
163 { 163 {
164 // The asset cache returns instances of subclasses of AssetBase: 164 // The asset cache returns instances of subclasses of AssetBase:
165 // TextureImage or AssetInfo. So in passing them to the remote 165 // TextureImage or AssetInfo. So in passing them to the remote
166 // server we first need to convert this to instances of AssetBase, 166 // server we first need to convert this to instances of AssetBase,
167 // which is the serializable class for assets. 167 // which is the serializable class for assets.
168 AssetBase asset = new AssetBase(); 168 AssetBase asset = new AssetBase();
169 Copy(asset1, asset); 169 Copy(asset1, asset);
170 170
171 asscli.StoreAsset(asset); 171 asscli.StoreAsset(asset);
172 } 172 }
173 return true; 173 return true;
174 } 174 }
175 else 175 else
176 m_log.Warn("[HGScene]: Tried to post asset to remote server, but asset not in local cache."); 176 m_log.Warn("[HGScene]: Tried to post asset to remote server, but asset not in local cache.");
177 177
178 return false; 178 return false;
179 } 179 }
180 180
181 private void Copy(AssetBase from, AssetBase to) 181 private void Copy(AssetBase from, AssetBase to)
182 { 182 {
183 to.Data = from.Data; 183 to.Data = from.Data;
184 to.Description = from.Description; 184 to.Description = from.Description;
185 to.FullID = from.FullID; 185 to.FullID = from.FullID;
186 to.ID = from.ID; 186 to.ID = from.ID;
187 to.Local = from.Local; 187 to.Local = from.Local;
188 to.Name = from.Name; 188 to.Name = from.Name;
189 to.Temporary = from.Temporary; 189 to.Temporary = from.Temporary;
190 to.Type = from.Type; 190 to.Type = from.Type;
191 191
192 } 192 }
193 193
194 private void _guardedAdd(Dictionary<UUID, bool> lst, UUID obj, bool val) 194 private void _guardedAdd(Dictionary<UUID, bool> lst, UUID obj, bool val)
195 { 195 {
196 if (!lst.ContainsKey(obj)) 196 if (!lst.ContainsKey(obj))
197 lst.Add(obj, val); 197 lst.Add(obj, val);
198 } 198 }
199 199
200 private void SniffTextureUUIDs(Dictionary<UUID, bool> uuids, SceneObjectGroup sog) 200 private void SniffTextureUUIDs(Dictionary<UUID, bool> uuids, SceneObjectGroup sog)
201 { 201 {
202 try 202 try
203 { 203 {
204 _guardedAdd(uuids, sog.RootPart.Shape.Textures.DefaultTexture.TextureID, true); 204 _guardedAdd(uuids, sog.RootPart.Shape.Textures.DefaultTexture.TextureID, true);
205 } 205 }
206 catch (Exception) { } 206 catch (Exception) { }
207 207
208 foreach (Primitive.TextureEntryFace tface in sog.RootPart.Shape.Textures.FaceTextures) 208 foreach (Primitive.TextureEntryFace tface in sog.RootPart.Shape.Textures.FaceTextures)
209 { 209 {
210 try 210 try
211 { 211 {
212 _guardedAdd(uuids, tface.TextureID, true); 212 _guardedAdd(uuids, tface.TextureID, true);
213 } 213 }
214 catch (Exception) { } 214 catch (Exception) { }
215 } 215 }
216 216
217 foreach (SceneObjectPart sop in sog.Children.Values) 217 foreach (SceneObjectPart sop in sog.Children.Values)
218 { 218 {
219 try 219 try
220 { 220 {
221 _guardedAdd(uuids, sop.Shape.Textures.DefaultTexture.TextureID, true); 221 _guardedAdd(uuids, sop.Shape.Textures.DefaultTexture.TextureID, true);
222 } 222 }
223 catch (Exception) { } 223 catch (Exception) { }
224 foreach (Primitive.TextureEntryFace tface in sop.Shape.Textures.FaceTextures) 224 foreach (Primitive.TextureEntryFace tface in sop.Shape.Textures.FaceTextures)
225 { 225 {
226 try 226 try
227 { 227 {
228 _guardedAdd(uuids, tface.TextureID, true); 228 _guardedAdd(uuids, tface.TextureID, true);
229 } 229 }
230 catch (Exception) { } 230 catch (Exception) { }
231 } 231 }
232 } 232 }
233 } 233 }
234 234
235 private void SniffTaskInventoryUUIDs(Dictionary<UUID, bool> uuids, SceneObjectGroup sog) 235 private void SniffTaskInventoryUUIDs(Dictionary<UUID, bool> uuids, SceneObjectGroup sog)
236 { 236 {
237 TaskInventoryDictionary tinv = sog.RootPart.TaskInventory; 237 TaskInventoryDictionary tinv = sog.RootPart.TaskInventory;
238 238
239 foreach (TaskInventoryItem titem in tinv.Values) 239 foreach (TaskInventoryItem titem in tinv.Values)
240 { 240 {
241 uuids.Add(titem.AssetID, (InventoryType)titem.Type == InventoryType.Texture); 241 uuids.Add(titem.AssetID, (InventoryType)titem.Type == InventoryType.Texture);
242 } 242 }
243 } 243 }
244 244
245 private Dictionary<UUID, bool> SniffUUIDs(AssetBase asset) 245 private Dictionary<UUID, bool> SniffUUIDs(AssetBase asset)
246 { 246 {
247 Dictionary<UUID, bool> uuids = new Dictionary<UUID, bool>(); 247 Dictionary<UUID, bool> uuids = new Dictionary<UUID, bool>();
248 if ((asset != null) && ((AssetType)asset.Type == AssetType.Object)) 248 if ((asset != null) && ((AssetType)asset.Type == AssetType.Object))
249 { 249 {
250 string ass_str = Utils.BytesToString(asset.Data); 250 string ass_str = Utils.BytesToString(asset.Data);
251 SceneObjectGroup sog = new SceneObjectGroup(ass_str, true); 251 SceneObjectGroup sog = new SceneObjectGroup(ass_str, true);
252 252
253 SniffTextureUUIDs(uuids, sog); 253 SniffTextureUUIDs(uuids, sog);
254 254
255 // We need to sniff further... 255 // We need to sniff further...
256 SniffTaskInventoryUUIDs(uuids, sog); 256 SniffTaskInventoryUUIDs(uuids, sog);
257 257
258 } 258 }
259 259
260 return uuids; 260 return uuids;
261 } 261 }
262 262
263 private Dictionary<UUID, bool> SniffUUIDs(UUID assetID) 263 private Dictionary<UUID, bool> SniffUUIDs(UUID assetID)
264 { 264 {
265 //Dictionary<UUID, bool> uuids = new Dictionary<UUID, bool>(); 265 //Dictionary<UUID, bool> uuids = new Dictionary<UUID, bool>();
266 266
267 AssetBase asset; 267 AssetBase asset;
268 m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset); 268 m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset);
269 269
270 return SniffUUIDs(asset); 270 return SniffUUIDs(asset);
271 } 271 }
272 272
273 private void Dump(Dictionary<UUID, bool> lst) 273 private void Dump(Dictionary<UUID, bool> lst)
274 { 274 {
275 m_log.Debug("XXX -------- UUID DUMP ------- XXX"); 275 m_log.Debug("XXX -------- UUID DUMP ------- XXX");
276 foreach (KeyValuePair<UUID, bool> kvp in lst) 276 foreach (KeyValuePair<UUID, bool> kvp in lst)
277 m_log.Debug(" >> " + kvp.Key + " (texture? " + kvp.Value + ")"); 277 m_log.Debug(" >> " + kvp.Key + " (texture? " + kvp.Value + ")");
278 m_log.Debug("XXX -------- UUID DUMP ------- XXX"); 278 m_log.Debug("XXX -------- UUID DUMP ------- XXX");
279 } 279 }
280 280
281 #endregion 281 #endregion
282 282
283 283
284 #region Public interface 284 #region Public interface
285 285
286 public void Get(UUID itemID, UUID ownerID) 286 public void Get(UUID itemID, UUID ownerID)
287 { 287 {
288 if (!IsInAssetMap(itemID) && !IsHomeUser(ownerID)) 288 if (!IsInAssetMap(itemID) && !IsHomeUser(ownerID))
289 { 289 {
290 // Get the item from the remote asset server onto the local AssetCache 290 // Get the item from the remote asset server onto the local AssetCache
291 // and place an entry in m_assetMap 291 // and place an entry in m_assetMap
292 292
293 GridAssetClient asscli = null; 293 GridAssetClient asscli = null;
294 string userAssetURL = UserAssetURL(ownerID); 294 string userAssetURL = UserAssetURL(ownerID);
295 if (userAssetURL != null) 295 if (userAssetURL != null)
296 { 296 {
297 m_assetServers.TryGetValue(userAssetURL, out asscli); 297 m_assetServers.TryGetValue(userAssetURL, out asscli);
298 if (asscli == null) 298 if (asscli == null)
299 { 299 {
300 m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL); 300 m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL);
301 asscli = new GridAssetClient(userAssetURL); 301 asscli = new GridAssetClient(userAssetURL);
302 asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache! 302 asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache!
303 m_assetServers.Add(userAssetURL, asscli); 303 m_assetServers.Add(userAssetURL, asscli);
304 } 304 }
305 305
306 m_log.Debug("[HGScene]: Fetching object " + itemID + " to asset server " + userAssetURL); 306 m_log.Debug("[HGScene]: Fetching object " + itemID + " to asset server " + userAssetURL);
307 bool success = FetchAsset(asscli, itemID, false); // asscli.RequestAsset(item.ItemID, false); 307 bool success = FetchAsset(asscli, itemID, false); // asscli.RequestAsset(item.ItemID, false);
308 308
309 // OK, now fetch the inside. 309 // OK, now fetch the inside.
310 Dictionary<UUID, bool> ids = SniffUUIDs(itemID); 310 Dictionary<UUID, bool> ids = SniffUUIDs(itemID);
311 Dump(ids); 311 Dump(ids);
312 foreach (KeyValuePair<UUID, bool> kvp in ids) 312 foreach (KeyValuePair<UUID, bool> kvp in ids)
313 FetchAsset(asscli, kvp.Key, kvp.Value); 313 FetchAsset(asscli, kvp.Key, kvp.Value);
314 314
315 315
316 if (success) 316 if (success)
317 { 317 {
318 m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL); 318 m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL);
319 m_assetMap.Add(itemID, asscli); 319 m_assetMap.Add(itemID, asscli);
320 } 320 }
321 else 321 else
322 m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL); 322 m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL);
323 } 323 }
324 else 324 else
325 m_log.Warn("[HGScene]: Unable to locate foreign user's asset server"); 325 m_log.Warn("[HGScene]: Unable to locate foreign user's asset server");
326 } 326 }
327 } 327 }
328 328
329 public void Post(UUID itemID, UUID ownerID) 329 public void Post(UUID itemID, UUID ownerID)
330 { 330 {
331 if (!IsHomeUser(ownerID)) 331 if (!IsHomeUser(ownerID))
332 { 332 {
333 // Post the item from the local AssetCache ontp the remote asset server 333 // Post the item from the local AssetCache ontp the remote asset server
334 // and place an entry in m_assetMap 334 // and place an entry in m_assetMap
335 335
336 GridAssetClient asscli = null; 336 GridAssetClient asscli = null;
337 string userAssetURL = UserAssetURL(ownerID); 337 string userAssetURL = UserAssetURL(ownerID);
338 if (userAssetURL != null) 338 if (userAssetURL != null)
339 { 339 {
340 m_assetServers.TryGetValue(userAssetURL, out asscli); 340 m_assetServers.TryGetValue(userAssetURL, out asscli);
341 if (asscli == null) 341 if (asscli == null)
342 { 342 {
343 m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL); 343 m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL);
344 asscli = new GridAssetClient(userAssetURL); 344 asscli = new GridAssetClient(userAssetURL);
345 asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache! 345 asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache!
346 m_assetServers.Add(userAssetURL, asscli); 346 m_assetServers.Add(userAssetURL, asscli);
347 } 347 }
348 m_log.Debug("[HGScene]: Posting object " + itemID + " to asset server " + userAssetURL); 348 m_log.Debug("[HGScene]: Posting object " + itemID + " to asset server " + userAssetURL);
349 bool success = PostAsset(asscli, itemID); 349 bool success = PostAsset(asscli, itemID);
350 350
351 // Now the inside 351 // Now the inside
352 Dictionary<UUID, bool> ids = SniffUUIDs(itemID); 352 Dictionary<UUID, bool> ids = SniffUUIDs(itemID);
353 Dump(ids); 353 Dump(ids);
354 foreach (KeyValuePair<UUID, bool> kvp in ids) 354 foreach (KeyValuePair<UUID, bool> kvp in ids)
355 PostAsset(asscli, kvp.Key); 355 PostAsset(asscli, kvp.Key);
356 356
357 if (success) 357 if (success)
358 { 358 {
359 m_log.Debug("[HGScene]: Successfully posted item to remote asset server " + userAssetURL); 359 m_log.Debug("[HGScene]: Successfully posted item to remote asset server " + userAssetURL);
360 m_assetMap.Add(itemID, asscli); 360 m_assetMap.Add(itemID, asscli);
361 } 361 }
362 else 362 else
363 m_log.Warn("[HGScene]: Could not post asset to remote asset server " + userAssetURL); 363 m_log.Warn("[HGScene]: Could not post asset to remote asset server " + userAssetURL);
364 364
365 //if (!m_assetMap.ContainsKey(itemID)) 365 //if (!m_assetMap.ContainsKey(itemID))
366 // m_assetMap.Add(itemID, asscli); 366 // m_assetMap.Add(itemID, asscli);
367 } 367 }
368 else 368 else
369 m_log.Warn("[HGScene]: Unable to locate foreign user's asset server"); 369 m_log.Warn("[HGScene]: Unable to locate foreign user's asset server");
370 370
371 } 371 }
372 } 372 }
373 373
374 #endregion 374 #endregion
375 375
376 } 376 }
377} 377}
diff --git a/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.Inventory.cs
index af3c04f..92627d1 100644
--- a/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.Inventory.cs
@@ -1,152 +1,152 @@
1/** 1/**
2 * Copyright (c) 2008, Contributors. All rights reserved. 2 * Copyright (c) 2008, Contributors. All rights reserved.
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without modification, 5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met: 6 * are permitted provided that the following conditions are met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright notice, 8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice, 10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation 11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution. 12 * and/or other materials provided with the distribution.
13 * * Neither the name of the Organizations nor the names of Individual 13 * * Neither the name of the Organizations nor the names of Individual
14 * Contributors may be used to endorse or promote products derived from 14 * Contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission. 15 * this software without specific prior written permission.
16 * 16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25 * OF THE POSSIBILITY OF SUCH DAMAGE. 25 * OF THE POSSIBILITY OF SUCH DAMAGE.
26 * 26 *
27 */ 27 */
28 28
29using System; 29using System;
30using System.Collections; 30using System.Collections;
31using System.Collections.Generic; 31using System.Collections.Generic;
32using System.Reflection; 32using System.Reflection;
33using System.Threading; 33using System.Threading;
34 34
35using log4net; 35using log4net;
36using Nini.Config; 36using Nini.Config;
37using OpenMetaverse; 37using OpenMetaverse;
38 38
39using OpenSim.Framework; 39using OpenSim.Framework;
40using OpenSim.Framework.Communications; 40using OpenSim.Framework.Communications;
41using OpenSim.Framework.Communications.Cache; 41using OpenSim.Framework.Communications.Cache;
42using OpenSim.Framework.Servers; 42using OpenSim.Framework.Servers;
43using OpenSim.Region.Environment; 43using OpenSim.Region.Environment;
44using OpenSim.Region.Environment.Scenes; 44using OpenSim.Region.Environment.Scenes;
45 45
46namespace OpenSim.Region.Environment.Scenes.Hypergrid 46namespace OpenSim.Region.Environment.Scenes.Hypergrid
47{ 47{
48 public partial class HGScene : Scene 48 public partial class HGScene : Scene
49 { 49 {
50 #region Fields 50 #region Fields
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 52
53 private HGAssetMapper m_assMapper; 53 private HGAssetMapper m_assMapper;
54 54
55 #endregion 55 #endregion
56 56
57 #region Constructors 57 #region Constructors
58 58
59 public HGScene(RegionInfo regInfo, AgentCircuitManager authen, 59 public HGScene(RegionInfo regInfo, AgentCircuitManager authen,
60 CommunicationsManager commsMan, SceneCommunicationService sceneGridService, 60 CommunicationsManager commsMan, SceneCommunicationService sceneGridService,
61 AssetCache assetCach, StorageManager storeManager, BaseHttpServer httpServer, 61 AssetCache assetCach, StorageManager storeManager, BaseHttpServer httpServer,
62 ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, 62 ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim,
63 bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) 63 bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion)
64 : base(regInfo, authen, commsMan, sceneGridService, assetCach, storeManager, httpServer, moduleLoader, 64 : base(regInfo, authen, commsMan, sceneGridService, assetCach, storeManager, httpServer, moduleLoader,
65 dumpAssetsToFile, physicalPrim, SeeIntoRegionFromNeighbor, config, simulatorVersion) 65 dumpAssetsToFile, physicalPrim, SeeIntoRegionFromNeighbor, config, simulatorVersion)
66 { 66 {
67 m_log.Info("[HGScene]: Starting HGScene."); 67 m_log.Info("[HGScene]: Starting HGScene.");
68 m_assMapper = new HGAssetMapper(this); 68 m_assMapper = new HGAssetMapper(this);
69 69
70 EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; 70 EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem;
71 } 71 }
72 72
73 #endregion 73 #endregion
74 74
75 #region Event handlers 75 #region Event handlers
76 76
77 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) 77 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel)
78 { 78 {
79 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(avatarID); 79 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(avatarID);
80 if (userInfo != null) 80 if (userInfo != null)
81 { 81 {
82 m_assMapper.Post(assetID, avatarID); 82 m_assMapper.Post(assetID, avatarID);
83 } 83 }
84 } 84 }
85 85
86 #endregion 86 #endregion
87 87
88 #region Overrides of Scene.Inventory methods 88 #region Overrides of Scene.Inventory methods
89 89
90 /// 90 ///
91 /// CapsUpdateInventoryItemAsset 91 /// CapsUpdateInventoryItemAsset
92 /// 92 ///
93 public override UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) 93 public override UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data)
94 { 94 {
95 UUID newAssetID = base.CapsUpdateInventoryItemAsset(remoteClient, itemID, data); 95 UUID newAssetID = base.CapsUpdateInventoryItemAsset(remoteClient, itemID, data);
96 96
97 UploadInventoryItem(remoteClient.AgentId, newAssetID, "", 0); 97 UploadInventoryItem(remoteClient.AgentId, newAssetID, "", 0);
98 98
99 return newAssetID; 99 return newAssetID;
100 } 100 }
101 101
102 /// 102 ///
103 /// DeleteToInventory 103 /// DeleteToInventory
104 /// 104 ///
105 public override UUID DeleteToInventory(int destination, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient) 105 public override UUID DeleteToInventory(int destination, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient)
106 { 106 {
107 UUID assetID = base.DeleteToInventory(destination, folderID, objectGroup, remoteClient); 107 UUID assetID = base.DeleteToInventory(destination, folderID, objectGroup, remoteClient);
108 108
109 if (!assetID.Equals(UUID.Zero)) 109 if (!assetID.Equals(UUID.Zero))
110 { 110 {
111 UploadInventoryItem(remoteClient.AgentId, assetID, "", 0); 111 UploadInventoryItem(remoteClient.AgentId, assetID, "", 0);
112 } 112 }
113 else 113 else
114 m_log.Debug("[HGScene]: Scene.Inventory did not create asset"); 114 m_log.Debug("[HGScene]: Scene.Inventory did not create asset");
115 115
116 return assetID; 116 return assetID;
117 } 117 }
118 118
119 /// 119 ///
120 /// RezObject 120 /// RezObject
121 /// 121 ///
122 public override SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, 122 public override SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart,
123 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, 123 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
124 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 124 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
125 { 125 {
126 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 126 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
127 if (userInfo != null) 127 if (userInfo != null)
128 { 128 {
129 if (userInfo.RootFolder != null) 129 if (userInfo.RootFolder != null)
130 { 130 {
131 InventoryItemBase item = userInfo.RootFolder.FindItem(itemID); 131 InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
132 132
133 if (item != null) 133 if (item != null)
134 { 134 {
135 m_assMapper.Get(item.AssetID, remoteClient.AgentId); 135 m_assMapper.Get(item.AssetID, remoteClient.AgentId);
136 136
137 } 137 }
138 } 138 }
139 } 139 }
140 140
141 // OK, we're done fetching. Pass it up to the default RezObject 141 // OK, we're done fetching. Pass it up to the default RezObject
142 return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, 142 return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,
143 RezSelected, RemoveItem, fromTaskID, attachment); 143 RezSelected, RemoveItem, fromTaskID, attachment);
144 144
145 } 145 }
146 146
147 147
148 #endregion 148 #endregion
149 149
150 } 150 }
151 151
152} 152}
diff --git a/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.cs b/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.cs
index a1a6173..da1d3a7 100644
--- a/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.cs
+++ b/OpenSim/Region/Environment/Scenes/Hypergrid/HGScene.cs
@@ -1,78 +1,78 @@
1/** 1/**
2 * Copyright (c) 2008, Contributors. All rights reserved. 2 * Copyright (c) 2008, Contributors. All rights reserved.
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without modification, 5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met: 6 * are permitted provided that the following conditions are met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright notice, 8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice, 10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation 11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution. 12 * and/or other materials provided with the distribution.
13 * * Neither the name of the Organizations nor the names of Individual 13 * * Neither the name of the Organizations nor the names of Individual
14 * Contributors may be used to endorse or promote products derived from 14 * Contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission. 15 * this software without specific prior written permission.
16 * 16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25 * OF THE POSSIBILITY OF SUCH DAMAGE. 25 * OF THE POSSIBILITY OF SUCH DAMAGE.
26 * 26 *
27 */ 27 */
28 28
29using System; 29using System;
30using System.Collections.Generic; 30using System.Collections.Generic;
31 31
32using OpenMetaverse; 32using OpenMetaverse;
33 33
34using OpenSim.Framework; 34using OpenSim.Framework;
35 35
36using OpenSim.Framework.Communications.Cache; 36using OpenSim.Framework.Communications.Cache;
37using OpenSim.Region.Environment; 37using OpenSim.Region.Environment;
38using OpenSim.Region.Environment.Scenes; 38using OpenSim.Region.Environment.Scenes;
39using TPFlags = OpenSim.Framework.Constants.TeleportFlags; 39using TPFlags = OpenSim.Framework.Constants.TeleportFlags;
40 40
41namespace OpenSim.Region.Environment.Scenes.Hypergrid 41namespace OpenSim.Region.Environment.Scenes.Hypergrid
42{ 42{
43 public partial class HGScene : Scene 43 public partial class HGScene : Scene
44 { 44 {
45 /// <summary> 45 /// <summary>
46 /// Teleport an avatar to their home region 46 /// Teleport an avatar to their home region
47 /// </summary> 47 /// </summary>
48 /// <param name="agentId"></param> 48 /// <param name="agentId"></param>
49 /// <param name="client"></param> 49 /// <param name="client"></param>
50 public override void TeleportClientHome(UUID agentId, IClientAPI client) 50 public override void TeleportClientHome(UUID agentId, IClientAPI client)
51 { 51 {
52 m_log.Debug("[HGScene]: TeleportClientHome " + client.FirstName + " " + client.LastName); 52 m_log.Debug("[HGScene]: TeleportClientHome " + client.FirstName + " " + client.LastName);
53 53
54 CachedUserInfo uinfo = CommsManager.UserProfileCacheService.GetUserDetails(agentId); 54 CachedUserInfo uinfo = CommsManager.UserProfileCacheService.GetUserDetails(agentId);
55 UserProfileData UserProfile = uinfo.UserProfile; 55 UserProfileData UserProfile = uinfo.UserProfile;
56 56
57 if (UserProfile != null) 57 if (UserProfile != null)
58 { 58 {
59 RegionInfo regionInfo = CommsManager.GridService.RequestNeighbourInfo(UserProfile.HomeRegion); 59 RegionInfo regionInfo = CommsManager.GridService.RequestNeighbourInfo(UserProfile.HomeRegion);
60 //if (regionInfo != null) 60 //if (regionInfo != null)
61 //{ 61 //{
62 // UserProfile.HomeRegionID = regionInfo.RegionID; 62 // UserProfile.HomeRegionID = regionInfo.RegionID;
63 // //CommsManager.UserService.UpdateUserProfile(UserProfile); 63 // //CommsManager.UserService.UpdateUserProfile(UserProfile);
64 //} 64 //}
65 if (regionInfo == null) 65 if (regionInfo == null)
66 { 66 {
67 // can't find the Home region: Tell viewer and abort 67 // can't find the Home region: Tell viewer and abort
68 client.SendTeleportFailed("Your home-region could not be found."); 68 client.SendTeleportFailed("Your home-region could not be found.");
69 return; 69 return;
70 } 70 }
71 RequestTeleportLocation( 71 RequestTeleportLocation(
72 client, regionInfo.RegionHandle, UserProfile.HomeLocation, UserProfile.HomeLookAt, 72 client, regionInfo.RegionHandle, UserProfile.HomeLocation, UserProfile.HomeLookAt,
73 (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome)); 73 (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome));
74 } 74 }
75 } 75 }
76 76
77 } 77 }
78} 78}
diff --git a/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs
index 501584a..9eb331a 100644
--- a/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/Hypergrid/HGSceneCommunicationService.cs
@@ -1,263 +1,263 @@
1/** 1/**
2 * Copyright (c) 2008, Contributors. All rights reserved. 2 * Copyright (c) 2008, Contributors. All rights reserved.
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without modification, 5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met: 6 * are permitted provided that the following conditions are met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright notice, 8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice, 10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation 11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution. 12 * and/or other materials provided with the distribution.
13 * * Neither the name of the Organizations nor the names of Individual 13 * * Neither the name of the Organizations nor the names of Individual
14 * Contributors may be used to endorse or promote products derived from 14 * Contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission. 15 * this software without specific prior written permission.
16 * 16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25 * OF THE POSSIBILITY OF SUCH DAMAGE. 25 * OF THE POSSIBILITY OF SUCH DAMAGE.
26 * 26 *
27 */ 27 */
28 28
29using System; 29using System;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using System.Threading; 32using System.Threading;
33 33
34using OpenMetaverse; 34using OpenMetaverse;
35 35
36using log4net; 36using log4net;
37using OpenSim.Framework; 37using OpenSim.Framework;
38using OpenSim.Framework.Communications; 38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Cache; 39using OpenSim.Framework.Communications.Cache;
40using OpenSim.Region.Environment.Scenes; 40using OpenSim.Region.Environment.Scenes;
41using OpenSim.Region.Environment; 41using OpenSim.Region.Environment;
42using OpenSim.Region.Interfaces; 42using OpenSim.Region.Interfaces;
43using OSD = OpenMetaverse.StructuredData.OSD; 43using OSD = OpenMetaverse.StructuredData.OSD;
44 44
45namespace OpenSim.Region.Environment.Scenes.Hypergrid 45namespace OpenSim.Region.Environment.Scenes.Hypergrid
46{ 46{
47 public class HGSceneCommunicationService : SceneCommunicationService 47 public class HGSceneCommunicationService : SceneCommunicationService
48 { 48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 50
51 private IHyperlink m_hg; 51 private IHyperlink m_hg;
52 52
53 public HGSceneCommunicationService(CommunicationsManager commsMan, IHyperlink hg) : base(commsMan) 53 public HGSceneCommunicationService(CommunicationsManager commsMan, IHyperlink hg) : base(commsMan)
54 { 54 {
55 m_hg = hg; 55 m_hg = hg;
56 } 56 }
57 57
58 58
59 /// <summary> 59 /// <summary>
60 /// Try to teleport an agent to a new region. 60 /// Try to teleport an agent to a new region.
61 /// </summary> 61 /// </summary>
62 /// <param name="remoteClient"></param> 62 /// <param name="remoteClient"></param>
63 /// <param name="RegionHandle"></param> 63 /// <param name="RegionHandle"></param>
64 /// <param name="position"></param> 64 /// <param name="position"></param>
65 /// <param name="lookAt"></param> 65 /// <param name="lookAt"></param>
66 /// <param name="flags"></param> 66 /// <param name="flags"></param>
67 public override void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position, 67 public override void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position,
68 Vector3 lookAt, uint teleportFlags) 68 Vector3 lookAt, uint teleportFlags)
69 { 69 {
70 if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID)) 70 if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID))
71 return; 71 return;
72 72
73 bool destRegionUp = false; 73 bool destRegionUp = false;
74 74
75 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>(); 75 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>();
76 76
77 if (regionHandle == m_regionInfo.RegionHandle) 77 if (regionHandle == m_regionInfo.RegionHandle)
78 { 78 {
79 // Teleport within the same region 79 // Teleport within the same region
80 if (position.X < 0 || position.X > Constants.RegionSize || position.Y < 0 || position.Y > Constants.RegionSize || position.Z < 0) 80 if (position.X < 0 || position.X > Constants.RegionSize || position.Y < 0 || position.Y > Constants.RegionSize || position.Z < 0)
81 { 81 {
82 Vector3 emergencyPos = new Vector3(128, 128, 128); 82 Vector3 emergencyPos = new Vector3(128, 128, 128);
83 83
84 m_log.WarnFormat( 84 m_log.WarnFormat(
85 "[HGSceneCommService]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", 85 "[HGSceneCommService]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
86 position, avatar.Name, avatar.UUID, emergencyPos); 86 position, avatar.Name, avatar.UUID, emergencyPos);
87 position = emergencyPos; 87 position = emergencyPos;
88 } 88 }
89 // TODO: Get proper AVG Height 89 // TODO: Get proper AVG Height
90 float localAVHeight = 1.56f; 90 float localAVHeight = 1.56f;
91 float posZLimit = (float)avatar.Scene.GetLandHeight((int)position.X, (int)position.Y); 91 float posZLimit = (float)avatar.Scene.GetLandHeight((int)position.X, (int)position.Y);
92 float newPosZ = posZLimit + localAVHeight; 92 float newPosZ = posZLimit + localAVHeight;
93 if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) 93 if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
94 { 94 {
95 position.Z = newPosZ; 95 position.Z = newPosZ;
96 } 96 }
97 97
98 // Only send this if the event queue is null 98 // Only send this if the event queue is null
99 if (eq == null) 99 if (eq == null)
100 avatar.ControllingClient.SendTeleportLocationStart(); 100 avatar.ControllingClient.SendTeleportLocationStart();
101 101
102 102
103 avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); 103 avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
104 avatar.Teleport(position); 104 avatar.Teleport(position);
105 } 105 }
106 else 106 else
107 { 107 {
108 RegionInfo reg = RequestNeighbouringRegionInfo(regionHandle); 108 RegionInfo reg = RequestNeighbouringRegionInfo(regionHandle);
109 if (reg != null) 109 if (reg != null)
110 { 110 {
111 /// 111 ///
112 /// Hypergrid mod start 112 /// Hypergrid mod start
113 /// 113 ///
114 /// 114 ///
115 bool isHyperLink = m_hg.IsHyperlinkRegion(reg.RegionHandle); 115 bool isHyperLink = m_hg.IsHyperlinkRegion(reg.RegionHandle);
116 bool isHomeUser = true; 116 bool isHomeUser = true;
117 ulong realHandle = regionHandle; 117 ulong realHandle = regionHandle;
118 CachedUserInfo uinfo = m_commsProvider.UserProfileCacheService.GetUserDetails(avatar.UUID); 118 CachedUserInfo uinfo = m_commsProvider.UserProfileCacheService.GetUserDetails(avatar.UUID);
119 if (uinfo != null) 119 if (uinfo != null)
120 { 120 {
121 isHomeUser = HGNetworkServersInfo.Singleton.IsLocalUser(uinfo.UserProfile.UserAssetURI); 121 isHomeUser = HGNetworkServersInfo.Singleton.IsLocalUser(uinfo.UserProfile.UserAssetURI);
122 realHandle = m_hg.FindRegionHandle(regionHandle); 122 realHandle = m_hg.FindRegionHandle(regionHandle);
123 Console.WriteLine("XXX ---- home user? " + isHomeUser + " --- hyperlink? " + isHyperLink + " --- real handle: " + realHandle.ToString()); 123 Console.WriteLine("XXX ---- home user? " + isHomeUser + " --- hyperlink? " + isHyperLink + " --- real handle: " + realHandle.ToString());
124 } 124 }
125 /// 125 ///
126 /// Hypergrid mod stop 126 /// Hypergrid mod stop
127 /// 127 ///
128 /// 128 ///
129 129
130 if (eq == null) 130 if (eq == null)
131 avatar.ControllingClient.SendTeleportLocationStart(); 131 avatar.ControllingClient.SendTeleportLocationStart();
132 132
133 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); 133 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
134 agent.BaseFolder = UUID.Zero; 134 agent.BaseFolder = UUID.Zero;
135 agent.InventoryFolder = UUID.Zero; 135 agent.InventoryFolder = UUID.Zero;
136 agent.startpos = position; 136 agent.startpos = position;
137 agent.child = true; 137 agent.child = true;
138 138
139 if (reg.RemotingAddress != "" && reg.RemotingPort != 0) 139 if (reg.RemotingAddress != "" && reg.RemotingPort != 0)
140 { 140 {
141 // region is remote. see if it is up 141 // region is remote. see if it is up
142 destRegionUp = m_commsProvider.InterRegion.CheckRegion(reg.RemotingAddress, reg.RemotingPort); 142 destRegionUp = m_commsProvider.InterRegion.CheckRegion(reg.RemotingAddress, reg.RemotingPort);
143 } 143 }
144 else 144 else
145 { 145 {
146 // assume local regions are always up 146 // assume local regions are always up
147 destRegionUp = true; 147 destRegionUp = true;
148 } 148 }
149 149
150 if (destRegionUp) 150 if (destRegionUp)
151 { 151 {
152 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from 152 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
153 // both regions 153 // both regions
154 if (avatar.ParentID != (uint)0) 154 if (avatar.ParentID != (uint)0)
155 avatar.StandUp(); 155 avatar.StandUp();
156 if (!avatar.ValidateAttachments()) 156 if (!avatar.ValidateAttachments())
157 { 157 {
158 avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state"); 158 avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state");
159 return; 159 return;
160 } 160 }
161 161
162 // the avatar.Close below will clear the child region list. We need this below for (possibly) 162 // the avatar.Close below will clear the child region list. We need this below for (possibly)
163 // closing the child agents, so save it here (we need a copy as it is Clear()-ed). 163 // closing the child agents, so save it here (we need a copy as it is Clear()-ed).
164 List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList()); 164 List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList());
165 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport 165 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
166 // failure at this point (unlike a border crossing failure). So perhaps this can never fail 166 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
167 // once we reach here... 167 // once we reach here...
168 avatar.Scene.RemoveCapsHandler(avatar.UUID); 168 avatar.Scene.RemoveCapsHandler(avatar.UUID);
169 agent.child = false; 169 agent.child = false;
170 m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent); 170 m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agent);
171 171
172 m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, 172 m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
173 position, false); 173 position, false);
174 Thread.Sleep(2000); 174 Thread.Sleep(2000);
175 AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo(); 175 AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo();
176 176
177 // TODO Should construct this behind a method 177 // TODO Should construct this behind a method
178 string capsPath = 178 string capsPath =
179 "http://" + reg.ExternalHostName + ":" + reg.HttpPort 179 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
180 + "/CAPS/" + circuitdata.CapsPath + "0000/"; 180 + "/CAPS/" + circuitdata.CapsPath + "0000/";
181 181
182 m_log.DebugFormat( 182 m_log.DebugFormat(
183 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID); 183 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID);
184 184
185 185
186 /// 186 ///
187 /// Hypergrid mod: realHandle instead of reg.RegionHandle 187 /// Hypergrid mod: realHandle instead of reg.RegionHandle
188 /// 188 ///
189 /// 189 ///
190 if (eq != null) 190 if (eq != null)
191 { 191 {
192 OSD Item = EventQueueHelper.TeleportFinishEvent(realHandle, 13, reg.ExternalEndPoint, 192 OSD Item = EventQueueHelper.TeleportFinishEvent(realHandle, 13, reg.ExternalEndPoint,
193 4, teleportFlags, capsPath, avatar.UUID); 193 4, teleportFlags, capsPath, avatar.UUID);
194 eq.Enqueue(Item, avatar.UUID); 194 eq.Enqueue(Item, avatar.UUID);
195 } 195 }
196 else 196 else
197 { 197 {
198 avatar.ControllingClient.SendRegionTeleport(realHandle, 13, reg.ExternalEndPoint, 4, 198 avatar.ControllingClient.SendRegionTeleport(realHandle, 13, reg.ExternalEndPoint, 4,
199 teleportFlags, capsPath); 199 teleportFlags, capsPath);
200 } 200 }
201 /// 201 ///
202 /// Hypergrid mod stop 202 /// Hypergrid mod stop
203 /// 203 ///
204 204
205 avatar.MakeChildAgent(); 205 avatar.MakeChildAgent();
206 Thread.Sleep(7000); 206 Thread.Sleep(7000);
207 avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true); 207 avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true);
208 if (KiPrimitive != null) 208 if (KiPrimitive != null)
209 { 209 {
210 KiPrimitive(avatar.LocalId); 210 KiPrimitive(avatar.LocalId);
211 } 211 }
212 212
213 avatar.Close(); 213 avatar.Close();
214 214
215 uint newRegionX = (uint)(reg.RegionHandle >> 40); 215 uint newRegionX = (uint)(reg.RegionHandle >> 40);
216 uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); 216 uint newRegionY = (((uint)(reg.RegionHandle)) >> 8);
217 uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40); 217 uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40);
218 uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8); 218 uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8);
219 /// 219 ///
220 /// Hypergrid mod: extra check for isHyperLink 220 /// Hypergrid mod: extra check for isHyperLink
221 /// 221 ///
222 if ((Util.fast_distance2d((int)(newRegionX - oldRegionX), (int)(newRegionY - oldRegionY)) > 3) || isHyperLink) 222 if ((Util.fast_distance2d((int)(newRegionX - oldRegionX), (int)(newRegionY - oldRegionY)) > 3) || isHyperLink)
223 { 223 {
224 //SendCloseChildAgentConnections(avatar.UUID, avatar.GetKnownRegionList()); 224 //SendCloseChildAgentConnections(avatar.UUID, avatar.GetKnownRegionList());
225 SendCloseChildAgentConnections(avatar.UUID, childRegions); 225 SendCloseChildAgentConnections(avatar.UUID, childRegions);
226 CloseConnection(avatar.UUID); 226 CloseConnection(avatar.UUID);
227 } 227 }
228 // if (teleport success) // seems to be always success here 228 // if (teleport success) // seems to be always success here
229 // the user may change their profile information in other region, 229 // the user may change their profile information in other region,
230 // so the userinfo in UserProfileCache is not reliable any more, delete it 230 // so the userinfo in UserProfileCache is not reliable any more, delete it
231 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) 231 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID))
232 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); 232 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID);
233 m_log.InfoFormat("[HGSceneCommService]: User {0} is going to another region, profile cache removed", avatar.UUID); 233 m_log.InfoFormat("[HGSceneCommService]: User {0} is going to another region, profile cache removed", avatar.UUID);
234 } 234 }
235 else 235 else
236 { 236 {
237 avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); 237 avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
238 } 238 }
239 } 239 }
240 else 240 else
241 { 241 {
242 // TP to a place that doesn't exist (anymore) 242 // TP to a place that doesn't exist (anymore)
243 // Inform the viewer about that 243 // Inform the viewer about that
244 avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); 244 avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore");
245 245
246 // and set the map-tile to '(Offline)' 246 // and set the map-tile to '(Offline)'
247 uint regX, regY; 247 uint regX, regY;
248 Utils.LongToUInts(regionHandle, out regX, out regY); 248 Utils.LongToUInts(regionHandle, out regX, out regY);
249 249
250 MapBlockData block = new MapBlockData(); 250 MapBlockData block = new MapBlockData();
251 block.X = (ushort)(regX / Constants.RegionSize); 251 block.X = (ushort)(regX / Constants.RegionSize);
252 block.Y = (ushort)(regY / Constants.RegionSize); 252 block.Y = (ushort)(regY / Constants.RegionSize);
253 block.Access = 254; // == not there 253 block.Access = 254; // == not there
254 254
255 List<MapBlockData> blocks = new List<MapBlockData>(); 255 List<MapBlockData> blocks = new List<MapBlockData>();
256 blocks.Add(block); 256 blocks.Add(block);
257 avatar.ControllingClient.SendMapBlock(blocks, 0); 257 avatar.ControllingClient.SendMapBlock(blocks, 0);
258 } 258 }
259 } 259 }
260 } 260 }
261 261
262 } 262 }
263} 263}