aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Framework/IClientAPI.cs6
-rw-r--r--OpenSim/Framework/IScene.cs10
-rw-r--r--OpenSim/Framework/ISceneAgent.cs68
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs4
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs58
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs5
-rw-r--r--OpenSim/Region/Framework/Interfaces/IScenePresence.cs22
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs69
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs39
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs8
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs5
-rw-r--r--OpenSim/Tests/Common/Mock/TestClient.cs7
13 files changed, 203 insertions, 100 deletions
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index cda8a1b..6732d59 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -707,6 +707,12 @@ namespace OpenSim.Framework
707 707
708 UUID AgentId { get; } 708 UUID AgentId { get; }
709 709
710 /// <summary>
711 /// The scene agent for this client. This will only be set if the client has an agent in a scene (i.e. if it
712 /// is connected).
713 /// </summary>
714 ISceneAgent SceneAgent { get; }
715
710 UUID SessionId { get; } 716 UUID SessionId { get; }
711 717
712 UUID SecureSessionId { get; } 718 UUID SecureSessionId { get; }
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs
index 7b0fe37..6919c48 100644
--- a/OpenSim/Framework/IScene.cs
+++ b/OpenSim/Framework/IScene.cs
@@ -68,12 +68,16 @@ namespace OpenSim.Framework
68 event restart OnRestart; 68 event restart OnRestart;
69 69
70 /// <summary> 70 /// <summary>
71 /// Register the new client with the scene. The client starts off as a child agent - the later agent crossing 71 /// Add a new client and create a presence for it. All clients except initial login clients will starts off as a child agent
72 /// will promote it to a root agent. 72 /// - the later agent crossing will promote it to a root agent.
73 /// </summary> 73 /// </summary>
74 /// <param name="client"></param> 74 /// <param name="client"></param>
75 /// <param name="type">The type of agent to add.</param> 75 /// <param name="type">The type of agent to add.</param>
76 void AddNewClient(IClientAPI client, PresenceType type); 76 /// <returns>
77 /// The scene agent if the new client was added.
78 /// Null if the required scene agent already existed or no scene agent was added because the required client circuit doesn't exist.
79 /// </returns>
80 ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
77 81
78 /// <summary> 82 /// <summary>
79 /// Remove the given client from the scene. 83 /// Remove the given client from the scene.
diff --git a/OpenSim/Framework/ISceneAgent.cs b/OpenSim/Framework/ISceneAgent.cs
new file mode 100644
index 0000000..69e91ed
--- /dev/null
+++ b/OpenSim/Framework/ISceneAgent.cs
@@ -0,0 +1,68 @@
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
28using System;
29
30namespace OpenSim.Framework
31{
32 /// <summary>
33 /// An agent in the scene.
34 /// </summary>
35 /// <remarks>
36 /// Interface is a work in progress. Please feel free to add other required properties and methods.
37 /// </remarks>
38 public interface ISceneAgent : ISceneEntity
39 {
40 /// <value>
41 /// The client controlling this presence
42 /// </value>
43 IClientAPI ControllingClient { get; }
44
45 /// <summary>
46 /// What type of presence is this? User, NPC, etc.
47 /// </summary>
48 PresenceType PresenceType { get; }
49
50 /// <summary>
51 /// Avatar appearance data.
52 /// </summary>
53 /// <remarks>
54 // Because appearance setting is in a module, we actually need
55 // to give it access to our appearance directly, otherwise we
56 // get a synchronization issue.
57 /// </remarks>
58 AvatarAppearance Appearance { get; set; }
59
60 /// <summary>
61 /// Send initial scene data to the client controlling this agent
62 /// </summary>
63 /// <remarks>
64 /// This includes scene object data and the appearance data of other avatars.
65 /// </remarks>
66 void SendInitialDataToMe();
67 }
68} \ 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 effa8d0..af68de6 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -390,6 +390,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
390 } 390 }
391 } 391 }
392 public UUID AgentId { get { return m_agentId; } } 392 public UUID AgentId { get { return m_agentId; } }
393 public ISceneAgent SceneAgent { get; private set; }
393 public UUID ActiveGroupId { get { return m_activeGroupID; } } 394 public UUID ActiveGroupId { get { return m_activeGroupID; } }
394 public string ActiveGroupName { get { return m_activeGroupName; } } 395 public string ActiveGroupName { get { return m_activeGroupName; } }
395 public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } } 396 public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } }
@@ -531,6 +532,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
531 532
532 // Remove ourselves from the scene 533 // Remove ourselves from the scene
533 m_scene.RemoveClient(AgentId, true); 534 m_scene.RemoveClient(AgentId, true);
535 SceneAgent = null;
534 536
535 // We can't reach into other scenes and close the connection 537 // We can't reach into other scenes and close the connection
536 // We need to do this over grid communications 538 // We need to do this over grid communications
@@ -710,7 +712,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
710 712
711 public virtual void Start() 713 public virtual void Start()
712 { 714 {
713 m_scene.AddNewClient(this, PresenceType.User); 715 SceneAgent = m_scene.AddNewClient(this, PresenceType.User);
714 716
715 RefreshGroupMembership(); 717 RefreshGroupMembership();
716 } 718 }
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index ae8251a..b04fe9f 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -894,11 +894,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
894 IPEndPoint remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; 894 IPEndPoint remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint;
895 895
896 // Begin the process of adding the client to the simulator 896 // Begin the process of adding the client to the simulator
897 AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint); 897 IClientAPI client = AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint);
898 898
899 // Send ack 899 // Send ack straight away to let the viewer know that the connection is active.
900 SendAckImmediate(remoteEndPoint, packet.Header.Sequence); 900 SendAckImmediate(remoteEndPoint, packet.Header.Sequence);
901 901
902 // FIXME: Nasty - this is the only way we currently know if Scene.AddNewClient() failed to find a
903 // circuit and bombed out early. That check might be pointless since authorization is established
904 // up here.
905 if (client != null && client.SceneAgent != null)
906 client.SceneAgent.SendInitialDataToMe();
907
902 // m_log.DebugFormat( 908 // m_log.DebugFormat(
903// "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", 909// "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms",
904// buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); 910// buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds);
@@ -933,7 +939,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
933 return sessionInfo.Authorised; 939 return sessionInfo.Authorised;
934 } 940 }
935 941
936 private void AddNewClient(UseCircuitCodePacket useCircuitCode, IPEndPoint remoteEndPoint) 942 /// <summary>
943 /// Add a new client.
944 /// </summary>
945 /// <param name="useCircuitCode"></param>
946 /// <param name="remoteEndPoint"></param>
947 /// <returns>
948 /// The client that was added or null if the client failed authorization or already existed.
949 /// </returns>
950 private IClientAPI AddNewClient(UseCircuitCodePacket useCircuitCode, IPEndPoint remoteEndPoint)
937 { 951 {
938 UUID agentID = useCircuitCode.CircuitCode.ID; 952 UUID agentID = useCircuitCode.CircuitCode.ID;
939 UUID sessionID = useCircuitCode.CircuitCode.SessionID; 953 UUID sessionID = useCircuitCode.CircuitCode.SessionID;
@@ -942,7 +956,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
942 AuthenticateResponse sessionInfo; 956 AuthenticateResponse sessionInfo;
943 if (IsClientAuthorized(useCircuitCode, out sessionInfo)) 957 if (IsClientAuthorized(useCircuitCode, out sessionInfo))
944 { 958 {
945 AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo); 959 return AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo);
946 } 960 }
947 else 961 else
948 { 962 {
@@ -950,38 +964,44 @@ namespace OpenSim.Region.ClientStack.LindenUDP
950 m_log.WarnFormat( 964 m_log.WarnFormat(
951 "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}", 965 "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
952 useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint); 966 useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint);
967
968 return null;
953 } 969 }
954 } 970 }
955 971
956 protected virtual void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo) 972 /// <summary>
973 /// Add a client.
974 /// </summary>
975 /// <param name="circuitCode"></param>
976 /// <param name="agentID"></param>
977 /// <param name="sessionID"></param>
978 /// <param name="remoteEndPoint"></param>
979 /// <param name="sessionInfo"></param>
980 /// <returns>The client if it was added. Null if the client already existed.</returns>
981 protected virtual IClientAPI AddClient(
982 uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
957 { 983 {
984 IClientAPI client = null;
985
958 // In priciple there shouldn't be more than one thread here, ever. 986 // In priciple there shouldn't be more than one thread here, ever.
959 // But in case that happens, we need to synchronize this piece of code 987 // But in case that happens, we need to synchronize this piece of code
960 // because it's too important 988 // because it's too important
961 lock (this) 989 lock (this)
962 { 990 {
963 IClientAPI existingClient; 991 if (!m_scene.TryGetClient(agentID, out client))
964
965 if (!m_scene.TryGetClient(agentID, out existingClient))
966 { 992 {
967 // Create the LLUDPClient
968 LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO); 993 LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
969 // Create the LLClientView 994
970 LLClientView client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode); 995 client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode);
971 client.OnLogout += LogoutHandler; 996 client.OnLogout += LogoutHandler;
972 997
973 client.DisableFacelights = m_disableFacelights; 998 ((LLClientView)client).DisableFacelights = m_disableFacelights;
974 999
975 // Start the IClientAPI
976 client.Start(); 1000 client.Start();
977
978 }
979 else
980 {
981 m_log.WarnFormat("[LLUDPSERVER]: Ignoring a repeated UseCircuitCode from {0} at {1} for circuit {2}",
982 existingClient.AgentId, remoteEndPoint, circuitCode);
983 } 1001 }
984 } 1002 }
1003
1004 return client;
985 } 1005 }
986 1006
987 private void RemoveClient(LLUDPClient udpClient) 1007 private void RemoveClient(LLUDPClient udpClient)
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs
index 737c654..fb94355 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs
@@ -53,9 +53,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
53 public override void Update() {} 53 public override void Update() {}
54 public override void LoadWorldMap() {} 54 public override void LoadWorldMap() {}
55 55
56 public override void AddNewClient(IClientAPI client, PresenceType type) 56 public override ISceneAgent AddNewClient(IClientAPI client, PresenceType type)
57 { 57 {
58 client.OnObjectName += RecordObjectNameCall; 58 client.OnObjectName += RecordObjectNameCall;
59
60 // FIXME
61 return null;
59 } 62 }
60 63
61 public override void RemoveClient(UUID agentID, bool someReason) {} 64 public override void RemoveClient(UUID agentID, bool someReason) {}
diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
index ff39283..5e43843 100644
--- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
@@ -38,28 +38,8 @@ namespace OpenSim.Region.Framework.Interfaces
38 /// <remarks> 38 /// <remarks>
39 /// Interface is a work in progress. Please feel free to add other required properties and methods. 39 /// Interface is a work in progress. Please feel free to add other required properties and methods.
40 /// </remarks> 40 /// </remarks>
41 public interface IScenePresence : ISceneEntity 41 public interface IScenePresence : ISceneAgent
42 { 42 {
43 /// <value>
44 /// The client controlling this presence
45 /// </value>
46 IClientAPI ControllingClient { get; }
47
48 /// <summary>
49 /// What type of presence is this? User, NPC, etc.
50 /// </summary>
51 PresenceType PresenceType { get; }
52
53 /// <summary>
54 /// Avatar appearance data.
55 /// </summary>
56 /// <remarks>
57 // Because appearance setting is in a module, we actually need
58 // to give it access to our appearance directly, otherwise we
59 // get a synchronization issue.
60 /// </remarks>
61 AvatarAppearance Appearance { get; set; }
62
63 /// <summary> 43 /// <summary>
64 /// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments. 44 /// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments.
65 /// </summary> 45 /// </summary>
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f9ae39c..a51fca2 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2610,17 +2610,17 @@ namespace OpenSim.Region.Framework.Scenes
2610 #region Add/Remove Avatar Methods 2610 #region Add/Remove Avatar Methods
2611 2611
2612 /// <summary> 2612 /// <summary>
2613 /// Add a new client and create a child agent for it. 2613 /// Add a new client and create a child scene presence for it.
2614 /// </summary> 2614 /// </summary>
2615 /// <param name="client"></param> 2615 /// <param name="client"></param>
2616 /// <param name="type">The type of agent to add.</param> 2616 /// <param name="type">The type of agent to add.</param>
2617 public override void AddNewClient(IClientAPI client, PresenceType type) 2617 public override ISceneAgent AddNewClient(IClientAPI client, PresenceType type)
2618 { 2618 {
2619 AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); 2619 AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode);
2620 bool vialogin = false; 2620 bool vialogin = false;
2621 2621
2622 if (aCircuit == null) // no good, didn't pass NewUserConnection successfully 2622 if (aCircuit == null) // no good, didn't pass NewUserConnection successfully
2623 return; 2623 return null;
2624 2624
2625 vialogin = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 || 2625 vialogin = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 ||
2626 (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2626 (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
@@ -2628,60 +2628,61 @@ namespace OpenSim.Region.Framework.Scenes
2628 CheckHeartbeat(); 2628 CheckHeartbeat();
2629 ScenePresence presence; 2629 ScenePresence presence;
2630 2630
2631 if (GetScenePresence(client.AgentId) == null) // ensure there is no SP here 2631 ScenePresence sp = GetScenePresence(client.AgentId);
2632
2633 // XXX: Not sure how good it is to add a new client if a scene presence already exists. Possibly this
2634 // could occur if a viewer crashes and relogs before the old client is kicked out. But this could cause
2635 // other problems, and possible the code calling AddNewClient() should ensure that no client is already
2636 // connected.
2637 if (sp == null)
2632 { 2638 {
2633 m_log.Debug("[SCENE]: Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); 2639 m_log.Debug("[SCENE]: Adding new child scene presence " + client.Name + " to scene " + RegionInfo.RegionName);
2634 2640
2635 m_clientManager.Add(client); 2641 m_clientManager.Add(client);
2636 SubscribeToClientEvents(client); 2642 SubscribeToClientEvents(client);
2637 2643
2638 ScenePresence sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); 2644 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
2639 m_eventManager.TriggerOnNewPresence(sp); 2645 m_eventManager.TriggerOnNewPresence(sp);
2640 2646
2641 sp.TeleportFlags = (TeleportFlags)aCircuit.teleportFlags; 2647 sp.TeleportFlags = (TeleportFlags)aCircuit.teleportFlags;
2642 2648
2643 // HERE!!! Do the initial attachments right here 2649 // The first agent upon login is a root agent by design.
2644 // first agent upon login is a root agent by design. 2650 // For this agent we will have to rez the attachments.
2645 // All other AddNewClient calls find aCircuit.child to be true 2651 // All other AddNewClient calls find aCircuit.child to be true.
2646 if (aCircuit.child == false) 2652 if (aCircuit.child == false)
2647 { 2653 {
2654 // We have to set SP to be a root agent here so that SP.MakeRootAgent() will later not try to
2655 // start the scripts again (since this is done in RezAttachments()).
2656 // XXX: This is convoluted.
2648 sp.IsChildAgent = false; 2657 sp.IsChildAgent = false;
2649 2658
2650 if (AttachmentsModule != null) 2659 if (AttachmentsModule != null)
2651 Util.FireAndForget(delegate(object o) { AttachmentsModule.RezAttachments(sp); }); 2660 Util.FireAndForget(delegate(object o) { AttachmentsModule.RezAttachments(sp); });
2652 } 2661 }
2653 } 2662 }
2654 2663 else
2655 ScenePresence createdSp = GetScenePresence(client.AgentId);
2656 if (createdSp != null)
2657 { 2664 {
2658 m_LastLogin = Util.EnvironmentTickCount(); 2665 m_log.WarnFormat(
2666 "[SCENE]: Already found {0} scene presence for {1} in {2} when asked to add new scene presence",
2667 sp.IsChildAgent ? "child" : "root", sp.Name, RegionInfo.RegionName);
2668 }
2659 2669
2660 // Cache the user's name 2670 m_LastLogin = Util.EnvironmentTickCount();
2661 CacheUserName(createdSp, aCircuit);
2662 2671
2663 EventManager.TriggerOnNewClient(client); 2672 // Cache the user's name
2664 if (vialogin) 2673 CacheUserName(sp, aCircuit);
2665 {
2666 EventManager.TriggerOnClientLogin(client);
2667 2674
2668 // Send initial parcel data 2675 EventManager.TriggerOnNewClient(client);
2669 Vector3 pos = createdSp.AbsolutePosition; 2676 if (vialogin)
2670 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y); 2677 {
2671 land.SendLandUpdateToClient(client); 2678 EventManager.TriggerOnClientLogin(client);
2672 } 2679 // Send initial parcel data
2680 Vector3 pos = sp.AbsolutePosition;
2681 ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
2682 land.SendLandUpdateToClient(client);
2673 } 2683 }
2674 2684
2675 // Send all scene object to the new client 2685 return sp;
2676 Util.FireAndForget(delegate
2677 {
2678 EntityBase[] entities = Entities.GetEntities();
2679 foreach(EntityBase e in entities)
2680 {
2681 if (e != null && e is SceneObjectGroup)
2682 ((SceneObjectGroup)e).SendFullUpdateToClient(client);
2683 }
2684 });
2685 } 2686 }
2686 2687
2687 /// <summary> 2688 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 29ab071..84da700 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -177,7 +177,7 @@ namespace OpenSim.Region.Framework.Scenes
177 177
178 #region Add/Remove Agent/Avatar 178 #region Add/Remove Agent/Avatar
179 179
180 public abstract void AddNewClient(IClientAPI client, PresenceType type); 180 public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
181 public abstract void RemoveClient(UUID agentID, bool closeChildAgents); 181 public abstract void RemoveClient(UUID agentID, bool closeChildAgents);
182 182
183 public bool TryGetScenePresence(UUID agentID, out object scenePresence) 183 public bool TryGetScenePresence(UUID agentID, out object scenePresence)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 3c97852..2748a75 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -794,15 +794,6 @@ namespace OpenSim.Region.Framework.Scenes
794 794
795 AdjustKnownSeeds(); 795 AdjustKnownSeeds();
796 796
797 // we created a new ScenePresence (a new child agent) in a fresh region.
798 // Request info about all the (root) agents in this region
799 // Note: This won't send data *to* other clients in that region (children don't send)
800
801// MIC: This gets called again in CompleteMovement
802 // SendInitialFullUpdateToAllClients();
803 SendOtherAgentsAvatarDataToMe();
804 SendOtherAgentsAppearanceToMe();
805
806 RegisterToEvents(); 797 RegisterToEvents();
807 SetDirectionVectors(); 798 SetDirectionVectors();
808 799
@@ -1207,9 +1198,9 @@ namespace OpenSim.Region.Framework.Scenes
1207 { 1198 {
1208// DateTime startTime = DateTime.Now; 1199// DateTime startTime = DateTime.Now;
1209 1200
1210 m_log.DebugFormat( 1201// m_log.DebugFormat(
1211 "[SCENE PRESENCE]: Completing movement of {0} into region {1}", 1202// "[SCENE PRESENCE]: Completing movement of {0} into region {1}",
1212 client.Name, Scene.RegionInfo.RegionName); 1203// client.Name, Scene.RegionInfo.RegionName);
1213 1204
1214 Vector3 look = Velocity; 1205 Vector3 look = Velocity;
1215 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) 1206 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
@@ -1241,7 +1232,7 @@ namespace OpenSim.Region.Framework.Scenes
1241 //m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); 1232 //m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
1242 1233
1243 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); 1234 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
1244 SendInitialData(); 1235 ValidateAndSendAppearanceAndAgentData();
1245 1236
1246 // Create child agents in neighbouring regions 1237 // Create child agents in neighbouring regions
1247 if (openChildAgents && !IsChildAgent) 1238 if (openChildAgents && !IsChildAgent)
@@ -2531,11 +2522,31 @@ namespace OpenSim.Region.Framework.Scenes
2531 ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations); 2522 ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations);
2532 } 2523 }
2533 2524
2525 public void SendInitialDataToMe()
2526 {
2527 // Send all scene object to the new client
2528 Util.FireAndForget(delegate
2529 {
2530 // we created a new ScenePresence (a new child agent) in a fresh region.
2531 // Request info about all the (root) agents in this region
2532 // Note: This won't send data *to* other clients in that region (children don't send)
2533 SendOtherAgentsAvatarDataToMe();
2534 SendOtherAgentsAppearanceToMe();
2535
2536 EntityBase[] entities = Scene.Entities.GetEntities();
2537 foreach(EntityBase e in entities)
2538 {
2539 if (e != null && e is SceneObjectGroup)
2540 ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient);
2541 }
2542 });
2543 }
2544
2534 /// <summary> 2545 /// <summary>
2535 /// Do everything required once a client completes its movement into a region and becomes 2546 /// Do everything required once a client completes its movement into a region and becomes
2536 /// a root agent. 2547 /// a root agent.
2537 /// </summary> 2548 /// </summary>
2538 private void SendInitialData() 2549 private void ValidateAndSendAppearanceAndAgentData()
2539 { 2550 {
2540 //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID); 2551 //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID);
2541 // Moved this into CompleteMovement to ensure that Appearance is initialized before 2552 // Moved this into CompleteMovement to ensure that Appearance is initialized before
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 60d3c2d..e62e30f 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -55,6 +55,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
55 55
56 private UUID m_agentID = UUID.Random(); 56 private UUID m_agentID = UUID.Random();
57 57
58 public ISceneAgent SceneAgent { get; private set; }
59
58 private string m_username; 60 private string m_username;
59 private string m_nick; 61 private string m_nick;
60 62
@@ -547,6 +549,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
547 549
548 m_connected = false; 550 m_connected = false;
549 m_client.Close(); 551 m_client.Close();
552 SceneAgent = null;
550 } 553 }
551 554
552 public UUID SessionId 555 public UUID SessionId
@@ -897,12 +900,11 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
897 900
898 public void Start() 901 public void Start()
899 { 902 {
900 Scene.AddNewClient(this, PresenceType.User); 903 SceneAgent = m_scene.AddNewClient(this, PresenceType.User);
901 904
902 // Mimicking LLClientView which gets always set appearance from client. 905 // Mimicking LLClientView which gets always set appearance from client.
903 Scene scene = (Scene)Scene;
904 AvatarAppearance appearance; 906 AvatarAppearance appearance;
905 scene.GetAvatarAppearance(this, out appearance); 907 m_scene.GetAvatarAppearance(this, out appearance);
906 OnSetAppearance(this, appearance.Texture, (byte[])appearance.VisualParams.Clone()); 908 OnSetAppearance(this, appearance.Texture, (byte[])appearance.VisualParams.Clone());
907 } 909 }
908 910
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 2b60cc3..1b31663 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -43,7 +43,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC
43 private readonly UUID m_uuid = UUID.Random(); 43 private readonly UUID m_uuid = UUID.Random();
44 private readonly Scene m_scene; 44 private readonly Scene m_scene;
45 45
46
47 public NPCAvatar(string firstname, string lastname, Vector3 position, Scene scene) 46 public NPCAvatar(string firstname, string lastname, Vector3 position, Scene scene)
48 { 47 {
49 m_firstname = firstname; 48 m_firstname = firstname;
@@ -57,6 +56,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
57 get { return m_scene; } 56 get { return m_scene; }
58 } 57 }
59 58
59 public ISceneAgent SceneAgent { get { throw new NotImplementedException(); } }
60
60 public void Say(string message) 61 public void Say(string message)
61 { 62 {
62 SendOnChatFromClient(message, ChatTypeEnum.Say); 63 SendOnChatFromClient(message, ChatTypeEnum.Say);
@@ -845,6 +846,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
845 846
846 public void Start() 847 public void Start()
847 { 848 {
849 // We never start the client, so always fail.
850 throw new NotImplementedException();
848 } 851 }
849 852
850 public void Stop() 853 public void Stop()
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 1e74451..2b7895b 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -54,7 +54,7 @@ namespace OpenSim.Tests.Common.Mock
54 public Scene TeleportTargetScene; 54 public Scene TeleportTargetScene;
55 private TestClient TeleportSceneClient; 55 private TestClient TeleportSceneClient;
56 56
57 private IScene m_scene; 57 private Scene m_scene;
58 58
59 // Properties so that we can get at received data for test purposes 59 // Properties so that we can get at received data for test purposes
60 public List<UUID> ReceivedOfflineNotifications { get; private set; } 60 public List<UUID> ReceivedOfflineNotifications { get; private set; }
@@ -325,6 +325,8 @@ namespace OpenSim.Tests.Common.Mock
325 /// </value> 325 /// </value>
326 private UUID m_agentId; 326 private UUID m_agentId;
327 327
328 public ISceneAgent SceneAgent { get { throw new NotImplementedException(); } }
329
328 /// <value> 330 /// <value>
329 /// The last caps seed url that this client was given. 331 /// The last caps seed url that this client was given.
330 /// </value> 332 /// </value>
@@ -438,7 +440,7 @@ namespace OpenSim.Tests.Common.Mock
438 /// </summary> 440 /// </summary>
439 /// <param name="agentData"></param> 441 /// <param name="agentData"></param>
440 /// <param name="scene"></param> 442 /// <param name="scene"></param>
441 public TestClient(AgentCircuitData agentData, IScene scene) 443 public TestClient(AgentCircuitData agentData, Scene scene)
442 { 444 {
443 m_agentId = agentData.AgentID; 445 m_agentId = agentData.AgentID;
444 m_firstName = agentData.firstname; 446 m_firstName = agentData.firstname;
@@ -904,6 +906,7 @@ namespace OpenSim.Tests.Common.Mock
904 906
905 public void Start() 907 public void Start()
906 { 908 {
909 throw new NotImplementedException();
907 } 910 }
908 911
909 public void Stop() 912 public void Stop()