diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index df432718d4..998c19ee90 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -390,6 +390,7 @@ namespace OpenSim.Region.Framework.Scenes void ProcessViewerEffect(IClientAPI remoteClient, List args) { // TODO: don't create new blocks if recycling an old packet + bool discardableEffects = true; ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count]; for (int i = 0; i < args.Count; i++) { @@ -401,17 +402,34 @@ namespace OpenSim.Region.Framework.Scenes effect.Type = args[i].Type; effect.TypeData = args[i].TypeData; effectBlockArray[i] = effect; + + if ((EffectType)effect.Type != EffectType.LookAt && (EffectType)effect.Type != EffectType.Beam) + discardableEffects = false; + + //m_log.DebugFormat("[YYY]: VE {0} {1} {2}", effect.AgentID, effect.Duration, (EffectType)effect.Type); } - ForEachClient( - delegate(IClientAPI client) + ForEachScenePresence(sp => { - if (client.AgentId != remoteClient.AgentId) - client.SendViewerEffect(effectBlockArray); - } - ); + if (sp.ControllingClient.AgentId != remoteClient.AgentId) + { + if (!discardableEffects || + (discardableEffects && ShouldSendDiscardableEffect(remoteClient, sp))) + { + //m_log.DebugFormat("[YYY]: Sending to {0}", sp.UUID); + sp.ControllingClient.SendViewerEffect(effectBlockArray); + } + //else + // m_log.DebugFormat("[YYY]: Not sending to {0}", sp.UUID); + } + }); } - + + private bool ShouldSendDiscardableEffect(IClientAPI thisClient, ScenePresence other) + { + return Vector3.Distance(other.CameraPosition, thisClient.SceneAgent.AbsolutePosition) < 10; + } + /// /// Tell the client about the various child items and folders contained in the requested folder. ///