aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs15
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs13
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs151
5 files changed, 119 insertions, 65 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index cea9044..f5e9be1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2357,7 +2357,9 @@ namespace OpenSim.Region.Framework.Scenes
2357 ScenePresence presence; 2357 ScenePresence presence;
2358 if (TryGetAvatar(remoteClient.AgentId, out presence)) 2358 if (TryGetAvatar(remoteClient.AgentId, out presence))
2359 { 2359 {
2360 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, att.UUID); 2360 // XXYY!!
2361 InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
2362 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
2361 IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); 2363 IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
2362 if (ava != null) 2364 if (ava != null)
2363 { 2365 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 33166df..f475c64 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2042,13 +2042,22 @@ namespace OpenSim.Region.Framework.Scenes
2042 } 2042 }
2043 else 2043 else
2044 { 2044 {
2045 AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode);
2046
2045 m_log.DebugFormat( 2047 m_log.DebugFormat(
2046 "[SCENE]: Adding new child agent for {0} in {1}", 2048 "[SCENE]: Adding new {0} agent for {1} in {2}",
2047 client.Name, RegionInfo.RegionName); 2049 ((aCircuit.child == true) ? "child" : "root"), client.Name, RegionInfo.RegionName);
2048 2050
2049 CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); 2051 CommsManager.UserProfileCacheService.AddNewUser(client.AgentId);
2050 2052
2051 CreateAndAddScenePresence(client); 2053 ScenePresence sp = CreateAndAddScenePresence(client);
2054
2055 // HERE!!! Do the initial attachments here
2056 if (aCircuit.child == false) // first agent upon login is root agent
2057 {
2058 sp.IsChildAgent = false;
2059 sp.RezAttachments();
2060 }
2052 } 2061 }
2053 2062
2054 m_LastLogin = Environment.TickCount; 2063 m_LastLogin = Environment.TickCount;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 3bd079a..fd13633 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -557,6 +557,7 @@ namespace OpenSim.Region.Framework.Scenes
557 SceneObjectGroup group = GetGroupByPrim(objectLocalID); 557 SceneObjectGroup group = GetGroupByPrim(objectLocalID);
558 if (group != null) 558 if (group != null)
559 { 559 {
560 m_log.DebugFormat("[SCENE GRAPH]: AttachObject got {0}", group.UUID);
560 if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) 561 if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId))
561 { 562 {
562 // If the attachment point isn't the same as the one previously used 563 // If the attachment point isn't the same as the one previously used
@@ -564,6 +565,7 @@ namespace OpenSim.Region.Framework.Scenes
564 // and not in a weird location somewhere unknown. 565 // and not in a weird location somewhere unknown.
565 if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint()) 566 if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
566 { 567 {
568 m_log.DebugFormat("[SCENE GRAPH]: AttachObject 1 got {0}", group.UUID);
567 attachPos = Vector3.Zero; 569 attachPos = Vector3.Zero;
568 } 570 }
569 571
@@ -572,7 +574,8 @@ namespace OpenSim.Region.Framework.Scenes
572 { 574 {
573 // Check object for stored attachment point 575 // Check object for stored attachment point
574 AttachmentPt = (uint)group.GetAttachmentPoint(); 576 AttachmentPt = (uint)group.GetAttachmentPoint();
575 } 577 m_log.DebugFormat("[SCENE GRAPH]: AttachObject 2 got {0}", group.UUID);
578 }
576 579
577 // if we still didn't find a suitable attachment point....... 580 // if we still didn't find a suitable attachment point.......
578 if (AttachmentPt == 0) 581 if (AttachmentPt == 0)
@@ -580,8 +583,12 @@ namespace OpenSim.Region.Framework.Scenes
580 // Stick it on left hand with Zero Offset from the attachment point. 583 // Stick it on left hand with Zero Offset from the attachment point.
581 AttachmentPt = (uint)AttachmentPoint.LeftHand; 584 AttachmentPt = (uint)AttachmentPoint.LeftHand;
582 attachPos = Vector3.Zero; 585 attachPos = Vector3.Zero;
586 m_log.DebugFormat("[SCENE GRAPH]: AttachObject 3 got {0}", group.UUID);
587
583 } 588 }
584 589
590 m_log.DebugFormat("[SCENE GRAPH]: AttachObject 4 got {0}", group.UUID);
591
585 group.SetAttachmentPoint(Convert.ToByte(AttachmentPt)); 592 group.SetAttachmentPoint(Convert.ToByte(AttachmentPt));
586 group.AbsolutePosition = attachPos; 593 group.AbsolutePosition = attachPos;
587 594
@@ -590,10 +597,12 @@ namespace OpenSim.Region.Framework.Scenes
590 597
591 if (group.GetFromItemID() == UUID.Zero) 598 if (group.GetFromItemID() == UUID.Zero)
592 { 599 {
600 m_log.DebugFormat("[SCENE GRAPH]: AttachObject 5 got {0}", group.UUID);
593 m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId); 601 m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
594 } 602 }
595 else 603 else
596 { 604 {
605 m_log.DebugFormat("[SCENE GRAPH]: AttachObject 6 got {0}", group.GetFromItemID());
597 itemId = group.GetFromItemID(); 606 itemId = group.GetFromItemID();
598 } 607 }
599 608
@@ -611,6 +620,8 @@ namespace OpenSim.Region.Framework.Scenes
611 remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false); 620 remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false);
612 } 621 }
613 } 622 }
623 else
624 m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
614 } 625 }
615 626
616 protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) 627 protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 708c455..1b541c4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -935,6 +935,7 @@ namespace OpenSim.Region.Framework.Scenes
935 SetAttachmentPoint(Convert.ToByte(attachmentpoint)); 935 SetAttachmentPoint(Convert.ToByte(attachmentpoint));
936 936
937 avatar.AddAttachment(this); 937 avatar.AddAttachment(this);
938 m_log.DebugFormat("[SOG]: Added att {0} to avie {1}", UUID, avatar.UUID);
938 939
939 if (!silent) 940 if (!silent)
940 { 941 {
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fc8b62e..b0bb005 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -652,9 +652,6 @@ namespace OpenSim.Region.Framework.Scenes
652 RegisterToEvents(); 652 RegisterToEvents();
653 SetDirectionVectors(); 653 SetDirectionVectors();
654 654
655 CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
656 if (userInfo != null)
657 userInfo.OnItemReceived += ItemReceived;
658 } 655 }
659 656
660 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, 657 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
@@ -1021,7 +1018,9 @@ namespace OpenSim.Region.Framework.Scenes
1021 } 1018 }
1022 1019
1023 /// <summary> 1020 /// <summary>
1024 /// Complete Avatar's movement into the region 1021 /// Complete Avatar's movement into the region.
1022 /// This is called upon a very important packet sent from the client,
1023 /// so it's client-controlled. Never call this method directly.
1025 /// </summary> 1024 /// </summary>
1026 public void CompleteMovement() 1025 public void CompleteMovement()
1027 { 1026 {
@@ -1042,22 +1041,19 @@ namespace OpenSim.Region.Framework.Scenes
1042 AbsolutePosition = pos; 1041 AbsolutePosition = pos;
1043 } 1042 }
1044 1043
1045 if (m_isChildAgent) 1044 m_isChildAgent = false;
1046 { 1045 bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1047 m_isChildAgent = false; 1046 MakeRootAgent(AbsolutePosition, m_flying);
1048 bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1049 MakeRootAgent(AbsolutePosition, m_flying);
1050
1051 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
1052 {
1053 m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
1054 Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI);
1055 m_callbackURI = null;
1056 }
1057 1047
1058 //m_log.DebugFormat("Completed movement"); 1048 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
1049 {
1050 m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
1051 Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI);
1052 m_callbackURI = null;
1059 } 1053 }
1060 1054
1055 //m_log.DebugFormat("Completed movement");
1056
1061 m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look); 1057 m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
1062 SendInitialData(); 1058 SendInitialData();
1063 1059
@@ -3154,6 +3150,20 @@ namespace OpenSim.Region.Framework.Scenes
3154 m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message); 3150 m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message);
3155 } 3151 }
3156 3152
3153 //Attachments
3154 List<int> attPoints = m_appearance.GetAttachedPoints();
3155 if (attPoints != null)
3156 {
3157 m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
3158 int i = 0;
3159 AttachmentData[] attachs = new AttachmentData[attPoints.Count];
3160 foreach (int point in attPoints)
3161 {
3162 attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
3163 }
3164 cAgent.Attachments = attachs;
3165 }
3166
3157 // Animations 3167 // Animations
3158 try 3168 try
3159 { 3169 {
@@ -3219,6 +3229,19 @@ namespace OpenSim.Region.Framework.Scenes
3219 m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message); 3229 m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message);
3220 } 3230 }
3221 3231
3232 // Attachments
3233 try
3234 {
3235 if (cAgent.Attachments != null)
3236 {
3237 foreach (AttachmentData att in cAgent.Attachments)
3238 {
3239 m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
3240 }
3241 }
3242 }
3243 catch { }
3244
3222 // Animations 3245 // Animations
3223 try 3246 try
3224 { 3247 {
@@ -3729,37 +3752,46 @@ namespace OpenSim.Region.Framework.Scenes
3729 return flags; 3752 return flags;
3730 } 3753 }
3731 3754
3732 private void ItemReceived(UUID itemID) 3755 /// <summary>
3756 /// RezAttachments. This should only be called upon login on the first region
3757 /// </summary>
3758 public void RezAttachments()
3733 { 3759 {
3734 if (IsChildAgent)
3735 return;
3736
3737 if (null == m_appearance) 3760 if (null == m_appearance)
3738 { 3761 {
3739 m_log.Warn("[ATTACHMENT] Appearance has not been initialized"); 3762 m_log.WarnFormat("[ATTACHMENT] Appearance has not been initialized for agent {0}", UUID);
3740 return; 3763 return;
3741 } 3764 }
3742 3765
3743 int attachpoint = m_appearance.GetAttachpoint(itemID); 3766 List<int> attPoints = m_appearance.GetAttachedPoints();
3744 if (attachpoint == 0) 3767 foreach (int p in attPoints)
3745 return;
3746
3747 UUID asset = m_appearance.GetAttachedAsset(attachpoint);
3748 if (UUID.Zero == asset) // We have just logged in
3749 { 3768 {
3769 UUID itemID = m_appearance.GetAttachedItem(p);
3770 UUID assetID = m_appearance.GetAttachedAsset(p);
3771
3772 if (UUID.Zero == assetID)
3773 {
3774 m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
3775 continue;
3776 }
3777
3750 try 3778 try
3751 { 3779 {
3752 // Rez from inventory 3780 // Rez from inventory
3753 asset = m_scene.RezSingleAttachment(ControllingClient, 3781 UUID asset = m_scene.RezSingleAttachment(ControllingClient,
3754 itemID, (uint)attachpoint); 3782 itemID, (uint)p);
3755 // Corner case: We are not yet a Scene Entity 3783
3756 // Setting attachment info in RezSingleAttachment will fail 3784 m_log.InfoFormat("[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
3757 // Set it here 3785 p, itemID, assetID, asset);
3758 // 3786
3759 m_appearance.SetAttachment((int)attachpoint, itemID, 3787 //SceneObjectPart att = m_scene.GetSceneObjectPart(asset);
3760 asset); 3788 //m_log.DebugFormat("[ATTCHMENT]: Got scene object parent {0} IsAtt {1}",
3761 m_log.InfoFormat("[ATTACHMENT] Rezzed attachment {0}, inworld asset {1}", 3789 // ((att.ParentGroup != null) ? "not null" : "null"), att.IsAttachment);
3762 itemID.ToString(), asset); 3790 //if (att.ParentGroup != null && !att.IsAttachment)
3791 //{
3792 // att.FromItemID = itemID;
3793 // m_scene.AttachObject(ControllingClient, att.ParentGroup.LocalId, 0, Quaternion.Identity, att.ParentGroup.AbsolutePosition, false);
3794 //}
3763 3795
3764 } 3796 }
3765 catch (Exception e) 3797 catch (Exception e)
@@ -3767,31 +3799,30 @@ namespace OpenSim.Region.Framework.Scenes
3767 m_log.ErrorFormat("[ATTACHMENT] Unable to rez attachment: {0}", e.ToString()); 3799 m_log.ErrorFormat("[ATTACHMENT] Unable to rez attachment: {0}", e.ToString());
3768 } 3800 }
3769 3801
3770 return;
3771 } 3802 }
3772 3803
3773 SceneObjectPart att = m_scene.GetSceneObjectPart(asset); 3804 //SceneObjectPart att = m_scene.GetSceneObjectPart(asset);
3774 3805
3775 // If this is null, then the asset has not yet appeared in world 3806 //// If this is null, then the asset has not yet appeared in world
3776 // so we revisit this when it does 3807 //// so we revisit this when it does
3777 // 3808 ////
3778 if (att != null && att.UUID != asset) // Yes. It's really needed 3809 //if (att != null && att.UUID != asset) // Yes. It's really needed
3779 { 3810 //{
3780 m_log.DebugFormat("[ATTACHMENT]: Attach from in world: ItemID {0}, Asset ID {1}, Attachment inworld: {2}", itemID.ToString(), asset.ToString(), att.UUID.ToString()); 3811 // m_log.DebugFormat("[ATTACHMENT]: Attach from in world: ItemID {0}, Asset ID {1}, Attachment inworld: {2}", itemID.ToString(), asset.ToString(), att.UUID.ToString());
3781 3812
3782 // This will throw if crossing katty-korner 3813 // // This will throw if crossing katty-korner
3783 // So catch it here to avoid the noid 3814 // // So catch it here to avoid the noid
3784 // 3815 // //
3785 try 3816 // try
3786 { 3817 // {
3787 // Attach from world, if not already attached 3818 // // Attach from world, if not already attached
3788 if (att.ParentGroup != null && !att.IsAttachment) 3819 // if (att.ParentGroup != null && !att.IsAttachment)
3789 m_scene.AttachObject(ControllingClient, att.ParentGroup.LocalId, 0, Quaternion.Identity, att.ParentGroup.AbsolutePosition, false); 3820 // m_scene.AttachObject(ControllingClient, att.ParentGroup.LocalId, 0, Quaternion.Identity, att.ParentGroup.AbsolutePosition, false);
3790 } 3821 // }
3791 catch (NullReferenceException) 3822 // catch (NullReferenceException)
3792 { 3823 // {
3793 } 3824 // }
3794 } 3825 //}
3795 } 3826 }
3796 } 3827 }
3797} 3828}