Merge git://opensimulator.org/git/opensim
						commit
						60989521a6
					
				|  | @ -51,27 +51,55 @@ namespace OpenSim.Data.Null | ||||||
|             //Console.WriteLine("[XXX] NullRegionData constructor"); |             //Console.WriteLine("[XXX] NullRegionData constructor"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         private delegate bool Matcher(string value); | ||||||
|  | 
 | ||||||
|         public List<RegionData> Get(string regionName, UUID scopeID) |         public List<RegionData> Get(string regionName, UUID scopeID) | ||||||
|         { |         { | ||||||
|             if (Instance != this) |             if (Instance != this) | ||||||
|                 return Instance.Get(regionName, scopeID); |                 return Instance.Get(regionName, scopeID); | ||||||
| 
 | 
 | ||||||
|  |             string cleanName = regionName.ToLower(); | ||||||
|  | 
 | ||||||
|  |             // Handle SQL wildcards | ||||||
|  |             const string wildcard = "%"; | ||||||
|  |             bool wildcardPrefix = false; | ||||||
|  |             bool wildcardSuffix = false; | ||||||
|  |             if (cleanName.Equals(wildcard)) | ||||||
|  |             { | ||||||
|  |                 wildcardPrefix = wildcardSuffix = true; | ||||||
|  |                 cleanName = string.Empty; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if (cleanName.StartsWith(wildcard)) | ||||||
|  |                 { | ||||||
|  |                     wildcardPrefix = true; | ||||||
|  |                     cleanName = cleanName.Substring(1); | ||||||
|  |                 } | ||||||
|  |                 if (regionName.EndsWith(wildcard)) | ||||||
|  |                 { | ||||||
|  |                     wildcardSuffix = true; | ||||||
|  |                     cleanName = cleanName.Remove(cleanName.Length - 1); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             Matcher queryMatch; | ||||||
|  |             if (wildcardPrefix && wildcardSuffix) | ||||||
|  |                 queryMatch = delegate(string s) { return s.Contains(cleanName); }; | ||||||
|  |             else if (wildcardSuffix) | ||||||
|  |                 queryMatch = delegate(string s) { return s.StartsWith(cleanName); }; | ||||||
|  |             else if (wildcardPrefix) | ||||||
|  |                 queryMatch = delegate(string s) { return s.EndsWith(cleanName); }; | ||||||
|  |             else | ||||||
|  |                 queryMatch = delegate(string s) { return s.Equals(cleanName); }; | ||||||
|  | 
 | ||||||
|  |             // Find region data | ||||||
|             List<RegionData> ret = new List<RegionData>(); |             List<RegionData> ret = new List<RegionData>(); | ||||||
| 
 | 
 | ||||||
|             foreach (RegionData r in m_regionData.Values) |             foreach (RegionData r in m_regionData.Values) | ||||||
|             { |             { | ||||||
|                 if (regionName.Contains("%")) |                     m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower()); | ||||||
|                 { |                     if (queryMatch(r.RegionName.ToLower())) | ||||||
|                     string cleanname = regionName.Replace("%", ""); |  | ||||||
|                     m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanname.ToLower(), r.RegionName.ToLower()); |  | ||||||
|                     if (r.RegionName.ToLower().Contains(cleanname.ToLower())) |  | ||||||
|                         ret.Add(r); |                         ret.Add(r); | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     if (r.RegionName.ToLower() == regionName.ToLower()) |  | ||||||
|                         ret.Add(r); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (ret.Count > 0) |             if (ret.Count > 0) | ||||||
|  |  | ||||||
|  | @ -181,7 +181,6 @@ namespace OpenSim.Framework.Capabilities | ||||||
| 
 | 
 | ||||||
|             RegisterRegionServiceHandlers(capsBase); |             RegisterRegionServiceHandlers(capsBase); | ||||||
|             RegisterInventoryServiceHandlers(capsBase); |             RegisterInventoryServiceHandlers(capsBase); | ||||||
| 
 |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void RegisterRegionServiceHandlers(string capsBase) |         public void RegisterRegionServiceHandlers(string capsBase) | ||||||
|  |  | ||||||
|  | @ -459,10 +459,17 @@ namespace OpenSim.Framework | ||||||
|         /// <param name="oldy">Old region y-coord</param> |         /// <param name="oldy">Old region y-coord</param> | ||||||
|         /// <param name="newy">New region y-coord</param> |         /// <param name="newy">New region y-coord</param> | ||||||
|         /// <returns></returns>         |         /// <returns></returns>         | ||||||
|         public static bool IsOutsideView(uint oldx, uint newx, uint oldy, uint newy) |         public static bool IsOutsideView(float drawdist, uint oldx, uint newx, uint oldy, uint newy) | ||||||
|         { |         { | ||||||
|             // Eventually this will be a function of the draw distance / camera position too. |             int dd = (int)((drawdist + Constants.RegionSize - 1) / Constants.RegionSize); | ||||||
|             return (((int)Math.Abs((int)(oldx - newx)) > 1) || ((int)Math.Abs((int)(oldy - newy)) > 1)); | 
 | ||||||
|  |             int startX = (int)oldx - dd; | ||||||
|  |             int startY = (int)oldy - dd; | ||||||
|  | 
 | ||||||
|  |             int endX = (int)oldx + dd; | ||||||
|  |             int endY = (int)oldy + dd; | ||||||
|  | 
 | ||||||
|  |             return (newx < startX || endX < newx || newy < startY || endY < newy); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public static string FieldToString(byte[] bytes) |         public static string FieldToString(byte[] bytes) | ||||||
|  |  | ||||||
|  | @ -845,7 +845,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | ||||||
| 
 | 
 | ||||||
|         private void HandleUseCircuitCode(object o) |         private void HandleUseCircuitCode(object o) | ||||||
|         { |         { | ||||||
|             DateTime startTime = DateTime.Now; | //            DateTime startTime = DateTime.Now; | ||||||
|             object[] array = (object[])o; |             object[] array = (object[])o; | ||||||
|             UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; |             UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; | ||||||
|             UseCircuitCodePacket packet = (UseCircuitCodePacket)array[1]; |             UseCircuitCodePacket packet = (UseCircuitCodePacket)array[1]; | ||||||
|  |  | ||||||
|  | @ -92,9 +92,9 @@ namespace Flotsam.RegionModules.AssetCache | ||||||
|         // Expiration is expressed in hours. |         // Expiration is expressed in hours. | ||||||
|         private const double m_DefaultMemoryExpiration = 1.0;  |         private const double m_DefaultMemoryExpiration = 1.0;  | ||||||
|         private const double m_DefaultFileExpiration = 48; |         private const double m_DefaultFileExpiration = 48; | ||||||
|         private TimeSpan m_MemoryExpiration = TimeSpan.Zero; |         private TimeSpan m_MemoryExpiration = TimeSpan.FromHours(m_DefaultMemoryExpiration); | ||||||
|         private TimeSpan m_FileExpiration = TimeSpan.Zero; |         private TimeSpan m_FileExpiration = TimeSpan.FromHours(m_DefaultFileExpiration); | ||||||
|         private TimeSpan m_FileExpirationCleanupTimer = TimeSpan.Zero; |         private TimeSpan m_FileExpirationCleanupTimer = TimeSpan.FromHours(m_DefaultFileExpiration); | ||||||
| 
 | 
 | ||||||
|         private static int m_CacheDirectoryTiers = 1; |         private static int m_CacheDirectoryTiers = 1; | ||||||
|         private static int m_CacheDirectoryTierLen = 3; |         private static int m_CacheDirectoryTierLen = 3; | ||||||
|  | @ -147,7 +147,7 @@ namespace Flotsam.RegionModules.AssetCache | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory); |                     m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory); | ||||||
|                     m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Cache Directory", m_DefaultCacheDirectory); |                     m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Cache Directory", m_CacheDirectory); | ||||||
| 
 | 
 | ||||||
|                     m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", false); |                     m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", false); | ||||||
|                     m_MemoryExpiration = TimeSpan.FromHours(assetConfig.GetDouble("MemoryCacheTimeout", m_DefaultMemoryExpiration)); |                     m_MemoryExpiration = TimeSpan.FromHours(assetConfig.GetDouble("MemoryCacheTimeout", m_DefaultMemoryExpiration)); | ||||||
|  | @ -245,16 +245,7 @@ namespace Flotsam.RegionModules.AssetCache | ||||||
|         private void UpdateMemoryCache(string key, AssetBase asset) |         private void UpdateMemoryCache(string key, AssetBase asset) | ||||||
|         { |         { | ||||||
|             if (m_MemoryCacheEnabled) |             if (m_MemoryCacheEnabled) | ||||||
|             { |                 m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration); | ||||||
|                 if (m_MemoryExpiration > TimeSpan.Zero) |  | ||||||
|                 { |  | ||||||
|                     m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration); |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     m_MemoryCache.AddOrUpdate(key, asset, Double.MaxValue); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void Cache(AssetBase asset) |         public void Cache(AssetBase asset) | ||||||
|  | @ -450,7 +441,7 @@ namespace Flotsam.RegionModules.AssetCache | ||||||
|         private void CleanupExpiredFiles(object source, ElapsedEventArgs e) |         private void CleanupExpiredFiles(object source, ElapsedEventArgs e) | ||||||
|         { |         { | ||||||
|             if (m_LogLevel >= 2) |             if (m_LogLevel >= 2) | ||||||
|                 m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Checking for expired files older then {0}.", m_FileExpiration.ToString()); |                 m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Checking for expired files older then {0}.", m_FileExpiration); | ||||||
| 
 | 
 | ||||||
|             // Purge all files last accessed prior to this point |             // Purge all files last accessed prior to this point | ||||||
|             DateTime purgeLine = DateTime.Now - m_FileExpiration; |             DateTime purgeLine = DateTime.Now - m_FileExpiration; | ||||||
|  |  | ||||||
|  | @ -167,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             m_log.InfoFormat("[AVFACTORY]: complete texture check for {0}", client.AgentId); |             m_log.DebugFormat("[AVFACTORY]: complete texture check for {0}", client.AgentId); | ||||||
| 
 | 
 | ||||||
|             // If we only found default textures, then the appearance is not cached |             // If we only found default textures, then the appearance is not cached | ||||||
|             return (defonly ? false : true); |             return (defonly ? false : true); | ||||||
|  |  | ||||||
|  | @ -318,7 +318,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
|                     agentCircuit.Id0 = currentAgentCircuit.Id0; |                     agentCircuit.Id0 = currentAgentCircuit.Id0; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) |                 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||||||
|                 { |                 { | ||||||
|                     // brand new agent, let's create a new caps seed |                     // brand new agent, let's create a new caps seed | ||||||
|                     agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |                     agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||||||
|  | @ -336,7 +336,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
|                 // OK, it got this agent. Let's close some child agents |                 // OK, it got this agent. Let's close some child agents | ||||||
|                 sp.CloseChildAgents(newRegionX, newRegionY); |                 sp.CloseChildAgents(newRegionX, newRegionY); | ||||||
|                 IClientIPEndpoint ipepClient;   |                 IClientIPEndpoint ipepClient;   | ||||||
|                 if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) |                 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||||||
|                 { |                 { | ||||||
|                     //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); |                     //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); | ||||||
|                     #region IP Translation for NAT |                     #region IP Translation for NAT | ||||||
|  | @ -447,7 +447,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
| 
 | 
 | ||||||
|                 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone |                 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | ||||||
| 
 | 
 | ||||||
|                 if (NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |                 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||||||
|                 { |                 { | ||||||
|                     Thread.Sleep(5000); |                     Thread.Sleep(5000); | ||||||
|                     sp.Close(); |                     sp.Close(); | ||||||
|  | @ -521,14 +521,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
|             return region; |             return region; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         protected virtual bool NeedsNewAgent(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY) |         protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY) | ||||||
|         { |         { | ||||||
|             return Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY); |             return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         protected virtual bool NeedsClosing(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) |         protected virtual bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) | ||||||
|         { |         { | ||||||
|             return Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY); |             return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) |         protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) | ||||||
|  | @ -1045,7 +1045,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
| 
 | 
 | ||||||
|             if (m_regionInfo != null) |             if (m_regionInfo != null) | ||||||
|             { |             { | ||||||
|                 neighbours = RequestNeighbours(sp.Scene, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); |                 neighbours = RequestNeighbours(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|  | @ -1272,8 +1272,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
|         /// <param name="pRegionLocX"></param> |         /// <param name="pRegionLocX"></param> | ||||||
|         /// <param name="pRegionLocY"></param> |         /// <param name="pRegionLocY"></param> | ||||||
|         /// <returns></returns>         |         /// <returns></returns>         | ||||||
|         protected List<GridRegion> RequestNeighbours(Scene pScene, uint pRegionLocX, uint pRegionLocY) |         protected List<GridRegion> RequestNeighbours(ScenePresence avatar, uint pRegionLocX, uint pRegionLocY) | ||||||
|         { |         { | ||||||
|  |             Scene pScene = avatar.Scene; | ||||||
|             RegionInfo m_regionInfo = pScene.RegionInfo; |             RegionInfo m_regionInfo = pScene.RegionInfo; | ||||||
| 
 | 
 | ||||||
|             Border[] northBorders = pScene.NorthBorders.ToArray(); |             Border[] northBorders = pScene.NorthBorders.ToArray(); | ||||||
|  | @ -1281,10 +1282,24 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
|             Border[] eastBorders = pScene.EastBorders.ToArray(); |             Border[] eastBorders = pScene.EastBorders.ToArray(); | ||||||
|             Border[] westBorders = pScene.WestBorders.ToArray(); |             Border[] westBorders = pScene.WestBorders.ToArray(); | ||||||
| 
 | 
 | ||||||
|             // Legacy one region.  Provided for simplicity while testing the all inclusive method in the else statement. |             // Leaving this as a "megaregions" computation vs "non-megaregions" computation; it isn't | ||||||
|  |             // clear what should be done with a "far view" given that megaregions already extended the | ||||||
|  |             // view to include everything in the megaregion | ||||||
|             if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1) |             if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1) | ||||||
|             { |             { | ||||||
|                 return pScene.GridService.GetNeighbours(m_regionInfo.ScopeID, m_regionInfo.RegionID); |                 int dd = avatar.DrawDistance < Constants.RegionSize ? (int)Constants.RegionSize : (int)avatar.DrawDistance; | ||||||
|  | 
 | ||||||
|  |                 int startX = (int)pRegionLocX * (int)Constants.RegionSize - dd + (int)(Constants.RegionSize/2); | ||||||
|  |                 int startY = (int)pRegionLocY * (int)Constants.RegionSize - dd + (int)(Constants.RegionSize/2); | ||||||
|  | 
 | ||||||
|  |                 int endX = (int)pRegionLocX * (int)Constants.RegionSize + dd + (int)(Constants.RegionSize/2); | ||||||
|  |                 int endY = (int)pRegionLocY * (int)Constants.RegionSize + dd + (int)(Constants.RegionSize/2); | ||||||
|  | 
 | ||||||
|  |                 List<GridRegion> neighbours = | ||||||
|  |                     avatar.Scene.GridService.GetRegionRange(m_regionInfo.ScopeID, startX, endX, startY, endY); | ||||||
|  | 
 | ||||||
|  |                 neighbours.RemoveAll(delegate(GridRegion r) { return r.RegionID == m_regionInfo.RegionID; }); | ||||||
|  |                 return neighbours; | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|  |  | ||||||
|  | @ -130,9 +130,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||||||
|             return region; |             return region; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         protected override bool NeedsClosing(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) |         protected override bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) | ||||||
|         { |         { | ||||||
|             if (base.NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |             if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||||||
|                 return true; |                 return true; | ||||||
| 
 | 
 | ||||||
|             int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); |             int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); | ||||||
|  |  | ||||||
|  | @ -148,6 +148,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | ||||||
|             InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |             InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||||||
|             item = m_Scene.InventoryService.GetItem(item); |             item = m_Scene.InventoryService.GetItem(item); | ||||||
| 
 | 
 | ||||||
|  |             if (item.Owner != remoteClient.AgentId) | ||||||
|  |                 return UUID.Zero; | ||||||
|  | 
 | ||||||
|             if (item != null) |             if (item != null) | ||||||
|             { |             { | ||||||
|                 if ((InventoryType)item.InvType == InventoryType.Notecard) |                 if ((InventoryType)item.InvType == InventoryType.Notecard) | ||||||
|  | @ -524,6 +527,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | ||||||
| 
 | 
 | ||||||
|             if (item != null) |             if (item != null) | ||||||
|             { |             { | ||||||
|  |                 item.Owner = remoteClient.AgentId; | ||||||
|  | 
 | ||||||
|                 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); |                 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); | ||||||
| 
 | 
 | ||||||
|                 if (rezAsset != null) |                 if (rezAsset != null) | ||||||
|  |  | ||||||
|  | @ -321,6 +321,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             // Passing something to another avatar or a an object will already |             // Passing something to another avatar or a an object will already | ||||||
|             InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |             InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||||||
|             item = InventoryService.GetItem(item); |             item = InventoryService.GetItem(item); | ||||||
|  |             if (item.Owner != remoteClient.AgentId) | ||||||
|  |                 return; | ||||||
| 
 | 
 | ||||||
|             if (item != null) |             if (item != null) | ||||||
|             { |             { | ||||||
|  |  | ||||||
|  | @ -83,6 +83,13 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         public bool m_useFlySlow; |         public bool m_useFlySlow; | ||||||
|         public bool m_usePreJump; |         public bool m_usePreJump; | ||||||
|         public bool m_seeIntoRegionFromNeighbor; |         public bool m_seeIntoRegionFromNeighbor; | ||||||
|  | 
 | ||||||
|  |         protected float m_defaultDrawDistance = 255.0f; | ||||||
|  |         public float DefaultDrawDistance  | ||||||
|  |         { | ||||||
|  |             get { return m_defaultDrawDistance; } | ||||||
|  |         } | ||||||
|  |          | ||||||
|         // TODO: need to figure out how allow client agents but deny |         // TODO: need to figure out how allow client agents but deny | ||||||
|         // root agents when ACL denies access to root agent |         // root agents when ACL denies access to root agent | ||||||
|         public bool m_strictAccessControl = true; |         public bool m_strictAccessControl = true; | ||||||
|  | @ -129,7 +136,16 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         protected ICapabilitiesModule m_capsModule; |         protected ICapabilitiesModule m_capsModule; | ||||||
|         // Central Update Loop |         // Central Update Loop | ||||||
|         protected int m_fps = 10; |         protected int m_fps = 10; | ||||||
|         protected uint m_frame; | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Current scene frame number | ||||||
|  |         /// </summary> | ||||||
|  |         public uint Frame | ||||||
|  |         { | ||||||
|  |             get; | ||||||
|  |             protected set; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         protected float m_timespan = 0.089f; |         protected float m_timespan = 0.089f; | ||||||
|         protected DateTime m_lastupdate = DateTime.UtcNow; |         protected DateTime m_lastupdate = DateTime.UtcNow; | ||||||
| 
 | 
 | ||||||
|  | @ -618,6 +634,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 // |                 // | ||||||
|                 IConfig startupConfig = m_config.Configs["Startup"]; |                 IConfig startupConfig = m_config.Configs["Startup"]; | ||||||
| 
 | 
 | ||||||
|  |                 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance); | ||||||
|  |                  | ||||||
|                 //Animation states |                 //Animation states | ||||||
|                 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); |                 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); | ||||||
|                 // TODO: Change default to true once the feature is supported |                 // TODO: Change default to true once the feature is supported | ||||||
|  | @ -1183,7 +1201,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
| 
 | 
 | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 Update(); |                 while (!shuttingdown) | ||||||
|  |                     Update(); | ||||||
| 
 | 
 | ||||||
|                 m_lastUpdate = Util.EnvironmentTickCount(); |                 m_lastUpdate = Util.EnvironmentTickCount(); | ||||||
|                 m_firstHeartbeat = false; |                 m_firstHeartbeat = false; | ||||||
|  | @ -1200,188 +1219,177 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             Watchdog.RemoveThread(); |             Watchdog.RemoveThread(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |  | ||||||
|         /// Performs per-frame updates on the scene, this should be the central scene loop |  | ||||||
|         /// </summary> |  | ||||||
|         public override void Update() |         public override void Update() | ||||||
|         {         |         {         | ||||||
|             float physicsFPS; |             TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; | ||||||
|             int maintc; |             float physicsFPS = 0f; | ||||||
| 
 | 
 | ||||||
|             while (!shuttingdown) |             int maintc = Util.EnvironmentTickCount(); | ||||||
|  |             int tmpFrameMS = maintc; | ||||||
|  |             tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; | ||||||
|  | 
 | ||||||
|  |             // Increment the frame counter | ||||||
|  |             ++Frame; | ||||||
|  | 
 | ||||||
|  |             try | ||||||
|             { |             { | ||||||
|                 TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; |                 // Check if any objects have reached their targets | ||||||
|                 physicsFPS = 0f; |                 CheckAtTargets(); | ||||||
| 
 | 
 | ||||||
|                 maintc = Util.EnvironmentTickCount(); |                 // Update SceneObjectGroups that have scheduled themselves for updates | ||||||
|                 int tmpFrameMS = maintc; |                 // Objects queue their updates onto all scene presences | ||||||
|                 tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; |                 if (Frame % m_update_objects == 0) | ||||||
|  |                     m_sceneGraph.UpdateObjectGroups(); | ||||||
| 
 | 
 | ||||||
|                 // Increment the frame counter |                 // Run through all ScenePresences looking for updates | ||||||
|                 ++m_frame; |                 // Presence updates and queued object updates for each presence are sent to clients | ||||||
|  |                 if (Frame % m_update_presences == 0) | ||||||
|  |                     m_sceneGraph.UpdatePresences(); | ||||||
| 
 | 
 | ||||||
|                 try |                 // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client) | ||||||
|  |                 if (Frame % m_update_coarse_locations == 0) | ||||||
|                 { |                 { | ||||||
|                     // Check if any objects have reached their targets |                     List<Vector3> coarseLocations; | ||||||
|                     CheckAtTargets(); |                     List<UUID> avatarUUIDs; | ||||||
| 
 |                     SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60); | ||||||
|                     // Update SceneObjectGroups that have scheduled themselves for updates |                     // Send coarse locations to clients  | ||||||
|                     // Objects queue their updates onto all scene presences |                     ForEachScenePresence(delegate(ScenePresence presence) | ||||||
|                     if (m_frame % m_update_objects == 0) |  | ||||||
|                         m_sceneGraph.UpdateObjectGroups(); |  | ||||||
| 
 |  | ||||||
|                     // Run through all ScenePresences looking for updates |  | ||||||
|                     // Presence updates and queued object updates for each presence are sent to clients |  | ||||||
|                     if (m_frame % m_update_presences == 0) |  | ||||||
|                         m_sceneGraph.UpdatePresences(); |  | ||||||
| 
 |  | ||||||
|                     // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client) |  | ||||||
|                     if (m_frame % m_update_coarse_locations == 0) |  | ||||||
|                     { |                     { | ||||||
|                         List<Vector3> coarseLocations; |                         presence.SendCoarseLocations(coarseLocations, avatarUUIDs); | ||||||
|                         List<UUID> avatarUUIDs; |                     }); | ||||||
|                         SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60); |                 } | ||||||
|                         // Send coarse locations to clients  | 
 | ||||||
|                         ForEachScenePresence(delegate(ScenePresence presence) |                 int tmpPhysicsMS2 = Util.EnvironmentTickCount(); | ||||||
|                         { |                 if ((Frame % m_update_physics == 0) && m_physics_enabled) | ||||||
|                             presence.SendCoarseLocations(coarseLocations, avatarUUIDs); |                     m_sceneGraph.UpdatePreparePhysics(); | ||||||
|                         }); |                 physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2); | ||||||
|  | 
 | ||||||
|  |                 // Apply any pending avatar force input to the avatar's velocity | ||||||
|  |                 if (Frame % m_update_entitymovement == 0) | ||||||
|  |                     m_sceneGraph.UpdateScenePresenceMovement(); | ||||||
|  | 
 | ||||||
|  |                 // Perform the main physics update.  This will do the actual work of moving objects and avatars according to their | ||||||
|  |                 // velocity | ||||||
|  |                 int tmpPhysicsMS = Util.EnvironmentTickCount(); | ||||||
|  |                 if (Frame % m_update_physics == 0) | ||||||
|  |                 { | ||||||
|  |                     if (m_physics_enabled) | ||||||
|  |                         physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_timespan)); | ||||||
|  |                     if (SynchronizeScene != null) | ||||||
|  |                         SynchronizeScene(this); | ||||||
|  |                 } | ||||||
|  |                 physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS); | ||||||
|  | 
 | ||||||
|  |                 // Delete temp-on-rez stuff | ||||||
|  |                 if (Frame % 1000 == 0 && !m_cleaningTemps) | ||||||
|  |                 { | ||||||
|  |                     int tmpTempOnRezMS = Util.EnvironmentTickCount(); | ||||||
|  |                     m_cleaningTemps = true; | ||||||
|  |                     Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false;  }); | ||||||
|  |                     tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if (RegionStatus != RegionStatus.SlaveScene) | ||||||
|  |                 { | ||||||
|  |                     if (Frame % m_update_events == 0) | ||||||
|  |                     { | ||||||
|  |                         int evMS = Util.EnvironmentTickCount(); | ||||||
|  |                         UpdateEvents(); | ||||||
|  |                         eventMS = Util.EnvironmentTickCountSubtract(evMS); ; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     int tmpPhysicsMS2 = Util.EnvironmentTickCount(); |                     if (Frame % m_update_backup == 0) | ||||||
|                     if ((m_frame % m_update_physics == 0) && m_physics_enabled) |  | ||||||
|                         m_sceneGraph.UpdatePreparePhysics(); |  | ||||||
|                     physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2); |  | ||||||
| 
 |  | ||||||
|                     // Apply any pending avatar force input to the avatar's velocity |  | ||||||
|                     if (m_frame % m_update_entitymovement == 0) |  | ||||||
|                         m_sceneGraph.UpdateScenePresenceMovement(); |  | ||||||
| 
 |  | ||||||
|                     // Perform the main physics update.  This will do the actual work of moving objects and avatars according to their |  | ||||||
|                     // velocity |  | ||||||
|                     int tmpPhysicsMS = Util.EnvironmentTickCount(); |  | ||||||
|                     if (m_frame % m_update_physics == 0) |  | ||||||
|                     { |                     { | ||||||
|                         if (m_physics_enabled) |                         int backMS = Util.EnvironmentTickCount(); | ||||||
|                             physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_timespan)); |                         UpdateStorageBackup(); | ||||||
|                         if (SynchronizeScene != null) |                         backupMS = Util.EnvironmentTickCountSubtract(backMS); | ||||||
|                             SynchronizeScene(this); |  | ||||||
|                     } |  | ||||||
|                     physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS); |  | ||||||
| 
 |  | ||||||
|                     // Delete temp-on-rez stuff |  | ||||||
|                     if (m_frame % 1000 == 0 && !m_cleaningTemps) |  | ||||||
|                     { |  | ||||||
|                         int tmpTempOnRezMS = Util.EnvironmentTickCount(); |  | ||||||
|                         m_cleaningTemps = true; |  | ||||||
|                         Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false;  }); |  | ||||||
|                         tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); |  | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     if (RegionStatus != RegionStatus.SlaveScene) |                     if (Frame % m_update_terrain == 0) | ||||||
|                     { |                     { | ||||||
|                         if (m_frame % m_update_events == 0) |                         int terMS = Util.EnvironmentTickCount(); | ||||||
|                         { |                         UpdateTerrain(); | ||||||
|                             int evMS = Util.EnvironmentTickCount(); |                         terrainMS = Util.EnvironmentTickCountSubtract(terMS); | ||||||
|                             UpdateEvents(); |  | ||||||
|                             eventMS = Util.EnvironmentTickCountSubtract(evMS); ; |  | ||||||
|                         } |  | ||||||
| 
 |  | ||||||
|                         if (m_frame % m_update_backup == 0) |  | ||||||
|                         { |  | ||||||
|                             int backMS = Util.EnvironmentTickCount(); |  | ||||||
|                             UpdateStorageBackup(); |  | ||||||
|                             backupMS = Util.EnvironmentTickCountSubtract(backMS); |  | ||||||
|                         } |  | ||||||
| 
 |  | ||||||
|                         if (m_frame % m_update_terrain == 0) |  | ||||||
|                         { |  | ||||||
|                             int terMS = Util.EnvironmentTickCount(); |  | ||||||
|                             UpdateTerrain(); |  | ||||||
|                             terrainMS = Util.EnvironmentTickCountSubtract(terMS); |  | ||||||
|                         } |  | ||||||
| 
 |  | ||||||
|                         //if (m_frame % m_update_land == 0) |  | ||||||
|                         //{ |  | ||||||
|                         //    int ldMS = Util.EnvironmentTickCount(); |  | ||||||
|                         //    UpdateLand(); |  | ||||||
|                         //    landMS = Util.EnvironmentTickCountSubtract(ldMS); |  | ||||||
|                         //} |  | ||||||
| 
 |  | ||||||
|                         frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); |  | ||||||
|                         otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; |  | ||||||
|                         lastCompletedFrame = Util.EnvironmentTickCount(); |  | ||||||
| 
 |  | ||||||
|                         // if (m_frame%m_update_avatars == 0) |  | ||||||
|                         //   UpdateInWorldTime(); |  | ||||||
|                         StatsReporter.AddPhysicsFPS(physicsFPS); |  | ||||||
|                         StatsReporter.AddTimeDilation(TimeDilation); |  | ||||||
|                         StatsReporter.AddFPS(1); |  | ||||||
|                         StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); |  | ||||||
|                         StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); |  | ||||||
|                         StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); |  | ||||||
|                         StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); |  | ||||||
|                         StatsReporter.addFrameMS(frameMS); |  | ||||||
|                         StatsReporter.addPhysicsMS(physicsMS + physicsMS2); |  | ||||||
|                         StatsReporter.addOtherMS(otherMS); |  | ||||||
|                         StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); |  | ||||||
|                         StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); |  | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     if (LoginsDisabled && m_frame == 20) |                     //if (Frame % m_update_land == 0) | ||||||
|                     { |                     //{ | ||||||
|                         // In 99.9% of cases it is a bad idea to manually force garbage collection. However, |                     //    int ldMS = Util.EnvironmentTickCount(); | ||||||
|                         // this is a rare case where we know we have just went through a long cycle of heap |                     //    UpdateLand(); | ||||||
|                         // allocations, and there is no more work to be done until someone logs in |                     //    landMS = Util.EnvironmentTickCountSubtract(ldMS); | ||||||
|                         GC.Collect(); |                     //} | ||||||
| 
 | 
 | ||||||
|                         IConfig startupConfig = m_config.Configs["Startup"]; |                     frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); | ||||||
|                         if (startupConfig == null || !startupConfig.GetBoolean("StartDisabled", false)) |                     otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; | ||||||
|                         { |                     lastCompletedFrame = Util.EnvironmentTickCount(); | ||||||
|                             m_log.DebugFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); | 
 | ||||||
|                             LoginsDisabled = false; |                     // if (Frame%m_update_avatars == 0) | ||||||
|                             m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo); |                     //   UpdateInWorldTime(); | ||||||
|                         } |                     StatsReporter.AddPhysicsFPS(physicsFPS); | ||||||
|  |                     StatsReporter.AddTimeDilation(TimeDilation); | ||||||
|  |                     StatsReporter.AddFPS(1); | ||||||
|  |                     StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); | ||||||
|  |                     StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); | ||||||
|  |                     StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); | ||||||
|  |                     StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); | ||||||
|  |                     StatsReporter.addFrameMS(frameMS); | ||||||
|  |                     StatsReporter.addPhysicsMS(physicsMS + physicsMS2); | ||||||
|  |                     StatsReporter.addOtherMS(otherMS); | ||||||
|  |                     StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); | ||||||
|  |                     StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if (LoginsDisabled && Frame == 20) | ||||||
|  |                 { | ||||||
|  |                     // In 99.9% of cases it is a bad idea to manually force garbage collection. However, | ||||||
|  |                     // this is a rare case where we know we have just went through a long cycle of heap | ||||||
|  |                     // allocations, and there is no more work to be done until someone logs in | ||||||
|  |                     GC.Collect(); | ||||||
|  | 
 | ||||||
|  |                     IConfig startupConfig = m_config.Configs["Startup"]; | ||||||
|  |                     if (startupConfig == null || !startupConfig.GetBoolean("StartDisabled", false)) | ||||||
|  |                     { | ||||||
|  |                         m_log.DebugFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); | ||||||
|  |                         LoginsDisabled = false; | ||||||
|  |                         m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 catch (NotImplementedException) |  | ||||||
|                 { |  | ||||||
|                     throw; |  | ||||||
|                 } |  | ||||||
|                 catch (AccessViolationException e) |  | ||||||
|                 { |  | ||||||
|                     m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); |  | ||||||
|                 } |  | ||||||
|                 //catch (NullReferenceException e) |  | ||||||
|                 //{ |  | ||||||
|                 //   m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); |  | ||||||
|                 //} |  | ||||||
|                 catch (InvalidOperationException e) |  | ||||||
|                 { |  | ||||||
|                     m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); |  | ||||||
|                 } |  | ||||||
|                 catch (Exception e) |  | ||||||
|                 { |  | ||||||
|                     m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); |  | ||||||
|                 } |  | ||||||
|                 finally |  | ||||||
|                 { |  | ||||||
|                     m_lastupdate = DateTime.UtcNow; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 maintc = Util.EnvironmentTickCountSubtract(maintc); |  | ||||||
|                 maintc = (int)(m_timespan * 1000) - maintc; |  | ||||||
| 
 |  | ||||||
|                 if (maintc > 0) |  | ||||||
|                     Thread.Sleep(maintc); |  | ||||||
| 
 |  | ||||||
|                 // Tell the watchdog that this thread is still alive |  | ||||||
|                 Watchdog.UpdateThread(); |  | ||||||
|             } |             } | ||||||
|  |             catch (NotImplementedException) | ||||||
|  |             { | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |             catch (AccessViolationException e) | ||||||
|  |             { | ||||||
|  |                 m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); | ||||||
|  |             } | ||||||
|  |             //catch (NullReferenceException e) | ||||||
|  |             //{ | ||||||
|  |             //   m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); | ||||||
|  |             //} | ||||||
|  |             catch (InvalidOperationException e) | ||||||
|  |             { | ||||||
|  |                 m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); | ||||||
|  |             } | ||||||
|  |             catch (Exception e) | ||||||
|  |             { | ||||||
|  |                 m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); | ||||||
|  |             } | ||||||
|  |             finally | ||||||
|  |             { | ||||||
|  |                 m_lastupdate = DateTime.UtcNow; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             maintc = Util.EnvironmentTickCountSubtract(maintc); | ||||||
|  |             maintc = (int)(m_timespan * 1000) - maintc; | ||||||
|  | 
 | ||||||
|  |             if (maintc > 0) | ||||||
|  |                 Thread.Sleep(maintc); | ||||||
|  | 
 | ||||||
|  |             // Tell the watchdog that this thread is still alive | ||||||
|  |             Watchdog.UpdateThread(); | ||||||
|         }         |         }         | ||||||
| 
 | 
 | ||||||
|          |  | ||||||
| 
 |  | ||||||
|         public void AddGroupTarget(SceneObjectGroup grp) |         public void AddGroupTarget(SceneObjectGroup grp) | ||||||
|         { |         { | ||||||
|             lock (m_groupsWithTargets) |             lock (m_groupsWithTargets) | ||||||
|  | @ -3011,7 +3019,9 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                         (childagentYN ? "child" : "root"), agentID, RegionInfo.RegionName); |                         (childagentYN ? "child" : "root"), agentID, RegionInfo.RegionName); | ||||||
| 
 | 
 | ||||||
|                     m_sceneGraph.removeUserCount(!childagentYN); |                     m_sceneGraph.removeUserCount(!childagentYN); | ||||||
|                     CapsModule.RemoveCapsHandler(agentID); |                      | ||||||
|  |                     if (CapsModule != null) | ||||||
|  |                         CapsModule.RemoveCapsHandler(agentID); | ||||||
| 
 | 
 | ||||||
|                     // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever |                     // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever | ||||||
|                     // this method is doing is HORRIBLE!!! |                     // this method is doing is HORRIBLE!!! | ||||||
|  | @ -3200,7 +3210,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport |             // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport | ||||||
| 
 | 
 | ||||||
|             // Don't disable this log message - it's too helpful |             // Don't disable this log message - it's too helpful | ||||||
|             m_log.InfoFormat( |             m_log.DebugFormat( | ||||||
|                 "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})", |                 "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})", | ||||||
|                 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, |                 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | ||||||
|                 agent.AgentID, agent.circuitcode, teleportFlags); |                 agent.AgentID, agent.circuitcode, teleportFlags); | ||||||
|  | @ -3266,8 +3276,11 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                     RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, |                     RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | ||||||
|                     agent.AgentID, agent.circuitcode); |                     agent.AgentID, agent.circuitcode); | ||||||
| 
 | 
 | ||||||
|                 CapsModule.NewUserConnection(agent); |                 if (CapsModule != null) | ||||||
|                 CapsModule.AddCapsHandler(agent.AgentID); |                 { | ||||||
|  |                     CapsModule.NewUserConnection(agent); | ||||||
|  |                     CapsModule.AddCapsHandler(agent.AgentID); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|  | @ -3282,7 +3295,9 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                         agent.AgentID, RegionInfo.RegionName); |                         agent.AgentID, RegionInfo.RegionName); | ||||||
| 
 | 
 | ||||||
|                     sp.AdjustKnownSeeds(); |                     sp.AdjustKnownSeeds(); | ||||||
|                     CapsModule.NewUserConnection(agent); |                      | ||||||
|  |                     if (CapsModule != null) | ||||||
|  |                         CapsModule.NewUserConnection(agent); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -204,9 +204,10 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             for (int i = 0; i < Math.Min(presences.Count, maxLocations); ++i) |             for (int i = 0; i < Math.Min(presences.Count, maxLocations); ++i) | ||||||
|             { |             { | ||||||
|                 ScenePresence sp = presences[i]; |                 ScenePresence sp = presences[i]; | ||||||
|  |                  | ||||||
|                 // If this presence is a child agent, we don't want its coarse locations |                 // If this presence is a child agent, we don't want its coarse locations | ||||||
|                 if (sp.IsChildAgent) |                 if (sp.IsChildAgent) | ||||||
|                     return; |                     continue; | ||||||
| 
 | 
 | ||||||
|                 if (sp.ParentID != 0) |                 if (sp.ParentID != 0) | ||||||
|                 { |                 { | ||||||
|  |  | ||||||
|  | @ -626,7 +626,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 Utils.LongToUInts(handle, out x, out y); |                 Utils.LongToUInts(handle, out x, out y); | ||||||
|                 x = x / Constants.RegionSize; |                 x = x / Constants.RegionSize; | ||||||
|                 y = y / Constants.RegionSize; |                 y = y / Constants.RegionSize; | ||||||
|                 if (Util.IsOutsideView(x, Scene.RegionInfo.RegionLocX, y, Scene.RegionInfo.RegionLocY)) |                 if (Util.IsOutsideView(DrawDistance, x, Scene.RegionInfo.RegionLocX, y, Scene.RegionInfo.RegionLocY)) | ||||||
|                 { |                 { | ||||||
|                     old.Add(handle); |                     old.Add(handle); | ||||||
|                 } |                 } | ||||||
|  | @ -700,6 +700,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|          |          | ||||||
|         private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this() |         private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this() | ||||||
|         { |         { | ||||||
|  |             m_DrawDistance = world.DefaultDrawDistance; | ||||||
|             m_rootRegionHandle = reginfo.RegionHandle; |             m_rootRegionHandle = reginfo.RegionHandle; | ||||||
|             m_controllingClient = client; |             m_controllingClient = client; | ||||||
|             m_firstname = m_controllingClient.FirstName; |             m_firstname = m_controllingClient.FirstName; | ||||||
|  | @ -1161,7 +1162,9 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 if (m_agentTransfer != null) |                 if (m_agentTransfer != null) | ||||||
|                     m_agentTransfer.EnableChildAgents(this); |                     m_agentTransfer.EnableChildAgents(this); | ||||||
|                 else |                 else | ||||||
|                     m_log.DebugFormat("[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active"); |                     m_log.DebugFormat( | ||||||
|  |                         "[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active for region {0}",  | ||||||
|  |                         m_scene.RegionInfo.RegionName); | ||||||
| 
 | 
 | ||||||
|                 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); |                 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | ||||||
|                 if (friendsModule != null) |                 if (friendsModule != null) | ||||||
|  | @ -1277,7 +1280,11 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             m_CameraUpAxis = agentData.CameraUpAxis; |             m_CameraUpAxis = agentData.CameraUpAxis; | ||||||
| 
 | 
 | ||||||
|             // The Agent's Draw distance setting |             // The Agent's Draw distance setting | ||||||
|             m_DrawDistance = agentData.Far; |             // When we get to the point of re-computing neighbors everytime this | ||||||
|  |             // changes, then start using the agent's drawdistance rather than the  | ||||||
|  |             // region's draw distance. | ||||||
|  |             // m_DrawDistance = agentData.Far; | ||||||
|  |             m_DrawDistance = Scene.DefaultDrawDistance; | ||||||
| 
 | 
 | ||||||
|             // Check if Client has camera in 'follow cam' or 'build' mode. |             // Check if Client has camera in 'follow cam' or 'build' mode. | ||||||
|             Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); |             Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); | ||||||
|  | @ -2435,7 +2442,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             // If we are using the the cached appearance then send it out to everyone |             // If we are using the the cached appearance then send it out to everyone | ||||||
|             if (cachedappearance) |             if (cachedappearance) | ||||||
|             { |             { | ||||||
|                 m_log.InfoFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name); |                 m_log.DebugFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name); | ||||||
| 
 | 
 | ||||||
|                 // If the avatars baked textures are all in the cache, then we have a  |                 // If the avatars baked textures are all in the cache, then we have a  | ||||||
|                 // complete appearance... send it out, if not, then we'll send it when |                 // complete appearance... send it out, if not, then we'll send it when | ||||||
|  | @ -2652,8 +2659,11 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         #region Border Crossing Methods |         #region Border Crossing Methods | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Checks to see if the avatar is in range of a border and calls CrossToNewRegion |         /// Starts the process of moving an avatar into another region if they are crossing the border. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  |         /// <remarks> | ||||||
|  |         /// Also removes the avatar from the physical scene if transit has started. | ||||||
|  |         /// </remarks> | ||||||
|         protected void CheckForBorderCrossing() |         protected void CheckForBorderCrossing() | ||||||
|         { |         { | ||||||
|             if (IsChildAgent) |             if (IsChildAgent) | ||||||
|  | @ -2721,7 +2731,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                     neighbor = HaveNeighbor(Cardinals.N, ref fix); |                     neighbor = HaveNeighbor(Cardinals.N, ref fix); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|                 // Makes sure avatar does not end up outside region |                 // Makes sure avatar does not end up outside region | ||||||
|                 if (neighbor <= 0) |                 if (neighbor <= 0) | ||||||
|                 { |                 { | ||||||
|  | @ -2776,6 +2785,13 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|  |                 // We must remove the agent from the physical scene if it has been placed in transit.  If we don't, | ||||||
|  |                 // then this method continues to be called from ScenePresence.Update() until the handover of the client between | ||||||
|  |                 // regions is completed.  Since this handover can take more than 1000ms (due to the 1000ms | ||||||
|  |                 // event queue polling response from the server), this results in the avatar pausing on the border | ||||||
|  |                 // for the handover period. | ||||||
|  |                 RemoveFromPhysicalScene(); | ||||||
|  |                  | ||||||
|                 // This constant has been inferred from experimentation |                 // This constant has been inferred from experimentation | ||||||
|                 // I'm not sure what this value should be, so I tried a few values. |                 // I'm not sure what this value should be, so I tried a few values. | ||||||
|                 timeStep = 0.04f; |                 timeStep = 0.04f; | ||||||
|  | @ -2787,6 +2803,15 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Checks whether this region has a neighbour in the given direction. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="car"></param> | ||||||
|  |         /// <param name="fix"></param> | ||||||
|  |         /// <returns> | ||||||
|  |         /// An integer which represents a compass point.  N == 1, going clockwise until we reach NW == 8. | ||||||
|  |         /// Returns a positive integer if there is a region in that direction, a negative integer if not. | ||||||
|  |         /// </returns> | ||||||
|         protected int HaveNeighbor(Cardinals car, ref int[] fix) |         protected int HaveNeighbor(Cardinals car, ref int[] fix) | ||||||
|         { |         { | ||||||
|             uint neighbourx = m_regionInfo.RegionLocX; |             uint neighbourx = m_regionInfo.RegionLocX; | ||||||
|  | @ -2893,7 +2918,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
| 
 | 
 | ||||||
|                         //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); |                         //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); | ||||||
|                         //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); |                         //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); | ||||||
|                         if (Util.IsOutsideView(x, newRegionX, y, newRegionY)) |                         if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY)) | ||||||
|                         { |                         { | ||||||
|                             byebyeRegions.Add(handle); |                             byebyeRegions.Add(handle); | ||||||
|                         } |                         } | ||||||
|  | @ -2969,7 +2994,12 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
| 
 | 
 | ||||||
|             Vector3 offset = new Vector3(shiftx, shifty, 0f); |             Vector3 offset = new Vector3(shiftx, shifty, 0f); | ||||||
| 
 | 
 | ||||||
|             m_DrawDistance = cAgentData.Far; |             // When we get to the point of re-computing neighbors everytime this | ||||||
|  |             // changes, then start using the agent's drawdistance rather than the  | ||||||
|  |             // region's draw distance. | ||||||
|  |             // m_DrawDistance = cAgentData.Far; | ||||||
|  |             m_DrawDistance = Scene.DefaultDrawDistance; | ||||||
|  |              | ||||||
|             if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!! |             if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!! | ||||||
|                 m_pos = cAgentData.Position + offset; |                 m_pos = cAgentData.Position + offset; | ||||||
| 
 | 
 | ||||||
|  | @ -3119,7 +3149,11 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             m_CameraLeftAxis = cAgent.LeftAxis; |             m_CameraLeftAxis = cAgent.LeftAxis; | ||||||
|             m_CameraUpAxis = cAgent.UpAxis; |             m_CameraUpAxis = cAgent.UpAxis; | ||||||
| 
 | 
 | ||||||
|             m_DrawDistance = cAgent.Far; |             // When we get to the point of re-computing neighbors everytime this | ||||||
|  |             // changes, then start using the agent's drawdistance rather than the  | ||||||
|  |             // region's draw distance. | ||||||
|  |             // m_DrawDistance = cAgent.Far; | ||||||
|  |             m_DrawDistance = Scene.DefaultDrawDistance; | ||||||
| 
 | 
 | ||||||
|             if ((cAgent.Throttles != null) && cAgent.Throttles.Length > 0) |             if ((cAgent.Throttles != null) && cAgent.Throttles.Length > 0) | ||||||
|                 ControllingClient.SetChildAgentThrottle(cAgent.Throttles); |                 ControllingClient.SetChildAgentThrottle(cAgent.Throttles); | ||||||
|  |  | ||||||
|  | @ -0,0 +1,174 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) Contributors, http://opensimulator.org/ | ||||||
|  |  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  *     * Redistributions of source code must retain the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer. | ||||||
|  |  *     * Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *       documentation and/or other materials provided with the distribution. | ||||||
|  |  *     * Neither the name of the OpenSimulator Project nor the | ||||||
|  |  *       names of its contributors may be used to endorse or promote products | ||||||
|  |  *       derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Timers; | ||||||
|  | using Timer=System.Timers.Timer; | ||||||
|  | using Nini.Config; | ||||||
|  | using NUnit.Framework; | ||||||
|  | using NUnit.Framework.SyntaxHelpers; | ||||||
|  | using OpenMetaverse; | ||||||
|  | using OpenSim.Framework; | ||||||
|  | using OpenSim.Framework.Communications; | ||||||
|  | using OpenSim.Region.Framework.Scenes; | ||||||
|  | using OpenSim.Region.Framework.Interfaces; | ||||||
|  | using OpenSim.Region.CoreModules.World.Serialiser; | ||||||
|  | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | ||||||
|  | using OpenSim.Tests.Common; | ||||||
|  | using OpenSim.Tests.Common.Mock; | ||||||
|  | using OpenSim.Tests.Common.Setup; | ||||||
|  | 
 | ||||||
|  | namespace OpenSim.Region.Framework.Scenes.Tests | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Attachment tests | ||||||
|  |     /// </summary> | ||||||
|  |     [TestFixture] | ||||||
|  |     public class AttachmentTests | ||||||
|  |     { | ||||||
|  |         public Scene scene, scene2; | ||||||
|  |         public UUID agent1; | ||||||
|  |         public static Random random; | ||||||
|  |         public ulong region1, region2; | ||||||
|  |         public AgentCircuitData acd1; | ||||||
|  |         public SceneObjectGroup sog1, sog2, sog3; | ||||||
|  | 
 | ||||||
|  |         [TestFixtureSetUp] | ||||||
|  |         public void Init() | ||||||
|  |         { | ||||||
|  |             TestHelper.InMethod(); | ||||||
|  |              | ||||||
|  |             scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); | ||||||
|  |             scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); | ||||||
|  | 
 | ||||||
|  |             ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); | ||||||
|  |             interregionComms.Initialise(new IniConfigSource()); | ||||||
|  |             interregionComms.PostInitialise(); | ||||||
|  |             SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); | ||||||
|  |             SceneSetupHelpers.SetupSceneModules(scene2, new IniConfigSource(), interregionComms); | ||||||
|  | 
 | ||||||
|  |             agent1 = UUID.Random(); | ||||||
|  |             random = new Random(); | ||||||
|  |             sog1 = NewSOG(UUID.Random(), scene, agent1); | ||||||
|  |             sog2 = NewSOG(UUID.Random(), scene, agent1); | ||||||
|  |             sog3 = NewSOG(UUID.Random(), scene, agent1); | ||||||
|  | 
 | ||||||
|  |             //ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); | ||||||
|  |             region1 = scene.RegionInfo.RegionHandle; | ||||||
|  |             region2 = scene2.RegionInfo.RegionHandle; | ||||||
|  |              | ||||||
|  |             SceneSetupHelpers.AddRootAgent(scene, agent1); | ||||||
|  |         }      | ||||||
|  |          | ||||||
|  |         [Test] | ||||||
|  |         public void T030_TestAddAttachments() | ||||||
|  |         { | ||||||
|  |             TestHelper.InMethod(); | ||||||
|  | 
 | ||||||
|  |             ScenePresence presence = scene.GetScenePresence(agent1); | ||||||
|  | 
 | ||||||
|  |             presence.AddAttachment(sog1); | ||||||
|  |             presence.AddAttachment(sog2); | ||||||
|  |             presence.AddAttachment(sog3); | ||||||
|  | 
 | ||||||
|  |             Assert.That(presence.HasAttachments(), Is.True); | ||||||
|  |             Assert.That(presence.ValidateAttachments(), Is.True); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void T031_RemoveAttachments() | ||||||
|  |         { | ||||||
|  |             TestHelper.InMethod(); | ||||||
|  | 
 | ||||||
|  |             ScenePresence presence = scene.GetScenePresence(agent1); | ||||||
|  |             presence.RemoveAttachment(sog1); | ||||||
|  |             presence.RemoveAttachment(sog2); | ||||||
|  |             presence.RemoveAttachment(sog3); | ||||||
|  |             Assert.That(presence.HasAttachments(), Is.False); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // I'm commenting this test because scene setup NEEDS InventoryService to  | ||||||
|  |         // be non-null | ||||||
|  |         //[Test] | ||||||
|  |         public void T032_CrossAttachments() | ||||||
|  |         { | ||||||
|  |             TestHelper.InMethod(); | ||||||
|  | 
 | ||||||
|  |             ScenePresence presence = scene.GetScenePresence(agent1); | ||||||
|  |             ScenePresence presence2 = scene2.GetScenePresence(agent1); | ||||||
|  |             presence2.AddAttachment(sog1); | ||||||
|  |             presence2.AddAttachment(sog2); | ||||||
|  | 
 | ||||||
|  |             ISharedRegionModule serialiser = new SerialiserModule(); | ||||||
|  |             SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), serialiser); | ||||||
|  |             SceneSetupHelpers.SetupSceneModules(scene2, new IniConfigSource(), serialiser); | ||||||
|  | 
 | ||||||
|  |             Assert.That(presence.HasAttachments(), Is.False, "Presence has attachments before cross"); | ||||||
|  | 
 | ||||||
|  |             //Assert.That(presence2.CrossAttachmentsIntoNewRegion(region1, true), Is.True, "Cross was not successful"); | ||||||
|  |             Assert.That(presence2.HasAttachments(), Is.False, "Presence2 objects were not deleted"); | ||||||
|  |             Assert.That(presence.HasAttachments(), Is.True, "Presence has not received new objects"); | ||||||
|  |         }    | ||||||
|  |          | ||||||
|  |         private SceneObjectGroup NewSOG(UUID uuid, Scene scene, UUID agent) | ||||||
|  |         { | ||||||
|  |             SceneObjectPart sop = new SceneObjectPart(); | ||||||
|  |             sop.Name = RandomName(); | ||||||
|  |             sop.Description = RandomName(); | ||||||
|  |             sop.Text = RandomName(); | ||||||
|  |             sop.SitName = RandomName(); | ||||||
|  |             sop.TouchName = RandomName(); | ||||||
|  |             sop.UUID = uuid; | ||||||
|  |             sop.Shape = PrimitiveBaseShape.Default; | ||||||
|  |             sop.Shape.State = 1; | ||||||
|  |             sop.OwnerID = agent; | ||||||
|  | 
 | ||||||
|  |             SceneObjectGroup sog = new SceneObjectGroup(sop); | ||||||
|  |             sog.SetScene(scene); | ||||||
|  | 
 | ||||||
|  |             return sog; | ||||||
|  |         }         | ||||||
|  |          | ||||||
|  |         private static string RandomName() | ||||||
|  |         { | ||||||
|  |             StringBuilder name = new StringBuilder(); | ||||||
|  |             int size = random.Next(5,12); | ||||||
|  |             char ch; | ||||||
|  |             for (int i = 0; i < size; i++) | ||||||
|  |             { | ||||||
|  |                 ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ; | ||||||
|  |                 name.Append(ch); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return name.ToString(); | ||||||
|  |         }         | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -40,6 +40,7 @@ using OpenSim.Framework; | ||||||
| using OpenSim.Framework.Communications; | using OpenSim.Framework.Communications; | ||||||
| using OpenSim.Region.Framework.Scenes; | using OpenSim.Region.Framework.Scenes; | ||||||
| using OpenSim.Region.Framework.Interfaces; | using OpenSim.Region.Framework.Interfaces; | ||||||
|  | using OpenSim.Region.CoreModules.Framework.EntityTransfer; | ||||||
| using OpenSim.Region.CoreModules.World.Serialiser; | using OpenSim.Region.CoreModules.World.Serialiser; | ||||||
| using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | ||||||
| using OpenSim.Tests.Common; | using OpenSim.Tests.Common; | ||||||
|  | @ -116,9 +117,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | ||||||
|             agent.ChildrenCapSeeds = new Dictionary<ulong, string>(); |             agent.ChildrenCapSeeds = new Dictionary<ulong, string>(); | ||||||
|             agent.child = true; |             agent.child = true; | ||||||
| 
 | 
 | ||||||
|             if (scene.PresenceService == null) |  | ||||||
|                 Console.WriteLine("Presence Service is null"); |  | ||||||
| 
 |  | ||||||
|             scene.PresenceService.LoginAgent(agent.AgentID.ToString(), agent.SessionID, agent.SecureSessionID); |             scene.PresenceService.LoginAgent(agent.AgentID.ToString(), agent.SessionID, agent.SecureSessionID); | ||||||
| 
 | 
 | ||||||
|             string reason; |             string reason; | ||||||
|  | @ -176,25 +174,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | ||||||
|             Assert.That(neighbours.Count, Is.EqualTo(2)); |             Assert.That(neighbours.Count, Is.EqualTo(2)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void fixNullPresence() |  | ||||||
|         { |  | ||||||
|             string firstName = "testfirstname"; |  | ||||||
| 
 |  | ||||||
|             AgentCircuitData agent = new AgentCircuitData(); |  | ||||||
|             agent.AgentID = agent1; |  | ||||||
|             agent.firstname = firstName; |  | ||||||
|             agent.lastname = "testlastname"; |  | ||||||
|             agent.SessionID = UUID.Zero; |  | ||||||
|             agent.SecureSessionID = UUID.Zero; |  | ||||||
|             agent.circuitcode = 123; |  | ||||||
|             agent.BaseFolder = UUID.Zero; |  | ||||||
|             agent.InventoryFolder = UUID.Zero; |  | ||||||
|             agent.startpos = Vector3.Zero; |  | ||||||
|             agent.CapsPath = GetRandomCapsObjectPath(); |  | ||||||
| 
 |  | ||||||
|             acd1 = agent; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         [Test] |         [Test] | ||||||
|         public void T013_TestRemoveNeighbourRegion() |         public void T013_TestRemoveNeighbourRegion() | ||||||
|         { |         { | ||||||
|  | @ -212,23 +191,35 @@ namespace OpenSim.Region.Framework.Scenes.Tests | ||||||
|             */ |             */ | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         // I'm commenting this test, because this is not supposed to happen here |         /// <summary> | ||||||
|         //[Test] |         /// Test that if a root agent logs into a region, a child agent is also established in the neighbouring region | ||||||
|         public void T020_TestMakeRootAgent() |         /// </summary> | ||||||
|  |         /// <remarks> | ||||||
|  |         /// Please note that unlike the other tests here, this doesn't rely on structures | ||||||
|  |         /// </remarks> | ||||||
|  |         [Test] | ||||||
|  |         public void TestChildAgentEstablished() | ||||||
|         { |         { | ||||||
|             TestHelper.InMethod(); |             TestHelper.InMethod(); | ||||||
|  | //            log4net.Config.XmlConfigurator.Configure(); | ||||||
|              |              | ||||||
|             ScenePresence presence = scene.GetScenePresence(agent1); |             UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); | ||||||
|             Assert.That(presence.IsChildAgent, Is.False, "Starts out as a root agent"); |  | ||||||
|              |              | ||||||
|             presence.MakeChildAgent(); |             TestScene myScene1 = SceneSetupHelpers.SetupScene("Neighbour y", UUID.Random(), 1000, 1000); | ||||||
|             Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent"); |             TestScene myScene2 = SceneSetupHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000);             | ||||||
|              |              | ||||||
|             // Accepts 0 but rejects Constants.RegionSize |             IConfigSource configSource = new IniConfigSource(); | ||||||
|             Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0); |             configSource.AddConfig("Modules").Set("EntityTransferModule", "BasicEntityTransferModule");                       | ||||||
|             presence.MakeRootAgent(pos,true); |             EntityTransferModule etm = new EntityTransferModule(); | ||||||
|             Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent"); |              | ||||||
|             Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered"); |             SceneSetupHelpers.SetupSceneModules(myScene1, configSource, etm);             | ||||||
|  |              | ||||||
|  |             SceneSetupHelpers.AddRootAgent(myScene1, agent1Id); | ||||||
|  |             ScenePresence childPresence = myScene2.GetScenePresence(agent1); | ||||||
|  |              | ||||||
|  |             // TODO: Need to do a fair amount of work to allow synchronous establishment of child agents | ||||||
|  | //            Assert.That(childPresence, Is.Not.Null); | ||||||
|  | //            Assert.That(childPresence.IsChildAgent, Is.True); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // I'm commenting this test because it does not represent |         // I'm commenting this test because it does not represent | ||||||
|  | @ -334,60 +325,23 @@ namespace OpenSim.Region.Framework.Scenes.Tests | ||||||
|             Assert.That(presence.IsChildAgent, Is.False, "Presence was not made root in old region again."); |             Assert.That(presence.IsChildAgent, Is.False, "Presence was not made root in old region again."); | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         [Test] |         public void fixNullPresence() | ||||||
|         public void T030_TestAddAttachments() |  | ||||||
|         { |         { | ||||||
|             TestHelper.InMethod(); |             string firstName = "testfirstname"; | ||||||
| 
 | 
 | ||||||
|             ScenePresence presence = scene.GetScenePresence(agent1); |             AgentCircuitData agent = new AgentCircuitData(); | ||||||
|  |             agent.AgentID = agent1; | ||||||
|  |             agent.firstname = firstName; | ||||||
|  |             agent.lastname = "testlastname"; | ||||||
|  |             agent.SessionID = UUID.Zero; | ||||||
|  |             agent.SecureSessionID = UUID.Zero; | ||||||
|  |             agent.circuitcode = 123; | ||||||
|  |             agent.BaseFolder = UUID.Zero; | ||||||
|  |             agent.InventoryFolder = UUID.Zero; | ||||||
|  |             agent.startpos = Vector3.Zero; | ||||||
|  |             agent.CapsPath = GetRandomCapsObjectPath(); | ||||||
| 
 | 
 | ||||||
|             presence.AddAttachment(sog1); |             acd1 = agent; | ||||||
|             presence.AddAttachment(sog2); |  | ||||||
|             presence.AddAttachment(sog3); |  | ||||||
| 
 |  | ||||||
|             Assert.That(presence.HasAttachments(), Is.True); |  | ||||||
|             Assert.That(presence.ValidateAttachments(), Is.True); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         [Test] |  | ||||||
|         public void T031_RemoveAttachments() |  | ||||||
|         { |  | ||||||
|             TestHelper.InMethod(); |  | ||||||
| 
 |  | ||||||
|             ScenePresence presence = scene.GetScenePresence(agent1); |  | ||||||
|             presence.RemoveAttachment(sog1); |  | ||||||
|             presence.RemoveAttachment(sog2); |  | ||||||
|             presence.RemoveAttachment(sog3); |  | ||||||
|             Assert.That(presence.HasAttachments(), Is.False); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // I'm commenting this test because scene setup NEEDS InventoryService to  |  | ||||||
|         // be non-null |  | ||||||
|         //[Test] |  | ||||||
|         public void T032_CrossAttachments() |  | ||||||
|         { |  | ||||||
|             TestHelper.InMethod(); |  | ||||||
| 
 |  | ||||||
|             ScenePresence presence = scene.GetScenePresence(agent1); |  | ||||||
|             ScenePresence presence2 = scene2.GetScenePresence(agent1); |  | ||||||
|             presence2.AddAttachment(sog1); |  | ||||||
|             presence2.AddAttachment(sog2); |  | ||||||
| 
 |  | ||||||
|             ISharedRegionModule serialiser = new SerialiserModule(); |  | ||||||
|             SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), serialiser); |  | ||||||
|             SceneSetupHelpers.SetupSceneModules(scene2, new IniConfigSource(), serialiser); |  | ||||||
| 
 |  | ||||||
|             Assert.That(presence.HasAttachments(), Is.False, "Presence has attachments before cross"); |  | ||||||
| 
 |  | ||||||
|             //Assert.That(presence2.CrossAttachmentsIntoNewRegion(region1, true), Is.True, "Cross was not successful"); |  | ||||||
|             Assert.That(presence2.HasAttachments(), Is.False, "Presence2 objects were not deleted"); |  | ||||||
|             Assert.That(presence.HasAttachments(), Is.True, "Presence has not received new objects"); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         [TearDown] |  | ||||||
|         public void TearDown() |  | ||||||
|         { |  | ||||||
|             if (MainServer.Instance != null) MainServer.Instance.Stop(); |  | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         public static string GetRandomCapsObjectPath() |         public static string GetRandomCapsObjectPath() | ||||||
|  |  | ||||||
|  | @ -0,0 +1,71 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) Contributors, http://opensimulator.org/ | ||||||
|  |  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  *     * Redistributions of source code must retain the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer. | ||||||
|  |  *     * Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *       documentation and/or other materials provided with the distribution. | ||||||
|  |  *     * Neither the name of the OpenSimulator Project nor the | ||||||
|  |  *       names of its contributors may be used to endorse or promote products | ||||||
|  |  *       derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Timers; | ||||||
|  | using Timer=System.Timers.Timer; | ||||||
|  | using Nini.Config; | ||||||
|  | using NUnit.Framework; | ||||||
|  | using NUnit.Framework.SyntaxHelpers; | ||||||
|  | using OpenMetaverse; | ||||||
|  | using OpenSim.Framework; | ||||||
|  | using OpenSim.Framework.Communications; | ||||||
|  | using OpenSim.Region.Framework.Scenes; | ||||||
|  | using OpenSim.Region.Framework.Interfaces; | ||||||
|  | using OpenSim.Region.CoreModules.World.Serialiser; | ||||||
|  | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | ||||||
|  | using OpenSim.Tests.Common; | ||||||
|  | using OpenSim.Tests.Common.Mock; | ||||||
|  | using OpenSim.Tests.Common.Setup; | ||||||
|  | 
 | ||||||
|  | namespace OpenSim.Region.Framework.Scenes.Tests | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Scene presence tests | ||||||
|  |     /// </summary> | ||||||
|  |     [TestFixture] | ||||||
|  |     public class SceneTests | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Very basic scene update test.  Should become more elaborate with time. | ||||||
|  |         /// </summary> | ||||||
|  |         [Test] | ||||||
|  |         public void TestUpdateScene() | ||||||
|  |         { | ||||||
|  |             TestHelper.InMethod(); | ||||||
|  | 
 | ||||||
|  |             Scene scene = SceneSetupHelpers.SetupScene(); | ||||||
|  |             scene.Update(); | ||||||
|  |              | ||||||
|  |             Assert.That(scene.Frame, Is.EqualTo(1)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -115,15 +115,15 @@ namespace OpenSim.Server.Handlers.Grid | ||||||
|                     case "get_region_flags": |                     case "get_region_flags": | ||||||
|                         return GetRegionFlags(request); |                         return GetRegionFlags(request); | ||||||
|                 } |                 } | ||||||
|  |                  | ||||||
|                 m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method); |                 m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method); | ||||||
|             } |             } | ||||||
|             catch (Exception e) |             catch (Exception e) | ||||||
|             { |             { | ||||||
|                 m_log.DebugFormat("[GRID HANDLER]: Exception {0}", e); |                 m_log.ErrorFormat("[GRID HANDLER]: Exception {0} {1}", e.Message, e.StackTrace); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return FailureResult(); |             return FailureResult(); | ||||||
| 
 |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         #region Method-specific handlers |         #region Method-specific handlers | ||||||
|  |  | ||||||
|  | @ -185,7 +185,7 @@ namespace OpenSim.Services.Connectors.Simulation | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             // unreachable |             // unreachable | ||||||
|             return true; | //            return true; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  |  | ||||||
|  | @ -271,6 +271,7 @@ namespace OpenSim.Services.GridService | ||||||
|         { |         { | ||||||
|             List<GridRegion> rinfos = new List<GridRegion>(); |             List<GridRegion> rinfos = new List<GridRegion>(); | ||||||
|             RegionData region = m_Database.Get(regionID, scopeID); |             RegionData region = m_Database.Get(regionID, scopeID); | ||||||
|  |              | ||||||
|             if (region != null) |             if (region != null) | ||||||
|             { |             { | ||||||
|                 // Not really? Maybe? |                 // Not really? Maybe? | ||||||
|  | @ -278,15 +279,24 @@ namespace OpenSim.Services.GridService | ||||||
|                     region.posX + (int)Constants.RegionSize + 1, region.posY + (int)Constants.RegionSize + 1, scopeID); |                     region.posX + (int)Constants.RegionSize + 1, region.posY + (int)Constants.RegionSize + 1, scopeID); | ||||||
| 
 | 
 | ||||||
|                 foreach (RegionData rdata in rdatas) |                 foreach (RegionData rdata in rdatas) | ||||||
|  |                 { | ||||||
|                     if (rdata.RegionID != regionID) |                     if (rdata.RegionID != regionID) | ||||||
|                     { |                     { | ||||||
|                         int flags = Convert.ToInt32(rdata.Data["flags"]); |                         int flags = Convert.ToInt32(rdata.Data["flags"]); | ||||||
|                         if ((flags & (int)Data.RegionFlags.Hyperlink) == 0) // no hyperlinks as neighbours |                         if ((flags & (int)Data.RegionFlags.Hyperlink) == 0) // no hyperlinks as neighbours | ||||||
|                             rinfos.Add(RegionData2RegionInfo(rdata)); |                             rinfos.Add(RegionData2RegionInfo(rdata)); | ||||||
|                     } |                     } | ||||||
|  |                 } | ||||||
| 
 | 
 | ||||||
|  |                 m_log.DebugFormat("[GRID SERVICE]: region {0} has {1} neighbours", region.RegionName, rinfos.Count); | ||||||
|             } |             } | ||||||
|             m_log.DebugFormat("[GRID SERVICE]: region {0} has {1} neighbours", region.RegionName, rinfos.Count); |             else | ||||||
|  |             { | ||||||
|  |                 m_log.WarnFormat( | ||||||
|  |                     "[GRID SERVICE]: GetNeighbours() called for scope {0}, region {1} but no such region found",  | ||||||
|  |                     scopeID, regionID); | ||||||
|  |             } | ||||||
|  |              | ||||||
|             return rinfos; |             return rinfos; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -560,8 +560,11 @@ namespace OpenSim.Tests.Common.Mock | ||||||
|             agentData.lastname = m_lastName; |             agentData.lastname = m_lastName; | ||||||
| 
 | 
 | ||||||
|             ICapabilitiesModule capsModule = m_scene.RequestModuleInterface<ICapabilitiesModule>(); |             ICapabilitiesModule capsModule = m_scene.RequestModuleInterface<ICapabilitiesModule>(); | ||||||
|             agentData.CapsPath = capsModule.GetCapsPath(m_agentId); |             if (capsModule != null) | ||||||
|             agentData.ChildrenCapSeeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(m_agentId)); |             { | ||||||
|  |                 agentData.CapsPath = capsModule.GetCapsPath(m_agentId); | ||||||
|  |                 agentData.ChildrenCapSeeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(m_agentId)); | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             return agentData; |             return agentData; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -132,24 +132,11 @@ namespace OpenSim.Tests.Common.Setup | ||||||
|         public static TestScene SetupScene( |         public static TestScene SetupScene( | ||||||
|             string name, UUID id, uint x, uint y, String realServices) |             string name, UUID id, uint x, uint y, String realServices) | ||||||
|         { |         { | ||||||
|             bool newScene = false; |  | ||||||
| 
 |  | ||||||
|             Console.WriteLine("Setting up test scene {0}", name); |             Console.WriteLine("Setting up test scene {0}", name); | ||||||
| 
 | 
 | ||||||
|             // REFACTORING PROBLEM! |  | ||||||
|             //// If cm is the same as our last commsManager used, this means the tester wants to link |  | ||||||
|             //// regions. In this case, don't use the sameshared region modules and dont initialize them again. |  | ||||||
|             //// Also, no need to start another MainServer and MainConsole instance. |  | ||||||
|             //if (cm == null || cm != commsManager) |  | ||||||
|             //{ |  | ||||||
|             //    System.Console.WriteLine("Starting a brand new scene"); |  | ||||||
|             //    newScene = true; |  | ||||||
|             MainConsole.Instance = new MockConsole("TEST PROMPT"); |  | ||||||
|             //    MainServer.Instance = new BaseHttpServer(980); |  | ||||||
|             //    commsManager = cm; |  | ||||||
|             //} |  | ||||||
| 
 |  | ||||||
|             // We must set up a console otherwise setup of some modules may fail |             // We must set up a console otherwise setup of some modules may fail | ||||||
|  |             MainConsole.Instance = new MockConsole("TEST PROMPT"); | ||||||
|  |              | ||||||
|             RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "127.0.0.1"); |             RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "127.0.0.1"); | ||||||
|             regInfo.RegionName = name; |             regInfo.RegionName = name; | ||||||
|             regInfo.RegionID = id; |             regInfo.RegionID = id; | ||||||
|  | @ -164,50 +151,27 @@ namespace OpenSim.Tests.Common.Setup | ||||||
|             TestScene testScene = new TestScene( |             TestScene testScene = new TestScene( | ||||||
|                 regInfo, acm, scs, simDataService, estateDataService, null, false, false, false, configSource, null); |                 regInfo, acm, scs, simDataService, estateDataService, null, false, false, false, configSource, null); | ||||||
| 
 | 
 | ||||||
|             INonSharedRegionModule capsModule = new CapabilitiesModule(); |  | ||||||
|             capsModule.Initialise(new IniConfigSource()); |  | ||||||
|             testScene.AddRegionModule(capsModule.Name, capsModule); |  | ||||||
|             capsModule.AddRegion(testScene); |  | ||||||
| 
 |  | ||||||
|             IRegionModule godsModule = new GodsModule(); |             IRegionModule godsModule = new GodsModule(); | ||||||
|             godsModule.Initialise(testScene, new IniConfigSource()); |             godsModule.Initialise(testScene, new IniConfigSource()); | ||||||
|             testScene.AddModule(godsModule.Name, godsModule); |             testScene.AddModule(godsModule.Name, godsModule); | ||||||
|             realServices = realServices.ToLower(); |             realServices = realServices.ToLower(); | ||||||
|             // IConfigSource config = new IniConfigSource(); |  | ||||||
| 
 | 
 | ||||||
|             // If we have a brand new scene, need to initialize shared region modules |             if (realServices.Contains("asset")) | ||||||
|             if ((m_assetService == null && m_inventoryService == null) || newScene) |                 StartAssetService(testScene, true); | ||||||
|             { |  | ||||||
|                 if (realServices.Contains("asset")) |  | ||||||
|                     StartAssetService(testScene, true); |  | ||||||
|                 else |  | ||||||
|                     StartAssetService(testScene, false); |  | ||||||
| 
 |  | ||||||
|                 // For now, always started a 'real' authentication service |  | ||||||
|                 StartAuthenticationService(testScene, true); |  | ||||||
| 
 |  | ||||||
|                 if (realServices.Contains("inventory")) |  | ||||||
|                     StartInventoryService(testScene, true); |  | ||||||
|                 else |  | ||||||
|                     StartInventoryService(testScene, false); |  | ||||||
| 
 |  | ||||||
|                 StartGridService(testScene, true); |  | ||||||
|                 StartUserAccountService(testScene); |  | ||||||
|                 StartPresenceService(testScene); |  | ||||||
|             } |  | ||||||
|             // If not, make sure the shared module gets references to this new scene |  | ||||||
|             else |             else | ||||||
|             { |                 StartAssetService(testScene, false); | ||||||
|                 m_assetService.AddRegion(testScene); |  | ||||||
|                 m_assetService.RegionLoaded(testScene); |  | ||||||
|                 m_inventoryService.AddRegion(testScene); |  | ||||||
|                 m_inventoryService.RegionLoaded(testScene); |  | ||||||
|                 m_userAccountService.AddRegion(testScene); |  | ||||||
|                 m_userAccountService.RegionLoaded(testScene); |  | ||||||
|                 m_presenceService.AddRegion(testScene); |  | ||||||
|                 m_presenceService.RegionLoaded(testScene); |  | ||||||
| 
 | 
 | ||||||
|             } |             // For now, always started a 'real' authentication service | ||||||
|  |             StartAuthenticationService(testScene, true); | ||||||
|  | 
 | ||||||
|  |             if (realServices.Contains("inventory")) | ||||||
|  |                 StartInventoryService(testScene, true); | ||||||
|  |             else | ||||||
|  |                 StartInventoryService(testScene, false); | ||||||
|  | 
 | ||||||
|  |             StartGridService(testScene, true); | ||||||
|  |             StartUserAccountService(testScene); | ||||||
|  |             StartPresenceService(testScene); | ||||||
| 
 | 
 | ||||||
|             m_inventoryService.PostInitialise(); |             m_inventoryService.PostInitialise(); | ||||||
|             m_assetService.PostInitialise(); |             m_assetService.PostInitialise(); | ||||||
|  | @ -504,12 +468,10 @@ namespace OpenSim.Tests.Common.Setup | ||||||
|             TestClient client = new TestClient(agentData, scene); |             TestClient client = new TestClient(agentData, scene); | ||||||
|             scene.AddNewClient(client); |             scene.AddNewClient(client); | ||||||
| 
 | 
 | ||||||
|             // Stage 3: Invoke agent crossing, which converts the child agent into a root agent (with appearance, |             // Stage 3: Complete the entrance into the region.  This converts the child agent into a root agent. | ||||||
|             // inventory, etc.) |  | ||||||
|             //scene.AgentCrossing(agentData.AgentID, new Vector3(90, 90, 90), false); OBSOLETE |  | ||||||
| 
 |  | ||||||
|             ScenePresence scp = scene.GetScenePresence(agentData.AgentID); |             ScenePresence scp = scene.GetScenePresence(agentData.AgentID); | ||||||
|             scp.MakeRootAgent(new Vector3(90, 90, 90), true); |             scp.CompleteMovement(client); | ||||||
|  |             //scp.MakeRootAgent(new Vector3(90, 90, 90), true); | ||||||
| 
 | 
 | ||||||
|             return client; |             return client; | ||||||
|         } |         } | ||||||
|  | @ -543,24 +505,5 @@ namespace OpenSim.Tests.Common.Setup | ||||||
| 
 | 
 | ||||||
|             return part; |             return part; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         /// <summary> |  | ||||||
|         /// Delete a scene object asynchronously |  | ||||||
|         /// </summary> |  | ||||||
|         /// <param name="scene"></param> |  | ||||||
|         /// <param name="part"></param> |  | ||||||
|         /// <param name="action"></param> |  | ||||||
|         /// <param name="destinationId"></param> |  | ||||||
|         /// <param name="client"></param> |  | ||||||
|         public static void DeleteSceneObjectAsync( |  | ||||||
|             TestScene scene, SceneObjectPart part, DeRezAction action, UUID destinationId, IClientAPI client) |  | ||||||
|         { |  | ||||||
|             // Turn off the timer on the async sog deleter - we'll crank it by hand within a unit test |  | ||||||
|             AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; |  | ||||||
|             sogd.Enabled = false; |  | ||||||
| 
 |  | ||||||
|             scene.DeRezObjects(client, new List<uint>() { part.LocalId }, UUID.Zero, action, destinationId); |  | ||||||
|             sogd.InventoryDeQueueAndDelete(); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -94,6 +94,13 @@ | ||||||
|     ; Warning!  Don't use this with regions that have existing content!, This will likely break them |     ; Warning!  Don't use this with regions that have existing content!, This will likely break them | ||||||
|     CombineContiguousRegions = false |     CombineContiguousRegions = false | ||||||
| 
 | 
 | ||||||
|  |     ; Extend the region's draw distance; 255m is the default which includes | ||||||
|  |     ; one neighbor on each side of the current region, 767m would go three | ||||||
|  |     ; neighbors on each side for a total of 49 regions in view. Warning, unless | ||||||
|  |     ; all the regions have the same drawdistance, you will end up with strange | ||||||
|  |     ; effects because the agents that get closed may be inconsistent. | ||||||
|  |     ; DefaultDrawDistance = 255.0 | ||||||
|  | 
 | ||||||
|     ; If you have only one region in an instance, or to avoid the many bugs |     ; If you have only one region in an instance, or to avoid the many bugs | ||||||
|     ; that you can trigger in modules by restarting a region, set this to |     ; that you can trigger in modules by restarting a region, set this to | ||||||
|     ; true to make the entire instance exit instead of restarting the region. |     ; true to make the entire instance exit instead of restarting the region. | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Sean McNamara
						Sean McNamara