EstateManagementModule.cs 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191
  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.Generic;
  29. using System.IO;
  30. using System.Reflection;
  31. using System.Security;
  32. using log4net;
  33. using Nini.Config;
  34. using OpenMetaverse;
  35. using OpenSim.Framework;
  36. using OpenSim.Region.Framework.Interfaces;
  37. using OpenSim.Region.Framework.Scenes;
  38. namespace OpenSim.Region.CoreModules.World.Estate
  39. {
  40. public class EstateManagementModule : IEstateModule
  41. {
  42. private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  43. private delegate void LookupUUIDS(List<UUID> uuidLst);
  44. private Scene m_scene;
  45. private EstateTerrainXferHandler TerrainUploader;
  46. public event ChangeDelegate OnRegionInfoChange;
  47. public event ChangeDelegate OnEstateInfoChange;
  48. public event MessageDelegate OnEstateMessage;
  49. #region Packet Data Responders
  50. private void sendDetailedEstateData(IClientAPI remote_client, UUID invoice)
  51. {
  52. uint sun = 0;
  53. if (!m_scene.RegionInfo.EstateSettings.UseGlobalTime)
  54. sun=(uint)(m_scene.RegionInfo.EstateSettings.SunPosition*1024.0) + 0x1800;
  55. UUID estateOwner;
  56. estateOwner = m_scene.RegionInfo.EstateSettings.EstateOwner;
  57. if (m_scene.Permissions.IsGod(remote_client.AgentId))
  58. estateOwner = remote_client.AgentId;
  59. remote_client.SendDetailedEstateData(invoice,
  60. m_scene.RegionInfo.EstateSettings.EstateName,
  61. m_scene.RegionInfo.EstateSettings.EstateID,
  62. m_scene.RegionInfo.EstateSettings.ParentEstateID,
  63. GetEstateFlags(),
  64. sun,
  65. m_scene.RegionInfo.RegionSettings.Covenant,
  66. m_scene.RegionInfo.EstateSettings.AbuseEmail,
  67. estateOwner);
  68. remote_client.SendEstateList(invoice,
  69. (int)Constants.EstateAccessCodex.EstateManagers,
  70. m_scene.RegionInfo.EstateSettings.EstateManagers,
  71. m_scene.RegionInfo.EstateSettings.EstateID);
  72. remote_client.SendEstateList(invoice,
  73. (int)Constants.EstateAccessCodex.AccessOptions,
  74. m_scene.RegionInfo.EstateSettings.EstateAccess,
  75. m_scene.RegionInfo.EstateSettings.EstateID);
  76. remote_client.SendEstateList(invoice,
  77. (int)Constants.EstateAccessCodex.AllowedGroups,
  78. m_scene.RegionInfo.EstateSettings.EstateGroups,
  79. m_scene.RegionInfo.EstateSettings.EstateID);
  80. remote_client.SendBannedUserList(invoice,
  81. m_scene.RegionInfo.EstateSettings.EstateBans,
  82. m_scene.RegionInfo.EstateSettings.EstateID);
  83. }
  84. private void estateSetRegionInfoHandler(bool blockTerraform, bool noFly, bool allowDamage, bool blockLandResell, int maxAgents, float objectBonusFactor,
  85. int matureLevel, bool restrictPushObject, bool allowParcelChanges)
  86. {
  87. if (blockTerraform)
  88. m_scene.RegionInfo.RegionSettings.BlockTerraform = true;
  89. else
  90. m_scene.RegionInfo.RegionSettings.BlockTerraform = false;
  91. if (noFly)
  92. m_scene.RegionInfo.RegionSettings.BlockFly = true;
  93. else
  94. m_scene.RegionInfo.RegionSettings.BlockFly = false;
  95. if (allowDamage)
  96. m_scene.RegionInfo.RegionSettings.AllowDamage = true;
  97. else
  98. m_scene.RegionInfo.RegionSettings.AllowDamage = false;
  99. if (blockLandResell)
  100. m_scene.RegionInfo.RegionSettings.AllowLandResell = false;
  101. else
  102. m_scene.RegionInfo.RegionSettings.AllowLandResell = true;
  103. m_scene.RegionInfo.RegionSettings.AgentLimit = (byte) maxAgents;
  104. m_scene.RegionInfo.RegionSettings.ObjectBonus = objectBonusFactor;
  105. if (matureLevel <= 13)
  106. m_scene.RegionInfo.RegionSettings.Maturity = 0;
  107. else if (matureLevel <= 21)
  108. m_scene.RegionInfo.RegionSettings.Maturity = 1;
  109. else
  110. m_scene.RegionInfo.RegionSettings.Maturity = 2;
  111. if (restrictPushObject)
  112. m_scene.RegionInfo.RegionSettings.RestrictPushing = true;
  113. else
  114. m_scene.RegionInfo.RegionSettings.RestrictPushing = false;
  115. if (allowParcelChanges)
  116. m_scene.RegionInfo.RegionSettings.AllowLandJoinDivide = true;
  117. else
  118. m_scene.RegionInfo.RegionSettings.AllowLandJoinDivide = false;
  119. m_scene.RegionInfo.RegionSettings.Save();
  120. TriggerRegionInfoChange();
  121. sendRegionInfoPacketToAll();
  122. }
  123. public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int corner, UUID texture)
  124. {
  125. if (texture == UUID.Zero)
  126. return;
  127. switch (corner)
  128. {
  129. case 0:
  130. m_scene.RegionInfo.RegionSettings.TerrainTexture1 = texture;
  131. break;
  132. case 1:
  133. m_scene.RegionInfo.RegionSettings.TerrainTexture2 = texture;
  134. break;
  135. case 2:
  136. m_scene.RegionInfo.RegionSettings.TerrainTexture3 = texture;
  137. break;
  138. case 3:
  139. m_scene.RegionInfo.RegionSettings.TerrainTexture4 = texture;
  140. break;
  141. }
  142. m_scene.RegionInfo.RegionSettings.Save();
  143. TriggerRegionInfoChange();
  144. sendRegionInfoPacketToAll();
  145. }
  146. public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue)
  147. {
  148. switch (corner)
  149. {
  150. case 0:
  151. m_scene.RegionInfo.RegionSettings.Elevation1SW = lowValue;
  152. m_scene.RegionInfo.RegionSettings.Elevation2SW = highValue;
  153. break;
  154. case 1:
  155. m_scene.RegionInfo.RegionSettings.Elevation1NW = lowValue;
  156. m_scene.RegionInfo.RegionSettings.Elevation2NW = highValue;
  157. break;
  158. case 2:
  159. m_scene.RegionInfo.RegionSettings.Elevation1SE = lowValue;
  160. m_scene.RegionInfo.RegionSettings.Elevation2SE = highValue;
  161. break;
  162. case 3:
  163. m_scene.RegionInfo.RegionSettings.Elevation1NE = lowValue;
  164. m_scene.RegionInfo.RegionSettings.Elevation2NE = highValue;
  165. break;
  166. }
  167. m_scene.RegionInfo.RegionSettings.Save();
  168. TriggerRegionInfoChange();
  169. sendRegionInfoPacketToAll();
  170. }
  171. private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient)
  172. {
  173. sendRegionHandshakeToAll();
  174. }
  175. public void setRegionTerrainSettings(float WaterHeight,
  176. float TerrainRaiseLimit, float TerrainLowerLimit,
  177. bool UseEstateSun, bool UseFixedSun, float SunHour,
  178. bool UseGlobal, bool EstateFixedSun, float EstateSunHour)
  179. {
  180. // Water Height
  181. m_scene.RegionInfo.RegionSettings.WaterHeight = WaterHeight;
  182. // Terraforming limits
  183. m_scene.RegionInfo.RegionSettings.TerrainRaiseLimit = TerrainRaiseLimit;
  184. m_scene.RegionInfo.RegionSettings.TerrainLowerLimit = TerrainLowerLimit;
  185. // Time of day / fixed sun
  186. m_scene.RegionInfo.RegionSettings.UseEstateSun = UseEstateSun;
  187. m_scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun;
  188. m_scene.RegionInfo.RegionSettings.SunPosition = SunHour;
  189. m_scene.TriggerEstateSunUpdate();
  190. //m_log.Debug("[ESTATE]: UFS: " + UseFixedSun.ToString());
  191. //m_log.Debug("[ESTATE]: SunHour: " + SunHour.ToString());
  192. sendRegionInfoPacketToAll();
  193. m_scene.RegionInfo.RegionSettings.Save();
  194. TriggerRegionInfoChange();
  195. }
  196. private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds)
  197. {
  198. m_scene.Restart(timeInSeconds);
  199. }
  200. private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID)
  201. {
  202. m_scene.RegionInfo.RegionSettings.Covenant = estateCovenantID;
  203. m_scene.RegionInfo.RegionSettings.Save();
  204. TriggerRegionInfoChange();
  205. }
  206. private void handleEstateAccessDeltaRequest(IClientAPI remote_client, UUID invoice, int estateAccessType, UUID user)
  207. {
  208. // EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc.
  209. if (user == m_scene.RegionInfo.EstateSettings.EstateOwner)
  210. return; // never process EO
  211. if ((estateAccessType & 4) != 0) // User add
  212. {
  213. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions())
  214. {
  215. m_scene.RegionInfo.EstateSettings.AddEstateUser(user);
  216. m_scene.RegionInfo.EstateSettings.Save();
  217. TriggerEstateInfoChange();
  218. remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, m_scene.RegionInfo.EstateSettings.EstateAccess, m_scene.RegionInfo.EstateSettings.EstateID);
  219. }
  220. else
  221. {
  222. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  223. }
  224. }
  225. if ((estateAccessType & 8) != 0) // User remove
  226. {
  227. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions())
  228. {
  229. m_scene.RegionInfo.EstateSettings.RemoveEstateUser(user);
  230. m_scene.RegionInfo.EstateSettings.Save();
  231. TriggerEstateInfoChange();
  232. remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, m_scene.RegionInfo.EstateSettings.EstateAccess, m_scene.RegionInfo.EstateSettings.EstateID);
  233. }
  234. else
  235. {
  236. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  237. }
  238. }
  239. if ((estateAccessType & 16) != 0) // Group add
  240. {
  241. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions())
  242. {
  243. m_scene.RegionInfo.EstateSettings.AddEstateGroup(user);
  244. m_scene.RegionInfo.EstateSettings.Save();
  245. TriggerEstateInfoChange();
  246. remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, m_scene.RegionInfo.EstateSettings.EstateGroups, m_scene.RegionInfo.EstateSettings.EstateID);
  247. }
  248. else
  249. {
  250. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  251. }
  252. }
  253. if ((estateAccessType & 32) != 0) // Group remove
  254. {
  255. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions())
  256. {
  257. m_scene.RegionInfo.EstateSettings.RemoveEstateGroup(user);
  258. m_scene.RegionInfo.EstateSettings.Save();
  259. TriggerEstateInfoChange();
  260. remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, m_scene.RegionInfo.EstateSettings.EstateGroups, m_scene.RegionInfo.EstateSettings.EstateID);
  261. }
  262. else
  263. {
  264. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  265. }
  266. }
  267. if ((estateAccessType & 64) != 0) // Ban add
  268. {
  269. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
  270. {
  271. EstateBan[] banlistcheck = m_scene.RegionInfo.EstateSettings.EstateBans;
  272. bool alreadyInList = false;
  273. for (int i = 0; i < banlistcheck.Length; i++)
  274. {
  275. if (user == banlistcheck[i].BannedUserID)
  276. {
  277. alreadyInList = true;
  278. break;
  279. }
  280. }
  281. if (!alreadyInList)
  282. {
  283. EstateBan item = new EstateBan();
  284. item.BannedUserID = user;
  285. item.EstateID = m_scene.RegionInfo.EstateSettings.EstateID;
  286. item.BannedHostAddress = "0.0.0.0";
  287. item.BannedHostIPMask = "0.0.0.0";
  288. m_scene.RegionInfo.EstateSettings.AddBan(item);
  289. m_scene.RegionInfo.EstateSettings.Save();
  290. TriggerEstateInfoChange();
  291. ScenePresence s = m_scene.GetScenePresence(user);
  292. if (s != null)
  293. {
  294. if (!s.IsChildAgent)
  295. {
  296. m_scene.TeleportClientHome(user, s.ControllingClient);
  297. }
  298. }
  299. }
  300. else
  301. {
  302. remote_client.SendAlertMessage("User is already on the region ban list");
  303. }
  304. //m_scene.RegionInfo.regionBanlist.Add(Manager(user);
  305. remote_client.SendBannedUserList(invoice, m_scene.RegionInfo.EstateSettings.EstateBans, m_scene.RegionInfo.EstateSettings.EstateID);
  306. }
  307. else
  308. {
  309. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  310. }
  311. }
  312. if ((estateAccessType & 128) != 0) // Ban remove
  313. {
  314. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
  315. {
  316. EstateBan[] banlistcheck = m_scene.RegionInfo.EstateSettings.EstateBans;
  317. bool alreadyInList = false;
  318. EstateBan listitem = null;
  319. for (int i = 0; i < banlistcheck.Length; i++)
  320. {
  321. if (user == banlistcheck[i].BannedUserID)
  322. {
  323. alreadyInList = true;
  324. listitem = banlistcheck[i];
  325. break;
  326. }
  327. }
  328. if (alreadyInList && listitem != null)
  329. {
  330. m_scene.RegionInfo.EstateSettings.RemoveBan(listitem.BannedUserID);
  331. m_scene.RegionInfo.EstateSettings.Save();
  332. TriggerEstateInfoChange();
  333. }
  334. else
  335. {
  336. remote_client.SendAlertMessage("User is not on the region ban list");
  337. }
  338. //m_scene.RegionInfo.regionBanlist.Add(Manager(user);
  339. remote_client.SendBannedUserList(invoice, m_scene.RegionInfo.EstateSettings.EstateBans, m_scene.RegionInfo.EstateSettings.EstateID);
  340. }
  341. else
  342. {
  343. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  344. }
  345. }
  346. if ((estateAccessType & 256) != 0) // Manager add
  347. {
  348. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions())
  349. {
  350. m_scene.RegionInfo.EstateSettings.AddEstateManager(user);
  351. m_scene.RegionInfo.EstateSettings.Save();
  352. TriggerEstateInfoChange();
  353. remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, m_scene.RegionInfo.EstateSettings.EstateManagers, m_scene.RegionInfo.EstateSettings.EstateID);
  354. }
  355. else
  356. {
  357. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  358. }
  359. }
  360. if ((estateAccessType & 512) != 0) // Manager remove
  361. {
  362. if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions())
  363. {
  364. m_scene.RegionInfo.EstateSettings.RemoveEstateManager(user);
  365. m_scene.RegionInfo.EstateSettings.Save();
  366. TriggerEstateInfoChange();
  367. remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, m_scene.RegionInfo.EstateSettings.EstateManagers, m_scene.RegionInfo.EstateSettings.EstateID);
  368. }
  369. else
  370. {
  371. remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
  372. }
  373. }
  374. }
  375. private void SendSimulatorBlueBoxMessage(
  376. IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message)
  377. {
  378. IDialogModule dm = m_scene.RequestModuleInterface<IDialogModule>();
  379. if (dm != null)
  380. dm.SendNotificationToUsersInRegion(senderID, senderName, message);
  381. }
  382. private void SendEstateBlueBoxMessage(
  383. IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message)
  384. {
  385. TriggerEstateMessage(senderID, senderName, message);
  386. }
  387. private void handleEstateDebugRegionRequest(IClientAPI remote_client, UUID invoice, UUID senderID, bool scripted, bool collisionEvents, bool physics)
  388. {
  389. if (physics)
  390. m_scene.RegionInfo.RegionSettings.DisablePhysics = true;
  391. else
  392. m_scene.RegionInfo.RegionSettings.DisablePhysics = false;
  393. if (scripted)
  394. m_scene.RegionInfo.RegionSettings.DisableScripts = true;
  395. else
  396. m_scene.RegionInfo.RegionSettings.DisableScripts = false;
  397. if (collisionEvents)
  398. m_scene.RegionInfo.RegionSettings.DisableCollisions = true;
  399. else
  400. m_scene.RegionInfo.RegionSettings.DisableCollisions = false;
  401. m_scene.RegionInfo.RegionSettings.Save();
  402. TriggerRegionInfoChange();
  403. m_scene.SetSceneCoreDebug(scripted, collisionEvents, physics);
  404. }
  405. private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey)
  406. {
  407. if (!m_scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false))
  408. return;
  409. if (prey != UUID.Zero)
  410. {
  411. ScenePresence s = m_scene.GetScenePresence(prey);
  412. if (s != null)
  413. {
  414. m_scene.TeleportClientHome(prey, s.ControllingClient);
  415. }
  416. }
  417. }
  418. private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID)
  419. {
  420. if (!m_scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false))
  421. return;
  422. m_scene.ForEachScenePresence(delegate(ScenePresence sp)
  423. {
  424. if (sp.UUID != senderID)
  425. {
  426. ScenePresence p = m_scene.GetScenePresence(sp.UUID);
  427. // make sure they are still there, we could be working down a long list
  428. // Also make sure they are actually in the region
  429. if (p != null && !p.IsChildAgent)
  430. {
  431. m_scene.TeleportClientHome(p.UUID, p.ControllingClient);
  432. }
  433. }
  434. });
  435. }
  436. private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID)
  437. {
  438. if (TerrainUploader != null)
  439. {
  440. lock (TerrainUploader)
  441. {
  442. if (XferID == TerrainUploader.XferID)
  443. {
  444. remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
  445. remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
  446. TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
  447. TerrainUploader = null;
  448. remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
  449. }
  450. }
  451. }
  452. }
  453. private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient)
  454. {
  455. lock (TerrainUploader)
  456. {
  457. remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
  458. remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
  459. TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
  460. TerrainUploader = null;
  461. }
  462. remoteClient.SendAlertMessage("Terrain Upload Complete. Loading....");
  463. ITerrainModule terr = m_scene.RequestModuleInterface<ITerrainModule>();
  464. if (terr != null)
  465. {
  466. m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + m_scene.RegionInfo.RegionName);
  467. try
  468. {
  469. string localfilename = "terrain.raw";
  470. if (terrainData.Length == 851968)
  471. {
  472. localfilename = Path.Combine(Util.dataDir(),"terrain.raw"); // It's a .LLRAW
  473. }
  474. if (terrainData.Length == 196662) // 24-bit 256x256 Bitmap
  475. localfilename = Path.Combine(Util.dataDir(), "terrain.bmp");
  476. if (terrainData.Length == 256 * 256 * 4) // It's a .R32
  477. localfilename = Path.Combine(Util.dataDir(), "terrain.r32");
  478. if (terrainData.Length == 256 * 256 * 8) // It's a .R64
  479. localfilename = Path.Combine(Util.dataDir(), "terrain.r64");
  480. if (File.Exists(localfilename))
  481. {
  482. File.Delete(localfilename);
  483. }
  484. FileStream input = new FileStream(localfilename, FileMode.CreateNew);
  485. input.Write(terrainData, 0, terrainData.Length);
  486. input.Close();
  487. FileInfo x = new FileInfo(localfilename);
  488. terr.LoadFromFile(localfilename);
  489. remoteClient.SendAlertMessage("Your terrain was loaded as a ." + x.Extension + " file. It may take a few moments to appear.");
  490. }
  491. catch (IOException e)
  492. {
  493. m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
  494. remoteClient.SendAlertMessage("There was an IO Exception loading your terrain. Please check free space.");
  495. return;
  496. }
  497. catch (SecurityException e)
  498. {
  499. m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
  500. remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive");
  501. return;
  502. }
  503. catch (UnauthorizedAccessException e)
  504. {
  505. m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
  506. remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive");
  507. return;
  508. }
  509. catch (Exception e)
  510. {
  511. m_log.ErrorFormat("[TERRAIN]: Error loading a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString());
  512. remoteClient.SendAlertMessage("There was a general error loading your terrain. Please fix the terrain file and try again");
  513. }
  514. }
  515. else
  516. {
  517. remoteClient.SendAlertMessage("Unable to apply terrain. Cannot get an instance of the terrain module");
  518. }
  519. }
  520. private void handleUploadTerrain(IClientAPI remote_client, string clientFileName)
  521. {
  522. if (TerrainUploader == null)
  523. {
  524. TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
  525. lock (TerrainUploader)
  526. {
  527. remote_client.OnXferReceive += TerrainUploader.XferReceive;
  528. remote_client.OnAbortXfer += AbortTerrainXferHandler;
  529. TerrainUploader.TerrainUploadDone += HandleTerrainApplication;
  530. }
  531. TerrainUploader.RequestStartXfer(remote_client);
  532. }
  533. else
  534. {
  535. remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
  536. }
  537. }
  538. private void handleTerrainRequest(IClientAPI remote_client, string clientFileName)
  539. {
  540. // Save terrain here
  541. ITerrainModule terr = m_scene.RequestModuleInterface<ITerrainModule>();
  542. if (terr != null)
  543. {
  544. m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + m_scene.RegionInfo.RegionName);
  545. if (File.Exists(Util.dataDir() + "/terrain.raw"))
  546. {
  547. File.Delete(Util.dataDir() + "/terrain.raw");
  548. }
  549. terr.SaveToFile(Util.dataDir() + "/terrain.raw");
  550. FileStream input = new FileStream(Util.dataDir() + "/terrain.raw", FileMode.Open);
  551. byte[] bdata = new byte[input.Length];
  552. input.Read(bdata, 0, (int)input.Length);
  553. remote_client.SendAlertMessage("Terrain file written, starting download...");
  554. m_scene.XferManager.AddNewFile("terrain.raw", bdata);
  555. // Tell client about it
  556. m_log.Warn("[CLIENT]: Sending Terrain to " + remote_client.Name);
  557. remote_client.SendInitiateDownload("terrain.raw", clientFileName);
  558. }
  559. }
  560. private void HandleRegionInfoRequest(IClientAPI remote_client)
  561. {
  562. RegionInfoForEstateMenuArgs args = new RegionInfoForEstateMenuArgs();
  563. args.billableFactor = m_scene.RegionInfo.EstateSettings.BillableFactor;
  564. args.estateID = m_scene.RegionInfo.EstateSettings.EstateID;
  565. args.maxAgents = (byte)m_scene.RegionInfo.RegionSettings.AgentLimit;
  566. args.objectBonusFactor = (float)m_scene.RegionInfo.RegionSettings.ObjectBonus;
  567. args.parentEstateID = m_scene.RegionInfo.EstateSettings.ParentEstateID;
  568. args.pricePerMeter = m_scene.RegionInfo.EstateSettings.PricePerMeter;
  569. args.redirectGridX = m_scene.RegionInfo.EstateSettings.RedirectGridX;
  570. args.redirectGridY = m_scene.RegionInfo.EstateSettings.RedirectGridY;
  571. args.regionFlags = GetRegionFlags();
  572. args.simAccess = m_scene.RegionInfo.AccessLevel;
  573. args.sunHour = (float)m_scene.RegionInfo.RegionSettings.SunPosition;
  574. args.terrainLowerLimit = (float)m_scene.RegionInfo.RegionSettings.TerrainLowerLimit;
  575. args.terrainRaiseLimit = (float)m_scene.RegionInfo.RegionSettings.TerrainRaiseLimit;
  576. args.useEstateSun = m_scene.RegionInfo.RegionSettings.UseEstateSun;
  577. args.waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight;
  578. args.simName = m_scene.RegionInfo.RegionName;
  579. args.regionType = m_scene.RegionInfo.RegionType;
  580. remote_client.SendRegionInfoToEstateMenu(args);
  581. }
  582. private void HandleEstateCovenantRequest(IClientAPI remote_client)
  583. {
  584. remote_client.SendEstateCovenantInformation(m_scene.RegionInfo.RegionSettings.Covenant);
  585. }
  586. private void HandleLandStatRequest(int parcelID, uint reportType, uint requestFlags, string filter, IClientAPI remoteClient)
  587. {
  588. Dictionary<uint, float> SceneData = new Dictionary<uint,float>();
  589. List<UUID> uuidNameLookupList = new List<UUID>();
  590. if (reportType == 1)
  591. {
  592. SceneData = m_scene.PhysicsScene.GetTopColliders();
  593. }
  594. else if (reportType == 0)
  595. {
  596. SceneData = m_scene.SceneGraph.GetTopScripts();
  597. }
  598. List<LandStatReportItem> SceneReport = new List<LandStatReportItem>();
  599. lock (SceneData)
  600. {
  601. foreach (uint obj in SceneData.Keys)
  602. {
  603. SceneObjectPart prt = m_scene.GetSceneObjectPart(obj);
  604. if (prt != null)
  605. {
  606. if (prt.ParentGroup != null)
  607. {
  608. SceneObjectGroup sog = prt.ParentGroup;
  609. if (sog != null)
  610. {
  611. LandStatReportItem lsri = new LandStatReportItem();
  612. lsri.LocationX = sog.AbsolutePosition.X;
  613. lsri.LocationY = sog.AbsolutePosition.Y;
  614. lsri.LocationZ = sog.AbsolutePosition.Z;
  615. lsri.Score = SceneData[obj];
  616. lsri.TaskID = sog.UUID;
  617. lsri.TaskLocalID = sog.LocalId;
  618. lsri.TaskName = sog.GetPartName(obj);
  619. lsri.OwnerName = "waiting";
  620. lock (uuidNameLookupList)
  621. uuidNameLookupList.Add(sog.OwnerID);
  622. if (filter.Length != 0)
  623. {
  624. if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter)))
  625. {
  626. }
  627. else
  628. {
  629. continue;
  630. }
  631. }
  632. SceneReport.Add(lsri);
  633. }
  634. }
  635. }
  636. }
  637. }
  638. remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray());
  639. if (uuidNameLookupList.Count > 0)
  640. LookupUUID(uuidNameLookupList);
  641. }
  642. private static void LookupUUIDSCompleted(IAsyncResult iar)
  643. {
  644. LookupUUIDS icon = (LookupUUIDS)iar.AsyncState;
  645. icon.EndInvoke(iar);
  646. }
  647. private void LookupUUID(List<UUID> uuidLst)
  648. {
  649. LookupUUIDS d = LookupUUIDsAsync;
  650. d.BeginInvoke(uuidLst,
  651. LookupUUIDSCompleted,
  652. d);
  653. }
  654. private void LookupUUIDsAsync(List<UUID> uuidLst)
  655. {
  656. UUID[] uuidarr;
  657. lock (uuidLst)
  658. {
  659. uuidarr = uuidLst.ToArray();
  660. }
  661. for (int i = 0; i < uuidarr.Length; i++)
  662. {
  663. // string lookupname = m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]);
  664. m_scene.GetUserName(uuidarr[i]);
  665. // we drop it. It gets cached though... so we're ready for the next request.
  666. }
  667. }
  668. #endregion
  669. #region Outgoing Packets
  670. public void sendRegionInfoPacketToAll()
  671. {
  672. m_scene.ForEachScenePresence(delegate(ScenePresence sp)
  673. {
  674. if (!sp.IsChildAgent)
  675. HandleRegionInfoRequest(sp.ControllingClient);
  676. });
  677. }
  678. public void sendRegionHandshake(IClientAPI remoteClient)
  679. {
  680. RegionHandshakeArgs args = new RegionHandshakeArgs();
  681. args.isEstateManager = m_scene.RegionInfo.EstateSettings.IsEstateManager(remoteClient.AgentId);
  682. if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero && m_scene.RegionInfo.EstateSettings.EstateOwner == remoteClient.AgentId)
  683. args.isEstateManager = true;
  684. args.billableFactor = m_scene.RegionInfo.EstateSettings.BillableFactor;
  685. args.terrainStartHeight0 = (float)m_scene.RegionInfo.RegionSettings.Elevation1SW;
  686. args.terrainHeightRange0 = (float)m_scene.RegionInfo.RegionSettings.Elevation2SW;
  687. args.terrainStartHeight1 = (float)m_scene.RegionInfo.RegionSettings.Elevation1NW;
  688. args.terrainHeightRange1 = (float)m_scene.RegionInfo.RegionSettings.Elevation2NW;
  689. args.terrainStartHeight2 = (float)m_scene.RegionInfo.RegionSettings.Elevation1SE;
  690. args.terrainHeightRange2 = (float)m_scene.RegionInfo.RegionSettings.Elevation2SE;
  691. args.terrainStartHeight3 = (float)m_scene.RegionInfo.RegionSettings.Elevation1NE;
  692. args.terrainHeightRange3 = (float)m_scene.RegionInfo.RegionSettings.Elevation2NE;
  693. args.simAccess = m_scene.RegionInfo.AccessLevel;
  694. args.waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight;
  695. args.regionFlags = GetRegionFlags();
  696. args.regionName = m_scene.RegionInfo.RegionName;
  697. args.SimOwner = m_scene.RegionInfo.EstateSettings.EstateOwner;
  698. args.terrainBase0 = UUID.Zero;
  699. args.terrainBase1 = UUID.Zero;
  700. args.terrainBase2 = UUID.Zero;
  701. args.terrainBase3 = UUID.Zero;
  702. args.terrainDetail0 = m_scene.RegionInfo.RegionSettings.TerrainTexture1;
  703. args.terrainDetail1 = m_scene.RegionInfo.RegionSettings.TerrainTexture2;
  704. args.terrainDetail2 = m_scene.RegionInfo.RegionSettings.TerrainTexture3;
  705. args.terrainDetail3 = m_scene.RegionInfo.RegionSettings.TerrainTexture4;
  706. remoteClient.SendRegionHandshake(m_scene.RegionInfo,args);
  707. }
  708. public void sendRegionHandshakeToAll()
  709. {
  710. m_scene.ForEachClient(sendRegionHandshake);
  711. }
  712. public void handleEstateChangeInfo(IClientAPI remoteClient, UUID invoice, UUID senderID, UInt32 parms1, UInt32 parms2)
  713. {
  714. if (parms2 == 0)
  715. {
  716. m_scene.RegionInfo.EstateSettings.UseGlobalTime = true;
  717. m_scene.RegionInfo.EstateSettings.SunPosition = 0.0;
  718. }
  719. else
  720. {
  721. m_scene.RegionInfo.EstateSettings.UseGlobalTime = false;
  722. m_scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0;
  723. }
  724. if ((parms1 & 0x00000010) != 0)
  725. m_scene.RegionInfo.EstateSettings.FixedSun = true;
  726. else
  727. m_scene.RegionInfo.EstateSettings.FixedSun = false;
  728. if ((parms1 & 0x00008000) != 0)
  729. m_scene.RegionInfo.EstateSettings.PublicAccess = true;
  730. else
  731. m_scene.RegionInfo.EstateSettings.PublicAccess = false;
  732. if ((parms1 & 0x10000000) != 0)
  733. m_scene.RegionInfo.EstateSettings.AllowVoice = true;
  734. else
  735. m_scene.RegionInfo.EstateSettings.AllowVoice = false;
  736. if ((parms1 & 0x00100000) != 0)
  737. m_scene.RegionInfo.EstateSettings.AllowDirectTeleport = true;
  738. else
  739. m_scene.RegionInfo.EstateSettings.AllowDirectTeleport = false;
  740. if ((parms1 & 0x00800000) != 0)
  741. m_scene.RegionInfo.EstateSettings.DenyAnonymous = true;
  742. else
  743. m_scene.RegionInfo.EstateSettings.DenyAnonymous = false;
  744. if ((parms1 & 0x01000000) != 0)
  745. m_scene.RegionInfo.EstateSettings.DenyIdentified = true;
  746. else
  747. m_scene.RegionInfo.EstateSettings.DenyIdentified = false;
  748. if ((parms1 & 0x02000000) != 0)
  749. m_scene.RegionInfo.EstateSettings.DenyTransacted = true;
  750. else
  751. m_scene.RegionInfo.EstateSettings.DenyTransacted = false;
  752. if ((parms1 & 0x40000000) != 0)
  753. m_scene.RegionInfo.EstateSettings.DenyMinors = true;
  754. else
  755. m_scene.RegionInfo.EstateSettings.DenyMinors = false;
  756. m_scene.RegionInfo.EstateSettings.Save();
  757. TriggerEstateInfoChange();
  758. m_scene.TriggerEstateSunUpdate();
  759. sendDetailedEstateData(remoteClient, invoice);
  760. }
  761. #endregion
  762. #region IRegionModule Members
  763. public void Initialise(Scene scene, IConfigSource source)
  764. {
  765. m_scene = scene;
  766. m_scene.RegisterModuleInterface<IEstateModule>(this);
  767. m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
  768. m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight;
  769. m_scene.AddCommand(this, "set terrain texture",
  770. "set terrain texture <number> <uuid> [<x>] [<y>]",
  771. "Sets the terrain <number> to <uuid>, if <x> or <y> are specified, it will only " +
  772. "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
  773. " that coordinate.",
  774. consoleSetTerrainTexture);
  775. m_scene.AddCommand(this, "set terrain heights",
  776. "set terrain heights <corner> <min> <max> [<x>] [<y>]",
  777. "Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " +
  778. "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
  779. " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.",
  780. consoleSetTerrainHeights);
  781. }
  782. #region Console Commands
  783. public void consoleSetTerrainTexture(string module, string[] args)
  784. {
  785. string num = args[3];
  786. string uuid = args[4];
  787. int x = (args.Length > 5 ? int.Parse(args[5]) : -1);
  788. int y = (args.Length > 6 ? int.Parse(args[6]) : -1);
  789. if (x == -1 || m_scene.RegionInfo.RegionLocX == x)
  790. {
  791. if (y == -1 || m_scene.RegionInfo.RegionLocY == y)
  792. {
  793. int corner = int.Parse(num);
  794. UUID texture = UUID.Parse(uuid);
  795. m_log.Debug("[ESTATEMODULE] Setting terrain textures for " + m_scene.RegionInfo.RegionName +
  796. string.Format(" (C#{0} = {1})", corner, texture));
  797. switch (corner)
  798. {
  799. case 0:
  800. m_scene.RegionInfo.RegionSettings.TerrainTexture1 = texture;
  801. break;
  802. case 1:
  803. m_scene.RegionInfo.RegionSettings.TerrainTexture2 = texture;
  804. break;
  805. case 2:
  806. m_scene.RegionInfo.RegionSettings.TerrainTexture3 = texture;
  807. break;
  808. case 3:
  809. m_scene.RegionInfo.RegionSettings.TerrainTexture4 = texture;
  810. break;
  811. }
  812. m_scene.RegionInfo.RegionSettings.Save();
  813. TriggerRegionInfoChange();
  814. sendRegionInfoPacketToAll();
  815. }
  816. }
  817. }
  818. public void consoleSetTerrainHeights(string module, string[] args)
  819. {
  820. string num = args[3];
  821. string min = args[4];
  822. string max = args[5];
  823. int x = (args.Length > 6 ? int.Parse(args[6]) : -1);
  824. int y = (args.Length > 7 ? int.Parse(args[7]) : -1);
  825. if (x == -1 || m_scene.RegionInfo.RegionLocX == x)
  826. {
  827. if (y == -1 || m_scene.RegionInfo.RegionLocY == y)
  828. {
  829. int corner = int.Parse(num);
  830. float lowValue = float.Parse(min, Culture.NumberFormatInfo);
  831. float highValue = float.Parse(max, Culture.NumberFormatInfo);
  832. m_log.Debug("[ESTATEMODULE] Setting terrain heights " + m_scene.RegionInfo.RegionName +
  833. string.Format(" (C{0}, {1}-{2}", corner, lowValue, highValue));
  834. switch (corner)
  835. {
  836. case 0:
  837. m_scene.RegionInfo.RegionSettings.Elevation1SW = lowValue;
  838. m_scene.RegionInfo.RegionSettings.Elevation2SW = highValue;
  839. break;
  840. case 1:
  841. m_scene.RegionInfo.RegionSettings.Elevation1NW = lowValue;
  842. m_scene.RegionInfo.RegionSettings.Elevation2NW = highValue;
  843. break;
  844. case 2:
  845. m_scene.RegionInfo.RegionSettings.Elevation1SE = lowValue;
  846. m_scene.RegionInfo.RegionSettings.Elevation2SE = highValue;
  847. break;
  848. case 3:
  849. m_scene.RegionInfo.RegionSettings.Elevation1NE = lowValue;
  850. m_scene.RegionInfo.RegionSettings.Elevation2NE = highValue;
  851. break;
  852. }
  853. m_scene.RegionInfo.RegionSettings.Save();
  854. TriggerRegionInfoChange();
  855. sendRegionHandshakeToAll();
  856. }
  857. }
  858. }
  859. #endregion
  860. public void PostInitialise()
  861. {
  862. // Sets up the sun module based no the saved Estate and Region Settings
  863. // DO NOT REMOVE or the sun will stop working
  864. m_scene.TriggerEstateSunUpdate();
  865. }
  866. public void Close()
  867. {
  868. }
  869. public string Name
  870. {
  871. get { return "EstateManagementModule"; }
  872. }
  873. public bool IsSharedModule
  874. {
  875. get { return false; }
  876. }
  877. #endregion
  878. #region Other Functions
  879. public void changeWaterHeight(float height)
  880. {
  881. setRegionTerrainSettings(height,
  882. (float)m_scene.RegionInfo.RegionSettings.TerrainRaiseLimit,
  883. (float)m_scene.RegionInfo.RegionSettings.TerrainLowerLimit,
  884. m_scene.RegionInfo.RegionSettings.UseEstateSun,
  885. m_scene.RegionInfo.RegionSettings.FixedSun,
  886. (float)m_scene.RegionInfo.RegionSettings.SunPosition,
  887. m_scene.RegionInfo.EstateSettings.UseGlobalTime,
  888. m_scene.RegionInfo.EstateSettings.FixedSun,
  889. (float)m_scene.RegionInfo.EstateSettings.SunPosition);
  890. sendRegionInfoPacketToAll();
  891. }
  892. #endregion
  893. private void EventManager_OnNewClient(IClientAPI client)
  894. {
  895. client.OnDetailedEstateDataRequest += sendDetailedEstateData;
  896. client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler;
  897. // client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture;
  898. client.OnSetEstateTerrainDetailTexture += setEstateTerrainBaseTexture;
  899. client.OnSetEstateTerrainTextureHeights += setEstateTerrainTextureHeights;
  900. client.OnCommitEstateTerrainTextureRequest += handleCommitEstateTerrainTextureRequest;
  901. client.OnSetRegionTerrainSettings += setRegionTerrainSettings;
  902. client.OnEstateRestartSimRequest += handleEstateRestartSimRequest;
  903. client.OnEstateChangeCovenantRequest += handleChangeEstateCovenantRequest;
  904. client.OnEstateChangeInfo += handleEstateChangeInfo;
  905. client.OnUpdateEstateAccessDeltaRequest += handleEstateAccessDeltaRequest;
  906. client.OnSimulatorBlueBoxMessageRequest += SendSimulatorBlueBoxMessage;
  907. client.OnEstateBlueBoxMessageRequest += SendEstateBlueBoxMessage;
  908. client.OnEstateDebugRegionRequest += handleEstateDebugRegionRequest;
  909. client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest;
  910. client.OnEstateTeleportAllUsersHomeRequest += handleEstateTeleportAllUsersHomeRequest;
  911. client.OnRequestTerrain += handleTerrainRequest;
  912. client.OnUploadTerrain += handleUploadTerrain;
  913. client.OnRegionInfoRequest += HandleRegionInfoRequest;
  914. client.OnEstateCovenantRequest += HandleEstateCovenantRequest;
  915. client.OnLandStatRequest += HandleLandStatRequest;
  916. sendRegionHandshake(client);
  917. }
  918. public uint GetRegionFlags()
  919. {
  920. RegionFlags flags = RegionFlags.None;
  921. // Fully implemented
  922. //
  923. if (m_scene.RegionInfo.RegionSettings.AllowDamage)
  924. flags |= RegionFlags.AllowDamage;
  925. if (m_scene.RegionInfo.RegionSettings.BlockTerraform)
  926. flags |= RegionFlags.BlockTerraform;
  927. if (!m_scene.RegionInfo.RegionSettings.AllowLandResell)
  928. flags |= RegionFlags.BlockLandResell;
  929. if (m_scene.RegionInfo.RegionSettings.DisableCollisions)
  930. flags |= RegionFlags.SkipCollisions;
  931. if (m_scene.RegionInfo.RegionSettings.DisableScripts)
  932. flags |= RegionFlags.SkipScripts;
  933. if (m_scene.RegionInfo.RegionSettings.DisablePhysics)
  934. flags |= RegionFlags.SkipPhysics;
  935. if (m_scene.RegionInfo.RegionSettings.BlockFly)
  936. flags |= RegionFlags.NoFly;
  937. if (m_scene.RegionInfo.RegionSettings.RestrictPushing)
  938. flags |= RegionFlags.RestrictPushObject;
  939. if (m_scene.RegionInfo.RegionSettings.AllowLandJoinDivide)
  940. flags |= RegionFlags.AllowParcelChanges;
  941. if (m_scene.RegionInfo.RegionSettings.BlockShowInSearch)
  942. flags |= (RegionFlags)(1 << 29);
  943. if (m_scene.RegionInfo.RegionSettings.FixedSun)
  944. flags |= RegionFlags.SunFixed;
  945. if (m_scene.RegionInfo.RegionSettings.Sandbox)
  946. flags |= RegionFlags.Sandbox;
  947. // Fudge these to always on, so the menu options activate
  948. //
  949. flags |= RegionFlags.AllowLandmark;
  950. flags |= RegionFlags.AllowSetHome;
  951. // TODO: SkipUpdateInterestList
  952. // Omitted
  953. //
  954. // Omitted: NullLayer (what is that?)
  955. // Omitted: SkipAgentAction (what does it do?)
  956. return (uint)flags;
  957. }
  958. public uint GetEstateFlags()
  959. {
  960. RegionFlags flags = RegionFlags.None;
  961. if (m_scene.RegionInfo.EstateSettings.FixedSun)
  962. flags |= RegionFlags.SunFixed;
  963. if (m_scene.RegionInfo.EstateSettings.PublicAccess)
  964. flags |= (RegionFlags.PublicAllowed |
  965. RegionFlags.ExternallyVisible);
  966. if (m_scene.RegionInfo.EstateSettings.AllowVoice)
  967. flags |= RegionFlags.AllowVoice;
  968. if (m_scene.RegionInfo.EstateSettings.AllowDirectTeleport)
  969. flags |= RegionFlags.AllowDirectTeleport;
  970. if (m_scene.RegionInfo.EstateSettings.DenyAnonymous)
  971. flags |= RegionFlags.DenyAnonymous;
  972. if (m_scene.RegionInfo.EstateSettings.DenyIdentified)
  973. flags |= RegionFlags.DenyIdentified;
  974. if (m_scene.RegionInfo.EstateSettings.DenyTransacted)
  975. flags |= RegionFlags.DenyTransacted;
  976. if (m_scene.RegionInfo.EstateSettings.AbuseEmailToEstateOwner)
  977. flags |= RegionFlags.AbuseEmailToEstateOwner;
  978. if (m_scene.RegionInfo.EstateSettings.BlockDwell)
  979. flags |= RegionFlags.BlockDwell;
  980. if (m_scene.RegionInfo.EstateSettings.EstateSkipScripts)
  981. flags |= RegionFlags.EstateSkipScripts;
  982. if (m_scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
  983. flags |= RegionFlags.ResetHomeOnTeleport;
  984. if (m_scene.RegionInfo.EstateSettings.TaxFree)
  985. flags |= RegionFlags.TaxFree;
  986. if (m_scene.RegionInfo.EstateSettings.DenyMinors)
  987. flags |= (RegionFlags)(1 << 30);
  988. return (uint)flags;
  989. }
  990. public bool IsManager(UUID avatarID)
  991. {
  992. if (avatarID == m_scene.RegionInfo.EstateSettings.EstateOwner)
  993. return true;
  994. List<UUID> ems = new List<UUID>(m_scene.RegionInfo.EstateSettings.EstateManagers);
  995. if (ems.Contains(avatarID))
  996. return true;
  997. return false;
  998. }
  999. protected void TriggerRegionInfoChange()
  1000. {
  1001. ChangeDelegate change = OnRegionInfoChange;
  1002. if (change != null)
  1003. change(m_scene.RegionInfo.RegionID);
  1004. }
  1005. protected void TriggerEstateInfoChange()
  1006. {
  1007. ChangeDelegate change = OnEstateInfoChange;
  1008. if (change != null)
  1009. change(m_scene.RegionInfo.RegionID);
  1010. }
  1011. protected void TriggerEstateMessage(UUID fromID, string fromName, string message)
  1012. {
  1013. MessageDelegate onmessage = OnEstateMessage;
  1014. if (onmessage != null)
  1015. onmessage(m_scene.RegionInfo.RegionID, fromID, fromName, message);
  1016. }
  1017. }
  1018. }