* Fixes prim crossing. See bug 1050.
* Causes the internal handling of attachments to put the prim group conceptually at the position of the avatar instead of 0,0,00.6.0-stable
parent
6fec9c789b
commit
a534257b0e
|
@ -168,12 +168,25 @@ namespace OpenSim.Region.Environment
|
||||||
/// <returns>Has permission?</returns>
|
/// <returns>Has permission?</returns>
|
||||||
public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos)
|
public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if ((newPos.X > 257f || newPos.X < -1f || newPos.Y > 257f || newPos.Y < -1f))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ILandObject land1 = m_scene.LandChannel.getLandObject(oldPos.X, oldPos.Y);
|
ILandObject land1 = m_scene.LandChannel.getLandObject(oldPos.X, oldPos.Y);
|
||||||
ILandObject land2 = m_scene.LandChannel.getLandObject(newPos.X, newPos.Y);
|
ILandObject land2 = m_scene.LandChannel.getLandObject(newPos.X, newPos.Y);
|
||||||
|
|
||||||
if (land1 == null || land2 == null)
|
if (land1 == null || land2 == null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (land2 == null)
|
||||||
|
{
|
||||||
|
// need this for crossing borders
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (land1.landData.globalID == land2.landData.globalID)
|
if (land1.landData.globalID == land2.landData.globalID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -314,6 +314,9 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
List<EntityBase> EntityList = GetEntities();
|
List<EntityBase> EntityList = GetEntities();
|
||||||
|
|
||||||
|
if (AttachmentPt == 0)
|
||||||
|
AttachmentPt = (uint)AttachmentPoint.LeftHand;
|
||||||
|
|
||||||
foreach (EntityBase obj in EntityList)
|
foreach (EntityBase obj in EntityList)
|
||||||
{
|
{
|
||||||
if (obj is SceneObjectGroup)
|
if (obj is SceneObjectGroup)
|
||||||
|
|
|
@ -1368,14 +1368,19 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
m_sceneXmlLoader.SavePrimsToXml2(fileName);
|
m_sceneXmlLoader.SavePrimsToXml2(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Locate New region Handle and offset the prim position for the new region
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="position">current position of Group</param>
|
||||||
|
/// <param name="grp">Scene Object Group that we're crossing</param>
|
||||||
|
|
||||||
public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp)
|
public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp)
|
||||||
{
|
{
|
||||||
m_log.Warn("Prim crossing: " + grp.UUID.ToString());
|
m_log.Warn("Prim crossing: " + grp.UUID.ToString());
|
||||||
int thisx = (int)RegionInfo.RegionLocX;
|
int thisx = (int)RegionInfo.RegionLocX;
|
||||||
int thisy = (int)RegionInfo.RegionLocY;
|
int thisy = (int)RegionInfo.RegionLocY;
|
||||||
|
|
||||||
int primcrossingXMLmethod = 0;
|
|
||||||
|
|
||||||
ulong newRegionHandle = 0;
|
ulong newRegionHandle = 0;
|
||||||
LLVector3 pos = position;
|
LLVector3 pos = position;
|
||||||
|
|
||||||
|
@ -1410,6 +1415,12 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
// Offset the positions for the new region across the border
|
// Offset the positions for the new region across the border
|
||||||
grp.OffsetForNewRegion(pos);
|
grp.OffsetForNewRegion(pos);
|
||||||
|
|
||||||
|
CrossPrimGroupIntoNewRegion(newRegionHandle, grp);
|
||||||
|
|
||||||
|
}
|
||||||
|
public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp)
|
||||||
|
{
|
||||||
|
int primcrossingXMLmethod = 0;
|
||||||
if (newRegionHandle != 0)
|
if (newRegionHandle != 0)
|
||||||
{
|
{
|
||||||
bool successYN = false;
|
bool successYN = false;
|
||||||
|
|
|
@ -1076,9 +1076,16 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags)
|
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags)
|
||||||
{
|
{
|
||||||
if (m_rootPart.UUID == part.UUID)
|
if (m_rootPart.UUID == part.UUID)
|
||||||
|
{
|
||||||
|
if (m_rootPart.m_IsAttachment)
|
||||||
|
{
|
||||||
|
part.SendFullUpdateToClient(remoteClient, m_rootPart.m_attachedPos, clientFlags);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
part.SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags);
|
part.SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
part.SendFullUpdateToClient(remoteClient, clientFlags);
|
part.SendFullUpdateToClient(remoteClient, clientFlags);
|
||||||
|
@ -1093,9 +1100,16 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part)
|
internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part)
|
||||||
{
|
{
|
||||||
if (m_rootPart.UUID == part.UUID)
|
if (m_rootPart.UUID == part.UUID)
|
||||||
|
{
|
||||||
|
if (m_rootPart.m_IsAttachment)
|
||||||
|
{
|
||||||
|
part.SendTerseUpdateToClient(remoteClient, m_rootPart.m_attachedPos);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
part.SendTerseUpdateToClient(remoteClient, AbsolutePosition);
|
part.SendTerseUpdateToClient(remoteClient, AbsolutePosition);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
part.SendTerseUpdateToClient(remoteClient);
|
part.SendTerseUpdateToClient(remoteClient);
|
||||||
|
@ -2143,6 +2157,11 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
|
if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
|
||||||
{
|
{
|
||||||
|
if (m_rootPart.m_IsAttachment)
|
||||||
|
{
|
||||||
|
m_rootPart.m_attachedPos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
AbsolutePosition = pos;
|
AbsolutePosition = pos;
|
||||||
}
|
}
|
||||||
//we need to do a terse update even if the move wasn't allowed
|
//we need to do a terse update even if the move wasn't allowed
|
||||||
|
|
|
@ -103,6 +103,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
[XmlIgnore] public bool m_IsAttachment = false;
|
[XmlIgnore] public bool m_IsAttachment = false;
|
||||||
[XmlIgnore] public uint m_attachmentPoint = (byte)0;
|
[XmlIgnore] public uint m_attachmentPoint = (byte)0;
|
||||||
[XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero;
|
[XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero;
|
||||||
|
[XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero;
|
||||||
|
|
||||||
public Int32 CreationDate;
|
public Int32 CreationDate;
|
||||||
public uint ParentID = 0;
|
public uint ParentID = 0;
|
||||||
|
@ -276,6 +277,15 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
m_groupPosition.Y = PhysActor.Position.Y;
|
m_groupPosition.Y = PhysActor.Position.Y;
|
||||||
m_groupPosition.Z = PhysActor.Position.Z;
|
m_groupPosition.Z = PhysActor.Position.Z;
|
||||||
}
|
}
|
||||||
|
if (m_IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence sp = m_parentGroup.Scene.GetScenePresence(m_attachedAvatar);
|
||||||
|
if (sp != null)
|
||||||
|
{
|
||||||
|
return sp.AbsolutePosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return m_groupPosition;
|
return m_groupPosition;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
|
@ -340,7 +350,11 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
public LLVector3 AbsolutePosition
|
public LLVector3 AbsolutePosition
|
||||||
{
|
{
|
||||||
get { return m_offsetPosition + m_groupPosition; }
|
get {
|
||||||
|
if (m_IsAttachment)
|
||||||
|
return GroupPosition;
|
||||||
|
|
||||||
|
return m_offsetPosition + m_groupPosition; }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected LLQuaternion m_rotationOffset;
|
protected LLQuaternion m_rotationOffset;
|
||||||
|
|
Loading…
Reference in New Issue