aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/World
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Modules/World')
-rw-r--r--OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs239
1 files changed, 239 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs
new file mode 100644
index 0000000..041af2b
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs
@@ -0,0 +1,239 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Reflection;
32using libsecondlife;
33using log4net;
34using Nini.Config;
35using OpenSim.Framework;
36using OpenSim.Framework.Communications.Cache;
37using OpenSim.Framework.Communications.Capabilities;
38using OpenSim.Framework.Servers;
39using OpenSim.Region.Environment.Interfaces;
40using OpenSim.Region.Environment.Scenes;
41using OpenSim.Region.Environment.Types;
42using Caps = OpenSim.Framework.Communications.Capabilities.Caps;
43
44
45namespace OpenSim.Region.Environment.Modules.World.WorldMap
46{
47 public class WorldMapModule : IRegionModule
48 {
49 private static readonly ILog m_log =
50 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51
52 private static readonly string m_mapLayerPath = "0001/";
53
54 //private IConfig m_config;
55 private Scene m_scene;
56 private List<MapBlockData> cachedMapBlocks = new List<MapBlockData>();
57 private int cachedTime = 0;
58
59 //private int CacheRegionsDistance = 256;
60
61 #region IRegionModule Members
62
63 public void Initialise(Scene scene, IConfigSource config)
64 {
65 m_scene = scene;
66
67 //QuadTree.Subdivide();
68 //QuadTree.Subdivide();
69
70 scene.EventManager.OnRegisterCaps += OnRegisterCaps;
71 scene.EventManager.OnNewClient += OnNewClient;
72 scene.EventManager.OnClientClosed += ClientLoggedOut;
73 }
74 public void PostInitialise()
75 {
76
77 }
78
79 public void Close()
80 {
81 }
82 public string Name
83 {
84 get { return "WorldMapModule"; }
85 }
86
87 public bool IsSharedModule
88 {
89 get { return false; }
90 }
91
92 #endregion
93
94
95
96
97
98 public void OnRegisterCaps(LLUUID agentID, Caps caps)
99 {
100 m_log.DebugFormat("[VOICE] OnRegisterCaps: agentID {0} caps {1}", agentID, caps);
101 string capsBase = "/CAPS/" + caps.CapsObjectPath;
102 caps.RegisterHandler("MapLayer",
103 new RestStreamHandler("POST", capsBase + m_mapLayerPath,
104 delegate(string request, string path, string param,
105 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
106 {
107 return MapLayerRequest(request, path, param,
108 agentID, caps);
109 }));
110
111 }
112
113 /// <summary>
114 /// Callback for a map layer request
115 /// </summary>
116 /// <param name="request"></param>
117 /// <param name="path"></param>
118 /// <param name="param"></param>
119 /// <param name="agentID"></param>
120 /// <param name="caps"></param>
121 /// <returns></returns>
122 public string MapLayerRequest(string request, string path, string param,
123 LLUUID agentID, Caps caps)
124 {
125 //try
126 //{
127 //m_log.DebugFormat("[MAPLAYER]: request: {0}, path: {1}, param: {2}, agent:{3}",
128 //request, path, param,agentID.ToString());
129
130 // this is here because CAPS map requests work even beyond the 10,000 limit.
131 ScenePresence avatarPresence = null;
132
133 m_scene.TryGetAvatar(agentID, out avatarPresence);
134
135 if (avatarPresence != null)
136 {
137 bool lookup = false;
138
139 lock(cachedMapBlocks)
140 {
141 if (cachedMapBlocks.Count > 0 && ((cachedTime + 1800) > Util.UnixTimeSinceEpoch()))
142 {
143 List<MapBlockData> mapBlocks;
144
145 mapBlocks = cachedMapBlocks;
146 avatarPresence.ControllingClient.SendMapBlock(mapBlocks);
147 }
148 else
149 {
150 lookup = true;
151 }
152 }
153 if (lookup)
154 {
155 List<MapBlockData> mapBlocks;
156
157 mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks((int)m_scene.RegionInfo.RegionLocX - 8, (int)m_scene.RegionInfo.RegionLocY - 8, (int)m_scene.RegionInfo.RegionLocX + 8, (int)m_scene.RegionInfo.RegionLocY + 8);
158 avatarPresence.ControllingClient.SendMapBlock(mapBlocks);
159
160 lock(cachedMapBlocks)
161 cachedMapBlocks = mapBlocks;
162
163 cachedTime = Util.UnixTimeSinceEpoch();
164 }
165 }
166 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
167 mapResponse.LayerData.Array.Add(GetLLSDMapLayerResponse());
168 return mapResponse.ToString();
169 }
170
171 /// <summary>
172 ///
173 /// </summary>
174 /// <param name="mapReq"></param>
175 /// <returns></returns>
176 public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq)
177 {
178 m_log.Debug("[CAPS]: MapLayer Request in region: " + m_scene.RegionInfo.RegionName);
179 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
180 mapResponse.LayerData.Array.Add(GetLLSDMapLayerResponse());
181 return mapResponse;
182 }
183
184 /// <summary>
185 ///
186 /// </summary>
187 /// <returns></returns>
188 protected static LLSDMapLayer GetLLSDMapLayerResponse()
189 {
190 LLSDMapLayer mapLayer = new LLSDMapLayer();
191 mapLayer.Right = 5000;
192 mapLayer.Top = 5000;
193 mapLayer.ImageID = new LLUUID("00000000-0000-1111-9999-000000000006");
194
195 return mapLayer;
196 }
197 #region EventHandlers
198
199
200 private void OnNewClient(IClientAPI client)
201 {
202 // All friends establishment protocol goes over instant message
203 // There's no way to send a message from the sim
204 // to a user to 'add a friend' without causing dialog box spam
205 //
206 // The base set of friends are added when the user signs on in their XMLRPC response
207 // Generated by LoginService. The friends are retreived from the database by the UserManager
208
209 // Subscribe to instant messages
210
211 //client.OnInstantMessage += OnInstantMessage;
212 //client.OnApproveFriendRequest += OnApprovedFriendRequest;
213 //client.OnDenyFriendRequest += OnDenyFriendRequest;
214 //client.OnTerminateFriendship += OnTerminateFriendship;
215
216 //doFriendListUpdateOnline(client.AgentId);
217 client.OnRequestMapBlocks += RequestMapBlocks;
218 }
219 private void ClientLoggedOut(LLUUID AgentId)
220 {
221
222 }
223 #endregion
224
225 /// <summary>
226 /// Requests map blocks in area of minX, maxX, minY, MaxY in world cordinates
227 /// </summary>
228 /// <param name="minX"></param>
229 /// <param name="minY"></param>
230 /// <param name="maxX"></param>
231 /// <param name="maxY"></param>
232 public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
233 {
234 List<MapBlockData> mapBlocks;
235 mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4);
236 remoteClient.SendMapBlock(mapBlocks);
237 }
238 }
239} \ No newline at end of file