protected void AgentWearablesUpdateHandler(object sender, PacketReceivedEventArgs e)
{
bool changed = false;
AgentWearablesUpdatePacket update = (AgentWearablesUpdatePacket)e.Packet;
lock (Wearables)
{
#region Test if anything changed in this update
for (int i = 0; i < update.WearableData.Length; i++)
{
AgentWearablesUpdatePacket.WearableDataBlock block = update.WearableData[i];
if (block.AssetID != UUID.Zero)
{
WearableData wearable;
if (Wearables.TryGetValue((WearableType)block.WearableType, out wearable))
{
if (wearable.AssetID != block.AssetID || wearable.ItemID != block.ItemID)
{
// A different wearable is now set for this index
changed = true;
break;
}
}
else
{
// A wearable is now set for this index
changed = true;
break;
}
}
else if (Wearables.ContainsKey((WearableType)block.WearableType))
{
// This index is now empty
changed = true;
break;
}
}
#endregion Test if anything changed in this update
if (changed)
{
Logger.DebugLog("New wearables received in AgentWearablesUpdate");
Wearables.Clear();
for (int i = 0; i < update.WearableData.Length; i++)
{
AgentWearablesUpdatePacket.WearableDataBlock block = update.WearableData[i];
if (block.AssetID != UUID.Zero)
{
WearableType type = (WearableType)block.WearableType;
WearableData data = new WearableData();
data.Asset = null;
data.AssetID = block.AssetID;
data.AssetType = WearableTypeToAssetType(type);
data.ItemID = block.ItemID;
data.WearableType = type;
// Add this wearable to our collection
Wearables[type] = data;
}
}
}
else
{
Logger.DebugLog("Duplicate AgentWearablesUpdate received, discarding");
}
}
if (changed)
{
// Fire the callback
OnAgentWearables(new AgentWearablesReplyEventArgs());
}
}