mantis 8639: recover object selected state in case of lludp object updates packet size overflow;

master
UbitUmarov 2020-01-08 10:25:59 +00:00
parent c54460b6f0
commit 42afa8429e
1 changed files with 16 additions and 2 deletions

View File

@ -4776,12 +4776,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// because we are requeuing the list of updates. They will be resent in new packets // because we are requeuing the list of updates. They will be resent in new packets
// with the most recent state and priority. // with the most recent state and priority.
m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber); m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
if(oPacket.Buffer == null)
return;
m_udpClient.FreeUDPBuffer(oPacket.Buffer);
// Count this as a resent packet since we are going to requeue all of the updates contained in it // Count this as a resent packet since we are going to requeue all of the updates contained in it
Interlocked.Increment(ref m_udpClient.PacketsResent); Interlocked.Increment(ref m_udpClient.PacketsResent);
// We're not going to worry about interlock yet since its not currently critical that this total count
// is 100% correct
m_udpServer.PacketsResentCount++; m_udpServer.PacketsResentCount++;
foreach (EntityUpdate update in updates) foreach (EntityUpdate update in updates)
@ -5152,6 +5154,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int lastzc = 0; int lastzc = 0;
int count = 0; int count = 0;
bool shouldCreateSelected = false; //mantis 8639
EntityUpdate eu; EntityUpdate eu;
for(int indx = 0; indx < objectUpdates.Count; ++indx) for(int indx = 0; indx < objectUpdates.Count; ++indx)
{ {
@ -5163,6 +5166,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
else else
{ {
SceneObjectPart part = (SceneObjectPart)eu.Entity; SceneObjectPart part = (SceneObjectPart)eu.Entity;
shouldCreateSelected = part.CreateSelected;
if (eu.Flags.HasFlag(PrimUpdateFlags.Animations)) if (eu.Flags.HasFlag(PrimUpdateFlags.Animations))
{ {
if (m_SupportObjectAnimations && part.Animations != null) if (m_SupportObjectAnimations && part.Animations != null)
@ -5207,7 +5211,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (eu.Entity is ScenePresence) if (eu.Entity is ScenePresence)
CreateAvatarUpdateBlock((ScenePresence)eu.Entity, zc); CreateAvatarUpdateBlock((ScenePresence)eu.Entity, zc);
else else
{
if(shouldCreateSelected) //mantis 8639 recover selected state
((SceneObjectPart)eu.Entity).CreateSelected = true;
CreatePrimUpdateBlock((SceneObjectPart)eu.Entity, mysp, zc); CreatePrimUpdateBlock((SceneObjectPart)eu.Entity, mysp, zc);
}
tau = new List<EntityUpdate>(30); tau = new List<EntityUpdate>(30);
tau.Add(eu); tau.Add(eu);
@ -5314,6 +5322,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int lastzc = 0; int lastzc = 0;
int count = 0; int count = 0;
bool shouldCreateSelected = false; //mantis 8639
EntityUpdate eu; EntityUpdate eu;
for (int indx = 0; indx < compressedUpdates.Count; ++indx) for (int indx = 0; indx < compressedUpdates.Count; ++indx)
{ {
@ -5322,6 +5331,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted) if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted)
continue; continue;
shouldCreateSelected = sop.CreateSelected;
if (eu.Flags.HasFlag(PrimUpdateFlags.Animations)) if (eu.Flags.HasFlag(PrimUpdateFlags.Animations))
{ {
if (m_SupportObjectAnimations && sop.Animations != null) if (m_SupportObjectAnimations && sop.Animations != null)
@ -5369,6 +5380,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
zc.ZeroCount = 0; zc.ZeroCount = 0;
zc.Position = countposition + 1; zc.Position = countposition + 1;
if (shouldCreateSelected) //mantis 8639 recover selected state
sop.CreateSelected = true;
// im lazy now, just do last again // im lazy now, just do last again
CreateCompressedUpdateBlockZC(sop, mysp, zc); CreateCompressedUpdateBlockZC(sop, mysp, zc);
tau = new List<EntityUpdate>(30); tau = new List<EntityUpdate>(30);