From c4727645b864a92fc489427c516ccab3a21c2d91 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 25 Jan 2011 14:23:58 -0800 Subject: Removed a few more spurious appearance saves. When an avatar enters a region the attachments module tries to update the appearance with attachments that are already part of the appearance. Just added a check to only save if the attachments weren't there before. --- .../Avatar/Attachments/AttachmentsModule.cs | 22 ++++++++++------------ .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 4 +++- 2 files changed, 13 insertions(+), 13 deletions(-) (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 360a014..ff26264 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -132,8 +132,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", AttachmentPoint: " + AttachmentPt); - if (m_scene.AvatarFactory != null) - m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } } catch (Exception e) @@ -336,7 +334,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); item = m_scene.InventoryService.GetItem(item); - presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); + bool changed = presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID); + if (changed && m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } return att.UUID; @@ -380,9 +380,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // XXYY!! InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); item = m_scene.InventoryService.GetItem(item); - presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); - - if (m_scene.AvatarFactory != null) + bool changed = presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID); + if (changed && m_scene.AvatarFactory != null) m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } } @@ -402,11 +401,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments ScenePresence presence; if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) { - presence.Appearance.DetachAttachment(itemID); - // Save avatar attachment information m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID); - if (m_scene.AvatarFactory != null) + + bool changed = presence.Appearance.DetachAttachment(itemID); + if (changed && m_scene.AvatarFactory != null) m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } @@ -431,9 +430,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments part.ParentGroup.PrimCount, remoteClient.AgentId, presence.AbsolutePosition)) return; - presence.Appearance.DetachAttachment(itemID); - - if (m_scene.AvatarFactory != null) + bool changed = presence.Appearance.DetachAttachment(itemID); + if (changed && m_scene.AvatarFactory != null) m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); part.ParentGroup.DetachToGround(); diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index ed0a290..f8ce444 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -217,7 +217,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory // update transaction. In theory, we should be able to do an immediate // appearance send and save here. - QueueAppearanceSave(client.AgentId); + // save only if there were changes, send no matter what (doesn't hurt to send twice) + if (changed) + QueueAppearanceSave(client.AgentId); QueueAppearanceSend(client.AgentId); } -- cgit v1.1 From a0469daf759d09de040aa8b5287fab9a83555cc1 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Wed, 26 Jan 2011 21:12:41 +0000 Subject: Implement command "land show". This shows all the parcels on the currently selected region/s This is useful for diagnostics. The command is "land show" rather than "show land" because it's implemented as a module specific subcommand. --- .../Region/CoreModules/World/Land/LandChannel.cs | 2 +- .../CoreModules/World/Land/LandManagementModule.cs | 97 ++++++++++++++++++---- .../Region/CoreModules/World/Land/LandObject.cs | 40 ++++++++- 3 files changed, 121 insertions(+), 18 deletions(-) (limited to 'OpenSim/Region/CoreModules') diff --git a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs index 1ad4db2..9e27ef0 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.CoreModules.World.Land #endregion private readonly Scene m_scene; - private readonly LandManagementModule m_landManagementModule; + private readonly LandManagementModule m_landManagementModule; public LandChannel(Scene scene, LandManagementModule landManagementMod) { diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 4f8e205..70767f7 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -30,6 +30,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; +using System.Text; using log4net; using Nini.Config; using OpenMetaverse; @@ -37,19 +38,22 @@ using OpenMetaverse.StructuredData; using OpenMetaverse.Messages.Linden; using OpenSim.Framework; using OpenSim.Framework.Capabilities; +using OpenSim.Framework.Console; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; -using OpenSim.Services.Interfaces; +using OpenSim.Region.CoreModules.Framework.InterfaceCommander; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Physics.Manager; -using Caps=OpenSim.Framework.Capabilities.Caps; +using OpenSim.Services.Interfaces; +using Caps = OpenSim.Framework.Capabilities.Caps; using GridRegion = OpenSim.Services.Interfaces.GridRegion; namespace OpenSim.Region.CoreModules.World.Land { // used for caching - internal class ExtendedLandData { + internal class ExtendedLandData + { public LandData LandData; public ulong RegionHandle; public uint X, Y; @@ -65,6 +69,9 @@ namespace OpenSim.Region.CoreModules.World.Land private LandChannel landChannel; private Scene m_scene; + protected Commander m_commander = new Commander("land"); + + protected IUserManagement m_userManager; // Minimum for parcels to work is 64m even if we don't actually use them. #pragma warning disable 0429 @@ -127,19 +134,27 @@ namespace OpenSim.Region.CoreModules.World.Land m_scene.EventManager.OnRequestParcelPrimCountUpdate += EventManagerOnRequestParcelPrimCountUpdate; m_scene.EventManager.OnParcelPrimCountTainted += EventManagerOnParcelPrimCountTainted; m_scene.EventManager.OnRegisterCaps += EventManagerOnRegisterCaps; + m_scene.EventManager.OnPluginConsole += EventManagerOnPluginConsole; lock (m_scene) { m_scene.LandChannel = (ILandChannel)landChannel; } + + InstallInterfaces(); } public void RegionLoaded(Scene scene) { + m_userManager = m_scene.RequestModuleInterface(); } public void RemoveRegion(Scene scene) - { + { + // TODO: Also release other event manager listeners here + + m_scene.EventManager.OnPluginConsole -= EventManagerOnPluginConsole; + m_scene.UnregisterModuleCommander(m_commander.Name); } // private bool OnVerifyUserConnection(ScenePresence scenePresence, out string reason) @@ -148,6 +163,29 @@ namespace OpenSim.Region.CoreModules.World.Land // reason = "You are not allowed to enter this sim."; // return nearestParcel != null; // } + + /// + /// Processes commandline input. Do not call directly. + /// + /// Commandline arguments + protected void EventManagerOnPluginConsole(string[] args) + { + if (args[0] == "land") + { + if (args.Length == 1) + { + m_commander.ProcessConsoleCommand("help", new string[0]); + return; + } + + string[] tmpArgs = new string[args.Length - 2]; + int i; + for (i = 2; i < args.Length; i++) + tmpArgs[i - 2] = args[i]; + + m_commander.ProcessConsoleCommand(args[1], tmpArgs); + } + } void EventManagerOnNewClient(IClientAPI client) { @@ -209,11 +247,6 @@ namespace OpenSim.Region.CoreModules.World.Land } } - - public void PostInitialise() - { - } - public void Close() { } @@ -223,11 +256,6 @@ namespace OpenSim.Region.CoreModules.World.Land get { return "LandManagementModule"; } } - public bool IsSharedModule - { - get { return false; } - } - #endregion #region Parcel Add/Remove/Get/Create @@ -1591,5 +1619,44 @@ namespace OpenSim.Region.CoreModules.World.Land UpdateLandObject(localID, land.LandData); } + + protected void InstallInterfaces() + { + Command showCommand = + new Command("show", CommandIntentions.COMMAND_STATISTICAL, ShowParcelsCommand, "Shows all parcels on the current region."); + + m_commander.RegisterCommand("show", showCommand); + + // Add this to our scene so scripts can call these functions + m_scene.RegisterModuleCommander(m_commander); + } + + protected void ShowParcelsCommand(Object[] args) + { + StringBuilder report = new StringBuilder(); + + report.AppendFormat("Land information for {0}\n", m_scene.RegionInfo.RegionName); + report.AppendFormat( + "{0,-20} {1,-9} {2,-18} {3,-18} {4,-20}\n", + "Parcel Name", + "Area", + "Starts", + "Ends", + "Owner"); + + lock (m_landList) + { + foreach (ILandObject lo in m_landList.Values) + { + LandData ld = lo.LandData; + + report.AppendFormat( + "{0,-20} {1,-9} {2,-18} {3,-18} {4,-20}\n", + ld.Name, ld.Area, lo.StartPoint, lo.EndPoint, m_userManager.GetUserName(ld.OwnerID)); + } + } + + MainConsole.Instance.Output(report.ToString()); + } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 4e1f9c5..b90e307 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -77,7 +77,43 @@ namespace OpenSim.Region.CoreModules.World.Land { get { return m_scene.RegionInfo.RegionID; } } - + + public Vector3 StartPoint + { + get + { + for (int y = 0; y < landArrayMax; y++) + { + for (int x = 0; x < landArrayMax; x++) + { + if (LandBitmap[x, y]) + return new Vector3(x * 4, y * 4, 0); + } + } + + return new Vector3(-1, -1, -1); + } + } + + public Vector3 EndPoint + { + get + { + for (int y = landArrayMax - 1; y >= 0; y--) + { + for (int x = landArrayMax - 1; x >= 0; x--) + { + if (LandBitmap[x, y]) + { + return new Vector3(x * 4, y * 4, 0); + } + } + } + + return new Vector3(-1, -1, -1); + } + } + #region Constructors public LandObject(UUID owner_id, bool is_group_owned, Scene scene) @@ -96,7 +132,7 @@ namespace OpenSim.Region.CoreModules.World.Land #region Member Functions #region General Functions - + /// /// Checks to see if this land object contains a point /// -- cgit v1.1