add functions to send entity updates imediatly, except for avatars (or now) they should be use to bypass normal delayed updates, for debug

httptests
UbitUmarov 2017-04-14 21:55:37 +01:00
parent 22e9647748
commit 63383bf3c5
6 changed files with 119 additions and 19 deletions

View File

@ -685,9 +685,10 @@ namespace OpenSim.Framework
ExtraData = 1 << 20, ExtraData = 1 << 20,
Sound = 1 << 21, Sound = 1 << 21,
Joint = 1 << 22, Joint = 1 << 22,
FullUpdate = 0x3fffffff, FullUpdate = 0x0fffffff,
CancelKill = 0x7fffffff, SendInTransit = 1 << 30,
Kill = 0x80000000 CancelKill = 0x4fffffff, // 1 << 31
Kill = 0x80000000 // 1 << 32
} }
/* included in .net 4.0 /* included in .net 4.0
@ -1187,7 +1188,8 @@ namespace OpenSim.Framework
void SetAgentThrottleSilent(int throttle, int setting); void SetAgentThrottleSilent(int throttle, int setting);
int GetAgentThrottleSilent(int throttle); int GetAgentThrottleSilent(int throttle);
void SendAvatarDataImmediate(ISceneEntity avatar); void SendEntityFullUpdateImmediate(ISceneEntity entity);
void SendEntityTerseUpdateImmediate(ISceneEntity entity);
/// <summary> /// <summary>
/// Send a positional, velocity, etc. update to the viewer for a given entity. /// Send a positional, velocity, etc. update to the viewer for a given entity.

View File

@ -3950,24 +3950,68 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// <summary> /// <summary>
/// Send an ObjectUpdate packet with information about an avatar /// Send an ObjectUpdate packet with information about an avatar
/// </summary> /// </summary>
public void SendAvatarDataImmediate(ISceneEntity avatar) public void SendEntityFullUpdateImmediate(ISceneEntity ent)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[LLCLIENTVIEW]: Sending immediate object update for avatar {0} {1} to {2} {3}", // "[LLCLIENTVIEW]: Sending immediate object update for avatar {0} {1} to {2} {3}",
// avatar.Name, avatar.UUID, Name, AgentId); // avatar.Name, avatar.UUID, Name, AgentId);
ScenePresence presence = avatar as ScenePresence; if (ent == null)
if (presence == null)
return; return;
ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
objupdate.Header.Zerocoded = true; objupdate.Header.Zerocoded = true;
objupdate.RegionData.RegionHandle = presence.RegionHandle;
// objupdate.RegionData.TimeDilation = ushort.MaxValue;
objupdate.RegionData.TimeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); objupdate.RegionData.TimeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence);
if(ent is ScenePresence)
{
ScenePresence presence = ent as ScenePresence;
objupdate.RegionData.RegionHandle = presence.RegionHandle;
objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence);
}
else if(ent is SceneObjectPart)
{
SceneObjectPart part = ent as SceneObjectPart;
objupdate.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
objupdate.ObjectData[0] = CreatePrimUpdateBlock(part, (ScenePresence)SceneAgent);
}
OutPacket(objupdate, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority);
// We need to record the avatar local id since the root prim of an attachment points to this.
// m_attachmentsSent.Add(avatar.LocalId);
}
public void SendEntityTerseUpdateImmediate(ISceneEntity ent)
{
// m_log.DebugFormat(
// "[LLCLIENTVIEW]: Sending immediate object update for avatar {0} {1} to {2} {3}",
// avatar.Name, avatar.UUID, Name, AgentId);
if (ent == null)
return;
ImprovedTerseObjectUpdatePacket objupdate =
(ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
objupdate.Header.Zerocoded = true;
objupdate.RegionData.TimeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
objupdate.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
if(ent is ScenePresence)
{
ScenePresence presence = ent as ScenePresence;
objupdate.RegionData.RegionHandle = presence.RegionHandle;
objupdate.ObjectData[0] = CreateImprovedTerseBlock(ent, false);
}
else if(ent is SceneObjectPart)
{
SceneObjectPart part = ent as SceneObjectPart;
objupdate.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
objupdate.ObjectData[0] = CreateImprovedTerseBlock(ent, false);
}
OutPacket(objupdate, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); OutPacket(objupdate, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority);
@ -4021,7 +4065,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Primitive Packet/Data Sending Methods #region Primitive Packet/Data Sending Methods
/// <summary> /// <summary>
/// Generate one of the object update packets based on PrimUpdateFlags /// Generate one of the object update packets based on PrimUpdateFlags
/// and broadcast the packet to clients /// and broadcast the packet to clients
@ -4157,8 +4200,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
SceneObjectPart part = (SceneObjectPart)update.Entity; SceneObjectPart part = (SceneObjectPart)update.Entity;
SceneObjectGroup grp = part.ParentGroup; SceneObjectGroup grp = part.ParentGroup;
if (grp.inTransit) if (grp.inTransit && !update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
continue; continue;
if (update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
{
}
if (grp.IsDeleted) if (grp.IsDeleted)
{ {

View File

@ -1778,6 +1778,20 @@ namespace OpenSim.Region.Framework.Scenes
private Dictionary<ulong, spRegionSizeInfo> m_knownChildRegionsSizeInfo = new Dictionary<ulong, spRegionSizeInfo>(); private Dictionary<ulong, spRegionSizeInfo> m_knownChildRegionsSizeInfo = new Dictionary<ulong, spRegionSizeInfo>();
public void AddNeighbourRegion(GridRegion region, string capsPath)
{
lock (m_knownChildRegions)
{
ulong regionHandle = region.RegionHandle;
m_knownChildRegions.Add(regionHandle,capsPath);
spRegionSizeInfo sizeInfo = new spRegionSizeInfo();
sizeInfo.sizeX = region.RegionSizeX;
sizeInfo.sizeY = region.RegionSizeY;
m_knownChildRegionsSizeInfo[regionHandle] = sizeInfo;
}
}
public void AddNeighbourRegionSizeInfo(GridRegion region) public void AddNeighbourRegionSizeInfo(GridRegion region)
{ {
lock (m_knownChildRegions) lock (m_knownChildRegions)
@ -1826,6 +1840,12 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public bool knowsNeighbourRegion(ulong regionHandle)
{
lock (m_knownChildRegions)
return m_knownChildRegions.ContainsKey(regionHandle);
}
public void DropOldNeighbours(List<ulong> oldRegions) public void DropOldNeighbours(List<ulong> oldRegions)
{ {
foreach (ulong handle in oldRegions) foreach (ulong handle in oldRegions)
@ -2010,6 +2030,7 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
if(!haveGroupInformation && !IsChildAgent && !IsNPC) if(!haveGroupInformation && !IsChildAgent && !IsNPC)
@ -2069,6 +2090,16 @@ namespace OpenSim.Region.Framework.Scenes
if (!IsChildAgent) if (!IsChildAgent)
{ {
if( ParentPart != null && !IsNPC && (crossingFlags & 0x08) != 0)
{
// SceneObjectPart root = ParentPart.ParentGroup.RootPart;
// if(root.LocalId != ParentPart.LocalId)
// ControllingClient.SendEntityTerseUpdateImmediate(root);
// ControllingClient.SendEntityTerseUpdateImmediate(ParentPart);
ParentPart.ParentGroup.SendFullUpdateToClient(ControllingClient);
}
// verify baked textures and cache // verify baked textures and cache
bool cachedbaked = false; bool cachedbaked = false;
@ -2130,6 +2161,7 @@ namespace OpenSim.Region.Framework.Scenes
// send avatar object to all presences including us, so they cross it into region // send avatar object to all presences including us, so they cross it into region
// then hide if necessary // then hide if necessary
SendInitialAvatarDataToAllAgents(allpresences); SendInitialAvatarDataToAllAgents(allpresences);
// send this look // send this look
@ -2237,14 +2269,19 @@ namespace OpenSim.Region.Framework.Scenes
m_lastChildAgentUpdateDrawDistance = DrawDistance; m_lastChildAgentUpdateDrawDistance = DrawDistance;
m_lastChildAgentUpdatePosition = AbsolutePosition; m_lastChildAgentUpdatePosition = AbsolutePosition;
m_childUpdatesBusy = false; // allow them m_childUpdatesBusy = false; // allow them
} }
m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts)); m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts));
// send the rest of the world // send the rest of the world
if (m_teleportFlags > 0 && !IsNPC || m_currentParcelHide) if (m_teleportFlags > 0 && !IsNPC || m_currentParcelHide)
SendInitialDataToMe(); SendInitialDataToMe();
// priority uses avatar position only // priority uses avatar position only
// m_reprioritizationLastPosition = AbsolutePosition; // m_reprioritizationLastPosition = AbsolutePosition;
// m_reprioritizationLastDrawDistance = DrawDistance; // m_reprioritizationLastDrawDistance = DrawDistance;
@ -3979,7 +4016,7 @@ namespace OpenSim.Region.Framework.Scenes
int count = 0; int count = 0;
foreach (ScenePresence p in presences) foreach (ScenePresence p in presences)
{ {
p.ControllingClient.SendAvatarDataImmediate(this); p.ControllingClient.SendEntityFullUpdateImmediate(this);
if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod) if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod)
// either just kill the object // either just kill the object
// p.ControllingClient.SendKillObject(new List<uint> {LocalId}); // p.ControllingClient.SendKillObject(new List<uint> {LocalId});
@ -3992,7 +4029,7 @@ namespace OpenSim.Region.Framework.Scenes
public void SendInitialAvatarDataToAgent(ScenePresence p) public void SendInitialAvatarDataToAgent(ScenePresence p)
{ {
p.ControllingClient.SendAvatarDataImmediate(this); p.ControllingClient.SendEntityFullUpdateImmediate(this);
if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod) if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod)
// either just kill the object // either just kill the object
// p.ControllingClient.SendKillObject(new List<uint> {LocalId}); // p.ControllingClient.SendKillObject(new List<uint> {LocalId});
@ -4009,12 +4046,12 @@ namespace OpenSim.Region.Framework.Scenes
//m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID); //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID);
if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && !avatar.IsViewerUIGod) if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && !avatar.IsViewerUIGod)
return; return;
avatar.ControllingClient.SendAvatarDataImmediate(this); avatar.ControllingClient.SendEntityFullUpdateImmediate(this);
} }
public void SendAvatarDataToAgentNF(ScenePresence avatar) public void SendAvatarDataToAgentNF(ScenePresence avatar)
{ {
avatar.ControllingClient.SendAvatarDataImmediate(this); avatar.ControllingClient.SendEntityFullUpdateImmediate(this);
} }
/// <summary> /// <summary>

View File

@ -1097,7 +1097,12 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
} }
public void SendAvatarDataImmediate(ISceneEntity avatar) public void SendEntityFullUpdateImmediate(ISceneEntity ent)
{
}
public void SendEntityTerseUpdateImmediate(ISceneEntity ent)
{ {
} }

View File

@ -813,7 +813,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{ {
} }
public void SendAvatarDataImmediate(ISceneEntity avatar) public void SendEntityFullUpdateImmediate(ISceneEntity avatar)
{
}
public void SendEntityTerseUpdateImmediate(ISceneEntity ent)
{ {
} }

View File

@ -760,7 +760,11 @@ namespace OpenSim.Tests.Common
{ {
} }
public void SendAvatarDataImmediate(ISceneEntity avatar) public void SendEntityFullUpdateImmediate(ISceneEntity ent)
{
}
public void SendEntityTerseUpdateImmediate(ISceneEntity ent)
{ {
} }