try better handling of llupd DeRezObject
parent
5dc20ad1e5
commit
590d7ccf43
|
@ -6990,8 +6990,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint m_DeRezObjectLasSeq = 0;
|
||||||
|
Dictionary<UUID, List<uint>> m_DeRezObjectDelayed = new Dictionary<UUID, List<uint>>();
|
||||||
|
|
||||||
private bool HandlerDeRezObject(IClientAPI sender, Packet Pack)
|
private bool HandlerDeRezObject(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
|
DeRezObject handlerDeRezObject = OnDeRezObject;
|
||||||
|
if (handlerDeRezObject == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)Pack;
|
DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)Pack;
|
||||||
|
|
||||||
#region Packet Session and User Check
|
#region Packet Session and User Check
|
||||||
|
@ -7003,24 +7010,47 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
DeRezObject handlerDeRezObject = OnDeRezObject;
|
uint seq = DeRezPacket.Header.Sequence;
|
||||||
if (handlerDeRezObject != null)
|
if(seq <= m_DeRezObjectLasSeq)
|
||||||
{
|
return true;
|
||||||
List<uint> deRezIDs = new List<uint>();
|
m_DeRezObjectLasSeq = seq;
|
||||||
|
|
||||||
foreach (DeRezObjectPacket.ObjectDataBlock data in
|
List<uint> deRezIDs;
|
||||||
DeRezPacket.ObjectData)
|
DeRezAction action = (DeRezAction)DeRezPacket.AgentBlock.Destination;
|
||||||
|
int numberPackets = DeRezPacket.AgentBlock.PacketCount;
|
||||||
|
int curPacket = DeRezPacket.AgentBlock.PacketNumber;
|
||||||
|
UUID id = DeRezPacket.AgentBlock.TransactionID;
|
||||||
|
|
||||||
|
if (numberPackets > 1)
|
||||||
|
{
|
||||||
|
if(!m_DeRezObjectDelayed.TryGetValue(id, out deRezIDs))
|
||||||
|
{
|
||||||
|
deRezIDs = new List<uint>();
|
||||||
|
m_DeRezObjectDelayed[id] = deRezIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (DeRezObjectPacket.ObjectDataBlock data in DeRezPacket.ObjectData)
|
||||||
{
|
{
|
||||||
deRezIDs.Add(data.ObjectLocalID);
|
deRezIDs.Add(data.ObjectLocalID);
|
||||||
}
|
}
|
||||||
// It just so happens that the values on the DeRezAction enumerator match the Destination
|
|
||||||
// values given by a Second Life client
|
|
||||||
handlerDeRezObject(this, deRezIDs,
|
|
||||||
DeRezPacket.AgentBlock.GroupID,
|
|
||||||
(DeRezAction)DeRezPacket.AgentBlock.Destination,
|
|
||||||
DeRezPacket.AgentBlock.DestinationID);
|
|
||||||
|
|
||||||
|
if (curPacket < numberPackets - 1)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
m_DeRezObjectDelayed.Remove(id);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deRezIDs = new List<uint>();
|
||||||
|
foreach (DeRezObjectPacket.ObjectDataBlock data in DeRezPacket.ObjectData)
|
||||||
|
{
|
||||||
|
deRezIDs.Add(data.ObjectLocalID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (handlerDeRezObject != null)
|
||||||
|
handlerDeRezObject(this, deRezIDs, DeRezPacket.AgentBlock.GroupID,
|
||||||
|
action, DeRezPacket.AgentBlock.DestinationID);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue