diff options
author | Justin Clark-Casey (justincc) | 2011-08-18 00:53:05 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-08-18 00:53:05 +0100 |
commit | c1a34cd8da293e63d3cba70b5271c9a297789db2 (patch) | |
tree | f6d87f42151ca8891cb37ed1bf2a5d5361c86ddf /OpenSim | |
parent | comment out noisy attachments logging (diff) | |
download | opensim-SC-c1a34cd8da293e63d3cba70b5271c9a297789db2.zip opensim-SC-c1a34cd8da293e63d3cba70b5271c9a297789db2.tar.gz opensim-SC-c1a34cd8da293e63d3cba70b5271c9a297789db2.tar.bz2 opensim-SC-c1a34cd8da293e63d3cba70b5271c9a297789db2.tar.xz |
Don't try to save changed attachment states when an NPC with attachments is removed from the scene.
This is done by introducing a PresenceType enum into ScenePresence which currently has two values, User and Npc.
This seems better than a SaveAttachments flag in terms of code comprehension, though I'm still slightly uneasy about introducing these semantics to core objects
Diffstat (limited to 'OpenSim')
14 files changed, 71 insertions, 23 deletions
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index b5f975b..8f7a2e5 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs | |||
@@ -72,10 +72,11 @@ namespace OpenSim.Framework | |||
72 | 72 | ||
73 | /// <summary> | 73 | /// <summary> |
74 | /// Register the new client with the scene. The client starts off as a child agent - the later agent crossing | 74 | /// Register the new client with the scene. The client starts off as a child agent - the later agent crossing |
75 | /// will promote it to a root agent during login. | 75 | /// will promote it to a root agent. |
76 | /// </summary> | 76 | /// </summary> |
77 | /// <param name="client"></param | 77 | /// <param name="client"></param> |
78 | void AddNewClient(IClientAPI client); | 78 | /// <param name="type">The type of agent to add.</param> |
79 | void AddNewClient(IClientAPI client, PresenceType type); | ||
79 | 80 | ||
80 | /// <summary> | 81 | /// <summary> |
81 | /// Remove the given client from the scene. | 82 | /// Remove the given client from the scene. |
diff --git a/OpenSim/Framework/PresenceType.cs b/OpenSim/Framework/PresenceType.cs new file mode 100644 index 0000000..8c4c6e6 --- /dev/null +++ b/OpenSim/Framework/PresenceType.cs | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | |||
29 | namespace OpenSim.Framework | ||
30 | { | ||
31 | /// <summary> | ||
32 | /// Indicate the type of ScenePresence. | ||
33 | /// </summary> | ||
34 | public enum PresenceType | ||
35 | { | ||
36 | User, | ||
37 | Npc | ||
38 | } | ||
39 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 1d35973..f71871e 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -692,7 +692,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
692 | 692 | ||
693 | public virtual void Start() | 693 | public virtual void Start() |
694 | { | 694 | { |
695 | m_scene.AddNewClient(this); | 695 | m_scene.AddNewClient(this, PresenceType.User); |
696 | 696 | ||
697 | RefreshGroupMembership(); | 697 | RefreshGroupMembership(); |
698 | } | 698 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index a3639e8..97a1be6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -501,10 +501,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
501 | /// <summary> | 501 | /// <summary> |
502 | /// Update the attachment asset for the new sog details if they have changed. | 502 | /// Update the attachment asset for the new sog details if they have changed. |
503 | /// </summary> | 503 | /// </summary> |
504 | /// | 504 | /// <remarks> |
505 | /// This is essential for preserving attachment attributes such as permission. Unlike normal scene objects, | 505 | /// This is essential for preserving attachment attributes such as permission. Unlike normal scene objects, |
506 | /// these details are not stored on the region. | 506 | /// these details are not stored on the region. |
507 | /// | 507 | /// </remarks> |
508 | /// <param name="remoteClient"></param> | 508 | /// <param name="remoteClient"></param> |
509 | /// <param name="grp"></param> | 509 | /// <param name="grp"></param> |
510 | /// <param name="itemID"></param> | 510 | /// <param name="itemID"></param> |
diff --git a/OpenSim/Region/Examples/SimpleModule/RegionModule.cs b/OpenSim/Region/Examples/SimpleModule/RegionModule.cs index 088b818..3b8ce37 100644 --- a/OpenSim/Region/Examples/SimpleModule/RegionModule.cs +++ b/OpenSim/Region/Examples/SimpleModule/RegionModule.cs | |||
@@ -95,7 +95,7 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
95 | for (int i = 0; i < 1; i++) | 95 | for (int i = 0; i < 1; i++) |
96 | { | 96 | { |
97 | MyNpcCharacter m_character = new MyNpcCharacter(m_scene); | 97 | MyNpcCharacter m_character = new MyNpcCharacter(m_scene); |
98 | m_scene.AddNewClient(m_character); | 98 | m_scene.AddNewClient(m_character, PresenceType.Npc); |
99 | m_scene.AgentCrossing(m_character.AgentId, Vector3.Zero, false); | 99 | m_scene.AgentCrossing(m_character.AgentId, Vector3.Zero, false); |
100 | } | 100 | } |
101 | 101 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 13b4cbc..ae88a87 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2543,10 +2543,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2543 | #region Add/Remove Avatar Methods | 2543 | #region Add/Remove Avatar Methods |
2544 | 2544 | ||
2545 | /// <summary> | 2545 | /// <summary> |
2546 | /// Adding a New Client and Create a Presence for it. | 2546 | /// Add a new client and create a child agent for it. |
2547 | /// </summary> | 2547 | /// </summary> |
2548 | /// <param name="client"></param> | 2548 | /// <param name="client"></param> |
2549 | public override void AddNewClient(IClientAPI client) | 2549 | /// <param name="type">The type of agent to add.</param> |
2550 | public override void AddNewClient(IClientAPI client, PresenceType type) | ||
2550 | { | 2551 | { |
2551 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); | 2552 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); |
2552 | bool vialogin = false; | 2553 | bool vialogin = false; |
@@ -2566,7 +2567,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2566 | m_clientManager.Add(client); | 2567 | m_clientManager.Add(client); |
2567 | SubscribeToClientEvents(client); | 2568 | SubscribeToClientEvents(client); |
2568 | 2569 | ||
2569 | ScenePresence sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance); | 2570 | ScenePresence sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); |
2570 | m_eventManager.TriggerOnNewPresence(sp); | 2571 | m_eventManager.TriggerOnNewPresence(sp); |
2571 | 2572 | ||
2572 | sp.TeleportFlags = (TeleportFlags)aCircuit.teleportFlags; | 2573 | sp.TeleportFlags = (TeleportFlags)aCircuit.teleportFlags; |
@@ -3149,7 +3150,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3149 | 3150 | ||
3150 | m_eventManager.TriggerOnRemovePresence(agentID); | 3151 | m_eventManager.TriggerOnRemovePresence(agentID); |
3151 | 3152 | ||
3152 | if (avatar != null && (!avatar.IsChildAgent)) | 3153 | if (avatar != null && (!avatar.IsChildAgent) && avatar.PresenceType != PresenceType.Npc) |
3153 | avatar.SaveChangedAttachments(); | 3154 | avatar.SaveChangedAttachments(); |
3154 | 3155 | ||
3155 | ForEachClient( | 3156 | ForEachClient( |
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 2f1cdc1..ec94f10 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -175,7 +175,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
175 | 175 | ||
176 | #region Add/Remove Agent/Avatar | 176 | #region Add/Remove Agent/Avatar |
177 | 177 | ||
178 | public abstract void AddNewClient(IClientAPI client); | 178 | public abstract void AddNewClient(IClientAPI client, PresenceType type); |
179 | public abstract void RemoveClient(UUID agentID, bool closeChildAgents); | 179 | public abstract void RemoveClient(UUID agentID, bool closeChildAgents); |
180 | 180 | ||
181 | public bool TryGetScenePresence(UUID agentID, out object scenePresence) | 181 | public bool TryGetScenePresence(UUID agentID, out object scenePresence) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 65dc2c9..f40b373 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -590,12 +590,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
590 | } | 590 | } |
591 | } | 591 | } |
592 | 592 | ||
593 | protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) | 593 | protected internal ScenePresence CreateAndAddChildScenePresence( |
594 | IClientAPI client, AvatarAppearance appearance, PresenceType type) | ||
594 | { | 595 | { |
595 | ScenePresence newAvatar = null; | 596 | ScenePresence newAvatar = null; |
596 | 597 | ||
597 | // ScenePresence always defaults to child agent | 598 | // ScenePresence always defaults to child agent |
598 | newAvatar = new ScenePresence(client, m_parentScene, m_regInfo, appearance); | 599 | newAvatar = new ScenePresence(client, m_parentScene, m_regInfo, appearance, type); |
599 | 600 | ||
600 | AddScenePresence(newAvatar); | 601 | AddScenePresence(newAvatar); |
601 | 602 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 90c4706..e3bd393 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -75,6 +75,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
75 | 75 | ||
76 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 76 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
77 | 77 | ||
78 | /// <summary> | ||
79 | /// What type of presence is this? User, NPC, etc. | ||
80 | /// </summary> | ||
81 | public PresenceType PresenceType { get; private set; } | ||
82 | |||
78 | // private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); | 83 | // private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); |
79 | private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); | 84 | private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); |
80 | private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); | 85 | private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); |
@@ -715,8 +720,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
715 | m_animator = new ScenePresenceAnimator(this); | 720 | m_animator = new ScenePresenceAnimator(this); |
716 | } | 721 | } |
717 | 722 | ||
718 | private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this() | 723 | private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, PresenceType type) : this() |
719 | { | 724 | { |
725 | PresenceType = type; | ||
720 | m_DrawDistance = world.DefaultDrawDistance; | 726 | m_DrawDistance = world.DefaultDrawDistance; |
721 | m_rootRegionHandle = reginfo.RegionHandle; | 727 | m_rootRegionHandle = reginfo.RegionHandle; |
722 | m_controllingClient = client; | 728 | m_controllingClient = client; |
@@ -764,8 +770,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
764 | SetDirectionVectors(); | 770 | SetDirectionVectors(); |
765 | } | 771 | } |
766 | 772 | ||
767 | public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance) | 773 | public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance, PresenceType type) |
768 | : this(client, world, reginfo) | 774 | : this(client, world, reginfo, type) |
769 | { | 775 | { |
770 | m_appearance = appearance; | 776 | m_appearance = appearance; |
771 | } | 777 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index dd2c717..35b41fb 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs | |||
@@ -207,7 +207,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
207 | scene.NewUserConnection(acd1, 0, out reason); | 207 | scene.NewUserConnection(acd1, 0, out reason); |
208 | if (testclient == null) | 208 | if (testclient == null) |
209 | testclient = new TestClient(acd1, scene); | 209 | testclient = new TestClient(acd1, scene); |
210 | scene.AddNewClient(testclient); | 210 | scene.AddNewClient(testclient, PresenceType.User); |
211 | 211 | ||
212 | ScenePresence presence = scene.GetScenePresence(agent1); | 212 | ScenePresence presence = scene.GetScenePresence(agent1); |
213 | presence.MakeRootAgent(new Vector3(90,90,90),false); | 213 | presence.MakeRootAgent(new Vector3(90,90,90),false); |
@@ -257,7 +257,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
257 | // Adding child agent to region 1001 | 257 | // Adding child agent to region 1001 |
258 | string reason; | 258 | string reason; |
259 | scene2.NewUserConnection(acd1,0, out reason); | 259 | scene2.NewUserConnection(acd1,0, out reason); |
260 | scene2.AddNewClient(testclient); | 260 | scene2.AddNewClient(testclient, PresenceType.User); |
261 | 261 | ||
262 | ScenePresence presence = scene.GetScenePresence(agent1); | 262 | ScenePresence presence = scene.GetScenePresence(agent1); |
263 | presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true); | 263 | presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true); |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 15201da..c413634 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs | |||
@@ -893,7 +893,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
893 | 893 | ||
894 | public void Start() | 894 | public void Start() |
895 | { | 895 | { |
896 | Scene.AddNewClient(this); | 896 | Scene.AddNewClient(this, PresenceType.User); |
897 | 897 | ||
898 | // Mimicking LLClientView which gets always set appearance from client. | 898 | // Mimicking LLClientView which gets always set appearance from client. |
899 | Scene scene = (Scene)Scene; | 899 | Scene scene = (Scene)Scene; |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 3b7ae9d..c1da803 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -190,7 +190,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
190 | // } | 190 | // } |
191 | 191 | ||
192 | scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd); | 192 | scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd); |
193 | scene.AddNewClient(npcAvatar); | 193 | scene.AddNewClient(npcAvatar, PresenceType.Npc); |
194 | 194 | ||
195 | ScenePresence sp; | 195 | ScenePresence sp; |
196 | if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) | 196 | if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) |
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 8d2108c..03df7ab 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs | |||
@@ -379,7 +379,7 @@ namespace OpenSim.Tests.Common | |||
379 | 379 | ||
380 | // Stage 2: add the new client as a child agent to the scene | 380 | // Stage 2: add the new client as a child agent to the scene |
381 | TestClient client = new TestClient(agentData, scene); | 381 | TestClient client = new TestClient(agentData, scene); |
382 | scene.AddNewClient(client); | 382 | scene.AddNewClient(client, PresenceType.User); |
383 | 383 | ||
384 | // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. | 384 | // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. |
385 | ScenePresence scp = scene.GetScenePresence(agentData.AgentID); | 385 | ScenePresence scp = scene.GetScenePresence(agentData.AgentID); |
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 7b64947..b7cefeb 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs | |||
@@ -579,7 +579,7 @@ namespace OpenSim.Tests.Common.Mock | |||
579 | 579 | ||
580 | // Stage 2: add the new client as a child agent to the scene | 580 | // Stage 2: add the new client as a child agent to the scene |
581 | TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); | 581 | TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); |
582 | TeleportTargetScene.AddNewClient(TeleportSceneClient); | 582 | TeleportTargetScene.AddNewClient(TeleportSceneClient, PresenceType.User); |
583 | } | 583 | } |
584 | 584 | ||
585 | public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, | 585 | public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, |