clockwerk-opensim-stable – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 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 if (TerrainUploader != null)
835 {
836 lock (TerrainUploader)
837 {
838 if (XferID == TerrainUploader.XferID)
839 {
840 remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
841 remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
842 TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
843  
844 TerrainUploader = null;
845 remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
846 }
847 }
848 }
849  
850 }
851 private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient)
852 {
853 lock (TerrainUploader)
854 {
855 remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
856 remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
857 TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
858  
859 TerrainUploader = null;
860 }
861 remoteClient.SendAlertMessage("Terrain Upload Complete. Loading....");
862 ITerrainModule terr = Scene.RequestModuleInterface<ITerrainModule>();
863  
864 if (terr != null)
865 {
866 m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName);
867  
868 try
869 {
870 MemoryStream terrainStream = new MemoryStream(terrainData);
871 terr.LoadFromStream(filename, terrainStream);
872 terrainStream.Close();
873  
874 FileInfo x = new FileInfo(filename);
875 remoteClient.SendAlertMessage("Your terrain was loaded as a " + x.Extension + " file. It may take a few moments to appear.");
876 }
877 catch (IOException e)
878 {
879 m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
880 remoteClient.SendAlertMessage("There was an IO Exception loading your terrain. Please check free space.");
881  
882 return;
883 }
884 catch (SecurityException e)
885 {
886 m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
887 remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive");
888  
889 return;
890 }
891 catch (UnauthorizedAccessException e)
892 {
893 m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
894 remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive");
895  
896 return;
897 }
898 catch (Exception e)
899 {
900 m_log.ErrorFormat("[TERRAIN]: Error loading a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
901 remoteClient.SendAlertMessage("There was a general error loading your terrain. Please fix the terrain file and try again");
902 }
903 }
904 else
905 {
906 remoteClient.SendAlertMessage("Unable to apply terrain. Cannot get an instance of the terrain module");
907 }
908 }
909  
910 private void handleUploadTerrain(IClientAPI remote_client, string clientFileName)
911 {
912 if (TerrainUploader == null)
913 {
914  
915 TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
916 lock (TerrainUploader)
917 {
918 remote_client.OnXferReceive += TerrainUploader.XferReceive;
919 remote_client.OnAbortXfer += AbortTerrainXferHandler;
920 TerrainUploader.TerrainUploadDone += HandleTerrainApplication;
921 }
922 TerrainUploader.RequestStartXfer(remote_client);
923  
924 }
925 else
926 {
927 remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
928 }
929 }
930  
931 private void handleTerrainRequest(IClientAPI remote_client, string clientFileName)
932 {
933 // Save terrain here
934 ITerrainModule terr = Scene.RequestModuleInterface<ITerrainModule>();
935  
936 if (terr != null)
937 {
938 m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName);
939 if (File.Exists(Util.dataDir() + "/terrain.raw"))
940 {
941 File.Delete(Util.dataDir() + "/terrain.raw");
942 }
943 terr.SaveToFile(Util.dataDir() + "/terrain.raw");
944  
945 FileStream input = new FileStream(Util.dataDir() + "/terrain.raw", FileMode.Open);
946 byte[] bdata = new byte[input.Length];
947 input.Read(bdata, 0, (int)input.Length);
948 remote_client.SendAlertMessage("Terrain file written, starting download...");
949 Scene.XferManager.AddNewFile("terrain.raw", bdata);
950 // Tell client about it
951 m_log.Warn("[CLIENT]: Sending Terrain to " + remote_client.Name);
952 remote_client.SendInitiateDownload("terrain.raw", clientFileName);
953 }
954 }
955  
956 private void HandleRegionInfoRequest(IClientAPI remote_client)
957 {
958 RegionInfoForEstateMenuArgs args = new RegionInfoForEstateMenuArgs();
959 args.billableFactor = Scene.RegionInfo.EstateSettings.BillableFactor;
960 args.estateID = Scene.RegionInfo.EstateSettings.EstateID;
961 args.maxAgents = (byte)Scene.RegionInfo.RegionSettings.AgentLimit;
962 args.objectBonusFactor = (float)Scene.RegionInfo.RegionSettings.ObjectBonus;
963 args.parentEstateID = Scene.RegionInfo.EstateSettings.ParentEstateID;
964 args.pricePerMeter = Scene.RegionInfo.EstateSettings.PricePerMeter;
965 args.redirectGridX = Scene.RegionInfo.EstateSettings.RedirectGridX;
966 args.redirectGridY = Scene.RegionInfo.EstateSettings.RedirectGridY;
967 args.regionFlags = GetRegionFlags();
968 args.simAccess = Scene.RegionInfo.AccessLevel;
969 args.sunHour = (float)Scene.RegionInfo.RegionSettings.SunPosition;
970 args.terrainLowerLimit = (float)Scene.RegionInfo.RegionSettings.TerrainLowerLimit;
971 args.terrainRaiseLimit = (float)Scene.RegionInfo.RegionSettings.TerrainRaiseLimit;
972 args.useEstateSun = Scene.RegionInfo.RegionSettings.UseEstateSun;
973 args.waterHeight = (float)Scene.RegionInfo.RegionSettings.WaterHeight;
974 args.simName = Scene.RegionInfo.RegionName;
975 args.regionType = Scene.RegionInfo.RegionType;
976  
977 remote_client.SendRegionInfoToEstateMenu(args);
978 }
979  
980 private void HandleEstateCovenantRequest(IClientAPI remote_client)
981 {
982 remote_client.SendEstateCovenantInformation(Scene.RegionInfo.RegionSettings.Covenant);
983 }
984  
985 private void HandleLandStatRequest(int parcelID, uint reportType, uint requestFlags, string filter, IClientAPI remoteClient)
986 {
987 if (!Scene.Permissions.CanIssueEstateCommand(remoteClient.AgentId, false))
988 return;
989  
990 Dictionary<uint, float> sceneData = null;
991  
992 if (reportType == 1)
993 {
994 sceneData = Scene.PhysicsScene.GetTopColliders();
995 }
996 else if (reportType == 0)
997 {
998 IScriptModule scriptModule = Scene.RequestModuleInterface<IScriptModule>();
999  
1000 if (scriptModule != null)
1001 sceneData = scriptModule.GetObjectScriptsExecutionTimes();
1002 }
1003  
1004 List<LandStatReportItem> SceneReport = new List<LandStatReportItem>();
1005 if (sceneData != null)
1006 {
1007 var sortedSceneData
1008 = sceneData.Select(
1009 item => new { Measurement = item.Value, Part = Scene.GetSceneObjectPart(item.Key) });
1010  
1011 sortedSceneData.OrderBy(item => item.Measurement);
1012  
1013 int items = 0;
1014  
1015 foreach (var entry in sortedSceneData)
1016 {
1017 // The object may have been deleted since we received the data.
1018 if (entry.Part == null)
1019 continue;
1020  
1021 // Don't show scripts that haven't executed or where execution time is below one microsecond in
1022 // order to produce a more readable report.
1023 if (entry.Measurement < 0.001)
1024 continue;
1025  
1026 items++;
1027 SceneObjectGroup so = entry.Part.ParentGroup;
1028  
1029 LandStatReportItem lsri = new LandStatReportItem();
1030 lsri.LocationX = so.AbsolutePosition.X;
1031 lsri.LocationY = so.AbsolutePosition.Y;
1032 lsri.LocationZ = so.AbsolutePosition.Z;
1033 lsri.Score = entry.Measurement;
1034 lsri.TaskID = so.UUID;
1035 lsri.TaskLocalID = so.LocalId;
1036 lsri.TaskName = entry.Part.Name;
1037 lsri.OwnerName = UserManager.GetUserName(so.OwnerID);
1038  
1039 if (filter.Length != 0)
1040 {
1041 if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter)))
1042 {
1043 }
1044 else
1045 {
1046 continue;
1047 }
1048 }
1049  
1050 SceneReport.Add(lsri);
1051  
1052 if (items >= 100)
1053 break;
1054 }
1055 }
1056  
1057 remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray());
1058 }
1059  
1060 #endregion
1061  
1062 #region Outgoing Packets
1063  
1064 public void sendRegionInfoPacketToAll()
1065 {
1066 Scene.ForEachRootClient(delegate(IClientAPI client)
1067 {
1068 HandleRegionInfoRequest(client);
1069 });
1070 }
1071  
1072 public void sendRegionHandshake(IClientAPI remoteClient)
1073 {
1074 RegionHandshakeArgs args = new RegionHandshakeArgs();
1075  
1076 args.isEstateManager = Scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(remoteClient.AgentId);
1077 if (Scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero && Scene.RegionInfo.EstateSettings.EstateOwner == remoteClient.AgentId)
1078 args.isEstateManager = true;
1079  
1080 args.billableFactor = Scene.RegionInfo.EstateSettings.BillableFactor;
1081 args.terrainStartHeight0 = (float)Scene.RegionInfo.RegionSettings.Elevation1SW;
1082 args.terrainHeightRange0 = (float)Scene.RegionInfo.RegionSettings.Elevation2SW;
1083 args.terrainStartHeight1 = (float)Scene.RegionInfo.RegionSettings.Elevation1NW;
1084 args.terrainHeightRange1 = (float)Scene.RegionInfo.RegionSettings.Elevation2NW;
1085 args.terrainStartHeight2 = (float)Scene.RegionInfo.RegionSettings.Elevation1SE;
1086 args.terrainHeightRange2 = (float)Scene.RegionInfo.RegionSettings.Elevation2SE;
1087 args.terrainStartHeight3 = (float)Scene.RegionInfo.RegionSettings.Elevation1NE;
1088 args.terrainHeightRange3 = (float)Scene.RegionInfo.RegionSettings.Elevation2NE;
1089 args.simAccess = Scene.RegionInfo.AccessLevel;
1090 args.waterHeight = (float)Scene.RegionInfo.RegionSettings.WaterHeight;
1091 args.regionFlags = GetRegionFlags();
1092 args.regionName = Scene.RegionInfo.RegionName;
1093 args.SimOwner = Scene.RegionInfo.EstateSettings.EstateOwner;
1094  
1095 args.terrainBase0 = UUID.Zero;
1096 args.terrainBase1 = UUID.Zero;
1097 args.terrainBase2 = UUID.Zero;
1098 args.terrainBase3 = UUID.Zero;
1099 args.terrainDetail0 = Scene.RegionInfo.RegionSettings.TerrainTexture1;
1100 args.terrainDetail1 = Scene.RegionInfo.RegionSettings.TerrainTexture2;
1101 args.terrainDetail2 = Scene.RegionInfo.RegionSettings.TerrainTexture3;
1102 args.terrainDetail3 = Scene.RegionInfo.RegionSettings.TerrainTexture4;
1103  
1104 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 1 {0} for region {1}", args.terrainDetail0, Scene.RegionInfo.RegionName);
1105 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 2 {0} for region {1}", args.terrainDetail1, Scene.RegionInfo.RegionName);
1106 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 3 {0} for region {1}", args.terrainDetail2, Scene.RegionInfo.RegionName);
1107 // m_log.DebugFormat("[ESTATE MANAGEMENT MODULE]: Sending terrain texture 4 {0} for region {1}", args.terrainDetail3, Scene.RegionInfo.RegionName);
1108  
1109 remoteClient.SendRegionHandshake(Scene.RegionInfo,args);
1110 }
1111  
1112 public void sendRegionHandshakeToAll()
1113 {
1114 Scene.ForEachClient(sendRegionHandshake);
1115 }
1116  
1117 public void handleEstateChangeInfo(IClientAPI remoteClient, UUID invoice, UUID senderID, UInt32 parms1, UInt32 parms2)
1118 {
1119 if (parms2 == 0)
1120 {
1121 Scene.RegionInfo.EstateSettings.UseGlobalTime = true;
1122 Scene.RegionInfo.EstateSettings.SunPosition = 0.0;
1123 }
1124 else
1125 {
1126 Scene.RegionInfo.EstateSettings.UseGlobalTime = false;
1127 Scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0;
1128 // Warning: FixedSun should be set to True, otherwise this sun position won't be used.
1129 }
1130  
1131 if ((parms1 & 0x00000010) != 0)
1132 Scene.RegionInfo.EstateSettings.FixedSun = true;
1133 else
1134 Scene.RegionInfo.EstateSettings.FixedSun = false;
1135  
1136 if ((parms1 & 0x00008000) != 0)
1137 Scene.RegionInfo.EstateSettings.PublicAccess = true;
1138 else
1139 Scene.RegionInfo.EstateSettings.PublicAccess = false;
1140  
1141 if ((parms1 & 0x10000000) != 0)
1142 Scene.RegionInfo.EstateSettings.AllowVoice = true;
1143 else
1144 Scene.RegionInfo.EstateSettings.AllowVoice = false;
1145  
1146 if ((parms1 & 0x00100000) != 0)
1147 Scene.RegionInfo.EstateSettings.AllowDirectTeleport = true;
1148 else
1149 Scene.RegionInfo.EstateSettings.AllowDirectTeleport = false;
1150  
1151 if ((parms1 & 0x00800000) != 0)
1152 Scene.RegionInfo.EstateSettings.DenyAnonymous = true;
1153 else
1154 Scene.RegionInfo.EstateSettings.DenyAnonymous = false;
1155  
1156 if ((parms1 & 0x01000000) != 0)
1157 Scene.RegionInfo.EstateSettings.DenyIdentified = true;
1158 else
1159 Scene.RegionInfo.EstateSettings.DenyIdentified = false;
1160  
1161 if ((parms1 & 0x02000000) != 0)
1162 Scene.RegionInfo.EstateSettings.DenyTransacted = true;
1163 else
1164 Scene.RegionInfo.EstateSettings.DenyTransacted = false;
1165  
1166 if ((parms1 & 0x40000000) != 0)
1167 Scene.RegionInfo.EstateSettings.DenyMinors = true;
1168 else
1169 Scene.RegionInfo.EstateSettings.DenyMinors = false;
1170  
1171 Scene.RegionInfo.EstateSettings.Save();
1172 TriggerEstateInfoChange();
1173  
1174 Scene.TriggerEstateSunUpdate();
1175  
1176 sendDetailedEstateData(remoteClient, invoice);
1177 }
1178  
1179 #endregion
1180  
1181 #region Other Functions
1182  
1183 public void changeWaterHeight(float height)
1184 {
1185 setRegionTerrainSettings(height,
1186 (float)Scene.RegionInfo.RegionSettings.TerrainRaiseLimit,
1187 (float)Scene.RegionInfo.RegionSettings.TerrainLowerLimit,
1188 Scene.RegionInfo.RegionSettings.UseEstateSun,
1189 Scene.RegionInfo.RegionSettings.FixedSun,
1190 (float)Scene.RegionInfo.RegionSettings.SunPosition,
1191 Scene.RegionInfo.EstateSettings.UseGlobalTime,
1192 Scene.RegionInfo.EstateSettings.FixedSun,
1193 (float)Scene.RegionInfo.EstateSettings.SunPosition);
1194  
1195 sendRegionInfoPacketToAll();
1196 }
1197  
1198 #endregion
1199  
1200 private void EventManager_OnNewClient(IClientAPI client)
1201 {
1202 client.OnDetailedEstateDataRequest += clientSendDetailedEstateData;
1203 client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler;
1204 // client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture;
1205 client.OnSetEstateTerrainDetailTexture += setEstateTerrainBaseTexture;
1206 client.OnSetEstateTerrainTextureHeights += setEstateTerrainTextureHeights;
1207 client.OnCommitEstateTerrainTextureRequest += handleCommitEstateTerrainTextureRequest;
1208 client.OnSetRegionTerrainSettings += setRegionTerrainSettings;
1209 client.OnEstateRestartSimRequest += handleEstateRestartSimRequest;
1210 client.OnEstateChangeCovenantRequest += handleChangeEstateCovenantRequest;
1211 client.OnEstateChangeInfo += handleEstateChangeInfo;
1212 client.OnEstateManageTelehub += HandleOnEstateManageTelehub;
1213 client.OnUpdateEstateAccessDeltaRequest += handleEstateAccessDeltaRequest;
1214 client.OnSimulatorBlueBoxMessageRequest += SendSimulatorBlueBoxMessage;
1215 client.OnEstateBlueBoxMessageRequest += SendEstateBlueBoxMessage;
1216 client.OnEstateDebugRegionRequest += handleEstateDebugRegionRequest;
1217 client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest;
1218 client.OnEstateTeleportAllUsersHomeRequest += handleEstateTeleportAllUsersHomeRequest;
1219 client.OnRequestTerrain += handleTerrainRequest;
1220 client.OnUploadTerrain += handleUploadTerrain;
1221  
1222 client.OnRegionInfoRequest += HandleRegionInfoRequest;
1223 client.OnEstateCovenantRequest += HandleEstateCovenantRequest;
1224 client.OnLandStatRequest += HandleLandStatRequest;
1225 sendRegionHandshake(client);
1226 }
1227  
1228 public uint GetRegionFlags()
1229 {
1230 RegionFlags flags = RegionFlags.None;
1231  
1232 // Fully implemented
1233 //
1234 if (Scene.RegionInfo.RegionSettings.AllowDamage)
1235 flags |= RegionFlags.AllowDamage;
1236 if (Scene.RegionInfo.RegionSettings.BlockTerraform)
1237 flags |= RegionFlags.BlockTerraform;
1238 if (!Scene.RegionInfo.RegionSettings.AllowLandResell)
1239 flags |= RegionFlags.BlockLandResell;
1240 if (Scene.RegionInfo.RegionSettings.DisableCollisions)
1241 flags |= RegionFlags.SkipCollisions;
1242 if (Scene.RegionInfo.RegionSettings.DisableScripts)
1243 flags |= RegionFlags.SkipScripts;
1244 if (Scene.RegionInfo.RegionSettings.DisablePhysics)
1245 flags |= RegionFlags.SkipPhysics;
1246 if (Scene.RegionInfo.RegionSettings.BlockFly)
1247 flags |= RegionFlags.NoFly;
1248 if (Scene.RegionInfo.RegionSettings.RestrictPushing)
1249 flags |= RegionFlags.RestrictPushObject;
1250 if (Scene.RegionInfo.RegionSettings.AllowLandJoinDivide)
1251 flags |= RegionFlags.AllowParcelChanges;
1252 if (Scene.RegionInfo.RegionSettings.BlockShowInSearch)
1253 flags |= RegionFlags.BlockParcelSearch;
1254  
1255 if (Scene.RegionInfo.RegionSettings.FixedSun)
1256 flags |= RegionFlags.SunFixed;
1257 if (Scene.RegionInfo.RegionSettings.Sandbox)
1258 flags |= RegionFlags.Sandbox;
1259 if (Scene.RegionInfo.EstateSettings.AllowVoice)
1260 flags |= RegionFlags.AllowVoice;
1261 if (Scene.RegionInfo.EstateSettings.AllowLandmark)
1262 flags |= RegionFlags.AllowLandmark;
1263 if (Scene.RegionInfo.EstateSettings.AllowSetHome)
1264 flags |= RegionFlags.AllowSetHome;
1265 if (Scene.RegionInfo.EstateSettings.BlockDwell)
1266 flags |= RegionFlags.BlockDwell;
1267 if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
1268 flags |= RegionFlags.ResetHomeOnTeleport;
1269  
1270  
1271 // TODO: SkipUpdateInterestList
1272  
1273 // Omitted
1274 //
1275 // Omitted: NullLayer (what is that?)
1276 // Omitted: SkipAgentAction (what does it do?)
1277  
1278 return (uint)flags;
1279 }
1280  
1281 public uint GetEstateFlags()
1282 {
1283 RegionFlags flags = RegionFlags.None;
1284  
1285 if (Scene.RegionInfo.EstateSettings.FixedSun)
1286 flags |= RegionFlags.SunFixed;
1287 if (Scene.RegionInfo.EstateSettings.PublicAccess)
1288 flags |= (RegionFlags.PublicAllowed |
1289 RegionFlags.ExternallyVisible);
1290 if (Scene.RegionInfo.EstateSettings.AllowVoice)
1291 flags |= RegionFlags.AllowVoice;
1292 if (Scene.RegionInfo.EstateSettings.AllowDirectTeleport)
1293 flags |= RegionFlags.AllowDirectTeleport;
1294 if (Scene.RegionInfo.EstateSettings.DenyAnonymous)
1295 flags |= RegionFlags.DenyAnonymous;
1296 if (Scene.RegionInfo.EstateSettings.DenyIdentified)
1297 flags |= RegionFlags.DenyIdentified;
1298 if (Scene.RegionInfo.EstateSettings.DenyTransacted)
1299 flags |= RegionFlags.DenyTransacted;
1300 if (Scene.RegionInfo.EstateSettings.AbuseEmailToEstateOwner)
1301 flags |= RegionFlags.AbuseEmailToEstateOwner;
1302 if (Scene.RegionInfo.EstateSettings.BlockDwell)
1303 flags |= RegionFlags.BlockDwell;
1304 if (Scene.RegionInfo.EstateSettings.EstateSkipScripts)
1305 flags |= RegionFlags.EstateSkipScripts;
1306 if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
1307 flags |= RegionFlags.ResetHomeOnTeleport;
1308 if (Scene.RegionInfo.EstateSettings.TaxFree)
1309 flags |= RegionFlags.TaxFree;
1310 if (Scene.RegionInfo.EstateSettings.AllowLandmark)
1311 flags |= RegionFlags.AllowLandmark;
1312 if (Scene.RegionInfo.EstateSettings.AllowParcelChanges)
1313 flags |= RegionFlags.AllowParcelChanges;
1314 if (Scene.RegionInfo.EstateSettings.AllowSetHome)
1315 flags |= RegionFlags.AllowSetHome;
1316 if (Scene.RegionInfo.EstateSettings.DenyMinors)
1317 flags |= (RegionFlags)(1 << 30);
1318  
1319 return (uint)flags;
1320 }
1321  
1322 public bool IsManager(UUID avatarID)
1323 {
1324 if (avatarID == Scene.RegionInfo.EstateSettings.EstateOwner)
1325 return true;
1326  
1327 List<UUID> ems = new List<UUID>(Scene.RegionInfo.EstateSettings.EstateManagers);
1328 if (ems.Contains(avatarID))
1329 return true;
1330  
1331 return false;
1332 }
1333  
1334 public void TriggerRegionInfoChange()
1335 {
1336 m_regionChangeTimer.Stop();
1337 m_regionChangeTimer.Start();
1338 }
1339  
1340 protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e)
1341 {
1342 ChangeDelegate change = OnRegionInfoChange;
1343  
1344 if (change != null)
1345 change(Scene.RegionInfo.RegionID);
1346 }
1347  
1348 public void TriggerEstateInfoChange()
1349 {
1350 ChangeDelegate change = OnEstateInfoChange;
1351  
1352 if (change != null)
1353 change(Scene.RegionInfo.RegionID);
1354 }
1355  
1356 public void TriggerEstateMessage(UUID fromID, string fromName, string message)
1357 {
1358 MessageDelegate onmessage = OnEstateMessage;
1359  
1360 if (onmessage != null)
1361 onmessage(Scene.RegionInfo.RegionID, fromID, fromName, message);
1362 }
1363  
1364  
1365 private void SendTelehubInfo(IClientAPI client)
1366 {
1367 RegionSettings settings =
1368 this.Scene.RegionInfo.RegionSettings;
1369  
1370 SceneObjectGroup telehub = null;
1371 if (settings.TelehubObject != UUID.Zero &&
1372 (telehub = Scene.GetSceneObjectGroup(settings.TelehubObject)) != null)
1373 {
1374 List<Vector3> spawnPoints = new List<Vector3>();
1375  
1376 foreach (SpawnPoint sp in settings.SpawnPoints())
1377 {
1378 spawnPoints.Add(sp.GetLocation(Vector3.Zero, Quaternion.Identity));
1379 }
1380  
1381 client.SendTelehubInfo(settings.TelehubObject,
1382 telehub.Name,
1383 telehub.AbsolutePosition,
1384 telehub.GroupRotation,
1385 spawnPoints);
1386 }
1387 else
1388 {
1389 client.SendTelehubInfo(UUID.Zero,
1390 String.Empty,
1391 Vector3.Zero,
1392 Quaternion.Identity,
1393 new List<Vector3>());
1394 }
1395 }
1396 }
1397 }
1398