Fix region crossings and access to inventory after changing regions within

the same simulator
0.6.0-stable
Melanie Thielker 2008-08-19 15:09:35 +00:00
parent 5c360e7374
commit e5cdba1cb4
4 changed files with 50 additions and 7 deletions

View File

@ -49,6 +49,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory
private IDictionary<LLUUID, LLUUID> m_pendingOffers = new Dictionary<LLUUID, LLUUID>(); private IDictionary<LLUUID, LLUUID> m_pendingOffers = new Dictionary<LLUUID, LLUUID>();
private List<Scene> m_Scenelist = new List<Scene>(); private List<Scene> m_Scenelist = new List<Scene>();
private Dictionary<LLUUID, Scene> m_AgentRegions = new Dictionary<LLUUID, Scene>();
#region IRegionModule Members #region IRegionModule Members
@ -61,6 +62,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory
scene.RegisterModuleInterface<IInventoryModule>(this); scene.RegisterModuleInterface<IInventoryModule>(this);
scene.EventManager.OnNewClient += OnNewClient; scene.EventManager.OnNewClient += OnNewClient;
scene.EventManager.OnClientClosed += ClientLoggedOut;
} }
} }
@ -223,8 +225,28 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory
} }
} }
// public void TestFunction() public void SetRootAgentScene(LLUUID agentID, Scene scene)
// { {
// } m_AgentRegions[agentID] = scene;
}
public bool NeedSceneCacheClear(LLUUID agentID, Scene scene)
{
if (!m_AgentRegions.ContainsKey(agentID))
return true;
if(m_AgentRegions[agentID] == scene)
{
m_AgentRegions.Remove(agentID);
return true;
}
return false;
}
public void ClientLoggedOut(LLUUID agentID)
{
if (m_AgentRegions.ContainsKey(agentID))
m_AgentRegions.Remove(agentID);
}
} }
} }

View File

@ -3860,5 +3860,22 @@ namespace OpenSim.Region.Environment.Scenes
client.SendLayerData(patchX, patchY, Heightmap.GetFloatsSerialised()); client.SendLayerData(patchX, patchY, Heightmap.GetFloatsSerialised());
} }
public void SetRootAgentScene(LLUUID agentID)
{
IInventoryModule inv = RequestModuleInterface<IInventoryModule>();
if(inv == null)
return;
inv.SetRootAgentScene(agentID, this);
}
public bool NeedSceneCacheClear(LLUUID agentID)
{
IInventoryModule inv = RequestModuleInterface<IInventoryModule>();
if(inv == null)
return true;
return inv.NeedSceneCacheClear(agentID, this);
}
} }
} }

View File

@ -653,9 +653,10 @@ namespace OpenSim.Region.Environment.Scenes
SendCloseChildAgentConnections(avatar.UUID,avatar.GetKnownRegionList()); SendCloseChildAgentConnections(avatar.UUID,avatar.GetKnownRegionList());
} }
// if (teleport success) // seems to be always success here // if (teleport success) // seems to be always success here
// the user may change thier profile information in other region, // the user may change their profile information in other region,
// so the userinfo in UserProfileCache is not reliable any more, delete it // so the userinfo in UserProfileCache is not reliable any more, delete it
m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); if (avatar.Scene.NeedSceneCacheClear(avatar.UUID))
m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID);
m_log.InfoFormat("User {0} is going to another region, profile cache removed", avatar.UUID); m_log.InfoFormat("User {0} is going to another region, profile cache removed", avatar.UUID);
} }
else else

View File

@ -606,6 +606,8 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void MakeRootAgent(LLVector3 pos, bool isFlying) public void MakeRootAgent(LLVector3 pos, bool isFlying)
{ {
m_scene.SetRootAgentScene(m_uuid);
IAvatarFactory ava = m_scene.RequestModuleInterface<IAvatarFactory>(); IAvatarFactory ava = m_scene.RequestModuleInterface<IAvatarFactory>();
if (ava != null) if (ava != null)
{ {
@ -2010,9 +2012,10 @@ namespace OpenSim.Region.Environment.Scenes
m_scene.SendKillObject(m_localId); m_scene.SendKillObject(m_localId);
m_scene.NotifyMyCoarseLocationChange(); m_scene.NotifyMyCoarseLocationChange();
// the user may change thier profile information in other region, // the user may change their profile information in other region,
// so the userinfo in UserProfileCache is not reliable any more, delete it // so the userinfo in UserProfileCache is not reliable any more, delete it
m_scene.CommsManager.UserProfileCacheService.RemoveUser(UUID); if(m_scene.NeedSceneCacheClear(UUID))
m_scene.CommsManager.UserProfileCacheService.RemoveUser(UUID);
m_log.InfoFormat("User {0} is going to another region, profile cache removed", UUID); m_log.InfoFormat("User {0} is going to another region, profile cache removed", UUID);
} }
else else