예제 #1
0
        void BroadcastObjectUpdate(SimulationObject obj)
        {
            ObjectUpdatePacket update =
                SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0, obj.Prim.Flags);

            server.UDP.BroadcastPacket(update, PacketCategory.State);
        }
예제 #2
0
        // HACK: The reduction provider will deprecate this at some point
        void SynchronizeStateTo(Agent agent)
        {
            // Send the parcel overlay
            server.Parcels.SendParcelOverlay(agent);

            // Send object updates for objects and avatars
            sceneObjects.ForEach(delegate(SimulationObject obj)
            {
                ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(obj.Prim,
                                                                             obj.Prim.RegionHandle, 0, obj.Prim.Flags);
                server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State);
            });

            // Send appearances for all avatars
            lock (server.Agents)
            {
                foreach (Agent otherAgent in server.Agents.Values)
                {
                    if (otherAgent != agent)
                    {
                        // Send appearances for this avatar
                        AvatarAppearancePacket appearance = BuildAppearancePacket(otherAgent);
                        server.UDP.SendPacket(agent.AgentID, appearance, PacketCategory.State);
                    }
                }
            }

            // Send terrain data
            SendLayerData(agent);
        }
예제 #3
0
        public void AvatarAppearance(object sender, Agent agent, Primitive.TextureEntry textures, byte[] visualParams)
        {
            if (OnAvatarAppearance != null)
            {
                OnAvatarAppearance(sender, agent, textures, visualParams);
            }

            // Update the avatar
            agent.Avatar.Textures = textures;
            if (visualParams != null)
            {
                agent.VisualParams = visualParams;
            }

            // Broadcast the object update
            ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(agent.Avatar,
                                                                         server.RegionHandle, agent.State, agent.Flags);

            server.UDP.BroadcastPacket(update, PacketCategory.State);

            // Send the appearance packet to all other clients
            AvatarAppearancePacket appearance = BuildAppearancePacket(agent);

            lock (server.Agents)
            {
                foreach (Agent recipient in server.Agents.Values)
                {
                    if (recipient != agent)
                    {
                        server.UDP.SendPacket(recipient.AgentID, appearance, PacketCategory.State);
                    }
                }
            }
        }
예제 #4
0
        void AgentUpdateHandler(Packet packet, Agent agent)
        {
            AgentUpdatePacket update = (AgentUpdatePacket)packet;

            agent.Avatar.Rotation = update.AgentData.BodyRotation;
            agent.ControlFlags    = (AgentManager.ControlFlags)update.AgentData.ControlFlags;
            agent.State           = update.AgentData.State;
            agent.Flags           = (PrimFlags)update.AgentData.Flags;

            ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar,
                                                                             server.RegionHandle, agent.State, agent.Flags);

            server.UDP.BroadcastPacket(fullUpdate, PacketCategory.State);
        }
예제 #5
0
        public bool ObjectAdd(object sender, Agent creator, SimulationObject obj, PrimFlags creatorFlags)
        {
            // Check if the object already exists in the scene
            if (sceneObjects.ContainsKey(obj.Prim.ID))
            {
                Logger.Log(String.Format("Attempting to add duplicate object {0} to the scene",
                                         obj.Prim.ID), Helpers.LogLevel.Warning);
                return(false);
            }

            // Assign a unique LocalID to this object
            obj.Prim.LocalID = (uint)Interlocked.Increment(ref currentLocalID);

            if (OnObjectAdd != null)
            {
                OnObjectAdd(sender, creator, obj, creatorFlags);
            }

            // Add the object to the scene dictionary
            sceneObjects.Add(obj.Prim.LocalID, obj.Prim.ID, obj);

            // Send an update out to the creator
            ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0,
                                                                                obj.Prim.Flags | creatorFlags);

            server.UDP.SendPacket(creator.AgentID, updateToOwner, PacketCategory.State);

            // Send an update out to everyone else
            ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0,
                                                                                 obj.Prim.Flags);

            lock (server.Agents)
            {
                foreach (Agent recipient in server.Agents.Values)
                {
                    if (recipient != creator)
                    {
                        server.UDP.SendPacket(recipient.AgentID, updateToOthers, PacketCategory.State);
                    }
                }
            }

            return(true);
        }