aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-02-20 18:40:21 +0000
committerJustin Clark-Casey (justincc)2014-02-20 18:40:21 +0000
commit4d1426e77d62e2552b371a75d9bc8d190829b554 (patch)
treebdfc959d4dc27d80e88f25d982fb59c1260f938a
parentadd newRegion parameter to CrossAgentToNewRegion event and trigger the event ... (diff)
downloadopensim-SC-4d1426e77d62e2552b371a75d9bc8d190829b554.zip
opensim-SC-4d1426e77d62e2552b371a75d9bc8d190829b554.tar.gz
opensim-SC-4d1426e77d62e2552b371a75d9bc8d190829b554.tar.bz2
opensim-SC-4d1426e77d62e2552b371a75d9bc8d190829b554.tar.xz
For now, do not replacing missing wearables with default wearables if itme details cannot be found.
This is causing many issues on OSGrid, possibly due to teleporting timing differences with simulators hosted in different places or HG teleports Added a bit more logging for debug purposes. See http://opensimulator.org/mantis/view.php?id=6939
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs334
1 files changed, 190 insertions, 144 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index 09cc998..7edfc61 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -690,184 +690,229 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
690 private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance) 690 private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance)
691 { 691 {
692 IInventoryService invService = m_scene.InventoryService; 692 IInventoryService invService = m_scene.InventoryService;
693 bool resetwearable = false; 693
694 if (invService.GetRootFolder(userID) != null) 694 if (invService.GetRootFolder(userID) != null)
695 { 695 {
696 for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) 696 for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
697 { 697 {
698 for (int j = 0; j < appearance.Wearables[i].Count; j++) 698 for (int j = 0; j < appearance.Wearables[i].Count; j++)
699 { 699 {
700 // Check if the default wearables are not set
701 if (appearance.Wearables[i][j].ItemID == UUID.Zero) 700 if (appearance.Wearables[i][j].ItemID == UUID.Zero)
702 { 701 {
703 switch ((WearableType) i) 702 m_log.WarnFormat(
704 { 703 "[AVFACTORY]: Wearable item {0}:{1} for user {2} unexpectedly UUID.Zero. Ignoring.",
705 case WearableType.Eyes: 704 i, j, userID);
706 case WearableType.Hair: 705
707 case WearableType.Shape:
708 case WearableType.Skin:
709 //case WearableType.Underpants:
710 TryAndRepairBrokenWearable((WearableType)i, invService, userID, appearance);
711 resetwearable = true;
712 m_log.Warn("[AVFACTORY]: UUID.Zero Wearables, passing fake values.");
713 resetwearable = true;
714 break;
715
716 }
717 continue; 706 continue;
718 } 707 }
719 708
720 // Ignore ruth's assets except for the body parts! missing body parts fail avatar appearance on V1 709 // Ignore ruth's assets
721 if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID) 710 if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID)
722 {
723 switch ((WearableType)i)
724 {
725 case WearableType.Eyes:
726 case WearableType.Hair:
727 case WearableType.Shape:
728 case WearableType.Skin:
729 //case WearableType.Underpants:
730 TryAndRepairBrokenWearable((WearableType)i, invService, userID, appearance);
731
732 m_log.WarnFormat("[AVFACTORY]: {0} Default Wearables, passing existing values.", (WearableType)i);
733 resetwearable = true;
734 break;
735
736 }
737 continue; 711 continue;
738 } 712
739
740 InventoryItemBase baseItem = new InventoryItemBase(appearance.Wearables[i][j].ItemID, userID); 713 InventoryItemBase baseItem = new InventoryItemBase(appearance.Wearables[i][j].ItemID, userID);
741 baseItem = invService.GetItem(baseItem); 714 baseItem = invService.GetItem(baseItem);
742 715
743 if (baseItem != null) 716 if (baseItem != null)
744 { 717 {
745 appearance.Wearables[i].Add(appearance.Wearables[i][j].ItemID, baseItem.AssetID); 718 appearance.Wearables[i].Add(appearance.Wearables[i][j].ItemID, baseItem.AssetID);
746 int unmodifiedWearableIndexForClosure = i;
747 m_scene.AssetService.Get(baseItem.AssetID.ToString(), this,
748 delegate(string x, object y, AssetBase z)
749 {
750 if (z == null)
751 {
752 TryAndRepairBrokenWearable(
753 (WearableType)unmodifiedWearableIndexForClosure, invService,
754 userID, appearance);
755 }
756 });
757 } 719 }
758 else 720 else
759 { 721 {
760 m_log.ErrorFormat( 722 m_log.WarnFormat(
761 "[AVFACTORY]: Can't find inventory item {0} for {1}, setting to default", 723 "[AVFACTORY]: Can't find inventory item {0} for {1}, setting to default",
762 appearance.Wearables[i][j].ItemID, (WearableType)i); 724 appearance.Wearables[i][j].ItemID, (WearableType)i);
763 725
764 TryAndRepairBrokenWearable((WearableType)i, invService, userID, appearance); 726 appearance.Wearables[i].RemoveItem(appearance.Wearables[i][j].ItemID);
765 resetwearable = true;
766
767 } 727 }
768 } 728 }
769 } 729 }
770
771 // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
772 if (appearance.Wearables[(int) WearableType.Eyes] == null)
773 {
774 m_log.WarnFormat("[AVFACTORY]: {0} Eyes are Null, passing existing values.", (WearableType.Eyes));
775
776 TryAndRepairBrokenWearable(WearableType.Eyes, invService, userID, appearance);
777 resetwearable = true;
778 }
779 else
780 {
781 if (appearance.Wearables[(int) WearableType.Eyes][0].ItemID == UUID.Zero)
782 {
783 m_log.WarnFormat("[AVFACTORY]: Eyes are UUID.Zero are broken, {0} {1}",
784 appearance.Wearables[(int) WearableType.Eyes][0].ItemID,
785 appearance.Wearables[(int) WearableType.Eyes][0].AssetID);
786 TryAndRepairBrokenWearable(WearableType.Eyes, invService, userID, appearance);
787 resetwearable = true;
788
789 }
790
791 }
792 // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
793 if (appearance.Wearables[(int)WearableType.Shape] == null)
794 {
795 m_log.WarnFormat("[AVFACTORY]: {0} shape is Null, passing existing values.", (WearableType.Shape));
796
797 TryAndRepairBrokenWearable(WearableType.Shape, invService, userID, appearance);
798 resetwearable = true;
799 }
800 else
801 {
802 if (appearance.Wearables[(int)WearableType.Shape][0].ItemID == UUID.Zero)
803 {
804 m_log.WarnFormat("[AVFACTORY]: Shape is UUID.Zero and broken, {0} {1}",
805 appearance.Wearables[(int)WearableType.Shape][0].ItemID,
806 appearance.Wearables[(int)WearableType.Shape][0].AssetID);
807 TryAndRepairBrokenWearable(WearableType.Shape, invService, userID, appearance);
808 resetwearable = true;
809
810 }
811
812 }
813 // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
814 if (appearance.Wearables[(int)WearableType.Hair] == null)
815 {
816 m_log.WarnFormat("[AVFACTORY]: {0} Hair is Null, passing existing values.", (WearableType.Hair));
817
818 TryAndRepairBrokenWearable(WearableType.Hair, invService, userID, appearance);
819 resetwearable = true;
820 }
821 else
822 {
823 if (appearance.Wearables[(int)WearableType.Hair][0].ItemID == UUID.Zero)
824 {
825 m_log.WarnFormat("[AVFACTORY]: Hair is UUID.Zero and broken, {0} {1}",
826 appearance.Wearables[(int)WearableType.Hair][0].ItemID,
827 appearance.Wearables[(int)WearableType.Hair][0].AssetID);
828 TryAndRepairBrokenWearable(WearableType.Hair, invService, userID, appearance);
829 resetwearable = true;
830
831 }
832
833 }
834 // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
835 if (appearance.Wearables[(int)WearableType.Skin] == null)
836 {
837 m_log.WarnFormat("[AVFACTORY]: {0} Skin is Null, passing existing values.", (WearableType.Skin));
838
839 TryAndRepairBrokenWearable(WearableType.Skin, invService, userID, appearance);
840 resetwearable = true;
841 }
842 else
843 {
844 if (appearance.Wearables[(int)WearableType.Skin][0].ItemID == UUID.Zero)
845 {
846 m_log.WarnFormat("[AVFACTORY]: Skin is UUID.Zero and broken, {0} {1}",
847 appearance.Wearables[(int)WearableType.Skin][0].ItemID,
848 appearance.Wearables[(int)WearableType.Skin][0].AssetID);
849 TryAndRepairBrokenWearable(WearableType.Skin, invService, userID, appearance);
850 resetwearable = true;
851
852 }
853
854 }
855 if (resetwearable)
856 {
857 ScenePresence presence = null;
858 if (m_scene.TryGetScenePresence(userID, out presence))
859 {
860 presence.ControllingClient.SendWearables(presence.Appearance.Wearables,
861 presence.Appearance.Serial++);
862 }
863 }
864
865 } 730 }
866 else 731 else
867 { 732 {
868 m_log.WarnFormat("[AVFACTORY]: user {0} has no inventory, appearance isn't going to work", userID); 733 m_log.WarnFormat("[AVFACTORY]: user {0} has no inventory, appearance isn't going to work", userID);
869 } 734 }
735
736// IInventoryService invService = m_scene.InventoryService;
737// bool resetwearable = false;
738// if (invService.GetRootFolder(userID) != null)
739// {
740// for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
741// {
742// for (int j = 0; j < appearance.Wearables[i].Count; j++)
743// {
744// // Check if the default wearables are not set
745// if (appearance.Wearables[i][j].ItemID == UUID.Zero)
746// {
747// switch ((WearableType) i)
748// {
749// case WearableType.Eyes:
750// case WearableType.Hair:
751// case WearableType.Shape:
752// case WearableType.Skin:
753// //case WearableType.Underpants:
754// TryAndRepairBrokenWearable((WearableType)i, invService, userID, appearance);
755// resetwearable = true;
756// m_log.Warn("[AVFACTORY]: UUID.Zero Wearables, passing fake values.");
757// resetwearable = true;
758// break;
759//
760// }
761// continue;
762// }
763//
764// // Ignore ruth's assets except for the body parts! missing body parts fail avatar appearance on V1
765// if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID)
766// {
767// switch ((WearableType)i)
768// {
769// case WearableType.Eyes:
770// case WearableType.Hair:
771// case WearableType.Shape:
772// case WearableType.Skin:
773// //case WearableType.Underpants:
774// TryAndRepairBrokenWearable((WearableType)i, invService, userID, appearance);
775//
776// m_log.WarnFormat("[AVFACTORY]: {0} Default Wearables, passing existing values.", (WearableType)i);
777// resetwearable = true;
778// break;
779//
780// }
781// continue;
782// }
783//
784// InventoryItemBase baseItem = new InventoryItemBase(appearance.Wearables[i][j].ItemID, userID);
785// baseItem = invService.GetItem(baseItem);
786//
787// if (baseItem != null)
788// {
789// appearance.Wearables[i].Add(appearance.Wearables[i][j].ItemID, baseItem.AssetID);
790// int unmodifiedWearableIndexForClosure = i;
791// m_scene.AssetService.Get(baseItem.AssetID.ToString(), this,
792// delegate(string x, object y, AssetBase z)
793// {
794// if (z == null)
795// {
796// TryAndRepairBrokenWearable(
797// (WearableType)unmodifiedWearableIndexForClosure, invService,
798// userID, appearance);
799// }
800// });
801// }
802// else
803// {
804// m_log.ErrorFormat(
805// "[AVFACTORY]: Can't find inventory item {0} for {1}, setting to default",
806// appearance.Wearables[i][j].ItemID, (WearableType)i);
807//
808// TryAndRepairBrokenWearable((WearableType)i, invService, userID, appearance);
809// resetwearable = true;
810//
811// }
812// }
813// }
814//
815// // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
816// if (appearance.Wearables[(int) WearableType.Eyes] == null)
817// {
818// m_log.WarnFormat("[AVFACTORY]: {0} Eyes are Null, passing existing values.", (WearableType.Eyes));
819//
820// TryAndRepairBrokenWearable(WearableType.Eyes, invService, userID, appearance);
821// resetwearable = true;
822// }
823// else
824// {
825// if (appearance.Wearables[(int) WearableType.Eyes][0].ItemID == UUID.Zero)
826// {
827// m_log.WarnFormat("[AVFACTORY]: Eyes are UUID.Zero are broken, {0} {1}",
828// appearance.Wearables[(int) WearableType.Eyes][0].ItemID,
829// appearance.Wearables[(int) WearableType.Eyes][0].AssetID);
830// TryAndRepairBrokenWearable(WearableType.Eyes, invService, userID, appearance);
831// resetwearable = true;
832//
833// }
834//
835// }
836// // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
837// if (appearance.Wearables[(int)WearableType.Shape] == null)
838// {
839// m_log.WarnFormat("[AVFACTORY]: {0} shape is Null, passing existing values.", (WearableType.Shape));
840//
841// TryAndRepairBrokenWearable(WearableType.Shape, invService, userID, appearance);
842// resetwearable = true;
843// }
844// else
845// {
846// if (appearance.Wearables[(int)WearableType.Shape][0].ItemID == UUID.Zero)
847// {
848// m_log.WarnFormat("[AVFACTORY]: Shape is UUID.Zero and broken, {0} {1}",
849// appearance.Wearables[(int)WearableType.Shape][0].ItemID,
850// appearance.Wearables[(int)WearableType.Shape][0].AssetID);
851// TryAndRepairBrokenWearable(WearableType.Shape, invService, userID, appearance);
852// resetwearable = true;
853//
854// }
855//
856// }
857// // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
858// if (appearance.Wearables[(int)WearableType.Hair] == null)
859// {
860// m_log.WarnFormat("[AVFACTORY]: {0} Hair is Null, passing existing values.", (WearableType.Hair));
861//
862// TryAndRepairBrokenWearable(WearableType.Hair, invService, userID, appearance);
863// resetwearable = true;
864// }
865// else
866// {
867// if (appearance.Wearables[(int)WearableType.Hair][0].ItemID == UUID.Zero)
868// {
869// m_log.WarnFormat("[AVFACTORY]: Hair is UUID.Zero and broken, {0} {1}",
870// appearance.Wearables[(int)WearableType.Hair][0].ItemID,
871// appearance.Wearables[(int)WearableType.Hair][0].AssetID);
872// TryAndRepairBrokenWearable(WearableType.Hair, invService, userID, appearance);
873// resetwearable = true;
874//
875// }
876//
877// }
878// // I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
879// if (appearance.Wearables[(int)WearableType.Skin] == null)
880// {
881// m_log.WarnFormat("[AVFACTORY]: {0} Skin is Null, passing existing values.", (WearableType.Skin));
882//
883// TryAndRepairBrokenWearable(WearableType.Skin, invService, userID, appearance);
884// resetwearable = true;
885// }
886// else
887// {
888// if (appearance.Wearables[(int)WearableType.Skin][0].ItemID == UUID.Zero)
889// {
890// m_log.WarnFormat("[AVFACTORY]: Skin is UUID.Zero and broken, {0} {1}",
891// appearance.Wearables[(int)WearableType.Skin][0].ItemID,
892// appearance.Wearables[(int)WearableType.Skin][0].AssetID);
893// TryAndRepairBrokenWearable(WearableType.Skin, invService, userID, appearance);
894// resetwearable = true;
895//
896// }
897//
898// }
899// if (resetwearable)
900// {
901// ScenePresence presence = null;
902// if (m_scene.TryGetScenePresence(userID, out presence))
903// {
904// presence.ControllingClient.SendWearables(presence.Appearance.Wearables,
905// presence.Appearance.Serial++);
906// }
907// }
908//
909// }
910// else
911// {
912// m_log.WarnFormat("[AVFACTORY]: user {0} has no inventory, appearance isn't going to work", userID);
913// }
870 } 914 }
915
871 private void TryAndRepairBrokenWearable(WearableType type, IInventoryService invService, UUID userID,AvatarAppearance appearance) 916 private void TryAndRepairBrokenWearable(WearableType type, IInventoryService invService, UUID userID,AvatarAppearance appearance)
872 { 917 {
873 UUID defaultwearable = GetDefaultItem(type); 918 UUID defaultwearable = GetDefaultItem(type);
@@ -957,6 +1002,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
957 } 1002 }
958 } 1003 }
959 } 1004 }
1005
960 private UUID GetDefaultItem(WearableType wearable) 1006 private UUID GetDefaultItem(WearableType wearable)
961 { 1007 {
962 // These are ruth 1008 // These are ruth