opensim-development – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 eva 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 OpenSimulator 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  
28 using System;
29 using System.Collections;
30 using System.Collections.Generic;
31 using System.IO;
32 using System.Linq;
33 using System.Reflection;
34 using System.Security;
35 using System.Timers;
36 using log4net;
37 using Mono.Addins;
38 using Nini.Config;
39 using OpenMetaverse;
40 using OpenSim.Framework;
41 using OpenSim.Region.Framework.Interfaces;
42 using OpenSim.Region.Framework.Scenes;
43 using RegionFlags = OpenMetaverse.RegionFlags;
44  
45 namespace OpenSim.Region.CoreModules.World.Estate
46 {
47 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EstateManagementModule")]
48 public class EstateManagementModule : IEstateModule, INonSharedRegionModule
49 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51  
52 private Timer m_regionChangeTimer = new Timer();
53 public Scene Scene { get; private set; }
54 public IUserManagement UserManager { get; private set; }
55  
56 protected EstateManagementCommands m_commands;
57  
58 /// <summary>
59 /// If false, region restart requests from the client are blocked even if they are otherwise legitimate.
60 /// </summary>
61 public bool AllowRegionRestartFromClient { get; set; }
62  
63 private EstateTerrainXferHandler TerrainUploader;
64 public TelehubManager m_Telehub;
65  
66 public event ChangeDelegate OnRegionInfoChange;
67 public event ChangeDelegate OnEstateInfoChange;
68 public event MessageDelegate OnEstateMessage;
69  
70 private int m_delayCount = 0;
71  
72 #region Region Module interface
73  
74 public string Name { get { return "EstateManagementModule"; } }
75  
76 public Type ReplaceableInterface { get { return null; } }
77  
78 public void Initialise(IConfigSource source)
79 {
80 AllowRegionRestartFromClient = true;
81  
82 IConfig config = source.Configs["EstateManagement"];
83  
84 if (config != null)
85 AllowRegionRestartFromClient = config.GetBoolean("AllowRegionRestartFromClient", true);
86 }
87  
88 public void AddRegion(Scene scene)
89 {
90 Scene = scene;
91 Scene.RegisterModuleInterface<IEstateModule>(this);
92 Scene.EventManager.OnNewClient += EventManager_OnNewClient;
93 Scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight;
94  
95 m_Telehub = new TelehubManager(scene);
96  
97 m_commands = new EstateManagementCommands(this);
98 m_commands.Initialise();
99 }
100  
101 public void RemoveRegion(Scene scene) {}
102  
103 public void RegionLoaded(Scene scene)
104 {
105 // Sets up the sun module based no the saved Estate and Region Settings
106 // DO NOT REMOVE or the sun will stop working
107 scene.TriggerEstateSunUpdate();
108  
109 UserManager = scene.RequestModuleInterface<IUserManagement>();
110 }
111  
112 public void Close()
113 {
114 m_commands.Close();
115 }
116  
117 #endregion
118  
119 #region Packet Data Responders
120  
121 private void clientSendDetailedEstateData(IClientAPI remote_client, UUID invoice)
122 {
123 sendDetailedEstateData(remote_client, invoice);
124 sendEstateLists(remote_client, invoice);
125 }
126  
127 private void sendDetailedEstateData(IClientAPI remote_client, UUID invoice)
128 {
129 uint sun = 0;
130  
131 if (Scene.RegionInfo.EstateSettings.FixedSun)
132 sun = (uint)(Scene.RegionInfo.EstateSettings.SunPosition * 1024.0) + 0x1800;
133 UUID estateOwner;
134 estateOwner = Scene.RegionInfo.EstateSettings.EstateOwner;
135  
136 if (Scene.Permissions.IsGod(remote_client.AgentId))
137 estateOwner = remote_client.AgentId;
138  
139 remote_client.SendDetailedEstateData(invoice,
140 Scene.RegionInfo.EstateSettings.EstateName,
141 Scene.RegionInfo.EstateSettings.EstateID,
142 Scene.RegionInfo.EstateSettings.ParentEstateID,
143 GetEstateFlags(),
144 sun,
145 Scene.RegionInfo.RegionSettings.Covenant,
146 (uint) Scene.RegionInfo.RegionSettings.CovenantChangedDateTime,
147 Scene.RegionInfo.EstateSettings.AbuseEmail,
148 estateOwner);
149 }
150  
151 private void sendEstateLists(IClientAPI remote_client, UUID invoice)
152 {
153 remote_client.SendEstateList(invoice,
154 (int)Constants.EstateAccessCodex.EstateManagers,
155 Scene.RegionInfo.EstateSettings.EstateManagers,
156 Scene.RegionInfo.EstateSettings.EstateID);
157  
158 remote_client.SendEstateList(invoice,
159 (int)Constants.EstateAccessCodex.AccessOptions,
160 Scene.RegionInfo.EstateSettings.EstateAccess,
161 Scene.RegionInfo.EstateSettings.EstateID);
162  
163 remote_client.SendEstateList(invoice,
164 (int)Constants.EstateAccessCodex.AllowedGroups,
165 Scene.RegionInfo.EstateSettings.EstateGroups,
166 Scene.RegionInfo.EstateSettings.EstateID);
167  
168 remote_client.SendBannedUserList(invoice,
169 Scene.RegionInfo.EstateSettings.EstateBans,
170 Scene.RegionInfo.EstateSettings.EstateID);
171 }
172  
173 private void estateSetRegionInfoHandler(bool blockTerraform, bool noFly, bool allowDamage, bool blockLandResell, int maxAgents, float objectBonusFactor,
174 int matureLevel, bool restrictPushObject, bool allowParcelChanges)
175 {
176 if (blockTerraform)
177 Scene.RegionInfo.RegionSettings.BlockTerraform = true;
178 else
179 Scene.RegionInfo.RegionSettings.BlockTerraform = false;
180  
181 if (noFly)
182 Scene.RegionInfo.RegionSettings.BlockFly = true;
183 else
184 Scene.RegionInfo.RegionSettings.BlockFly = false;
185  
186 if (allowDamage)
187 Scene.RegionInfo.RegionSettings.AllowDamage = true;
188 else
189 Scene.RegionInfo.RegionSettings.AllowDamage = false;
190  
191 if (blockLandResell)
192 Scene.RegionInfo.RegionSettings.AllowLandResell = false;
193 else
194 Scene.RegionInfo.RegionSettings.AllowLandResell = true;
195  
196 if((byte)maxAgents <= Scene.RegionInfo.AgentCapacity)
197 Scene.RegionInfo.RegionSettings.AgentLimit = (byte) maxAgents;
198 else
199 Scene.RegionInfo.RegionSettings.AgentLimit = Scene.RegionInfo.AgentCapacity;
200  
201 Scene.RegionInfo.RegionSettings.ObjectBonus = objectBonusFactor;
202  
203 if (matureLevel <= 13)
204 Scene.RegionInfo.RegionSettings.Maturity = 0;
205 else if (matureLevel <= 21)
206 Scene.RegionInfo.RegionSettings.Maturity = 1;
207 else
208 Scene.RegionInfo.RegionSettings.Maturity = 2;
209  
210 if (restrictPushObject)
211 Scene.RegionInfo.RegionSettings.RestrictPushing = true;
212 else
213 Scene.RegionInfo.RegionSettings.RestrictPushing = false;
214  
215 if (allowParcelChanges)
216 Scene.RegionInfo.RegionSettings.AllowLandJoinDivide = true;
217 else
218 Scene.RegionInfo.RegionSettings.AllowLandJoinDivide = false;
219  
220 Scene.RegionInfo.RegionSettings.Save();
221 TriggerRegionInfoChange();
222  
223 sendRegionInfoPacketToAll();
224 }
225  
226 public void setEstateTerrainBaseTexture(int level, UUID texture)
227 {
228 setEstateTerrainBaseTexture(null, level, texture);
229 sendRegionHandshakeToAll();
230 }
231  
232 public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int level, UUID texture)
233 {
234 if (texture == UUID.Zero)
235 return;
236  
237 switch (level)
238 {
239 case 0:
240 Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture;
241 break;
242 case 1:
243 Scene.RegionInfo.RegionSettings.TerrainTexture2 = texture;
244 break;
245 case 2:
246 Scene.RegionInfo.RegionSettings.TerrainTexture3 = texture;
247 break;
248 case 3:
249 Scene.RegionInfo.RegionSettings.TerrainTexture4 = texture;
250 break;
251 }
252  
253 Scene.RegionInfo.RegionSettings.Save();
254 TriggerRegionInfoChange();
255 sendRegionInfoPacketToAll();
256 }
257  
258 public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue)
259 {
260 setEstateTerrainTextureHeights(null, corner, lowValue, highValue);
261 }
262  
263 public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue)
264 {
265 switch (corner)
266 {
267 case 0:
268 Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue;
269 Scene.RegionInfo.RegionSettings.Elevation2SW = highValue;
270 break;
271 case 1:
272 Scene.RegionInfo.RegionSettings.Elevation1NW = lowValue;
273 Scene.RegionInfo.RegionSettings.Elevation2NW = highValue;
274 break;
275 case 2:
276 Scene.RegionInfo.RegionSettings.Elevation1SE = lowValue;
277 Scene.RegionInfo.RegionSettings.Elevation2SE = highValue;
278 break;
279 case 3:
280 Scene.RegionInfo.RegionSettings.Elevation1NE = lowValue;
281 Scene.RegionInfo.RegionSettings.Elevation2NE = highValue;
282 break;
283 }
284  
285 Scene.RegionInfo.RegionSettings.Save();
286 TriggerRegionInfoChange();
287 sendRegionHandshakeToAll();
288 sendRegionInfoPacketToAll();
289 }
290  
291 private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient)
292 {
293 // sendRegionHandshakeToAll();
294 }
295  
296 public void setRegionTerrainSettings(float WaterHeight,
297 float TerrainRaiseLimit, float TerrainLowerLimit,
298 bool UseEstateSun, bool UseFixedSun, float SunHour,
299 bool UseGlobal, bool EstateFixedSun, float EstateSunHour)
300 {
301 // Water Height
302 Scene.RegionInfo.RegionSettings.WaterHeight = WaterHeight;
303  
304 // Terraforming limits
305 Scene.RegionInfo.RegionSettings.TerrainRaiseLimit = TerrainRaiseLimit;
306 Scene.RegionInfo.RegionSettings.TerrainLowerLimit = TerrainLowerLimit;
307  
308 // Time of day / fixed sun
309 Scene.RegionInfo.RegionSettings.UseEstateSun = UseEstateSun;
310 Scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun;
311 Scene.RegionInfo.RegionSettings.SunPosition = SunHour;
312  
313 Scene.TriggerEstateSunUpdate();
314  
315 //m_log.Debug("[ESTATE]: UFS: " + UseFixedSun.ToString());
316 //m_log.Debug("[ESTATE]: SunHour: " + SunHour.ToString());
317  
318 sendRegionInfoPacketToAll();
319 Scene.RegionInfo.RegionSettings.Save();
320 TriggerRegionInfoChange();
321 }
322  
323 private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds)
324 {
325 if (!AllowRegionRestartFromClient)
326 {
327 remoteClient.SendAlertMessage("Region restart has been disabled on this simulator.");
328 return;
329 }
330  
331 IRestartModule restartModule = Scene.RequestModuleInterface<IRestartModule>();
332 if (restartModule != null)
333 {
334 List<int> times = new List<int>();
335 while (timeInSeconds > 0)
336 {
337 times.Add(timeInSeconds);
338 if (timeInSeconds > 300)
339 timeInSeconds -= 120;
340 else if (timeInSeconds > 30)
341 timeInSeconds -= 30;
342 else
343 timeInSeconds -= 15;
344 }
345  
346 restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), false);
347  
348 m_log.InfoFormat(
349 "User {0} requested restart of region {1} in {2} seconds",
350 remoteClient.Name, Scene.Name, times.Count != 0 ? times[0] : 0);
351 }
352 }
353  
354 private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID)
355 {
356 // m_log.DebugFormat(
357 // "[ESTATE MANAGEMENT MODULE]: Handling request from {0} to change estate covenant to {1}",
358 // remoteClient.Name, estateCovenantID);
359  
360 Scene.RegionInfo.RegionSettings.Covenant = estateCovenantID;
361 Scene.RegionInfo.RegionSettings.CovenantChangedDateTime = Util.UnixTimeSinceEpoch();
362 Scene.RegionInfo.RegionSettings.Save();
363 TriggerRegionInfoChange();
364 }
365  
366 private void handleEstateAccessDeltaRequest(IClientAPI remote_client, UUID invoice, int estateAccessType, UUID user)
367 {
368 // EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc.
369  
370 if (user == Scene.RegionInfo.EstateSettings.EstateOwner)
371 return; // never process EO
372  
373 if ((estateAccessType & 4) != 0) // User add
374 {
375 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
376 {
377 if ((estateAccessType & 1) != 0) // All estates
378 {
379 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
380 EstateSettings estateSettings;
381  
382 foreach (int estateID in estateIDs)
383 {
384 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
385 {
386 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
387 estateSettings.AddEstateUser(user);
388 estateSettings.Save();
389 }
390 }
391 }
392  
393 Scene.RegionInfo.EstateSettings.AddEstateUser(user);
394 Scene.RegionInfo.EstateSettings.Save();
395  
396 TriggerEstateInfoChange();
397 remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID);
398 }
399 else
400 {
401 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
402 }
403  
404 }
405  
406 if ((estateAccessType & 8) != 0) // User remove
407 {
408 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
409 {
410 if ((estateAccessType & 1) != 0) // All estates
411 {
412 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
413 EstateSettings estateSettings;
414  
415 foreach (int estateID in estateIDs)
416 {
417 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
418 {
419 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
420 estateSettings.RemoveEstateUser(user);
421 estateSettings.Save();
422 }
423 }
424 }
425  
426 Scene.RegionInfo.EstateSettings.RemoveEstateUser(user);
427 Scene.RegionInfo.EstateSettings.Save();
428  
429 TriggerEstateInfoChange();
430 remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID);
431 }
432 else
433 {
434 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
435 }
436 }
437  
438 if ((estateAccessType & 16) != 0) // Group add
439 {
440 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
441 {
442 if ((estateAccessType & 1) != 0) // All estates
443 {
444 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
445 EstateSettings estateSettings;
446  
447 foreach (int estateID in estateIDs)
448 {
449 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
450 {
451 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
452 estateSettings.AddEstateGroup(user);
453 estateSettings.Save();
454 }
455 }
456 }
457  
458 Scene.RegionInfo.EstateSettings.AddEstateGroup(user);
459 Scene.RegionInfo.EstateSettings.Save();
460  
461 TriggerEstateInfoChange();
462 remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID);
463 }
464 else
465 {
466 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
467 }
468 }
469  
470 if ((estateAccessType & 32) != 0) // Group remove
471 {
472 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
473 {
474 if ((estateAccessType & 1) != 0) // All estates
475 {
476 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
477 EstateSettings estateSettings;
478  
479 foreach (int estateID in estateIDs)
480 {
481 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
482 {
483 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
484 estateSettings.RemoveEstateGroup(user);
485 estateSettings.Save();
486 }
487 }
488 }
489  
490 Scene.RegionInfo.EstateSettings.RemoveEstateGroup(user);
491 Scene.RegionInfo.EstateSettings.Save();
492  
493 TriggerEstateInfoChange();
494 remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID);
495 }
496 else
497 {
498 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
499 }
500 }
501  
502 if ((estateAccessType & 64) != 0) // Ban add
503 {
504 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false))
505 {
506 EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans;
507  
508 bool alreadyInList = false;
509  
510 for (int i = 0; i < banlistcheck.Length; i++)
511 {
512 if (user == banlistcheck[i].BannedUserID)
513 {
514 alreadyInList = true;
515 break;
516 }
517  
518 }
519 if (!alreadyInList)
520 {
521  
522 if ((estateAccessType & 1) != 0) // All estates
523 {
524 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
525 EstateSettings estateSettings;
526  
527 foreach (int estateID in estateIDs)
528 {
529 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
530 {
531 EstateBan bitem = new EstateBan();
532  
533 bitem.BannedUserID = user;
534 bitem.EstateID = (uint)estateID;
535 bitem.BannedHostAddress = "0.0.0.0";
536 bitem.BannedHostIPMask = "0.0.0.0";
537  
538 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
539 estateSettings.AddBan(bitem);
540 estateSettings.Save();
541 }
542 }
543 }
544  
545 EstateBan item = new EstateBan();
546  
547 item.BannedUserID = user;
548 item.EstateID = Scene.RegionInfo.EstateSettings.EstateID;
549 item.BannedHostAddress = "0.0.0.0";
550 item.BannedHostIPMask = "0.0.0.0";
551  
552 Scene.RegionInfo.EstateSettings.AddBan(item);
553 Scene.RegionInfo.EstateSettings.Save();
554  
555 TriggerEstateInfoChange();
556  
557 ScenePresence s = Scene.GetScenePresence(user);
558 if (s != null)
559 {
560 if (!s.IsChildAgent)
561 {
562 if (!Scene.TeleportClientHome(user, s.ControllingClient))
563 {
564 s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
565 Scene.CloseAgent(s.UUID, false);
566 }
567 }
568 }
569  
570 }
571 else
572 {
573 remote_client.SendAlertMessage("User is already on the region ban list");
574 }
575 //Scene.RegionInfo.regionBanlist.Add(Manager(user);
576 remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID);
577 }
578 else
579 {
580 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
581 }
582 }
583  
584 if ((estateAccessType & 128) != 0) // Ban remove
585 {
586 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false))
587 {
588 EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans;
589  
590 bool alreadyInList = false;
591 EstateBan listitem = null;
592  
593 for (int i = 0; i < banlistcheck.Length; i++)
594 {
595 if (user == banlistcheck[i].BannedUserID)
596 {
597 alreadyInList = true;
598 listitem = banlistcheck[i];
599 break;
600 }
601 }
602  
603 if (alreadyInList && listitem != null)
604 {
605 if ((estateAccessType & 1) != 0) // All estates
606 {
607 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
608 EstateSettings estateSettings;
609  
610 foreach (int estateID in estateIDs)
611 {
612 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
613 {
614 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
615 estateSettings.RemoveBan(user);
616 estateSettings.Save();
617 }
618 }
619 }
620  
621 Scene.RegionInfo.EstateSettings.RemoveBan(listitem.BannedUserID);
622 Scene.RegionInfo.EstateSettings.Save();
623  
624 TriggerEstateInfoChange();
625 }
626 else
627 {
628 remote_client.SendAlertMessage("User is not on the region ban list");
629 }
630  
631 //Scene.RegionInfo.regionBanlist.Add(Manager(user);
632 remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID);
633 }
634 else
635 {
636 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
637 }
638 }
639  
640 if ((estateAccessType & 256) != 0) // Manager add
641 {
642 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
643 {
644 if ((estateAccessType & 1) != 0) // All estates
645 {
646 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
647 EstateSettings estateSettings;
648  
649 foreach (int estateID in estateIDs)
650 {
651 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
652 {
653 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
654 estateSettings.AddEstateManager(user);
655 estateSettings.Save();
656 }
657 }
658 }
659  
660 Scene.RegionInfo.EstateSettings.AddEstateManager(user);
661 Scene.RegionInfo.EstateSettings.Save();
662  
663 TriggerEstateInfoChange();
664 remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, Scene.RegionInfo.EstateSettings.EstateManagers, Scene.RegionInfo.EstateSettings.EstateID);
665 }
666 else
667 {
668 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
669 }
670 }
671  
672 if ((estateAccessType & 512) != 0) // Manager remove
673 {
674 if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
675 {
676 if ((estateAccessType & 1) != 0) // All estates
677 {
678 List<int> estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
679 EstateSettings estateSettings;
680  
681 foreach (int estateID in estateIDs)
682 {
683 if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
684 {
685 estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
686 estateSettings.RemoveEstateManager(user);
687 estateSettings.Save();
688 }
689 }
690 }
691  
692 Scene.RegionInfo.EstateSettings.RemoveEstateManager(user);
693 Scene.RegionInfo.EstateSettings.Save();
694  
695 TriggerEstateInfoChange();
696 remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, Scene.RegionInfo.EstateSettings.EstateManagers, Scene.RegionInfo.EstateSettings.EstateID);
697 }
698 else
699 {
700 remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
701 }
702 }
703 }
704  
705 public void HandleOnEstateManageTelehub(IClientAPI client, UUID invoice, UUID senderID, string cmd, uint param1)
706 {
707 SceneObjectPart part;
708  
709 switch (cmd)
710 {
711 case "info ui":
712 break;
713  
714 case "connect":
715 // Add the Telehub
716 part = Scene.GetSceneObjectPart((uint)param1);
717 if (part == null)
718 return;
719 SceneObjectGroup grp = part.ParentGroup;
720  
721 m_Telehub.Connect(grp);
722 break;
723  
724 case "delete":
725 // Disconnect Telehub
726 m_Telehub.Disconnect();
727 break;
728  
729 case "spawnpoint add":
730 // Add SpawnPoint to the Telehub
731 part = Scene.GetSceneObjectPart((uint)param1);
732 if (part == null)
733 return;
734 m_Telehub.AddSpawnPoint(part.AbsolutePosition);
735 break;
736  
737 case "spawnpoint remove":
738 // Remove SpawnPoint from Telehub
739 m_Telehub.RemoveSpawnPoint((int)param1);
740 break;
741  
742 default:
743 break;
744 }
745  
746 if (client != null)
747 SendTelehubInfo(client);
748 }
749  
750 private void SendSimulatorBlueBoxMessage(
751 IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message)
752 {
753 IDialogModule dm = Scene.RequestModuleInterface<IDialogModule>();
754  
755 if (dm != null)
756 dm.SendNotificationToUsersInRegion(senderID, senderName, message);
757 }
758  
759 private void SendEstateBlueBoxMessage(
760 IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message)
761 {
762 TriggerEstateMessage(senderID, senderName, message);
763 }
764  
765 private void handleEstateDebugRegionRequest(
766 IClientAPI remote_client, UUID invoice, UUID senderID,
767 bool disableScripts, bool disableCollisions, bool disablePhysics)
768 {
769 Scene.RegionInfo.RegionSettings.DisablePhysics = disablePhysics;
770 Scene.RegionInfo.RegionSettings.DisableScripts = disableScripts;
771 Scene.RegionInfo.RegionSettings.DisableCollisions = disableCollisions;
772 Scene.RegionInfo.RegionSettings.Save();
773 TriggerRegionInfoChange();
774  
775 ISceneCommandsModule scm = Scene.RequestModuleInterface<ISceneCommandsModule>();
776  
777 if (scm != null)
778 {
779 scm.SetSceneDebugOptions(
780 new Dictionary<string, string>() {
781 { "scripting", (!disableScripts).ToString() },
782 { "collisions", (!disableCollisions).ToString() },
783 { "physics", (!disablePhysics).ToString() }
784 }
785 );
786 }
787 }
788  
789 private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey)
790 {
791 if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false))
792 return;
793  
794 if (prey != UUID.Zero)
795 {
796 ScenePresence s = Scene.GetScenePresence(prey);
797 if (s != null)
798 {
799 if (!Scene.TeleportClientHome(prey, s.ControllingClient))
800 {
801 s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
802 Scene.CloseAgent(s.UUID, false);
803 }
804 }
805 }
806 }
807  
808 private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID)
809 {
810 if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false))
811 return;
812  
813 Scene.ForEachRootClient(delegate(IClientAPI client)
814 {
815 if (client.AgentId != senderID)
816 {
817 // make sure they are still there, we could be working down a long list
818 // Also make sure they are actually in the region
819 ScenePresence p;
820 if(Scene.TryGetScenePresence(client.AgentId, out p))
821 {
822 if (!Scene.TeleportClientHome(p.UUID, p.ControllingClient))
823 {
824 p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
825 Scene.CloseAgent(p.UUID, false);
826 }
827 }
828 }
829 });
830 }
831  
832 private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID)
833 {
834 lock (this)
835 {
836 if ((TerrainUploader != null) && (XferID == TerrainUploader.XferID))
837 {
838 remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
839 remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
840 TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
841  
842 TerrainUploader = null;
843 remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
844 }
845 }
846 }
847  
848 private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient)
849 {
850 lock (this)
851 {
852 remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
853 remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
854 TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
855  
856 TerrainUploader = null;
857 }
858 remoteClient.SendAlertMessage("Terrain Upload Complete. Loading....");
859 ITerrainModule terr = Scene.RequestModuleInterface<ITerrainModule>();
860  
861 if (terr != null)
862 {
863 m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName);
864  
865 try
866 {
867 MemoryStream terrainStream = new MemoryStream(terrainData);
868 terr.LoadFromStream(filename, terrainStream);
869 terrainStream.Close();
870  
871 FileInfo x = new FileInfo(filename);
872 remoteClient.SendAlertMessage("Your terrain was loaded as a " + x.Extension + " file. It may take a few moments to appear.");
873 }
874 catch (IOException e)
875 {
876 m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
877 remoteClient.SendAlertMessage("There was an IO Exception loading your terrain. Please check free space.");
878  
879 return;
880 }
881 catch (SecurityException e)
882 {
883 m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
884 remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive");
885  
886 return;
887 }
888 catch (UnauthorizedAccessException e)
889 {
890 m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
891 remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive");
892  
893 return;
894 }
895 catch (Exception e)
896 {
897 m_log.ErrorFormat("[TERRAIN]: Error loading a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
898 remoteClient.SendAlertMessage("There was a general error loading your terrain. Please fix the terrain file and try again");
899 }
900 }
901 else
902 {
903 remoteClient.SendAlertMessage("Unable to apply terrain. Cannot get an instance of the terrain module");
904 }
905 }
906  
907 private void handleUploadTerrain(IClientAPI remote_client, string clientFileName)
908 {
909 lock (this)
910 {
911 if (TerrainUploader == null)
912 {
913 m_log.DebugFormat("Starting to receive uploaded terrain");
914 TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
915 remote_client.OnXferReceive += TerrainUploader.XferReceive;
916 remote_client.OnAbortXfer += AbortTerrainXferHandler;
917 TerrainUploader.TerrainUploadDone += HandleTerrainApplication;
918 TerrainUploader.RequestStartXfer(remote_client);
919 }
920 else
921 {
922 remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
923 }
924 }
925 }
926  
927 public bool IsTerrainXfer(ulong xferID)
928 {
929 lock (this)
930 {
931 if (TerrainUploader == null)
932 return false;
933 else
934 return TerrainUploader.XferID == xferID;
935 }
936 }
937  
938 private void handleTerrainRequest(IClientAPI remote_client, string clientFileName)
939 {
940 // Save terrain here
941 ITerrainModule terr = Scene.RequestModuleInterface<ITerrainModule>();
942  
943 if (terr != null)
944 {
945 m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName);
946 if (File.Exists(Util.dataDir() + "/terrain.raw"))
947 {
948 File.Delete(Util.dataDir() + "/terrain.raw");
949 }
950 terr.SaveToFile(Util.dataDir() + "/terrain.raw");
951  
952 FileStream input = new FileStream(Util.dataDir() + "/terrain.raw", FileMode.Open);
953 byte[] bdata = new byte[input.Length];
954 input.Read(bdata, 0, (int)input.Length);
955 remote_client.SendAlertMessage("Terrain file written, starting download...");
956 Scene.XferManager.AddNewFile("terrain.raw", bdata);
957 // Tell client about it
958 m_log.Warn("[CLIENT]: Sending Terrain to " + remote_client.Name);
959 remote_client.SendInitiateDownload("terrain.raw", clientFileName);
960 }
961 }
962  
963 private void HandleRegionInfoRequest(IClientAPI remote_client)
964 {
965 RegionInfoForEstateMenuArgs args = new RegionInfoForEstateMenuArgs();
966 args.billableFactor = Scene.RegionInfo.EstateSettings.BillableFactor;
967 args.estateID = Scene.RegionInfo.EstateSettings.EstateID;
968 args.maxAgents = (byte)Scene.RegionInfo.RegionSettings.AgentLimit;
969 args.objectBonusFactor = (float)Scene.RegionInfo.RegionSettings.ObjectBonus;
970 args.parentEstateID = Scene.RegionInfo.EstateSettings.ParentEstateID;
971 args.pricePerMeter = Scene.RegionInfo.EstateSettings.PricePerMeter;
972 args.redirectGridX = Scene.RegionInfo.EstateSettings.RedirectGridX;
973 args.redirectGridY = Scene.RegionInfo.EstateSettings.RedirectGridY;
974 args.regionFlags = GetRegionFlags();
975 args.simAccess = Scene.RegionInfo.AccessLevel;
976 args.sunHour = (float)Scene.RegionInfo.RegionSettings.SunPosition;
977 args.terrainLowerLimit = (float)Scene.RegionInfo.RegionSettings.TerrainLowerLimit;
978 args.terrainRaiseLimit = (float)Scene.RegionInfo.RegionSettings.TerrainRaiseLimit;
979 args.useEstateSun = Scene.RegionInfo.RegionSettings.UseEstateSun;
980 args.waterHeight = (float)Scene.RegionInfo.RegionSettings.WaterHeight;
981 args.simName = Scene.RegionInfo.RegionName;
982 args.regionType = Scene.RegionInfo.RegionType;
983  
984 remote_client.SendRegionInfoToEstateMenu(args);
985 }
986  
987 private void HandleEstateCovenantRequest(IClientAPI remote_client)
988 {
989 remote_client.SendEstateCovenantInformation(Scene.RegionInfo.RegionSettings.Covenant);
990 }
991  
992 private void HandleLandStatRequest(int parcelID, uint reportType, uint requestFlags, string filter, IClientAPI remoteClient)
993 {
994 if (!Scene.Permissions.CanIssueEstateCommand(remoteClient.AgentId, false))
995 return;
996  
997 Dictionary<uint, float> sceneData = null;
998  
999 if (reportType == 1)
1000 {
1001 sceneData = Scene.PhysicsScene.GetTopColliders();
1002 }
1003 else if (reportType == 0)
1004 {
1005 IScriptModule scriptModule = Scene.RequestModuleInterface<IScriptModule>();
1006  
1007 if (scriptModule != null)
1008 sceneData = scriptModule.GetObjectScriptsExecutionTimes();
1009 }
1010  
1011 List<LandStatReportItem> SceneReport = new List<LandStatReportItem>();
1012 if (sceneData != null)
1013 {
1014 var sortedSceneData
1015 = sceneData.Select(
1016 item => new { Measurement = item.Value, Part = Scene.GetSceneObjectPart(item.Key) });
1017  
1018 sortedSceneData.OrderBy(item => item.Measurement);
1019  
1020 int items = 0;
1021  
1022 foreach (var entry in sortedSceneData)
1023 {
1024 // The object may have been deleted since we received the data.
1025 if (entry.Part == null)
1026 continue;
1027  
1028 // Don't show scripts that haven't executed or where execution time is below one microsecond in
1029 // order to produce a more readable report.
1030 if (entry.Measurement < 0.001)
1031 continue;
1032  
1033 items++;
1034 SceneObjectGroup so = entry.Part.ParentGroup;
1035  
1036 LandStatReportItem lsri = new LandStatReportItem();
1037 lsri.LocationX = so.AbsolutePosition.X;
1038 lsri.LocationY = so.AbsolutePosition.Y;
1039 lsri.LocationZ = so.AbsolutePosition.Z;
1040 lsri.Score = entry.Measurement;
1041 lsri.TaskID = so.UUID;
1042 lsri.TaskLocalID = so.LocalId;
1043 lsri.TaskName = entry.Part.Name;
1044 lsri.OwnerName = UserManager.GetUserName(so.OwnerID);
1045  
1046 if (filter.Length != 0)
1047 {
1048 if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter)))
1049 {
1050 }
1051 else
1052 {
1053 continue;
1054 }
1055 }
1056  
1057 SceneReport.Add(lsri);
1058  
1059 if (items >= 100)
1060 break;
1061 }
1062 }
1063  
1064 remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray());
1065 }
1066  
1067 #endregion
1068  
1069 #region Outgoing Packets
1070  
1071 public void sendRegionInfoPacketToAll()
1072 {
1073 Scene.ForEachRootClient(delegate(IClientAPI client)
1074 {
1075 HandleRegionInfoRequest(client);
1076 });
1077 }
1078  
1079 public void sendRegionHandshake(IClientAPI remoteClient)
1080 {
1081 RegionHandshakeArgs args = new RegionHandshakeArgs();
1082  
1083 args.isEstateManager = Scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(remoteClient.AgentId);
1084 if (Scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero && Scene.RegionInfo.EstateSettings.EstateOwner == remoteClient.AgentId)
1085 args.isEstateManager = true;
1086  
1087 args.billableFactor = Scene.RegionInfo.EstateSettings.BillableFactor;
1088 args.terrainStartHeight0 = (float)Scene.RegionInfo.RegionSettings.Elevation1SW;
1089 args.terrainHeightRange0 = (float)Scene.RegionInfo.RegionSettings.Elevation2SW;
1090 args.terrainStartHeight1 = (float)Scene.RegionInfo.RegionSettings.Elevation1NW;
1091 args.terrainHeightRange1 = (float)Scene.RegionInfo.RegionSettings.Elevation2NW;
1092 args.terrainStartHeight2 = (float)Scene.RegionInfo.RegionSettings.Elevation1SE;
1093 args.terrainHeightRange2 = (float)Scene.RegionInfo.RegionSettings.Elevation2SE;
1094 args.terrainStartHeight3 = (float)Scene.RegionInfo.RegionSettings.Elevation1NE;
1095 args.terrainHeightRange3 = (float)Scene.RegionInfo.RegionSettings.Elevation2NE;
1096 args.simAccess = Scene.RegionInfo.AccessLevel;
1097 args.waterHeight = (float)Scene.RegionInfo.RegionSettings.WaterHeight;
1098 args.regionFlags = GetRegionFlags();
1099 args.regionName = Scene.RegionInfo.RegionName;
1100 args.SimOwner = Scene.RegionInfo.EstateSettings.EstateOwner;
1101  
1102 args.terrainBase0 = UUID.Zero;
1103 args.terrainBase1 = UUID.Zero;
1104 args.terrainBase2 = UUID.Zero;
1105 args.terrainBase3 = UUID.Zero;
1106 args.terrainDetail0 = Scene.RegionInfo.RegionSettings.TerrainTexture1;
1107 args.terrainDetail1 = Scene.RegionInfo.RegionSettings.TerrainTexture2;
1108 args.terrainDetail2 = Scene.RegionInfo.RegionSettings.TerrainTexture3;
1109 args.terrainDetail3 = Scene.RegionInfo.RegionSettings.TerrainTexture4;
1110  
1111 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 1 {0} for region {1}", args.terrainDetail0, Scene.RegionInfo.RegionName);
1112 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 2 {0} for region {1}", args.terrainDetail1, Scene.RegionInfo.RegionName);
1113 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 3 {0} for region {1}", args.terrainDetail2, Scene.RegionInfo.RegionName);
1114 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 4 {0} for region {1}", args.terrainDetail3, Scene.RegionInfo.RegionName);
1115  
1116 remoteClient.SendRegionHandshake(Scene.RegionInfo,args);
1117 }
1118  
1119 public void sendRegionHandshakeToAll()
1120 {
1121 Scene.ForEachClient(sendRegionHandshake);
1122 }
1123  
1124 public void handleEstateChangeInfo(IClientAPI remoteClient, UUID invoice, UUID senderID, UInt32 parms1, UInt32 parms2)
1125 {
1126 if (parms2 == 0)
1127 {
1128 Scene.RegionInfo.EstateSettings.UseGlobalTime = true;
1129 Scene.RegionInfo.EstateSettings.SunPosition = 0.0;
1130 }
1131 else
1132 {
1133 Scene.RegionInfo.EstateSettings.UseGlobalTime = false;
1134 Scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0;
1135 // Warning: FixedSun should be set to True, otherwise this sun position won't be used.
1136 }
1137  
1138 if ((parms1 & 0x00000010) != 0)
1139 Scene.RegionInfo.EstateSettings.FixedSun = true;
1140 else
1141 Scene.RegionInfo.EstateSettings.FixedSun = false;
1142  
1143 if ((parms1 & 0x00008000) != 0)
1144 Scene.RegionInfo.EstateSettings.PublicAccess = true;
1145 else
1146 Scene.RegionInfo.EstateSettings.PublicAccess = false;
1147  
1148 if ((parms1 & 0x10000000) != 0)
1149 Scene.RegionInfo.EstateSettings.AllowVoice = true;
1150 else
1151 Scene.RegionInfo.EstateSettings.AllowVoice = false;
1152  
1153 if ((parms1 & 0x00100000) != 0)
1154 Scene.RegionInfo.EstateSettings.AllowDirectTeleport = true;
1155 else
1156 Scene.RegionInfo.EstateSettings.AllowDirectTeleport = false;
1157  
1158 if ((parms1 & 0x00800000) != 0)
1159 Scene.RegionInfo.EstateSettings.DenyAnonymous = true;
1160 else
1161 Scene.RegionInfo.EstateSettings.DenyAnonymous = false;
1162  
1163 if ((parms1 & 0x01000000) != 0)
1164 Scene.RegionInfo.EstateSettings.DenyIdentified = true;
1165 else
1166 Scene.RegionInfo.EstateSettings.DenyIdentified = false;
1167  
1168 if ((parms1 & 0x02000000) != 0)
1169 Scene.RegionInfo.EstateSettings.DenyTransacted = true;
1170 else
1171 Scene.RegionInfo.EstateSettings.DenyTransacted = false;
1172  
1173 if ((parms1 & 0x40000000) != 0)
1174 Scene.RegionInfo.EstateSettings.DenyMinors = true;
1175 else
1176 Scene.RegionInfo.EstateSettings.DenyMinors = false;
1177  
1178 Scene.RegionInfo.EstateSettings.Save();
1179 TriggerEstateInfoChange();
1180  
1181 Scene.TriggerEstateSunUpdate();
1182  
1183 sendDetailedEstateData(remoteClient, invoice);
1184 }
1185  
1186 #endregion
1187  
1188 #region Other Functions
1189  
1190 public void changeWaterHeight(float height)
1191 {
1192 setRegionTerrainSettings(height,
1193 (float)Scene.RegionInfo.RegionSettings.TerrainRaiseLimit,
1194 (float)Scene.RegionInfo.RegionSettings.TerrainLowerLimit,
1195 Scene.RegionInfo.RegionSettings.UseEstateSun,
1196 Scene.RegionInfo.RegionSettings.FixedSun,
1197 (float)Scene.RegionInfo.RegionSettings.SunPosition,
1198 Scene.RegionInfo.EstateSettings.UseGlobalTime,
1199 Scene.RegionInfo.EstateSettings.FixedSun,
1200 (float)Scene.RegionInfo.EstateSettings.SunPosition);
1201  
1202 sendRegionInfoPacketToAll();
1203 }
1204  
1205 #endregion
1206  
1207 private void EventManager_OnNewClient(IClientAPI client)
1208 {
1209 client.OnDetailedEstateDataRequest += clientSendDetailedEstateData;
1210 client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler;
1211 // client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture;
1212 client.OnSetEstateTerrainDetailTexture += setEstateTerrainBaseTexture;
1213 client.OnSetEstateTerrainTextureHeights += setEstateTerrainTextureHeights;
1214 client.OnCommitEstateTerrainTextureRequest += handleCommitEstateTerrainTextureRequest;
1215 client.OnSetRegionTerrainSettings += setRegionTerrainSettings;
1216 client.OnEstateRestartSimRequest += handleEstateRestartSimRequest;
1217 client.OnEstateChangeCovenantRequest += handleChangeEstateCovenantRequest;
1218 client.OnEstateChangeInfo += handleEstateChangeInfo;
1219 client.OnEstateManageTelehub += HandleOnEstateManageTelehub;
1220 client.OnUpdateEstateAccessDeltaRequest += handleEstateAccessDeltaRequest;
1221 client.OnSimulatorBlueBoxMessageRequest += SendSimulatorBlueBoxMessage;
1222 client.OnEstateBlueBoxMessageRequest += SendEstateBlueBoxMessage;
1223 client.OnEstateDebugRegionRequest += handleEstateDebugRegionRequest;
1224 client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest;
1225 client.OnEstateTeleportAllUsersHomeRequest += handleEstateTeleportAllUsersHomeRequest;
1226 client.OnRequestTerrain += handleTerrainRequest;
1227 client.OnUploadTerrain += handleUploadTerrain;
1228  
1229 client.OnRegionInfoRequest += HandleRegionInfoRequest;
1230 client.OnEstateCovenantRequest += HandleEstateCovenantRequest;
1231 client.OnLandStatRequest += HandleLandStatRequest;
1232 sendRegionHandshake(client);
1233 }
1234  
1235 public uint GetRegionFlags()
1236 {
1237 RegionFlags flags = RegionFlags.None;
1238  
1239 // Fully implemented
1240 //
1241 if (Scene.RegionInfo.RegionSettings.AllowDamage)
1242 flags |= RegionFlags.AllowDamage;
1243 if (Scene.RegionInfo.RegionSettings.BlockTerraform)
1244 flags |= RegionFlags.BlockTerraform;
1245 if (!Scene.RegionInfo.RegionSettings.AllowLandResell)
1246 flags |= RegionFlags.BlockLandResell;
1247 if (Scene.RegionInfo.RegionSettings.DisableCollisions)
1248 flags |= RegionFlags.SkipCollisions;
1249 if (Scene.RegionInfo.RegionSettings.DisableScripts)
1250 flags |= RegionFlags.SkipScripts;
1251 if (Scene.RegionInfo.RegionSettings.DisablePhysics)
1252 flags |= RegionFlags.SkipPhysics;
1253 if (Scene.RegionInfo.RegionSettings.BlockFly)
1254 flags |= RegionFlags.NoFly;
1255 if (Scene.RegionInfo.RegionSettings.RestrictPushing)
1256 flags |= RegionFlags.RestrictPushObject;
1257 if (Scene.RegionInfo.RegionSettings.AllowLandJoinDivide)
1258 flags |= RegionFlags.AllowParcelChanges;
1259 if (Scene.RegionInfo.RegionSettings.BlockShowInSearch)
1260 flags |= RegionFlags.BlockParcelSearch;
1261  
1262 if (Scene.RegionInfo.RegionSettings.FixedSun)
1263 flags |= RegionFlags.SunFixed;
1264 if (Scene.RegionInfo.RegionSettings.Sandbox)
1265 flags |= RegionFlags.Sandbox;
1266 if (Scene.RegionInfo.EstateSettings.AllowVoice)
1267 flags |= RegionFlags.AllowVoice;
1268 if (Scene.RegionInfo.EstateSettings.AllowLandmark)
1269 flags |= RegionFlags.AllowLandmark;
1270 if (Scene.RegionInfo.EstateSettings.AllowSetHome)
1271 flags |= RegionFlags.AllowSetHome;
1272 if (Scene.RegionInfo.EstateSettings.BlockDwell)
1273 flags |= RegionFlags.BlockDwell;
1274 if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
1275 flags |= RegionFlags.ResetHomeOnTeleport;
1276  
1277  
1278 // TODO: SkipUpdateInterestList
1279  
1280 // Omitted
1281 //
1282 // Omitted: NullLayer (what is that?)
1283 // Omitted: SkipAgentAction (what does it do?)
1284  
1285 return (uint)flags;
1286 }
1287  
1288 public uint GetEstateFlags()
1289 {
1290 RegionFlags flags = RegionFlags.None;
1291  
1292 if (Scene.RegionInfo.EstateSettings.FixedSun)
1293 flags |= RegionFlags.SunFixed;
1294 if (Scene.RegionInfo.EstateSettings.PublicAccess)
1295 flags |= (RegionFlags.PublicAllowed |
1296 RegionFlags.ExternallyVisible);
1297 if (Scene.RegionInfo.EstateSettings.AllowVoice)
1298 flags |= RegionFlags.AllowVoice;
1299 if (Scene.RegionInfo.EstateSettings.AllowDirectTeleport)
1300 flags |= RegionFlags.AllowDirectTeleport;
1301 if (Scene.RegionInfo.EstateSettings.DenyAnonymous)
1302 flags |= RegionFlags.DenyAnonymous;
1303 if (Scene.RegionInfo.EstateSettings.DenyIdentified)
1304 flags |= RegionFlags.DenyIdentified;
1305 if (Scene.RegionInfo.EstateSettings.DenyTransacted)
1306 flags |= RegionFlags.DenyTransacted;
1307 if (Scene.RegionInfo.EstateSettings.AbuseEmailToEstateOwner)
1308 flags |= RegionFlags.AbuseEmailToEstateOwner;
1309 if (Scene.RegionInfo.EstateSettings.BlockDwell)
1310 flags |= RegionFlags.BlockDwell;
1311 if (Scene.RegionInfo.EstateSettings.EstateSkipScripts)
1312 flags |= RegionFlags.EstateSkipScripts;
1313 if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
1314 flags |= RegionFlags.ResetHomeOnTeleport;
1315 if (Scene.RegionInfo.EstateSettings.TaxFree)
1316 flags |= RegionFlags.TaxFree;
1317 if (Scene.RegionInfo.EstateSettings.AllowLandmark)
1318 flags |= RegionFlags.AllowLandmark;
1319 if (Scene.RegionInfo.EstateSettings.AllowParcelChanges)
1320 flags |= RegionFlags.AllowParcelChanges;
1321 if (Scene.RegionInfo.EstateSettings.AllowSetHome)
1322 flags |= RegionFlags.AllowSetHome;
1323 if (Scene.RegionInfo.EstateSettings.DenyMinors)
1324 flags |= (RegionFlags)(1 << 30);
1325  
1326 return (uint)flags;
1327 }
1328  
1329 public bool IsManager(UUID avatarID)
1330 {
1331 if (avatarID == Scene.RegionInfo.EstateSettings.EstateOwner)
1332 return true;
1333  
1334 List<UUID> ems = new List<UUID>(Scene.RegionInfo.EstateSettings.EstateManagers);
1335 if (ems.Contains(avatarID))
1336 return true;
1337  
1338 return false;
1339 }
1340  
1341 public void TriggerRegionInfoChange()
1342 {
1343 m_regionChangeTimer.Stop();
1344 m_regionChangeTimer.Start();
1345 }
1346  
1347 protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e)
1348 {
1349 ChangeDelegate change = OnRegionInfoChange;
1350  
1351 if (change != null)
1352 change(Scene.RegionInfo.RegionID);
1353 }
1354  
1355 public void TriggerEstateInfoChange()
1356 {
1357 ChangeDelegate change = OnEstateInfoChange;
1358  
1359 if (change != null)
1360 change(Scene.RegionInfo.RegionID);
1361 }
1362  
1363 public void TriggerEstateMessage(UUID fromID, string fromName, string message)
1364 {
1365 MessageDelegate onmessage = OnEstateMessage;
1366  
1367 if (onmessage != null)
1368 onmessage(Scene.RegionInfo.RegionID, fromID, fromName, message);
1369 }
1370  
1371  
1372 private void SendTelehubInfo(IClientAPI client)
1373 {
1374 RegionSettings settings =
1375 this.Scene.RegionInfo.RegionSettings;
1376  
1377 SceneObjectGroup telehub = null;
1378 if (settings.TelehubObject != UUID.Zero &&
1379 (telehub = Scene.GetSceneObjectGroup(settings.TelehubObject)) != null)
1380 {
1381 List<Vector3> spawnPoints = new List<Vector3>();
1382  
1383 foreach (SpawnPoint sp in settings.SpawnPoints())
1384 {
1385 spawnPoints.Add(sp.GetLocation(Vector3.Zero, Quaternion.Identity));
1386 }
1387  
1388 client.SendTelehubInfo(settings.TelehubObject,
1389 telehub.Name,
1390 telehub.AbsolutePosition,
1391 telehub.GroupRotation,
1392 spawnPoints);
1393 }
1394 else
1395 {
1396 client.SendTelehubInfo(UUID.Zero,
1397 String.Empty,
1398 Vector3.Zero,
1399 Quaternion.Identity,
1400 new List<Vector3>());
1401 }
1402 }
1403 }
1404 }
1405