Bug fix: store correct position information upon logout. Fixes mantis #4608

slimupdates
Diva Canto 2010-03-06 08:21:54 -08:00
parent 9fa9cfd215
commit f4c165afe7
6 changed files with 58 additions and 13 deletions

View File

@ -91,6 +91,8 @@ namespace OpenSim.Framework
/// </exception> /// </exception>
bool PresenceChildStatus(UUID agentId); bool PresenceChildStatus(UUID agentId);
bool TryGetAvatar(UUID agentID, out object scenePresence);
T RequestModuleInterface<T>(); T RequestModuleInterface<T>();
T[] RequestModuleInterfaces<T>(); T[] RequestModuleInterfaces<T>();

View File

@ -29,6 +29,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
@ -1443,6 +1444,7 @@ namespace OpenSim.Framework
} }
#endregion FireAndForget Threading Pattern #endregion FireAndForget Threading Pattern
/// <summary> /// <summary>
/// Environment.TickCount is an int but it counts all 32 bits so it goes positive /// Environment.TickCount is an int but it counts all 32 bits so it goes positive
/// and negative every 24.9 days. This trims down TickCount so it doesn't wrap /// and negative every 24.9 days. This trims down TickCount so it doesn't wrap
@ -1467,5 +1469,21 @@ namespace OpenSim.Framework
Int32 diff = EnvironmentTickCount() - prevValue; Int32 diff = EnvironmentTickCount() - prevValue;
return (diff >= 0) ? diff : (diff + EnvironmentTickCountMask + 1); return (diff >= 0) ? diff : (diff + EnvironmentTickCountMask + 1);
} }
/// <summary>
/// Prints the call stack at any given point. Useful for debugging.
/// </summary>
public static void PrintCallStack()
{
StackTrace stackTrace = new StackTrace(); // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)
// write call stack method names
foreach (StackFrame stackFrame in stackFrames)
{
m_log.Debug(stackFrame.GetMethod().DeclaringType + "." + stackFrame.GetMethod().Name); // write method name
}
}
} }
} }

View File

@ -77,23 +77,28 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence
public void OnNewClient(IClientAPI client) public void OnNewClient(IClientAPI client)
{ {
client.OnLogout += OnLogout; client.OnConnectionClosed += OnConnectionClose;
} }
public void OnLogout(IClientAPI client) public void OnConnectionClose(IClientAPI client)
{ {
client.OnLogout -= OnLogout; if (client.IsLoggingOut)
ScenePresence sp = null;
Vector3 position = new Vector3(128, 128, 0);
Vector3 lookat = new Vector3(0, 1, 0);
if (m_aScene.TryGetAvatar(client.AgentId, out sp))
{ {
position = sp.AbsolutePosition; object sp = null;
lookat = sp.Lookat; Vector3 position = new Vector3(128, 128, 0);
Vector3 lookat = new Vector3(0, 1, 0);
if (client.Scene.TryGetAvatar(client.AgentId, out sp))
{
if (sp is ScenePresence)
{
position = ((ScenePresence)sp).AbsolutePosition;
lookat = ((ScenePresence)sp).Lookat;
}
}
m_PresenceService.LogoutAgent(client.SessionId, position, lookat);
} }
m_PresenceService.LogoutAgent(client.SessionId, position, lookat);
} }
} }

View File

@ -4216,7 +4216,7 @@ namespace OpenSim.Region.Framework.Scenes
return m_sceneGraph.GetGroupByPrim(localID); return m_sceneGraph.GetGroupByPrim(localID);
} }
public bool TryGetAvatar(UUID avatarId, out ScenePresence avatar) public override bool TryGetAvatar(UUID avatarId, out ScenePresence avatar)
{ {
return m_sceneGraph.TryGetAvatar(avatarId, out avatar); return m_sceneGraph.TryGetAvatar(avatarId, out avatar);
} }

View File

@ -190,6 +190,21 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="agentID"></param> /// <param name="agentID"></param>
public abstract void RemoveClient(UUID agentID); public abstract void RemoveClient(UUID agentID);
public bool TryGetAvatar(UUID agentID, out object scenePresence)
{
scenePresence = null;
ScenePresence sp = null;
if (TryGetAvatar(agentID, out sp))
{
scenePresence = sp;
return true;
}
return false;
}
public abstract bool TryGetAvatar(UUID agentID, out ScenePresence scenePresence);
#endregion #endregion
/// <summary> /// <summary>

View File

@ -65,6 +65,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public override bool TryGetAvatar(UUID agentID, out ScenePresence scenePresence)
{
throw new NotImplementedException();
}
} }
[Test] [Test]