* Fix bug in r7162 where avatars could not move

* Was caused by the lack of a local id.  Local ids are now given from the same sequence as prims, rather than a separate one
* I don't believe this will cause any problems, but please revert to a separate sequence if it does
0.6.0-stable
Justin Clarke Casey 2008-11-07 22:49:36 +00:00
parent ba1d9ca26b
commit 4ace67a81d
4 changed files with 30 additions and 28 deletions

View File

@ -72,14 +72,6 @@ namespace OpenSim.Region.Environment.Scenes
public InnerScene m_innerScene; public InnerScene m_innerScene;
/// <summary>
/// The last allocated local prim id. When a new local id is requested, the next number in the sequence is
/// dispenced.
/// </summary>
private uint m_lastAllocatedLocalId = 720000;
private readonly Mutex _primAllocateMutex = new Mutex(false);
private int m_timePhase = 24; private int m_timePhase = 24;
/// <summary> /// <summary>
@ -1618,21 +1610,6 @@ namespace OpenSim.Region.Environment.Scenes
m_log.Info("[SCENE]: Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)"); m_log.Info("[SCENE]: Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)");
} }
/// <summary>
/// Returns a new unallocated local primitive ID
/// </summary>
/// <returns>A brand new local primitive ID</returns>
protected internal uint AllocateLocalPrimId()
{
uint myID;
_primAllocateMutex.WaitOne();
myID = ++m_lastAllocatedLocalId;
_primAllocateMutex.ReleaseMutex();
return myID;
}
public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
{ {
Vector3 pos = Vector3.Zero; Vector3 pos = Vector3.Zero;

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Threading;
using OpenMetaverse; using OpenMetaverse;
using log4net; using log4net;
using OpenSim.Framework; using OpenSim.Framework;
@ -48,6 +49,14 @@ namespace OpenSim.Region.Environment.Scenes
#region Fields #region Fields
/// <summary>
/// The last allocated local prim id. When a new local id is requested, the next number in the sequence is
/// dispensed.
/// </summary>
private uint m_lastAllocatedLocalId = 720000;
private readonly Mutex _primAllocateMutex = new Mutex(false);
private readonly ClientManager m_clientManager = new ClientManager(); private readonly ClientManager m_clientManager = new ClientManager();
public ClientManager ClientManager public ClientManager ClientManager
@ -213,6 +222,21 @@ namespace OpenSim.Region.Environment.Scenes
return null; return null;
} }
/// <summary>
/// Returns a new unallocated local ID
/// </summary>
/// <returns>A brand new local ID</returns>
protected internal uint AllocateLocalId()
{
uint myID;
_primAllocateMutex.WaitOne();
myID = ++m_lastAllocatedLocalId;
_primAllocateMutex.ReleaseMutex();
return myID;
}
public virtual T RequestModuleInterface<T>() public virtual T RequestModuleInterface<T>()
{ {
return default(T); return default(T);

View File

@ -567,7 +567,7 @@ namespace OpenSim.Region.Environment.Scenes
RegionHandle = m_scene.RegionInfo.RegionHandle; RegionHandle = m_scene.RegionInfo.RegionHandle;
m_rootPart.ParentID = 0; m_rootPart.ParentID = 0;
m_rootPart.LocalId = m_scene.AllocateLocalPrimId(); m_rootPart.LocalId = m_scene.AllocateLocalId();
// No need to lock here since the object isn't yet in a scene // No need to lock here since the object isn't yet in a scene
foreach (SceneObjectPart part in m_parts.Values) foreach (SceneObjectPart part in m_parts.Values)
@ -575,7 +575,7 @@ namespace OpenSim.Region.Environment.Scenes
if (Object.ReferenceEquals(part, m_rootPart)) if (Object.ReferenceEquals(part, m_rootPart))
continue; continue;
part.LocalId = m_scene.AllocateLocalPrimId(); part.LocalId = m_scene.AllocateLocalId();
part.ParentID = m_rootPart.LocalId; part.ParentID = m_rootPart.LocalId;
//m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID); //m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID);
} }
@ -1394,7 +1394,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="cGroupID"></param> /// <param name="cGroupID"></param>
public void CopyRootPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed) public void CopyRootPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed)
{ {
SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalPrimId(), OwnerID, GroupID, m_parts.Count, userExposed); SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed);
newPart.SetParent(this); newPart.SetParent(this);
lock (m_parts) lock (m_parts)
@ -1514,7 +1514,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="cGroupID"></param> /// <param name="cGroupID"></param>
public void CopyPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed) public void CopyPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed)
{ {
SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalPrimId(), OwnerID, GroupID, m_parts.Count, userExposed); SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed);
newPart.SetParent(this); newPart.SetParent(this);
lock (m_parts) lock (m_parts)
@ -2676,7 +2676,7 @@ namespace OpenSim.Region.Environment.Scenes
scriptPosTarget waypoint = new scriptPosTarget(); scriptPosTarget waypoint = new scriptPosTarget();
waypoint.targetPos = target; waypoint.targetPos = target;
waypoint.tolerance = tolerance; waypoint.tolerance = tolerance;
uint handle = m_scene.AllocateLocalPrimId(); uint handle = m_scene.AllocateLocalId();
lock (m_targets) lock (m_targets)
{ {
m_targets.Add(handle, waypoint); m_targets.Add(handle, waypoint);

View File

@ -492,6 +492,7 @@ namespace OpenSim.Region.Environment.Scenes
m_scene = world; m_scene = world;
m_uuid = client.AgentId; m_uuid = client.AgentId;
m_regionInfo = reginfo; m_regionInfo = reginfo;
m_localId = m_scene.AllocateLocalId();
IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>();
if (gm != null) if (gm != null)