diff options
author | Melanie Thielker | 2008-08-19 02:12:40 +0000 |
---|---|---|
committer | Melanie Thielker | 2008-08-19 02:12:40 +0000 |
commit | 6d2e1ad6ba73fb0eba51b3885ff0a4d7d1b5d611 (patch) | |
tree | 349f4db157d3776b5f8491ba230f5400b27551a4 | |
parent | * If two regions have configuration information that conflicts (save xy locat... (diff) | |
download | opensim-SC_OLD-6d2e1ad6ba73fb0eba51b3885ff0a4d7d1b5d611.zip opensim-SC_OLD-6d2e1ad6ba73fb0eba51b3885ff0a4d7d1b5d611.tar.gz opensim-SC_OLD-6d2e1ad6ba73fb0eba51b3885ff0a4d7d1b5d611.tar.bz2 opensim-SC_OLD-6d2e1ad6ba73fb0eba51b3885ff0a4d7d1b5d611.tar.xz |
Attachment persistence!!! Patch #9169 (Mantis #1171)
Attachments now save to MySQL. No reattach on login yet.
-rw-r--r-- | OpenSim/Data/MySQL/MySQLManager.cs | 5 | ||||
-rw-r--r-- | OpenSim/Data/MySQL/MySQLUserData.cs | 9 | ||||
-rw-r--r-- | OpenSim/Framework/AvatarAppearance.cs | 67 | ||||
-rw-r--r-- | OpenSim/Framework/Communications/IAvatarService.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1UserServices.cs | 16 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 7 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | 43 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 5 |
8 files changed, 120 insertions, 37 deletions
diff --git a/OpenSim/Data/MySQL/MySQLManager.cs b/OpenSim/Data/MySQL/MySQLManager.cs index 9f50c9f..b857aad 100644 --- a/OpenSim/Data/MySQL/MySQLManager.cs +++ b/OpenSim/Data/MySQL/MySQLManager.cs | |||
@@ -1208,7 +1208,10 @@ namespace OpenSim.Data.MySQL | |||
1208 | 1208 | ||
1209 | cmd.ExecuteNonQuery(); | 1209 | cmd.ExecuteNonQuery(); |
1210 | 1210 | ||
1211 | sql = "insert into avatarattachments (UUID, attachpoint, item, asset) values (?uuid, ?attchpoint, ?item, ?asset)"; | 1211 | if (data == null) |
1212 | return; | ||
1213 | |||
1214 | sql = "insert into avatarattachments (UUID, attachpoint, item, asset) values (?uuid, ?attachpoint, ?item, ?asset)"; | ||
1212 | 1215 | ||
1213 | cmd = (MySqlCommand) dbcon.CreateCommand(); | 1216 | cmd = (MySqlCommand) dbcon.CreateCommand(); |
1214 | cmd.CommandText = sql; | 1217 | cmd.CommandText = sql; |
diff --git a/OpenSim/Data/MySQL/MySQLUserData.cs b/OpenSim/Data/MySQL/MySQLUserData.cs index 1ae5645..82ca5b1 100644 --- a/OpenSim/Data/MySQL/MySQLUserData.cs +++ b/OpenSim/Data/MySQL/MySQLUserData.cs | |||
@@ -834,14 +834,15 @@ namespace OpenSim.Data.MySQL | |||
834 | 834 | ||
835 | IDataReader r = cmd.ExecuteReader(); | 835 | IDataReader r = cmd.ExecuteReader(); |
836 | 836 | ||
837 | return database.readAttachments(r); | 837 | Hashtable ret = database.readAttachments(r); |
838 | |||
839 | r.Close(); | ||
840 | |||
841 | return ret; | ||
838 | } | 842 | } |
839 | 843 | ||
840 | public void UpdateUserAttachments(LLUUID agentID, Hashtable data) | 844 | public void UpdateUserAttachments(LLUUID agentID, Hashtable data) |
841 | { | 845 | { |
842 | if(data == null) | ||
843 | return; | ||
844 | |||
845 | database.writeAttachments(agentID, data); | 846 | database.writeAttachments(agentID, data); |
846 | } | 847 | } |
847 | } | 848 | } |
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 1c086d5..67e26b1 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -362,8 +362,8 @@ namespace OpenSim.Framework | |||
362 | h["skirt_item"] = SkirtItem.ToString(); | 362 | h["skirt_item"] = SkirtItem.ToString(); |
363 | h["skirt_asset"] = SkirtAsset.ToString(); | 363 | h["skirt_asset"] = SkirtAsset.ToString(); |
364 | 364 | ||
365 | Hashtable attachments = GetAttachments(); | 365 | string attachments = GetAttachmentsString(); |
366 | if(attachments != null) | 366 | if(attachments != String.Empty) |
367 | h["attachments"] = attachments; | 367 | h["attachments"] = attachments; |
368 | 368 | ||
369 | return h; | 369 | return h; |
@@ -413,8 +413,7 @@ namespace OpenSim.Framework | |||
413 | 413 | ||
414 | if(h.ContainsKey("attachments")) | 414 | if(h.ContainsKey("attachments")) |
415 | { | 415 | { |
416 | Hashtable attachments = (Hashtable) h["attachments"]; | 416 | SetAttachmentsString(h["attachments"].ToString()); |
417 | SetAttachments(attachments); | ||
418 | } | 417 | } |
419 | } | 418 | } |
420 | 419 | ||
@@ -510,9 +509,12 @@ namespace OpenSim.Framework | |||
510 | return m_attachments[attachpoint][1]; | 509 | return m_attachments[attachpoint][1]; |
511 | } | 510 | } |
512 | 511 | ||
513 | public void AddAttachment(int attachpoint, LLUUID item, LLUUID asset) | 512 | public void SetAttachment(int attachpoint, LLUUID item, LLUUID asset) |
514 | { | 513 | { |
515 | if (item == LLUUID.Zero || asset == LLUUID.Zero) | 514 | if(attachpoint == 0) |
515 | return; | ||
516 | |||
517 | if (item == LLUUID.Zero) | ||
516 | { | 518 | { |
517 | if (m_attachments.ContainsKey(attachpoint)) | 519 | if (m_attachments.ContainsKey(attachpoint)) |
518 | m_attachments.Remove(attachpoint); | 520 | m_attachments.Remove(attachpoint); |
@@ -525,5 +527,58 @@ namespace OpenSim.Framework | |||
525 | m_attachments[attachpoint][0] = item; | 527 | m_attachments[attachpoint][0] = item; |
526 | m_attachments[attachpoint][1] = asset; | 528 | m_attachments[attachpoint][1] = asset; |
527 | } | 529 | } |
530 | |||
531 | public void DetachAttachment(LLUUID itemID) | ||
532 | { | ||
533 | int attachpoint = 0; | ||
534 | |||
535 | foreach (KeyValuePair<int, LLUUID[]> kvp in m_attachments) | ||
536 | { | ||
537 | if(kvp.Value[0] == itemID) | ||
538 | { | ||
539 | attachpoint = kvp.Key; | ||
540 | break; | ||
541 | } | ||
542 | } | ||
543 | |||
544 | if(attachpoint > 0) | ||
545 | m_attachments.Remove(attachpoint); | ||
546 | } | ||
547 | string GetAttachmentsString() | ||
548 | { | ||
549 | List<string> strings = new List<string>(); | ||
550 | |||
551 | foreach (KeyValuePair<int, LLUUID[]> e in m_attachments) | ||
552 | { | ||
553 | strings.Add(e.Key.ToString()); | ||
554 | strings.Add(e.Value[0].ToString()); | ||
555 | strings.Add(e.Value[1].ToString()); | ||
556 | } | ||
557 | |||
558 | return String.Join(",", strings.ToArray()); | ||
559 | } | ||
560 | |||
561 | void SetAttachmentsString(string data) | ||
562 | { | ||
563 | string[] strings = data.Split(new char[] {','}); | ||
564 | int i = 0; | ||
565 | |||
566 | m_attachments.Clear(); | ||
567 | |||
568 | while (strings.Length - i > 2) | ||
569 | { | ||
570 | int attachpoint = Int32.Parse(strings[i]); | ||
571 | LLUUID item = new LLUUID(strings[i+1]); | ||
572 | LLUUID asset = new LLUUID(strings[i+2]); | ||
573 | i += 3; | ||
574 | |||
575 | if (!m_attachments.ContainsKey(attachpoint)) | ||
576 | { | ||
577 | m_attachments[attachpoint] = new LLUUID[2]; | ||
578 | m_attachments[attachpoint][0] = item; | ||
579 | m_attachments[attachpoint][1] = asset; | ||
580 | } | ||
581 | } | ||
582 | } | ||
528 | } | 583 | } |
529 | } | 584 | } |
diff --git a/OpenSim/Framework/Communications/IAvatarService.cs b/OpenSim/Framework/Communications/IAvatarService.cs index 0e4a349..6c033e1 100644 --- a/OpenSim/Framework/Communications/IAvatarService.cs +++ b/OpenSim/Framework/Communications/IAvatarService.cs | |||
@@ -39,10 +39,5 @@ namespace OpenSim.Framework.Communications | |||
39 | 39 | ||
40 | void UpdateUserAppearance(LLUUID user, AvatarAppearance appearance); | 40 | void UpdateUserAppearance(LLUUID user, AvatarAppearance appearance); |
41 | 41 | ||
42 | void AddAttachment(LLUUID user, LLUUID attach); | ||
43 | |||
44 | void RemoveAttachment(LLUUID user, LLUUID attach); | ||
45 | |||
46 | List<LLUUID> GetAttachments(LLUUID user); | ||
47 | } | 42 | } |
48 | } | 43 | } |
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs index 1d86646..2223aeb 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs | |||
@@ -776,21 +776,5 @@ namespace OpenSim.Region.Communications.OGS1 | |||
776 | // Return Empty list (no friends) | 776 | // Return Empty list (no friends) |
777 | } | 777 | } |
778 | } | 778 | } |
779 | |||
780 | public void AddAttachment(LLUUID user, LLUUID item) | ||
781 | { | ||
782 | return; | ||
783 | } | ||
784 | |||
785 | public void RemoveAttachment(LLUUID user, LLUUID item) | ||
786 | { | ||
787 | return; | ||
788 | } | ||
789 | |||
790 | public List<LLUUID> GetAttachments(LLUUID user) | ||
791 | { | ||
792 | return new List<LLUUID>(); | ||
793 | } | ||
794 | |||
795 | } | 779 | } |
796 | } | 780 | } |
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 6695dbf..b98f2d6 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -380,7 +380,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
380 | SceneObjectGroup group = (SceneObjectGroup)obj; | 380 | SceneObjectGroup group = (SceneObjectGroup)obj; |
381 | 381 | ||
382 | //group.DetachToGround(); | 382 | //group.DetachToGround(); |
383 | DetachSingleAttachmentToInv(group.GetFromAssetID(),remoteClient); | 383 | m_parentScene.DetachSingleAttachmentToInv(group.GetFromAssetID(),remoteClient); |
384 | } | 384 | } |
385 | } | 385 | } |
386 | } | 386 | } |
@@ -432,7 +432,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
432 | AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero); | 432 | AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero); |
433 | } | 433 | } |
434 | 434 | ||
435 | protected internal void RezSingleAttachment( | 435 | public SceneObjectGroup RezSingleAttachment( |
436 | IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,uint ItemFlags, uint NextOwnerMask) | 436 | IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,uint ItemFlags, uint NextOwnerMask) |
437 | { | 437 | { |
438 | SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, itemID, LLVector3.Zero, LLVector3.Zero, LLUUID.Zero, (byte)1, true, | 438 | SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, itemID, LLVector3.Zero, LLVector3.Zero, LLUUID.Zero, (byte)1, true, |
@@ -446,11 +446,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
446 | AttachObject(remoteClient,objatt.LocalId,AttachmentPt,new LLQuaternion(0,0,0,1),objatt.AbsolutePosition); | 446 | AttachObject(remoteClient,objatt.LocalId,AttachmentPt,new LLQuaternion(0,0,0,1),objatt.AbsolutePosition); |
447 | objatt.ScheduleGroupForFullUpdate(); | 447 | objatt.ScheduleGroupForFullUpdate(); |
448 | } | 448 | } |
449 | return objatt; | ||
449 | } | 450 | } |
450 | 451 | ||
451 | // What makes this method odd and unique is it tries to detach using an LLUUID.... Yay for standards. | 452 | // What makes this method odd and unique is it tries to detach using an LLUUID.... Yay for standards. |
452 | // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID?? | 453 | // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID?? |
453 | protected internal void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) | 454 | public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) |
454 | { | 455 | { |
455 | if (itemID == LLUUID.Zero) // If this happened, someone made a mistake.... | 456 | if (itemID == LLUUID.Zero) // If this happened, someone made a mistake.... |
456 | return; | 457 | return; |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 0148d76..784d04c 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -2316,5 +2316,48 @@ namespace OpenSim.Region.Environment.Scenes | |||
2316 | // | 2316 | // |
2317 | // imod.TestFunction(); | 2317 | // imod.TestFunction(); |
2318 | // } | 2318 | // } |
2319 | |||
2320 | public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, | ||
2321 | uint AttachmentPt, uint ItemFlags, uint NextOwnerMask) | ||
2322 | { | ||
2323 | SceneObjectGroup att = m_innerScene.RezSingleAttachment(remoteClient, itemID, AttachmentPt, ItemFlags, NextOwnerMask); | ||
2324 | |||
2325 | if (att == null) | ||
2326 | { | ||
2327 | DetachSingleAttachmentToInv(itemID, remoteClient); | ||
2328 | return; | ||
2329 | } | ||
2330 | |||
2331 | if (att.RootPart != null) | ||
2332 | AttachmentPt = att.RootPart.AttachmentPoint; | ||
2333 | |||
2334 | ScenePresence presence; | ||
2335 | if(TryGetAvatar(remoteClient.AgentId, out presence)) | ||
2336 | { | ||
2337 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, att.GetFromAssetID()); | ||
2338 | IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); | ||
2339 | if(ava != null) | ||
2340 | { | ||
2341 | ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
2342 | } | ||
2343 | |||
2344 | } | ||
2345 | } | ||
2346 | |||
2347 | public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) | ||
2348 | { | ||
2349 | ScenePresence presence; | ||
2350 | if(TryGetAvatar(remoteClient.AgentId, out presence)) | ||
2351 | { | ||
2352 | presence.Appearance.DetachAttachment(itemID); | ||
2353 | IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); | ||
2354 | if(ava != null) | ||
2355 | { | ||
2356 | ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
2357 | } | ||
2358 | |||
2359 | } | ||
2360 | m_innerScene.DetachSingleAttachmentToInv(itemID, remoteClient); | ||
2361 | } | ||
2319 | } | 2362 | } |
2320 | } | 2363 | } |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 474f062..4564cf1 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -2109,8 +2109,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
2109 | client.OnGrabUpdate += m_innerScene.MoveObject; | 2109 | client.OnGrabUpdate += m_innerScene.MoveObject; |
2110 | client.OnDeRezObject += DeRezObject; | 2110 | client.OnDeRezObject += DeRezObject; |
2111 | client.OnRezObject += RezObject; | 2111 | client.OnRezObject += RezObject; |
2112 | client.OnRezSingleAttachmentFromInv += m_innerScene.RezSingleAttachment; | 2112 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; |
2113 | client.OnDetachAttachmentIntoInv += m_innerScene.DetachSingleAttachmentToInv; | 2113 | client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; |
2114 | client.OnObjectAttach += m_innerScene.AttachObject; | 2114 | client.OnObjectAttach += m_innerScene.AttachObject; |
2115 | client.OnObjectDetach += m_innerScene.DetachObject; | 2115 | client.OnObjectDetach += m_innerScene.DetachObject; |
2116 | client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; | 2116 | client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; |
@@ -3859,5 +3859,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
3859 | //Console.WriteLine("Terrain packet unacked, resending patch: " + patchX + " , " + patchY); | 3859 | //Console.WriteLine("Terrain packet unacked, resending patch: " + patchX + " , " + patchY); |
3860 | client.SendLayerData(patchX, patchY, Heightmap.GetFloatsSerialised()); | 3860 | client.SendLayerData(patchX, patchY, Heightmap.GetFloatsSerialised()); |
3861 | } | 3861 | } |
3862 | |||
3862 | } | 3863 | } |
3863 | } | 3864 | } |