aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/General/Types/RegionHandle.cs
blob: 4a055adae8c3726ff7cb73a005a7b4da3104a518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System;
using System.Net;

namespace OpenSim.Framework.Types
{
    /// <summary>
    /// A class for manipulating RegionHandle coordinates
    /// </summary>
    class RegionHandle
    {
        private UInt64 handle;

        /// <summary>
        /// Initialises a new grid-aware RegionHandle
        /// </summary>
        /// <param name="ip">IP Address of the Grid Server for this region</param>
        /// <param name="x">Grid X Coordinate</param>
        /// <param name="y">Grid Y Coordinate</param>
        public RegionHandle(string ip, short x, short y)
        {
            IPAddress addr = IPAddress.Parse(ip);

            if (addr.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
                throw new Exception("Bad RegionHandle Parameter - must be an IPv4 address");

            uint baseHandle = BitConverter.ToUInt32(addr.GetAddressBytes(), 0);

            // Split the IP address in half
            short a = (short)((baseHandle << 16) & 0xFFFF);
            short b = (short)((baseHandle <<  0) & 0xFFFF);

            // Raise the bounds a little
            uint nx = (uint)x;
            uint ny = (uint)y;

            // Multiply grid coords to get region coords
            nx *= 256;
            ny *= 256;

            // Stuff the IP address in too
            nx = (uint)a << 16;
            ny = (uint)b << 16;

            handle = ((UInt64)nx << 32) | (uint)ny;
        }

        /// <summary>
        /// Initialises a new RegionHandle that is not inter-grid aware
        /// </summary>
        /// <param name="x">Grid X Coordinate</param>
        /// <param name="y">Grid Y Coordinate</param>
        public RegionHandle(uint x, uint y)
        {
            handle = ((x * 256) << 32) | (y * 256);
        }

        /// <summary>
        /// Initialises a new RegionHandle from an existing value
        /// </summary>
        /// <param name="Region">A U64 RegionHandle</param>
        public RegionHandle(UInt64 Region)
        {
            handle = Region;
        }

        /// <summary>
        /// Returns the Grid Masked RegionHandle - For use in Teleport packets and other packets where sending the grid IP address may be handy.
        /// </summary>
        /// <remarks>Do not use for SimulatorEnable packets. The client will choke.</remarks>
        /// <returns>Region Handle including IP Address encoding</returns>
        public UInt64 getTeleportHandle()
        {
            return handle;
        }

        /// <summary>
        /// Returns a RegionHandle which may be used for SimulatorEnable packets. Removes the IP address encoding and returns the lower bounds.
        /// </summary>
        /// <returns>A U64 RegionHandle for use in SimulatorEnable packets.</returns>
        public UInt64 getNeighbourHandle()
        {
            UInt64 mask = 0x0000FFFF0000FFFF;

            return handle | mask;
        }

        /// <summary>
        /// Returns the IP Address of the GridServer from a Grid-Encoded RegionHandle
        /// </summary>
        /// <returns>Grid Server IP Address</returns>
        public IPAddress getGridIP()
        {
            uint a = (uint)((handle >> 16) & 0xFFFF);
            uint b = (uint)((handle >> 48) & 0xFFFF);

            return new IPAddress((long)(a << 16) | (long)b);
        }

        /// <summary>
        /// Returns the X Coordinate from a Grid-Encoded RegionHandle
        /// </summary>
        /// <returns>X Coordinate</returns>
        public uint getGridX()
        {
            uint x = (uint)((handle >> 32) & 0xFFFF);

            return x;
        }

        /// <summary>
        /// Returns the Y Coordinate from a Grid-Encoded RegionHandle
        /// </summary>
        /// <returns>Y Coordinate</returns>
        public uint getGridY()
        {
            uint y = (uint)((handle >> 0) & 0xFFFF);

            return y;
        }
    }
}