aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs105
1 files changed, 50 insertions, 55 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 1744fb3..1f49a01 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -111,7 +111,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
111 return; 111 return;
112 112
113 if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId)) 113 if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId))
114 {
115 remoteClient.SendAgentAlertMessage(
116 "You don't have sufficient permissions to attach this object", false);
117
114 return; 118 return;
119 }
115 120
116 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should 121 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
117 // be removed when that functionality is implemented in opensim 122 // be removed when that functionality is implemented in opensim
@@ -141,76 +146,66 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
141 { 146 {
142 Vector3 attachPos = group.AbsolutePosition; 147 Vector3 attachPos = group.AbsolutePosition;
143 148
144 if (m_scene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) 149 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
150 // be removed when that functionality is implemented in opensim
151 AttachmentPt &= 0x7f;
152
153 // If the attachment point isn't the same as the one previously used
154 // set it's offset position = 0 so that it appears on the attachment point
155 // and not in a weird location somewhere unknown.
156 if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
145 { 157 {
146 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should 158 attachPos = Vector3.Zero;
147 // be removed when that functionality is implemented in opensim 159 }
148 AttachmentPt &= 0x7f;
149
150 // If the attachment point isn't the same as the one previously used
151 // set it's offset position = 0 so that it appears on the attachment point
152 // and not in a weird location somewhere unknown.
153 if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
154 {
155 attachPos = Vector3.Zero;
156 }
157 160
158 // AttachmentPt 0 means the client chose to 'wear' the attachment. 161 // AttachmentPt 0 means the client chose to 'wear' the attachment.
159 if (AttachmentPt == 0) 162 if (AttachmentPt == 0)
160 { 163 {
161 // Check object for stored attachment point 164 // Check object for stored attachment point
162 AttachmentPt = (uint)group.GetAttachmentPoint(); 165 AttachmentPt = (uint)group.GetAttachmentPoint();
163 } 166 }
164 167
165 // if we still didn't find a suitable attachment point....... 168 // if we still didn't find a suitable attachment point.......
166 if (AttachmentPt == 0) 169 if (AttachmentPt == 0)
167 { 170 {
168 // Stick it on left hand with Zero Offset from the attachment point. 171 // Stick it on left hand with Zero Offset from the attachment point.
169 AttachmentPt = (uint)AttachmentPoint.LeftHand; 172 AttachmentPt = (uint)AttachmentPoint.LeftHand;
170 attachPos = Vector3.Zero; 173 attachPos = Vector3.Zero;
171 } 174 }
172 175
173 group.SetAttachmentPoint((byte)AttachmentPt); 176 group.SetAttachmentPoint((byte)AttachmentPt);
174 group.AbsolutePosition = attachPos; 177 group.AbsolutePosition = attachPos;
175 178
176 // Remove any previous attachments 179 // Remove any previous attachments
177 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); 180 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
178 UUID itemID = UUID.Zero; 181 UUID itemID = UUID.Zero;
179 if (sp != null) 182 if (sp != null)
183 {
184 foreach (SceneObjectGroup grp in sp.Attachments)
180 { 185 {
181 foreach (SceneObjectGroup grp in sp.Attachments) 186 if (grp.GetAttachmentPoint() == (byte)AttachmentPt)
182 { 187 {
183 if (grp.GetAttachmentPoint() == (byte)AttachmentPt) 188 itemID = grp.GetFromItemID();
184 { 189 break;
185 itemID = grp.GetFromItemID();
186 break;
187 }
188 } 190 }
189 if (itemID != UUID.Zero)
190 DetachSingleAttachmentToInv(itemID, remoteClient);
191 } 191 }
192 if (itemID != UUID.Zero)
193 DetachSingleAttachmentToInv(itemID, remoteClient);
194 }
192 195
193 if (group.GetFromItemID() == UUID.Zero) 196 if (group.GetFromItemID() == UUID.Zero)
194 { 197 {
195 m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemID); 198 m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemID);
196 }
197 else
198 {
199 itemID = group.GetFromItemID();
200 }
201
202 ShowAttachInUserInventory(remoteClient, AttachmentPt, itemID, group);
203
204 AttachToAgent(sp, group, AttachmentPt, attachPos, silent);
205 } 199 }
206 else 200 else
207 { 201 {
208 remoteClient.SendAgentAlertMessage( 202 itemID = group.GetFromItemID();
209 "You don't have sufficient permissions to attach this object", false);
210
211 return false;
212 } 203 }
213 204
205 ShowAttachInUserInventory(remoteClient, AttachmentPt, itemID, group);
206
207 AttachToAgent(sp, group, AttachmentPt, attachPos, silent);
208
214 return true; 209 return true;
215 } 210 }
216 211