Merge branch 'master' of git://opensimulator.org/git/opensim into dev
Conflicts: OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs OpenSim/Region/Framework/Scenes/Scene.cs OpenSim/Region/Framework/Scenes/ScenePresence.csdsg
						commit
						7210b7f517
					
				|  | @ -51,27 +51,55 @@ namespace OpenSim.Data.Null | |||
|             //Console.WriteLine("[XXX] NullRegionData constructor"); | ||||
|         } | ||||
| 
 | ||||
|         private delegate bool Matcher(string value); | ||||
| 
 | ||||
|         public List<RegionData> Get(string regionName, UUID scopeID) | ||||
|         { | ||||
|             if (Instance != this) | ||||
|                 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>(); | ||||
| 
 | ||||
|             foreach (RegionData r in m_regionData.Values) | ||||
|             { | ||||
|                 if (regionName.Contains("%")) | ||||
|                 { | ||||
|                     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())) | ||||
|                     m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower()); | ||||
|                     if (queryMatch(r.RegionName.ToLower())) | ||||
|                         ret.Add(r); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if (r.RegionName.ToLower() == regionName.ToLower()) | ||||
|                         ret.Add(r); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (ret.Count > 0) | ||||
|  |  | |||
|  | @ -181,7 +181,6 @@ namespace OpenSim.Framework.Capabilities | |||
| 
 | ||||
|             RegisterRegionServiceHandlers(capsBase); | ||||
|             RegisterInventoryServiceHandlers(capsBase); | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public void RegisterRegionServiceHandlers(string capsBase) | ||||
|  |  | |||
|  | @ -785,7 +785,19 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
|                     if (methodWasFound) | ||||
|                     { | ||||
|                         xmlRprcRequest.Params.Add(request.Url); // Param[2] | ||||
|                         xmlRprcRequest.Params.Add(request.Headers.Get("X-Forwarded-For")); // Param[3] | ||||
| 
 | ||||
|                         string xff = "X-Forwarded-For"; | ||||
|                         string xfflower = xff.ToLower(); | ||||
|                         foreach (string s in request.Headers.AllKeys) | ||||
|                         { | ||||
|                             if (s != null && s.Equals(xfflower)) | ||||
|                             { | ||||
|                                 xff = xfflower; | ||||
|                                 break; | ||||
|                             } | ||||
|                         } | ||||
|                         xmlRprcRequest.Params.Add(request.Headers.Get(xff)); // Param[3] | ||||
| 
 | ||||
| 
 | ||||
|                         try | ||||
|                         { | ||||
|  |  | |||
|  | @ -459,10 +459,17 @@ namespace OpenSim.Framework | |||
|         /// <param name="oldy">Old region y-coord</param> | ||||
|         /// <param name="newy">New region y-coord</param> | ||||
|         /// <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. | ||||
|             return (((int)Math.Abs((int)(oldx - newx)) > 1) || ((int)Math.Abs((int)(oldy - newy)) > 1)); | ||||
|             int dd = (int)((drawdist + Constants.RegionSize - 1) / Constants.RegionSize); | ||||
| 
 | ||||
|             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) | ||||
|  |  | |||
|  | @ -845,7 +845,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
| 
 | ||||
|         private void HandleUseCircuitCode(object o) | ||||
|         { | ||||
|             DateTime startTime = DateTime.Now; | ||||
| //            DateTime startTime = DateTime.Now; | ||||
|             object[] array = (object[])o; | ||||
|             UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; | ||||
|             UseCircuitCodePacket packet = (UseCircuitCodePacket)array[1]; | ||||
|  |  | |||
|  | @ -92,9 +92,9 @@ namespace Flotsam.RegionModules.AssetCache | |||
|         // Expiration is expressed in hours. | ||||
|         private const double m_DefaultMemoryExpiration = 1.0;  | ||||
|         private const double m_DefaultFileExpiration = 48; | ||||
|         private TimeSpan m_MemoryExpiration = TimeSpan.Zero; | ||||
|         private TimeSpan m_FileExpiration = TimeSpan.Zero; | ||||
|         private TimeSpan m_FileExpirationCleanupTimer = TimeSpan.Zero; | ||||
|         private TimeSpan m_MemoryExpiration = TimeSpan.FromHours(m_DefaultMemoryExpiration); | ||||
|         private TimeSpan m_FileExpiration = TimeSpan.FromHours(m_DefaultFileExpiration); | ||||
|         private TimeSpan m_FileExpirationCleanupTimer = TimeSpan.FromHours(m_DefaultFileExpiration); | ||||
| 
 | ||||
|         private static int m_CacheDirectoryTiers = 1; | ||||
|         private static int m_CacheDirectoryTierLen = 3; | ||||
|  | @ -147,7 +147,7 @@ namespace Flotsam.RegionModules.AssetCache | |||
|                     } | ||||
| 
 | ||||
|                     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_MemoryExpiration = TimeSpan.FromHours(assetConfig.GetDouble("MemoryCacheTimeout", m_DefaultMemoryExpiration)); | ||||
|  | @ -245,16 +245,7 @@ namespace Flotsam.RegionModules.AssetCache | |||
|         private void UpdateMemoryCache(string key, AssetBase asset) | ||||
|         { | ||||
|             if (m_MemoryCacheEnabled) | ||||
|             { | ||||
|                 if (m_MemoryExpiration > TimeSpan.Zero) | ||||
|                 { | ||||
|                     m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_MemoryCache.AddOrUpdate(key, asset, Double.MaxValue); | ||||
|                 } | ||||
|             } | ||||
|                 m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration); | ||||
|         } | ||||
| 
 | ||||
|         public void Cache(AssetBase asset) | ||||
|  | @ -450,7 +441,7 @@ namespace Flotsam.RegionModules.AssetCache | |||
|         private void CleanupExpiredFiles(object source, ElapsedEventArgs e) | ||||
|         { | ||||
|             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 | ||||
|             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 | ||||
|             return (defonly ? false : true); | ||||
|  |  | |||
|  | @ -49,16 +49,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog | |||
|         { | ||||
|             m_scene = scene; | ||||
|             m_scene.RegisterModuleInterface<IDialogModule>(this); | ||||
|              | ||||
| 
 | ||||
|             m_scene.AddCommand( | ||||
|                 this, "alert", "alert <first> <last> <message>", | ||||
|                 "Send an alert to a user", | ||||
|                 this, "alert", "alert <message>", | ||||
|                 "Send an alert to everyone", | ||||
|                 HandleAlertConsoleCommand); | ||||
| 
 | ||||
|             m_scene.AddCommand( | ||||
|                 this, "alert general", "alert [general] <message>", | ||||
|                 "Send an alert to everyone", | ||||
|                 "If keyword 'general' is omitted, then <message> must be surrounded by quotation marks.", | ||||
|                 this, "alert-user", "alert-user <first> <last> <message>", | ||||
|                 "Send an alert to a user", | ||||
|                 HandleAlertConsoleCommand); | ||||
|         } | ||||
|          | ||||
|  | @ -177,55 +176,32 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog | |||
|         { | ||||
|             if (m_scene.ConsoleScene() != null && m_scene.ConsoleScene() != m_scene) | ||||
|                 return; | ||||
|              | ||||
|             bool isGeneral = false; | ||||
|             string firstName = string.Empty; | ||||
|             string lastName = string.Empty; | ||||
| 
 | ||||
|             string message = string.Empty; | ||||
| 
 | ||||
|             if (cmdparams.Length > 1) | ||||
|             if (cmdparams[0].ToLower().Equals("alert")) | ||||
|             { | ||||
|                 firstName = cmdparams[1]; | ||||
|                 isGeneral = firstName.ToLower().Equals("general"); | ||||
|             } | ||||
|             if (cmdparams.Length == 2 && !isGeneral) | ||||
|             { | ||||
|                 // alert "message" | ||||
|                 message = cmdparams[1]; | ||||
|                 isGeneral = true; | ||||
|             } | ||||
|             else if (cmdparams.Length > 2 && isGeneral) | ||||
|             { | ||||
|                 // alert general <message> | ||||
|                 message = CombineParams(cmdparams, 2); | ||||
|                 message = CombineParams(cmdparams, 1); | ||||
|                 m_log.InfoFormat("[DIALOG]: Sending general alert in region {0} with message {1}", | ||||
|                     m_scene.RegionInfo.RegionName, message); | ||||
|                 SendGeneralAlert(message); | ||||
|             } | ||||
|             else if (cmdparams.Length > 3) | ||||
|             { | ||||
|                 // alert <first> <last> <message> | ||||
|                 lastName = cmdparams[2]; | ||||
|                 string firstName = cmdparams[1]; | ||||
|                 string lastName = cmdparams[2]; | ||||
|                 message = CombineParams(cmdparams, 3); | ||||
|                 m_log.InfoFormat( | ||||
|                     "[DIALOG]: Sending alert in region {0} to {1} {2} with message {3}", | ||||
|                     m_scene.RegionInfo.RegionName, firstName, lastName, message); | ||||
|                 SendAlertToUser(firstName, lastName, message, false); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 OpenSim.Framework.Console.MainConsole.Instance.Output( | ||||
|                     "Usage: alert \"message\" | alert general <message> | alert <first> <last> <message>"); | ||||
|                     "Usage: alert <message> | alert-user <first> <last> <message>"); | ||||
|                 return; | ||||
|             } | ||||
|                  | ||||
|             if (isGeneral) | ||||
|             { | ||||
|                 m_log.InfoFormat( | ||||
|                     "[DIALOG]: Sending general alert in region {0} with message {1}", | ||||
|                     m_scene.RegionInfo.RegionName, message); | ||||
|                 SendGeneralAlert(message); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 m_log.InfoFormat( | ||||
|                     "[DIALOG]: Sending alert in region {0} to {1} {2} with message {3}",  | ||||
|                     m_scene.RegionInfo.RegionName, firstName, lastName, message); | ||||
|                 SendAlertToUser(firstName, lastName, message, false); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private string CombineParams(string[] commandParams, int pos) | ||||
|  |  | |||
|  | @ -284,9 +284,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero)) | ||||
|                 string reason; | ||||
|                 if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out reason)) | ||||
|                 { | ||||
|                     sp.ControllingClient.SendTeleportFailed("The destination region has refused access"); | ||||
|                     sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|  | @ -317,14 +318,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|                     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 | ||||
|                     agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||||
|                 } | ||||
| 
 | ||||
|                 string reason = String.Empty; | ||||
| 
 | ||||
|                 // Let's create an agent there if one doesn't exist yet.  | ||||
|                 bool logout = false; | ||||
|                 if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) | ||||
|  | @ -337,7 +336,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|                 // OK, it got this agent. Let's close some child agents | ||||
|                 sp.CloseChildAgents(newRegionX, newRegionY); | ||||
|                 IClientIPEndpoint ipepClient;   | ||||
|                 if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||||
|                 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||||
|                 { | ||||
|                     //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); | ||||
|                     #region IP Translation for NAT | ||||
|  | @ -448,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 | ||||
| 
 | ||||
|                 if (NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||||
|                 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||||
|                 { | ||||
|                     Thread.Sleep(5000); | ||||
|                     sp.Close(); | ||||
|  | @ -522,14 +521,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|             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) | ||||
|  | @ -778,7 +777,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
| 
 | ||||
|             GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); | ||||
| 
 | ||||
|             if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos)) | ||||
|             string reason; | ||||
|             if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos, out reason)) | ||||
|             { | ||||
|                 agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel"); | ||||
|                 if (r == null) | ||||
|  | @ -1045,7 +1045,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
| 
 | ||||
|             if (m_regionInfo != null) | ||||
|             { | ||||
|                 neighbours = RequestNeighbours(sp.Scene, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | ||||
|                 neighbours = RequestNeighbours(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -1272,8 +1272,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|         /// <param name="pRegionLocX"></param> | ||||
|         /// <param name="pRegionLocY"></param> | ||||
|         /// <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; | ||||
|             m_log.DebugFormat("[ENTITY TRANSFER MODULE] Request neighbors for {0} at {1}/{2}", | ||||
|                             pScene.RegionInfo.RegionName, pRegionLocX, pRegionLocY); | ||||
|             RegionInfo m_regionInfo = pScene.RegionInfo; | ||||
|  | @ -1283,10 +1284,24 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|             Border[] eastBorders = pScene.EastBorders.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) | ||||
|             { | ||||
|                 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 | ||||
|             { | ||||
|  |  | |||
|  | @ -130,9 +130,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|             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; | ||||
| 
 | ||||
|             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); | ||||
|             item = m_Scene.InventoryService.GetItem(item); | ||||
| 
 | ||||
|             if (item.Owner != remoteClient.AgentId) | ||||
|                 return UUID.Zero; | ||||
| 
 | ||||
|             if (item != null) | ||||
|             { | ||||
|                 if ((InventoryType)item.InvType == InventoryType.Notecard) | ||||
|  | @ -524,6 +527,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
| 
 | ||||
|             if (item != null) | ||||
|             { | ||||
|                 item.Owner = remoteClient.AgentId; | ||||
| 
 | ||||
|                 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); | ||||
| 
 | ||||
|                 if (rezAsset != null) | ||||
|  |  | |||
|  | @ -257,15 +257,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         public bool QueryAccess(GridRegion destination, UUID id, Vector3 position) | ||||
|         public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) | ||||
|         { | ||||
|             reason = "Communications failure"; | ||||
|             if (destination == null) | ||||
|                 return false; | ||||
| 
 | ||||
|             foreach (Scene s in m_sceneList) | ||||
|             { | ||||
|                 if (s.RegionInfo.RegionID == destination.RegionID) | ||||
|                     return s.QueryAccess(id, position); | ||||
|                     return s.QueryAccess(id, position, out reason); | ||||
|             } | ||||
|             //m_log.Debug("[LOCAL COMMS]: region not found for QueryAccess"); | ||||
|             return false; | ||||
|  |  | |||
|  | @ -240,18 +240,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public bool QueryAccess(GridRegion destination, UUID id, Vector3 position) | ||||
|         public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) | ||||
|         { | ||||
|             reason = "Communications failure"; | ||||
|             if (destination == null) | ||||
|                 return false; | ||||
| 
 | ||||
|             // Try local first | ||||
|             if (m_localBackend.QueryAccess(destination, id, position)) | ||||
|             if (m_localBackend.QueryAccess(destination, id, position, out reason)) | ||||
|                 return true; | ||||
| 
 | ||||
|             // else do the remote thing | ||||
|             if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||||
|                 return m_remoteConnector.QueryAccess(destination, id, position); | ||||
|                 return m_remoteConnector.QueryAccess(destination, id, position, out reason); | ||||
| 
 | ||||
|             return false; | ||||
| 
 | ||||
|  |  | |||
|  | @ -482,6 +482,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             // Passing something to another avatar or a an object will already | ||||
|             InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||||
|             item = InventoryService.GetItem(item); | ||||
|             if (item.Owner != remoteClient.AgentId) | ||||
|                 return; | ||||
| 
 | ||||
|             if (item != null) | ||||
|             { | ||||
|  |  | |||
|  | @ -83,6 +83,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         public bool m_useFlySlow; | ||||
|         public bool m_usePreJump; | ||||
|         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 | ||||
|         // root agents when ACL denies access to root agent | ||||
|         public bool m_strictAccessControl = true; | ||||
|  | @ -129,7 +136,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         protected ICapabilitiesModule m_capsModule; | ||||
|         // Central Update Loop | ||||
|         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 DateTime m_lastupdate = DateTime.UtcNow; | ||||
| 
 | ||||
|  | @ -1027,15 +1043,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 // | ||||
|                 IConfig startupConfig = m_config.Configs["Startup"]; | ||||
| 
 | ||||
|                 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance); | ||||
|                  | ||||
|                 //Animation states | ||||
|                 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); | ||||
|                 // TODO: Change default to true once the feature is supported | ||||
|                 m_usePreJump = startupConfig.GetBoolean("enableprejump", false); | ||||
| 
 | ||||
|                 m_maxNonphys = 256f; | ||||
|                 m_maxPhys = 256f; | ||||
| 
 | ||||
|                 /* | ||||
|                 m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); | ||||
|                 if (RegionInfo.NonphysPrimMax > 0) | ||||
|                 { | ||||
|  | @ -1048,7 +1062,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 { | ||||
|                     m_maxPhys = RegionInfo.PhysPrimMax; | ||||
|                 } | ||||
|                 */ | ||||
| 
 | ||||
|                 // Here, if clamping is requested in either global or | ||||
|                 // local config, it will be used | ||||
|  | @ -1422,7 +1435,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         // This is the method that shuts down the scene. | ||||
|         public override void Close() | ||||
|         { | ||||
|             m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", m_regionName); | ||||
|             m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", RegionInfo.RegionName); | ||||
| 
 | ||||
|             m_restartTimer.Stop(); | ||||
|             m_restartTimer.Close(); | ||||
|  | @ -1449,7 +1462,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             //m_heartbeatTimer.Close(); | ||||
|             shuttingdown = true; | ||||
| 
 | ||||
|             m_log.DebugFormat("[SCENE ({0})]: Persisting changed objects", m_regionName); | ||||
|             m_log.Debug("[SCENE]: Persisting changed objects for region " + m_regionName); | ||||
|             EntityBase[] entities = GetEntities(); | ||||
|             foreach (EntityBase entity in entities) | ||||
|             { | ||||
|  | @ -1617,7 +1630,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 Update(); | ||||
|                 while (!shuttingdown) | ||||
|                     Update(); | ||||
| 
 | ||||
|                 m_lastUpdate = Util.EnvironmentTickCount(); | ||||
|                 m_firstHeartbeat = false; | ||||
|  | @ -1634,229 +1648,205 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             Watchdog.RemoveThread(); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Performs per-frame updates on the scene, this should be the central scene loop | ||||
|         /// </summary> | ||||
|         public override void Update() | ||||
|         { | ||||
|             float physicsFPS; | ||||
|             int maintc; | ||||
|         {         | ||||
|             TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; | ||||
|             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; | ||||
|                 physicsFPS = 0f; | ||||
|                 // Check if any objects have reached their targets | ||||
|                 CheckAtTargets(); | ||||
| 
 | ||||
|                 maintc = Util.EnvironmentTickCount(); | ||||
|                 int tmpFrameMS = maintc; | ||||
|                 tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; | ||||
|                 // Update SceneObjectGroups that have scheduled themselves for updates | ||||
|                 // Objects queue their updates onto all scene presences | ||||
|                 if (Frame % m_update_objects == 0) | ||||
|                     m_sceneGraph.UpdateObjectGroups(); | ||||
| 
 | ||||
|                 // Increment the frame counter | ||||
|                 ++m_frame; | ||||
| 
 | ||||
|                 try | ||||
|                 // Run through all ScenePresences looking for updates | ||||
|                 // Presence updates and queued object updates for each presence are sent to clients | ||||
|                 if (IsSyncedClient()) | ||||
|                 { | ||||
|                     // Check if any objects have reached their targets | ||||
|                     CheckAtTargets(); | ||||
| 
 | ||||
|                     // Update SceneObjectGroups that have scheduled themselves for updates | ||||
|                     // Objects queue their updates onto all scene presences | ||||
|                     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 it's a client manager, just send prim updates | ||||
|                     // This will get fixed later to only send to locally logged in presences rather than all presences | ||||
|                     // but requires pulling apart the concept of a client from the concept of a presence/avatar | ||||
|                     if (IsSyncedClient()) | ||||
| 
 | ||||
|                     { | ||||
|                         ForEachScenePresence(delegate(ScenePresence sp) { sp.SendPrimUpdates(); }); | ||||
|                         if(m_frame % 20 == 0) | ||||
|                             RegionSyncClientModule.SendCoarseLocations(); | ||||
|                         // make border crossing work in the CMs | ||||
|                         m_sceneGraph.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|                         { | ||||
|                 // If it's a client manager, just send prim updates | ||||
|                 // This will get fixed later to only send to locally logged in presences rather than all presences | ||||
|                 // but requires pulling apart the concept of a client from the concept of a presence/avatar | ||||
|                     ForEachScenePresence(delegate(ScenePresence sp) { sp.SendPrimUpdates(); }); | ||||
|                     if(Frame % 20 == 0) | ||||
|                         RegionSyncClientModule.SendCoarseLocations(); | ||||
|                     // make border crossing work in the CMs | ||||
|                     m_sceneGraph.ForEachScenePresence(delegate(ScenePresence sp) | ||||
|                             { | ||||
|                             if (!sp.IsChildAgent) | ||||
|                             { | ||||
|                                 // Check that we have a physics actor or we're sitting on something | ||||
|                                 if (sp.ParentID == 0 && sp.PhysicsActor != null || sp.ParentID != 0) | ||||
|                                 { | ||||
|                                     sp.CheckForBorderCrossing(); | ||||
|                                 } | ||||
|                             // Check that we have a physics actor or we're sitting on something | ||||
|                             if (sp.ParentID == 0 && sp.PhysicsActor != null || sp.ParentID != 0) | ||||
|                             { | ||||
|                             sp.CheckForBorderCrossing(); | ||||
|                             } | ||||
|                         }); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         if (m_frame % m_update_presences == 0) | ||||
|                             m_sceneGraph.UpdatePresences(); | ||||
|                     } | ||||
| 
 | ||||
|                     // REGION SYNC | ||||
|                     // If this is a synced server, send updates to client managers at this time | ||||
|                     // This batches updates, but the client manager will forward on to clients without | ||||
|                     // additional delay | ||||
|                     if (IsSyncedServer()) | ||||
|                     { | ||||
|                         m_regionSyncServerModule.SendUpdates(); | ||||
|                     } | ||||
| 
 | ||||
|                     //SYMMETRIC SYNC | ||||
| 
 | ||||
|                     //NOTE: If it is configured as symmetric sync in opensim.ini, the above IsSyncedServer() or IsSyncedClient() should all return false | ||||
|                     if (RegionSyncModule != null) | ||||
|                     { | ||||
|                         RegionSyncModule.SendSceneUpdates(); | ||||
|                     } | ||||
|                     //end of SYMMETRIC SYNC | ||||
| 
 | ||||
|                     int tmpPhysicsMS2 = Util.EnvironmentTickCount(); | ||||
|                     // Do not simulate physics locally if this is a synced client | ||||
|                     //if (!IsSyncedClient()) | ||||
|                     if (IsSyncedServer() || IsPhysEngineActor()) | ||||
|                     { | ||||
|                         if ((m_frame % m_update_physics == 0) && m_physics_enabled) | ||||
|                             m_sceneGraph.UpdatePreparePhysics(); | ||||
|                     } | ||||
|                     physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2); | ||||
| 
 | ||||
|                     // Do not simulate physics locally if this is a synced client | ||||
|                     //if (!IsSyncedClient()) | ||||
|                     if (IsSyncedServer() || IsPhysEngineActor()) | ||||
|                     { | ||||
|                         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(); | ||||
|                     // Do not simulate physics locally if this is a synced client | ||||
|                     //if (!IsSyncedClient()) | ||||
|                     if (IsSyncedServer() || IsPhysEngineActor()) | ||||
|                     { | ||||
|                         if (m_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 (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 (m_frame % m_update_events == 0) | ||||
|                         { | ||||
|                             int evMS = Util.EnvironmentTickCount(); | ||||
|                             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) | ||||
|                     { | ||||
|                         // 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) | ||||
|                 else | ||||
|                 { | ||||
|                     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; | ||||
|                     if (Frame % m_update_presences == 0) | ||||
|                         m_sceneGraph.UpdatePresences(); | ||||
|                 } | ||||
| 
 | ||||
|                 maintc = Util.EnvironmentTickCountSubtract(maintc); | ||||
|                 maintc = (int)(m_timespan * 1000) - maintc; | ||||
|                 // REGION SYNC | ||||
|                 // If this is a synced server, send updates to client managers at this time | ||||
|                 // This batches updates, but the client manager will forward on to clients without | ||||
|                 // additional delay | ||||
|                 if (IsSyncedServer()) | ||||
|                 { | ||||
|                     m_regionSyncServerModule.SendUpdates(); | ||||
|                 } | ||||
| 
 | ||||
|                 if (maintc > 0) | ||||
|                     Thread.Sleep(maintc); | ||||
|                 //SYMMETRIC SYNC | ||||
| 
 | ||||
|                 // Tell the watchdog that this thread is still alive | ||||
|                 Watchdog.UpdateThread(); | ||||
|                 //NOTE: If it is configured as symmetric sync in opensim.ini, the above IsSyncedServer() or IsSyncedClient() should all return false | ||||
|                 if (RegionSyncModule != null) | ||||
|                 { | ||||
|                     RegionSyncModule.SendSceneUpdates(); | ||||
|                 } | ||||
|                 //end of SYMMETRIC SYNC | ||||
| 
 | ||||
|                 int tmpPhysicsMS2 = Util.EnvironmentTickCount(); | ||||
|                 if ((Frame % m_update_physics == 0) && m_physics_enabled && (IsSyncedServer() || IsPhysEngineActor())) | ||||
|                     m_sceneGraph.UpdatePreparePhysics(); | ||||
|                 physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2); | ||||
| 
 | ||||
|                 // Apply any pending avatar force input to the avatar's velocity | ||||
|                 if (Frame % m_update_entitymovement == 0 && (IsSyncedServer() || IsPhysEngineActor())) | ||||
|                     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 && (IsSyncedServer() || IsPhysEngineActor())) | ||||
|                 { | ||||
|                     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); ; | ||||
|                     } | ||||
| 
 | ||||
|                     if (Frame % m_update_backup == 0) | ||||
|                     { | ||||
|                         int backMS = Util.EnvironmentTickCount(); | ||||
|                         UpdateStorageBackup(); | ||||
|                         backupMS = Util.EnvironmentTickCountSubtract(backMS); | ||||
|                     } | ||||
| 
 | ||||
|                     if (Frame % m_update_terrain == 0) | ||||
|                     { | ||||
|                         int terMS = Util.EnvironmentTickCount(); | ||||
|                         UpdateTerrain(); | ||||
|                         terrainMS = Util.EnvironmentTickCountSubtract(terMS); | ||||
|                     } | ||||
| 
 | ||||
|                     //if (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 (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 && 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(); | ||||
|         }         | ||||
| 
 | ||||
|         public void GetCoarseLocations(out List<UUID> ids, out List<Vector3> locations) | ||||
|         { | ||||
|  | @ -3565,7 +3555,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|                     // If there is a CAPS handler, remove it now.  | ||||
|                     // A Synced server region will not have a CAPS handler for its presences | ||||
|                     if(CapsModule.GetCapsHandlerForUser(agentID) != null) | ||||
|                     if(CapsModule != null && CapsModule.GetCapsHandlerForUser(agentID) != null) | ||||
|                         CapsModule.RemoveCapsHandler(agentID); | ||||
| 
 | ||||
|                     // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever | ||||
|  | @ -3777,7 +3767,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport | ||||
| 
 | ||||
|             // 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})", | ||||
|                 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | ||||
|                 agent.AgentID, agent.circuitcode, teleportFlags); | ||||
|  | @ -3843,8 +3833,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                     RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | ||||
|                     agent.AgentID, agent.circuitcode); | ||||
| 
 | ||||
|                 CapsModule.NewUserConnection(agent); | ||||
|                 CapsModule.AddCapsHandler(agent.AgentID); | ||||
|                 if (CapsModule != null) | ||||
|                 { | ||||
|                     CapsModule.NewUserConnection(agent); | ||||
|                     CapsModule.AddCapsHandler(agent.AgentID); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -3859,7 +3852,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                         agent.AgentID, RegionInfo.RegionName); | ||||
| 
 | ||||
|                     sp.AdjustKnownSeeds(); | ||||
|                     CapsModule.NewUserConnection(agent); | ||||
|                      | ||||
|                     if (CapsModule != null) | ||||
|                         CapsModule.NewUserConnection(agent); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|  | @ -4347,15 +4342,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         public void RequestTeleportLocation(IClientAPI remoteClient, string regionName, Vector3 position, | ||||
|                                             Vector3 lookat, uint teleportFlags) | ||||
|         { | ||||
|             GridRegion regionInfo = GridService.GetRegionByName(UUID.Zero, regionName); | ||||
|             if (regionInfo == null) | ||||
|             List<GridRegion> regions = GridService.GetRegionsByName(RegionInfo.ScopeID, regionName, 1); | ||||
|             if (regions == null || regions.Count == 0) | ||||
|             { | ||||
|                 // can't find the region: Tell viewer and abort | ||||
|                 remoteClient.SendTeleportFailed("The region '" + regionName + "' could not be found."); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             RequestTeleportLocation(remoteClient, regionInfo.RegionHandle, position, lookat, teleportFlags); | ||||
|             RequestTeleportLocation(remoteClient, regions[0].RegionHandle, position, lookat, teleportFlags); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -5508,8 +5503,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         // from logging into the region, teleporting into the region | ||||
|         // or corssing the broder walking, but will NOT prevent | ||||
|         // child agent creation, thereby emulating the SL behavior. | ||||
|         public bool QueryAccess(UUID agentID, Vector3 position) | ||||
|         public bool QueryAccess(UUID agentID, Vector3 position, out string reason) | ||||
|         { | ||||
|             reason = String.Empty; | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -213,9 +213,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             for (int i = 0; i < Math.Min(presences.Count, maxLocations); ++i) | ||||
|             { | ||||
|                 ScenePresence sp = presences[i]; | ||||
|                  | ||||
|                 // If this presence is a child agent, we don't want its coarse locations | ||||
|                 if (sp.IsChildAgent) | ||||
|                     return; | ||||
|                     continue; | ||||
| 
 | ||||
|                 if (sp.ParentID != 0) | ||||
|                 { | ||||
|  |  | |||
|  | @ -658,7 +658,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 Utils.LongToUInts(handle, out x, out y); | ||||
|                 x = x / 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); | ||||
|                 } | ||||
|  | @ -732,6 +732,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|          | ||||
|         private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this() | ||||
|         { | ||||
|             m_DrawDistance = world.DefaultDrawDistance; | ||||
|             m_rootRegionHandle = reginfo.RegionHandle; | ||||
|             m_controllingClient = client; | ||||
|             m_firstname = m_controllingClient.FirstName; | ||||
|  | @ -1206,7 +1207,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 if (m_agentTransfer != null) | ||||
|                     m_agentTransfer.EnableChildAgents(this); | ||||
|                 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>(); | ||||
|                 if (friendsModule != null) | ||||
|  | @ -1355,7 +1358,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             m_CameraUpAxis = agentData.CameraUpAxis; | ||||
| 
 | ||||
|             // 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. | ||||
|             Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); | ||||
|  | @ -2524,7 +2531,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             // If we are using the the cached appearance then send it out to everyone | ||||
|             if (cachedappearance) | ||||
|             { | ||||
|                 m_log.InfoFormat("[SCENE PRESENCE]: 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  | ||||
|                 // complete appearance... send it out, if not, then we'll send it when | ||||
|  | @ -2762,8 +2769,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         #region Border Crossing Methods | ||||
| 
 | ||||
|         /// <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> | ||||
|         /// <remarks> | ||||
|         /// Also removes the avatar from the physical scene if transit has started. | ||||
|         /// </remarks> | ||||
|         public void CheckForBorderCrossing() | ||||
|         { | ||||
|             if (IsChildAgent) | ||||
|  | @ -2831,7 +2841,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                     neighbor = HaveNeighbor(Cardinals.N, ref fix); | ||||
|                 } | ||||
| 
 | ||||
| 
 | ||||
|                 // Makes sure avatar does not end up outside region | ||||
|                 if (neighbor <= 0) | ||||
|                 { | ||||
|  | @ -2886,6 +2895,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             } | ||||
|             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 | ||||
|                 // I'm not sure what this value should be, so I tried a few values. | ||||
|                 timeStep = 0.04f; | ||||
|  | @ -2897,6 +2913,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) | ||||
|         { | ||||
|             uint neighbourx = m_regionInfo.RegionLocX; | ||||
|  | @ -3003,7 +3028,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|                         //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))); | ||||
|                         if (Util.IsOutsideView(x, newRegionX, y, newRegionY)) | ||||
|                         if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY)) | ||||
|                         { | ||||
|                             byebyeRegions.Add(handle); | ||||
|                         } | ||||
|  | @ -3079,7 +3104,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|             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!! | ||||
|                 m_pos = cAgentData.Position + offset; | ||||
| 
 | ||||
|  | @ -3229,7 +3259,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             m_CameraLeftAxis = cAgent.LeftAxis; | ||||
|             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) | ||||
|                 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.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.CoreModules.Framework.EntityTransfer; | ||||
| using OpenSim.Region.CoreModules.World.Serialiser; | ||||
| using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | ||||
| using OpenSim.Tests.Common; | ||||
|  | @ -116,9 +117,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|             agent.ChildrenCapSeeds = new Dictionary<ulong, string>(); | ||||
|             agent.child = true; | ||||
| 
 | ||||
|             if (scene.PresenceService == null) | ||||
|                 Console.WriteLine("Presence Service is null"); | ||||
| 
 | ||||
|             scene.PresenceService.LoginAgent(agent.AgentID.ToString(), agent.SessionID, agent.SecureSessionID); | ||||
| 
 | ||||
|             string reason; | ||||
|  | @ -175,25 +173,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
| 
 | ||||
|             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] | ||||
|         public void T013_TestRemoveNeighbourRegion() | ||||
|  | @ -211,24 +190,36 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|             CompleteAvatarMovement | ||||
|             */ | ||||
|         } | ||||
| 
 | ||||
|         // I'm commenting this test, because this is not supposed to happen here | ||||
|         //[Test] | ||||
|         public void T020_TestMakeRootAgent() | ||||
|          | ||||
|         /// <summary> | ||||
|         /// Test that if a root agent logs into a region, a child agent is also established in the neighbouring region | ||||
|         /// </summary> | ||||
|         /// <remarks> | ||||
|         /// Please note that unlike the other tests here, this doesn't rely on structures | ||||
|         /// </remarks> | ||||
|         [Test] | ||||
|         public void TestChildAgentEstablished() | ||||
|         { | ||||
|             TestHelper.InMethod(); | ||||
| 
 | ||||
|             ScenePresence presence = scene.GetScenePresence(agent1); | ||||
|             Assert.That(presence.IsChildAgent, Is.False, "Starts out as a root agent"); | ||||
| 
 | ||||
|             presence.MakeChildAgent(); | ||||
|             Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent"); | ||||
| 
 | ||||
|             // Accepts 0 but rejects Constants.RegionSize | ||||
|             Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0); | ||||
|             presence.MakeRootAgent(pos,true); | ||||
|             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"); | ||||
| //            log4net.Config.XmlConfigurator.Configure(); | ||||
|              | ||||
|             UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); | ||||
|              | ||||
|             TestScene myScene1 = SceneSetupHelpers.SetupScene("Neighbour y", UUID.Random(), 1000, 1000); | ||||
|             TestScene myScene2 = SceneSetupHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000);             | ||||
|              | ||||
|             IConfigSource configSource = new IniConfigSource(); | ||||
|             configSource.AddConfig("Modules").Set("EntityTransferModule", "BasicEntityTransferModule");                       | ||||
|             EntityTransferModule etm = new EntityTransferModule(); | ||||
|              | ||||
|             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 | ||||
|  | @ -333,63 +324,26 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|             Assert.That(presence2.IsChildAgent, Is.True, "Did not return from region as expected."); | ||||
|             Assert.That(presence.IsChildAgent, Is.False, "Presence was not made root in old region again."); | ||||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void T030_TestAddAttachments() | ||||
|          | ||||
|         public void fixNullPresence() | ||||
|         { | ||||
|             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); | ||||
|             presence.AddAttachment(sog2); | ||||
|             presence.AddAttachment(sog3); | ||||
| 
 | ||||
|             Assert.That(presence.HasAttachments(), Is.True); | ||||
|             Assert.That(presence.ValidateAttachments(), Is.True); | ||||
|             acd1 = agent; | ||||
|         } | ||||
| 
 | ||||
|         [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() | ||||
|         { | ||||
|             UUID caps = UUID.Random(); | ||||
|  |  | |||
|  | @ -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)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -681,10 +681,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|             // | ||||
|             CheckThreatLevel(ThreatLevel.High, "osTeleportAgent"); | ||||
| 
 | ||||
|             TeleportAgent(agent, regionName, position, lookat); | ||||
|             TeleportAgent(agent, regionName, position, lookat, false); | ||||
|         } | ||||
| 
 | ||||
|         private void TeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat) | ||||
|         private void TeleportAgent(string agent, string regionName, | ||||
|             LSL_Types.Vector3 position, LSL_Types.Vector3 lookat, bool relaxRestrictions) | ||||
|         { | ||||
|             m_host.AddScriptLPS(1); | ||||
|             UUID agentId = new UUID(); | ||||
|  | @ -693,25 +694,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                 ScenePresence presence = World.GetScenePresence(agentId); | ||||
|                 if (presence != null) | ||||
|                 { | ||||
|                     // agent must be over owners land to avoid abuse | ||||
|                     if (m_host.OwnerID | ||||
|                     // For osTeleportAgent, agent must be over owners land to avoid abuse | ||||
|                     // For osTeleportOwner, this restriction isn't necessary | ||||
|                     if (relaxRestrictions || | ||||
|                         m_host.OwnerID | ||||
|                         == World.LandChannel.GetLandObject( | ||||
|                             presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) | ||||
|                     { | ||||
|                         // Check for hostname, attempt to make a HG link, | ||||
|                         // and convert the regionName to the target region | ||||
|                         if (regionName.Contains(".") && regionName.Contains(":")) | ||||
|                         { | ||||
|                             // Even though we use none of the results, we need to perform this call because it appears | ||||
|                             // to have some the side effect of setting up hypergrid teleport locations. | ||||
|                             World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1); | ||||
| //                            List<GridRegion> regions = World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1);                             | ||||
|                              | ||||
|                             string[] parts = regionName.Split(new char[] { ':' }); | ||||
|                             if (parts.Length > 2) | ||||
|                                 regionName = parts[0] + ':' + parts[1] + "/ " + parts[2]; | ||||
|                             regionName = "http://" + regionName; | ||||
|                         } | ||||
|                         World.RequestTeleportLocation(presence.ControllingClient, regionName, | ||||
|                             new Vector3((float)position.x, (float)position.y, (float)position.z), | ||||
|                             new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation); | ||||
|  | @ -728,10 +717,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|             // | ||||
|             CheckThreatLevel(ThreatLevel.High, "osTeleportAgent"); | ||||
| 
 | ||||
|             TeleportAgent(agent, regionX, regionY, position, lookat); | ||||
|             TeleportAgent(agent, regionX, regionY, position, lookat, false); | ||||
|         } | ||||
| 
 | ||||
|         private void TeleportAgent(string agent, int regionX, int regionY, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat) | ||||
|         private void TeleportAgent(string agent, int regionX, int regionY, | ||||
|             LSL_Types.Vector3 position, LSL_Types.Vector3 lookat, bool relaxRestrictions) | ||||
|         { | ||||
|             ulong regionHandle = Util.UIntsToLong(((uint)regionX * (uint)Constants.RegionSize), ((uint)regionY * (uint)Constants.RegionSize)); | ||||
| 
 | ||||
|  | @ -742,8 +732,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                 ScenePresence presence = World.GetScenePresence(agentId); | ||||
|                 if (presence != null) | ||||
|                 { | ||||
|                     // agent must be over owners land to avoid abuse | ||||
|                     if (m_host.OwnerID | ||||
|                     // For osTeleportAgent, agent must be over owners land to avoid abuse | ||||
|                     // For osTeleportOwner, this restriction isn't necessary | ||||
|                     if (relaxRestrictions || | ||||
|                         m_host.OwnerID | ||||
|                         == World.LandChannel.GetLandObject( | ||||
|                             presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) | ||||
|                     { | ||||
|  | @ -766,7 +758,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|             // Threat level None because this is what can already be done with the World Map in the viewer | ||||
|             CheckThreatLevel(ThreatLevel.None, "osTeleportOwner"); | ||||
| 
 | ||||
|             TeleportAgent(m_host.OwnerID.ToString(), regionName, position, lookat); | ||||
|             TeleportAgent(m_host.OwnerID.ToString(), regionName, position, lookat, true); | ||||
|         } | ||||
| 
 | ||||
|         public void osTeleportOwner(LSL_Types.Vector3 position, LSL_Types.Vector3 lookat) | ||||
|  | @ -778,7 +770,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|         { | ||||
|             CheckThreatLevel(ThreatLevel.None, "osTeleportOwner"); | ||||
| 
 | ||||
|             TeleportAgent(m_host.OwnerID.ToString(), regionX, regionY, position, lookat); | ||||
|             TeleportAgent(m_host.OwnerID.ToString(), regionX, regionY, position, lookat, true); | ||||
|         } | ||||
| 
 | ||||
|         // Functions that get information from the agent itself. | ||||
|  |  | |||
|  | @ -115,15 +115,15 @@ namespace OpenSim.Server.Handlers.Grid | |||
|                     case "get_region_flags": | ||||
|                         return GetRegionFlags(request); | ||||
|                 } | ||||
|                  | ||||
|                 m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method); | ||||
|             } | ||||
|             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(); | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         #region Method-specific handlers | ||||
|  |  | |||
|  | @ -341,10 +341,17 @@ namespace OpenSim.Server.Handlers.Simulation | |||
|             GridRegion destination = new GridRegion(); | ||||
|             destination.RegionID = regionID; | ||||
| 
 | ||||
|             bool result = m_SimulationService.QueryAccess(destination, id, position); | ||||
|             string reason; | ||||
|             bool result = m_SimulationService.QueryAccess(destination, id, position, out reason); | ||||
| 
 | ||||
|             responsedata["int_response_code"] = HttpStatusCode.OK; | ||||
|             responsedata["str_response_string"] = result.ToString(); | ||||
| 
 | ||||
|             OSDMap resp = new OSDMap(2); | ||||
| 
 | ||||
|             resp["success"] = OSD.FromBoolean(result); | ||||
|             resp["reason"] = OSD.FromString(reason); | ||||
| 
 | ||||
|             responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); | ||||
|         } | ||||
| 
 | ||||
|         protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) | ||||
|  |  | |||
|  | @ -71,7 +71,7 @@ namespace OpenSim.Services.AuthenticationService | |||
|                 string hashed = Util.Md5Hash(password + ":" + | ||||
|                         data.Data["passwordSalt"].ToString()); | ||||
| 
 | ||||
|                 m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}", password, hashed, data.Data["passwordHash"].ToString()); | ||||
|                 //m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}", password, hashed, data.Data["passwordHash"].ToString()); | ||||
| 
 | ||||
|                 if (data.Data["passwordHash"].ToString() == hashed) | ||||
|                 { | ||||
|  |  | |||
|  | @ -185,7 +185,7 @@ namespace OpenSim.Services.Connectors.Simulation | |||
|             } | ||||
| 
 | ||||
|             // unreachable | ||||
|             return true; | ||||
| //            return true; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -256,8 +256,10 @@ namespace OpenSim.Services.Connectors.Simulation | |||
| 
 | ||||
|         /// <summary> | ||||
|         /// </summary> | ||||
|         public bool QueryAccess(GridRegion destination, UUID id, Vector3 position) | ||||
|         public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) | ||||
|         { | ||||
|             reason = "Failed to contact destination"; | ||||
| 
 | ||||
|             // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); | ||||
| 
 | ||||
|             IPEndPoint ext = destination.ExternalEndPoint; | ||||
|  | @ -272,7 +274,11 @@ namespace OpenSim.Services.Connectors.Simulation | |||
|             try | ||||
|             { | ||||
|                 OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 10000); | ||||
|                 bool success = result["Success"].AsBoolean(); | ||||
|                 bool success = result["success"].AsBoolean(); | ||||
|                 reason = result["reason"].AsString(); | ||||
| 
 | ||||
|                 //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}", uri, success); | ||||
| 
 | ||||
|                 if (!success) | ||||
|                 { | ||||
|                     if (result.ContainsKey("Message")) | ||||
|  | @ -283,8 +289,17 @@ namespace OpenSim.Services.Connectors.Simulation | |||
|                             m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); | ||||
|                             return true; | ||||
|                         } | ||||
| 
 | ||||
|                         reason = result["Message"]; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         reason = "Communications failure"; | ||||
|                     } | ||||
| 
 | ||||
|                     return false; | ||||
|                 } | ||||
| 
 | ||||
|                 return success; | ||||
|             } | ||||
|             catch (Exception e) | ||||
|  |  | |||
|  | @ -271,6 +271,7 @@ namespace OpenSim.Services.GridService | |||
|         { | ||||
|             List<GridRegion> rinfos = new List<GridRegion>(); | ||||
|             RegionData region = m_Database.Get(regionID, scopeID); | ||||
|              | ||||
|             if (region != null) | ||||
|             { | ||||
|                 // Not really? Maybe? | ||||
|  | @ -278,15 +279,24 @@ namespace OpenSim.Services.GridService | |||
|                     region.posX + (int)Constants.RegionSize + 1, region.posY + (int)Constants.RegionSize + 1, scopeID); | ||||
| 
 | ||||
|                 foreach (RegionData rdata in rdatas) | ||||
|                 { | ||||
|                     if (rdata.RegionID != regionID) | ||||
|                     { | ||||
|                         int flags = Convert.ToInt32(rdata.Data["flags"]); | ||||
|                         if ((flags & (int)Data.RegionFlags.Hyperlink) == 0) // no hyperlinks as neighbours | ||||
|                             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; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -121,7 +121,7 @@ namespace OpenSim.Services.GridService | |||
| 
 | ||||
|                 m_Check4096 = gridConfig.GetBoolean("Check4096", true); | ||||
| 
 | ||||
|                 m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", string.Empty); | ||||
|                 m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles"); | ||||
| 
 | ||||
|                 m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); | ||||
| 
 | ||||
|  |  | |||
|  | @ -253,7 +253,7 @@ namespace OpenSim.Services.HypergridService | |||
| 
 | ||||
|             TravelingAgentInfo travel = m_TravelingAgents[sessionID]; | ||||
| 
 | ||||
|             return travel.GridExternalName == thisGridExternalName; | ||||
|             return travel.GridExternalName.ToLower() == thisGridExternalName.ToLower(); | ||||
|         } | ||||
| 
 | ||||
|         public bool VerifyClient(UUID sessionID, string reportedIP) | ||||
|  |  | |||
|  | @ -60,7 +60,7 @@ namespace OpenSim.Services.Interfaces | |||
| 
 | ||||
|         bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent); | ||||
| 
 | ||||
|         bool QueryAccess(GridRegion destination, UUID id, Vector3 position); | ||||
|         bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Message from receiving region to departing region, telling it got contacted by the client. | ||||
|  |  | |||
|  | @ -567,8 +567,11 @@ namespace OpenSim.Tests.Common.Mock | |||
|             agentData.lastname = m_lastName; | ||||
| 
 | ||||
|             ICapabilitiesModule capsModule = m_scene.RequestModuleInterface<ICapabilitiesModule>(); | ||||
|             agentData.CapsPath = capsModule.GetCapsPath(m_agentId); | ||||
|             agentData.ChildrenCapSeeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(m_agentId)); | ||||
|             if (capsModule != null) | ||||
|             { | ||||
|                 agentData.CapsPath = capsModule.GetCapsPath(m_agentId); | ||||
|                 agentData.ChildrenCapSeeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(m_agentId)); | ||||
|             } | ||||
| 
 | ||||
|             return agentData; | ||||
|         } | ||||
|  |  | |||
|  | @ -132,24 +132,11 @@ namespace OpenSim.Tests.Common.Setup | |||
|         public static TestScene SetupScene( | ||||
|             string name, UUID id, uint x, uint y, String realServices) | ||||
|         { | ||||
|             bool newScene = false; | ||||
| 
 | ||||
|             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 | ||||
|             MainConsole.Instance = new MockConsole("TEST PROMPT"); | ||||
|              | ||||
|             RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "127.0.0.1"); | ||||
|             regInfo.RegionName = name; | ||||
|             regInfo.RegionID = id; | ||||
|  | @ -164,50 +151,27 @@ namespace OpenSim.Tests.Common.Setup | |||
|             TestScene testScene = new TestScene( | ||||
|                 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(); | ||||
|             godsModule.Initialise(testScene, new IniConfigSource()); | ||||
|             testScene.AddModule(godsModule.Name, godsModule); | ||||
|             realServices = realServices.ToLower(); | ||||
|             // IConfigSource config = new IniConfigSource(); | ||||
| 
 | ||||
|             // If we have a brand new scene, need to initialize shared region modules | ||||
|             if ((m_assetService == null && m_inventoryService == null) || newScene) | ||||
|             { | ||||
|                 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 | ||||
|             if (realServices.Contains("asset")) | ||||
|                 StartAssetService(testScene, true); | ||||
|             else | ||||
|             { | ||||
|                 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); | ||||
|                 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); | ||||
| 
 | ||||
|             m_inventoryService.PostInitialise(); | ||||
|             m_assetService.PostInitialise(); | ||||
|  | @ -504,12 +468,10 @@ namespace OpenSim.Tests.Common.Setup | |||
|             TestClient client = new TestClient(agentData, scene); | ||||
|             scene.AddNewClient(client); | ||||
| 
 | ||||
|             // Stage 3: Invoke agent crossing, which converts the child agent into a root agent (with appearance, | ||||
|             // inventory, etc.) | ||||
|             //scene.AgentCrossing(agentData.AgentID, new Vector3(90, 90, 90), false); OBSOLETE | ||||
| 
 | ||||
|             // Stage 3: Complete the entrance into the region.  This converts the child agent into a root agent. | ||||
|             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; | ||||
|         } | ||||
|  | @ -543,24 +505,5 @@ namespace OpenSim.Tests.Common.Setup | |||
| 
 | ||||
|             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(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -94,6 +94,13 @@ | |||
|     ; Warning!  Don't use this with regions that have existing content!, This will likely break them | ||||
|     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 | ||||
|     ; 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. | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 | |||
|     AssetService = "OpenSim.Services.AssetService.dll:AssetService" | ||||
| 
 | ||||
|     ;; Directory for map tile images of linked regions | ||||
|     ; MapTileDirectory = "./" | ||||
|     ; MapTileDirectory = "./maptiles" | ||||
|   | ||||
|     ;; Next, we can specify properties of regions, including default and fallback regions | ||||
|     ;; The syntax is: Region_<RegionName> = "<flags>" | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ | |||
|     ;AllowHypergridMapSearch = true | ||||
| 
 | ||||
|     ;; Directory for map tile images of linked regions | ||||
|     ; MapTileDirectory = "./" | ||||
|     ; MapTileDirectory = "./maptiles" | ||||
| 
 | ||||
| [AvatarService] | ||||
|     ; | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ | |||
|     ; Check4096 = true | ||||
| 
 | ||||
|     ;; Directory for map tile images of remote regions | ||||
|     ; MapTileDirectory = "./" | ||||
|     ; MapTileDirectory = "./maptiles" | ||||
| 
 | ||||
|     ;; Next, we can specify properties of regions, including default and fallback regions | ||||
|     ;; The syntax is: Region_<RegioName> = "<flags>" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Dan Lake
						Dan Lake