EstateManagementModule.cs 72 KB

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