work on hide avatars

avinationmerge
UbitUmarov 2014-08-01 00:34:52 +01:00
parent a5e9429f2b
commit 0a1e9d731d
1 changed files with 238 additions and 40 deletions

View File

@ -140,7 +140,10 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public static readonly float SIGNIFICANT_MOVEMENT = 2.0f; public static readonly float SIGNIFICANT_MOVEMENT = 2.0f;
private UUID m_currentParcelUUID = UUID.Zero; private UUID m_previusParcelUUID = UUID.Zero;
private UUID m_currentParcelUUID = UUID.Zero;
private bool m_previusParcelHide = false;
private bool m_currentParcelHide = false;
private object parcelLock = new Object(); private object parcelLock = new Object();
public UUID currentParcelUUID public UUID currentParcelUUID
@ -150,7 +153,15 @@ namespace OpenSim.Region.Framework.Scenes
{ {
lock (parcelLock) lock (parcelLock)
{ {
m_previusParcelHide = m_currentParcelHide;
m_previusParcelUUID = m_currentParcelUUID;
m_currentParcelUUID = value; m_currentParcelUUID = value;
m_currentParcelHide = false;
ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
if (land != null && !land.LandData.SeeAVs)
m_currentParcelHide = true;
if (m_previusParcelUUID != UUID.Zero)
ParcelCrossCheck();
} }
} }
} }
@ -188,10 +199,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
lock (parcelLock) lock (parcelLock)
{ {
ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y); return m_currentParcelHide;
if (land == null || !land.LandData.SeeAVs)
return false;
return true;
} }
} }
catch catch
@ -542,7 +550,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
public byte State { get; set; } public byte State { get; set; }
private AgentManager.ControlFlags m_AgentControlFlags; private AgentManager.ControlFlags m_AgentControlFlags;
@ -1071,6 +1078,7 @@ namespace OpenSim.Region.Framework.Scenes
// only in use as part of completemovement // only in use as part of completemovement
// other uses need fix
private bool MakeRootAgent(Vector3 pos, bool isFlying) private bool MakeRootAgent(Vector3 pos, bool isFlying)
{ {
lock (m_completeMovementLock) lock (m_completeMovementLock)
@ -1097,16 +1105,12 @@ namespace OpenSim.Region.Framework.Scenes
part.ParentGroup.AddAvatar(UUID); part.ParentGroup.AddAvatar(UUID);
if (part.SitTargetPosition != Vector3.Zero) if (part.SitTargetPosition != Vector3.Zero)
part.SitTargetAvatar = UUID; part.SitTargetAvatar = UUID;
// ParentPosition = part.GetWorldPosition();
ParentID = part.LocalId; ParentID = part.LocalId;
ParentPart = part; ParentPart = part;
m_pos = PrevSitOffset; m_pos = PrevSitOffset;
// pos = ParentPosition;
pos = part.GetWorldPosition(); pos = part.GetWorldPosition();
} }
ParentUUID = UUID.Zero; ParentUUID = UUID.Zero;
// Animator.TrySetMovementAnimation("SIT");
} }
else else
{ {
@ -1161,7 +1165,7 @@ namespace OpenSim.Region.Framework.Scenes
// Moved this from SendInitialData to ensure that Appearance is initialized // Moved this from SendInitialData to ensure that Appearance is initialized
// before the inventory is processed in MakeRootAgent. This fixes a race condition // before the inventory is processed in MakeRootAgent. This fixes a race condition
// related to the handling of attachments // related to the handling of attachments
//m_scene.GetAvatarAppearance(ControllingClient, out Appearance);
if (m_scene.TestBorderCross(pos, Cardinals.E)) if (m_scene.TestBorderCross(pos, Cardinals.E))
{ {
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E); Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
@ -1496,7 +1500,7 @@ namespace OpenSim.Region.Framework.Scenes
else else
CollisionPlane = new Vector4(0, 0, 0, pos.Z - (1.56f / 6f)); CollisionPlane = new Vector4(0, 0, 0, pos.Z - (1.56f / 6f));
ControllingClient.SendAgentTerseUpdate(this); SendAgentTerseUpdate(this);
} }
/// <summary> /// <summary>
@ -1797,6 +1801,9 @@ namespace OpenSim.Region.Framework.Scenes
// client.Name, client.AgentId, m_scene.RegionInfo.RegionName); // client.Name, client.AgentId, m_scene.RegionInfo.RegionName);
// } // }
m_currentParcelHide = false;
m_currentParcelUUID = UUID.Zero;
// send initial land overlay and parcel // send initial land overlay and parcel
if (!IsChildAgent) if (!IsChildAgent)
{ {
@ -1807,6 +1814,9 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
m_previusParcelHide = m_currentParcelHide;
m_previusParcelUUID = m_currentParcelUUID;
// send agentData to all clients including us (?) // send agentData to all clients including us (?)
// get appearance // get appearance
// if in cache sent it to all clients // if in cache sent it to all clients
@ -1819,11 +1829,6 @@ namespace OpenSim.Region.Framework.Scenes
IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
if (m_agentTransfer != null) if (m_agentTransfer != null)
m_agentTransfer.EnableChildAgents(this); m_agentTransfer.EnableChildAgents(this);
/* moved down
IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
if (friendsModule != null)
friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
*/
} }
// XXX: If we force an update here, then multiple attachments do appear correctly on a destination region // XXX: If we force an update here, then multiple attachments do appear correctly on a destination region
@ -1845,13 +1850,15 @@ namespace OpenSim.Region.Framework.Scenes
if (!IsChildAgent) if (!IsChildAgent)
{ {
// moved from makeroot missing in sendInitialDataToMe ? // moved from makeroot missing in sendInitialDataToMe
// its already there
/*
m_scene.ForEachRootScenePresence(delegate(ScenePresence presence) m_scene.ForEachRootScenePresence(delegate(ScenePresence presence)
{ {
if (presence != this) if (presence != this)
presence.Animator.SendAnimPackToClient(ControllingClient); presence.Animator.SendAnimPackToClient(ControllingClient);
}); });
*/
if (openChildAgents) if (openChildAgents)
{ {
IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
@ -2064,7 +2071,7 @@ namespace OpenSim.Region.Framework.Scenes
// We need to send this back to the client in order to stop the edit beams // We need to send this back to the client in order to stop the edit beams
if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None) if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None)
ControllingClient.SendAgentTerseUpdate(this); SendAgentTerseUpdate(this);
PhysicsActor actor = PhysicsActor; PhysicsActor actor = PhysicsActor;
@ -2303,7 +2310,7 @@ namespace OpenSim.Region.Framework.Scenes
// We need to send this back to the client in order to see the edit beams // We need to send this back to the client in order to see the edit beams
if ((State & (uint)AgentState.Editing) != 0) if ((State & (uint)AgentState.Editing) != 0)
ControllingClient.SendAgentTerseUpdate(this); SendAgentTerseUpdate(this);
m_scene.EventManager.TriggerOnClientMovement(this); m_scene.EventManager.TriggerOnClientMovement(this);
} }
@ -3230,6 +3237,9 @@ namespace OpenSim.Region.Framework.Scenes
if (IsChildAgent == false) if (IsChildAgent == false)
{ {
if (IsInTransit)
return;
// NOTE: Velocity is not the same as m_velocity. Velocity will attempt to // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
// grab the latest PhysicsActor velocity, whereas m_velocity is often // grab the latest PhysicsActor velocity, whereas m_velocity is often
// storing a requested force instead of an actual traveling velocity // storing a requested force instead of an actual traveling velocity
@ -3258,9 +3268,16 @@ namespace OpenSim.Region.Framework.Scenes
#region Update Client(s) #region Update Client(s)
// this is diferente from SendTerseUpdateToClient
// this sends bypassing ententies updates
public void SendAgentTerseUpdate(ISceneEntity p)
{
ControllingClient.SendAgentTerseUpdate(p);
}
/// <summary> /// <summary>
/// Sends a location update to the client connected to this scenePresence /// Sends a location update to the client connected to this scenePresence
/// via entity updates
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
public void SendTerseUpdateToClient(IClientAPI remoteClient) public void SendTerseUpdateToClient(IClientAPI remoteClient)
@ -3270,7 +3287,6 @@ namespace OpenSim.Region.Framework.Scenes
if (remoteClient.IsActive) if (remoteClient.IsActive)
{ {
//m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity); //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity);
remoteClient.SendEntityUpdate( remoteClient.SendEntityUpdate(
this, this,
PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity
@ -3280,6 +3296,34 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void SendTerseUpdateToAgentClient(ScenePresence p)
{
// messy checks because a client doesn't know what presence it belongs too
if (p.IsChildAgent)
return;
if (p.IsInTransit)
return;
IClientAPI remoteClient = p.ControllingClient;
if (remoteClient == null)
return;
if (!remoteClient.IsActive)
return;
if (ParcelHideThisAvatar && p.currentParcelUUID != currentParcelUUID)
return;
//m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, Rotation, m_velocity);
remoteClient.SendEntityUpdate(
this,
PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity
| PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity);
m_scene.StatsReporter.AddAgentUpdates(1);
}
// vars to support reduced update frequency when velocity is unchanged // vars to support reduced update frequency when velocity is unchanged
private Vector3 lastVelocitySentToAllClients = Vector3.Zero; private Vector3 lastVelocitySentToAllClients = Vector3.Zero;
@ -3321,7 +3365,8 @@ namespace OpenSim.Region.Framework.Scenes
lastPositionSentToAllClients = OffsetPosition; lastPositionSentToAllClients = OffsetPosition;
// Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name); // Console.WriteLine("Scheduled update for {0} in {1}", Name, Scene.Name);
m_scene.ForEachClient(SendTerseUpdateToClient); // m_scene.ForEachClient(SendTerseUpdateToClient);
m_scene.ForEachScenePresence(SendTerseUpdateToAgentClient);
} }
TriggerScenePresenceUpdated(); TriggerScenePresenceUpdated();
} }
@ -3389,6 +3434,8 @@ namespace OpenSim.Region.Framework.Scenes
if (!cachedappearance) if (!cachedappearance)
{ {
Appearance.ResetAppearance(); Appearance.ResetAppearance();
// save what ????
// maybe needed so the tryretry repair works?
if (m_scene.AvatarFactory != null) if (m_scene.AvatarFactory != null)
m_scene.AvatarFactory.QueueAppearanceSave(UUID); m_scene.AvatarFactory.QueueAppearanceSave(UUID);
} }
@ -3400,10 +3447,13 @@ namespace OpenSim.Region.Framework.Scenes
SendAvatarDataToAllAgents(); SendAvatarDataToAllAgents();
// This invocation always shows up in the viewer logs as an error. Is it needed? // This invocation always shows up in the viewer logs as an error. Is it needed?
// try to send what we have even if not in cache // send all information we have
// possible not needed since viewer should ask about it
// least it all ask for baked
SendAppearanceToAgent(this); SendAppearanceToAgent(this);
// If we are using the the cached appearance then send it out to everyone // If we are using the the cached appearance then send it out to everyone
// send even grays
if (cachedappearance) if (cachedappearance)
{ {
m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name); m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name);
@ -3432,13 +3482,13 @@ namespace OpenSim.Region.Framework.Scenes
} }
m_lastSize = Appearance.AvatarSize; m_lastSize = Appearance.AvatarSize;
int count = 0; int count = 0;
m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
{ {
SendAvatarDataToAgent(scenePresence); SendAvatarDataToAgent(scenePresence);
count++; count++;
}); });
m_scene.StatsReporter.AddAgentUpdates(count); m_scene.StatsReporter.AddAgentUpdates(count);
} }
@ -3450,6 +3500,7 @@ namespace OpenSim.Region.Framework.Scenes
public void SendOtherAgentsAvatarDataToMe() public void SendOtherAgentsAvatarDataToMe()
{ {
int count = 0; int count = 0;
m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence)
{ {
// only send information about other root agents // only send information about other root agents
@ -3470,7 +3521,8 @@ namespace OpenSim.Region.Framework.Scenes
public void SendAvatarDataToAgent(ScenePresence avatar) public void SendAvatarDataToAgent(ScenePresence avatar)
{ {
//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)
return;
avatar.ControllingClient.SendAvatarDataImmediate(this); avatar.ControllingClient.SendAvatarDataImmediate(this);
Animator.SendAnimPackToClient(avatar.ControllingClient); Animator.SendAnimPackToClient(avatar.ControllingClient);
} }
@ -3481,7 +3533,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void SendAppearanceToAllOtherAgents() public void SendAppearanceToAllOtherAgents()
{ {
// m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} {1}", Name, UUID); // m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} {1}", Name, UUID);
// only send update from root agents to other clients; children are only "listening posts" // only send update from root agents to other clients; children are only "listening posts"
if (IsChildAgent) if (IsChildAgent)
@ -3503,7 +3555,6 @@ namespace OpenSim.Region.Framework.Scenes
SendAppearanceToAgent(scenePresence); SendAppearanceToAgent(scenePresence);
count++; count++;
}); });
m_scene.StatsReporter.AddAgentUpdates(count); m_scene.StatsReporter.AddAgentUpdates(count);
} }
@ -3537,11 +3588,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE PRESENCE]: Sending appearance data from {0} {1} to {2} {3}", Name, m_uuid, avatar.Name, avatar.UUID); // "[SCENE PRESENCE]: Sending appearance data from {0} {1} to {2} {3}", Name, m_uuid, avatar.Name, avatar.UUID);
if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID)
return;
avatar.ControllingClient.SendAppearance( avatar.ControllingClient.SendAppearance(
UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); UUID, Appearance.VisualParams, Appearance.Texture.GetBytes());
} }
#endregion #endregion
@ -4077,6 +4127,8 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void UpdateMovement() public void UpdateMovement()
{ {
if (IsInTransit)
return;
if (m_forceToApply.HasValue) if (m_forceToApply.HasValue)
{ {
Vector3 force = m_forceToApply.Value; Vector3 force = m_forceToApply.Value;
@ -4156,6 +4208,8 @@ namespace OpenSim.Region.Framework.Scenes
if (IsChildAgent || Animator == null) if (IsChildAgent || Animator == null)
return; return;
if(IsInTransit)
return;
//if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f)) //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
// The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents( // The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents(
// as of this comment the interval is set in AddToPhysicalScene // as of this comment the interval is set in AddToPhysicalScene
@ -4503,6 +4557,18 @@ namespace OpenSim.Region.Framework.Scenes
return validated; return validated;
} }
public void SendAttachmentsToClient(IClientAPI client)
{
lock (m_attachments)
{
foreach (SceneObjectGroup gobj in m_attachments)
{
gobj.SendFullUpdateToClient(client);
}
}
}
/// <summary> /// <summary>
/// Send a script event to this scene presence's attachments /// Send a script event to this scene presence's attachments
/// </summary> /// </summary>
@ -5245,5 +5311,137 @@ namespace OpenSim.Region.Framework.Scenes
m_log.InfoFormat("[SCENE PRESENCE]: TELEPORT ******************"); m_log.InfoFormat("[SCENE PRESENCE]: TELEPORT ******************");
} }
private void ParcelCrossCheck()
{
List<ScenePresence> killsToSendto = new List<ScenePresence>();
List<ScenePresence> killsToSendme = new List<ScenePresence>();
List<ScenePresence> viewsToSendto = new List<ScenePresence>();
List<ScenePresence> viewsToSendme = new List<ScenePresence>();
List<ScenePresence> allpresences = null;
if (m_currentParcelHide)
{
// now on a private parcel
allpresences = m_scene.GetScenePresences();
if (m_previusParcelHide && m_previusParcelUUID != UUID.Zero)
{
foreach (ScenePresence p in allpresences)
{
if (p.IsChildAgent || p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive)
continue;
// only those on previus parcel need receive kills
if (m_previusParcelUUID == p.currentParcelUUID)
{
killsToSendto.Add(p); // they dont see me
killsToSendme.Add(p); // i dont see them
}
// only those on new parcel need see
if (m_currentParcelUUID == p.currentParcelUUID)
{
viewsToSendto.Add(p); // they see me
viewsToSendme.Add(p); // i see them
}
}
}
else
{
//was on a public area
allpresences = m_scene.GetScenePresences();
foreach (ScenePresence p in allpresences)
{
if (p.IsChildAgent || p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive)
continue;
// those not on new parcel dont see me
if (m_currentParcelUUID != p.currentParcelUUID)
{
killsToSendto.Add(p); // they dont see me
}
else
{
viewsToSendme.Add(p); // i see those on it
}
}
}
allpresences.Clear();
} // now on a private parcel end
else
{
// now on public parcel
if (m_previusParcelHide && m_previusParcelUUID != UUID.Zero)
{
// was on private area
allpresences = m_scene.GetScenePresences();
foreach (ScenePresence p in allpresences)
{
if (p.IsChildAgent || p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive)
continue;
// only those old parcel need receive kills
if (m_previusParcelUUID == p.currentParcelUUID)
{
killsToSendme.Add(p); // i dont see them
}
else
{
viewsToSendto.Add(p); // they see me
}
}
}
else
return; // was on a public area also
} // now on public parcel end
// send the things
// kill main avatar object
if (killsToSendto.Count > 0)
{
foreach (ScenePresence p in killsToSendto)
{
try { p.ControllingClient.SendKillObject(new List<uint> { LocalId }); }
catch (NullReferenceException) { }
}
}
if (killsToSendme.Count > 0)
{
foreach (ScenePresence p in killsToSendme)
{
try {ControllingClient.SendKillObject(new List<uint> { p.LocalId }); }
catch (NullReferenceException) { }
}
}
if (viewsToSendto.Count > 0)
{
foreach (ScenePresence p in viewsToSendto)
{
p.ControllingClient.SendAvatarDataImmediate(this);
SendAppearanceToAgent(p);
SendAttachmentsToClient(p.ControllingClient);
if (Animator != null)
Animator.SendAnimPackToClient(p.ControllingClient);
}
}
if (viewsToSendme.Count > 0)
{
foreach (ScenePresence p in viewsToSendme)
{
ControllingClient.SendAvatarDataImmediate(p);
p.SendAppearanceToAgent(this);
p.SendAttachmentsToClient(ControllingClient);
if (p.Animator != null)
p.Animator.SendAnimPackToClient(ControllingClient);
}
}
}
} }
} }