Bug fix: store correct position information upon logout. Fixes mantis #4608
parent
9fa9cfd215
commit
f4c165afe7
|
@ -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>();
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
object sp = null;
|
||||||
Vector3 position = new Vector3(128, 128, 0);
|
Vector3 position = new Vector3(128, 128, 0);
|
||||||
Vector3 lookat = new Vector3(0, 1, 0);
|
Vector3 lookat = new Vector3(0, 1, 0);
|
||||||
|
|
||||||
if (m_aScene.TryGetAvatar(client.AgentId, out sp))
|
if (client.Scene.TryGetAvatar(client.AgentId, out sp))
|
||||||
{
|
{
|
||||||
position = sp.AbsolutePosition;
|
if (sp is ScenePresence)
|
||||||
lookat = sp.Lookat;
|
{
|
||||||
|
position = ((ScenePresence)sp).AbsolutePosition;
|
||||||
|
lookat = ((ScenePresence)sp).Lookat;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_PresenceService.LogoutAgent(client.SessionId, position, lookat);
|
m_PresenceService.LogoutAgent(client.SessionId, position, lookat);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Reference in New Issue