Eliminate duplicate AttachmentPoint properties by always using the one stored in the root part's state field.

bulletsim
Justin Clark-Casey (justincc) 2011-08-27 00:33:24 +01:00
parent b7700428ec
commit 1615e7d29f
4 changed files with 41 additions and 44 deletions

View File

@ -167,13 +167,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
return AttachObject(sp, group, AttachmentPt, silent); return AttachObject(sp, group, AttachmentPt, silent);
} }
private bool AttachObject(ScenePresence sp, SceneObjectGroup group, uint AttachmentPt, bool silent) private bool AttachObject(ScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[ATTACHMENTS MODULE]: Attaching object {0} {1} to {2} point {3} from ground (silent = {4})", // "[ATTACHMENTS MODULE]: Attaching object {0} {1} to {2} point {3} from ground (silent = {4})",
// group.Name, group.LocalId, sp.Name, AttachmentPt, silent); // group.Name, group.LocalId, sp.Name, AttachmentPt, silent);
if (sp.GetAttachments(AttachmentPt).Contains(group)) if (sp.GetAttachments(attachmentPt).Contains(group))
{ {
// m_log.WarnFormat( // m_log.WarnFormat(
// "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since it's already attached", // "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since it's already attached",
@ -186,39 +186,39 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
// TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
// be removed when that functionality is implemented in opensim // be removed when that functionality is implemented in opensim
AttachmentPt &= 0x7f; attachmentPt &= 0x7f;
// If the attachment point isn't the same as the one previously used // If the attachment point isn't the same as the one previously used
// set it's offset position = 0 so that it appears on the attachment point // set it's offset position = 0 so that it appears on the attachment point
// and not in a weird location somewhere unknown. // and not in a weird location somewhere unknown.
if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint()) if (attachmentPt != 0 && attachmentPt != group.AttachmentPoint)
{ {
attachPos = Vector3.Zero; attachPos = Vector3.Zero;
} }
// AttachmentPt 0 means the client chose to 'wear' the attachment. // AttachmentPt 0 means the client chose to 'wear' the attachment.
if (AttachmentPt == 0) if (attachmentPt == 0)
{ {
// Check object for stored attachment point // Check object for stored attachment point
AttachmentPt = (uint)group.GetAttachmentPoint(); attachmentPt = group.AttachmentPoint;
} }
// if we still didn't find a suitable attachment point....... // if we still didn't find a suitable attachment point.......
if (AttachmentPt == 0) if (attachmentPt == 0)
{ {
// Stick it on left hand with Zero Offset from the attachment point. // Stick it on left hand with Zero Offset from the attachment point.
AttachmentPt = (uint)AttachmentPoint.LeftHand; attachmentPt = (uint)AttachmentPoint.LeftHand;
attachPos = Vector3.Zero; attachPos = Vector3.Zero;
} }
group.SetAttachmentPoint((byte)AttachmentPt); group.AttachmentPoint = attachmentPt;
group.AbsolutePosition = attachPos; group.AbsolutePosition = attachPos;
// Remove any previous attachments // Remove any previous attachments
UUID itemID = UUID.Zero; UUID itemID = UUID.Zero;
foreach (SceneObjectGroup grp in sp.Attachments) foreach (SceneObjectGroup grp in sp.Attachments)
{ {
if (grp.GetAttachmentPoint() == (byte)AttachmentPt) if (grp.AttachmentPoint == attachmentPt)
{ {
itemID = grp.GetFromItemID(); itemID = grp.GetFromItemID();
break; break;
@ -232,9 +232,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
if (itemID == UUID.Zero) if (itemID == UUID.Zero)
itemID = AddSceneObjectAsAttachment(sp.ControllingClient, group).ID; itemID = AddSceneObjectAsAttachment(sp.ControllingClient, group).ID;
ShowAttachInUserInventory(sp, AttachmentPt, itemID, group); ShowAttachInUserInventory(sp, attachmentPt, itemID, group);
AttachToAgent(sp, group, AttachmentPt, attachPos, silent); AttachToAgent(sp, group, attachmentPt, attachPos, silent);
return true; return true;
} }
@ -293,7 +293,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
} }
private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( private SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
ScenePresence sp, UUID itemID, uint AttachmentPt) ScenePresence sp, UUID itemID, uint attachmentPt)
{ {
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
if (invAccess != null) if (invAccess != null)
@ -313,13 +313,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
// since scripts aren't running yet. So, clear it here. // since scripts aren't running yet. So, clear it here.
objatt.HasGroupChanged = false; objatt.HasGroupChanged = false;
bool tainted = false; bool tainted = false;
if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint)
tainted = true; tainted = true;
// This will throw if the attachment fails // This will throw if the attachment fails
try try
{ {
AttachObject(sp, objatt, AttachmentPt, false); AttachObject(sp, objatt, attachmentPt, false);
} }
catch (Exception e) catch (Exception e)
{ {
@ -348,7 +348,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
{ {
m_log.WarnFormat( m_log.WarnFormat(
"[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}",
itemID, sp.Name, AttachmentPt); itemID, sp.Name, attachmentPt);
} }
return objatt; return objatt;
@ -567,11 +567,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
// attachment. This is necessary in order to correctly save // attachment. This is necessary in order to correctly save
// and retrieve GroupPosition information for the attachment. // and retrieve GroupPosition information for the attachment.
// Finally, we restore the object's attachment status. // Finally, we restore the object's attachment status.
byte attachmentPoint = sog.GetAttachmentPoint(); uint attachmentPoint = sog.AttachmentPoint;
sog.UpdateGroupPosition(pos); sog.UpdateGroupPosition(pos);
sog.IsAttachment = false; sog.IsAttachment = false;
sog.AbsolutePosition = sog.RootPart.AttachedPos; sog.AbsolutePosition = sog.RootPart.AttachedPos;
sog.SetAttachmentPoint(attachmentPoint); sog.AttachmentPoint = attachmentPoint;
sog.HasGroupChanged = true; sog.HasGroupChanged = true;
} }
@ -594,14 +594,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
{ {
m_log.DebugFormat( m_log.DebugFormat(
"[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}",
grp.UUID, grp.GetAttachmentPoint()); grp.UUID, grp.AttachmentPoint);
return; return;
} }
m_log.DebugFormat( m_log.DebugFormat(
"[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
grp.UUID, grp.GetAttachmentPoint()); grp.UUID, grp.AttachmentPoint);
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp);
@ -668,7 +668,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
so.RootPart.AttachedPos = attachOffset; so.RootPart.AttachedPos = attachOffset;
so.IsAttachment = true; so.IsAttachment = true;
so.RootPart.SetParentLocalId(avatar.LocalId); so.RootPart.SetParentLocalId(avatar.LocalId);
so.SetAttachmentPoint(Convert.ToByte(attachmentpoint)); so.AttachmentPoint = attachmentpoint;
avatar.AddAttachment(so); avatar.AddAttachment(so);

View File

@ -111,7 +111,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
SceneObjectGroup attSo = attachments[0]; SceneObjectGroup attSo = attachments[0];
Assert.That(attSo.Name, Is.EqualTo(attName)); Assert.That(attSo.Name, Is.EqualTo(attName));
Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest)); Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest));
Assert.That(attSo.GetAttachmentPoint(), Is.EqualTo((byte)AttachmentPoint.Chest));
Assert.That(attSo.IsAttachment); Assert.That(attSo.IsAttachment);
Assert.That(attSo.UsesPhysics, Is.False); Assert.That(attSo.UsesPhysics, Is.False);
Assert.That(attSo.IsTemporary, Is.False); Assert.That(attSo.IsTemporary, Is.False);
@ -146,7 +145,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
SceneObjectGroup attSo = attachments[0]; SceneObjectGroup attSo = attachments[0];
Assert.That(attSo.Name, Is.EqualTo(attName)); Assert.That(attSo.Name, Is.EqualTo(attName));
Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest)); Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest));
Assert.That(attSo.GetAttachmentPoint(), Is.EqualTo((byte)AttachmentPoint.Chest));
Assert.That(attSo.IsAttachment); Assert.That(attSo.IsAttachment);
Assert.That(attSo.UsesPhysics, Is.False); Assert.That(attSo.UsesPhysics, Is.False);
Assert.That(attSo.IsTemporary, Is.False); Assert.That(attSo.IsTemporary, Is.False);
@ -242,7 +240,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
SceneObjectGroup attSo = attachments[0]; SceneObjectGroup attSo = attachments[0];
Assert.That(attSo.Name, Is.EqualTo(attName)); Assert.That(attSo.Name, Is.EqualTo(attName));
Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest)); Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest));
Assert.That(attSo.GetAttachmentPoint(), Is.EqualTo((byte)AttachmentPoint.Chest));
Assert.That(attSo.IsAttachment); Assert.That(attSo.IsAttachment);
Assert.That(attSo.UsesPhysics, Is.False); Assert.That(attSo.UsesPhysics, Is.False);
Assert.That(attSo.IsTemporary, Is.False); Assert.That(attSo.IsTemporary, Is.False);

View File

@ -81,7 +81,7 @@ namespace OpenSim.Region.CoreModules.World.Sound
if (grp.IsAttachment) if (grp.IsAttachment)
{ {
if (grp.GetAttachmentPoint() > 30) // HUD if (grp.AttachmentPoint > 30) // HUD
{ {
if (sp.ControllingClient.AgentId != grp.OwnerID) if (sp.ControllingClient.AgentId != grp.OwnerID)
return; return;
@ -115,7 +115,7 @@ namespace OpenSim.Region.CoreModules.World.Sound
{ {
SceneObjectGroup grp = part.ParentGroup; SceneObjectGroup grp = part.ParentGroup;
if (grp.IsAttachment && grp.GetAttachmentPoint() > 30) if (grp.IsAttachment && grp.AttachmentPoint > 30)
{ {
objectID = ownerID; objectID = ownerID;
parentID = ownerID; parentID = ownerID;

View File

@ -166,7 +166,24 @@ namespace OpenSim.Region.Framework.Scenes
/// <remarks> /// <remarks>
/// 0 if we're not attached to anything /// 0 if we're not attached to anything
/// </remarks> /// </remarks>
public uint AttachmentPoint; public uint AttachmentPoint
{
get
{
return m_rootPart.Shape.State;
}
set
{
IsAttachment = value != 0;
m_rootPart.Shape.State = (byte)value;
}
}
public void ClearPartAttachmentData()
{
AttachmentPoint = 0;
}
/// <summary> /// <summary>
/// Is this scene object phantom? /// Is this scene object phantom?
@ -976,23 +993,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public byte GetAttachmentPoint()
{
return m_rootPart.Shape.State;
}
public void SetAttachmentPoint(uint point)
{
AttachmentPoint = point;
IsAttachment = point != 0;
m_rootPart.Shape.State = (byte)point;
}
public void ClearPartAttachmentData()
{
SetAttachmentPoint((Byte)0);
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>