aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs18
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs7
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs3
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs53
4 files changed, 74 insertions, 7 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 3ab837d..7cb5b53 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -5304,10 +5304,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5304 //update.JointType = 0; 5304 //update.JointType = 0;
5305 update.Material = data.Material; 5305 update.Material = data.Material;
5306 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim 5306 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
5307
5307 if (data.ParentGroup.IsAttachment) 5308 if (data.ParentGroup.IsAttachment)
5308 { 5309 {
5309 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.ParentGroup.FromItemID); 5310 update.NameValue
5311 = Util.StringToBytes256(
5312 string.Format("AttachItemID STRING RW SV {0}", data.ParentGroup.FromItemID));
5313
5310 update.State = (byte)((data.ParentGroup.AttachmentPoint % 16) * 16 + (data.ParentGroup.AttachmentPoint / 16)); 5314 update.State = (byte)((data.ParentGroup.AttachmentPoint % 16) * 16 + (data.ParentGroup.AttachmentPoint / 16));
5315
5316// m_log.DebugFormat(
5317// "[LLCLIENTVIEW]: Sending NameValue {0} for {1} {2} to {3}",
5318// Util.UTF8.GetString(update.NameValue), data.Name, data.LocalId, Name);
5319//
5320// m_log.DebugFormat(
5321// "[LLCLIENTVIEW]: Sending state {0} for {1} {2} to {3}",
5322// update.State, data.Name, data.LocalId, Name);
5311 } 5323 }
5312 else 5324 else
5313 { 5325 {
@@ -5318,10 +5330,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5318 update.State = data.ParentGroup.RootPart.Shape.State; 5330 update.State = data.ParentGroup.RootPart.Shape.State;
5319 } 5331 }
5320 5332
5321// m_log.DebugFormat(
5322// "[LLCLIENTVIEW]: Sending state {0} for {1} {2} to {3}",
5323// update.State, data.Name, data.LocalId, Name);
5324
5325 update.ObjectData = objectData; 5333 update.ObjectData = objectData;
5326 update.ParentID = data.ParentID; 5334 update.ParentID = data.ParentID;
5327 update.PathBegin = data.Shape.PathBegin; 5335 update.PathBegin = data.Shape.PathBegin;
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index c3846d9..e9b2f4f 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -991,6 +991,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
991 991
992 return null; 992 return null;
993 } 993 }
994 else if (itemID == UUID.Zero)
995 {
996 // We need to have a FromItemID for multiple attachments on a single attach point to appear. This is
997 // true on Singularity 1.8.5 and quite possibly other viewers as well. As NPCs don't have an inventory
998 // we will satisfy this requirement by inserting a random UUID.
999 objatt.FromItemID = UUID.Random();
1000 }
994 1001
995 if (DebugLevel > 0) 1002 if (DebugLevel > 0)
996 m_log.DebugFormat( 1003 m_log.DebugFormat(
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 8a2da6e..03c6265 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -178,8 +178,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
178 acd.lastname = lastname; 178 acd.lastname = lastname;
179 acd.ServiceURLs = new Dictionary<string, object>(); 179 acd.ServiceURLs = new Dictionary<string, object>();
180 180
181 AvatarAppearance npcAppearance = new AvatarAppearance(appearance, 181 AvatarAppearance npcAppearance = new AvatarAppearance(appearance, true);
182 true);
183 acd.Appearance = npcAppearance; 182 acd.Appearance = npcAppearance;
184 183
185 /* 184 /*
diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
index ddd4525..e82351e 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
@@ -199,6 +199,59 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
199 } 199 }
200 200
201 [Test] 201 [Test]
202 public void TestCreateWithMultiAttachments()
203 {
204 TestHelpers.InMethod();
205// TestHelpers.EnableLogging();
206
207 SetUpScene();
208// m_attMod.DebugLevel = 1;
209
210 UUID userId = TestHelpers.ParseTail(0x1);
211 UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
212 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
213
214 InventoryItemBase att1Item
215 = UserInventoryHelpers.CreateInventoryItem(
216 m_scene, "att1", TestHelpers.ParseTail(0x2), TestHelpers.ParseTail(0x3), sp.UUID, InventoryType.Object);
217 InventoryItemBase att2Item
218 = UserInventoryHelpers.CreateInventoryItem(
219 m_scene, "att2", TestHelpers.ParseTail(0x12), TestHelpers.ParseTail(0x13), sp.UUID, InventoryType.Object);
220
221 m_attMod.RezSingleAttachmentFromInventory(sp, att1Item.ID, (uint)AttachmentPoint.Chest);
222 m_attMod.RezSingleAttachmentFromInventory(sp, att2Item.ID, (uint)AttachmentPoint.Chest | 0x80);
223
224 UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
225
226 ScenePresence npc = m_scene.GetScenePresence(npcId);
227
228 // Check scene presence status
229 Assert.That(npc.HasAttachments(), Is.True);
230 List<SceneObjectGroup> attachments = npc.GetAttachments();
231 Assert.That(attachments.Count, Is.EqualTo(2));
232
233 // Just for now, we won't test the name since this is (wrongly) the asset part name rather than the item
234 // name. TODO: Do need to fix ultimately since the item may be renamed before being passed on to an NPC.
235// Assert.That(attSo.Name, Is.EqualTo(attName));
236
237 TestAttachedObject(attachments[0], AttachmentPoint.Chest, npc.UUID);
238 TestAttachedObject(attachments[1], AttachmentPoint.Chest, npc.UUID);
239
240 // Attached objects on the same point must have different FromItemIDs to be shown to other avatars, at least
241 // on Singularity 1.8.5. Otherwise, only one (the first ObjectUpdate sent) appears.
242 Assert.AreNotEqual(attachments[0].FromItemID, attachments[1].FromItemID);
243 }
244
245 private void TestAttachedObject(SceneObjectGroup attSo, AttachmentPoint attPoint, UUID ownerId)
246 {
247 Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)attPoint));
248 Assert.That(attSo.IsAttachment);
249 Assert.That(attSo.UsesPhysics, Is.False);
250 Assert.That(attSo.IsTemporary, Is.False);
251 Assert.That(attSo.OwnerID, Is.EqualTo(ownerId));
252 }
253
254 [Test]
202 public void TestLoadAppearance() 255 public void TestLoadAppearance()
203 { 256 {
204 TestHelpers.InMethod(); 257 TestHelpers.InMethod();