EstateManagementModule.cs 73 KB

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