aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Grid')
-rw-r--r--OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs263
1 files changed, 141 insertions, 122 deletions
diff --git a/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs b/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs
index 1bf6049..644dce7 100644
--- a/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs
+++ b/OpenSim/Grid/UserServer.Modules/AvatarCreationModule.cs
@@ -110,7 +110,7 @@ namespace OpenSim.Grid.UserServer.Modules
110 } 110 }
111 Guid avatar = newAvatar.ID.Guid; 111 Guid avatar = newAvatar.ID.Guid;
112 Guid template = templateAvatar.ID.Guid; 112 Guid template = templateAvatar.ID.Guid;
113 CloneAvatar(avatar, template); 113 CloneAvatar(avatar, template, true, true);
114 114
115 } 115 }
116 catch (Exception e) 116 catch (Exception e)
@@ -121,7 +121,7 @@ namespace OpenSim.Grid.UserServer.Modules
121 } 121 }
122 #region Avatar Appearance Creation 122 #region Avatar Appearance Creation
123 123
124 public bool CloneAvatar(Guid avatarID, Guid templateID) 124 public bool CloneAvatar(Guid avatarID, Guid templateID, bool modifyPermissions, bool removeTargetsClothes)
125 { 125 {
126 m_log.InfoFormat("[AvatarAppearance] Starting to clone avatar {0} inventory to avatar {1}", templateID.ToString(), avatarID.ToString()); 126 m_log.InfoFormat("[AvatarAppearance] Starting to clone avatar {0} inventory to avatar {1}", templateID.ToString(), avatarID.ToString());
127 Guid bodyFolder = Guid.Empty; 127 Guid bodyFolder = Guid.Empty;
@@ -143,6 +143,13 @@ namespace OpenSim.Grid.UserServer.Modules
143 UUID tempOwnID = new UUID(templateID); 143 UUID tempOwnID = new UUID(templateID);
144 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(tempOwnID); 144 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(tempOwnID);
145 145
146 if (removeTargetsClothes)
147 {
148 //remove clothes and attachments from target avatar so that the end result isn't a merge of its existing clothes
149 // and the clothes from the template avatar.
150 RemoveClothesAndAttachments(avID);
151 }
152
146 List<InventoryFolderBase> templateInventory = m_inventoryService.GetInventorySkeleton(tempOwnID); 153 List<InventoryFolderBase> templateInventory = m_inventoryService.GetInventorySkeleton(tempOwnID);
147 if ((templateInventory != null) && (templateInventory.Count != 0)) 154 if ((templateInventory != null) && (templateInventory.Count != 0))
148 { 155 {
@@ -150,7 +157,7 @@ namespace OpenSim.Grid.UserServer.Modules
150 { 157 {
151 if (templateInventory[i].ParentID == UUID.Zero) 158 if (templateInventory[i].ParentID == UUID.Zero)
152 { 159 {
153 success = CloneFolder(avatarInventory, avID, UUID.Zero, appearance, templateInventory[i], templateInventory); 160 success = CloneFolder(avatarInventory, avID, UUID.Zero, appearance, templateInventory[i], templateInventory, modifyPermissions);
154 break; 161 break;
155 } 162 }
156 } 163 }
@@ -164,6 +171,121 @@ namespace OpenSim.Grid.UserServer.Modules
164 return success; 171 return success;
165 } 172 }
166 173
174 private bool CloneFolder(List<InventoryFolderBase> avatarInventory, UUID avID, UUID parentFolder, AvatarAppearance appearance, InventoryFolderBase templateFolder, List<InventoryFolderBase> templateFolders, bool modifyPermissions)
175 {
176 bool success = false;
177 UUID templateFolderId = templateFolder.ID;
178 if (templateFolderId != UUID.Zero)
179 {
180 InventoryFolderBase toFolder = FindFolder(templateFolder.Name, parentFolder.Guid, avatarInventory);
181 if (toFolder == null)
182 {
183 //create new folder
184 toFolder = new InventoryFolderBase();
185 toFolder.ID = UUID.Random();
186 toFolder.Name = templateFolder.Name;
187 toFolder.Owner = avID;
188 toFolder.Type = templateFolder.Type;
189 toFolder.Version = 1;
190 toFolder.ParentID = parentFolder;
191 if (!SynchronousRestObjectRequester.MakeRequest<InventoryFolderBase, bool>(
192 "POST", m_inventoryServerUrl + "CreateFolder/", toFolder))
193 {
194 m_log.InfoFormat("[AvatarApperance] Couldn't make new folder {0} in users inventory", toFolder.Name);
195 return false;
196 }
197 else
198 {
199 // m_log.InfoFormat("made new folder {0} in users inventory", toFolder.Name);
200 }
201 }
202
203 List<InventoryItemBase> templateItems = SynchronousRestObjectRequester.MakeRequest<Guid, List<InventoryItemBase>>(
204 "POST", m_inventoryServerUrl + "GetItems/", templateFolderId.Guid);
205 if ((templateItems != null) && (templateItems.Count > 0))
206 {
207 foreach (InventoryItemBase item in templateItems)
208 {
209
210 UUID clonedItemId = CloneInventoryItem(avID, toFolder.ID, item, modifyPermissions);
211 if (clonedItemId != UUID.Zero)
212 {
213 int appearanceType = ItemIsPartOfAppearance(item, appearance);
214 if (appearanceType >= 0)
215 {
216 UpdateAvatarAppearance(avID, appearanceType, clonedItemId, item.AssetID);
217 }
218
219 if (appearance != null)
220 {
221 int attachment = appearance.GetAttachpoint(item.ID);
222 if (attachment > 0)
223 {
224 UpdateAvatarAttachment(avID, attachment, clonedItemId, item.AssetID);
225 }
226 }
227 success = true;
228 }
229 }
230 }
231
232 List<InventoryFolderBase> subFolders = FindSubFolders(templateFolder.ID.Guid, templateFolders);
233 foreach (InventoryFolderBase subFolder in subFolders)
234 {
235 if (subFolder.Name.ToLower() != "trash")
236 {
237 success = CloneFolder(avatarInventory, avID, toFolder.ID, appearance, subFolder, templateFolders, modifyPermissions);
238 }
239 }
240 }
241 else
242 {
243 m_log.Info("[AvatarAppearance] Failed to find the template folder");
244 }
245 return success;
246 }
247
248 private UUID CloneInventoryItem(UUID avatarID, UUID avatarFolder, InventoryItemBase item, bool modifyPerms)
249 {
250 if (avatarFolder != UUID.Zero)
251 {
252 InventoryItemBase clonedItem = new InventoryItemBase();
253 clonedItem.Owner = avatarID;
254 clonedItem.AssetID = item.AssetID;
255 clonedItem.AssetType = item.AssetType;
256 clonedItem.BasePermissions = item.BasePermissions;
257 clonedItem.CreationDate = item.CreationDate;
258 clonedItem.CreatorId = item.CreatorId;
259 clonedItem.CreatorIdAsUuid = item.CreatorIdAsUuid;
260 clonedItem.CurrentPermissions = item.CurrentPermissions;
261 clonedItem.Description = item.Description;
262 clonedItem.EveryOnePermissions = item.EveryOnePermissions;
263 clonedItem.Flags = item.Flags;
264 clonedItem.Folder = avatarFolder;
265 clonedItem.GroupID = item.GroupID;
266 clonedItem.GroupOwned = item.GroupOwned;
267 clonedItem.GroupPermissions = item.GroupPermissions;
268 clonedItem.ID = UUID.Random();
269 clonedItem.InvType = item.InvType;
270 clonedItem.Name = item.Name;
271 clonedItem.NextPermissions = item.NextPermissions;
272 clonedItem.SalePrice = item.SalePrice;
273 clonedItem.SaleType = item.SaleType;
274
275 if (modifyPerms)
276 {
277 ModifyPermissions(ref clonedItem);
278 }
279
280 SynchronousRestObjectRequester.MakeRequest<InventoryItemBase, bool>(
281 "POST", m_inventoryServerUrl + "AddNewItem/", clonedItem);
282
283 return clonedItem.ID;
284 }
285
286 return UUID.Zero;
287 }
288
167 private void UpdateAvatarAppearance(UUID avatarID, int wearableType, UUID itemID, UUID assetID) 289 private void UpdateAvatarAppearance(UUID avatarID, int wearableType, UUID itemID, UUID assetID)
168 { 290 {
169 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID); 291 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID);
@@ -193,6 +315,20 @@ namespace OpenSim.Grid.UserServer.Modules
193 315
194 } 316 }
195 317
318 private void RemoveClothesAndAttachments(UUID avatarID)
319 {
320 AvatarAppearance appearance = m_userDataBaseService.GetUserAppearance(avatarID);
321 if (appearance == null)
322 {
323 appearance = CreateDefaultAppearance(avatarID);
324 }
325
326 appearance.ClearWearables();
327 appearance.ClearAttachments();
328 m_userDataBaseService.UpdateUserAppearance(avatarID, appearance);
329
330 }
331
196 private UUID FindFolderID(string name, List<InventoryFolderBase> folders) 332 private UUID FindFolderID(string name, List<InventoryFolderBase> folders)
197 { 333 {
198 foreach (InventoryFolderBase folder in folders) 334 foreach (InventoryFolderBase folder in folders)
@@ -254,48 +390,6 @@ namespace OpenSim.Grid.UserServer.Modules
254 return subFolders; 390 return subFolders;
255 } 391 }
256 392
257
258 private UUID CloneInventoryItem(UUID avatarID, UUID avatarFolder, InventoryItemBase item, bool modifyPerms)
259 {
260 if (avatarFolder != UUID.Zero)
261 {
262 InventoryItemBase clonedItem = new InventoryItemBase();
263 clonedItem.Owner = avatarID;
264 clonedItem.AssetID = item.AssetID;
265 clonedItem.AssetType = item.AssetType;
266 clonedItem.BasePermissions = item.BasePermissions;
267 clonedItem.CreationDate = item.CreationDate;
268 clonedItem.CreatorId = item.CreatorId;
269 clonedItem.CreatorIdAsUuid = item.CreatorIdAsUuid;
270 clonedItem.CurrentPermissions = item.CurrentPermissions;
271 clonedItem.Description = item.Description;
272 clonedItem.EveryOnePermissions = item.EveryOnePermissions;
273 clonedItem.Flags = item.Flags;
274 clonedItem.Folder = avatarFolder;
275 clonedItem.GroupID = item.GroupID;
276 clonedItem.GroupOwned = item.GroupOwned;
277 clonedItem.GroupPermissions = item.GroupPermissions;
278 clonedItem.ID = UUID.Random();
279 clonedItem.InvType = item.InvType;
280 clonedItem.Name = item.Name;
281 clonedItem.NextPermissions = item.NextPermissions;
282 clonedItem.SalePrice = item.SalePrice;
283 clonedItem.SaleType = item.SaleType;
284
285 if (modifyPerms)
286 {
287 ModifyPermissions(ref clonedItem);
288 }
289
290 SynchronousRestObjectRequester.MakeRequest<InventoryItemBase, bool>(
291 "POST", m_inventoryServerUrl + "AddNewItem/", clonedItem);
292
293 return clonedItem.ID;
294 }
295
296 return UUID.Zero;
297 }
298
299 protected virtual void ModifyPermissions(ref InventoryItemBase item) 393 protected virtual void ModifyPermissions(ref InventoryItemBase item)
300 { 394 {
301 // Propagate Permissions 395 // Propagate Permissions
@@ -354,83 +448,6 @@ namespace OpenSim.Grid.UserServer.Modules
354 } 448 }
355 return visualParams; 449 return visualParams;
356 } 450 }
357 #endregion
358
359
360
361 private bool CloneFolder(List<InventoryFolderBase> avatarInventory, UUID avID, UUID parentFolder, AvatarAppearance appearance, InventoryFolderBase templateFolder, List<InventoryFolderBase> templateFolders)
362 {
363 bool success = false;
364 UUID templateFolderId = templateFolder.ID;
365 if (templateFolderId != UUID.Zero)
366 {
367 InventoryFolderBase toFolder = FindFolder(templateFolder.Name, parentFolder.Guid, avatarInventory);
368 if (toFolder == null)
369 {
370 //create new folder
371 toFolder = new InventoryFolderBase();
372 toFolder.ID = UUID.Random();
373 toFolder.Name = templateFolder.Name;
374 toFolder.Owner = avID;
375 toFolder.Type = templateFolder.Type;
376 toFolder.Version = 1;
377 toFolder.ParentID = parentFolder;
378 if (!SynchronousRestObjectRequester.MakeRequest<InventoryFolderBase, bool>(
379 "POST", m_inventoryServerUrl + "CreateFolder/", toFolder))
380 {
381 m_log.InfoFormat("[AvatarApperance] Couldn't make new folder {0} in users inventory", toFolder.Name);
382 return false;
383 }
384 else
385 {
386 // m_log.InfoFormat("made new folder {0} in users inventory", toFolder.Name);
387 }
388 }
389
390 List<InventoryItemBase> templateItems = SynchronousRestObjectRequester.MakeRequest<Guid, List<InventoryItemBase>>(
391 "POST", m_inventoryServerUrl + "GetItems/", templateFolderId.Guid);
392 if ((templateItems != null) && (templateItems.Count > 0))
393 {
394 foreach (InventoryItemBase item in templateItems)
395 {
396
397 UUID clonedItemId = CloneInventoryItem(avID, toFolder.ID, item, true);
398 if (clonedItemId != UUID.Zero)
399 {
400 int appearanceType = ItemIsPartOfAppearance(item, appearance);
401 if (appearanceType >= 0)
402 {
403 UpdateAvatarAppearance(avID, appearanceType, clonedItemId, item.AssetID);
404 }
405
406 if (appearance != null)
407 {
408 int attachment = appearance.GetAttachpoint(item.ID);
409 if (attachment > 0)
410 {
411 UpdateAvatarAttachment(avID, attachment, clonedItemId, item.AssetID);
412 }
413 }
414 success = true;
415 }
416 }
417 }
418
419 List<InventoryFolderBase> subFolders = FindSubFolders(templateFolder.ID.Guid, templateFolders);
420 foreach (InventoryFolderBase subFolder in subFolders)
421 {
422 if (subFolder.Name.ToLower() != "trash")
423 {
424 success = CloneFolder(avatarInventory, avID, toFolder.ID, appearance, subFolder, templateFolders);
425 }
426 }
427 }
428 else
429 {
430 m_log.Info("[AvatarAppearance] Failed to find the template folder");
431 }
432 return success;
433 }
434 451
435 private int ItemIsPartOfAppearance(InventoryItemBase item, AvatarAppearance appearance) 452 private int ItemIsPartOfAppearance(InventoryItemBase item, AvatarAppearance appearance)
436 { 453 {
@@ -477,6 +494,8 @@ namespace OpenSim.Grid.UserServer.Modules
477 } 494 }
478 return -1; 495 return -1;
479 } 496 }
497 #endregion
498
480 499
481 } 500 }
482 public enum PermissionMask 501 public enum PermissionMask