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