Esempio n. 1
0
        private void ParcelOverlayHandler(Packet packet, Simulator simulator)
        {
            ParcelOverlayPacket overlay = (ParcelOverlayPacket)packet;

            if (overlay.ParcelData.SequenceID >= 0 && overlay.ParcelData.SequenceID <= 3)
            {
                Buffer.BlockCopy(overlay.ParcelData.Data, 0, simulator.ParcelOverlay,
                                 overlay.ParcelData.SequenceID * 1024, 1024);
                simulator.ParcelOverlaysReceived++;

                if (simulator.ParcelOverlaysReceived > 3)
                {
                    // TODO: ParcelOverlaysReceived should become internal, and reset to zero every
                    // time it hits four. Also need a callback here
                }
            }
            else
            {
                Client.Log("Parcel overlay with sequence ID of " + overlay.ParcelData.SequenceID +
                           " received from " + simulator.ToString(), Helpers.LogLevel.Warning);
            }
        }
Esempio n. 2
0
        private void SendParcelOverlay(IScenePresence presence)
        {
            const int LAND_BLOCKS_PER_PACKET = 1024;

            if (m_udp == null)
                return;
            if (!(presence is LLAgent) || presence.InterestList == null)
                return;
            LLAgent agent = (LLAgent)presence;

            byte[] byteArray = new byte[LAND_BLOCKS_PER_PACKET];
            int byteArrayCount = 0;
            int sequenceID = 0;

            for (int y = 0; y < 64; y++)
            {
                for (int x = 0; x < 64; x++)
                {
                    byte tempByte = 0; // The flags for the current 4x4m parcel square

                    SceneParcel parcel;
                    if (m_parcels.TryGetParcel(m_parcels.GetParcelID(x, y), out parcel))
                    {
                        // Set the ownership/sale flag
                        if (parcel.OwnerID == presence.ID)
                            tempByte = (byte)ParcelOverlayType.OwnedBySelf;
                        //else if (parcel.AuctionID != 0)
                        //    tempByte = (byte)ParcelOverlayType.Auction;
                        else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == presence.ID))
                            tempByte = (byte)ParcelOverlayType.ForSale;
                        else if (parcel.GroupID != UUID.Zero)
                            tempByte = (byte)ParcelOverlayType.OwnedByGroup;
                        else if (parcel.OwnerID != UUID.Zero)
                            tempByte = (byte)ParcelOverlayType.OwnedByOther;
                        else
                            tempByte = (byte)ParcelOverlayType.Public;

                        // Set the border flags
                        if (x == 0)
                            tempByte |= (byte)ParcelOverlayType.BorderWest;
                        else if (m_parcels.GetParcelID(x - 1, y) != parcel.LocalID)
                            // Parcel to the west is different from the current parcel
                            tempByte |= (byte)ParcelOverlayType.BorderWest;

                        if (y == 0)
                            tempByte |= (byte)ParcelOverlayType.BorderSouth;
                        else if (m_parcels.GetParcelID(x, y - 1) != parcel.LocalID)
                            // Parcel to the south is different from the current parcel
                            tempByte |= (byte)ParcelOverlayType.BorderSouth;

                        byteArray[byteArrayCount] = tempByte;
                        ++byteArrayCount;
                        if (byteArrayCount >= LAND_BLOCKS_PER_PACKET)
                        {
                            // Send a ParcelOverlay packet
                            ParcelOverlayPacket overlay = new ParcelOverlayPacket();
                            overlay.ParcelData.SequenceID = sequenceID;
                            overlay.ParcelData.Data = byteArray;
                            m_udp.SendPacket(agent, overlay, ThrottleCategory.Task, false);

                            byteArrayCount = 0;
                            ++sequenceID;
                        }
                    }
                    else
                    {
                        m_log.Warn("Parcel overlay references missing parcel " + m_parcels.GetParcelID(x, y));
                    }
                }
            }
        }
Esempio n. 3
0
        private void SendParcelOverlay(IScenePresence presence)
        {
            const int LAND_BLOCKS_PER_PACKET = 1024;

            if (m_udp == null)
            {
                return;
            }
            if (!(presence is LLAgent) || presence.InterestList == null)
            {
                return;
            }
            LLAgent agent = (LLAgent)presence;

            byte[] byteArray      = new byte[LAND_BLOCKS_PER_PACKET];
            int    byteArrayCount = 0;
            int    sequenceID     = 0;

            for (int y = 0; y < 64; y++)
            {
                for (int x = 0; x < 64; x++)
                {
                    byte tempByte = 0; // The flags for the current 4x4m parcel square

                    SceneParcel parcel;
                    if (m_parcels.TryGetParcel(m_parcels.GetParcelID(x, y), out parcel))
                    {
                        // Set the ownership/sale flag
                        if (parcel.OwnerID == presence.ID)
                        {
                            tempByte = (byte)ParcelOverlayType.OwnedBySelf;
                        }
                        //else if (parcel.AuctionID != 0)
                        //    tempByte = (byte)ParcelOverlayType.Auction;
                        else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == presence.ID))
                        {
                            tempByte = (byte)ParcelOverlayType.ForSale;
                        }
                        else if (parcel.GroupID != UUID.Zero)
                        {
                            tempByte = (byte)ParcelOverlayType.OwnedByGroup;
                        }
                        else if (parcel.OwnerID != UUID.Zero)
                        {
                            tempByte = (byte)ParcelOverlayType.OwnedByOther;
                        }
                        else
                        {
                            tempByte = (byte)ParcelOverlayType.Public;
                        }

                        // Set the border flags
                        if (x == 0)
                        {
                            tempByte |= (byte)ParcelOverlayType.BorderWest;
                        }
                        else if (m_parcels.GetParcelID(x - 1, y) != parcel.LocalID)
                        {
                            // Parcel to the west is different from the current parcel
                            tempByte |= (byte)ParcelOverlayType.BorderWest;
                        }

                        if (y == 0)
                        {
                            tempByte |= (byte)ParcelOverlayType.BorderSouth;
                        }
                        else if (m_parcels.GetParcelID(x, y - 1) != parcel.LocalID)
                        {
                            // Parcel to the south is different from the current parcel
                            tempByte |= (byte)ParcelOverlayType.BorderSouth;
                        }

                        byteArray[byteArrayCount] = tempByte;
                        ++byteArrayCount;
                        if (byteArrayCount >= LAND_BLOCKS_PER_PACKET)
                        {
                            // Send a ParcelOverlay packet
                            ParcelOverlayPacket overlay = new ParcelOverlayPacket();
                            overlay.ParcelData.SequenceID = sequenceID;
                            overlay.ParcelData.Data       = byteArray;
                            m_udp.SendPacket(agent, overlay, ThrottleCategory.Task, false);

                            byteArrayCount = 0;
                            ++sequenceID;
                        }
                    }
                    else
                    {
                        m_log.Warn("Parcel overlay references missing parcel " + m_parcels.GetParcelID(x, y));
                    }
                }
            }
        }
Esempio n. 4
0
        public void SendParcelOverlay(Agent agent)
        {
            const int LAND_BLOCKS_PER_PACKET = 1024;

            byte[] byteArray      = new byte[LAND_BLOCKS_PER_PACKET];
            int    byteArrayCount = 0;
            int    sequenceID     = 0;

            for (int y = 0; y < 64; y++)
            {
                for (int x = 0; x < 64; x++)
                {
                    byte tempByte = 0; // The flags for the current 4x4m parcel square

                    Parcel parcel;
                    if (parcels.TryGetValue(parcelOverlay[y * 64 + x], out parcel))
                    {
                        // Set the ownership/sale flag
                        if (parcel.OwnerID == agent.AgentID)
                        {
                            tempByte = (byte)ParcelOverlayType.OwnedBySelf;
                        }
                        else if (parcel.AuctionID != 0)
                        {
                            tempByte = (byte)ParcelOverlayType.Auction;
                        }
                        else if (parcel.SalePrice > 0 && (parcel.AuthBuyerID == UUID.Zero || parcel.AuthBuyerID == agent.AgentID))
                        {
                            tempByte = (byte)ParcelOverlayType.ForSale;
                        }
                        else if (parcel.GroupID != UUID.Zero)
                        {
                            tempByte = (byte)ParcelOverlayType.OwnedByGroup;
                        }
                        else if (parcel.OwnerID != UUID.Zero)
                        {
                            tempByte = (byte)ParcelOverlayType.OwnedByOther;
                        }
                        else
                        {
                            tempByte = (byte)ParcelOverlayType.Public;
                        }

                        // Set the border flags
                        if (x == 0)
                        {
                            tempByte |= (byte)ParcelOverlayType.BorderWest;
                        }
                        else if (parcelOverlay[y * 64 + (x - 1)] != parcel.LocalID)
                        {
                            // Parcel to the west is different from the current parcel
                            tempByte |= (byte)ParcelOverlayType.BorderWest;
                        }

                        if (y == 0)
                        {
                            tempByte |= (byte)ParcelOverlayType.BorderSouth;
                        }
                        else if (parcelOverlay[(y - 1) * 64 + x] != parcel.LocalID)
                        {
                            // Parcel to the south is different from the current parcel
                            tempByte |= (byte)ParcelOverlayType.BorderSouth;
                        }

                        byteArray[byteArrayCount] = tempByte;
                        ++byteArrayCount;
                        if (byteArrayCount >= LAND_BLOCKS_PER_PACKET)
                        {
                            // Send a ParcelOverlay packet
                            ParcelOverlayPacket overlay = new ParcelOverlayPacket();
                            overlay.ParcelData.SequenceID = sequenceID;
                            overlay.ParcelData.Data       = byteArray;
                            server.UDP.SendPacket(agent.AgentID, overlay, PacketCategory.State);

                            byteArrayCount = 0;
                            ++sequenceID;
                        }
                    }
                    else
                    {
                        Logger.Log("Parcel overlay references missing parcel " + parcelOverlay[y * 64 + x],
                                   Helpers.LogLevel.Warning);
                    }
                }
            }
        }