예제 #1
0
        void ProcessViewerEffect(IClientAPI remoteClient, List <ViewerEffectEventHandlerArg> args)
        {
            // TODO: don't create new blocks if recycling an old packet
            ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID      = args[i].AgentID;
                effect.Color        = args[i].Color;
                effect.Duration     = args[i].Duration;
                effect.ID           = args[i].ID;
                effect.Type         = args[i].Type;
                effect.TypeData     = args[i].TypeData;
                effectBlockArray[i] = effect;
            }

            ForEachClient(
                delegate(IClientAPI client)
            {
                if (client.AgentId != remoteClient.AgentId)
                {
                    client.SendViewerEffect(effectBlockArray);
                }
            }
                );
        }
예제 #2
0
        public void ViewerEffectHandler(IClientAPI sender, List <ViewerEffectEventHandlerArg> args)
        {
            // TODO: don't create new blocks if recycling an old packet
            List <ViewerEffectPacket.EffectBlock> effectBlock = new List <ViewerEffectPacket.EffectBlock>();

            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID  = args[i].AgentID;
                effect.Color    = args[i].Color;
                effect.Duration = args[i].Duration;
                effect.ID       = args[i].ID;
                effect.Type     = args[i].Type;
                effect.TypeData = args[i].TypeData;
                effectBlock.Add(effect);
            }
            ViewerEffectPacket.EffectBlock[] effectBlockArray = effectBlock.ToArray();

            IClientAPI[] LocalClients;
            lock (m_clients)
            {
                LocalClients = new IClientAPI[m_clients.Count];
                m_clients.Values.CopyTo(LocalClients, 0);
            }

            for (int i = 0; i < LocalClients.Length; i++)
            {
                if (LocalClients[i].AgentId != sender.AgentId)
                {
                    LocalClients[i].SendViewerEffect(effectBlockArray);
                }
            }
        }
예제 #3
0
        protected void ProcessViewerEffect(IClientAPI remoteClient, List <ViewerEffectEventHandlerArg> args)
        {
            IScene scene = remoteClient.Scene;

            // TODO: don't create new blocks if recycling an old packet
            ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
            IScenePresence SP;

            scene.TryGetScenePresence(remoteClient.AgentId, out SP);
            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock
                {
                    AgentID  = args[i].AgentID,
                    Color    = args[i].Color,
                    Duration = args[i].Duration,
                    ID       = args[i].ID,
                    Type     = args[i].Type,
                    TypeData = args[i].TypeData
                };
                effectBlockArray[i] = effect;
                //Save the color
                if (effect.Type == (int)EffectType.Beam || effect.Type == (int)EffectType.Point ||
                    effect.Type == (int)EffectType.Sphere)
                {
                    Color4 color = new Color4(effect.Color, 0, false);
                    if (SP != null && !(color.R == 0 && color.G == 0 && color.B == 0))
                    {
                        PerClientSelectionParticles selection = SP.RequestModuleInterface <PerClientSelectionParticles>();
                        if (selection != null)
                        {
                            selection.EffectColor = args[i].Color;
                        }
                    }
                }

#if (!ISWIN)
                foreach (IScenePresence client in scene.GetScenePresences())
                {
                    if (client.ControllingClient.AgentId != remoteClient.AgentId)
                    {
                        client.ControllingClient.SendViewerEffect(effectBlockArray);
                    }
                }
#else
                foreach (IScenePresence client in scene.GetScenePresences().Where(client => client.ControllingClient.AgentId != remoteClient.AgentId))
                {
                    client.ControllingClient.SendViewerEffect(effectBlockArray);
                }
#endif
            }
        }
예제 #4
0
            /// <summary>
            ///   This sends the little particles to the client if they are selecting something or such
            /// </summary>
            protected void SendViewerEffects()
            {
                if (!IsSelecting)
                {
                    return;
                }

                ISceneChildEntity SOP = m_SelectedUUID;

                if (SOP == null) //This IS nesessary, this is how we can clear this out
                {
                    IsSelecting = false;
                    return;
                }

                ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[1];

                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock
                {
                    AgentID  = m_presence.UUID,
                    Color    = EffectColor,
                    Duration = 0.9f,
                    ID       = UUID.Random(),
                    Type     = (int)EffectType.Beam
                };
                //This seems to be what is passed by SL when its send from the server
                //Bean is the line from hand to object

                byte[] part = new byte[56];
                m_presence.UUID.ToBytes(part, 0);       //UUID of av first
                SOP.UUID.ToBytes(part, 16);             //UUID of object
                SOP.AbsolutePosition.ToBytes(part, 32); //position of object first

                effect.TypeData     = part;
                effectBlockArray[0] = effect;

#if (!ISWIN)
                m_presence.Scene.ForEachClient(
                    delegate(IClientAPI client)
                {
                    client.SendViewerEffect(effectBlockArray);
                }
                    );
#else
                m_presence.Scene.ForEachClient(
                    client => client.SendViewerEffect(effectBlockArray)
                    );
#endif
            }
예제 #5
0
        private void ViewerEffectHandler(Packet packet, LLAgent agent)
        {
            ViewerEffectPacket effect = (ViewerEffectPacket)packet;

            // Broadcast this viewer effect to everyone
            for (int i = 0; i < effect.Effect.Length; i++)
            {
                ViewerEffectPacket.EffectBlock block = effect.Effect[i];

                if (block.AgentID == agent.ID)
                {
                    m_scene.CreateInterestListEvent(new InterestListEvent(UUID.Combine(block.ID, EFFECT_EVENT_ID), VIEWER_EFFECT, agent.ScenePosition, Vector3.One, block));
                }
                else
                {
                    m_log.Warn("Skipping ViewerEffect block for " + block.AgentID + " from " + agent.ID + " (" + agent.Name + ")");
                }
            }
        }
예제 #6
0
        void ProcessViewerEffect(IClientAPI remoteClient, List <ViewerEffectEventHandlerArg> 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++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID      = args[i].AgentID;
                effect.Color        = args[i].Color;
                effect.Duration     = args[i].Duration;
                effect.ID           = args[i].ID;
                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);
            }

            ForEachScenePresence(sp =>
            {
                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);
                }
            });
        }
예제 #7
0
        void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args)
        {
            // TODO: don't create new blocks if recycling an old packet
            ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID = args[i].AgentID;
                effect.Color = args[i].Color;
                effect.Duration = args[i].Duration;
                effect.ID = args[i].ID;
                effect.Type = args[i].Type;
                effect.TypeData = args[i].TypeData;
                effectBlockArray[i] = effect;
            }

            ForEachClient(
                delegate(IClientAPI client)
                {
                    if (client.AgentId != remoteClient.AgentId)
                        client.SendViewerEffect(effectBlockArray);
                }
            );
        }
예제 #8
0
            /// <summary>
            ///     This sends the little particles to the client if they are selecting something or such
            /// </summary>
            protected void SendViewerEffects()
            {
                if (!IsSelecting)
                    return;

                ISceneChildEntity SOP = m_SelectedUUID;
                if (SOP == null) //This IS necessary, this is how we can clear this out
                {
                    IsSelecting = false;
                    return;
                }

                ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[1];

                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock
                                                            {
                                                                AgentID = m_presence.UUID,
                                                                Color = EffectColor,
                                                                Duration = 0.9f,
                                                                ID = UUID.Random(),
                                                                Type = (int) EffectType.Beam
                                                            };
                //This seems to be what is passed by SL when its send from the server
                //Bean is the line from hand to object

                byte[] part = new byte[56];
                m_presence.UUID.ToBytes(part, 0); //UUID of av first
                SOP.UUID.ToBytes(part, 16); //UUID of object
                SOP.AbsolutePosition.ToBytes(part, 32); //position of object first

                effect.TypeData = part;
                effectBlockArray[0] = effect;

                m_presence.Scene.ForEachClient(
                    client => client.SendViewerEffect(effectBlockArray)
                    );
            }
예제 #9
0
        protected void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args)
        {
            IScene scene = remoteClient.Scene;
            // TODO: don't create new blocks if recycling an old packet
            ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
            IScenePresence SP;
            scene.TryGetScenePresence(remoteClient.AgentId, out SP);
            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock
                                                            {
                                                                AgentID = args[i].AgentID,
                                                                Color = args[i].Color,
                                                                Duration = args[i].Duration,
                                                                ID = args[i].ID,
                                                                Type = args[i].Type,
                                                                TypeData = args[i].TypeData
                                                            };
                effectBlockArray[i] = effect;
                //Save the color
                if (effect.Type == (int) EffectType.Beam || effect.Type == (int) EffectType.Point
                    || effect.Type == (int) EffectType.Sphere)
                {
                    Color4 color = new Color4(effect.Color, 0, false);
                    if (SP != null && !(color.R == 0 && color.G == 0 && color.B == 0))
                    {
                        PerClientSelectionParticles selection = SP.RequestModuleInterface<PerClientSelectionParticles>();
                        if (selection != null)
                        {
                            selection.EffectColor = args[i].Color;
                        }
                    }
                }

                foreach (
                    IScenePresence client in
                        scene.GetScenePresences()
                             .Where(client => client.ControllingClient.AgentId != remoteClient.AgentId))
                {
                    client.ControllingClient.SendViewerEffect(effectBlockArray);
                }
            }
        }
        void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> 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++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID = args[i].AgentID;
                effect.Color = args[i].Color;
                effect.Duration = args[i].Duration;
                effect.ID = args[i].ID;
                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);
            }

            ForEachScenePresence(sp =>
                {
                    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);
                    }
                });
        }
예제 #11
0
        public void ViewerEffectHandler(IClientAPI sender, List<ViewerEffectEventHandlerArg> args)
        {            
            // TODO: don't create new blocks if recycling an old packet
            List<ViewerEffectPacket.EffectBlock> effectBlock = new List<ViewerEffectPacket.EffectBlock>();                        
            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID = args[i].AgentID;
                effect.Color = args[i].Color;
                effect.Duration = args[i].Duration;
                effect.ID = args[i].ID;
                effect.Type = args[i].Type;
                effect.TypeData = args[i].TypeData;
                effectBlock.Add(effect);
            }
            ViewerEffectPacket.EffectBlock[] effectBlockArray = effectBlock.ToArray();

            IClientAPI[] LocalClients;
            lock (m_clients)
            {
                LocalClients = new IClientAPI[m_clients.Count];
                m_clients.Values.CopyTo(LocalClients, 0);
            }

            for (int i = 0; i < LocalClients.Length; i++)
            {
                if (LocalClients[i].AgentId != sender.AgentId)
                {
                    LocalClients[i].SendViewerEffect(effectBlockArray);
                }
            }
        }
예제 #12
0
        void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args)
        {
            // TODO: don't create new blocks if recycling an old packet
            ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
            ScenePresence SP;
            TryGetScenePresence(remoteClient.AgentId, out SP);
            for (int i = 0; i < args.Count; i++)
            {
                ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
                effect.AgentID = args[i].AgentID;
                effect.Color = args[i].Color;
                effect.Duration = args[i].Duration;
                effect.ID = args[i].ID;
                effect.Type = args[i].Type;
                effect.TypeData = args[i].TypeData;
                effectBlockArray[i] = effect;
                //Save the color
                if (effect.Type == 7 || effect.Type == 9)
                {
                    if(SP != null)
                        SP.EffectColor = args[i].Color;
                }
            }

            ForEachClient(
                delegate(IClientAPI client)
                {
                    if (client.AgentId != remoteClient.AgentId)
                        client.SendViewerEffect(effectBlockArray);
                }
            );
        }
예제 #13
0
        public void TriggerEffects(object sender, ViewerEffect[] effects)
        {
            if (OnTriggerEffects != null)
            {
                OnTriggerEffects(sender, effects);
            }

            ViewerEffectPacket effect = new ViewerEffectPacket();
            effect.AgentData.AgentID = UUID.Zero;
            effect.AgentData.SessionID = UUID.Zero;

            effect.Effect = new ViewerEffectPacket.EffectBlock[effects.Length];

            for (int i = 0; i < effects.Length; i++)
            {
                ViewerEffect currentEffect = effects[i];
                ViewerEffectPacket.EffectBlock block = new ViewerEffectPacket.EffectBlock();

                block.AgentID = currentEffect.AgentID;
                block.Color = currentEffect.Color.GetBytes(true);
                block.Duration = currentEffect.Duration;
                block.ID = currentEffect.EffectID;
                block.Type = (byte)currentEffect.Type;
                block.TypeData = currentEffect.TypeData;

                effect.Effect[i] = block;
            }

            udp.BroadcastPacket(effect, PacketCategory.State);
        }