PageRenderTime 120ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 2ms

/Aurora/ClientStack/LLClientView.cs

https://bitbucket.org/VirtualReality/async-sim-testing
C# | 10397 lines | 8339 code | 1512 blank | 546 comment | 1349 complexity | 50eea75bbf5beee320f42e3fd095fa23 MD5 | raw file
  1. /*
  2. * Copyright (c) Contributors, http://aurora-sim.org/, 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 Aurora-Sim 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 Aurora.Framework;
  28. using Aurora.Framework.ClientInterfaces;
  29. using Aurora.Framework.ConsoleFramework;
  30. using Aurora.Framework.Modules;
  31. using Aurora.Framework.PresenceInfo;
  32. using Aurora.Framework.SceneInfo;
  33. using Aurora.Framework.SceneInfo.Entities;
  34. using Aurora.Framework.Services;
  35. using Aurora.Framework.Services.ClassHelpers.Assets;
  36. using Aurora.Framework.Services.ClassHelpers.Inventory;
  37. using Aurora.Framework.Utilities;
  38. using Nini.Config;
  39. using OpenMetaverse;
  40. using OpenMetaverse.Messages.Linden;
  41. using OpenMetaverse.Packets;
  42. using OpenMetaverse.StructuredData;
  43. using System;
  44. using System.Collections.Generic;
  45. using System.Linq;
  46. using System.Net;
  47. using System.Threading;
  48. using System.Xml;
  49. using RegionFlags = OpenMetaverse.RegionFlags;
  50. namespace Aurora.ClientStack
  51. {
  52. public delegate bool PacketMethod(IClientAPI simClient, Packet packet);
  53. /// <summary>
  54. /// Handles new client connections
  55. /// Constructor takes a single Packet and authenticates everything
  56. /// </summary>
  57. public sealed class LLClientView : IClientAPI, IStatsCollector
  58. {
  59. /// <value>
  60. /// Debug packet level. See OpenSim.RegisterConsoleCommands() for more details.
  61. /// </value>
  62. private int m_debugPacketLevel;
  63. private readonly bool m_allowUDPInv;
  64. #region Events
  65. public event BinaryGenericMessage OnBinaryGenericMessage;
  66. public event Action<IClientAPI> OnLogout;
  67. public event ObjectPermissions OnObjectPermissions;
  68. public event Action<IClientAPI> OnConnectionClosed;
  69. public event ViewerEffectEventHandler OnViewerEffect;
  70. public event ImprovedInstantMessage OnInstantMessage;
  71. public event PreSendImprovedInstantMessage OnPreSendInstantMessage;
  72. public event ChatMessage OnChatFromClient;
  73. public event RezObject OnRezObject;
  74. public event DeRezObject OnDeRezObject;
  75. public event ModifyTerrain OnModifyTerrain;
  76. public event Action<IClientAPI> OnRegionHandShakeReply;
  77. public event GenericCall1 OnRequestWearables;
  78. public event SetAppearance OnSetAppearance;
  79. public event AvatarNowWearing OnAvatarNowWearing;
  80. public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
  81. public event UUIDNameRequest OnDetachAttachmentIntoInv;
  82. public event ObjectAttach OnObjectAttach;
  83. public event ObjectDeselect OnObjectDetach;
  84. public event ObjectDrop OnObjectDrop;
  85. public event GenericCall1 OnCompleteMovementToRegion;
  86. public event UpdateAgent OnAgentUpdate;
  87. public event AgentRequestSit OnAgentRequestSit;
  88. public event AgentSit OnAgentSit;
  89. public event AvatarPickerRequest OnAvatarPickerRequest;
  90. public event StartAnim OnStartAnim;
  91. public event StopAnim OnStopAnim;
  92. public event Action<IClientAPI> OnRequestAvatarsData;
  93. public event LinkObjects OnLinkObjects;
  94. public event DelinkObjects OnDelinkObjects;
  95. public event GrabObject OnGrabObject;
  96. public event DeGrabObject OnDeGrabObject;
  97. public event SpinStart OnSpinStart;
  98. public event SpinStop OnSpinStop;
  99. public event ObjectDuplicate OnObjectDuplicate;
  100. public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
  101. public event MoveObject OnGrabUpdate;
  102. public event SpinObject OnSpinUpdate;
  103. public event AddNewPrim OnAddPrim;
  104. public event RequestGodlikePowers OnRequestGodlikePowers;
  105. public event GodKickUser OnGodKickUser;
  106. public event ObjectExtraParams OnUpdateExtraParams;
  107. public event UpdateShape OnUpdatePrimShape;
  108. public event ObjectRequest OnObjectRequest;
  109. public event ObjectSelect OnObjectSelect;
  110. public event ObjectDeselect OnObjectDeselect;
  111. public event GenericCall7 OnObjectDescription;
  112. public event GenericCall7 OnObjectName;
  113. public event GenericCall7 OnObjectClickAction;
  114. public event GenericCall7 OnObjectMaterial;
  115. public event ObjectIncludeInSearch OnObjectIncludeInSearch;
  116. public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
  117. public event UpdatePrimFlags OnUpdatePrimFlags;
  118. public event UpdatePrimTexture OnUpdatePrimTexture;
  119. public event UpdateVectorWithUpdate OnUpdatePrimGroupPosition;
  120. public event UpdateVectorWithUpdate OnUpdatePrimSinglePosition;
  121. public event UpdatePrimRotation OnUpdatePrimGroupRotation;
  122. public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
  123. public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition;
  124. public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
  125. public event UpdateVector OnUpdatePrimScale;
  126. public event UpdateVector OnUpdatePrimGroupScale;
  127. #pragma warning disable 67
  128. public event StatusChange OnChildAgentStatus;
  129. public event GenericMessage OnGenericMessage;
  130. public event BuyObjectInventory OnBuyObjectInventory;
  131. public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture;
  132. #pragma warning restore 67
  133. public event RequestMapBlocks OnRequestMapBlocks;
  134. public event RequestMapName OnMapNameRequest;
  135. public event TeleportLocationRequest OnTeleportLocationRequest;
  136. public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
  137. public event RequestAvatarProperties OnRequestAvatarProperties;
  138. public event SetAlwaysRun OnSetAlwaysRun;
  139. public event FetchInventory OnAgentDataUpdateRequest;
  140. public event TeleportLocationRequest OnSetStartLocationRequest;
  141. public event UpdateAvatarProperties OnUpdateAvatarProperties;
  142. public event CreateNewInventoryItem OnCreateNewInventoryItem;
  143. public event LinkInventoryItem OnLinkInventoryItem;
  144. public event CreateInventoryFolder OnCreateNewInventoryFolder;
  145. public event UpdateInventoryFolder OnUpdateInventoryFolder;
  146. public event MoveInventoryFolder OnMoveInventoryFolder;
  147. public event FetchInventoryDescendents OnFetchInventoryDescendents;
  148. public event PurgeInventoryDescendents OnPurgeInventoryDescendents;
  149. public event FetchInventory OnFetchInventory;
  150. public event RequestTaskInventory OnRequestTaskInventory;
  151. public event UpdateInventoryItem OnUpdateInventoryItem;
  152. public event ChangeInventoryItemFlags OnChangeInventoryItemFlags;
  153. public event CopyInventoryItem OnCopyInventoryItem;
  154. public event MoveInventoryItem OnMoveInventoryItem;
  155. public event RemoveInventoryItem OnRemoveInventoryItem;
  156. public event RemoveInventoryFolder OnRemoveInventoryFolder;
  157. public event UDPAssetUploadRequest OnAssetUploadRequest;
  158. public event XferReceive OnXferReceive;
  159. public event RequestXfer OnRequestXfer;
  160. public event ConfirmXfer OnConfirmXfer;
  161. public event AbortXfer OnAbortXfer;
  162. public event RequestTerrain OnRequestTerrain;
  163. public event RezScript OnRezScript;
  164. public event UpdateTaskInventory OnUpdateTaskInventory;
  165. public event MoveTaskInventory OnMoveTaskItem;
  166. public event RemoveTaskInventory OnRemoveTaskItem;
  167. public event UUIDNameRequest OnNameFromUUIDRequest;
  168. public event ParcelAccessListRequest OnParcelAccessListRequest;
  169. public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest;
  170. public event ParcelPropertiesRequest OnParcelPropertiesRequest;
  171. public event ParcelDivideRequest OnParcelDivideRequest;
  172. public event ParcelJoinRequest OnParcelJoinRequest;
  173. public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
  174. public event ParcelSelectObjects OnParcelSelectObjects;
  175. public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
  176. public event ParcelAbandonRequest OnParcelAbandonRequest;
  177. public event ParcelGodForceOwner OnParcelGodForceOwner;
  178. public event ParcelReclaim OnParcelReclaim;
  179. public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest;
  180. public event ParcelReturnObjectsRequest OnParcelDisableObjectsRequest;
  181. public event ParcelDeedToGroup OnParcelDeedToGroup;
  182. public event RegionInfoRequest OnRegionInfoRequest;
  183. public event EstateCovenantRequest OnEstateCovenantRequest;
  184. public event FriendActionDelegate OnApproveFriendRequest;
  185. public event FriendActionDelegate OnDenyFriendRequest;
  186. public event FriendshipTermination OnTerminateFriendship;
  187. public event GrantUserFriendRights OnGrantUserRights;
  188. public event MoneyTransferRequest OnMoneyTransferRequest;
  189. public event EconomyDataRequest OnEconomyDataRequest;
  190. public event MoneyBalanceRequest OnMoneyBalanceRequest;
  191. public event ParcelBuy OnParcelBuy;
  192. public event UUIDNameRequest OnTeleportHomeRequest;
  193. public event UUIDNameRequest OnUUIDGroupNameRequest;
  194. public event ScriptAnswer OnScriptAnswer;
  195. public event RequestPayPrice OnRequestPayPrice;
  196. public event ObjectSaleInfo OnObjectSaleInfo;
  197. public event ObjectBuy OnObjectBuy;
  198. public event AgentSit OnUndo;
  199. public event AgentSit OnRedo;
  200. public event LandUndo OnLandUndo;
  201. public event ForceReleaseControls OnForceReleaseControls;
  202. public event GodLandStatRequest OnLandStatRequest;
  203. public event RequestObjectPropertiesFamily OnObjectGroupRequest;
  204. public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
  205. public event SetEstateFlagsRequest OnSetEstateFlagsRequest;
  206. public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture;
  207. public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights;
  208. public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest;
  209. public event SetRegionTerrainSettings OnSetRegionTerrainSettings;
  210. public event BakeTerrain OnBakeTerrain;
  211. public event RequestTerrain OnUploadTerrain;
  212. public event EstateChangeInfo OnEstateChangeInfo;
  213. public event EstateRestartSimRequest OnEstateRestartSimRequest;
  214. public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
  215. public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
  216. public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest;
  217. public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest;
  218. public event EstateDebugRegionRequest OnEstateDebugRegionRequest;
  219. public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest;
  220. public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
  221. public event RegionHandleRequest OnRegionHandleRequest;
  222. public event ParcelInfoRequest OnParcelInfoRequest;
  223. public event ScriptReset OnScriptReset;
  224. public event GetScriptRunning OnGetScriptRunning;
  225. public event SetScriptRunning OnSetScriptRunning;
  226. public event UpdateVector OnAutoPilotGo;
  227. public event ActivateGesture OnActivateGesture;
  228. public event DeactivateGesture OnDeactivateGesture;
  229. public event ObjectOwner OnObjectOwner;
  230. public event DirPlacesQuery OnDirPlacesQuery;
  231. public event DirFindQuery OnDirFindQuery;
  232. public event DirLandQuery OnDirLandQuery;
  233. public event DirPopularQuery OnDirPopularQuery;
  234. public event DirClassifiedQuery OnDirClassifiedQuery;
  235. public event EventInfoRequest OnEventInfoRequest;
  236. public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
  237. public event MapItemRequest OnMapItemRequest;
  238. public event OfferCallingCard OnOfferCallingCard;
  239. public event AcceptCallingCard OnAcceptCallingCard;
  240. public event DeclineCallingCard OnDeclineCallingCard;
  241. public event SoundTrigger OnSoundTrigger;
  242. public event StartLure OnStartLure;
  243. public event TeleportLureRequest OnTeleportLureRequest;
  244. public event NetworkStats OnNetworkStatsUpdate;
  245. public event ClassifiedInfoRequest OnClassifiedInfoRequest;
  246. public event ClassifiedInfoUpdate OnClassifiedInfoUpdate;
  247. public event ClassifiedDelete OnClassifiedDelete;
  248. public event ClassifiedDelete OnClassifiedGodDelete;
  249. public event EventNotificationAddRequest OnEventNotificationAddRequest;
  250. public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest;
  251. public event EventGodDelete OnEventGodDelete;
  252. public event ParcelDwellRequest OnParcelDwellRequest;
  253. public event UserInfoRequest OnUserInfoRequest;
  254. public event UpdateUserInfo OnUpdateUserInfo;
  255. public event RetrieveInstantMessages OnRetrieveInstantMessages;
  256. public event PickDelete OnPickDelete;
  257. public event PickGodDelete OnPickGodDelete;
  258. public event PickInfoUpdate OnPickInfoUpdate;
  259. public event AvatarNotesUpdate OnAvatarNotesUpdate;
  260. public event MuteListRequest OnMuteListRequest;
  261. public event AvatarInterestUpdate OnAvatarInterestUpdate;
  262. public event PlacesQuery OnPlacesQuery;
  263. public event AgentFOV OnAgentFOV;
  264. public event FindAgentUpdate OnFindAgent;
  265. public event TrackAgentUpdate OnTrackAgent;
  266. public event NewUserReport OnUserReport;
  267. public event SaveStateHandler OnSaveState;
  268. public event GroupAccountSummaryRequest OnGroupAccountSummaryRequest;
  269. public event GroupAccountDetailsRequest OnGroupAccountDetailsRequest;
  270. public event GroupAccountTransactionsRequest OnGroupAccountTransactionsRequest;
  271. public event FreezeUserUpdate OnParcelFreezeUser;
  272. public event EjectUserUpdate OnParcelEjectUser;
  273. public event ParcelBuyPass OnParcelBuyPass;
  274. public event ParcelGodMark OnParcelGodMark;
  275. public event GroupActiveProposalsRequest OnGroupActiveProposalsRequest;
  276. public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest;
  277. public event SimWideDeletesDelegate OnSimWideDeletes;
  278. public event SendPostcard OnSendPostcard;
  279. public event TeleportCancel OnTeleportCancel;
  280. public event MuteListEntryUpdate OnUpdateMuteListEntry;
  281. public event MuteListEntryRemove OnRemoveMuteListEntry;
  282. public event GodlikeMessage OnGodlikeMessage;
  283. public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
  284. public event GodlikeMessage OnEstateTelehubRequest;
  285. public event ViewerStartAuction OnViewerStartAuction;
  286. public event GroupProposalBallotRequest OnGroupProposalBallotRequest;
  287. public event AgentCachedTextureRequest OnAgentCachedTextureRequest;
  288. #endregion Events
  289. #region Enums
  290. public enum TransferPacketStatus
  291. {
  292. MorePacketsToCome = 0,
  293. Done = 1,
  294. AssetSkip = 2,
  295. AssetAbort = 3,
  296. AssetRequestFailed = -1,
  297. AssetUnknownSource = -2, // Equivalent of a 404
  298. InsufficientPermissions = -3
  299. }
  300. #endregion
  301. #region Class Members
  302. // LLClientView Only
  303. public delegate void BinaryGenericMessage(Object sender, string method, byte[][] args);
  304. /// <summary>
  305. /// Used to adjust Sun Orbit values so Linden based viewers properly position sun
  306. /// </summary>
  307. private const float m_sunPainDaHalfOrbitalCutoff = 4.712388980384689858f;
  308. private static readonly Dictionary<PacketType, PacketMethod> PacketHandlers =
  309. new Dictionary<PacketType, PacketMethod>(); //Global/static handlers for all clients
  310. private readonly LLUDPServer m_udpServer;
  311. private readonly LLUDPClient m_udpClient;
  312. private readonly UUID m_sessionId;
  313. private readonly UUID m_secureSessionId;
  314. private readonly UUID m_agentId;
  315. private readonly uint m_circuitCode;
  316. private readonly byte[] m_channelVersion = Utils.EmptyBytes;
  317. private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>();
  318. private readonly IGroupsModule m_GroupsModule;
  319. private int m_cachedTextureSerial;
  320. /// <value>
  321. /// Maintain a record of all the objects killed. This allows us to stop an update being sent from the
  322. /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an
  323. /// ownerless phantom.
  324. /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock
  325. /// </value>
  326. //protected HashSet<uint> m_killRecord = new HashSet<uint>();
  327. // protected HashSet<uint> m_attachmentsSent;
  328. private int m_animationSequenceNumber = 1;
  329. private bool m_SendLogoutPacketWhenClosing = true;
  330. private AgentUpdateArgs lastarg;
  331. private bool m_IsActive = true;
  332. private readonly Dictionary<PacketType, PacketProcessor> m_packetHandlers =
  333. new Dictionary<PacketType, PacketProcessor>();
  334. private readonly Dictionary<string, GenericMessage> m_genericPacketHandlers =
  335. new Dictionary<string, GenericMessage>();
  336. //PauPaw:Local Generic Message handlers
  337. private readonly IScene m_scene;
  338. private readonly LLImageManager m_imageManager;
  339. private readonly string m_firstName;
  340. private readonly string m_lastName;
  341. private readonly string m_Name;
  342. private readonly EndPoint m_userEndPoint;
  343. private UUID m_activeGroupID;
  344. private string m_activeGroupName = String.Empty;
  345. private ulong m_activeGroupPowers;
  346. private uint m_agentFOVCounter;
  347. private readonly IAssetService m_assetService;
  348. // ReSharper disable ConvertToConstant.Local
  349. private bool m_checkPackets = true;
  350. // ReSharper restore ConvertToConstant.Local
  351. #endregion Class Members
  352. #region Properties
  353. public LLUDPClient UDPClient
  354. {
  355. get { return m_udpClient; }
  356. }
  357. public IPEndPoint RemoteEndPoint
  358. {
  359. get { return m_udpClient.RemoteEndPoint; }
  360. }
  361. public UUID SecureSessionId
  362. {
  363. get { return m_secureSessionId; }
  364. }
  365. public IScene Scene
  366. {
  367. get { return m_scene; }
  368. }
  369. public UUID SessionId
  370. {
  371. get { return m_sessionId; }
  372. }
  373. public Vector3 StartPos { get; set; }
  374. public UUID AgentId
  375. {
  376. get { return m_agentId; }
  377. }
  378. public UUID ScopeID { get; set; }
  379. public List<UUID> AllScopeIDs { get; set; }
  380. public UUID ActiveGroupId
  381. {
  382. get { return m_activeGroupID; }
  383. }
  384. public string ActiveGroupName
  385. {
  386. get { return m_activeGroupName; }
  387. }
  388. public ulong ActiveGroupPowers
  389. {
  390. get { return m_activeGroupPowers; }
  391. }
  392. /// <summary>
  393. /// First name of the agent/avatar represented by the client
  394. /// </summary>
  395. public string FirstName
  396. {
  397. get { return m_firstName; }
  398. }
  399. /// <summary>
  400. /// Last name of the agent/avatar represented by the client
  401. /// </summary>
  402. public string LastName
  403. {
  404. get { return m_lastName; }
  405. }
  406. /// <summary>
  407. /// Full name of the client (first name and last name)
  408. /// </summary>
  409. public string Name
  410. {
  411. get { return m_Name; }
  412. }
  413. public uint CircuitCode
  414. {
  415. get { return m_circuitCode; }
  416. }
  417. public int NextAnimationSequenceNumber
  418. {
  419. get { return m_animationSequenceNumber; }
  420. }
  421. public bool IsActive
  422. {
  423. get { return m_IsActive; }
  424. set { m_IsActive = value; }
  425. }
  426. public bool IsLoggingOut { get; set; }
  427. public bool SendLogoutPacketWhenClosing
  428. {
  429. set { m_SendLogoutPacketWhenClosing = value; }
  430. }
  431. #endregion Properties
  432. /// <summary>
  433. /// Constructor
  434. /// </summary>
  435. public LLClientView(EndPoint remoteEP, IScene scene, LLUDPServer udpServer, LLUDPClient udpClient,
  436. AgentCircuitData sessionInfo,
  437. UUID agentId, UUID sessionId, uint circuitCode)
  438. {
  439. InitDefaultAnimations();
  440. m_scene = scene;
  441. IConfig advancedConfig = m_scene.Config.Configs["ClientStack.LindenUDP"];
  442. if (advancedConfig != null)
  443. m_allowUDPInv = advancedConfig.GetBoolean("AllowUDPInventory", m_allowUDPInv);
  444. //m_killRecord = new HashSet<uint>();
  445. // m_attachmentsSent = new HashSet<uint>();
  446. m_assetService = m_scene.RequestModuleInterface<IAssetService>();
  447. m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
  448. m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
  449. ISimulationBase simulationBase = m_scene.RequestModuleInterface<ISimulationBase>();
  450. if (simulationBase != null)
  451. m_channelVersion = Util.StringToBytes256(simulationBase.Version);
  452. m_agentId = agentId;
  453. m_sessionId = sessionId;
  454. m_secureSessionId = sessionInfo.SecureSessionID;
  455. m_circuitCode = circuitCode;
  456. m_userEndPoint = remoteEP;
  457. UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.AllScopeIDs, m_agentId);
  458. if (account != null)
  459. {
  460. m_firstName = account.FirstName;
  461. m_lastName = account.LastName;
  462. m_Name = account.Name;
  463. }
  464. else
  465. {
  466. m_firstName = sessionInfo.firstname;
  467. m_lastName = sessionInfo.lastname;
  468. m_Name = sessionInfo.firstname + " " + sessionInfo.lastname;
  469. }
  470. StartPos = sessionInfo.startpos;
  471. m_udpServer = udpServer;
  472. m_udpClient = udpClient;
  473. m_udpClient.OnQueueEmpty += HandleQueueEmpty;
  474. m_udpClient.OnPacketStats += PopulateStats;
  475. RegisterLocalPacketHandlers();
  476. }
  477. public void Reset()
  478. {
  479. lastarg = null;
  480. //Reset the killObjectUpdate packet stats
  481. //m_killRecord = new HashSet<uint>();
  482. }
  483. public void SetDebugPacketLevel(int newDebug)
  484. {
  485. m_debugPacketLevel = newDebug;
  486. }
  487. #region Client Methods
  488. public void Stop()
  489. {
  490. // Send the STOP packet NOW, otherwise it doesn't get out in time
  491. DisableSimulatorPacket disable =
  492. (DisableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
  493. OutPacket(disable, ThrottleOutPacketType.Immediate);
  494. }
  495. /// <summary>
  496. /// Shut down the client view
  497. /// </summary>
  498. public void Close(bool forceClose)
  499. {
  500. //MainConsole.Instance.DebugFormat(
  501. // "[CLIENT]: Close has been called for {0} attached to scene {1}",
  502. // Name, m_scene.RegionInfo.RegionName);
  503. if (forceClose && !IsLoggingOut) //Don't send it to clients that are logging out
  504. {
  505. // Send the STOP packet NOW, otherwise it doesn't get out in time
  506. DisableSimulatorPacket disable =
  507. (DisableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
  508. OutPacket(disable, ThrottleOutPacketType.Immediate);
  509. }
  510. IsActive = false;
  511. // Shutdown the image manager
  512. if (m_imageManager != null)
  513. m_imageManager.Close();
  514. // Fire the callback for this connection closing
  515. if (OnConnectionClosed != null)
  516. OnConnectionClosed(this);
  517. // Flush all of the packets out of the UDP server for this client
  518. if (m_udpServer != null)
  519. {
  520. m_udpServer.Flush(m_udpClient);
  521. m_udpServer.RemoveClient(this);
  522. }
  523. // Disable UDP handling for this client
  524. m_udpClient.Shutdown();
  525. //MainConsole.Instance.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false));
  526. //GC.Collect();
  527. //MainConsole.Instance.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true));
  528. }
  529. public void Kick(string message)
  530. {
  531. if (!ChildAgentStatus())
  532. {
  533. KickUserPacket kupack = (KickUserPacket) PacketPool.Instance.GetPacket(PacketType.KickUser);
  534. kupack.UserInfo.AgentID = AgentId;
  535. kupack.UserInfo.SessionID = SessionId;
  536. kupack.TargetBlock.TargetIP = 0;
  537. kupack.TargetBlock.TargetPort = 0;
  538. kupack.UserInfo.Reason = Util.StringToBytes256(message);
  539. OutPacket(kupack, ThrottleOutPacketType.OutBand);
  540. // You must sleep here or users get no message!
  541. Thread.Sleep(500);
  542. }
  543. }
  544. #endregion Client Methods
  545. #region Packet Handling
  546. public void PopulateStats(int inPackets, int outPackets, int unAckedBytes)
  547. {
  548. NetworkStats handlerNetworkStatsUpdate = OnNetworkStatsUpdate;
  549. if (handlerNetworkStatsUpdate != null)
  550. {
  551. handlerNetworkStatsUpdate(inPackets, outPackets, unAckedBytes);
  552. }
  553. }
  554. public static bool AddPacketHandler(PacketType packetType, PacketMethod handler)
  555. {
  556. bool result = false;
  557. lock (PacketHandlers)
  558. {
  559. if (!PacketHandlers.ContainsKey(packetType))
  560. {
  561. PacketHandlers.Add(packetType, handler);
  562. result = true;
  563. }
  564. }
  565. return result;
  566. }
  567. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
  568. {
  569. return AddLocalPacketHandler(packetType, handler, true);
  570. }
  571. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler, bool runasync)
  572. {
  573. bool result = false;
  574. lock (m_packetHandlers)
  575. {
  576. if (!m_packetHandlers.ContainsKey(packetType))
  577. {
  578. m_packetHandlers.Add(packetType, new PacketProcessor {method = handler, Async = runasync});
  579. result = true;
  580. }
  581. }
  582. return result;
  583. }
  584. public bool AddGenericPacketHandler(string MethodName, GenericMessage handler)
  585. {
  586. MethodName = MethodName.ToLower().Trim();
  587. bool result = false;
  588. lock (m_genericPacketHandlers)
  589. {
  590. if (!m_genericPacketHandlers.ContainsKey(MethodName))
  591. {
  592. m_genericPacketHandlers.Add(MethodName, handler);
  593. result = true;
  594. }
  595. }
  596. return result;
  597. }
  598. public bool RemoveGenericPacketHandler(string MethodName)
  599. {
  600. MethodName = MethodName.ToLower().Trim();
  601. bool result = false;
  602. lock (m_genericPacketHandlers)
  603. {
  604. if (m_genericPacketHandlers.ContainsKey(MethodName))
  605. {
  606. m_genericPacketHandlers.Remove(MethodName);
  607. result = true;
  608. }
  609. }
  610. return result;
  611. }
  612. /// <summary>
  613. /// Try to process a packet using registered packet handlers
  614. /// </summary>
  615. /// <param name="packet"></param>
  616. /// <returns>True if a handler was found which successfully processed the packet.</returns>
  617. private bool ProcessPacketMethod(Packet packet)
  618. {
  619. bool result = false;
  620. PacketProcessor pprocessor;
  621. if (m_packetHandlers.TryGetValue(packet.Type, out pprocessor))
  622. {
  623. //there is a local handler for this packet type
  624. if (pprocessor.Async)
  625. {
  626. object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
  627. m_udpServer.FireAndForget(ProcessSpecificPacketAsync, obj);
  628. result = true;
  629. }
  630. else
  631. {
  632. result = pprocessor.method(this, packet);
  633. }
  634. }
  635. else
  636. {
  637. //there is not a local handler so see if there is a Global handler
  638. PacketMethod method = null;
  639. bool found;
  640. lock (PacketHandlers)
  641. {
  642. found = PacketHandlers.TryGetValue(packet.Type, out method);
  643. }
  644. if (found)
  645. {
  646. result = method(this, packet);
  647. }
  648. }
  649. return result;
  650. }
  651. public void ProcessSpecificPacketAsync(object state)
  652. {
  653. AsyncPacketProcess packetObject = (AsyncPacketProcess) state;
  654. try
  655. {
  656. packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack);
  657. }
  658. catch (Exception e)
  659. {
  660. // Make sure that we see any exception caused by the asynchronous operation.
  661. MainConsole.Instance.ErrorFormat(
  662. "[LLCLIENTVIEW]: Caught exception while processing {0} for {1}, {2} {3}",
  663. packetObject.Pack, Name, e.Message, e.StackTrace);
  664. }
  665. }
  666. #endregion Packet Handling
  667. #region Scene/Avatar to Client
  668. public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)
  669. {
  670. RegionHandshakePacket handshake =
  671. (RegionHandshakePacket) PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
  672. handshake.RegionInfo = new RegionHandshakePacket.RegionInfoBlock
  673. {
  674. BillableFactor = args.billableFactor,
  675. IsEstateManager = args.isEstateManager,
  676. TerrainHeightRange00 = args.terrainHeightRange0,
  677. TerrainHeightRange01 = args.terrainHeightRange1,
  678. TerrainHeightRange10 = args.terrainHeightRange2,
  679. TerrainHeightRange11 = args.terrainHeightRange3,
  680. TerrainStartHeight00 = args.terrainStartHeight0,
  681. TerrainStartHeight01 = args.terrainStartHeight1,
  682. TerrainStartHeight10 = args.terrainStartHeight2,
  683. TerrainStartHeight11 = args.terrainStartHeight3,
  684. SimAccess = args.simAccess,
  685. WaterHeight = args.waterHeight,
  686. RegionFlags = (uint) args.regionFlags,
  687. SimName = Util.StringToBytes256(args.regionName),
  688. SimOwner = args.SimOwner,
  689. TerrainBase0 = args.terrainBase0,
  690. TerrainBase1 = args.terrainBase1,
  691. TerrainBase2 = args.terrainBase2,
  692. TerrainBase3 = args.terrainBase3,
  693. TerrainDetail0 = args.terrainDetail0,
  694. TerrainDetail1 = args.terrainDetail1,
  695. TerrainDetail2 = args.terrainDetail2,
  696. TerrainDetail3 = args.terrainDetail3,
  697. CacheID = UUID.Random()
  698. };
  699. //I guess this is for the client to remember an old setting?
  700. handshake.RegionInfo2 = new RegionHandshakePacket.RegionInfo2Block {RegionID = regionInfo.RegionID};
  701. handshake.RegionInfo4 = new RegionHandshakePacket.RegionInfo4Block[1]
  702. {
  703. new RegionHandshakePacket.RegionInfo4Block
  704. {
  705. RegionFlagsExtended = args.regionFlags,
  706. RegionProtocols = (ulong) RegionProtocols.AgentAppearanceService
  707. }
  708. };
  709. handshake.RegionInfo3 = new RegionHandshakePacket.RegionInfo3Block
  710. {
  711. CPUClassID = 9,
  712. CPURatio = 1,
  713. ColoName = Utils.EmptyBytes,
  714. ProductName = Util.StringToBytes256(regionInfo.RegionType),
  715. ProductSKU = Utils.EmptyBytes
  716. };
  717. OutPacket(handshake, ThrottleOutPacketType.Task);
  718. }
  719. /// <summary>
  720. /// </summary>
  721. public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
  722. {
  723. AgentMovementCompletePacket mov =
  724. (AgentMovementCompletePacket) PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
  725. mov.SimData.ChannelVersion = m_channelVersion;
  726. mov.AgentData.SessionID = m_sessionId;
  727. mov.AgentData.AgentID = AgentId;
  728. mov.Data.RegionHandle = regInfo.RegionHandle;
  729. mov.Data.Timestamp = (uint) Util.UnixTimeSinceEpoch();
  730. mov.Data.Position = pos;
  731. mov.Data.LookAt = look;
  732. // Hack to get this out immediately and skip the throttles
  733. OutPacket(mov, ThrottleOutPacketType.OutBand);
  734. }
  735. public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName,
  736. UUID fromAgentID, byte source, byte audible)
  737. {
  738. ChatFromSimulatorPacket reply =
  739. (ChatFromSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
  740. reply.ChatData.Audible = audible;
  741. reply.ChatData.Message = Util.StringToBytes1024(message);
  742. reply.ChatData.ChatType = type;
  743. reply.ChatData.SourceType = source;
  744. reply.ChatData.Position = fromPos;
  745. reply.ChatData.FromName = Util.StringToBytes256(fromName);
  746. reply.ChatData.OwnerID = fromAgentID;
  747. reply.ChatData.SourceID = fromAgentID;
  748. //Don't split me up!
  749. reply.HasVariableBlocks = false;
  750. // Hack to get this out immediately and skip throttles
  751. OutPacket(reply, ThrottleOutPacketType.AvatarInfo);
  752. }
  753. public void SendTelehubInfo(Vector3 TelehubPos, Quaternion TelehubRot, List<Vector3> SpawnPoint, UUID ObjectID,
  754. string nameT)
  755. {
  756. TelehubInfoPacket packet = (TelehubInfoPacket) PacketPool.Instance.GetPacket(PacketType.TelehubInfo);
  757. packet.SpawnPointBlock = new TelehubInfoPacket.SpawnPointBlockBlock[SpawnPoint.Count];
  758. int i = 0;
  759. foreach (Vector3 pos in SpawnPoint)
  760. {
  761. packet.SpawnPointBlock[i] = new TelehubInfoPacket.SpawnPointBlockBlock {SpawnPointPos = pos};
  762. i++;
  763. }
  764. packet.TelehubBlock.ObjectID = ObjectID;
  765. packet.TelehubBlock.ObjectName = Utils.StringToBytes(nameT);
  766. packet.TelehubBlock.TelehubPos = TelehubPos;
  767. packet.TelehubBlock.TelehubRot = TelehubRot;
  768. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  769. }
  770. /// <summary>
  771. /// Send an instant message to this client
  772. /// </summary>
  773. //
  774. // Don't remove transaction ID! Groups and item gives need to set it!
  775. public void SendInstantMessage(GridInstantMessage im)
  776. {
  777. if (m_scene.Permissions.CanInstantMessage(im.fromAgentID, im.toAgentID))
  778. {
  779. ImprovedInstantMessagePacket msg
  780. = (ImprovedInstantMessagePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedInstantMessage);
  781. msg.AgentData.AgentID = im.fromAgentID;
  782. msg.AgentData.SessionID = UUID.Zero;
  783. msg.MessageBlock.FromAgentName = Util.StringToBytes256(im.fromAgentName);
  784. msg.MessageBlock.Dialog = im.dialog;
  785. msg.MessageBlock.FromGroup = im.fromGroup;
  786. if (im.imSessionID == UUID.Zero)
  787. msg.MessageBlock.ID = im.fromAgentID ^ im.toAgentID;
  788. else
  789. msg.MessageBlock.ID = im.imSessionID;
  790. msg.MessageBlock.Offline = im.offline;
  791. msg.MessageBlock.ParentEstateID = im.ParentEstateID;
  792. msg.MessageBlock.Position = im.Position;
  793. msg.MessageBlock.RegionID = im.RegionID;
  794. msg.MessageBlock.Timestamp = im.timestamp;
  795. msg.MessageBlock.ToAgentID = im.toAgentID;
  796. msg.MessageBlock.Message = Util.StringToBytes1024(im.message);
  797. msg.MessageBlock.BinaryBucket = im.binaryBucket;
  798. OutPacket(msg, ThrottleOutPacketType.AvatarInfo);
  799. }
  800. }
  801. public void SendGenericMessage(string method, List<string> message)
  802. {
  803. List<byte[]> convertedmessage =
  804. message.ConvertAll<byte[]>(delegate(string item) { return Util.StringToBytes256(item); });
  805. SendGenericMessage(method, convertedmessage);
  806. }
  807. public void SendGenericMessage(string method, List<byte[]> message)
  808. {
  809. GenericMessagePacket gmp = new GenericMessagePacket
  810. {
  811. MethodData = {Method = Util.StringToBytes256(method)},
  812. ParamList = new GenericMessagePacket.ParamListBlock[message.Count]
  813. };
  814. int i = 0;
  815. foreach (byte[] val in message)
  816. {
  817. gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock();
  818. gmp.ParamList[i++].Parameter = val;
  819. }
  820. OutPacket(gmp, ThrottleOutPacketType.AvatarInfo);
  821. }
  822. public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals)
  823. {
  824. GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket
  825. {
  826. AgentData = {AgentID = AgentId, GroupID = groupID},
  827. TransactionData =
  828. {
  829. TransactionID = transactionID,
  830. TotalNumItems = (uint) Proposals.Length
  831. },
  832. ProposalData =
  833. new GroupActiveProposalItemReplyPacket.
  834. ProposalDataBlock[Proposals.Length]
  835. };
  836. int i = 0;
  837. foreach (
  838. GroupActiveProposalItemReplyPacket.ProposalDataBlock ProposalData in
  839. Proposals.Select(Proposal => new GroupActiveProposalItemReplyPacket.ProposalDataBlock
  840. {
  841. VoteCast = Utils.StringToBytes("false"),
  842. VoteID = new UUID(Proposal.VoteID),
  843. VoteInitiator = new UUID(Proposal.VoteInitiator),
  844. Majority = Convert.ToInt32(Proposal.Majority),
  845. Quorum = Convert.ToInt32(Proposal.Quorum),
  846. TerseDateID = Utils.StringToBytes(Proposal.TerseDateID),
  847. StartDateTime = Utils.StringToBytes(Proposal.StartDateTime),
  848. EndDateTime = Utils.StringToBytes(Proposal.EndDateTime),
  849. ProposalText = Utils.StringToBytes(Proposal.ProposalText),
  850. AlreadyVoted = false
  851. }))
  852. {
  853. GAPIRP.ProposalData[i] = ProposalData;
  854. i++;
  855. }
  856. OutPacket(GAPIRP, ThrottleOutPacketType.AvatarInfo);
  857. }
  858. public void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory Vote,
  859. GroupVoteHistoryItem[] VoteItems)
  860. {
  861. GroupVoteHistoryItemReplyPacket GVHIRP = new GroupVoteHistoryItemReplyPacket
  862. {
  863. AgentData = {AgentID = AgentId, GroupID = groupID},
  864. TransactionData =
  865. {
  866. TransactionID = transactionID,
  867. TotalNumItems = (uint) VoteItems.Length
  868. },
  869. HistoryItemData =
  870. {
  871. VoteID = new UUID(Vote.VoteID),
  872. VoteInitiator = new UUID(Vote.VoteInitiator),
  873. Majority = Convert.ToInt32(Vote.Majority),
  874. Quorum = Convert.ToInt32(Vote.Quorum),
  875. TerseDateID = Utils.StringToBytes(Vote.TerseDateID),
  876. StartDateTime =
  877. Utils.StringToBytes(Vote.StartDateTime),
  878. EndDateTime = Utils.StringToBytes(Vote.EndDateTime),
  879. VoteType = Utils.StringToBytes(Vote.VoteType),
  880. VoteResult = Utils.StringToBytes(Vote.VoteResult),
  881. ProposalText =
  882. Utils.StringToBytes(Vote.ProposalText)
  883. }
  884. };
  885. int i = 0;
  886. GVHIRP.VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock[VoteItems.Length];
  887. foreach (
  888. GroupVoteHistoryItemReplyPacket.VoteItemBlock VoteItem in
  889. VoteItems.Select(item => new GroupVoteHistoryItemReplyPacket.VoteItemBlock
  890. {
  891. CandidateID = item.CandidateID,
  892. NumVotes = item.NumVotes,
  893. VoteCast = Utils.StringToBytes(item.VoteCast)
  894. }))
  895. {
  896. GVHIRP.VoteItem[i] = VoteItem;
  897. i++;
  898. }
  899. OutPacket(GVHIRP, ThrottleOutPacketType.AvatarInfo);
  900. }
  901. public void SendGroupAccountingDetails(IClientAPI sender, UUID groupID, UUID transactionID, UUID sessionID,
  902. int amt, int currentInterval, int interval, string startDate,
  903. GroupAccountHistory[] history)
  904. {
  905. GroupAccountDetailsReplyPacket GADRP = new GroupAccountDetailsReplyPacket
  906. {
  907. AgentData = new GroupAccountDetailsReplyPacket.AgentDataBlock
  908. {AgentID = sender.AgentId, GroupID = groupID},
  909. HistoryData =
  910. new GroupAccountDetailsReplyPacket.HistoryDataBlock[
  911. history.Length]
  912. };
  913. int i = 0;
  914. foreach (GroupAccountHistory h in history)
  915. {
  916. GroupAccountDetailsReplyPacket.HistoryDataBlock History =
  917. new GroupAccountDetailsReplyPacket.HistoryDataBlock();
  918. History.Amount = h.Amount;
  919. History.Description = Utils.StringToBytes(h.Description);
  920. GADRP.HistoryData[i++] = History;
  921. }
  922. GADRP.MoneyData = new GroupAccountDetailsReplyPacket.MoneyDataBlock
  923. {
  924. CurrentInterval = currentInterval,
  925. IntervalDays = interval,
  926. RequestID = transactionID,
  927. StartDate = Utils.StringToBytes(startDate)
  928. };
  929. OutPacket(GADRP, ThrottleOutPacketType.AvatarInfo);
  930. }
  931. public void SendGroupAccountingSummary(IClientAPI sender, UUID groupID, UUID requestID, int moneyAmt,
  932. int totalTierDebit,
  933. int totalTierCredits, string startDate, int currentInterval,
  934. int intervalLength,
  935. string taxDate, string lastTaxDate, int parcelDirectoryFee,
  936. int landTaxFee, int groupTaxFee, int objectTaxFee)
  937. {
  938. GroupAccountSummaryReplyPacket GASRP =
  939. (GroupAccountSummaryReplyPacket) PacketPool.Instance.GetPacket(
  940. PacketType.GroupAccountSummaryReply);
  941. GASRP.AgentData = new GroupAccountSummaryReplyPacket.AgentDataBlock
  942. {AgentID = sender.AgentId, GroupID = groupID};
  943. GASRP.MoneyData = new GroupAccountSummaryReplyPacket.MoneyDataBlock
  944. {
  945. Balance = moneyAmt,
  946. TotalCredits = totalTierCredits,
  947. TotalDebits = totalTierDebit,
  948. StartDate = Utils.StringToBytes(startDate + '\n'),
  949. CurrentInterval = currentInterval,
  950. GroupTaxCurrent = groupTaxFee,
  951. GroupTaxEstimate = groupTaxFee,
  952. IntervalDays = intervalLength,
  953. LandTaxCurrent = landTaxFee,
  954. LandTaxEstimate = landTaxFee,
  955. LastTaxDate = Utils.StringToBytes(lastTaxDate),
  956. LightTaxCurrent = 0,
  957. TaxDate = Utils.StringToBytes(taxDate),
  958. RequestID = requestID,
  959. ParcelDirFeeEstimate = parcelDirectoryFee,
  960. ParcelDirFeeCurrent = parcelDirectoryFee,
  961. ObjectTaxEstimate = objectTaxFee,
  962. NonExemptMembers = 0,
  963. ObjectTaxCurrent = objectTaxFee,
  964. LightTaxEstimate = 0
  965. };
  966. OutPacket(GASRP, ThrottleOutPacketType.Asset);
  967. }
  968. public void SendGroupTransactionsSummaryDetails(IClientAPI sender, UUID groupID, UUID transactionID,
  969. UUID sessionID, int currentInterval, int intervalDays,
  970. string startingDate, GroupAccountHistory[] history)
  971. {
  972. GroupAccountTransactionsReplyPacket GATRP =
  973. (GroupAccountTransactionsReplyPacket) PacketPool.Instance.GetPacket(
  974. PacketType.GroupAccountTransactionsReply);
  975. GATRP.AgentData = new GroupAccountTransactionsReplyPacket.AgentDataBlock
  976. {AgentID = sender.AgentId, GroupID = groupID};
  977. GATRP.MoneyData = new GroupAccountTransactionsReplyPacket.MoneyDataBlock
  978. {
  979. CurrentInterval = currentInterval,
  980. IntervalDays = intervalDays,
  981. RequestID = transactionID,
  982. StartDate = Utils.StringToBytes(startingDate)
  983. };
  984. GATRP.HistoryData = new GroupAccountTransactionsReplyPacket.HistoryDataBlock[history.Length];
  985. int i = 0;
  986. foreach (GroupAccountHistory h in history)
  987. {
  988. GroupAccountTransactionsReplyPacket.HistoryDataBlock History =
  989. new GroupAccountTransactionsReplyPacket.HistoryDataBlock
  990. {
  991. Amount = h.Amount,
  992. Item = Utils.StringToBytes(h.Description),
  993. Time = Utils.StringToBytes(h.TimeString),
  994. Type = 0,
  995. User = Utils.StringToBytes(h.UserCausingCharge)
  996. };
  997. GATRP.HistoryData[i++] = History;
  998. }
  999. OutPacket(GATRP, ThrottleOutPacketType.Asset);
  1000. }
  1001. /// <summary>
  1002. /// Send the region heightmap to the client
  1003. /// </summary>
  1004. /// <param name="map">heightmap</param>
  1005. public void SendLayerData(short[] map)
  1006. {
  1007. DoSendLayerData(map);
  1008. m_udpServer.FireAndForget(DoSendLayerData, map);
  1009. }
  1010. /// <summary>
  1011. /// Send terrain layer information to the client.
  1012. /// </summary>
  1013. /// <param name="o"></param>
  1014. private void DoSendLayerData(object o)
  1015. {
  1016. short[] map = (short[]) o;
  1017. try
  1018. {
  1019. for (int y = 0; y < m_scene.RegionInfo.RegionSizeY/Constants.TerrainPatchSize; y++)
  1020. {
  1021. for (int x = 0; x < m_scene.RegionInfo.RegionSizeX/Constants.TerrainPatchSize; x += 4)
  1022. {
  1023. SendLayerPacket(map, y, x);
  1024. //Thread.Sleep(35);
  1025. }
  1026. }
  1027. }
  1028. catch (Exception e)
  1029. {
  1030. MainConsole.Instance.Warn("[CLIENT]: ClientView.API.cs: SendLayerData() - Failed with exception " + e);
  1031. }
  1032. }
  1033. /// <summary>
  1034. /// Sends a set of four patches (x, x+1, ..., x+3) to the client
  1035. /// </summary>
  1036. /// <param name="map">heightmap</param>
  1037. /// <param name="x">X coordinate for patches 0..12</param>
  1038. /// <param name="y">Y coordinate for patches 0..15</param>
  1039. public void SendLayerPacket(short[] map, int y, int x)
  1040. {
  1041. int[] xs = new[] {x + 0, x + 1, x + 2, x + 3};
  1042. int[] ys = new[] {y, y, y, y};
  1043. try
  1044. {
  1045. byte type = (byte) TerrainPatch.LayerType.Land;
  1046. if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize ||
  1047. m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
  1048. {
  1049. type++;
  1050. }
  1051. LayerDataPacket layerpack = AuroraTerrainCompressor.CreateLandPacket(map, xs, ys, type,
  1052. m_scene.RegionInfo.RegionSizeX,
  1053. m_scene.RegionInfo.RegionSizeY);
  1054. layerpack.Header.Zerocoded = true;
  1055. layerpack.Header.Reliable = true;
  1056. if (layerpack.Length > 1000) // Oversize packet was created
  1057. {
  1058. for (int xa = 0; xa < 4; xa++)
  1059. {
  1060. // Send oversize packet in individual patches
  1061. //
  1062. SendLayerData(x + xa, y, map);
  1063. }
  1064. }
  1065. else
  1066. {
  1067. OutPacket(layerpack, ThrottleOutPacketType.Land);
  1068. }
  1069. }
  1070. catch (OverflowException)
  1071. {
  1072. for (int xa = 0; xa < 4; xa++)
  1073. {
  1074. // Send oversize packet in individual patches
  1075. //
  1076. SendLayerData(x + xa, y, map);
  1077. }
  1078. }
  1079. catch (IndexOutOfRangeException)
  1080. {
  1081. for (int xa = 0; xa < 4; xa++)
  1082. {
  1083. // Bad terrain, send individual chunks
  1084. //
  1085. SendLayerData(x + xa, y, map);
  1086. }
  1087. }
  1088. }
  1089. /// <summary>
  1090. /// Sends a specified patch to a client
  1091. /// </summary>
  1092. /// <param name="px">Patch coordinate (x) 0..regionSize/16</param>
  1093. /// <param name="py">Patch coordinate (y) 0..regionSize/16</param>
  1094. /// <param name="map">heightmap</param>
  1095. public void SendLayerData(int px, int py, short[] map)
  1096. {
  1097. try
  1098. {
  1099. int[] x = new[] {px};
  1100. int[] y = new[] {py};
  1101. byte type = (byte) TerrainPatch.LayerType.Land;
  1102. if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize ||
  1103. m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
  1104. {
  1105. type++;
  1106. }
  1107. LayerDataPacket layerpack = AuroraTerrainCompressor.CreateLandPacket(map, x, y, type,
  1108. m_scene.RegionInfo.RegionSizeX,
  1109. m_scene.RegionInfo.RegionSizeY);
  1110. OutPacket(layerpack, ThrottleOutPacketType.Land);
  1111. }
  1112. catch (Exception e)
  1113. {
  1114. MainConsole.Instance.ErrorFormat("[CLIENT]: SendLayerData() Failed with exception: " + e.ToString());
  1115. }
  1116. }
  1117. /// <summary>
  1118. /// Sends a specified patch to a client
  1119. /// </summary>
  1120. /// <param name="x">Patch coordinates (x) 0..regionSize/16</param>
  1121. /// <param name="y">Patch coordinates (y) 0..regionSize/16</param>
  1122. /// <param name="map">heightmap</param>
  1123. /// <param name="layertype"></param>
  1124. public void SendLayerData(int[] x, int[] y, short[] map, TerrainPatch.LayerType layertype)
  1125. {
  1126. const int MaxPatches = 10;
  1127. byte type = (byte) layertype;
  1128. if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize ||
  1129. m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
  1130. {
  1131. if (layertype == TerrainPatch.LayerType.Land || layertype == TerrainPatch.LayerType.Water)
  1132. type++;
  1133. else
  1134. type += 2;
  1135. }
  1136. //Only send 10 at a time
  1137. for (int i = 0; i < x.Length; i += MaxPatches)
  1138. {
  1139. int Size = (x.Length - i) - 10 > 0 ? 10 : (x.Length - i);
  1140. try
  1141. {
  1142. //Find the size for the array
  1143. int[] xTemp = new int[Size];
  1144. int[] yTemp = new int[Size];
  1145. //Copy the arrays
  1146. Array.Copy(x, i, xTemp, 0, Size);
  1147. Array.Copy(y, i, yTemp, 0, Size);
  1148. //Build the packet
  1149. LayerDataPacket layerpack = AuroraTerrainCompressor.CreateLandPacket(map, xTemp, yTemp, type,
  1150. m_scene.RegionInfo.RegionSizeX,
  1151. m_scene.RegionInfo.RegionSizeY);
  1152. layerpack.Header.Zerocoded = true;
  1153. layerpack.Header.Reliable = true;
  1154. if (layerpack.Length > 1000) // Oversize packet was created
  1155. {
  1156. for (int xa = 0; xa < Size; xa++)
  1157. {
  1158. // Send oversize packet in individual patches
  1159. //
  1160. SendLayerData(x[i + xa], y[i + xa], map);
  1161. }
  1162. }
  1163. else
  1164. {
  1165. OutPacket(layerpack, ThrottleOutPacketType.Land);
  1166. }
  1167. }
  1168. catch (OverflowException)
  1169. {
  1170. for (int xa = 0; xa < Size; xa++)
  1171. {
  1172. // Send oversize packet in individual patches
  1173. //
  1174. SendLayerData(x[i + xa], y[i + xa], map);
  1175. }
  1176. }
  1177. catch (IndexOutOfRangeException)
  1178. {
  1179. for (int xa = 0; xa < Size; xa++)
  1180. {
  1181. // Bad terrain, send individual chunks
  1182. //
  1183. SendLayerData(x[i + xa], y[i + xa], map);
  1184. }
  1185. }
  1186. }
  1187. }
  1188. /// <summary>
  1189. /// Send the wind matrix to the client
  1190. /// </summary>
  1191. /// <param name="windSpeeds">16x16 array of wind speeds</param>
  1192. public void SendWindData(Vector2[] windSpeeds)
  1193. {
  1194. m_udpServer.FireAndForget(DoSendWindData, windSpeeds);
  1195. }
  1196. /// <summary>
  1197. /// Send the cloud matrix to the client
  1198. /// </summary>
  1199. /// <param name="cloudDensity">16x16 array of cloud densities</param>
  1200. public void SendCloudData(float[] cloudDensity)
  1201. {
  1202. m_udpServer.FireAndForget(DoSendCloudData, cloudDensity);
  1203. }
  1204. /// <summary>
  1205. /// Send wind layer information to the client.
  1206. /// </summary>
  1207. /// <param name="o"></param>
  1208. private void DoSendWindData(object o)
  1209. {
  1210. Vector2[] windSpeeds = (Vector2[]) o;
  1211. TerrainPatch[] patches = new TerrainPatch[2];
  1212. patches[0] = new TerrainPatch {Data = new float[16*16]};
  1213. patches[1] = new TerrainPatch {Data = new float[16*16]};
  1214. // for (int y = 0; y < 16*16; y+=16)
  1215. // {
  1216. for (int x = 0; x < 16*16; x++)
  1217. {
  1218. patches[0].Data[x] = windSpeeds[x].X;
  1219. patches[1].Data[x] = windSpeeds[x].Y;
  1220. }
  1221. // }
  1222. byte type = (byte) TerrainPatch.LayerType.Wind;
  1223. if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize ||
  1224. m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
  1225. {
  1226. type += 2;
  1227. }
  1228. LayerDataPacket layerpack = AuroraTerrainCompressor.CreateLayerDataPacket(patches, type,
  1229. m_scene.RegionInfo.RegionSizeX,
  1230. m_scene.RegionInfo.RegionSizeY);
  1231. layerpack.Header.Zerocoded = true;
  1232. OutPacket(layerpack, ThrottleOutPacketType.Wind);
  1233. }
  1234. /// <summary>
  1235. /// Send cloud layer information to the client.
  1236. /// </summary>
  1237. /// <param name="o"></param>
  1238. private void DoSendCloudData(object o)
  1239. {
  1240. float[] cloudCover = (float[]) o;
  1241. TerrainPatch[] patches = new TerrainPatch[1];
  1242. patches[0] = new TerrainPatch {Data = new float[16*16]};
  1243. // for (int y = 0; y < 16*16; y+=16)
  1244. {
  1245. for (int x = 0; x < 16*16; x++)
  1246. {
  1247. patches[0].Data[x] = cloudCover[x];
  1248. }
  1249. }
  1250. byte type = (byte) TerrainPatch.LayerType.Cloud;
  1251. if (m_scene.RegionInfo.RegionSizeX > Constants.RegionSize ||
  1252. m_scene.RegionInfo.RegionSizeY > Constants.RegionSize)
  1253. {
  1254. type += 2;
  1255. }
  1256. LayerDataPacket layerpack = AuroraTerrainCompressor.CreateLayerDataPacket(patches, type,
  1257. m_scene.RegionInfo.RegionSizeX,
  1258. m_scene.RegionInfo.RegionSizeY);
  1259. layerpack.Header.Zerocoded = true;
  1260. OutPacket(layerpack, ThrottleOutPacketType.Cloud);
  1261. }
  1262. public AgentCircuitData RequestClientInfo()
  1263. {
  1264. AgentCircuitData agentData = new AgentCircuitData
  1265. {
  1266. AgentID = AgentId,
  1267. SessionID = m_sessionId,
  1268. SecureSessionID = SecureSessionId,
  1269. circuitcode = m_circuitCode,
  1270. child = false
  1271. };
  1272. AgentCircuitData currentAgentCircuit = this.m_udpServer.m_circuitManager.GetAgentCircuitData(CircuitCode);
  1273. if (currentAgentCircuit != null)
  1274. {
  1275. agentData.IPAddress = currentAgentCircuit.IPAddress;
  1276. agentData.ServiceURLs = currentAgentCircuit.ServiceURLs;
  1277. }
  1278. return agentData;
  1279. }
  1280. internal void SendMapBlockSplit(List<MapBlockData> mapBlocks, uint flag)
  1281. {
  1282. MapBlockReplyPacket mapReply = (MapBlockReplyPacket) PacketPool.Instance.GetPacket(PacketType.MapBlockReply);
  1283. // TODO: don't create new blocks if recycling an old packet
  1284. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1285. mapReply.AgentData.AgentID = AgentId;
  1286. mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks2.Length];
  1287. mapReply.Size = new MapBlockReplyPacket.SizeBlock[mapBlocks2.Length];
  1288. mapReply.AgentData.Flags = flag;
  1289. for (int i = 0; i < mapBlocks2.Length; i++)
  1290. {
  1291. mapReply.Data[i] = new MapBlockReplyPacket.DataBlock
  1292. {MapImageID = mapBlocks2[i].MapImageID, X = mapBlocks2[i].X, Y = mapBlocks2[i].Y};
  1293. mapReply.Size[i] = new MapBlockReplyPacket.SizeBlock
  1294. {SizeX = mapBlocks2[i].SizeX, SizeY = mapBlocks2[i].SizeY};
  1295. mapReply.Data[i].WaterHeight = mapBlocks2[i].WaterHeight;
  1296. mapReply.Data[i].Name = Utils.StringToBytes(mapBlocks2[i].Name);
  1297. mapReply.Data[i].RegionFlags = mapBlocks2[i].RegionFlags;
  1298. mapReply.Data[i].Access = mapBlocks2[i].Access;
  1299. mapReply.Data[i].Agents = mapBlocks2[i].Agents;
  1300. }
  1301. OutPacket(mapReply, ThrottleOutPacketType.Land);
  1302. }
  1303. public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
  1304. {
  1305. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1306. const int maxsend = 10;
  1307. //int packets = Math.Ceiling(mapBlocks2.Length / maxsend);
  1308. List<MapBlockData> sendingBlocks = new List<MapBlockData>();
  1309. for (int i = 0; i < mapBlocks2.Length; i++)
  1310. {
  1311. sendingBlocks.Add(mapBlocks2[i]);
  1312. if (((i + 1) == mapBlocks2.Length) || (((i + 1)%maxsend) == 0))
  1313. {
  1314. SendMapBlockSplit(sendingBlocks, flag);
  1315. sendingBlocks = new List<MapBlockData>();
  1316. }
  1317. }
  1318. }
  1319. public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
  1320. {
  1321. TeleportLocalPacket tpLocal = (TeleportLocalPacket) PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
  1322. tpLocal.Info.AgentID = AgentId;
  1323. tpLocal.Info.TeleportFlags = flags;
  1324. tpLocal.Info.LocationID = 2;
  1325. tpLocal.Info.LookAt = lookAt;
  1326. tpLocal.Info.Position = position;
  1327. // Hack to get this out immediately and skip throttles
  1328. OutPacket(tpLocal, ThrottleOutPacketType.OutBand);
  1329. }
  1330. public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint,
  1331. uint locationID,
  1332. uint flags, string capsURL)
  1333. {
  1334. //TeleportFinishPacket teleport = (TeleportFinishPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
  1335. TeleportFinishPacket teleport = new TeleportFinishPacket
  1336. {
  1337. Info =
  1338. {
  1339. AgentID = AgentId,
  1340. RegionHandle = regionHandle,
  1341. SimAccess = simAccess,
  1342. SeedCapability = Util.StringToBytes256(capsURL)
  1343. }
  1344. };
  1345. IPAddress oIP = newRegionEndPoint.Address;
  1346. byte[] byteIP = oIP.GetAddressBytes();
  1347. uint ip = (uint) byteIP[3] << 24;
  1348. ip += (uint) byteIP[2] << 16;
  1349. ip += (uint) byteIP[1] << 8;
  1350. ip += byteIP[0];
  1351. teleport.Info.SimIP = ip;
  1352. teleport.Info.SimPort = (ushort) newRegionEndPoint.Port;
  1353. teleport.Info.LocationID = 4;
  1354. teleport.Info.TeleportFlags = 1 << 4;
  1355. // Hack to get this out immediately and skip throttles.
  1356. OutPacket(teleport, ThrottleOutPacketType.OutBand);
  1357. }
  1358. /// <summary>
  1359. /// Inform the client that a teleport attempt has failed
  1360. /// </summary>
  1361. public void SendTeleportFailed(string reason)
  1362. {
  1363. TeleportFailedPacket tpFailed =
  1364. (TeleportFailedPacket) PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
  1365. tpFailed.Info.AgentID = AgentId;
  1366. tpFailed.Info.Reason = Util.StringToBytes256(reason);
  1367. tpFailed.AlertInfo = new TeleportFailedPacket.AlertInfoBlock[0];
  1368. // Hack to get this out immediately and skip throttles
  1369. OutPacket(tpFailed, ThrottleOutPacketType.OutBand);
  1370. }
  1371. /// <summary>
  1372. /// </summary>
  1373. public void SendTeleportStart(uint flags)
  1374. {
  1375. TeleportStartPacket tpStart = (TeleportStartPacket) PacketPool.Instance.GetPacket(PacketType.TeleportStart);
  1376. //TeleportStartPacket tpStart = new TeleportStartPacket();
  1377. tpStart.Info.TeleportFlags = flags; //16; // Teleport via location
  1378. // Hack to get this out immediately and skip throttles
  1379. OutPacket(tpStart, ThrottleOutPacketType.OutBand);
  1380. }
  1381. public void SendTeleportProgress(uint flags, string message)
  1382. {
  1383. TeleportProgressPacket tpProgress =
  1384. (TeleportProgressPacket) PacketPool.Instance.GetPacket(PacketType.TeleportProgress);
  1385. tpProgress.AgentData.AgentID = AgentId;
  1386. tpProgress.Info.TeleportFlags = flags;
  1387. tpProgress.Info.Message = Util.StringToBytes256(message);
  1388. // Hack to get this out immediately and skip throttles
  1389. OutPacket(tpProgress, ThrottleOutPacketType.OutBand);
  1390. }
  1391. public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance)
  1392. {
  1393. MoneyBalanceReplyPacket money =
  1394. (MoneyBalanceReplyPacket) PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
  1395. money.MoneyData.AgentID = AgentId;
  1396. money.MoneyData.TransactionID = transaction;
  1397. money.MoneyData.TransactionSuccess = success;
  1398. money.MoneyData.Description = description;
  1399. money.MoneyData.MoneyBalance = balance;
  1400. money.TransactionInfo.ItemDescription = Util.StringToBytes256("NONE");
  1401. OutPacket(money, ThrottleOutPacketType.AvatarInfo);
  1402. }
  1403. public void SendPayPrice(UUID objectID, int[] payPrice)
  1404. {
  1405. if (payPrice[0] == 0 &&
  1406. payPrice[1] == 0 &&
  1407. payPrice[2] == 0 &&
  1408. payPrice[3] == 0 &&
  1409. payPrice[4] == 0)
  1410. return;
  1411. PayPriceReplyPacket payPriceReply =
  1412. (PayPriceReplyPacket) PacketPool.Instance.GetPacket(PacketType.PayPriceReply);
  1413. payPriceReply.ObjectData.ObjectID = objectID;
  1414. payPriceReply.ObjectData.DefaultPayPrice = payPrice[0];
  1415. payPriceReply.ButtonData = new PayPriceReplyPacket.ButtonDataBlock[4];
  1416. payPriceReply.ButtonData[0] = new PayPriceReplyPacket.ButtonDataBlock {PayButton = payPrice[1]};
  1417. payPriceReply.ButtonData[1] = new PayPriceReplyPacket.ButtonDataBlock {PayButton = payPrice[2]};
  1418. payPriceReply.ButtonData[2] = new PayPriceReplyPacket.ButtonDataBlock {PayButton = payPrice[3]};
  1419. payPriceReply.ButtonData[3] = new PayPriceReplyPacket.ButtonDataBlock {PayButton = payPrice[4]};
  1420. OutPacket(payPriceReply, ThrottleOutPacketType.AvatarInfo);
  1421. }
  1422. public void SendPlacesQuery(ExtendedLandData[] LandData, UUID queryID, UUID transactionID)
  1423. {
  1424. PlacesReplyPacket PlacesReply = new PlacesReplyPacket();
  1425. PlacesReplyPacket.QueryDataBlock[] Query = new PlacesReplyPacket.QueryDataBlock[LandData.Length];
  1426. //Note: Nothing is ever done with this?????
  1427. int totalarea = 0;
  1428. List<string> RegionTypes = new List<string>();
  1429. for (int i = 0; i < LandData.Length; i++)
  1430. {
  1431. PlacesReplyPacket.QueryDataBlock QueryBlock = new PlacesReplyPacket.QueryDataBlock
  1432. {
  1433. ActualArea = LandData[i].LandData.Area,
  1434. BillableArea = LandData[i].LandData.Area,
  1435. Desc =
  1436. Utils.StringToBytes(
  1437. LandData[i].LandData.Description),
  1438. Dwell = LandData[i].LandData.Dwell,
  1439. Flags = 0,
  1440. GlobalX = LandData[i].GlobalPosX,
  1441. GlobalY = LandData[i].GlobalPosY,
  1442. GlobalZ = 0,
  1443. Name =
  1444. Utils.StringToBytes(LandData[i].LandData.Name),
  1445. OwnerID = LandData[i].LandData.OwnerID,
  1446. Price = LandData[i].LandData.SalePrice,
  1447. SimName =
  1448. Utils.StringToBytes(LandData[i].RegionName),
  1449. SnapshotID = LandData[i].LandData.SnapshotID
  1450. };
  1451. Query[i] = QueryBlock;
  1452. totalarea += LandData[i].LandData.Area;
  1453. RegionTypes.Add(LandData[i].RegionType);
  1454. }
  1455. PlacesReply.QueryData = Query;
  1456. PlacesReply.AgentData = new PlacesReplyPacket.AgentDataBlock {AgentID = AgentId, QueryID = queryID};
  1457. PlacesReply.TransactionData.TransactionID = transactionID;
  1458. try
  1459. {
  1460. OutPacket(PlacesReply, ThrottleOutPacketType.AvatarInfo);
  1461. //Disabled for now... it doesn't seem to work right...
  1462. /*IEventQueueService eq = Scene.RequestModuleInterface<IEventQueueService>();
  1463. if (eq != null)
  1464. {
  1465. eq.QueryReply(PlacesReply, AgentId, RegionTypes.ToArray(), Scene.RegionInfo.RegionHandle);
  1466. }*/
  1467. }
  1468. catch (Exception ex)
  1469. {
  1470. MainConsole.Instance.Error("Unable to send group membership data via eventqueue - exception: " + ex);
  1471. MainConsole.Instance.Warn("sending places query data via UDP");
  1472. OutPacket(PlacesReply, ThrottleOutPacketType.AvatarInfo);
  1473. }
  1474. }
  1475. public void SendStartPingCheck(byte seq)
  1476. {
  1477. StartPingCheckPacket pc = (StartPingCheckPacket) PacketPool.Instance.GetPacket(PacketType.StartPingCheck);
  1478. pc.Header.Reliable = false;
  1479. pc.PingID.PingID = seq;
  1480. // We *could* get OldestUnacked, but it would hurt performance and not provide any benefit
  1481. pc.PingID.OldestUnacked = 0;
  1482. OutPacket(pc, ThrottleOutPacketType.OutBand);
  1483. }
  1484. public void SendKillObject(ulong regionHandle, IEntity[] entities)
  1485. {
  1486. if (entities.Length == 0)
  1487. return; //........... why!
  1488. // MainConsole.Instance.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle);
  1489. KillObjectPacket kill = (KillObjectPacket) PacketPool.Instance.GetPacket(PacketType.KillObject);
  1490. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[entities.Length];
  1491. int i = 0;
  1492. bool brokenUpdate = false;
  1493. foreach (IEntity entity in entities)
  1494. {
  1495. if (entity == null)
  1496. {
  1497. brokenUpdate = true;
  1498. continue;
  1499. }
  1500. /*if ((entity is SceneObjectPart &&
  1501. ((SceneObjectPart)entity).IsAttachment) ||
  1502. (entity is SceneObjectGroup &&
  1503. ((SceneObjectGroup)entity).RootPart.IsAttachment))
  1504. {
  1505. // Do nothing
  1506. }
  1507. else if(entity is SceneObjectPart)
  1508. m_killRecord.Add(entity.LocalId);*/
  1509. KillObjectPacket.ObjectDataBlock block = new KillObjectPacket.ObjectDataBlock {ID = entity.LocalId};
  1510. kill.ObjectData[i] = block;
  1511. i++;
  1512. }
  1513. //If the # of entities is not correct, we have to rebuild the entire packet
  1514. if (brokenUpdate)
  1515. {
  1516. int count = kill.ObjectData.Count(block => block != null);
  1517. i = 0;
  1518. KillObjectPacket.ObjectDataBlock[] bk = new KillObjectPacket.ObjectDataBlock[count];
  1519. foreach (KillObjectPacket.ObjectDataBlock block in kill.ObjectData.Where(block => block != null))
  1520. {
  1521. bk[i] = block;
  1522. i++;
  1523. }
  1524. kill.ObjectData = bk;
  1525. }
  1526. kill.Header.Reliable = true;
  1527. kill.Header.Zerocoded = true;
  1528. OutPacket(kill, ThrottleOutPacketType.Task);
  1529. }
  1530. public void SendKillObject(ulong regionHandle, uint[] entities)
  1531. {
  1532. if (entities.Length == 0)
  1533. return; //........... why!
  1534. // MainConsole.Instance.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle);
  1535. KillObjectPacket kill = (KillObjectPacket) PacketPool.Instance.GetPacket(PacketType.KillObject);
  1536. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[entities.Length];
  1537. int i = 0;
  1538. foreach (
  1539. KillObjectPacket.ObjectDataBlock block in
  1540. entities.Select(entity => new KillObjectPacket.ObjectDataBlock {ID = entity}))
  1541. {
  1542. kill.ObjectData[i] = block;
  1543. i++;
  1544. }
  1545. kill.Header.Reliable = true;
  1546. kill.Header.Zerocoded = true;
  1547. OutPacket(kill, ThrottleOutPacketType.Task);
  1548. }
  1549. /// <summary>
  1550. /// Send information about the items contained in a folder to the client.
  1551. /// XXX This method needs some refactoring loving
  1552. /// </summary>
  1553. /// <param name="ownerID">The owner of the folder</param>
  1554. /// <param name="folderID">The id of the folder</param>
  1555. /// <param name="items">The items contained in the folder identified by folderID</param>
  1556. /// <param name="folders"></param>
  1557. /// <param name="version"></param>
  1558. /// <param name="fetchFolders">Do we need to send folder information?</param>
  1559. /// <param name="fetchItems">Do we need to send item information?</param>
  1560. public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
  1561. List<InventoryFolderBase> folders, int version,
  1562. bool fetchFolders, bool fetchItems)
  1563. {
  1564. // An inventory descendents packet consists of a single agent section and an inventory details
  1565. // section for each inventory item. The size of each inventory item is approximately 550 bytes.
  1566. // In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent
  1567. // packets containing metadata for in excess of 100 items. But in practice, there may be other
  1568. // factors (e.g. firewalls) restraining the maximum UDP packet size. See,
  1569. //
  1570. // http://opensimulator.org/mantis/view.php?id=226
  1571. //
  1572. // for one example of this kind of thing. In fact, the Linden servers appear to only send about
  1573. // 6 to 7 items at a time, so let's stick with 6
  1574. const int MAX_ITEMS_PER_PACKET = 5;
  1575. const int MAX_FOLDERS_PER_PACKET = 6;
  1576. if (items == null || folders == null)
  1577. return; //This DOES happen when things time out!!
  1578. int totalItems = fetchItems ? items.Count : 0;
  1579. int totalFolders = fetchFolders ? folders.Count : 0;
  1580. int itemsSent = 0;
  1581. int foldersSent = 0;
  1582. int foldersToSend = 0;
  1583. int itemsToSend = 0;
  1584. InventoryDescendentsPacket currentPacket = null;
  1585. // Handle empty folders
  1586. //
  1587. if (totalItems == 0 && totalFolders == 0)
  1588. currentPacket = CreateInventoryDescendentsPacket(ownerID, folderID, version, items.Count + folders.Count,
  1589. 0, 0);
  1590. // To preserve SL compatibility, we will NOT combine folders and items in one packet
  1591. //
  1592. while (itemsSent < totalItems || foldersSent < totalFolders)
  1593. {
  1594. if (currentPacket == null) // Start a new packet
  1595. {
  1596. foldersToSend = totalFolders - foldersSent;
  1597. if (foldersToSend > MAX_FOLDERS_PER_PACKET)
  1598. foldersToSend = MAX_FOLDERS_PER_PACKET;
  1599. if (foldersToSend == 0)
  1600. {
  1601. itemsToSend = totalItems - itemsSent;
  1602. if (itemsToSend > MAX_ITEMS_PER_PACKET)
  1603. itemsToSend = MAX_ITEMS_PER_PACKET;
  1604. }
  1605. currentPacket = CreateInventoryDescendentsPacket(ownerID, folderID, version,
  1606. items.Count + folders.Count, foldersToSend,
  1607. itemsToSend);
  1608. }
  1609. if (foldersToSend-- > 0)
  1610. currentPacket.FolderData[foldersSent%MAX_FOLDERS_PER_PACKET] =
  1611. CreateFolderDataBlock(folders[foldersSent++]);
  1612. else if (itemsToSend-- > 0)
  1613. currentPacket.ItemData[itemsSent%MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]);
  1614. else
  1615. {
  1616. OutPacket(currentPacket, ThrottleOutPacketType.Asset, false, null);
  1617. currentPacket = null;
  1618. }
  1619. }
  1620. if (currentPacket != null)
  1621. OutPacket(currentPacket, ThrottleOutPacketType.Asset, false, null);
  1622. }
  1623. private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder)
  1624. {
  1625. InventoryDescendentsPacket.FolderDataBlock newBlock = new InventoryDescendentsPacket.FolderDataBlock
  1626. {
  1627. FolderID = folder.ID,
  1628. Name = Util.StringToBytes256(folder.Name),
  1629. ParentID = folder.ParentID,
  1630. Type = (sbyte) folder.Type
  1631. };
  1632. return newBlock;
  1633. }
  1634. private InventoryDescendentsPacket.ItemDataBlock CreateItemDataBlock(InventoryItemBase item)
  1635. {
  1636. InventoryDescendentsPacket.ItemDataBlock newBlock = new InventoryDescendentsPacket.ItemDataBlock
  1637. {
  1638. ItemID = item.ID,
  1639. AssetID = item.AssetID,
  1640. CreatorID = item.CreatorIdAsUuid,
  1641. BaseMask = item.BasePermissions,
  1642. Description =
  1643. Util.StringToBytes256(item.Description),
  1644. EveryoneMask = item.EveryOnePermissions,
  1645. OwnerMask = item.CurrentPermissions,
  1646. FolderID = item.Folder,
  1647. InvType = (sbyte) item.InvType,
  1648. Name = Util.StringToBytes256(item.Name),
  1649. NextOwnerMask = item.NextPermissions,
  1650. OwnerID = item.Owner,
  1651. Type =
  1652. Util.CheckMeshType((sbyte) item.AssetType),
  1653. GroupID = item.GroupID,
  1654. GroupOwned = item.GroupOwned,
  1655. GroupMask = item.GroupPermissions,
  1656. CreationDate = item.CreationDate,
  1657. SalePrice = item.SalePrice,
  1658. SaleType = item.SaleType,
  1659. Flags = item.Flags
  1660. };
  1661. newBlock.CRC =
  1662. Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType,
  1663. newBlock.InvType, newBlock.Type,
  1664. newBlock.AssetID, newBlock.GroupID,
  1665. newBlock.SalePrice,
  1666. newBlock.OwnerID, newBlock.CreatorID,
  1667. newBlock.ItemID, newBlock.FolderID,
  1668. newBlock.EveryoneMask,
  1669. newBlock.Flags, newBlock.OwnerMask,
  1670. newBlock.GroupMask, newBlock.NextOwnerMask);
  1671. return newBlock;
  1672. }
  1673. private void AddNullFolderBlockToDecendentsPacket(ref InventoryDescendentsPacket packet)
  1674. {
  1675. packet.FolderData = new InventoryDescendentsPacket.FolderDataBlock[1];
  1676. packet.FolderData[0] = new InventoryDescendentsPacket.FolderDataBlock
  1677. {FolderID = UUID.Zero, ParentID = UUID.Zero, Type = -1, Name = new byte[0]};
  1678. }
  1679. private void AddNullItemBlockToDescendentsPacket(ref InventoryDescendentsPacket packet)
  1680. {
  1681. packet.ItemData = new InventoryDescendentsPacket.ItemDataBlock[1];
  1682. packet.ItemData[0] = new InventoryDescendentsPacket.ItemDataBlock
  1683. {
  1684. ItemID = UUID.Zero,
  1685. AssetID = UUID.Zero,
  1686. CreatorID = UUID.Zero,
  1687. BaseMask = 0,
  1688. Description = new byte[0],
  1689. EveryoneMask = 0,
  1690. OwnerMask = 0,
  1691. FolderID = UUID.Zero,
  1692. InvType = 0,
  1693. Name = new byte[0],
  1694. NextOwnerMask = 0,
  1695. OwnerID = UUID.Zero,
  1696. Type = -1,
  1697. GroupID = UUID.Zero,
  1698. GroupOwned = false,
  1699. GroupMask = 0,
  1700. CreationDate = 0,
  1701. SalePrice = 0,
  1702. SaleType = 0,
  1703. Flags = 0
  1704. };
  1705. // No need to add CRC
  1706. }
  1707. private InventoryDescendentsPacket CreateInventoryDescendentsPacket(UUID ownerID, UUID folderID, int version,
  1708. int descendents, int folders, int items)
  1709. {
  1710. InventoryDescendentsPacket descend =
  1711. (InventoryDescendentsPacket) PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
  1712. descend.Header.Zerocoded = true;
  1713. descend.AgentData.AgentID = AgentId;
  1714. descend.AgentData.OwnerID = ownerID;
  1715. descend.AgentData.FolderID = folderID;
  1716. descend.AgentData.Version = version;
  1717. descend.AgentData.Descendents = descendents;
  1718. if (folders > 0)
  1719. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders];
  1720. else
  1721. AddNullFolderBlockToDecendentsPacket(ref descend);
  1722. if (items > 0)
  1723. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items];
  1724. else
  1725. AddNullItemBlockToDescendentsPacket(ref descend);
  1726. return descend;
  1727. }
  1728. public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
  1729. {
  1730. const uint FULL_MASK_PERMISSIONS = (uint) PermissionMask.All;
  1731. FetchInventoryReplyPacket inventoryReply =
  1732. (FetchInventoryReplyPacket) PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
  1733. // TODO: don't create new blocks if recycling an old packet
  1734. inventoryReply.AgentData.AgentID = AgentId;
  1735. inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
  1736. inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock
  1737. {
  1738. ItemID = item.ID,
  1739. AssetID = item.AssetID,
  1740. CreatorID = item.CreatorIdAsUuid,
  1741. BaseMask = item.BasePermissions,
  1742. CreationDate = item.CreationDate,
  1743. Description = Util.StringToBytes256(item.Description),
  1744. EveryoneMask = item.EveryOnePermissions,
  1745. FolderID = item.Folder,
  1746. InvType = (sbyte) item.InvType,
  1747. Name = Util.StringToBytes256(item.Name),
  1748. NextOwnerMask = item.NextPermissions,
  1749. OwnerID = item.Owner,
  1750. OwnerMask = item.CurrentPermissions,
  1751. Type = Util.CheckMeshType((sbyte) item.AssetType),
  1752. GroupID = item.GroupID,
  1753. GroupOwned = item.GroupOwned,
  1754. GroupMask = item.GroupPermissions,
  1755. Flags = item.Flags,
  1756. SalePrice = item.SalePrice,
  1757. SaleType = item.SaleType
  1758. };
  1759. inventoryReply.InventoryData[0].CRC =
  1760. Helpers.InventoryCRC(
  1761. 1000, 0, inventoryReply.InventoryData[0].InvType,
  1762. inventoryReply.InventoryData[0].Type, inventoryReply.InventoryData[0].AssetID,
  1763. inventoryReply.InventoryData[0].GroupID, 100,
  1764. inventoryReply.InventoryData[0].OwnerID, inventoryReply.InventoryData[0].CreatorID,
  1765. inventoryReply.InventoryData[0].ItemID, inventoryReply.InventoryData[0].FolderID,
  1766. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1767. FULL_MASK_PERMISSIONS);
  1768. inventoryReply.Header.Zerocoded = true;
  1769. OutPacket(inventoryReply, ThrottleOutPacketType.Asset);
  1770. }
  1771. public void SendBulkUpdateInventory(InventoryFolderBase folder)
  1772. {
  1773. // We will use the same transaction id for all the separate packets to be sent out in this update.
  1774. UUID transactionId = UUID.Random();
  1775. List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks
  1776. = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  1777. SendBulkUpdateInventoryFolderRecursive(folder, ref folderDataBlocks, transactionId);
  1778. if (folderDataBlocks.Count > 0)
  1779. {
  1780. // We'll end up with some unsent folder blocks if there were some empty folders at the end of the list
  1781. // Send these now
  1782. BulkUpdateInventoryPacket bulkUpdate
  1783. = (BulkUpdateInventoryPacket) PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1784. bulkUpdate.Header.Zerocoded = true;
  1785. bulkUpdate.AgentData.AgentID = AgentId;
  1786. bulkUpdate.AgentData.TransactionID = transactionId;
  1787. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  1788. List<BulkUpdateInventoryPacket.ItemDataBlock> foo = new List<BulkUpdateInventoryPacket.ItemDataBlock>();
  1789. bulkUpdate.ItemData = foo.ToArray();
  1790. //MainConsole.Instance.Debug("SendBulkUpdateInventory :" + bulkUpdate);
  1791. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1792. }
  1793. }
  1794. /// <summary>
  1795. /// Recursively construct bulk update packets to send folders and items
  1796. /// </summary>
  1797. /// <param name="folder"></param>
  1798. /// <param name="folderDataBlocks"></param>
  1799. /// <param name="transactionId"></param>
  1800. private void SendBulkUpdateInventoryFolderRecursive(
  1801. InventoryFolderBase folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
  1802. UUID transactionId)
  1803. {
  1804. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  1805. const int MAX_ITEMS_PER_PACKET = 5;
  1806. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  1807. // If there are any items then we have to start sending them off in this packet - the next folder will have
  1808. // to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit
  1809. // being used on the Linden grid at 20081203).
  1810. InventoryCollection contents = invService.GetFolderContent(AgentId, folder.ID);
  1811. // folder.RequestListOfItems();
  1812. List<InventoryItemBase> items = contents.Items;
  1813. while (items.Count > 0)
  1814. {
  1815. BulkUpdateInventoryPacket bulkUpdate
  1816. = (BulkUpdateInventoryPacket) PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1817. bulkUpdate.Header.Zerocoded = true;
  1818. bulkUpdate.AgentData.AgentID = AgentId;
  1819. bulkUpdate.AgentData.TransactionID = transactionId;
  1820. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  1821. int itemsToSend = (items.Count > MAX_ITEMS_PER_PACKET ? MAX_ITEMS_PER_PACKET : items.Count);
  1822. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[itemsToSend];
  1823. for (int i = 0; i < itemsToSend; i++)
  1824. {
  1825. // Remove from the end of the list so that we don't incur a performance penalty
  1826. bulkUpdate.ItemData[i] = GenerateBulkUpdateItemDataBlock(items[items.Count - 1]);
  1827. items.RemoveAt(items.Count - 1);
  1828. }
  1829. //MainConsole.Instance.Debug("SendBulkUpdateInventoryRecursive :" + bulkUpdate);
  1830. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1831. folderDataBlocks = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  1832. // If we're going to be sending another items packet then it needs to contain just the folder to which those
  1833. // items belong.
  1834. if (items.Count > 0)
  1835. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  1836. }
  1837. List<InventoryFolderBase> subFolders = contents.Folders;
  1838. foreach (InventoryFolderBase subFolder in subFolders)
  1839. {
  1840. SendBulkUpdateInventoryFolderRecursive(subFolder, ref folderDataBlocks, transactionId);
  1841. }
  1842. }
  1843. /// <summary>
  1844. /// Generate a bulk update inventory data block for the given folder
  1845. /// </summary>
  1846. /// <param name="folder"></param>
  1847. /// <returns></returns>
  1848. private BulkUpdateInventoryPacket.FolderDataBlock GenerateBulkUpdateFolderDataBlock(InventoryFolderBase folder)
  1849. {
  1850. BulkUpdateInventoryPacket.FolderDataBlock folderBlock = new BulkUpdateInventoryPacket.FolderDataBlock
  1851. {
  1852. FolderID = folder.ID,
  1853. ParentID = folder.ParentID,
  1854. Type = -1,
  1855. Name = Util.StringToBytes256(folder.Name)
  1856. };
  1857. return folderBlock;
  1858. }
  1859. /// <summary>
  1860. /// Generate a bulk update inventory data block for the given item
  1861. /// </summary>
  1862. /// <param name="item"></param>
  1863. /// <returns></returns>
  1864. private BulkUpdateInventoryPacket.ItemDataBlock GenerateBulkUpdateItemDataBlock(InventoryItemBase item)
  1865. {
  1866. BulkUpdateInventoryPacket.ItemDataBlock itemBlock = new BulkUpdateInventoryPacket.ItemDataBlock
  1867. {
  1868. ItemID = item.ID,
  1869. AssetID = item.AssetID,
  1870. CreatorID = item.CreatorIdAsUuid,
  1871. BaseMask = item.BasePermissions,
  1872. Description =
  1873. Util.StringToBytes256(item.Description),
  1874. EveryoneMask = item.EveryOnePermissions,
  1875. FolderID = item.Folder,
  1876. InvType = (sbyte) item.InvType,
  1877. Name = Util.StringToBytes256(item.Name),
  1878. NextOwnerMask = item.NextPermissions,
  1879. OwnerID = item.Owner,
  1880. OwnerMask = item.CurrentPermissions,
  1881. Type =
  1882. Util.CheckMeshType((sbyte) item.AssetType),
  1883. GroupID = item.GroupID,
  1884. GroupOwned = item.GroupOwned,
  1885. GroupMask = item.GroupPermissions,
  1886. Flags = item.Flags,
  1887. SalePrice = item.SalePrice,
  1888. SaleType = item.SaleType,
  1889. CreationDate = item.CreationDate
  1890. };
  1891. itemBlock.CRC =
  1892. Helpers.InventoryCRC(
  1893. 1000, 0, itemBlock.InvType,
  1894. itemBlock.Type, itemBlock.AssetID,
  1895. itemBlock.GroupID, 100,
  1896. itemBlock.OwnerID, itemBlock.CreatorID,
  1897. itemBlock.ItemID, itemBlock.FolderID,
  1898. (uint) PermissionMask.All, 1, (uint) PermissionMask.All, (uint) PermissionMask.All,
  1899. (uint) PermissionMask.All);
  1900. return itemBlock;
  1901. }
  1902. public void SendBulkUpdateInventory(InventoryItemBase item)
  1903. {
  1904. const uint FULL_MASK_PERMISSIONS = (uint) PermissionMask.All;
  1905. BulkUpdateInventoryPacket bulkUpdate
  1906. = (BulkUpdateInventoryPacket) PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1907. bulkUpdate.AgentData.AgentID = AgentId;
  1908. bulkUpdate.AgentData.TransactionID = UUID.Random();
  1909. bulkUpdate.FolderData = new BulkUpdateInventoryPacket.FolderDataBlock[1];
  1910. bulkUpdate.FolderData[0] = new BulkUpdateInventoryPacket.FolderDataBlock
  1911. {FolderID = UUID.Zero, ParentID = UUID.Zero, Type = -1, Name = new byte[0]};
  1912. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[1];
  1913. bulkUpdate.ItemData[0] = new BulkUpdateInventoryPacket.ItemDataBlock
  1914. {
  1915. ItemID = item.ID,
  1916. AssetID = item.AssetID,
  1917. CreatorID = item.CreatorIdAsUuid,
  1918. BaseMask = item.BasePermissions,
  1919. CreationDate = item.CreationDate,
  1920. Description = Util.StringToBytes256(item.Description),
  1921. EveryoneMask = item.EveryOnePermissions,
  1922. FolderID = item.Folder,
  1923. InvType = (sbyte) item.InvType,
  1924. Name = Util.StringToBytes256(item.Name),
  1925. NextOwnerMask = item.NextPermissions,
  1926. OwnerID = item.Owner,
  1927. OwnerMask = item.CurrentPermissions,
  1928. Type = Util.CheckMeshType((sbyte) item.AssetType),
  1929. GroupID = item.GroupID,
  1930. GroupOwned = item.GroupOwned,
  1931. GroupMask = item.GroupPermissions,
  1932. Flags = item.Flags,
  1933. SalePrice = item.SalePrice,
  1934. SaleType = item.SaleType
  1935. };
  1936. bulkUpdate.ItemData[0].CRC =
  1937. Helpers.InventoryCRC(1000, 0, bulkUpdate.ItemData[0].InvType,
  1938. bulkUpdate.ItemData[0].Type, bulkUpdate.ItemData[0].AssetID,
  1939. bulkUpdate.ItemData[0].GroupID, 100,
  1940. bulkUpdate.ItemData[0].OwnerID, bulkUpdate.ItemData[0].CreatorID,
  1941. bulkUpdate.ItemData[0].ItemID, bulkUpdate.ItemData[0].FolderID,
  1942. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1943. FULL_MASK_PERMISSIONS);
  1944. bulkUpdate.Header.Zerocoded = true;
  1945. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1946. }
  1947. /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see>
  1948. public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId)
  1949. {
  1950. const uint FULL_MASK_PERMISSIONS = (uint) PermissionMask.All;
  1951. UpdateCreateInventoryItemPacket InventoryReply
  1952. = (UpdateCreateInventoryItemPacket) PacketPool.Instance.GetPacket(
  1953. PacketType.UpdateCreateInventoryItem);
  1954. // TODO: don't create new blocks if recycling an old packet
  1955. InventoryReply.AgentData.AgentID = AgentId;
  1956. InventoryReply.AgentData.SimApproved = true;
  1957. InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
  1958. InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock
  1959. {
  1960. ItemID = Item.ID,
  1961. AssetID = Item.AssetID,
  1962. CreatorID = Item.CreatorIdAsUuid,
  1963. BaseMask = Item.BasePermissions,
  1964. Description = Util.StringToBytes256(Item.Description),
  1965. EveryoneMask = Item.EveryOnePermissions,
  1966. FolderID = Item.Folder,
  1967. InvType = (sbyte) Item.InvType,
  1968. Name = Util.StringToBytes256(Item.Name),
  1969. NextOwnerMask = Item.NextPermissions,
  1970. OwnerID = Item.Owner,
  1971. OwnerMask = Item.CurrentPermissions,
  1972. Type = Util.CheckMeshType((sbyte) Item.AssetType),
  1973. CallbackID = callbackId,
  1974. GroupID = Item.GroupID,
  1975. GroupOwned = Item.GroupOwned,
  1976. GroupMask = Item.GroupPermissions,
  1977. Flags = Item.Flags,
  1978. SalePrice = Item.SalePrice,
  1979. SaleType = Item.SaleType,
  1980. CreationDate = Item.CreationDate
  1981. };
  1982. InventoryReply.InventoryData[0].CRC =
  1983. Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType,
  1984. InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID,
  1985. InventoryReply.InventoryData[0].GroupID, 100,
  1986. InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID,
  1987. InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID,
  1988. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1989. FULL_MASK_PERMISSIONS);
  1990. InventoryReply.Header.Zerocoded = true;
  1991. OutPacket(InventoryReply, ThrottleOutPacketType.Asset);
  1992. }
  1993. public void SendRemoveInventoryItem(UUID itemID)
  1994. {
  1995. RemoveInventoryItemPacket remove =
  1996. (RemoveInventoryItemPacket) PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
  1997. // TODO: don't create new blocks if recycling an old packet
  1998. remove.AgentData.AgentID = AgentId;
  1999. remove.AgentData.SessionID = m_sessionId;
  2000. remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
  2001. remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock {ItemID = itemID};
  2002. remove.Header.Zerocoded = true;
  2003. OutPacket(remove, ThrottleOutPacketType.Asset);
  2004. }
  2005. public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
  2006. {
  2007. ScriptControlChangePacket scriptcontrol =
  2008. (ScriptControlChangePacket) PacketPool.Instance.GetPacket(PacketType.ScriptControlChange);
  2009. ScriptControlChangePacket.DataBlock[] data = new ScriptControlChangePacket.DataBlock[1];
  2010. ScriptControlChangePacket.DataBlock ddata = new ScriptControlChangePacket.DataBlock
  2011. {
  2012. Controls = (uint) controls,
  2013. PassToAgent = passToAgent,
  2014. TakeControls = TakeControls
  2015. };
  2016. data[0] = ddata;
  2017. scriptcontrol.Data = data;
  2018. OutPacket(scriptcontrol, ThrottleOutPacketType.AvatarInfo);
  2019. }
  2020. public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
  2021. {
  2022. ReplyTaskInventoryPacket replytask =
  2023. (ReplyTaskInventoryPacket) PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);
  2024. replytask.InventoryData.TaskID = taskID;
  2025. replytask.InventoryData.Serial = serial;
  2026. replytask.InventoryData.Filename = fileName;
  2027. OutPacket(replytask, ThrottleOutPacketType.Transfer);
  2028. }
  2029. public void SendXferPacket(ulong xferID, uint packet, byte[] data)
  2030. {
  2031. SendXferPacketPacket sendXfer =
  2032. (SendXferPacketPacket) PacketPool.Instance.GetPacket(PacketType.SendXferPacket);
  2033. sendXfer.XferID.ID = xferID;
  2034. sendXfer.XferID.Packet = packet;
  2035. sendXfer.DataPacket.Data = data;
  2036. OutPacket(sendXfer, ThrottleOutPacketType.Transfer);
  2037. }
  2038. public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
  2039. int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent,
  2040. float PriceObjectScaleFactor,
  2041. int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent,
  2042. int PricePublicObjectDecay,
  2043. int PricePublicObjectDelete, int PriceRentLight, int PriceUpload,
  2044. int TeleportMinPrice, float TeleportPriceExponent)
  2045. {
  2046. EconomyDataPacket economyData = (EconomyDataPacket) PacketPool.Instance.GetPacket(PacketType.EconomyData);
  2047. economyData.Info.EnergyEfficiency = EnergyEfficiency;
  2048. economyData.Info.ObjectCapacity = ObjectCapacity;
  2049. economyData.Info.ObjectCount = ObjectCount;
  2050. economyData.Info.PriceEnergyUnit = PriceEnergyUnit;
  2051. economyData.Info.PriceGroupCreate = PriceGroupCreate;
  2052. economyData.Info.PriceObjectClaim = PriceObjectClaim;
  2053. economyData.Info.PriceObjectRent = PriceObjectRent;
  2054. economyData.Info.PriceObjectScaleFactor = PriceObjectScaleFactor;
  2055. economyData.Info.PriceParcelClaim = PriceParcelClaim;
  2056. economyData.Info.PriceParcelClaimFactor = PriceParcelClaimFactor;
  2057. economyData.Info.PriceParcelRent = PriceParcelRent;
  2058. economyData.Info.PricePublicObjectDecay = PricePublicObjectDecay;
  2059. economyData.Info.PricePublicObjectDelete = PricePublicObjectDelete;
  2060. economyData.Info.PriceRentLight = PriceRentLight;
  2061. economyData.Info.PriceUpload = PriceUpload;
  2062. economyData.Info.TeleportMinPrice = TeleportMinPrice;
  2063. economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
  2064. economyData.Header.Reliable = true;
  2065. OutPacket(economyData, ThrottleOutPacketType.AvatarInfo);
  2066. }
  2067. public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
  2068. {
  2069. //construct the AvatarPickerReply packet.
  2070. AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket
  2071. {
  2072. AgentData =
  2073. {AgentID = AgentData.AgentID, QueryID = AgentData.QueryID},
  2074. Data =
  2075. Data.Select(arg => new AvatarPickerReplyPacket.DataBlock
  2076. {
  2077. AvatarID = arg.AvatarID,
  2078. FirstName = arg.FirstName,
  2079. LastName = arg.LastName
  2080. }).ToArray()
  2081. };
  2082. //int i = 0;
  2083. OutPacket(replyPacket, ThrottleOutPacketType.AvatarInfo);
  2084. }
  2085. public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname,
  2086. ulong grouppowers, string groupname, string grouptitle)
  2087. {
  2088. m_activeGroupID = activegroupid;
  2089. m_activeGroupName = groupname;
  2090. m_activeGroupPowers = grouppowers;
  2091. AgentDataUpdatePacket sendAgentDataUpdate =
  2092. (AgentDataUpdatePacket) PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate);
  2093. sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid;
  2094. sendAgentDataUpdate.AgentData.AgentID = agentid;
  2095. sendAgentDataUpdate.AgentData.FirstName = Util.StringToBytes256(firstname);
  2096. sendAgentDataUpdate.AgentData.GroupName = Util.StringToBytes256(groupname);
  2097. sendAgentDataUpdate.AgentData.GroupPowers = grouppowers;
  2098. sendAgentDataUpdate.AgentData.GroupTitle = Util.StringToBytes256(grouptitle);
  2099. sendAgentDataUpdate.AgentData.LastName = Util.StringToBytes256(lastname);
  2100. OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.AvatarInfo);
  2101. }
  2102. /// <summary>
  2103. /// Send an alert message to the client. On the Linden client (tested 1.19.1.4), this pops up a brief duration
  2104. /// blue information box in the bottom right hand corner.
  2105. /// </summary>
  2106. /// <param name="message"></param>
  2107. public void SendAlertMessage(string message)
  2108. {
  2109. AlertMessagePacket alertPack = (AlertMessagePacket) PacketPool.Instance.GetPacket(PacketType.AlertMessage);
  2110. alertPack.AlertData = new AlertMessagePacket.AlertDataBlock {Message = Util.StringToBytes256(message)};
  2111. alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[0];
  2112. OutPacket(alertPack, ThrottleOutPacketType.AvatarInfo);
  2113. }
  2114. /// <summary>
  2115. /// Send an agent alert message to the client.
  2116. /// </summary>
  2117. /// <param name="message"></param>
  2118. /// <param name="modal">
  2119. /// On the linden client, if this true then it displays a one button text box placed in the
  2120. /// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
  2121. /// the AlertMessage packet).
  2122. /// </param>
  2123. public void SendAgentAlertMessage(string message, bool modal)
  2124. {
  2125. AgentAlertMessagePacket alertPack =
  2126. (AgentAlertMessagePacket) PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
  2127. alertPack.AgentData.AgentID = AgentId;
  2128. alertPack.AlertData.Message = Util.StringToBytes256(message);
  2129. alertPack.AlertData.Modal = modal;
  2130. OutPacket(alertPack, ThrottleOutPacketType.AvatarInfo);
  2131. }
  2132. public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
  2133. string url)
  2134. {
  2135. LoadURLPacket loadURL = (LoadURLPacket) PacketPool.Instance.GetPacket(PacketType.LoadURL);
  2136. loadURL.Data.ObjectName = Util.StringToBytes256(objectname);
  2137. loadURL.Data.ObjectID = objectID;
  2138. loadURL.Data.OwnerID = ownerID;
  2139. loadURL.Data.OwnerIsGroup = groupOwned;
  2140. loadURL.Data.Message = Util.StringToBytes256(message);
  2141. loadURL.Data.URL = Util.StringToBytes256(url);
  2142. OutPacket(loadURL, ThrottleOutPacketType.AvatarInfo);
  2143. }
  2144. public void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName,
  2145. string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
  2146. {
  2147. ScriptDialogPacket dialog = (ScriptDialogPacket) PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
  2148. dialog.Data.ObjectID = objectID;
  2149. dialog.Data.ObjectName = Util.StringToBytes256(objectname);
  2150. // this is the username of the *owner*
  2151. dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName);
  2152. dialog.Data.LastName = Util.StringToBytes256(ownerLastName);
  2153. dialog.Data.Message = Util.StringToBytes1024(msg);
  2154. dialog.Data.ImageID = textureID;
  2155. dialog.Data.ChatChannel = ch;
  2156. ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length];
  2157. for (int i = 0; i < buttonlabels.Length; i++)
  2158. {
  2159. buttons[i] = new ScriptDialogPacket.ButtonsBlock {ButtonLabel = Util.StringToBytes256(buttonlabels[i])};
  2160. }
  2161. dialog.Buttons = buttons;
  2162. dialog.OwnerData = new ScriptDialogPacket.OwnerDataBlock[1];
  2163. dialog.OwnerData[0] = new ScriptDialogPacket.OwnerDataBlock {OwnerID = ownerID};
  2164. OutPacket(dialog, ThrottleOutPacketType.AvatarInfo);
  2165. }
  2166. public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
  2167. {
  2168. PreloadSoundPacket preSound = (PreloadSoundPacket) PacketPool.Instance.GetPacket(PacketType.PreloadSound);
  2169. // TODO: don't create new blocks if recycling an old packet
  2170. preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
  2171. preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock
  2172. {ObjectID = objectID, OwnerID = ownerID, SoundID = soundID};
  2173. preSound.Header.Zerocoded = true;
  2174. OutPacket(preSound, ThrottleOutPacketType.Asset);
  2175. }
  2176. public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
  2177. {
  2178. AttachedSoundPacket sound = (AttachedSoundPacket) PacketPool.Instance.GetPacket(PacketType.AttachedSound);
  2179. sound.DataBlock.SoundID = soundID;
  2180. sound.DataBlock.ObjectID = objectID;
  2181. sound.DataBlock.OwnerID = ownerID;
  2182. sound.DataBlock.Gain = gain;
  2183. sound.DataBlock.Flags = flags;
  2184. OutPacket(sound, ThrottleOutPacketType.Asset);
  2185. }
  2186. public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle,
  2187. Vector3 position, float gain)
  2188. {
  2189. SoundTriggerPacket sound = (SoundTriggerPacket) PacketPool.Instance.GetPacket(PacketType.SoundTrigger);
  2190. sound.SoundData.SoundID = soundID;
  2191. sound.SoundData.OwnerID = ownerID;
  2192. sound.SoundData.ObjectID = objectID;
  2193. sound.SoundData.ParentID = parentID;
  2194. sound.SoundData.Handle = handle;
  2195. sound.SoundData.Position = position;
  2196. sound.SoundData.Gain = gain;
  2197. OutPacket(sound, ThrottleOutPacketType.Asset);
  2198. }
  2199. public void SendAttachedSoundGainChange(UUID objectID, float gain)
  2200. {
  2201. AttachedSoundGainChangePacket sound =
  2202. (AttachedSoundGainChangePacket) PacketPool.Instance.GetPacket(PacketType.AttachedSoundGainChange);
  2203. sound.DataBlock.ObjectID = objectID;
  2204. sound.DataBlock.Gain = gain;
  2205. OutPacket(sound, ThrottleOutPacketType.Asset);
  2206. }
  2207. public void SendSunPos(Vector3 Position, Vector3 Velocity, ulong currentTime, uint secondsPerSunCycle,
  2208. uint secondsPerYear, float orbitalPosition)
  2209. {
  2210. // Viewers based on the Linden viwer code, do wacky things for oribital positions from Midnight to Sunrise
  2211. // So adjust for that
  2212. // Contributed by: Godfrey
  2213. if (orbitalPosition > m_sunPainDaHalfOrbitalCutoff) // things get weird from midnight to sunrise
  2214. {
  2215. orbitalPosition = (orbitalPosition - m_sunPainDaHalfOrbitalCutoff)*0.6666666667f +
  2216. m_sunPainDaHalfOrbitalCutoff;
  2217. }
  2218. SimulatorViewerTimeMessagePacket viewertime =
  2219. (SimulatorViewerTimeMessagePacket) PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  2220. viewertime.TimeInfo.SunDirection = Position;
  2221. viewertime.TimeInfo.SunAngVelocity = Velocity;
  2222. // Sun module used to add 6 hours to adjust for linden sun hour, adding here
  2223. // to prevent existing code from breaking if it assumed that 6 hours were included.
  2224. // 21600 == 6 hours * 60 minutes * 60 Seconds
  2225. viewertime.TimeInfo.UsecSinceStart = currentTime + 21600;
  2226. viewertime.TimeInfo.SecPerDay = secondsPerSunCycle;
  2227. viewertime.TimeInfo.SecPerYear = secondsPerYear;
  2228. viewertime.TimeInfo.SunPhase = orbitalPosition;
  2229. viewertime.Header.Reliable = false;
  2230. viewertime.Header.Zerocoded = true;
  2231. OutPacket(viewertime, ThrottleOutPacketType.AvatarInfo);
  2232. }
  2233. public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
  2234. {
  2235. ViewerEffectPacket packet = (ViewerEffectPacket) PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
  2236. packet.Header.Reliable = false;
  2237. packet.Header.Zerocoded = true;
  2238. packet.AgentData.AgentID = AgentId;
  2239. packet.AgentData.SessionID = SessionId;
  2240. packet.Effect = effectBlocks;
  2241. OutPacket(packet, ThrottleOutPacketType.State);
  2242. }
  2243. public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember,
  2244. string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
  2245. UUID partnerID)
  2246. {
  2247. AvatarPropertiesReplyPacket avatarReply =
  2248. (AvatarPropertiesReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
  2249. avatarReply.AgentData.AgentID = AgentId;
  2250. avatarReply.AgentData.AvatarID = avatarID;
  2251. avatarReply.PropertiesData.AboutText = aboutText != null
  2252. ? Util.StringToBytes1024(aboutText)
  2253. : Utils.EmptyBytes;
  2254. avatarReply.PropertiesData.BornOn = Util.StringToBytes256(bornOn);
  2255. avatarReply.PropertiesData.CharterMember = charterMember;
  2256. avatarReply.PropertiesData.FLAboutText = flAbout != null ? Util.StringToBytes256(flAbout) : Utils.EmptyBytes;
  2257. avatarReply.PropertiesData.Flags = flags;
  2258. avatarReply.PropertiesData.FLImageID = flImageID;
  2259. avatarReply.PropertiesData.ImageID = imageID;
  2260. avatarReply.PropertiesData.ProfileURL = Util.StringToBytes256(profileURL);
  2261. avatarReply.PropertiesData.PartnerID = partnerID;
  2262. OutPacket(avatarReply, ThrottleOutPacketType.AvatarInfo);
  2263. }
  2264. /// <summary>
  2265. /// Send the client an Estate message blue box pop-down with a single OK button
  2266. /// </summary>
  2267. /// <param name="FromAvatarID"></param>
  2268. /// <param name="FromAvatarName"></param>
  2269. /// <param name="Message"></param>
  2270. public void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message)
  2271. {
  2272. if (!ChildAgentStatus())
  2273. SendInstantMessage(new GridInstantMessage(null, FromAvatarID, FromAvatarName, AgentId, 1, Message, false,
  2274. new Vector3()));
  2275. //SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
  2276. }
  2277. public void SendLogoutPacket()
  2278. {
  2279. // I know this is a bit of a hack, however there are times when you don't
  2280. // want to send this, but still need to do the rest of the shutdown process
  2281. // this method gets called from the packet server.. which makes it practically
  2282. // impossible to do any other way.
  2283. if (m_SendLogoutPacketWhenClosing)
  2284. {
  2285. LogoutReplyPacket logReply = (LogoutReplyPacket) PacketPool.Instance.GetPacket(PacketType.LogoutReply);
  2286. // TODO: don't create new blocks if recycling an old packet
  2287. logReply.AgentData.AgentID = AgentId;
  2288. logReply.AgentData.SessionID = SessionId;
  2289. logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
  2290. logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock {ItemID = UUID.Zero};
  2291. OutPacket(logReply, ThrottleOutPacketType.OutBand);
  2292. }
  2293. }
  2294. public void SendHealth(float health)
  2295. {
  2296. HealthMessagePacket healthpacket =
  2297. (HealthMessagePacket) PacketPool.Instance.GetPacket(PacketType.HealthMessage);
  2298. healthpacket.HealthData.Health = health;
  2299. OutPacket(healthpacket, ThrottleOutPacketType.AvatarInfo);
  2300. }
  2301. public void SendAgentOnline(UUID[] agentIDs)
  2302. {
  2303. OnlineNotificationPacket onp = new OnlineNotificationPacket();
  2304. OnlineNotificationPacket.AgentBlockBlock[] onpb =
  2305. new OnlineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  2306. for (int i = 0; i < agentIDs.Length; i++)
  2307. {
  2308. OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock
  2309. {AgentID = agentIDs[i]};
  2310. onpb[i] = onpbl;
  2311. }
  2312. onp.AgentBlock = onpb;
  2313. onp.Header.Reliable = true;
  2314. OutPacket(onp, ThrottleOutPacketType.AvatarInfo);
  2315. }
  2316. public void SendAgentOffline(UUID[] agentIDs)
  2317. {
  2318. OfflineNotificationPacket offp = new OfflineNotificationPacket();
  2319. OfflineNotificationPacket.AgentBlockBlock[] offpb =
  2320. new OfflineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  2321. for (int i = 0; i < agentIDs.Length; i++)
  2322. {
  2323. OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock
  2324. {AgentID = agentIDs[i]};
  2325. offpb[i] = onpbl;
  2326. }
  2327. offp.AgentBlock = offpb;
  2328. offp.Header.Reliable = true;
  2329. OutPacket(offp, ThrottleOutPacketType.AvatarInfo);
  2330. }
  2331. public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot,
  2332. Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
  2333. {
  2334. AvatarSitResponsePacket avatarSitResponse = new AvatarSitResponsePacket {SitObject = {ID = TargetID}};
  2335. if (CameraAtOffset != Vector3.Zero)
  2336. {
  2337. avatarSitResponse.SitTransform.CameraAtOffset = CameraAtOffset;
  2338. avatarSitResponse.SitTransform.CameraEyeOffset = CameraEyeOffset;
  2339. }
  2340. avatarSitResponse.SitTransform.ForceMouselook = ForceMouseLook;
  2341. avatarSitResponse.SitTransform.AutoPilot = autopilot;
  2342. avatarSitResponse.SitTransform.SitPosition = OffsetPos;
  2343. avatarSitResponse.SitTransform.SitRotation = SitOrientation;
  2344. OutPacket(avatarSitResponse, ThrottleOutPacketType.AvatarInfo);
  2345. }
  2346. public void SendAdminResponse(UUID Token, uint AdminLevel)
  2347. {
  2348. GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
  2349. GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
  2350. GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock
  2351. {AgentID = AgentId, SessionID = SessionId};
  2352. // More security
  2353. gdb.GodLevel = (byte) AdminLevel;
  2354. gdb.Token = Token;
  2355. respondPacket.AgentData = adb;
  2356. respondPacket.GrantData = gdb;
  2357. OutPacket(respondPacket, ThrottleOutPacketType.AvatarInfo);
  2358. }
  2359. public void SendGroupMembership(GroupMembershipData[] GroupMembership)
  2360. {
  2361. AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
  2362. AgentGroupDataUpdatePacket.GroupDataBlock[] Groups =
  2363. new AgentGroupDataUpdatePacket.GroupDataBlock[GroupMembership.Length];
  2364. for (int i = 0; i < GroupMembership.Length; i++)
  2365. {
  2366. AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock
  2367. {
  2368. AcceptNotices =
  2369. GroupMembership[i].AcceptNotices,
  2370. Contribution = GroupMembership[i].Contribution,
  2371. GroupID = GroupMembership[i].GroupID,
  2372. GroupInsigniaID =
  2373. GroupMembership[i].GroupPicture,
  2374. GroupName =
  2375. Util.StringToBytes256(
  2376. GroupMembership[i].GroupName),
  2377. GroupPowers = GroupMembership[i].GroupPowers
  2378. };
  2379. Groups[i] = Group;
  2380. }
  2381. Groupupdate.GroupData = Groups;
  2382. Groupupdate.AgentData = new AgentGroupDataUpdatePacket.AgentDataBlock {AgentID = AgentId};
  2383. OutPacket(Groupupdate, ThrottleOutPacketType.AvatarInfo);
  2384. try
  2385. {
  2386. IEventQueueService eq = Scene.RequestModuleInterface<IEventQueueService>();
  2387. if (eq != null)
  2388. {
  2389. eq.GroupMembership(Groupupdate, AgentId, Scene.RegionInfo.RegionID);
  2390. }
  2391. }
  2392. catch (Exception ex)
  2393. {
  2394. MainConsole.Instance.Error("Unable to send group membership data via eventqueue - exception: " + ex);
  2395. MainConsole.Instance.Warn("sending group membership data via UDP");
  2396. OutPacket(Groupupdate, ThrottleOutPacketType.AvatarInfo);
  2397. }
  2398. }
  2399. public void SendGroupNameReply(UUID groupLLUID, string GroupName)
  2400. {
  2401. UUIDGroupNameReplyPacket pack = new UUIDGroupNameReplyPacket();
  2402. UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock =
  2403. new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1];
  2404. UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock
  2405. {
  2406. ID = groupLLUID,
  2407. GroupName =
  2408. Util.StringToBytes256(GroupName)
  2409. };
  2410. uidnameblock[0] = uidnamebloc;
  2411. pack.UUIDNameBlock = uidnameblock;
  2412. OutPacket(pack, ThrottleOutPacketType.AvatarInfo);
  2413. }
  2414. public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
  2415. {
  2416. LandStatReplyMessage message = new LandStatReplyMessage
  2417. {
  2418. ReportType = reportType,
  2419. RequestFlags = requestFlags,
  2420. TotalObjectCount = resultCount,
  2421. ReportDataBlocks =
  2422. new LandStatReplyMessage.ReportDataBlock[lsrpia.Length]
  2423. };
  2424. for (int i = 0; i < lsrpia.Length; i++)
  2425. {
  2426. LandStatReplyMessage.ReportDataBlock block = new LandStatReplyMessage.ReportDataBlock
  2427. {
  2428. Location = lsrpia[i].Location,
  2429. MonoScore = lsrpia[i].Score,
  2430. OwnerName = lsrpia[i].OwnerName,
  2431. Score = lsrpia[i].Score,
  2432. TaskID = lsrpia[i].TaskID,
  2433. TaskLocalID = lsrpia[i].TaskLocalID,
  2434. TaskName = lsrpia[i].TaskName,
  2435. TimeStamp = lsrpia[i].TimeModified
  2436. };
  2437. message.ReportDataBlocks[i] = block;
  2438. }
  2439. IEventQueueService eventService = m_scene.RequestModuleInterface<IEventQueueService>();
  2440. if (eventService != null)
  2441. {
  2442. eventService.LandStatReply(message, AgentId, m_scene.RegionInfo.RegionID);
  2443. }
  2444. }
  2445. public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
  2446. {
  2447. ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket
  2448. {
  2449. Script =
  2450. {
  2451. ObjectID = objectID,
  2452. ItemID = itemID,
  2453. Running = running
  2454. }
  2455. };
  2456. OutPacket(scriptRunningReply, ThrottleOutPacketType.AvatarInfo);
  2457. }
  2458. private void SendFailedAsset(AssetRequestToClient req, TransferPacketStatus assetErrors)
  2459. {
  2460. TransferInfoPacket Transfer = new TransferInfoPacket
  2461. {
  2462. TransferInfo =
  2463. {
  2464. ChannelType = (int) ChannelType.Asset,
  2465. Status = (int) assetErrors,
  2466. TargetType = 0,
  2467. Params = req.Params,
  2468. Size = 0,
  2469. TransferID = req.TransferRequestID
  2470. },
  2471. Header = {Zerocoded = true}
  2472. };
  2473. OutPacket(Transfer, ThrottleOutPacketType.Transfer);
  2474. }
  2475. public void SendAsset(AssetRequestToClient req)
  2476. {
  2477. if (req.AssetInf.Data == null)
  2478. {
  2479. MainConsole.Instance.ErrorFormat("[LLClientView]: Cannot send asset {0} ({1}), asset data is null",
  2480. req.AssetInf.ID, req.AssetInf.TypeString);
  2481. return;
  2482. }
  2483. //MainConsole.Instance.Debug("sending asset " + req.RequestAssetID);
  2484. TransferInfoPacket Transfer = new TransferInfoPacket
  2485. {
  2486. TransferInfo =
  2487. {
  2488. ChannelType = (int) ChannelType.Asset,
  2489. Status = (int) TransferPacketStatus.MorePacketsToCome,
  2490. TargetType = 0
  2491. }
  2492. };
  2493. if (req.AssetRequestSource == 2)
  2494. {
  2495. Transfer.TransferInfo.Params = new byte[20];
  2496. Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  2497. int assType = req.AssetInf.Type;
  2498. Array.Copy(Utils.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4);
  2499. }
  2500. else if (req.AssetRequestSource == 3)
  2501. {
  2502. Transfer.TransferInfo.Params = req.Params;
  2503. // Transfer.TransferInfo.Params = new byte[100];
  2504. //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  2505. //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
  2506. }
  2507. Transfer.TransferInfo.Size = req.AssetInf.Data.Length;
  2508. Transfer.TransferInfo.TransferID = req.TransferRequestID;
  2509. Transfer.Header.Zerocoded = true;
  2510. OutPacket(Transfer, ThrottleOutPacketType.Transfer);
  2511. if (req.NumPackets == 1)
  2512. {
  2513. TransferPacketPacket TransferPacket = new TransferPacketPacket
  2514. {
  2515. TransferData =
  2516. {
  2517. Packet = 0,
  2518. ChannelType = (int) ChannelType.Asset,
  2519. TransferID = req.TransferRequestID,
  2520. Data = req.AssetInf.Data,
  2521. Status = (int) TransferPacketStatus.Done
  2522. },
  2523. Header = {Zerocoded = true}
  2524. };
  2525. OutPacket(TransferPacket, ThrottleOutPacketType.Transfer);
  2526. }
  2527. else
  2528. {
  2529. int processedLength = 0;
  2530. const int maxChunkSize = 1024;
  2531. int packetNumber = 0;
  2532. const int firstPacketSize = 600;
  2533. while (processedLength < req.AssetInf.Data.Length)
  2534. {
  2535. TransferPacketPacket TransferPacket = new TransferPacketPacket
  2536. {
  2537. TransferData =
  2538. {
  2539. Packet = packetNumber,
  2540. ChannelType = (int) ChannelType.Asset,
  2541. TransferID = req.TransferRequestID
  2542. }
  2543. };
  2544. int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength,
  2545. packetNumber == 0 ? firstPacketSize : maxChunkSize);
  2546. byte[] chunk = new byte[chunkSize];
  2547. Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length);
  2548. TransferPacket.TransferData.Data = chunk;
  2549. processedLength += chunkSize;
  2550. // 0 indicates more packets to come, 1 indicates last packet
  2551. if (req.AssetInf.Data.Length - processedLength == 0)
  2552. {
  2553. TransferPacket.TransferData.Status = (int) TransferPacketStatus.Done;
  2554. }
  2555. else
  2556. {
  2557. TransferPacket.TransferData.Status = (int) TransferPacketStatus.MorePacketsToCome;
  2558. }
  2559. TransferPacket.Header.Zerocoded = true;
  2560. OutPacket(TransferPacket, ThrottleOutPacketType.Transfer);
  2561. packetNumber++;
  2562. }
  2563. }
  2564. }
  2565. public void SendRegionHandle(UUID regionID, ulong handle)
  2566. {
  2567. RegionIDAndHandleReplyPacket reply =
  2568. (RegionIDAndHandleReplyPacket) PacketPool.Instance.GetPacket(PacketType.RegionIDAndHandleReply);
  2569. reply.ReplyBlock.RegionID = regionID;
  2570. reply.ReplyBlock.RegionHandle = handle;
  2571. OutPacket(reply, ThrottleOutPacketType.Land);
  2572. }
  2573. public void SendParcelInfo(LandData land, UUID parcelID, uint x, uint y, string SimName)
  2574. {
  2575. ParcelInfoReplyPacket reply =
  2576. (ParcelInfoReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply);
  2577. reply.AgentData.AgentID = m_agentId;
  2578. reply.Data.ParcelID = parcelID;
  2579. reply.Data.OwnerID = land.OwnerID;
  2580. reply.Data.Name = Utils.StringToBytes(land.Name);
  2581. reply.Data.Desc = Utils.StringToBytes(land.Description);
  2582. reply.Data.ActualArea = land.Area;
  2583. reply.Data.BillableArea = land.Area; // TODO: what is this?
  2584. // Bit 0: Mature, bit 7: on sale, other bits: no idea
  2585. reply.Data.Flags = (byte) (
  2586. land.Maturity > 0
  2587. ? (1 << 0)
  2588. : 0 +
  2589. ((land.Flags & (uint) ParcelFlags.ForSale) != 0 ? (1 << 7) : 0));
  2590. Vector3 pos = land.UserLocation;
  2591. if (pos.Equals(Vector3.Zero))
  2592. {
  2593. pos = (land.AABBMax + land.AABBMin)*0.5f;
  2594. }
  2595. reply.Data.GlobalX = x;
  2596. reply.Data.GlobalY = y;
  2597. reply.Data.GlobalZ = pos.Z;
  2598. reply.Data.SimName = Utils.StringToBytes(SimName);
  2599. reply.Data.SnapshotID = land.SnapshotID;
  2600. reply.Data.Dwell = land.Dwell;
  2601. reply.Data.SalePrice = land.SalePrice;
  2602. reply.Data.AuctionID = (int) land.AuctionID;
  2603. OutPacket(reply, ThrottleOutPacketType.Land);
  2604. }
  2605. public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
  2606. {
  2607. ScriptTeleportRequestPacket packet =
  2608. (ScriptTeleportRequestPacket) PacketPool.Instance.GetPacket(PacketType.ScriptTeleportRequest);
  2609. packet.Data.ObjectName = Utils.StringToBytes(objName);
  2610. packet.Data.SimName = Utils.StringToBytes(simName);
  2611. packet.Data.SimPosition = pos;
  2612. packet.Data.LookAt = lookAt;
  2613. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2614. }
  2615. public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
  2616. {
  2617. DirPlacesReplyPacket packet =
  2618. (DirPlacesReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  2619. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  2620. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  2621. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  2622. packet.AgentData.AgentID = AgentId;
  2623. packet.QueryData[0].QueryID = queryID;
  2624. DirPlacesReplyPacket.QueryRepliesBlock[] replies =
  2625. new DirPlacesReplyPacket.QueryRepliesBlock[0];
  2626. DirPlacesReplyPacket.StatusDataBlock[] status =
  2627. new DirPlacesReplyPacket.StatusDataBlock[0];
  2628. packet.QueryReplies = replies;
  2629. packet.StatusData = status;
  2630. foreach (DirPlacesReplyData d in data)
  2631. {
  2632. int idx = replies.Length;
  2633. Array.Resize(ref replies, idx + 1);
  2634. Array.Resize(ref status, idx + 1);
  2635. replies[idx] = new DirPlacesReplyPacket.QueryRepliesBlock();
  2636. status[idx] = new DirPlacesReplyPacket.StatusDataBlock();
  2637. replies[idx].ParcelID = d.parcelID;
  2638. replies[idx].Name = Utils.StringToBytes(d.name);
  2639. replies[idx].ForSale = d.forSale;
  2640. replies[idx].Auction = d.auction;
  2641. replies[idx].Dwell = d.dwell;
  2642. status[idx].Status = d.Status;
  2643. packet.QueryReplies = replies;
  2644. packet.StatusData = status;
  2645. if (packet.Length >= 1000)
  2646. {
  2647. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2648. packet = (DirPlacesReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  2649. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  2650. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  2651. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  2652. packet.AgentData.AgentID = AgentId;
  2653. packet.QueryData[0].QueryID = queryID;
  2654. replies = new DirPlacesReplyPacket.QueryRepliesBlock[0];
  2655. status = new DirPlacesReplyPacket.StatusDataBlock[0];
  2656. }
  2657. }
  2658. packet.HasVariableBlocks = false;
  2659. if (replies.Length > 0 || data.Length == 0)
  2660. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2661. }
  2662. public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
  2663. {
  2664. DirPeopleReplyPacket packet =
  2665. (DirPeopleReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirPeopleReply);
  2666. packet.AgentData = new DirPeopleReplyPacket.AgentDataBlock {AgentID = AgentId};
  2667. packet.QueryData = new DirPeopleReplyPacket.QueryDataBlock {QueryID = queryID};
  2668. packet.QueryReplies = new DirPeopleReplyPacket.QueryRepliesBlock[
  2669. data.Length];
  2670. int i = 0;
  2671. foreach (DirPeopleReplyData d in data)
  2672. {
  2673. packet.QueryReplies[i] = new DirPeopleReplyPacket.QueryRepliesBlock
  2674. {
  2675. AgentID = d.agentID,
  2676. FirstName = Utils.StringToBytes(d.firstName),
  2677. LastName = Utils.StringToBytes(d.lastName),
  2678. Group = Utils.StringToBytes(d.group),
  2679. Online = d.online,
  2680. Reputation = d.reputation
  2681. };
  2682. i++;
  2683. }
  2684. packet.HasVariableBlocks = false;
  2685. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2686. }
  2687. public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
  2688. {
  2689. DirEventsReplyPacket packet =
  2690. (DirEventsReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirEventsReply);
  2691. packet.AgentData = new DirEventsReplyPacket.AgentDataBlock {AgentID = AgentId};
  2692. packet.QueryData = new DirEventsReplyPacket.QueryDataBlock {QueryID = queryID};
  2693. packet.QueryReplies = new DirEventsReplyPacket.QueryRepliesBlock[
  2694. data.Length];
  2695. packet.StatusData = new DirEventsReplyPacket.StatusDataBlock[
  2696. data.Length];
  2697. int i = 0;
  2698. foreach (DirEventsReplyData d in data)
  2699. {
  2700. packet.QueryReplies[i] = new DirEventsReplyPacket.QueryRepliesBlock();
  2701. packet.StatusData[i] = new DirEventsReplyPacket.StatusDataBlock();
  2702. packet.QueryReplies[i].OwnerID = d.ownerID;
  2703. packet.QueryReplies[i].Name =
  2704. Utils.StringToBytes(d.name);
  2705. packet.QueryReplies[i].EventID = d.eventID;
  2706. packet.QueryReplies[i].Date =
  2707. Utils.StringToBytes(d.date);
  2708. packet.QueryReplies[i].UnixTime = d.unixTime;
  2709. packet.QueryReplies[i].EventFlags = d.eventFlags;
  2710. packet.StatusData[i].Status = d.Status;
  2711. i++;
  2712. }
  2713. packet.HasVariableBlocks = false;
  2714. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2715. }
  2716. public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
  2717. {
  2718. DirGroupsReplyPacket packet =
  2719. (DirGroupsReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirGroupsReply);
  2720. packet.AgentData = new DirGroupsReplyPacket.AgentDataBlock {AgentID = AgentId};
  2721. packet.QueryData = new DirGroupsReplyPacket.QueryDataBlock {QueryID = queryID};
  2722. packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[
  2723. data.Length];
  2724. int i = 0;
  2725. foreach (DirGroupsReplyData d in data)
  2726. {
  2727. packet.QueryReplies[i] = new DirGroupsReplyPacket.QueryRepliesBlock
  2728. {
  2729. GroupID = d.groupID,
  2730. GroupName = Utils.StringToBytes(d.groupName),
  2731. Members = d.members,
  2732. SearchOrder = d.searchOrder
  2733. };
  2734. i++;
  2735. }
  2736. packet.HasVariableBlocks = false;
  2737. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2738. }
  2739. public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
  2740. {
  2741. DirClassifiedReplyPacket packet =
  2742. (DirClassifiedReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirClassifiedReply);
  2743. packet.AgentData = new DirClassifiedReplyPacket.AgentDataBlock {AgentID = AgentId};
  2744. packet.QueryData = new DirClassifiedReplyPacket.QueryDataBlock {QueryID = queryID};
  2745. packet.QueryReplies = new DirClassifiedReplyPacket.QueryRepliesBlock[
  2746. data.Length];
  2747. packet.StatusData = new DirClassifiedReplyPacket.StatusDataBlock[
  2748. data.Length];
  2749. int i = 0;
  2750. foreach (DirClassifiedReplyData d in data)
  2751. {
  2752. packet.QueryReplies[i] = new DirClassifiedReplyPacket.QueryRepliesBlock();
  2753. packet.StatusData[i] = new DirClassifiedReplyPacket.StatusDataBlock();
  2754. packet.QueryReplies[i].ClassifiedID = d.classifiedID;
  2755. packet.QueryReplies[i].Name =
  2756. Utils.StringToBytes(d.name);
  2757. packet.QueryReplies[i].ClassifiedFlags = d.classifiedFlags;
  2758. packet.QueryReplies[i].CreationDate = d.creationDate;
  2759. packet.QueryReplies[i].ExpirationDate = d.expirationDate;
  2760. packet.QueryReplies[i].PriceForListing = d.price;
  2761. packet.StatusData[i].Status = d.Status;
  2762. i++;
  2763. }
  2764. packet.HasVariableBlocks = false;
  2765. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2766. }
  2767. public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
  2768. {
  2769. DirLandReplyPacket packet = (DirLandReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirLandReply);
  2770. packet.AgentData = new DirLandReplyPacket.AgentDataBlock {AgentID = AgentId};
  2771. packet.QueryData = new DirLandReplyPacket.QueryDataBlock {QueryID = queryID};
  2772. packet.QueryReplies = new DirLandReplyPacket.QueryRepliesBlock[
  2773. data.Length];
  2774. int i = 0;
  2775. foreach (DirLandReplyData d in data)
  2776. {
  2777. packet.QueryReplies[i] = new DirLandReplyPacket.QueryRepliesBlock
  2778. {
  2779. ParcelID = d.parcelID,
  2780. Name = Utils.StringToBytes(d.name),
  2781. Auction = d.auction,
  2782. ForSale = d.forSale,
  2783. SalePrice = d.salePrice,
  2784. ActualArea = d.actualArea
  2785. };
  2786. i++;
  2787. }
  2788. packet.HasVariableBlocks = false;
  2789. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2790. }
  2791. public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
  2792. {
  2793. DirPopularReplyPacket packet =
  2794. (DirPopularReplyPacket) PacketPool.Instance.GetPacket(PacketType.DirPopularReply);
  2795. packet.AgentData = new DirPopularReplyPacket.AgentDataBlock {AgentID = AgentId};
  2796. packet.QueryData = new DirPopularReplyPacket.QueryDataBlock {QueryID = queryID};
  2797. packet.QueryReplies = new DirPopularReplyPacket.QueryRepliesBlock[
  2798. data.Length];
  2799. int i = 0;
  2800. foreach (DirPopularReplyData d in data)
  2801. {
  2802. packet.QueryReplies[i] = new DirPopularReplyPacket.QueryRepliesBlock
  2803. {
  2804. ParcelID = d.ParcelID,
  2805. Name = Utils.StringToBytes(d.Name),
  2806. Dwell = d.Dwell
  2807. };
  2808. i++;
  2809. }
  2810. packet.HasVariableBlocks = false;
  2811. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2812. }
  2813. public void SendEventInfoReply(EventData data)
  2814. {
  2815. EventInfoReplyPacket packet =
  2816. (EventInfoReplyPacket) PacketPool.Instance.GetPacket(PacketType.EventInfoReply);
  2817. packet.AgentData = new EventInfoReplyPacket.AgentDataBlock {AgentID = AgentId};
  2818. packet.EventData = new EventInfoReplyPacket.EventDataBlock
  2819. {
  2820. EventID = data.eventID,
  2821. Creator = Utils.StringToBytes(data.creator),
  2822. Name = Utils.StringToBytes(data.name),
  2823. Category = Utils.StringToBytes(data.category),
  2824. Desc = Utils.StringToBytes(data.description),
  2825. Date = Utils.StringToBytes(data.date),
  2826. DateUTC = data.dateUTC,
  2827. Duration = data.duration,
  2828. Cover = data.cover,
  2829. Amount = data.amount,
  2830. SimName = Utils.StringToBytes(data.simName),
  2831. GlobalPos = new Vector3d(data.globalPos),
  2832. EventFlags = data.eventFlags
  2833. };
  2834. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  2835. }
  2836. public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
  2837. {
  2838. MapItemReplyPacket mirplk = new MapItemReplyPacket
  2839. {
  2840. AgentData = {AgentID = AgentId},
  2841. RequestData = {ItemType = mapitemtype},
  2842. Data = new MapItemReplyPacket.DataBlock[replies.Length]
  2843. };
  2844. for (int i = 0; i < replies.Length; i++)
  2845. {
  2846. MapItemReplyPacket.DataBlock mrdata = new MapItemReplyPacket.DataBlock
  2847. {
  2848. X = replies[i].x,
  2849. Y = replies[i].y,
  2850. ID = replies[i].id,
  2851. Extra = replies[i].Extra,
  2852. Extra2 = replies[i].Extra2,
  2853. Name = Utils.StringToBytes(replies[i].name)
  2854. };
  2855. mirplk.Data[i] = mrdata;
  2856. }
  2857. //MainConsole.Instance.Debug(mirplk.ToString());
  2858. OutPacket(mirplk, ThrottleOutPacketType.Land);
  2859. }
  2860. public void SendOfferCallingCard(UUID srcID, UUID transactionID)
  2861. {
  2862. // a bit special, as this uses AgentID to store the source instead
  2863. // of the destination. The destination (the receiver) goes into destID
  2864. OfferCallingCardPacket p =
  2865. (OfferCallingCardPacket) PacketPool.Instance.GetPacket(PacketType.OfferCallingCard);
  2866. p.AgentData.AgentID = srcID;
  2867. p.AgentData.SessionID = UUID.Zero;
  2868. p.AgentBlock.DestID = AgentId;
  2869. p.AgentBlock.TransactionID = transactionID;
  2870. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2871. }
  2872. public void SendAcceptCallingCard(UUID transactionID)
  2873. {
  2874. AcceptCallingCardPacket p =
  2875. (AcceptCallingCardPacket) PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard);
  2876. p.AgentData.AgentID = AgentId;
  2877. p.AgentData.SessionID = UUID.Zero;
  2878. p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1];
  2879. p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock {FolderID = UUID.Zero};
  2880. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2881. }
  2882. public void SendDeclineCallingCard(UUID transactionID)
  2883. {
  2884. DeclineCallingCardPacket p =
  2885. (DeclineCallingCardPacket) PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard);
  2886. p.AgentData.AgentID = AgentId;
  2887. p.AgentData.SessionID = UUID.Zero;
  2888. p.TransactionBlock.TransactionID = transactionID;
  2889. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2890. }
  2891. public void SendTerminateFriend(UUID exFriendID)
  2892. {
  2893. TerminateFriendshipPacket p =
  2894. (TerminateFriendshipPacket) PacketPool.Instance.GetPacket(PacketType.TerminateFriendship);
  2895. p.AgentData.AgentID = AgentId;
  2896. p.AgentData.SessionID = SessionId;
  2897. p.ExBlock.OtherID = exFriendID;
  2898. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2899. }
  2900. public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
  2901. {
  2902. OSDMap llsd = new OSDMap(3);
  2903. OSDArray AgentData = new OSDArray(1);
  2904. OSDMap AgentDataMap = new OSDMap(1)
  2905. {{"AgentID", OSD.FromUUID(AgentId)}, {"AvatarID", OSD.FromUUID(avatarID)}};
  2906. AgentData.Add(AgentDataMap);
  2907. llsd.Add("AgentData", AgentData);
  2908. OSDArray GroupData = new OSDArray(data.Length);
  2909. OSDArray NewGroupData = new OSDArray(data.Length);
  2910. foreach (GroupMembershipData m in data)
  2911. {
  2912. OSDMap GroupDataMap = new OSDMap(6);
  2913. OSDMap NewGroupDataMap = new OSDMap(1);
  2914. GroupDataMap.Add("GroupPowers", OSD.FromULong(m.GroupPowers));
  2915. GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(m.AcceptNotices));
  2916. GroupDataMap.Add("GroupTitle", OSD.FromString(m.GroupTitle));
  2917. GroupDataMap.Add("GroupID", OSD.FromUUID(m.GroupID));
  2918. GroupDataMap.Add("GroupName", OSD.FromString(m.GroupName));
  2919. GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(m.GroupPicture));
  2920. NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(m.ListInProfile));
  2921. GroupData.Add(GroupDataMap);
  2922. NewGroupData.Add(NewGroupDataMap);
  2923. }
  2924. llsd.Add("GroupData", GroupData);
  2925. llsd.Add("NewGroupData", NewGroupData);
  2926. IEventQueueService eq = Scene.RequestModuleInterface<IEventQueueService>();
  2927. if (eq != null)
  2928. {
  2929. eq.Enqueue(BuildEvent("AvatarGroupsReply", llsd), AgentId, Scene.RegionInfo.RegionID);
  2930. }
  2931. }
  2932. public void SendJoinGroupReply(UUID groupID, bool success)
  2933. {
  2934. JoinGroupReplyPacket p = (JoinGroupReplyPacket) PacketPool.Instance.GetPacket(PacketType.JoinGroupReply);
  2935. p.AgentData = new JoinGroupReplyPacket.AgentDataBlock {AgentID = AgentId};
  2936. p.GroupData = new JoinGroupReplyPacket.GroupDataBlock {GroupID = groupID, Success = success};
  2937. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2938. }
  2939. public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool success)
  2940. {
  2941. EjectGroupMemberReplyPacket p =
  2942. (EjectGroupMemberReplyPacket) PacketPool.Instance.GetPacket(PacketType.EjectGroupMemberReply);
  2943. p.AgentData = new EjectGroupMemberReplyPacket.AgentDataBlock {AgentID = agentID};
  2944. p.GroupData = new EjectGroupMemberReplyPacket.GroupDataBlock {GroupID = groupID};
  2945. p.EjectData = new EjectGroupMemberReplyPacket.EjectDataBlock {Success = success};
  2946. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2947. }
  2948. public void SendLeaveGroupReply(UUID groupID, bool success)
  2949. {
  2950. LeaveGroupReplyPacket p = (LeaveGroupReplyPacket) PacketPool.Instance.GetPacket(PacketType.LeaveGroupReply);
  2951. p.AgentData = new LeaveGroupReplyPacket.AgentDataBlock {AgentID = AgentId};
  2952. p.GroupData = new LeaveGroupReplyPacket.GroupDataBlock {GroupID = groupID, Success = success};
  2953. OutPacket(p, ThrottleOutPacketType.AvatarInfo);
  2954. }
  2955. public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name)
  2956. {
  2957. if (classifiedID.Length != name.Length)
  2958. return;
  2959. AvatarClassifiedReplyPacket ac =
  2960. (AvatarClassifiedReplyPacket) PacketPool.Instance.GetPacket(
  2961. PacketType.AvatarClassifiedReply);
  2962. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock {AgentID = AgentId, TargetID = targetID};
  2963. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifiedID.Length];
  2964. int i;
  2965. for (i = 0; i < classifiedID.Length; i++)
  2966. {
  2967. ac.Data[i].ClassifiedID = classifiedID[i];
  2968. ac.Data[i].Name = Utils.StringToBytes(name[i]);
  2969. }
  2970. OutPacket(ac, ThrottleOutPacketType.AvatarInfo);
  2971. }
  2972. public void SendClassifiedInfoReply(UUID classifiedID, UUID creatorID, uint creationDate, uint expirationDate,
  2973. uint category, string name, string description, UUID parcelID,
  2974. uint parentEstate, UUID snapshotID, string simName, Vector3 globalPos,
  2975. string parcelName, byte classifiedFlags, int price)
  2976. {
  2977. ClassifiedInfoReplyPacket cr =
  2978. (ClassifiedInfoReplyPacket) PacketPool.Instance.GetPacket(
  2979. PacketType.ClassifiedInfoReply);
  2980. cr.AgentData = new ClassifiedInfoReplyPacket.AgentDataBlock {AgentID = AgentId};
  2981. cr.Data = new ClassifiedInfoReplyPacket.DataBlock
  2982. {
  2983. ClassifiedID = classifiedID,
  2984. CreatorID = creatorID,
  2985. CreationDate = creationDate,
  2986. ExpirationDate = expirationDate,
  2987. Category = category,
  2988. Name = Utils.StringToBytes(name),
  2989. Desc = Utils.StringToBytes(description),
  2990. ParcelID = parcelID,
  2991. ParentEstate = parentEstate,
  2992. SnapshotID = snapshotID,
  2993. SimName = Utils.StringToBytes(simName),
  2994. PosGlobal = new Vector3d(globalPos),
  2995. ParcelName = Utils.StringToBytes(parcelName),
  2996. ClassifiedFlags = classifiedFlags,
  2997. PriceForListing = price
  2998. };
  2999. OutPacket(cr, ThrottleOutPacketType.AvatarInfo);
  3000. }
  3001. public void SendAgentDropGroup(UUID groupID)
  3002. {
  3003. AgentDropGroupPacket dg =
  3004. (AgentDropGroupPacket) PacketPool.Instance.GetPacket(
  3005. PacketType.AgentDropGroup);
  3006. dg.AgentData = new AgentDropGroupPacket.AgentDataBlock {AgentID = AgentId, GroupID = groupID};
  3007. OutPacket(dg, ThrottleOutPacketType.AvatarInfo);
  3008. }
  3009. public void SendAvatarNotesReply(UUID targetID, string text)
  3010. {
  3011. AvatarNotesReplyPacket an =
  3012. (AvatarNotesReplyPacket) PacketPool.Instance.GetPacket(
  3013. PacketType.AvatarNotesReply);
  3014. an.AgentData = new AvatarNotesReplyPacket.AgentDataBlock {AgentID = AgentId};
  3015. an.Data = new AvatarNotesReplyPacket.DataBlock {TargetID = targetID, Notes = Utils.StringToBytes(text)};
  3016. OutPacket(an, ThrottleOutPacketType.AvatarInfo);
  3017. }
  3018. public void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks)
  3019. {
  3020. AvatarPicksReplyPacket ap =
  3021. (AvatarPicksReplyPacket) PacketPool.Instance.GetPacket(
  3022. PacketType.AvatarPicksReply);
  3023. ap.AgentData = new AvatarPicksReplyPacket.AgentDataBlock {AgentID = AgentId, TargetID = targetID};
  3024. ap.Data = new AvatarPicksReplyPacket.DataBlock[picks.Count];
  3025. int i = 0;
  3026. foreach (KeyValuePair<UUID, string> pick in picks)
  3027. {
  3028. ap.Data[i] = new AvatarPicksReplyPacket.DataBlock
  3029. {PickID = pick.Key, PickName = Utils.StringToBytes(pick.Value)};
  3030. i++;
  3031. }
  3032. OutPacket(ap, ThrottleOutPacketType.AvatarInfo);
  3033. }
  3034. public void SendAvatarClassifiedReply(UUID targetID, Dictionary<UUID, string> classifieds)
  3035. {
  3036. AvatarClassifiedReplyPacket ac =
  3037. (AvatarClassifiedReplyPacket) PacketPool.Instance.GetPacket(
  3038. PacketType.AvatarClassifiedReply);
  3039. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock {AgentID = AgentId, TargetID = targetID};
  3040. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifieds.Count];
  3041. int i = 0;
  3042. foreach (KeyValuePair<UUID, string> classified in classifieds)
  3043. {
  3044. ac.Data[i] = new AvatarClassifiedReplyPacket.DataBlock
  3045. {ClassifiedID = classified.Key, Name = Utils.StringToBytes(classified.Value)};
  3046. i++;
  3047. }
  3048. OutPacket(ac, ThrottleOutPacketType.AvatarInfo);
  3049. }
  3050. public void SendParcelDwellReply(int localID, UUID parcelID, float dwell)
  3051. {
  3052. ParcelDwellReplyPacket pd =
  3053. (ParcelDwellReplyPacket) PacketPool.Instance.GetPacket(
  3054. PacketType.ParcelDwellReply);
  3055. pd.AgentData = new ParcelDwellReplyPacket.AgentDataBlock {AgentID = AgentId};
  3056. pd.Data = new ParcelDwellReplyPacket.DataBlock {LocalID = localID, ParcelID = parcelID, Dwell = dwell};
  3057. OutPacket(pd, ThrottleOutPacketType.Land);
  3058. }
  3059. public void SendUserInfoReply(bool imViaEmail, bool visible, string email)
  3060. {
  3061. UserInfoReplyPacket ur =
  3062. (UserInfoReplyPacket) PacketPool.Instance.GetPacket(
  3063. PacketType.UserInfoReply);
  3064. string Visible = "hidden";
  3065. if (visible)
  3066. Visible = "default";
  3067. ur.AgentData = new UserInfoReplyPacket.AgentDataBlock {AgentID = AgentId};
  3068. ur.UserData = new UserInfoReplyPacket.UserDataBlock
  3069. {
  3070. IMViaEMail = imViaEmail,
  3071. DirectoryVisibility = Utils.StringToBytes(Visible),
  3072. EMail = Utils.StringToBytes(email)
  3073. };
  3074. OutPacket(ur, ThrottleOutPacketType.AvatarInfo);
  3075. }
  3076. public void SendCreateGroupReply(UUID groupID, bool success, string message)
  3077. {
  3078. CreateGroupReplyPacket createGroupReply =
  3079. (CreateGroupReplyPacket) PacketPool.Instance.GetPacket(PacketType.CreateGroupReply);
  3080. createGroupReply.AgentData =
  3081. new CreateGroupReplyPacket.AgentDataBlock();
  3082. createGroupReply.ReplyData =
  3083. new CreateGroupReplyPacket.ReplyDataBlock();
  3084. createGroupReply.AgentData.AgentID = AgentId;
  3085. createGroupReply.ReplyData.GroupID = groupID;
  3086. createGroupReply.ReplyData.Success = success;
  3087. createGroupReply.ReplyData.Message = Utils.StringToBytes(message);
  3088. OutPacket(createGroupReply, ThrottleOutPacketType.AvatarInfo);
  3089. }
  3090. public void SendUseCachedMuteList()
  3091. {
  3092. UseCachedMuteListPacket useCachedMuteList =
  3093. (UseCachedMuteListPacket) PacketPool.Instance.GetPacket(PacketType.UseCachedMuteList);
  3094. useCachedMuteList.AgentData = new UseCachedMuteListPacket.AgentDataBlock {AgentID = AgentId};
  3095. OutPacket(useCachedMuteList, ThrottleOutPacketType.AvatarInfo);
  3096. }
  3097. public void SendMuteListUpdate(string filename)
  3098. {
  3099. MuteListUpdatePacket muteListUpdate =
  3100. (MuteListUpdatePacket) PacketPool.Instance.GetPacket(PacketType.MuteListUpdate);
  3101. muteListUpdate.MuteData = new MuteListUpdatePacket.MuteDataBlock
  3102. {AgentID = AgentId, Filename = Utils.StringToBytes(filename)};
  3103. OutPacket(muteListUpdate, ThrottleOutPacketType.AvatarInfo);
  3104. }
  3105. public void SendPickInfoReply(UUID pickID, UUID creatorID, bool topPick, UUID parcelID, string name, string desc,
  3106. UUID snapshotID, string user, string originalName, string simName,
  3107. Vector3 posGlobal, int sortOrder, bool enabled)
  3108. {
  3109. PickInfoReplyPacket pickInfoReply =
  3110. (PickInfoReplyPacket) PacketPool.Instance.GetPacket(PacketType.PickInfoReply);
  3111. pickInfoReply.AgentData = new PickInfoReplyPacket.AgentDataBlock {AgentID = AgentId};
  3112. pickInfoReply.Data = new PickInfoReplyPacket.DataBlock
  3113. {
  3114. PickID = pickID,
  3115. CreatorID = creatorID,
  3116. TopPick = topPick,
  3117. ParcelID = parcelID,
  3118. Name = Utils.StringToBytes(name),
  3119. Desc = Utils.StringToBytes(desc),
  3120. SnapshotID = snapshotID,
  3121. User = Utils.StringToBytes(user),
  3122. OriginalName = Utils.StringToBytes(originalName),
  3123. SimName = Utils.StringToBytes(simName),
  3124. PosGlobal = new Vector3d(posGlobal),
  3125. SortOrder = sortOrder,
  3126. Enabled = enabled
  3127. };
  3128. OutPacket(pickInfoReply, ThrottleOutPacketType.AvatarInfo);
  3129. }
  3130. #endregion Scene/Avatar to Client
  3131. #region Appearance/ Wearables Methods
  3132. public void SendWearables(AvatarWearable[] wearables, int serial)
  3133. {
  3134. AgentWearablesUpdatePacket aw =
  3135. (AgentWearablesUpdatePacket) PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
  3136. aw.AgentData.AgentID = AgentId;
  3137. aw.AgentData.SerialNum = (uint) serial;
  3138. aw.AgentData.SessionID = m_sessionId;
  3139. int count = wearables.Sum(t => t.Count);
  3140. // TODO: don't create new blocks if recycling an old packet
  3141. aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[count];
  3142. int idx = 0;
  3143. for (int i = 0; i < wearables.Length; i++)
  3144. {
  3145. for (int j = 0; j < wearables[i].Count; j++)
  3146. {
  3147. AgentWearablesUpdatePacket.WearableDataBlock awb = new AgentWearablesUpdatePacket.WearableDataBlock
  3148. {
  3149. WearableType = (byte) i,
  3150. AssetID = wearables[i][j].AssetID,
  3151. ItemID = wearables[i][j].ItemID
  3152. };
  3153. aw.WearableData[idx] = awb;
  3154. idx++;
  3155. // MainConsole.Instance.DebugFormat(
  3156. // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}",
  3157. // awb.ItemID, awb.AssetID, i, Name);
  3158. }
  3159. }
  3160. // OutPacket(aw, ThrottleOutPacketType.Texture);
  3161. OutPacket(aw, ThrottleOutPacketType.AvatarInfo);
  3162. }
  3163. public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
  3164. {
  3165. AvatarAppearancePacket avp =
  3166. (AvatarAppearancePacket) PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
  3167. // TODO: don't create new blocks if recycling an old packet
  3168. avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
  3169. avp.ObjectData.TextureEntry = textureEntry;
  3170. for (int i = 0; i < visualParams.Length; i++)
  3171. {
  3172. AvatarAppearancePacket.VisualParamBlock avblock = new AvatarAppearancePacket.VisualParamBlock
  3173. {
  3174. ParamValue
  3175. =
  3176. visualParams
  3177. [i
  3178. ]
  3179. };
  3180. avp.VisualParam[i] = avblock;
  3181. }
  3182. avp.AppearanceData = new AvatarAppearancePacket.AppearanceDataBlock[1]
  3183. {new AvatarAppearancePacket.AppearanceDataBlock()};
  3184. avp.Sender.IsTrial = false;
  3185. avp.Sender.ID = agentID;
  3186. //MainConsole.Instance.InfoFormat("[LLClientView]: Sending appearance for {0} to {1}", agentID.ToString(), AgentId.ToString());
  3187. // OutPacket(avp, ThrottleOutPacketType.Texture);
  3188. OutPacket(avp, ThrottleOutPacketType.AvatarInfo);
  3189. }
  3190. public void SendAnimations(AnimationGroup animations)
  3191. {
  3192. //MainConsole.Instance.DebugFormat("[CLIENT]: Sending animations to {0}", Name);
  3193. AvatarAnimationPacket ani =
  3194. (AvatarAnimationPacket) PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
  3195. // TODO: don't create new blocks if recycling an old packet
  3196. ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[animations.Animations.Length];
  3197. ani.Sender = new AvatarAnimationPacket.SenderBlock {ID = animations.AvatarID};
  3198. ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Animations.Length];
  3199. ani.PhysicalAvatarEventList = new AvatarAnimationPacket.PhysicalAvatarEventListBlock[1];
  3200. ani.PhysicalAvatarEventList[0] = new AvatarAnimationPacket.PhysicalAvatarEventListBlock
  3201. {TypeData = new byte[0]};
  3202. for (int i = 0; i < animations.Animations.Length; ++i)
  3203. {
  3204. ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock
  3205. {
  3206. AnimID = animations.Animations[i],
  3207. AnimSequenceID = animations.SequenceNums[i] + ((i + 1)*2)
  3208. };
  3209. ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock
  3210. {ObjectID = animations.ObjectIDs[i]};
  3211. //if (objectIDs[i] == UUID.Zero)
  3212. // ani.AnimationSourceList[i].ObjectID = sourceAgentId;
  3213. }
  3214. //We do this here to keep the numbers under control
  3215. m_animationSequenceNumber += (animations.Animations.Length*2);
  3216. ani.Header.Reliable = true;
  3217. ani.HasVariableBlocks = false;
  3218. // OutPacket(ani, ThrottleOutPacketType.Asset);
  3219. OutPacket(ani, ThrottleOutPacketType.AvatarInfo, true, null,
  3220. delegate
  3221. { m_scene.GetScenePresence(AgentId).SceneViewer.FinishedAnimationPacketSend(animations); });
  3222. }
  3223. #endregion
  3224. #region Avatar Packet/Data Sending Methods
  3225. /// <summary>
  3226. /// Send an ObjectUpdate packet with information about an avatar
  3227. /// </summary>
  3228. public void SendAvatarDataImmediate(IEntity avatar)
  3229. {
  3230. IScenePresence presence = avatar as IScenePresence;
  3231. if (presence == null || presence.IsChildAgent)
  3232. return;
  3233. ObjectUpdatePacket objupdate = (ObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  3234. objupdate.Header.Zerocoded = true;
  3235. objupdate.RegionData.RegionHandle = presence.Scene.RegionInfo.RegionHandle;
  3236. float TIME_DILATION = presence.Scene.TimeDilation;
  3237. ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f);
  3238. objupdate.RegionData.TimeDilation = timeDilation;
  3239. objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
  3240. objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence);
  3241. OutPacket(objupdate, ThrottleOutPacketType.OutBand);
  3242. }
  3243. public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
  3244. {
  3245. if (!IsActive) return; // We don't need to update inactive clients.
  3246. CoarseLocationUpdatePacket loc =
  3247. (CoarseLocationUpdatePacket) PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
  3248. loc.Header.Reliable = false;
  3249. // Each packet can only hold around 60 avatar positions and the client clears the mini-map each time
  3250. // a CoarseLocationUpdate packet is received. Oh well.
  3251. int total = Math.Min(CoarseLocations.Count, 60);
  3252. CoarseLocationUpdatePacket.IndexBlock ib = new CoarseLocationUpdatePacket.IndexBlock();
  3253. loc.Location = new CoarseLocationUpdatePacket.LocationBlock[total];
  3254. loc.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[total];
  3255. int selfindex = -1;
  3256. for (int i = 0; i < total; i++)
  3257. {
  3258. CoarseLocationUpdatePacket.LocationBlock lb =
  3259. new CoarseLocationUpdatePacket.LocationBlock
  3260. {
  3261. X = (byte) CoarseLocations[i].X,
  3262. Y = (byte) CoarseLocations[i].Y,
  3263. Z = CoarseLocations[i].Z > 1024 ? (byte) 0 : (byte) (CoarseLocations[i].Z*0.25f)
  3264. };
  3265. loc.Location[i] = lb;
  3266. loc.AgentData[i] = new CoarseLocationUpdatePacket.AgentDataBlock {AgentID = users[i]};
  3267. if (users[i] == AgentId)
  3268. selfindex = i;
  3269. }
  3270. ib.You = (short) selfindex;
  3271. ib.Prey = -1;
  3272. loc.Index = ib;
  3273. OutPacket(loc, ThrottleOutPacketType.AvatarInfo);
  3274. }
  3275. #endregion Avatar Packet/Data Sending Methods
  3276. #region Primitive Packet/Data Sending Methods
  3277. /// <summary>
  3278. /// Generate one of the object update packets based on PrimUpdateFlags
  3279. /// and broadcast the packet to clients
  3280. /// </summary>
  3281. /// again presences update preiority was lost. recovering it fast and dirty
  3282. public void SendAvatarUpdate(IEnumerable<EntityUpdate> updates)
  3283. {
  3284. Framework.Utilities.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>> terseUpdateBlocks =
  3285. new Framework.Utilities.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>>();
  3286. List<EntityUpdate> terseUpdates = new List<EntityUpdate>();
  3287. foreach (EntityUpdate update in updates)
  3288. {
  3289. terseUpdates.Add(update);
  3290. terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity,
  3291. update.Flags.HasFlag(PrimUpdateFlags.Textures)));
  3292. }
  3293. ushort timeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
  3294. if (terseUpdateBlocks.IsValueCreated)
  3295. {
  3296. List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseUpdateBlocks.Value;
  3297. ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket
  3298. {
  3299. RegionData =
  3300. {
  3301. RegionHandle = m_scene.RegionInfo.RegionHandle,
  3302. TimeDilation = timeDilation
  3303. },
  3304. ObjectData =
  3305. new ImprovedTerseObjectUpdatePacket.ObjectDataBlock
  3306. [blocks.Count]
  3307. };
  3308. for (int i = 0; i < blocks.Count; i++)
  3309. packet.ObjectData[i] = blocks[i];
  3310. OutPacket(packet, ThrottleOutPacketType.AvatarInfo, true,
  3311. p => ResendPrimUpdates(terseUpdates, p),
  3312. delegate
  3313. {
  3314. IScenePresence presence = m_scene.GetScenePresence(AgentId);
  3315. if (presence != null)
  3316. presence.SceneViewer.FinishedEntityPacketSend(terseUpdates);
  3317. });
  3318. }
  3319. }
  3320. public void SendPrimUpdate(IEnumerable<EntityUpdate> updates)
  3321. {
  3322. Framework.Utilities.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks =
  3323. new Framework.Utilities.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>();
  3324. Framework.Utilities.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks =
  3325. new Framework.Utilities.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>();
  3326. Framework.Utilities.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>> terseUpdateBlocks =
  3327. new Framework.Utilities.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>>();
  3328. Framework.Utilities.Lazy<List<ObjectUpdateCachedPacket.ObjectDataBlock>> cachedUpdateBlocks =
  3329. new Framework.Utilities.Lazy<List<ObjectUpdateCachedPacket.ObjectDataBlock>>();
  3330. List<EntityUpdate> fullUpdates = new List<EntityUpdate>();
  3331. List<EntityUpdate> compressedUpdates = new List<EntityUpdate>();
  3332. List<EntityUpdate> cachedUpdates = new List<EntityUpdate>();
  3333. List<EntityUpdate> terseUpdates = new List<EntityUpdate>();
  3334. foreach (EntityUpdate update in updates)
  3335. {
  3336. IEntity entity = update.Entity;
  3337. PrimUpdateFlags updateFlags = update.Flags;
  3338. bool canUseCompressed = true;
  3339. bool canUseImproved = true;
  3340. bool canUseCached = false;
  3341. //Not possible at the moment without more viewer work... the viewer does some odd things with this
  3342. IObjectCache module = Scene.RequestModuleInterface<IObjectCache>();
  3343. bool isTerse = updateFlags.HasFlag((PrimUpdateFlags.TerseUpdate)) &&
  3344. !updateFlags.HasFlag(PrimUpdateFlags.FullUpdate) &&
  3345. !updateFlags.HasFlag(PrimUpdateFlags.ForcedFullUpdate);
  3346. // Compressed and cached object updates only make sense for LL primitives
  3347. if (entity is ISceneChildEntity)
  3348. {
  3349. // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client
  3350. // will never receive an update after a prim kill. Even then, keeping the kill record may be a good
  3351. // safety measure.
  3352. //
  3353. // If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update
  3354. // after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs
  3355. // updates and kills on different threads with different scheduling strategies, hence this protection.
  3356. //
  3357. // This doesn't appear to apply to child prims - a client will happily ignore these updates
  3358. // after the root prim has been deleted.
  3359. /*if (m_killRecord.Contains(entity.LocalId))
  3360. {
  3361. MainConsole.Instance.ErrorFormat(
  3362. "[CLIENT]: Preventing update for prim with local id {0} after client for user {1} told it was deleted. Mantis this at http://mantis.aurora-sim.org/bug_report_page.php !",
  3363. entity.LocalId, Name);
  3364. return;
  3365. }*/
  3366. ISceneChildEntity ent = (ISceneChildEntity) entity;
  3367. if (ent.Shape.PCode == 9 && ent.Shape.State != 0)
  3368. {
  3369. //Don't send hud attachments to other avatars except for the owner
  3370. byte state = ent.Shape.State;
  3371. if ((state == (byte) AttachmentPoint.HUDBottom ||
  3372. state == (byte) AttachmentPoint.HUDBottomLeft ||
  3373. state == (byte) AttachmentPoint.HUDBottomRight ||
  3374. state == (byte) AttachmentPoint.HUDCenter ||
  3375. state == (byte) AttachmentPoint.HUDCenter2 ||
  3376. state == (byte) AttachmentPoint.HUDTop ||
  3377. state == (byte) AttachmentPoint.HUDTopLeft ||
  3378. state == (byte) AttachmentPoint.HUDTopRight)
  3379. &&
  3380. ent.OwnerID != AgentId)
  3381. continue;
  3382. }
  3383. if (updateFlags != PrimUpdateFlags.TerseUpdate && ent.ParentEntity.SitTargetAvatar.Count > 0)
  3384. {
  3385. isTerse = false;
  3386. updateFlags = PrimUpdateFlags.ForcedFullUpdate;
  3387. }
  3388. if (canUseCached && !isTerse && module != null)
  3389. canUseCached = module.UseCachedObject(AgentId, entity.LocalId, ent.CRC);
  3390. else
  3391. //No cache module? Don't use cached then, or it won't stop sending ObjectUpdateCached even when the client requests prims
  3392. canUseCached = false;
  3393. }
  3394. if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate))
  3395. {
  3396. canUseCompressed = false;
  3397. canUseImproved = false;
  3398. }
  3399. else if (updateFlags.HasFlag(PrimUpdateFlags.ForcedFullUpdate))
  3400. {
  3401. //If a full update has been requested, DO THE FULL UPDATE.
  3402. // Don't try to get out of this.... the monster called RepeatObjectUpdateCachedFromTheServer will occur and eat all your prims!
  3403. canUseCached = false;
  3404. canUseCompressed = false;
  3405. canUseImproved = false;
  3406. }
  3407. else
  3408. {
  3409. if (updateFlags.HasFlag(PrimUpdateFlags.Velocity) ||
  3410. updateFlags.HasFlag(PrimUpdateFlags.Acceleration) ||
  3411. updateFlags.HasFlag(PrimUpdateFlags.CollisionPlane) ||
  3412. updateFlags.HasFlag(PrimUpdateFlags.Joint) ||
  3413. updateFlags.HasFlag(PrimUpdateFlags.AngularVelocity))
  3414. {
  3415. canUseCompressed = false;
  3416. }
  3417. if (updateFlags.HasFlag(PrimUpdateFlags.PrimFlags) ||
  3418. updateFlags.HasFlag(PrimUpdateFlags.ParentID) ||
  3419. updateFlags.HasFlag(PrimUpdateFlags.AttachmentPoint) ||
  3420. updateFlags.HasFlag(PrimUpdateFlags.Shape) ||
  3421. updateFlags.HasFlag(PrimUpdateFlags.PrimData) ||
  3422. updateFlags.HasFlag(PrimUpdateFlags.Text) ||
  3423. updateFlags.HasFlag(PrimUpdateFlags.NameValue) ||
  3424. updateFlags.HasFlag(PrimUpdateFlags.ExtraData) ||
  3425. updateFlags.HasFlag(PrimUpdateFlags.TextureAnim) ||
  3426. updateFlags.HasFlag(PrimUpdateFlags.Sound) ||
  3427. updateFlags.HasFlag(PrimUpdateFlags.Particles) ||
  3428. updateFlags.HasFlag(PrimUpdateFlags.Material) ||
  3429. updateFlags.HasFlag(PrimUpdateFlags.ClickAction) ||
  3430. updateFlags.HasFlag(PrimUpdateFlags.MediaURL) ||
  3431. updateFlags.HasFlag(PrimUpdateFlags.Joint) ||
  3432. updateFlags.HasFlag(PrimUpdateFlags.FindBest))
  3433. {
  3434. canUseImproved = false;
  3435. }
  3436. }
  3437. try
  3438. {
  3439. //Do NOT send cached updates for terse updates
  3440. //ONLY send full updates for attachments unless you want to figure out all the little screwy things with sending compressed updates and attachments
  3441. if (entity is ISceneChildEntity &&
  3442. ((ISceneChildEntity) entity).IsAttachment)
  3443. {
  3444. canUseCached = false;
  3445. canUseImproved = false;
  3446. canUseCompressed = false;
  3447. }
  3448. if (canUseCached && !isTerse)
  3449. {
  3450. cachedUpdates.Add(update);
  3451. cachedUpdateBlocks.Value.Add(CreatePrimCachedUpdateBlock((ISceneChildEntity) entity,
  3452. m_agentId));
  3453. }
  3454. else if (!canUseImproved && !canUseCompressed)
  3455. {
  3456. fullUpdates.Add(update);
  3457. if (entity is IScenePresence)
  3458. {
  3459. objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((IScenePresence) entity));
  3460. }
  3461. else
  3462. {
  3463. objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((ISceneChildEntity) entity, m_agentId));
  3464. }
  3465. }
  3466. else if (!canUseImproved)
  3467. {
  3468. ISceneChildEntity cEntity = (ISceneChildEntity) entity;
  3469. compressedUpdates.Add(update);
  3470. //We are sending a compressed, which the client will save, add it to the cache
  3471. if (module != null)
  3472. module.AddCachedObject(AgentId, entity.LocalId, cEntity.CRC);
  3473. CompressedFlags Flags = CompressedFlags.None;
  3474. if (updateFlags == PrimUpdateFlags.FullUpdate || updateFlags == PrimUpdateFlags.FindBest)
  3475. {
  3476. //Add the defaults
  3477. updateFlags = PrimUpdateFlags.None;
  3478. }
  3479. updateFlags |= PrimUpdateFlags.ClickAction;
  3480. updateFlags |= PrimUpdateFlags.ExtraData;
  3481. updateFlags |= PrimUpdateFlags.Shape;
  3482. updateFlags |= PrimUpdateFlags.Material;
  3483. updateFlags |= PrimUpdateFlags.Textures;
  3484. updateFlags |= PrimUpdateFlags.Rotation;
  3485. updateFlags |= PrimUpdateFlags.PrimFlags;
  3486. updateFlags |= PrimUpdateFlags.Position;
  3487. updateFlags |= PrimUpdateFlags.AngularVelocity;
  3488. //Must send these as well
  3489. if (cEntity.Text != "")
  3490. updateFlags |= PrimUpdateFlags.Text;
  3491. if (cEntity.AngularVelocity != Vector3.Zero)
  3492. updateFlags |= PrimUpdateFlags.AngularVelocity;
  3493. if (cEntity.TextureAnimation != null && cEntity.TextureAnimation.Length != 0)
  3494. updateFlags |= PrimUpdateFlags.TextureAnim;
  3495. if (cEntity.Sound != UUID.Zero)
  3496. updateFlags |= PrimUpdateFlags.Sound;
  3497. if (cEntity.ParticleSystem != null && cEntity.ParticleSystem.Length != 0)
  3498. updateFlags |= PrimUpdateFlags.Particles;
  3499. if (!string.IsNullOrEmpty(cEntity.MediaUrl))
  3500. updateFlags |= PrimUpdateFlags.MediaURL;
  3501. if (cEntity.ParentEntity.RootChild.IsAttachment)
  3502. updateFlags |= PrimUpdateFlags.AttachmentPoint;
  3503. //Make sure that we send this! Otherwise, the client will only see one prim
  3504. if (cEntity.ParentEntity != null)
  3505. if (cEntity.ParentEntity.ChildrenEntities().Count != 1)
  3506. updateFlags |= PrimUpdateFlags.ParentID;
  3507. if (updateFlags.HasFlag(PrimUpdateFlags.Text) && cEntity.Text == "")
  3508. updateFlags &= ~PrimUpdateFlags.Text; //Remove the text flag if we don't have text!
  3509. if (updateFlags.HasFlag(PrimUpdateFlags.AngularVelocity))
  3510. Flags |= CompressedFlags.HasAngularVelocity;
  3511. if (updateFlags.HasFlag(PrimUpdateFlags.MediaURL))
  3512. Flags |= CompressedFlags.MediaURL;
  3513. if (updateFlags.HasFlag(PrimUpdateFlags.ParentID))
  3514. Flags |= CompressedFlags.HasParent;
  3515. if (updateFlags.HasFlag(PrimUpdateFlags.Particles))
  3516. Flags |= CompressedFlags.HasParticles;
  3517. if (updateFlags.HasFlag(PrimUpdateFlags.Sound))
  3518. Flags |= CompressedFlags.HasSound;
  3519. if (updateFlags.HasFlag(PrimUpdateFlags.Text))
  3520. Flags |= CompressedFlags.HasText;
  3521. if (updateFlags.HasFlag(PrimUpdateFlags.TextureAnim))
  3522. Flags |= CompressedFlags.TextureAnimation;
  3523. if (updateFlags.HasFlag(PrimUpdateFlags.NameValue) || cEntity.IsAttachment)
  3524. Flags |= CompressedFlags.HasNameValues;
  3525. compressedUpdates.Add(update);
  3526. compressedUpdateBlocks.Value.Add(CreateCompressedUpdateBlock((ISceneChildEntity) entity, Flags,
  3527. updateFlags));
  3528. }
  3529. else
  3530. {
  3531. terseUpdates.Add(update);
  3532. terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(entity,
  3533. updateFlags.HasFlag(
  3534. PrimUpdateFlags.Textures)));
  3535. }
  3536. }
  3537. catch (Exception ex)
  3538. {
  3539. MainConsole.Instance.Warn("[LLCLIENTVIEW]: Issue creating an update block " + ex);
  3540. return;
  3541. }
  3542. }
  3543. ushort timeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
  3544. //
  3545. // NOTE: These packets ARE being sent as Unknown for a reason
  3546. // This method is ONLY being called by the SceneViewer, which is being called by
  3547. // the LLUDPClient, which is attempting to send these packets out, they just have to
  3548. // be created. So instead of sending them as task (which puts them back in the queue),
  3549. // we send them out immediately, as this is on a seperate thread anyway.
  3550. //
  3551. // SECOND NOTE: These packets are back as Task for now... we shouldn't send them out as unknown
  3552. // as we cannot be sure that the UDP server is ready for us to send them, so we will
  3553. // requeue them... even though we probably could send them out fine.
  3554. //
  3555. if (objectUpdateBlocks.IsValueCreated)
  3556. {
  3557. List<ObjectUpdatePacket.ObjectDataBlock> blocks = objectUpdateBlocks.Value;
  3558. ObjectUpdatePacket packet = (ObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  3559. packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
  3560. packet.RegionData.TimeDilation = timeDilation;
  3561. packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count];
  3562. for (int i = 0; i < blocks.Count; i++)
  3563. packet.ObjectData[i] = blocks[i];
  3564. //ObjectUpdatePacket oo = new ObjectUpdatePacket(packet.ToBytes(), ref ii);
  3565. OutPacket(packet, ThrottleOutPacketType.Task, true,
  3566. p => ResendPrimUpdates(fullUpdates, p),
  3567. delegate
  3568. {
  3569. IScenePresence presence = m_scene.GetScenePresence(AgentId);
  3570. if (presence != null)
  3571. presence.SceneViewer.FinishedEntityPacketSend(fullUpdates);
  3572. });
  3573. }
  3574. if (compressedUpdateBlocks.IsValueCreated)
  3575. {
  3576. List<ObjectUpdateCompressedPacket.ObjectDataBlock> blocks = compressedUpdateBlocks.Value;
  3577. ObjectUpdateCompressedPacket packet =
  3578. (ObjectUpdateCompressedPacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed);
  3579. packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
  3580. packet.RegionData.TimeDilation = timeDilation;
  3581. packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count];
  3582. packet.Type = PacketType.ObjectUpdate;
  3583. for (int i = 0; i < blocks.Count; i++)
  3584. packet.ObjectData[i] = blocks[i];
  3585. OutPacket(packet, ThrottleOutPacketType.Task, true,
  3586. p => ResendPrimUpdates(compressedUpdates, p),
  3587. delegate
  3588. {
  3589. IScenePresence presence = m_scene.GetScenePresence(AgentId);
  3590. if (presence != null)
  3591. presence.SceneViewer.FinishedEntityPacketSend(compressedUpdates);
  3592. });
  3593. }
  3594. if (cachedUpdateBlocks.IsValueCreated)
  3595. {
  3596. List<ObjectUpdateCachedPacket.ObjectDataBlock> blocks = cachedUpdateBlocks.Value;
  3597. ObjectUpdateCachedPacket packet =
  3598. (ObjectUpdateCachedPacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCached);
  3599. packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
  3600. packet.RegionData.TimeDilation = timeDilation;
  3601. packet.ObjectData = new ObjectUpdateCachedPacket.ObjectDataBlock[blocks.Count];
  3602. for (int i = 0; i < blocks.Count; i++)
  3603. packet.ObjectData[i] = blocks[i];
  3604. OutPacket(packet, ThrottleOutPacketType.Task, true,
  3605. p => ResendPrimUpdates(cachedUpdates, p),
  3606. delegate
  3607. {
  3608. IScenePresence presence = m_scene.GetScenePresence(AgentId);
  3609. if (presence != null)
  3610. presence.SceneViewer.FinishedEntityPacketSend(cachedUpdates);
  3611. });
  3612. }
  3613. if (terseUpdateBlocks.IsValueCreated)
  3614. {
  3615. List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseUpdateBlocks.Value;
  3616. ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket
  3617. {
  3618. RegionData =
  3619. {
  3620. RegionHandle = m_scene.RegionInfo.RegionHandle,
  3621. TimeDilation = timeDilation
  3622. },
  3623. ObjectData =
  3624. new ImprovedTerseObjectUpdatePacket.ObjectDataBlock
  3625. [blocks.Count]
  3626. };
  3627. for (int i = 0; i < blocks.Count; i++)
  3628. packet.ObjectData[i] = blocks[i];
  3629. OutPacket(packet, ThrottleOutPacketType.Task, true,
  3630. p => ResendPrimUpdates(terseUpdates, p),
  3631. delegate
  3632. {
  3633. IScenePresence presence = m_scene.GetScenePresence(AgentId);
  3634. if (presence != null)
  3635. presence.SceneViewer.FinishedEntityPacketSend(terseUpdates);
  3636. });
  3637. }
  3638. }
  3639. private void ResendPrimUpdates(IEnumerable<EntityUpdate> updates, OutgoingPacket oPacket)
  3640. {
  3641. // Remove the update packet from the list of packets waiting for acknowledgement
  3642. // because we are requeuing the list of updates. They will be resent in new packets
  3643. // with the most recent state and priority.
  3644. m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
  3645. // Count this as a resent packet since we are going to requeue all of the updates contained in it
  3646. Interlocked.Increment(ref m_udpClient.PacketsResent);
  3647. IScenePresence sp = m_scene.GetScenePresence(AgentId);
  3648. if (sp != null)
  3649. {
  3650. ISceneViewer viewer = sp.SceneViewer;
  3651. foreach (EntityUpdate update in updates)
  3652. {
  3653. if (update.Entity is ISceneChildEntity)
  3654. viewer.QueuePartForUpdate((ISceneChildEntity) update.Entity, update.Flags);
  3655. else
  3656. viewer.QueuePresenceForUpdate((IScenePresence) update.Entity, update.Flags);
  3657. }
  3658. }
  3659. }
  3660. public void DequeueUpdates(int nprimdates, int navadates)
  3661. {
  3662. IScenePresence sp = m_scene.GetScenePresence(AgentId);
  3663. if (sp != null)
  3664. {
  3665. ISceneViewer viewer = sp.SceneViewer;
  3666. viewer.SendPrimUpdates(nprimdates, navadates);
  3667. }
  3668. }
  3669. #endregion Primitive Packet/Data Sending Methods
  3670. private void HandleQueueEmpty(object o)
  3671. {
  3672. // arraytmp 0 contains current number of packets in task
  3673. // arraytmp 1 contains current number of packets in avatarinfo
  3674. // arraytmp 2 contains current number of packets in texture
  3675. int[] arraytmp = (int[]) o;
  3676. int ptmp = m_udpServer.PrimUpdatesPerCallback - arraytmp[0];
  3677. int atmp = m_udpServer.AvatarUpdatesPerCallBack - arraytmp[1];
  3678. if (ptmp < 0)
  3679. ptmp = 0;
  3680. if (atmp < 0)
  3681. atmp = 0;
  3682. if (ptmp + atmp != 0)
  3683. DequeueUpdates(ptmp, atmp);
  3684. if (m_udpServer.TextureSendLimit > arraytmp[2])
  3685. ProcessTextureRequests(m_udpServer.TextureSendLimit);
  3686. }
  3687. private void ProcessTextureRequests(int numPackets)
  3688. {
  3689. //note: tmp is never used
  3690. //int tmp = m_udpClient.GetCurTexPacksInQueue();
  3691. if (m_imageManager != null)
  3692. m_imageManager.ProcessImageQueue(numPackets);
  3693. }
  3694. public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
  3695. {
  3696. AssetUploadCompletePacket newPack = new AssetUploadCompletePacket
  3697. {
  3698. AssetBlock =
  3699. {Type = AssetType, Success = Success, UUID = AssetFullID},
  3700. Header = {Zerocoded = true}
  3701. };
  3702. OutPacket(newPack, ThrottleOutPacketType.Asset);
  3703. }
  3704. public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
  3705. {
  3706. RequestXferPacket newPack = new RequestXferPacket
  3707. {
  3708. XferID =
  3709. {
  3710. ID = XferID,
  3711. VFileType = AssetType,
  3712. VFileID = vFileID,
  3713. FilePath = FilePath,
  3714. Filename = FileName
  3715. },
  3716. Header = {Zerocoded = true}
  3717. };
  3718. OutPacket(newPack, ThrottleOutPacketType.Transfer);
  3719. }
  3720. public void SendConfirmXfer(ulong xferID, uint PacketID)
  3721. {
  3722. ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket
  3723. {
  3724. XferID = {ID = xferID, Packet = PacketID},
  3725. Header = {Zerocoded = true}
  3726. };
  3727. OutPacket(newPack, ThrottleOutPacketType.Transfer);
  3728. }
  3729. public void SendInitiateDownload(string simFileName, string clientFileName)
  3730. {
  3731. InitiateDownloadPacket newPack = new InitiateDownloadPacket
  3732. {
  3733. AgentData = {AgentID = AgentId},
  3734. FileData =
  3735. {
  3736. SimFilename = Utils.StringToBytes(simFileName),
  3737. ViewerFilename = Utils.StringToBytes(clientFileName)
  3738. }
  3739. };
  3740. OutPacket(newPack, ThrottleOutPacketType.Transfer);
  3741. }
  3742. public void SendImageFirstPart(
  3743. ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
  3744. {
  3745. ImageDataPacket im = new ImageDataPacket
  3746. {Header = {Reliable = false}, ImageID = {Packets = numParts, ID = ImageUUID}};
  3747. if (ImageSize > 0)
  3748. im.ImageID.Size = ImageSize;
  3749. im.ImageData.Data = ImageData;
  3750. im.ImageID.Codec = imageCodec;
  3751. im.Header.Zerocoded = true;
  3752. OutPacket(im, ThrottleOutPacketType.Texture);
  3753. }
  3754. public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
  3755. {
  3756. ImagePacketPacket im = new ImagePacketPacket
  3757. {
  3758. Header = {Reliable = false},
  3759. ImageID = {Packet = partNumber, ID = imageUuid},
  3760. ImageData = {Data = imageData}
  3761. };
  3762. OutPacket(im, ThrottleOutPacketType.Texture);
  3763. }
  3764. public void SendImageNotFound(UUID imageid)
  3765. {
  3766. ImageNotInDatabasePacket notFoundPacket
  3767. = (ImageNotInDatabasePacket) PacketPool.Instance.GetPacket(PacketType.ImageNotInDatabase);
  3768. notFoundPacket.ImageID.ID = imageid;
  3769. OutPacket(notFoundPacket, ThrottleOutPacketType.Texture);
  3770. }
  3771. private volatile bool m_sendingSimStatsPacket;
  3772. public void SendSimStats(SimStats stats)
  3773. {
  3774. if (m_sendingSimStatsPacket)
  3775. return;
  3776. m_sendingSimStatsPacket = true;
  3777. SimStatsPacket pack = new SimStatsPacket
  3778. {
  3779. Region = stats.RegionBlock,
  3780. RegionInfo =
  3781. new SimStatsPacket.RegionInfoBlock[1]
  3782. {
  3783. new SimStatsPacket.RegionInfoBlock()
  3784. {
  3785. RegionFlagsExtended =
  3786. stats.RegionBlock
  3787. .RegionFlags
  3788. }
  3789. },
  3790. Stat = stats.StatsBlock,
  3791. Header = {Reliable = false}
  3792. };
  3793. OutPacket(pack, ThrottleOutPacketType.Task, true, null,
  3794. delegate { m_sendingSimStatsPacket = false; });
  3795. }
  3796. public void SendObjectPropertiesFamilyData(uint RequestFlags, UUID ObjectUUID, UUID OwnerID, UUID GroupID,
  3797. uint BaseMask, uint OwnerMask, uint GroupMask, uint EveryoneMask,
  3798. uint NextOwnerMask, int OwnershipCost, byte SaleType, int SalePrice,
  3799. uint Category,
  3800. UUID LastOwnerID, string ObjectName, string Description)
  3801. {
  3802. ObjectPropertiesFamilyPacket objPropFamilyPack =
  3803. (ObjectPropertiesFamilyPacket) PacketPool.Instance.GetPacket(PacketType.ObjectPropertiesFamily);
  3804. // TODO: don't create new blocks if recycling an old packet
  3805. ObjectPropertiesFamilyPacket.ObjectDataBlock objPropDB = new ObjectPropertiesFamilyPacket.ObjectDataBlock
  3806. {
  3807. RequestFlags = RequestFlags,
  3808. ObjectID = ObjectUUID,
  3809. OwnerID =
  3810. OwnerID == GroupID
  3811. ? UUID.Zero
  3812. : OwnerID,
  3813. GroupID = GroupID,
  3814. BaseMask = BaseMask,
  3815. OwnerMask = OwnerMask,
  3816. GroupMask = GroupMask,
  3817. EveryoneMask = EveryoneMask,
  3818. NextOwnerMask = NextOwnerMask,
  3819. OwnershipCost = OwnershipCost,
  3820. SaleType = SaleType,
  3821. SalePrice = SalePrice,
  3822. Category = Category,
  3823. LastOwnerID = LastOwnerID,
  3824. Name = Util.StringToBytes256(ObjectName),
  3825. Description =
  3826. Util.StringToBytes256(Description)
  3827. };
  3828. objPropFamilyPack.ObjectData = objPropDB;
  3829. objPropFamilyPack.Header.Zerocoded = true;
  3830. objPropFamilyPack.HasVariableBlocks = false;
  3831. OutPacket(objPropFamilyPack, ThrottleOutPacketType.Task);
  3832. }
  3833. public void SendObjectPropertiesReply(List<IEntity> parts)
  3834. {
  3835. //ObjectPropertiesPacket proper = (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  3836. // TODO: don't create new blocks if recycling an old packet
  3837. //Theres automatic splitting, just let it go on through
  3838. ObjectPropertiesPacket proper =
  3839. (ObjectPropertiesPacket) PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  3840. proper.ObjectData =
  3841. parts.OfType<ISceneChildEntity>()
  3842. .Select(entity => entity as ISceneChildEntity)
  3843. .Select(part => new ObjectPropertiesPacket.ObjectDataBlock
  3844. {
  3845. ItemID = part.FromUserInventoryItemID,
  3846. CreationDate = (ulong) part.CreationDate*1000000,
  3847. CreatorID = part.CreatorID,
  3848. FolderID = UUID.Zero,
  3849. FromTaskID = UUID.Zero,
  3850. GroupID = part.GroupID,
  3851. InventorySerial = (short) part.InventorySerial,
  3852. LastOwnerID = part.LastOwnerID,
  3853. ObjectID = part.UUID,
  3854. OwnerID = part.OwnerID == part.GroupID ? UUID.Zero : part.OwnerID,
  3855. TouchName = Util.StringToBytes256(part.ParentEntity.RootChild.TouchName),
  3856. TextureID = new byte[0],
  3857. SitName = Util.StringToBytes256(part.ParentEntity.RootChild.SitName),
  3858. Name = Util.StringToBytes256(part.Name),
  3859. Description = Util.StringToBytes256(part.Description),
  3860. OwnerMask = part.ParentEntity.RootChild.OwnerMask,
  3861. NextOwnerMask = part.ParentEntity.RootChild.NextOwnerMask,
  3862. GroupMask = part.ParentEntity.RootChild.GroupMask,
  3863. EveryoneMask = part.ParentEntity.RootChild.EveryoneMask,
  3864. BaseMask = part.ParentEntity.RootChild.BaseMask,
  3865. SaleType = part.ParentEntity.RootChild.ObjectSaleType,
  3866. SalePrice = part.ParentEntity.RootChild.SalePrice
  3867. }).ToArray();
  3868. proper.Header.Zerocoded = true;
  3869. bool hasFinishedSending = false; //Since this packet will be split up, we only want to finish sending once
  3870. OutPacket(proper, ThrottleOutPacketType.State, true, null, delegate
  3871. {
  3872. if (hasFinishedSending)
  3873. return;
  3874. hasFinishedSending = true;
  3875. m_scene.GetScenePresence(AgentId).
  3876. SceneViewer.
  3877. FinishedPropertyPacketSend(parts);
  3878. });
  3879. }
  3880. #region Estate Data Sending Methods
  3881. private static bool convertParamStringToBool(byte[] field)
  3882. {
  3883. string s = Utils.BytesToString(field);
  3884. if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
  3885. {
  3886. return true;
  3887. }
  3888. return false;
  3889. }
  3890. public void SendEstateList(UUID invoice, int code, List<UUID> Data, uint estateID)
  3891. {
  3892. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket
  3893. {
  3894. AgentData =
  3895. {
  3896. TransactionID = UUID.Random(),
  3897. AgentID = AgentId,
  3898. SessionID = SessionId
  3899. },
  3900. MethodData =
  3901. {Invoice = invoice, Method = Utils.StringToBytes("setaccess")}
  3902. };
  3903. EstateOwnerMessagePacket.ParamListBlock[] returnblock =
  3904. new EstateOwnerMessagePacket.ParamListBlock[6 + Data.Count];
  3905. for (int i = 0; i < (6 + Data.Count); i++)
  3906. {
  3907. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3908. }
  3909. int j = 0;
  3910. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString());
  3911. j++;
  3912. returnblock[j].Parameter = Utils.StringToBytes(code.ToString());
  3913. j++;
  3914. returnblock[j].Parameter = Utils.StringToBytes("0");
  3915. j++;
  3916. returnblock[j].Parameter = Utils.StringToBytes("0");
  3917. j++;
  3918. returnblock[j].Parameter = Utils.StringToBytes("0");
  3919. j++;
  3920. returnblock[j].Parameter = Utils.StringToBytes("0");
  3921. j++;
  3922. j = 2; // Agents
  3923. if ((code & 2) != 0)
  3924. j = 3; // Groups
  3925. if ((code & 8) != 0)
  3926. j = 5; // Managers
  3927. returnblock[j].Parameter = Utils.StringToBytes(Data.Count.ToString());
  3928. j = 6;
  3929. for (int i = 0; i < Data.Count; i++)
  3930. {
  3931. returnblock[j].Parameter = Data[i].GetBytes();
  3932. j++;
  3933. }
  3934. packet.ParamList = returnblock;
  3935. packet.Header.Reliable = true;
  3936. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  3937. }
  3938. public void SendBannedUserList(UUID invoice, List<EstateBan> bl, uint estateID)
  3939. {
  3940. List<UUID> BannedUsers =
  3941. (from t in bl where t != null where t.BannedUserID != UUID.Zero select t.BannedUserID).ToList();
  3942. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket
  3943. {
  3944. AgentData =
  3945. {
  3946. TransactionID = UUID.Random(),
  3947. AgentID = AgentId,
  3948. SessionID = SessionId
  3949. },
  3950. MethodData =
  3951. {Invoice = invoice, Method = Utils.StringToBytes("setaccess")}
  3952. };
  3953. EstateOwnerMessagePacket.ParamListBlock[] returnblock =
  3954. new EstateOwnerMessagePacket.ParamListBlock[6 + BannedUsers.Count];
  3955. for (int i = 0; i < (6 + BannedUsers.Count); i++)
  3956. {
  3957. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3958. }
  3959. int j = 0;
  3960. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString());
  3961. j++;
  3962. returnblock[j].Parameter =
  3963. Utils.StringToBytes(((int) EstateTools.EstateAccessReplyDelta.EstateBans).ToString());
  3964. j++;
  3965. returnblock[j].Parameter = Utils.StringToBytes("0");
  3966. j++;
  3967. returnblock[j].Parameter = Utils.StringToBytes("0");
  3968. j++;
  3969. returnblock[j].Parameter = Utils.StringToBytes(BannedUsers.Count.ToString());
  3970. j++;
  3971. returnblock[j].Parameter = Utils.StringToBytes("0");
  3972. j++;
  3973. foreach (UUID banned in BannedUsers)
  3974. {
  3975. returnblock[j].Parameter = banned.GetBytes();
  3976. j++;
  3977. }
  3978. packet.ParamList = returnblock;
  3979. packet.Header.Reliable = false;
  3980. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  3981. }
  3982. public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
  3983. {
  3984. RegionInfoPacket rinfopack = new RegionInfoPacket();
  3985. RegionInfoPacket.RegionInfoBlock rinfoblk = new RegionInfoPacket.RegionInfoBlock();
  3986. rinfopack.AgentData.AgentID = AgentId;
  3987. rinfopack.AgentData.SessionID = SessionId;
  3988. rinfoblk.BillableFactor = args.billableFactor;
  3989. rinfoblk.EstateID = args.estateID;
  3990. rinfoblk.MaxAgents = args.maxAgents;
  3991. rinfoblk.ObjectBonusFactor = args.objectBonusFactor;
  3992. rinfoblk.ParentEstateID = args.parentEstateID;
  3993. rinfoblk.PricePerMeter = args.pricePerMeter;
  3994. rinfoblk.RedirectGridX = args.redirectGridX;
  3995. rinfoblk.RedirectGridY = args.redirectGridY;
  3996. rinfoblk.RegionFlags = (uint) args.regionFlags;
  3997. rinfoblk.SimAccess = args.simAccess;
  3998. rinfoblk.SunHour = args.sunHour;
  3999. rinfoblk.TerrainLowerLimit = args.terrainLowerLimit;
  4000. rinfoblk.TerrainRaiseLimit = args.terrainRaiseLimit;
  4001. rinfoblk.UseEstateSun = args.useEstateSun;
  4002. rinfoblk.WaterHeight = args.waterHeight;
  4003. rinfoblk.SimName = Utils.StringToBytes(args.simName);
  4004. rinfopack.RegionInfo2 = new RegionInfoPacket.RegionInfo2Block
  4005. {
  4006. HardMaxAgents = uint.MaxValue,
  4007. HardMaxObjects = uint.MaxValue,
  4008. MaxAgents32 = args.maxAgents,
  4009. ProductName = Utils.StringToBytes(args.regionType),
  4010. ProductSKU = Utils.EmptyBytes
  4011. };
  4012. rinfopack.HasVariableBlocks = true;
  4013. rinfopack.RegionInfo = rinfoblk;
  4014. rinfopack.AgentData = new RegionInfoPacket.AgentDataBlock {AgentID = AgentId, SessionID = SessionId};
  4015. rinfopack.RegionInfo3 = new RegionInfoPacket.RegionInfo3Block[1]
  4016. {
  4017. new RegionInfoPacket.RegionInfo3Block()
  4018. {
  4019. RegionFlagsExtended =
  4020. args.regionFlags
  4021. }
  4022. };
  4023. rinfopack.RegionInfo3 = new RegionInfoPacket.RegionInfo3Block[1]
  4024. {
  4025. new RegionInfoPacket.RegionInfo3Block()
  4026. {
  4027. RegionFlagsExtended =
  4028. args.regionFlags
  4029. }
  4030. };
  4031. OutPacket(rinfopack, ThrottleOutPacketType.AvatarInfo);
  4032. }
  4033. public void SendEstateCovenantInformation(UUID covenant, int covenantLastUpdated)
  4034. {
  4035. EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
  4036. EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock
  4037. {
  4038. CovenantID = covenant,
  4039. CovenantTimestamp = (uint) covenantLastUpdated,
  4040. EstateOwnerID =
  4041. m_scene.RegionInfo.EstateSettings.EstateOwner,
  4042. EstateName =
  4043. Utils.StringToBytes(
  4044. m_scene.RegionInfo.EstateSettings.EstateName)
  4045. };
  4046. einfopack.Data = edata;
  4047. OutPacket(einfopack, ThrottleOutPacketType.AvatarInfo);
  4048. }
  4049. public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate,
  4050. uint estateFlags, uint sunPosition, UUID covenant, int CovenantLastUpdated,
  4051. string abuseEmail, UUID estateOwner)
  4052. {
  4053. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket
  4054. {
  4055. MethodData = {Invoice = invoice},
  4056. AgentData = {TransactionID = UUID.Random()}
  4057. };
  4058. packet.MethodData.Method = Utils.StringToBytes("estateupdateinfo");
  4059. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[10];
  4060. for (int i = 0; i < 10; i++)
  4061. {
  4062. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  4063. }
  4064. //Sending Estate Settings
  4065. returnblock[0].Parameter = Utils.StringToBytes(estateName);
  4066. returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString());
  4067. returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString());
  4068. returnblock[3].Parameter = Utils.StringToBytes(estateFlags.ToString());
  4069. returnblock[4].Parameter = Utils.StringToBytes(sunPosition.ToString());
  4070. returnblock[5].Parameter = Utils.StringToBytes(parentEstate.ToString());
  4071. returnblock[6].Parameter = Utils.StringToBytes(covenant.ToString());
  4072. returnblock[7].Parameter = Utils.StringToBytes(CovenantLastUpdated.ToString());
  4073. returnblock[8].Parameter = Utils.StringToBytes("1"); // Send to this agent only
  4074. returnblock[9].Parameter = Utils.StringToBytes(abuseEmail);
  4075. packet.ParamList = returnblock;
  4076. packet.Header.Reliable = false;
  4077. //MainConsole.Instance.Debug("[ESTATE]: SIM--->" + packet.ToString());
  4078. OutPacket(packet, ThrottleOutPacketType.AvatarInfo);
  4079. }
  4080. #endregion
  4081. #region Land Data Sending Methods
  4082. public void SendLandParcelOverlay(byte[] data, int sequence_id)
  4083. {
  4084. ParcelOverlayPacket packet = (ParcelOverlayPacket) PacketPool.Instance.GetPacket(PacketType.ParcelOverlay);
  4085. packet.ParcelData.Data = data;
  4086. packet.ParcelData.SequenceID = sequence_id;
  4087. packet.Header.Zerocoded = true;
  4088. OutPacket(packet, ThrottleOutPacketType.Land);
  4089. }
  4090. public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData,
  4091. float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity,
  4092. uint regionFlags)
  4093. {
  4094. ParcelPropertiesMessage updateMessage = new ParcelPropertiesMessage();
  4095. IPrimCountModule primCountModule = m_scene.RequestModuleInterface<IPrimCountModule>();
  4096. if (primCountModule != null)
  4097. {
  4098. IPrimCounts primCounts = primCountModule.GetPrimCounts(landData.GlobalID);
  4099. updateMessage.GroupPrims = primCounts.Group;
  4100. updateMessage.OtherPrims = primCounts.Others;
  4101. updateMessage.OwnerPrims = primCounts.Owner;
  4102. updateMessage.SelectedPrims = primCounts.Selected;
  4103. updateMessage.SimWideTotalPrims = primCounts.Simulator;
  4104. updateMessage.TotalPrims = primCounts.Total;
  4105. }
  4106. updateMessage.AABBMax = landData.AABBMax;
  4107. updateMessage.AABBMin = landData.AABBMin;
  4108. updateMessage.Area = landData.Area;
  4109. updateMessage.AuctionID = landData.AuctionID;
  4110. updateMessage.AuthBuyerID = landData.AuthBuyerID;
  4111. updateMessage.Bitmap = landData.Bitmap;
  4112. updateMessage.Desc = landData.Description;
  4113. updateMessage.Category = landData.Category;
  4114. updateMessage.ClaimDate = Util.ToDateTime(landData.ClaimDate);
  4115. updateMessage.ClaimPrice = landData.ClaimPrice;
  4116. updateMessage.GroupID = landData.GroupID;
  4117. updateMessage.IsGroupOwned = landData.IsGroupOwned;
  4118. updateMessage.LandingType = (LandingType) landData.LandingType;
  4119. updateMessage.LocalID = landData.LocalID;
  4120. updateMessage.MaxPrims = parcelObjectCapacity;
  4121. updateMessage.MediaAutoScale = Convert.ToBoolean(landData.MediaAutoScale);
  4122. updateMessage.MediaID = landData.MediaID;
  4123. updateMessage.MediaURL = landData.MediaURL;
  4124. updateMessage.MusicURL = landData.MusicURL;
  4125. updateMessage.Name = landData.Name;
  4126. updateMessage.OtherCleanTime = landData.OtherCleanTime;
  4127. updateMessage.OtherCount = 0; //TODO: Unimplemented
  4128. updateMessage.OwnerID = landData.OwnerID;
  4129. updateMessage.ParcelFlags = (ParcelFlags) landData.Flags;
  4130. updateMessage.ParcelPrimBonus = simObjectBonusFactor;
  4131. updateMessage.PassHours = landData.PassHours;
  4132. updateMessage.PassPrice = landData.PassPrice;
  4133. updateMessage.PublicCount = 0; //TODO: Unimplemented
  4134. updateMessage.Privacy = landData.Private;
  4135. updateMessage.RegionPushOverride = (regionFlags & (uint) RegionFlags.RestrictPushObject) > 0;
  4136. updateMessage.RegionDenyAnonymous = (regionFlags & (uint) RegionFlags.DenyAnonymous) > 0;
  4137. updateMessage.RegionDenyIdentified = (regionFlags & (uint) RegionFlags.DenyIdentified) > 0;
  4138. updateMessage.RegionDenyTransacted = (regionFlags & (uint) RegionFlags.DenyTransacted) > 0;
  4139. updateMessage.RentPrice = 0;
  4140. updateMessage.RequestResult = (ParcelResult) request_result;
  4141. updateMessage.SalePrice = landData.SalePrice;
  4142. updateMessage.SelfCount = 0; //TODO: Unimplemented
  4143. updateMessage.SequenceID = sequence_id;
  4144. updateMessage.SimWideMaxPrims = simObjectCapacity;
  4145. updateMessage.SnapSelection = snap_selection;
  4146. updateMessage.SnapshotID = landData.SnapshotID;
  4147. updateMessage.Status = landData.Status;
  4148. updateMessage.UserLocation = landData.UserLocation;
  4149. updateMessage.UserLookAt = landData.UserLookAt;
  4150. updateMessage.MediaType = landData.MediaType;
  4151. updateMessage.MediaDesc = landData.MediaDescription;
  4152. updateMessage.MediaWidth = landData.MediaWidth;
  4153. updateMessage.MediaHeight = landData.MediaHeight;
  4154. updateMessage.MediaLoop = landData.MediaLoop;
  4155. updateMessage.ObscureMusic = landData.ObscureMusic;
  4156. updateMessage.ObscureMedia = landData.ObscureMedia;
  4157. try
  4158. {
  4159. IEventQueueService eq = Scene.RequestModuleInterface<IEventQueueService>();
  4160. if (eq != null)
  4161. {
  4162. eq.ParcelProperties(updateMessage, AgentId, Scene.RegionInfo.RegionID);
  4163. }
  4164. else
  4165. {
  4166. MainConsole.Instance.Warn("No EQ Interface when sending parcel data.");
  4167. }
  4168. }
  4169. catch (Exception ex)
  4170. {
  4171. MainConsole.Instance.Error("Unable to send parcel data via eventqueue - exception: " + ex);
  4172. }
  4173. }
  4174. public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
  4175. {
  4176. ParcelAccessListReplyPacket replyPacket =
  4177. (ParcelAccessListReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
  4178. replyPacket.Data.AgentID = AgentId;
  4179. replyPacket.Data.Flags = accessFlag;
  4180. replyPacket.Data.LocalID = localLandID;
  4181. replyPacket.Data.SequenceID = 0;
  4182. replyPacket.List =
  4183. avatars.Select(
  4184. avatar => new ParcelAccessListReplyPacket.ListBlock {Flags = accessFlag, ID = avatar, Time = 0}).
  4185. ToArray();
  4186. replyPacket.Header.Zerocoded = true;
  4187. OutPacket(replyPacket, ThrottleOutPacketType.Land);
  4188. }
  4189. public void SendForceClientSelectObjects(List<uint> ObjectIDs)
  4190. {
  4191. bool firstCall = true;
  4192. const int MAX_OBJECTS_PER_PACKET = 251;
  4193. ForceObjectSelectPacket pack =
  4194. (ForceObjectSelectPacket) PacketPool.Instance.GetPacket(PacketType.ForceObjectSelect);
  4195. while (ObjectIDs.Count > 0)
  4196. {
  4197. if (firstCall)
  4198. {
  4199. pack._Header.ResetList = true;
  4200. firstCall = false;
  4201. }
  4202. else
  4203. {
  4204. pack._Header.ResetList = false;
  4205. }
  4206. ForceObjectSelectPacket.DataBlock[] data = ObjectIDs.Count > MAX_OBJECTS_PER_PACKET
  4207. ? new ForceObjectSelectPacket.DataBlock[
  4208. MAX_OBJECTS_PER_PACKET]
  4209. : new ForceObjectSelectPacket.DataBlock[ObjectIDs.Count];
  4210. int i;
  4211. for (i = 0; i < MAX_OBJECTS_PER_PACKET && ObjectIDs.Count > 0; i++)
  4212. {
  4213. data[i] = new ForceObjectSelectPacket.DataBlock {LocalID = Convert.ToUInt32(ObjectIDs[0])};
  4214. ObjectIDs.RemoveAt(0);
  4215. }
  4216. pack.Data = data;
  4217. pack.Header.Zerocoded = true;
  4218. OutPacket(pack, ThrottleOutPacketType.State);
  4219. }
  4220. }
  4221. public void SendCameraConstraint(Vector4 ConstraintPlane)
  4222. {
  4223. CameraConstraintPacket cpack =
  4224. (CameraConstraintPacket) PacketPool.Instance.GetPacket(PacketType.CameraConstraint);
  4225. cpack.CameraCollidePlane = new CameraConstraintPacket.CameraCollidePlaneBlock {Plane = ConstraintPlane};
  4226. //MainConsole.Instance.DebugFormat("[CLIENTVIEW]: Constraint {0}", ConstraintPlane);
  4227. OutPacket(cpack, ThrottleOutPacketType.AvatarInfo);
  4228. }
  4229. public void SendLandObjectOwners(List<LandObjectOwners> objectOwners)
  4230. {
  4231. int notifyCount = objectOwners.Count;
  4232. if (notifyCount > 32)
  4233. {
  4234. MainConsole.Instance.InfoFormat(
  4235. "[LAND]: Mor e than {0} avatars own prims on this parcel. Only sending back details of first {0}"
  4236. + " - a developer might want to investigate whether this is a hard limit", 32);
  4237. notifyCount = 32;
  4238. }
  4239. ParcelObjectOwnersReplyMessage message = new ParcelObjectOwnersReplyMessage
  4240. {
  4241. PrimOwnersBlock =
  4242. new ParcelObjectOwnersReplyMessage.PrimOwner[
  4243. notifyCount]
  4244. };
  4245. int num = 0;
  4246. foreach (LandObjectOwners owner in objectOwners)
  4247. {
  4248. message.PrimOwnersBlock[num] = new ParcelObjectOwnersReplyMessage.PrimOwner
  4249. {
  4250. Count = owner.Count,
  4251. IsGroupOwned = owner.GroupOwned,
  4252. OnlineStatus = owner.Online,
  4253. OwnerID = owner.OwnerID,
  4254. TimeStamp = owner.TimeLastRezzed
  4255. };
  4256. num++;
  4257. if (num >= notifyCount)
  4258. break;
  4259. }
  4260. IEventQueueService eventQueueService = m_scene.RequestModuleInterface<IEventQueueService>();
  4261. if (eventQueueService != null)
  4262. {
  4263. eventQueueService.ParcelObjectOwnersReply(message, AgentId, m_scene.RegionInfo.RegionID);
  4264. }
  4265. }
  4266. #endregion
  4267. #region Helper Methods
  4268. private ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(IEntity entity,
  4269. bool sendTexture)
  4270. {
  4271. #region ScenePresence/SOP Handling
  4272. bool avatar = (entity is IScenePresence);
  4273. uint localID = entity.LocalId;
  4274. int attachPoint;
  4275. Vector4 collisionPlane;
  4276. Vector3 position, velocity, acceleration, angularVelocity;
  4277. Quaternion rotation;
  4278. byte[] textureEntry;
  4279. if (entity is IScenePresence)
  4280. {
  4281. IScenePresence presence = (IScenePresence) entity;
  4282. attachPoint = 0;
  4283. if (presence.PhysicsActor != null && !presence.PhysicsActor.IsColliding)
  4284. presence.CollisionPlane = Vector4.UnitW;
  4285. //We have to do this, otherwise the last ground one will be what we have, and it can cause the client to think that it shouldn't fly down, which will cause the agent to fall instead
  4286. collisionPlane = presence.CollisionPlane;
  4287. position = presence.OffsetPosition;
  4288. velocity = presence.Velocity;
  4289. acceleration = Vector3.Zero;
  4290. angularVelocity = presence.AngularVelocity;
  4291. rotation = presence.Rotation;
  4292. IAvatarAppearanceModule appearance = presence.RequestModuleInterface<IAvatarAppearanceModule>();
  4293. textureEntry = sendTexture ? appearance.Appearance.Texture.GetBytes() : null;
  4294. }
  4295. else
  4296. {
  4297. ISceneChildEntity part = (ISceneChildEntity) entity;
  4298. attachPoint = part.AttachmentPoint;
  4299. collisionPlane = Vector4.Zero;
  4300. position = part.RelativePosition;
  4301. velocity = part.Velocity;
  4302. acceleration = part.Acceleration;
  4303. angularVelocity = part.AngularVelocity;
  4304. rotation = part.GetRotationOffset();
  4305. textureEntry = sendTexture ? part.Shape.TextureEntry : null;
  4306. }
  4307. #endregion ScenePresence/SOP Handling
  4308. int pos = 0;
  4309. byte[] data = new byte[(avatar ? 60 : 44)];
  4310. // LocalID
  4311. Utils.UIntToBytes(localID, data, pos);
  4312. pos += 4;
  4313. // Avatar/CollisionPlane
  4314. data[pos] = (byte) ((attachPoint & 0x0f) << 4);
  4315. data[pos++] += (byte) (attachPoint >> 4);
  4316. if (avatar)
  4317. {
  4318. data[pos++] = 1;
  4319. if (collisionPlane == Vector4.Zero)
  4320. collisionPlane = Vector4.UnitW;
  4321. //MainConsole.Instance.DebugFormat("CollisionPlane: {0}",collisionPlane);
  4322. collisionPlane.ToBytes(data, pos);
  4323. pos += 16;
  4324. }
  4325. else
  4326. {
  4327. ++pos;
  4328. }
  4329. // Position
  4330. position.ToBytes(data, pos);
  4331. pos += 12;
  4332. // Velocity
  4333. //MainConsole.Instance.DebugFormat("Velocity: {0}", velocity);
  4334. Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.X, -128.0f, 128.0f), data, pos);
  4335. pos += 2;
  4336. Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Y, -128.0f, 128.0f), data, pos);
  4337. pos += 2;
  4338. Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Z, -128.0f, 128.0f), data, pos);
  4339. pos += 2;
  4340. // Acceleration
  4341. Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.X, -64.0f, 64.0f), data, pos);
  4342. pos += 2;
  4343. Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Y, -64.0f, 64.0f), data, pos);
  4344. pos += 2;
  4345. Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Z, -64.0f, 64.0f), data, pos);
  4346. pos += 2;
  4347. // Rotation
  4348. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.X, -1.0f, 1.0f), data, pos);
  4349. pos += 2;
  4350. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.Y, -1.0f, 1.0f), data, pos);
  4351. pos += 2;
  4352. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.Z, -1.0f, 1.0f), data, pos);
  4353. pos += 2;
  4354. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.W, -1.0f, 1.0f), data, pos);
  4355. pos += 2;
  4356. // Angular Velocity
  4357. Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.X, -64.0f, 64.0f), data, pos);
  4358. pos += 2;
  4359. Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Y, -64.0f, 64.0f), data, pos);
  4360. pos += 2;
  4361. Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Z, -64.0f, 64.0f), data, pos);
  4362. pos += 2;
  4363. ImprovedTerseObjectUpdatePacket.ObjectDataBlock block =
  4364. new ImprovedTerseObjectUpdatePacket.ObjectDataBlock {Data = data};
  4365. if (textureEntry != null && textureEntry.Length > 0)
  4366. {
  4367. byte[] teBytesFinal = new byte[textureEntry.Length + 4];
  4368. // Texture Length
  4369. Utils.IntToBytes(textureEntry.Length, textureEntry, 0);
  4370. // Texture
  4371. Buffer.BlockCopy(textureEntry, 0, teBytesFinal, 4, textureEntry.Length);
  4372. block.TextureEntry = teBytesFinal;
  4373. }
  4374. else
  4375. {
  4376. block.TextureEntry = Utils.EmptyBytes;
  4377. }
  4378. return block;
  4379. }
  4380. private ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(IScenePresence data)
  4381. {
  4382. byte[] objectData = new byte[76];
  4383. //No Zero vectors, as it causes bent knee in the client! Replace with <0, 0, 0, 1>
  4384. if (data.CollisionPlane == Vector4.Zero)
  4385. data.CollisionPlane = Vector4.UnitW;
  4386. //MainConsole.Instance.DebugFormat("CollisionPlane: {0}", data.CollisionPlane);
  4387. data.CollisionPlane.ToBytes(objectData, 0);
  4388. data.OffsetPosition.ToBytes(objectData, 16);
  4389. data.Velocity.ToBytes(objectData, 28);
  4390. //data.Acceleration.ToBytes(objectData, 40);
  4391. data.Rotation.ToBytes(objectData, 52);
  4392. //data.AngularVelocity.ToBytes(objectData, 64);
  4393. ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock
  4394. {
  4395. Data = Utils.EmptyBytes,
  4396. ExtraParams = new byte[1],
  4397. FullID = data.UUID,
  4398. ID = data.LocalId,
  4399. Material = (byte) Material.Flesh,
  4400. MediaURL = Utils.EmptyBytes,
  4401. NameValue =
  4402. Utils.StringToBytes("FirstName STRING RW SV " +
  4403. data.Firstname +
  4404. "\nLastName STRING RW SV " +
  4405. data.Lastname +
  4406. "\nTitle STRING RW SV " +
  4407. (m_GroupsModule == null
  4408. ? ""
  4409. : m_GroupsModule.
  4410. GetGroupTitle(
  4411. data.UUID))),
  4412. ObjectData = objectData
  4413. };
  4414. if (data.ParentID == UUID.Zero)
  4415. update.ParentID = 0;
  4416. else
  4417. {
  4418. ISceneChildEntity part = Scene.GetSceneObjectPart(data.ParentID);
  4419. update.ParentID = part.LocalId;
  4420. }
  4421. update.PathCurve = 16;
  4422. update.PathScaleX = 100;
  4423. update.PathScaleY = 100;
  4424. update.PCode = (byte) PCode.Avatar;
  4425. update.ProfileCurve = 1;
  4426. update.PSBlock = Utils.EmptyBytes;
  4427. update.Scale = new Vector3(0.45f, 0.6f, 1.9f);
  4428. update.Text = Utils.EmptyBytes;
  4429. update.TextColor = new byte[4];
  4430. update.TextureAnim = Utils.EmptyBytes;
  4431. // Don't send texture entry for avatars here - this is accomplished via the AvatarAppearance packet
  4432. update.TextureEntry = Utils.EmptyBytes;
  4433. update.UpdateFlags = (uint) (
  4434. PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy |
  4435. PrimFlags.ObjectAnyOwner |
  4436. PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty |
  4437. PrimFlags.ObjectTransfer |
  4438. PrimFlags.ObjectOwnerModify);
  4439. return update;
  4440. }
  4441. private ObjectUpdateCachedPacket.ObjectDataBlock CreatePrimCachedUpdateBlock(ISceneChildEntity data,
  4442. UUID recipientID)
  4443. {
  4444. ObjectUpdateCachedPacket.ObjectDataBlock odb = new ObjectUpdateCachedPacket.ObjectDataBlock
  4445. {CRC = data.CRC, ID = data.LocalId};
  4446. #region PrimFlags
  4447. PrimFlags flags = (PrimFlags) m_scene.Permissions.GenerateClientFlags(recipientID, data);
  4448. // Don't send the CreateSelected flag to everyone
  4449. flags &= ~PrimFlags.CreateSelected;
  4450. if (recipientID == data.OwnerID)
  4451. {
  4452. if (data.CreateSelected)
  4453. {
  4454. // Only send this flag once, then unset it
  4455. flags |= PrimFlags.CreateSelected;
  4456. data.CreateSelected = false;
  4457. }
  4458. }
  4459. #endregion PrimFlags
  4460. odb.UpdateFlags = (uint) flags;
  4461. return odb;
  4462. }
  4463. private ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(ISceneChildEntity data, UUID recipientID)
  4464. {
  4465. byte[] objectData = new byte[60];
  4466. data.RelativePosition.ToBytes(objectData, 0);
  4467. data.Velocity.ToBytes(objectData, 12);
  4468. data.Acceleration.ToBytes(objectData, 24);
  4469. try
  4470. {
  4471. data.GetRotationOffset().ToBytes(objectData, 36);
  4472. }
  4473. catch (Exception e)
  4474. {
  4475. MainConsole.Instance.Warn(
  4476. "[LLClientView]: exception converting quaternion to bytes, using Quaternion.Identity. Exception: " +
  4477. e);
  4478. Quaternion.Identity.ToBytes(objectData, 36);
  4479. }
  4480. data.AngularVelocity.ToBytes(objectData, 48);
  4481. ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock
  4482. {
  4483. ClickAction = data.ClickAction,
  4484. CRC = data.CRC,
  4485. ExtraParams = data.Shape.ExtraParams ?? Utils.EmptyBytes,
  4486. FullID = data.UUID,
  4487. ID = data.LocalId,
  4488. Material = (byte) data.Material,
  4489. MediaURL = Utils.StringToBytes(data.CurrentMediaVersion)
  4490. };
  4491. //update.JointAxisOrAnchor = Vector3.Zero; // These are deprecated
  4492. //update.JointPivot = Vector3.Zero;
  4493. //update.JointType = 0;
  4494. if (data.IsAttachment)
  4495. {
  4496. update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.FromUserInventoryItemID);
  4497. update.State = (byte) ((data.AttachmentPoint%16)*16 + (data.AttachmentPoint/16));
  4498. }
  4499. else
  4500. {
  4501. update.NameValue = Utils.EmptyBytes;
  4502. // The root part state is the canonical state for all parts of the object. The other part states in the
  4503. // case for attachments may contain conflicting values that can end up crashing the viewer.
  4504. update.State = data.ParentEntity.RootChild.Shape.State;
  4505. }
  4506. update.ObjectData = objectData;
  4507. update.ParentID = data.ParentID;
  4508. update.PathBegin = data.Shape.PathBegin;
  4509. update.PathCurve = data.Shape.PathCurve;
  4510. update.PathEnd = data.Shape.PathEnd;
  4511. update.PathRadiusOffset = data.Shape.PathRadiusOffset;
  4512. update.PathRevolutions = data.Shape.PathRevolutions;
  4513. update.PathScaleX = data.Shape.PathScaleX;
  4514. update.PathScaleY = data.Shape.PathScaleY;
  4515. update.PathShearX = data.Shape.PathShearX;
  4516. update.PathShearY = data.Shape.PathShearY;
  4517. update.PathSkew = data.Shape.PathSkew;
  4518. update.PathTaperX = data.Shape.PathTaperX;
  4519. update.PathTaperY = data.Shape.PathTaperY;
  4520. update.PathTwist = data.Shape.PathTwist;
  4521. update.PathTwistBegin = data.Shape.PathTwistBegin;
  4522. update.PCode = data.Shape.PCode;
  4523. update.ProfileBegin = data.Shape.ProfileBegin;
  4524. update.ProfileCurve = data.Shape.ProfileCurve;
  4525. update.ProfileEnd = data.Shape.ProfileEnd;
  4526. update.ProfileHollow = data.Shape.ProfileHollow;
  4527. update.PSBlock = data.ParticleSystem ?? Utils.EmptyBytes;
  4528. update.TextColor = data.GetTextColor().GetBytes(false);
  4529. update.TextureAnim = data.TextureAnimation ?? Utils.EmptyBytes;
  4530. update.TextureEntry = data.Shape.TextureEntry ?? Utils.EmptyBytes;
  4531. update.Scale = data.Shape.Scale;
  4532. update.Text = Util.StringToBytes256(data.Text);
  4533. update.MediaURL = Util.StringToBytes256(data.MediaUrl);
  4534. #region PrimFlags
  4535. PrimFlags flags = (PrimFlags) m_scene.Permissions.GenerateClientFlags(recipientID, data);
  4536. // Don't send the CreateSelected flag to everyone
  4537. flags &= ~PrimFlags.CreateSelected;
  4538. if (recipientID == data.OwnerID)
  4539. {
  4540. if (data.CreateSelected)
  4541. {
  4542. // Only send this flag once, then unset it
  4543. flags |= PrimFlags.CreateSelected;
  4544. data.CreateSelected = false;
  4545. }
  4546. }
  4547. // MainConsole.Instance.DebugFormat(
  4548. // "[LLCLIENTVIEW]: Constructing client update for part {0} {1} with flags {2}, localId {3}",
  4549. // data.Name, update.FullID, flags, update.ID);
  4550. update.UpdateFlags = (uint) flags;
  4551. #endregion PrimFlags
  4552. if (data.Sound != UUID.Zero)
  4553. {
  4554. update.Sound = data.Sound;
  4555. update.OwnerID = data.OwnerID;
  4556. update.Gain = (float) data.SoundGain;
  4557. update.Radius = (float) data.SoundRadius;
  4558. update.Flags = data.SoundFlags;
  4559. }
  4560. switch ((PCode) data.Shape.PCode)
  4561. {
  4562. case PCode.Grass:
  4563. case PCode.Tree:
  4564. case PCode.NewTree:
  4565. update.Data = new[] {data.Shape.State};
  4566. break;
  4567. default:
  4568. update.Data = Utils.EmptyBytes;
  4569. break;
  4570. }
  4571. return update;
  4572. }
  4573. private ObjectUpdateCompressedPacket.ObjectDataBlock CreateCompressedUpdateBlock(ISceneChildEntity part,
  4574. CompressedFlags updateFlags,
  4575. PrimUpdateFlags flags)
  4576. {
  4577. byte[] objectData = new byte[500];
  4578. int i = 0;
  4579. part.UUID.ToBytes(objectData, 0);
  4580. i += 16;
  4581. Utils.UIntToBytes(part.LocalId, objectData, i);
  4582. i += 4;
  4583. objectData[i] = part.Shape.PCode; //Type of prim
  4584. i += 1;
  4585. if (part.Shape.PCode == (byte) PCode.Tree || part.Shape.PCode == (byte) PCode.NewTree)
  4586. updateFlags |= CompressedFlags.Tree;
  4587. //Attachment point
  4588. objectData[i] = (byte) part.AttachmentPoint;
  4589. i += 1;
  4590. //CRC
  4591. Utils.UIntToBytes(part.CRC, objectData, i);
  4592. i += 4;
  4593. objectData[i] = (byte) part.Material;
  4594. i++;
  4595. objectData[i] = part.ClickAction;
  4596. i++;
  4597. part.Shape.Scale.ToBytes(objectData, i);
  4598. i += 12;
  4599. part.RelativePosition.ToBytes(objectData, i);
  4600. i += 12;
  4601. try
  4602. {
  4603. part.GetRotationOffset().ToBytes(objectData, i);
  4604. }
  4605. catch (Exception e)
  4606. {
  4607. MainConsole.Instance.Warn(
  4608. "[LLClientView]: exception converting quaternion to bytes, using Quaternion.Identity. Exception: " +
  4609. e);
  4610. Quaternion.Identity.ToBytes(objectData, i);
  4611. }
  4612. i += 12;
  4613. Utils.UIntToBytes((uint) updateFlags, objectData, i);
  4614. i += 4;
  4615. part.OwnerID.ToBytes(objectData, i);
  4616. i += 16;
  4617. if ((updateFlags & CompressedFlags.HasAngularVelocity) != 0)
  4618. {
  4619. part.AngularVelocity.ToBytes(objectData, i);
  4620. i += 12;
  4621. }
  4622. if ((updateFlags & CompressedFlags.HasParent) != 0)
  4623. {
  4624. if (part.IsAttachment)
  4625. {
  4626. IScenePresence us = m_scene.GetScenePresence(AgentId);
  4627. Utils.UIntToBytes(us.LocalId, objectData, i);
  4628. }
  4629. else
  4630. Utils.UIntToBytes(part.ParentID, objectData, i);
  4631. i += 4;
  4632. }
  4633. if ((updateFlags & CompressedFlags.Tree) != 0)
  4634. {
  4635. objectData[i] = part.Shape.State; //Tree type
  4636. i++;
  4637. }
  4638. else if ((updateFlags & CompressedFlags.ScratchPad) != 0)
  4639. {
  4640. //Remove the flag, we have no clue what to do with this
  4641. updateFlags &= ~(CompressedFlags.ScratchPad);
  4642. }
  4643. if ((updateFlags & CompressedFlags.HasText) != 0)
  4644. {
  4645. byte[] text = Utils.StringToBytes(part.Text);
  4646. Buffer.BlockCopy(text, 0, objectData, i, text.Length);
  4647. i += text.Length;
  4648. byte[] textcolor = part.GetTextColor().GetBytes(false);
  4649. Buffer.BlockCopy(textcolor, 0, objectData, i, textcolor.Length);
  4650. i += 4;
  4651. }
  4652. if ((updateFlags & CompressedFlags.MediaURL) != 0)
  4653. {
  4654. byte[] text = Util.StringToBytes256(part.CurrentMediaVersion);
  4655. Buffer.BlockCopy(text, 0, objectData, i, text.Length);
  4656. i += text.Length;
  4657. }
  4658. if ((updateFlags & CompressedFlags.HasParticles) != 0)
  4659. {
  4660. if (part.ParticleSystem.Length == 0)
  4661. {
  4662. Primitive.ParticleSystem Sys = new Primitive.ParticleSystem();
  4663. byte[] pdata = Sys.GetBytes();
  4664. Buffer.BlockCopy(pdata, 0, objectData, i, pdata.Length);
  4665. i += pdata.Length; //86
  4666. //updateFlags = updateFlags & ~CompressedFlags.HasParticles;
  4667. }
  4668. else
  4669. {
  4670. Buffer.BlockCopy(part.ParticleSystem, 0, objectData, i, part.ParticleSystem.Length);
  4671. i += part.ParticleSystem.Length; //86
  4672. }
  4673. }
  4674. byte[] ExtraData = part.Shape.ExtraParamsToBytes();
  4675. Buffer.BlockCopy(ExtraData, 0, objectData, i, ExtraData.Length);
  4676. i += ExtraData.Length;
  4677. if ((updateFlags & CompressedFlags.HasSound) != 0)
  4678. {
  4679. part.Sound.ToBytes(objectData, i);
  4680. i += 16;
  4681. Utils.FloatToBytes((float) part.SoundGain, objectData, i);
  4682. i += 4;
  4683. objectData[i] = part.SoundFlags;
  4684. i++;
  4685. Utils.FloatToBytes((float) part.SoundRadius, objectData, i);
  4686. i += 4;
  4687. }
  4688. if ((updateFlags & CompressedFlags.HasNameValues) != 0)
  4689. {
  4690. if (part.IsAttachment)
  4691. {
  4692. byte[] NV = Util.StringToBytes256("AttachItemID STRING RW SV " + part.FromUserInventoryItemID);
  4693. Buffer.BlockCopy(NV, 0, objectData, i, NV.Length);
  4694. i += NV.Length;
  4695. }
  4696. }
  4697. objectData[i] = part.Shape.PathCurve;
  4698. i++;
  4699. Utils.UInt16ToBytes(part.Shape.PathBegin, objectData, i);
  4700. i += 2;
  4701. Utils.UInt16ToBytes(part.Shape.PathEnd, objectData, i);
  4702. i += 2;
  4703. objectData[i] = part.Shape.PathScaleX;
  4704. i++;
  4705. objectData[i] = part.Shape.PathScaleY;
  4706. i++;
  4707. objectData[i] = part.Shape.PathShearX;
  4708. i++;
  4709. objectData[i] = part.Shape.PathShearY;
  4710. i++;
  4711. objectData[i] = (byte) part.Shape.PathTwist;
  4712. i++;
  4713. objectData[i] = (byte) part.Shape.PathTwistBegin;
  4714. i++;
  4715. objectData[i] = (byte) part.Shape.PathRadiusOffset;
  4716. i++;
  4717. objectData[i] = (byte) part.Shape.PathTaperX;
  4718. i++;
  4719. objectData[i] = (byte) part.Shape.PathTaperY;
  4720. i++;
  4721. objectData[i] = part.Shape.PathRevolutions;
  4722. i++;
  4723. objectData[i] = (byte) part.Shape.PathSkew;
  4724. i++;
  4725. objectData[i] = part.Shape.ProfileCurve;
  4726. i++;
  4727. Utils.UInt16ToBytes(part.Shape.ProfileBegin, objectData, i);
  4728. i += 2;
  4729. Utils.UInt16ToBytes(part.Shape.ProfileEnd, objectData, i);
  4730. i += 2;
  4731. Utils.UInt16ToBytes(part.Shape.ProfileHollow, objectData, i);
  4732. i += 2;
  4733. if (part.Shape.TextureEntry != null && part.Shape.TextureEntry.Length > 0)
  4734. {
  4735. // Texture Length
  4736. Utils.IntToBytes(part.Shape.TextureEntry.Length, objectData, i);
  4737. i += 4;
  4738. // Texture
  4739. Buffer.BlockCopy(part.Shape.TextureEntry, 0, objectData, i, part.Shape.TextureEntry.Length);
  4740. i += part.Shape.TextureEntry.Length;
  4741. }
  4742. else
  4743. {
  4744. Utils.IntToBytes(0, objectData, i);
  4745. i += 4;
  4746. }
  4747. if ((updateFlags & CompressedFlags.TextureAnimation) != 0)
  4748. {
  4749. Utils.UInt64ToBytes((ulong) part.TextureAnimation.Length, objectData, i);
  4750. i += 4;
  4751. Buffer.BlockCopy(part.TextureAnimation, 0, objectData, i, part.TextureAnimation.Length);
  4752. i += part.TextureAnimation.Length;
  4753. }
  4754. ObjectUpdateCompressedPacket.ObjectDataBlock update = new ObjectUpdateCompressedPacket.ObjectDataBlock();
  4755. #region PrimFlags
  4756. PrimFlags primflags = (PrimFlags) m_scene.Permissions.GenerateClientFlags(AgentId, part);
  4757. // Don't send the CreateSelected flag to everyone
  4758. primflags &= ~PrimFlags.CreateSelected;
  4759. if (AgentId == part.OwnerID)
  4760. {
  4761. if (part.CreateSelected)
  4762. {
  4763. // Only send this flag once, then unset it
  4764. primflags |= PrimFlags.CreateSelected;
  4765. part.CreateSelected = false;
  4766. }
  4767. }
  4768. update.UpdateFlags = (uint) primflags;
  4769. #endregion PrimFlags
  4770. byte[] PacketObjectData = new byte[i]; //Makes the packet smaller so we can send more!
  4771. Buffer.BlockCopy(objectData, 0, PacketObjectData, 0, i);
  4772. update.Data = PacketObjectData;
  4773. return update;
  4774. }
  4775. public void SendNameReply(UUID profileId, string firstname, string lastname)
  4776. {
  4777. UUIDNameReplyPacket packet = (UUIDNameReplyPacket) PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
  4778. // TODO: don't create new blocks if recycling an old packet
  4779. packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
  4780. packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock
  4781. {
  4782. ID = profileId,
  4783. FirstName = Util.StringToBytes256(firstname),
  4784. LastName = Util.StringToBytes256(lastname)
  4785. };
  4786. OutPacket(packet, ThrottleOutPacketType.Asset);
  4787. }
  4788. /// <summary>
  4789. /// This is a utility method used by single states to not duplicate kicks and blue card of death messages.
  4790. /// </summary>
  4791. public bool ChildAgentStatus()
  4792. {
  4793. IScenePresence Sp = m_scene.GetScenePresence(AgentId);
  4794. if (Sp == null || (Sp.IsChildAgent))
  4795. return true;
  4796. return false;
  4797. }
  4798. #endregion
  4799. /// <summary>
  4800. /// This is a different way of processing packets then ProcessInPacket
  4801. /// </summary>
  4802. private void RegisterLocalPacketHandlers()
  4803. {
  4804. AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout);
  4805. AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false);
  4806. AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, true);
  4807. AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false);
  4808. AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false);
  4809. AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest, false);
  4810. AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest, false);
  4811. AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
  4812. AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest);
  4813. AddLocalPacketHandler(PacketType.GenericMessage, HandleGenericMessage);
  4814. AddLocalPacketHandler(PacketType.AvatarPropertiesRequest, HandleAvatarPropertiesRequest);
  4815. AddLocalPacketHandler(PacketType.ChatFromViewer, HandleChatFromViewer);
  4816. AddLocalPacketHandler(PacketType.AvatarPropertiesUpdate, HandlerAvatarPropertiesUpdate);
  4817. AddLocalPacketHandler(PacketType.ScriptDialogReply, HandlerScriptDialogReply);
  4818. AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage, false);
  4819. AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship);
  4820. AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship);
  4821. AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFrendship);
  4822. AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject);
  4823. AddLocalPacketHandler(PacketType.RezObjectFromNotecard, HandlerRezObjectFromNotecard);
  4824. AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject);
  4825. AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand);
  4826. AddLocalPacketHandler(PacketType.RegionHandshakeReply, HandlerRegionHandshakeReply);
  4827. AddLocalPacketHandler(PacketType.AgentWearablesRequest, HandlerAgentWearablesRequest);
  4828. AddLocalPacketHandler(PacketType.AgentSetAppearance, HandlerAgentSetAppearance);
  4829. AddLocalPacketHandler(PacketType.AgentIsNowWearing, HandlerAgentIsNowWearing);
  4830. AddLocalPacketHandler(PacketType.RezSingleAttachmentFromInv, HandlerRezSingleAttachmentFromInv);
  4831. AddLocalPacketHandler(PacketType.RezRestoreToWorld, HandlerRezRestoreToWorld);
  4832. AddLocalPacketHandler(PacketType.RezMultipleAttachmentsFromInv, HandleRezMultipleAttachmentsFromInv);
  4833. AddLocalPacketHandler(PacketType.DetachAttachmentIntoInv, HandleDetachAttachmentIntoInv);
  4834. AddLocalPacketHandler(PacketType.ObjectAttach, HandleObjectAttach);
  4835. AddLocalPacketHandler(PacketType.ObjectDetach, HandleObjectDetach);
  4836. AddLocalPacketHandler(PacketType.ObjectDrop, HandleObjectDrop);
  4837. AddLocalPacketHandler(PacketType.SetAlwaysRun, HandleSetAlwaysRun, false);
  4838. AddLocalPacketHandler(PacketType.CompleteAgentMovement, HandleCompleteAgentMovement);
  4839. AddLocalPacketHandler(PacketType.AgentAnimation, HandleAgentAnimation, false);
  4840. AddLocalPacketHandler(PacketType.AgentRequestSit, HandleAgentRequestSit);
  4841. AddLocalPacketHandler(PacketType.AgentSit, HandleAgentSit);
  4842. AddLocalPacketHandler(PacketType.SoundTrigger, HandleSoundTrigger);
  4843. AddLocalPacketHandler(PacketType.AvatarPickerRequest, HandleAvatarPickerRequest);
  4844. AddLocalPacketHandler(PacketType.AgentDataUpdateRequest, HandleAgentDataUpdateRequest);
  4845. AddLocalPacketHandler(PacketType.UserInfoRequest, HandleUserInfoRequest);
  4846. AddLocalPacketHandler(PacketType.UpdateUserInfo, HandleUpdateUserInfo);
  4847. AddLocalPacketHandler(PacketType.SetStartLocationRequest, HandleSetStartLocationRequest);
  4848. AddLocalPacketHandler(PacketType.AgentThrottle, HandleAgentThrottle, false);
  4849. AddLocalPacketHandler(PacketType.AgentPause, HandleAgentPause, false);
  4850. AddLocalPacketHandler(PacketType.AgentResume, HandleAgentResume, false);
  4851. AddLocalPacketHandler(PacketType.ForceScriptControlRelease, HandleForceScriptControlRelease);
  4852. AddLocalPacketHandler(PacketType.ObjectLink, HandleObjectLink, true);
  4853. AddLocalPacketHandler(PacketType.ObjectDelink, HandleObjectDelink, true);
  4854. AddLocalPacketHandler(PacketType.ObjectAdd, HandleObjectAdd);
  4855. AddLocalPacketHandler(PacketType.ObjectShape, HandleObjectShape);
  4856. AddLocalPacketHandler(PacketType.ObjectExtraParams, HandleObjectExtraParams);
  4857. AddLocalPacketHandler(PacketType.ObjectDuplicate, HandleObjectDuplicate);
  4858. AddLocalPacketHandler(PacketType.RequestMultipleObjects, HandleRequestMultipleObjects);
  4859. AddLocalPacketHandler(PacketType.ObjectSelect, HandleObjectSelect);
  4860. AddLocalPacketHandler(PacketType.ObjectDeselect, HandleObjectDeselect);
  4861. AddLocalPacketHandler(PacketType.ObjectPosition, HandleObjectPosition);
  4862. AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale);
  4863. AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation);
  4864. AddLocalPacketHandler(PacketType.ObjectFlagUpdate, HandleObjectFlagUpdate);
  4865. // Handle ObjectImage (TextureEntry) updates synchronously, since when updating multiple prim faces at once,
  4866. // some clients will send out a separate ObjectImage packet for each face
  4867. AddLocalPacketHandler(PacketType.ObjectImage, HandleObjectImage, false);
  4868. AddLocalPacketHandler(PacketType.ObjectGrab, HandleObjectGrab, false);
  4869. AddLocalPacketHandler(PacketType.ObjectGrabUpdate, HandleObjectGrabUpdate, false);
  4870. AddLocalPacketHandler(PacketType.ObjectDeGrab, HandleObjectDeGrab);
  4871. AddLocalPacketHandler(PacketType.ObjectSpinStart, HandleObjectSpinStart, false);
  4872. AddLocalPacketHandler(PacketType.ObjectSpinUpdate, HandleObjectSpinUpdate, false);
  4873. AddLocalPacketHandler(PacketType.ObjectSpinStop, HandleObjectSpinStop, false);
  4874. AddLocalPacketHandler(PacketType.ObjectDescription, HandleObjectDescription, false);
  4875. AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false);
  4876. AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false);
  4877. AddLocalPacketHandler(PacketType.Undo, HandleUndo, false);
  4878. AddLocalPacketHandler(PacketType.UndoLand, HandleLandUndo, false);
  4879. AddLocalPacketHandler(PacketType.Redo, HandleRedo, false);
  4880. AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay);
  4881. AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false);
  4882. AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch);
  4883. AddLocalPacketHandler(PacketType.ScriptAnswerYes, HandleScriptAnswerYes, false);
  4884. AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false);
  4885. AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false);
  4886. AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage);
  4887. AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest);
  4888. AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest);
  4889. AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer);
  4890. AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket);
  4891. AddLocalPacketHandler(PacketType.ConfirmXferPacket, HandleConfirmXferPacket);
  4892. AddLocalPacketHandler(PacketType.AbortXfer, HandleAbortXfer);
  4893. AddLocalPacketHandler(PacketType.CreateInventoryFolder, HandleCreateInventoryFolder);
  4894. AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder);
  4895. AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder, true);
  4896. AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem);
  4897. AddLocalPacketHandler(PacketType.LinkInventoryItem, HandleLinkInventoryItem);
  4898. if (m_allowUDPInv)
  4899. {
  4900. AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory);
  4901. AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents);
  4902. }
  4903. AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents, true);
  4904. AddLocalPacketHandler(PacketType.UpdateInventoryItem, HandleUpdateInventoryItem, true);
  4905. AddLocalPacketHandler(PacketType.CopyInventoryItem, HandleCopyInventoryItem, true);
  4906. AddLocalPacketHandler(PacketType.MoveInventoryItem, HandleMoveInventoryItem, true);
  4907. AddLocalPacketHandler(PacketType.ChangeInventoryItemFlags, HandleChangeInventoryItemFlags);
  4908. AddLocalPacketHandler(PacketType.RemoveInventoryItem, HandleRemoveInventoryItem, true);
  4909. AddLocalPacketHandler(PacketType.RemoveInventoryFolder, HandleRemoveInventoryFolder, true);
  4910. AddLocalPacketHandler(PacketType.RemoveInventoryObjects, HandleRemoveInventoryObjects, true);
  4911. AddLocalPacketHandler(PacketType.RequestTaskInventory, HandleRequestTaskInventory);
  4912. AddLocalPacketHandler(PacketType.UpdateTaskInventory, HandleUpdateTaskInventory);
  4913. AddLocalPacketHandler(PacketType.RemoveTaskInventory, HandleRemoveTaskInventory);
  4914. AddLocalPacketHandler(PacketType.MoveTaskInventory, HandleMoveTaskInventory);
  4915. AddLocalPacketHandler(PacketType.RezScript, HandleRezScript);
  4916. AddLocalPacketHandler(PacketType.MapLayerRequest, HandleMapLayerRequest, false);
  4917. AddLocalPacketHandler(PacketType.MapBlockRequest, HandleMapBlockRequest, false);
  4918. AddLocalPacketHandler(PacketType.MapNameRequest, HandleMapNameRequest, false);
  4919. AddLocalPacketHandler(PacketType.TeleportLandmarkRequest, HandleTeleportLandmarkRequest);
  4920. AddLocalPacketHandler(PacketType.TeleportLocationRequest, HandleTeleportLocationRequest);
  4921. AddLocalPacketHandler(PacketType.UUIDNameRequest, HandleUUIDNameRequest, false);
  4922. AddLocalPacketHandler(PacketType.RegionHandleRequest, HandleRegionHandleRequest);
  4923. AddLocalPacketHandler(PacketType.ParcelInfoRequest, HandleParcelInfoRequest, false);
  4924. AddLocalPacketHandler(PacketType.ParcelAccessListRequest, HandleParcelAccessListRequest, false);
  4925. AddLocalPacketHandler(PacketType.ParcelAccessListUpdate, HandleParcelAccessListUpdate, false);
  4926. AddLocalPacketHandler(PacketType.ParcelPropertiesRequest, HandleParcelPropertiesRequest, false);
  4927. AddLocalPacketHandler(PacketType.ParcelDivide, HandleParcelDivide);
  4928. AddLocalPacketHandler(PacketType.ParcelJoin, HandleParcelJoin);
  4929. AddLocalPacketHandler(PacketType.ParcelPropertiesUpdate, HandleParcelPropertiesUpdate);
  4930. AddLocalPacketHandler(PacketType.ParcelSelectObjects, HandleParcelSelectObjects);
  4931. AddLocalPacketHandler(PacketType.ParcelObjectOwnersRequest, HandleParcelObjectOwnersRequest);
  4932. AddLocalPacketHandler(PacketType.ParcelGodForceOwner, HandleParcelGodForceOwner);
  4933. AddLocalPacketHandler(PacketType.ParcelRelease, HandleParcelRelease);
  4934. AddLocalPacketHandler(PacketType.ParcelReclaim, HandleParcelReclaim);
  4935. AddLocalPacketHandler(PacketType.ParcelReturnObjects, HandleParcelReturnObjects);
  4936. AddLocalPacketHandler(PacketType.ParcelSetOtherCleanTime, HandleParcelSetOtherCleanTime);
  4937. AddLocalPacketHandler(PacketType.LandStatRequest, HandleLandStatRequest);
  4938. AddLocalPacketHandler(PacketType.ParcelDwellRequest, HandleParcelDwellRequest);
  4939. AddLocalPacketHandler(PacketType.EstateOwnerMessage, HandleEstateOwnerMessage);
  4940. AddLocalPacketHandler(PacketType.RequestRegionInfo, HandleRequestRegionInfo, false);
  4941. AddLocalPacketHandler(PacketType.EstateCovenantRequest, HandleEstateCovenantRequest);
  4942. AddLocalPacketHandler(PacketType.RequestGodlikePowers, HandleRequestGodlikePowers);
  4943. AddLocalPacketHandler(PacketType.GodKickUser, HandleGodKickUser);
  4944. AddLocalPacketHandler(PacketType.MoneyBalanceRequest, HandleMoneyBalanceRequest);
  4945. AddLocalPacketHandler(PacketType.EconomyDataRequest, HandleEconomyDataRequest);
  4946. AddLocalPacketHandler(PacketType.RequestPayPrice, HandleRequestPayPrice);
  4947. AddLocalPacketHandler(PacketType.ObjectSaleInfo, HandleObjectSaleInfo);
  4948. AddLocalPacketHandler(PacketType.ObjectBuy, HandleObjectBuy);
  4949. AddLocalPacketHandler(PacketType.GetScriptRunning, HandleGetScriptRunning);
  4950. AddLocalPacketHandler(PacketType.SetScriptRunning, HandleSetScriptRunning);
  4951. AddLocalPacketHandler(PacketType.ScriptReset, HandleScriptReset);
  4952. AddLocalPacketHandler(PacketType.ActivateGestures, HandleActivateGestures);
  4953. AddLocalPacketHandler(PacketType.DeactivateGestures, HandleDeactivateGestures);
  4954. AddLocalPacketHandler(PacketType.ObjectOwner, HandleObjectOwner);
  4955. AddLocalPacketHandler(PacketType.AgentFOV, HandleAgentFOV, false);
  4956. AddLocalPacketHandler(PacketType.ViewerStats, HandleViewerStats);
  4957. AddLocalPacketHandler(PacketType.MapItemRequest, HandleMapItemRequest, true);
  4958. AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false);
  4959. AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, true);
  4960. AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode);
  4961. AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false);
  4962. AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery);
  4963. AddLocalPacketHandler(PacketType.DirFindQuery, HandleDirFindQuery);
  4964. AddLocalPacketHandler(PacketType.DirLandQuery, HandleDirLandQuery);
  4965. AddLocalPacketHandler(PacketType.DirPopularQuery, HandleDirPopularQuery);
  4966. AddLocalPacketHandler(PacketType.DirClassifiedQuery, HandleDirClassifiedQuery);
  4967. AddLocalPacketHandler(PacketType.EventInfoRequest, HandleEventInfoRequest);
  4968. AddLocalPacketHandler(PacketType.OfferCallingCard, HandleOfferCallingCard);
  4969. AddLocalPacketHandler(PacketType.AcceptCallingCard, HandleAcceptCallingCard);
  4970. AddLocalPacketHandler(PacketType.DeclineCallingCard, HandleDeclineCallingCard);
  4971. AddLocalPacketHandler(PacketType.ActivateGroup, HandleActivateGroup);
  4972. AddLocalPacketHandler(PacketType.GroupTitlesRequest, HandleGroupTitlesRequest);
  4973. AddLocalPacketHandler(PacketType.GroupProfileRequest, HandleGroupProfileRequest);
  4974. AddLocalPacketHandler(PacketType.GroupMembersRequest, HandleGroupMembersRequest);
  4975. AddLocalPacketHandler(PacketType.GroupRoleDataRequest, HandleGroupRoleDataRequest);
  4976. AddLocalPacketHandler(PacketType.GroupRoleMembersRequest, HandleGroupRoleMembersRequest);
  4977. AddLocalPacketHandler(PacketType.CreateGroupRequest, HandleCreateGroupRequest);
  4978. AddLocalPacketHandler(PacketType.UpdateGroupInfo, HandleUpdateGroupInfo);
  4979. AddLocalPacketHandler(PacketType.SetGroupAcceptNotices, HandleSetGroupAcceptNotices);
  4980. AddLocalPacketHandler(PacketType.GroupTitleUpdate, HandleGroupTitleUpdate);
  4981. AddLocalPacketHandler(PacketType.ParcelDeedToGroup, HandleParcelDeedToGroup);
  4982. AddLocalPacketHandler(PacketType.GroupNoticesListRequest, HandleGroupNoticesListRequest);
  4983. AddLocalPacketHandler(PacketType.GroupNoticeRequest, HandleGroupNoticeRequest);
  4984. AddLocalPacketHandler(PacketType.GroupRoleUpdate, HandleGroupRoleUpdate);
  4985. AddLocalPacketHandler(PacketType.GroupRoleChanges, HandleGroupRoleChanges);
  4986. AddLocalPacketHandler(PacketType.JoinGroupRequest, HandleJoinGroupRequest);
  4987. AddLocalPacketHandler(PacketType.LeaveGroupRequest, HandleLeaveGroupRequest);
  4988. AddLocalPacketHandler(PacketType.EjectGroupMemberRequest, HandleEjectGroupMemberRequest);
  4989. AddLocalPacketHandler(PacketType.InviteGroupRequest, HandleInviteGroupRequest);
  4990. AddLocalPacketHandler(PacketType.StartLure, HandleStartLure);
  4991. AddLocalPacketHandler(PacketType.TeleportLureRequest, HandleTeleportLureRequest);
  4992. AddLocalPacketHandler(PacketType.ClassifiedInfoRequest, HandleClassifiedInfoRequest);
  4993. AddLocalPacketHandler(PacketType.ClassifiedInfoUpdate, HandleClassifiedInfoUpdate);
  4994. AddLocalPacketHandler(PacketType.ClassifiedDelete, HandleClassifiedDelete);
  4995. AddLocalPacketHandler(PacketType.ClassifiedGodDelete, HandleClassifiedGodDelete);
  4996. AddLocalPacketHandler(PacketType.EventGodDelete, HandleEventGodDelete);
  4997. AddLocalPacketHandler(PacketType.EventNotificationAddRequest, HandleEventNotificationAddRequest);
  4998. AddLocalPacketHandler(PacketType.EventNotificationRemoveRequest, HandleEventNotificationRemoveRequest);
  4999. AddLocalPacketHandler(PacketType.RetrieveInstantMessages, HandleRetrieveInstantMessages);
  5000. AddLocalPacketHandler(PacketType.PickDelete, HandlePickDelete);
  5001. AddLocalPacketHandler(PacketType.PickGodDelete, HandlePickGodDelete);
  5002. AddLocalPacketHandler(PacketType.PickInfoUpdate, HandlePickInfoUpdate);
  5003. AddLocalPacketHandler(PacketType.AvatarNotesUpdate, HandleAvatarNotesUpdate);
  5004. AddLocalPacketHandler(PacketType.AvatarInterestsUpdate, HandleAvatarInterestsUpdate);
  5005. AddLocalPacketHandler(PacketType.GrantUserRights, HandleGrantUserRights);
  5006. AddLocalPacketHandler(PacketType.PlacesQuery, HandlePlacesQuery);
  5007. AddLocalPacketHandler(PacketType.UpdateMuteListEntry, HandleUpdateMuteListEntry);
  5008. AddLocalPacketHandler(PacketType.RemoveMuteListEntry, HandleRemoveMuteListEntry);
  5009. AddLocalPacketHandler(PacketType.UserReport, HandleUserReport);
  5010. AddLocalPacketHandler(PacketType.FindAgent, HandleFindAgent);
  5011. AddLocalPacketHandler(PacketType.TrackAgent, HandleTrackAgent);
  5012. AddLocalPacketHandler(PacketType.GodUpdateRegionInfo, HandleGodUpdateRegionInfoUpdate);
  5013. AddLocalPacketHandler(PacketType.GodlikeMessage, HandleGodlikeMessage);
  5014. AddLocalPacketHandler(PacketType.StateSave, HandleSaveStatePacket);
  5015. AddLocalPacketHandler(PacketType.GroupAccountDetailsRequest, HandleGroupAccountDetailsRequest);
  5016. AddLocalPacketHandler(PacketType.GroupAccountSummaryRequest, HandleGroupAccountSummaryRequest);
  5017. AddLocalPacketHandler(PacketType.GroupAccountTransactionsRequest, HandleGroupTransactionsDetailsRequest);
  5018. AddLocalPacketHandler(PacketType.FreezeUser, HandleFreezeUser);
  5019. AddLocalPacketHandler(PacketType.EjectUser, HandleEjectUser);
  5020. AddLocalPacketHandler(PacketType.ParcelBuyPass, HandleParcelBuyPass);
  5021. AddLocalPacketHandler(PacketType.ParcelGodMarkAsContent, HandleParcelGodMarkAsContent);
  5022. AddLocalPacketHandler(PacketType.GroupActiveProposalsRequest, HandleGroupActiveProposalsRequest);
  5023. AddLocalPacketHandler(PacketType.GroupVoteHistoryRequest, HandleGroupVoteHistoryRequest);
  5024. AddLocalPacketHandler(PacketType.GroupProposalBallot, HandleGroupProposalBallot);
  5025. AddLocalPacketHandler(PacketType.SimWideDeletes, HandleSimWideDeletes);
  5026. AddLocalPacketHandler(PacketType.SendPostcard, HandleSendPostcard);
  5027. AddLocalPacketHandler(PacketType.TeleportCancel, HandleTeleportCancel);
  5028. AddLocalPacketHandler(PacketType.ViewerStartAuction, HandleViewerStartAuction);
  5029. AddLocalPacketHandler(PacketType.ParcelDisableObjects, HandleParcelDisableObjects);
  5030. }
  5031. #region Packet Handlers
  5032. #region Scene/Avatar
  5033. private bool HandleAgentUpdate(IClientAPI sener, Packet Pack)
  5034. {
  5035. if (OnAgentUpdate != null)
  5036. {
  5037. bool update = false;
  5038. //bool forcedUpdate = false;
  5039. AgentUpdatePacket agenUpdate = (AgentUpdatePacket) Pack;
  5040. #region Packet Session and User Check
  5041. if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId)
  5042. return false;
  5043. #endregion
  5044. AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
  5045. // We can only check when we have something to check
  5046. // against.
  5047. if (lastarg != null)
  5048. {
  5049. update =
  5050. (
  5051. (x.BodyRotation != lastarg.BodyRotation) ||
  5052. (x.CameraAtAxis != lastarg.CameraAtAxis) ||
  5053. (x.CameraCenter != lastarg.CameraCenter) ||
  5054. (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
  5055. (x.CameraUpAxis != lastarg.CameraUpAxis) ||
  5056. (x.ControlFlags != lastarg.ControlFlags) ||
  5057. (x.Far != lastarg.Far) ||
  5058. (x.Flags != lastarg.Flags) ||
  5059. (x.State != lastarg.State) ||
  5060. (x.HeadRotation != lastarg.HeadRotation) ||
  5061. (x.SessionID != lastarg.SessionID) ||
  5062. (x.AgentID != lastarg.AgentID)
  5063. );
  5064. }
  5065. else
  5066. {
  5067. //forcedUpdate = true;
  5068. update = true;
  5069. }
  5070. // These should be ordered from most-likely to
  5071. // least likely to change. I've made an initial
  5072. // guess at that.
  5073. if (update)
  5074. {
  5075. AgentUpdateArgs arg = new AgentUpdateArgs
  5076. {
  5077. AgentID = x.AgentID,
  5078. BodyRotation = x.BodyRotation,
  5079. CameraAtAxis = x.CameraAtAxis,
  5080. CameraCenter = x.CameraCenter,
  5081. CameraLeftAxis = x.CameraLeftAxis,
  5082. CameraUpAxis = x.CameraUpAxis,
  5083. ControlFlags = x.ControlFlags,
  5084. Far = x.Far,
  5085. Flags = x.Flags,
  5086. HeadRotation = x.HeadRotation,
  5087. SessionID = x.SessionID,
  5088. State = x.State
  5089. };
  5090. UpdateAgent handlerAgentUpdate = OnAgentUpdate;
  5091. lastarg = arg; // save this set of arguments for nexttime
  5092. if (handlerAgentUpdate != null)
  5093. OnAgentUpdate(this, arg);
  5094. handlerAgentUpdate = null;
  5095. }
  5096. }
  5097. return true;
  5098. }
  5099. private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
  5100. {
  5101. MoneyTransferRequestPacket money = (MoneyTransferRequestPacket) Pack;
  5102. // validate the agent owns the agentID and sessionID
  5103. if (money.MoneyData.SourceID == sender.AgentId && money.AgentData.AgentID == sender.AgentId &&
  5104. money.AgentData.SessionID == sender.SessionId)
  5105. {
  5106. MoneyTransferRequest handlerMoneyTransferRequest = OnMoneyTransferRequest;
  5107. if (handlerMoneyTransferRequest != null)
  5108. {
  5109. handlerMoneyTransferRequest(money.MoneyData.SourceID, money.MoneyData.DestID,
  5110. money.MoneyData.Amount, money.MoneyData.TransactionType,
  5111. Util.FieldToString(money.MoneyData.Description));
  5112. }
  5113. return true;
  5114. }
  5115. return false;
  5116. }
  5117. private bool HandleParcelGodMarkAsContent(IClientAPI client, Packet Packet)
  5118. {
  5119. ParcelGodMarkAsContentPacket ParcelGodMarkAsContent =
  5120. (ParcelGodMarkAsContentPacket) Packet;
  5121. #region Packet Session and User Check
  5122. if (m_checkPackets)
  5123. {
  5124. if (ParcelGodMarkAsContent.AgentData.SessionID != SessionId ||
  5125. ParcelGodMarkAsContent.AgentData.AgentID != AgentId)
  5126. return true;
  5127. }
  5128. #endregion
  5129. ParcelGodMark ParcelGodMarkAsContentHandler = OnParcelGodMark;
  5130. if (ParcelGodMarkAsContentHandler != null)
  5131. {
  5132. ParcelGodMarkAsContentHandler(this,
  5133. ParcelGodMarkAsContent.AgentData.AgentID,
  5134. ParcelGodMarkAsContent.ParcelData.LocalID);
  5135. return true;
  5136. }
  5137. return false;
  5138. }
  5139. private bool HandleFreezeUser(IClientAPI client, Packet Packet)
  5140. {
  5141. FreezeUserPacket FreezeUser = (FreezeUserPacket) Packet;
  5142. #region Packet Session and User Check
  5143. if (m_checkPackets)
  5144. {
  5145. if (FreezeUser.AgentData.SessionID != SessionId ||
  5146. FreezeUser.AgentData.AgentID != AgentId)
  5147. return true;
  5148. }
  5149. #endregion
  5150. FreezeUserUpdate FreezeUserHandler = OnParcelFreezeUser;
  5151. if (FreezeUserHandler != null)
  5152. {
  5153. FreezeUserHandler(this,
  5154. FreezeUser.AgentData.AgentID,
  5155. FreezeUser.Data.Flags,
  5156. FreezeUser.Data.TargetID);
  5157. return true;
  5158. }
  5159. return false;
  5160. }
  5161. private bool HandleEjectUser(IClientAPI client, Packet Packet)
  5162. {
  5163. EjectUserPacket EjectUser =
  5164. (EjectUserPacket) Packet;
  5165. #region Packet Session and User Check
  5166. if (m_checkPackets)
  5167. {
  5168. if (EjectUser.AgentData.SessionID != SessionId ||
  5169. EjectUser.AgentData.AgentID != AgentId)
  5170. return true;
  5171. }
  5172. #endregion
  5173. EjectUserUpdate EjectUserHandler = OnParcelEjectUser;
  5174. if (EjectUserHandler != null)
  5175. {
  5176. EjectUserHandler(this,
  5177. EjectUser.AgentData.AgentID,
  5178. EjectUser.Data.Flags,
  5179. EjectUser.Data.TargetID);
  5180. return true;
  5181. }
  5182. return false;
  5183. }
  5184. private bool HandleParcelBuyPass(IClientAPI client, Packet Packet)
  5185. {
  5186. ParcelBuyPassPacket ParcelBuyPass =
  5187. (ParcelBuyPassPacket) Packet;
  5188. #region Packet Session and User Check
  5189. if (m_checkPackets)
  5190. {
  5191. if (ParcelBuyPass.AgentData.SessionID != SessionId ||
  5192. ParcelBuyPass.AgentData.AgentID != AgentId)
  5193. return true;
  5194. }
  5195. #endregion
  5196. ParcelBuyPass ParcelBuyPassHandler = OnParcelBuyPass;
  5197. if (ParcelBuyPassHandler != null)
  5198. {
  5199. ParcelBuyPassHandler(this,
  5200. ParcelBuyPass.AgentData.AgentID,
  5201. ParcelBuyPass.ParcelData.LocalID);
  5202. return true;
  5203. }
  5204. return false;
  5205. }
  5206. private bool HandleParcelBuyRequest(IClientAPI sender, Packet Pack)
  5207. {
  5208. ParcelBuyPacket parcel = (ParcelBuyPacket) Pack;
  5209. #region Packet Session and User Check
  5210. if (m_checkPackets)
  5211. {
  5212. if (parcel.AgentData.SessionID != SessionId ||
  5213. parcel.AgentData.AgentID != AgentId)
  5214. return true;
  5215. }
  5216. #endregion
  5217. if (parcel.AgentData.AgentID == AgentId && parcel.AgentData.SessionID == SessionId)
  5218. {
  5219. ParcelBuy handlerParcelBuy = OnParcelBuy;
  5220. if (handlerParcelBuy != null)
  5221. {
  5222. handlerParcelBuy(parcel.AgentData.AgentID, parcel.Data.GroupID, parcel.Data.Final,
  5223. parcel.Data.IsGroupOwned,
  5224. parcel.Data.RemoveContribution, parcel.Data.LocalID, parcel.ParcelData.Area,
  5225. parcel.ParcelData.Price,
  5226. false);
  5227. }
  5228. return true;
  5229. }
  5230. return false;
  5231. }
  5232. private bool HandleUUIDGroupNameRequest(IClientAPI sender, Packet Pack)
  5233. {
  5234. UUIDGroupNameRequestPacket upack = (UUIDGroupNameRequestPacket) Pack;
  5235. foreach (UUIDGroupNameRequestPacket.UUIDNameBlockBlock t in upack.UUIDNameBlock)
  5236. {
  5237. UUIDNameRequest handlerUUIDGroupNameRequest = OnUUIDGroupNameRequest;
  5238. if (handlerUUIDGroupNameRequest != null)
  5239. {
  5240. handlerUUIDGroupNameRequest(t.ID, this);
  5241. }
  5242. }
  5243. return true;
  5244. }
  5245. public bool HandleGenericMessage(IClientAPI sender, Packet pack)
  5246. {
  5247. GenericMessagePacket gmpack = (GenericMessagePacket) pack;
  5248. if (m_genericPacketHandlers.Count == 0) return false;
  5249. if (gmpack.AgentData.SessionID != SessionId) return false;
  5250. GenericMessage handlerGenericMessage = null;
  5251. string method = Util.FieldToString(gmpack.MethodData.Method).ToLower().Trim();
  5252. if (m_genericPacketHandlers.TryGetValue(method, out handlerGenericMessage))
  5253. {
  5254. List<string> msg = new List<string>();
  5255. List<byte[]> msgBytes = new List<byte[]>();
  5256. if (handlerGenericMessage != null)
  5257. {
  5258. foreach (GenericMessagePacket.ParamListBlock block in gmpack.ParamList)
  5259. {
  5260. msg.Add(Util.FieldToString(block.Parameter));
  5261. msgBytes.Add(block.Parameter);
  5262. }
  5263. try
  5264. {
  5265. if (OnBinaryGenericMessage != null)
  5266. {
  5267. OnBinaryGenericMessage(this, method, msgBytes.ToArray());
  5268. }
  5269. handlerGenericMessage(sender, method, msg);
  5270. return true;
  5271. }
  5272. catch (Exception e)
  5273. {
  5274. MainConsole.Instance.ErrorFormat(
  5275. "[LLCLIENTVIEW]: Exeception when handling generic message {0}{1}", e.Message, e.StackTrace);
  5276. }
  5277. }
  5278. }
  5279. //MainConsole.Instance.Debug("[LLCLIENTVIEW]: Not handling GenericMessage with method-type of: " + method);
  5280. return false;
  5281. }
  5282. public bool HandleObjectGroupRequest(IClientAPI sender, Packet Pack)
  5283. {
  5284. ObjectGroupPacket ogpack = (ObjectGroupPacket) Pack;
  5285. if (ogpack.AgentData.SessionID != SessionId) return false;
  5286. RequestObjectPropertiesFamily handlerObjectGroupRequest = OnObjectGroupRequest;
  5287. if (handlerObjectGroupRequest != null)
  5288. {
  5289. foreach (ObjectGroupPacket.ObjectDataBlock t in ogpack.ObjectData)
  5290. {
  5291. handlerObjectGroupRequest(this, ogpack.AgentData.GroupID, t.ObjectLocalID,
  5292. UUID.Zero);
  5293. }
  5294. }
  5295. return true;
  5296. }
  5297. private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
  5298. {
  5299. ViewerEffectPacket viewer = (ViewerEffectPacket) Pack;
  5300. if (viewer.AgentData.SessionID != SessionId) return false;
  5301. ViewerEffectEventHandler handlerViewerEffect = OnViewerEffect;
  5302. if (handlerViewerEffect != null)
  5303. {
  5304. int length = viewer.Effect.Length;
  5305. List<ViewerEffectEventHandlerArg> args = new List<ViewerEffectEventHandlerArg>(length);
  5306. for (int i = 0; i < length; i++)
  5307. {
  5308. //copy the effects block arguments into the event handler arg.
  5309. ViewerEffectEventHandlerArg argument = new ViewerEffectEventHandlerArg
  5310. {
  5311. AgentID = viewer.Effect[i].AgentID,
  5312. Color = viewer.Effect[i].Color,
  5313. Duration = viewer.Effect[i].Duration,
  5314. ID = viewer.Effect[i].ID,
  5315. Type = viewer.Effect[i].Type,
  5316. TypeData = viewer.Effect[i].TypeData
  5317. };
  5318. args.Add(argument);
  5319. }
  5320. handlerViewerEffect(sender, args);
  5321. }
  5322. return true;
  5323. }
  5324. private bool HandleAvatarPropertiesRequest(IClientAPI sender, Packet Pack)
  5325. {
  5326. AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket) Pack;
  5327. #region Packet Session and User Check
  5328. if (m_checkPackets)
  5329. {
  5330. if (avatarProperties.AgentData.SessionID != SessionId ||
  5331. avatarProperties.AgentData.AgentID != AgentId)
  5332. return true;
  5333. }
  5334. #endregion
  5335. RequestAvatarProperties handlerRequestAvatarProperties = OnRequestAvatarProperties;
  5336. if (handlerRequestAvatarProperties != null)
  5337. {
  5338. handlerRequestAvatarProperties(this, avatarProperties.AgentData.AvatarID);
  5339. }
  5340. return true;
  5341. }
  5342. private bool HandleChatFromViewer(IClientAPI sender, Packet Pack)
  5343. {
  5344. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket) Pack;
  5345. #region Packet Session and User Check
  5346. if (m_checkPackets)
  5347. {
  5348. if (inchatpack.AgentData.SessionID != SessionId ||
  5349. inchatpack.AgentData.AgentID != AgentId)
  5350. return true;
  5351. }
  5352. #endregion
  5353. string fromName = String.Empty; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  5354. byte[] message = inchatpack.ChatData.Message;
  5355. byte type = inchatpack.ChatData.Type;
  5356. Vector3 fromPos = new Vector3(); // ClientAvatar.Pos;
  5357. // UUID fromAgentID = AgentId;
  5358. int channel = inchatpack.ChatData.Channel;
  5359. if (OnChatFromClient != null)
  5360. {
  5361. OSChatMessage args = new OSChatMessage
  5362. {
  5363. Channel = channel,
  5364. From = fromName,
  5365. Message = Utils.BytesToString(message),
  5366. Type = (ChatTypeEnum) type,
  5367. Position = fromPos,
  5368. Scene = Scene,
  5369. Sender = this,
  5370. SenderUUID = AgentId
  5371. };
  5372. HandleChatFromClient(args);
  5373. }
  5374. return true;
  5375. }
  5376. public void HandleChatFromClient(OSChatMessage args)
  5377. {
  5378. ChatMessage handlerChatFromClient = OnChatFromClient;
  5379. if (handlerChatFromClient != null)
  5380. handlerChatFromClient(this, args);
  5381. }
  5382. private bool HandlerAvatarPropertiesUpdate(IClientAPI sender, Packet Pack)
  5383. {
  5384. AvatarPropertiesUpdatePacket avatarProps = (AvatarPropertiesUpdatePacket) Pack;
  5385. #region Packet Session and User Check
  5386. if (m_checkPackets)
  5387. {
  5388. if (avatarProps.AgentData.SessionID != SessionId ||
  5389. avatarProps.AgentData.AgentID != AgentId)
  5390. return true;
  5391. }
  5392. #endregion
  5393. UpdateAvatarProperties handlerUpdateAvatarProperties = OnUpdateAvatarProperties;
  5394. if (handlerUpdateAvatarProperties != null)
  5395. {
  5396. AvatarPropertiesUpdatePacket.PropertiesDataBlock Properties = avatarProps.PropertiesData;
  5397. handlerUpdateAvatarProperties(this,
  5398. Utils.BytesToString(Properties.AboutText),
  5399. Utils.BytesToString(Properties.FLAboutText),
  5400. Properties.FLImageID,
  5401. Properties.ImageID,
  5402. Utils.BytesToString(Properties.ProfileURL),
  5403. Properties.AllowPublish,
  5404. Properties.MaturePublish);
  5405. }
  5406. return true;
  5407. }
  5408. private bool HandlerScriptDialogReply(IClientAPI sender, Packet Pack)
  5409. {
  5410. ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket) Pack;
  5411. //MainConsole.Instance.DebugFormat("[CLIENT]: Received ScriptDialogReply from {0}", rdialog.Data.ObjectID);
  5412. #region Packet Session and User Check
  5413. if (m_checkPackets)
  5414. {
  5415. if (rdialog.AgentData.SessionID != SessionId ||
  5416. rdialog.AgentData.AgentID != AgentId)
  5417. return true;
  5418. }
  5419. #endregion
  5420. int ch = rdialog.Data.ChatChannel;
  5421. byte[] msg = rdialog.Data.ButtonLabel;
  5422. if (OnChatFromClient != null)
  5423. {
  5424. OSChatMessage args = new OSChatMessage
  5425. {
  5426. Channel = ch,
  5427. From = String.Empty,
  5428. Message = Utils.BytesToString(msg),
  5429. Type = ChatTypeEnum.Shout,
  5430. Position = new Vector3(),
  5431. Scene = Scene,
  5432. Sender = this
  5433. };
  5434. ChatMessage handlerChatFromClient2 = OnChatFromClient;
  5435. if (handlerChatFromClient2 != null)
  5436. handlerChatFromClient2(this, args);
  5437. }
  5438. return true;
  5439. }
  5440. private bool HandlerImprovedInstantMessage(IClientAPI sender, Packet Pack)
  5441. {
  5442. ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket) Pack;
  5443. #region Packet Session and User Check
  5444. if (m_checkPackets)
  5445. {
  5446. if (msgpack.AgentData.SessionID != SessionId ||
  5447. msgpack.AgentData.AgentID != AgentId)
  5448. return true;
  5449. }
  5450. #endregion
  5451. string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
  5452. string IMmessage = Utils.BytesToString(msgpack.MessageBlock.Message);
  5453. ImprovedInstantMessage handlerInstantMessage = OnInstantMessage;
  5454. if (handlerInstantMessage != null)
  5455. {
  5456. GridInstantMessage im = new GridInstantMessage(Scene,
  5457. msgpack.AgentData.AgentID,
  5458. IMfromName,
  5459. msgpack.MessageBlock.ToAgentID,
  5460. msgpack.MessageBlock.Dialog,
  5461. msgpack.MessageBlock.FromGroup,
  5462. IMmessage,
  5463. msgpack.MessageBlock.ID,
  5464. msgpack.MessageBlock.Offline != 0,
  5465. msgpack.MessageBlock.Position,
  5466. msgpack.MessageBlock.BinaryBucket);
  5467. PreSendImprovedInstantMessage handlerPreSendInstantMessage = OnPreSendInstantMessage;
  5468. if (handlerPreSendInstantMessage != null)
  5469. {
  5470. if (handlerPreSendInstantMessage.GetInvocationList().Cast<PreSendImprovedInstantMessage>().Any(
  5471. d => d(this, im)))
  5472. {
  5473. return true; //handled
  5474. }
  5475. }
  5476. handlerInstantMessage(this, im);
  5477. }
  5478. return true;
  5479. }
  5480. private bool HandlerAcceptFriendship(IClientAPI sender, Packet Pack)
  5481. {
  5482. AcceptFriendshipPacket afriendpack = (AcceptFriendshipPacket) Pack;
  5483. #region Packet Session and User Check
  5484. if (m_checkPackets)
  5485. {
  5486. if (afriendpack.AgentData.SessionID != SessionId ||
  5487. afriendpack.AgentData.AgentID != AgentId)
  5488. return true;
  5489. }
  5490. #endregion
  5491. // My guess is this is the folder to stick the calling card into
  5492. UUID agentID = afriendpack.AgentData.AgentID;
  5493. UUID transactionID = afriendpack.TransactionBlock.TransactionID;
  5494. List<UUID> callingCardFolders = afriendpack.FolderData.Select(t => t.FolderID).ToList();
  5495. FriendActionDelegate handlerApproveFriendRequest = OnApproveFriendRequest;
  5496. if (handlerApproveFriendRequest != null)
  5497. {
  5498. handlerApproveFriendRequest(this, agentID, transactionID, callingCardFolders);
  5499. }
  5500. return true;
  5501. }
  5502. private bool HandlerDeclineFriendship(IClientAPI sender, Packet Pack)
  5503. {
  5504. DeclineFriendshipPacket dfriendpack = (DeclineFriendshipPacket) Pack;
  5505. #region Packet Session and User Check
  5506. if (m_checkPackets)
  5507. {
  5508. if (dfriendpack.AgentData.SessionID != SessionId ||
  5509. dfriendpack.AgentData.AgentID != AgentId)
  5510. return true;
  5511. }
  5512. #endregion
  5513. if (OnDenyFriendRequest != null)
  5514. {
  5515. OnDenyFriendRequest(this,
  5516. dfriendpack.AgentData.AgentID,
  5517. dfriendpack.TransactionBlock.TransactionID,
  5518. null);
  5519. }
  5520. return true;
  5521. }
  5522. private bool HandlerTerminateFrendship(IClientAPI sender, Packet Pack)
  5523. {
  5524. TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket) Pack;
  5525. #region Packet Session and User Check
  5526. if (m_checkPackets)
  5527. {
  5528. if (tfriendpack.AgentData.SessionID != SessionId ||
  5529. tfriendpack.AgentData.AgentID != AgentId)
  5530. return true;
  5531. }
  5532. #endregion
  5533. UUID listOwnerAgentID = tfriendpack.AgentData.AgentID;
  5534. UUID exFriendID = tfriendpack.ExBlock.OtherID;
  5535. FriendshipTermination handlerTerminateFriendship = OnTerminateFriendship;
  5536. if (handlerTerminateFriendship != null)
  5537. {
  5538. handlerTerminateFriendship(this, listOwnerAgentID, exFriendID);
  5539. }
  5540. return true;
  5541. }
  5542. private bool HandleFindAgent(IClientAPI client, Packet Packet)
  5543. {
  5544. FindAgentPacket FindAgent =
  5545. (FindAgentPacket) Packet;
  5546. FindAgentUpdate FindAgentHandler = OnFindAgent;
  5547. if (FindAgentHandler != null)
  5548. {
  5549. FindAgentHandler(this, FindAgent.AgentBlock.Hunter, FindAgent.AgentBlock.Prey);
  5550. return true;
  5551. }
  5552. return false;
  5553. }
  5554. private bool HandleTrackAgent(IClientAPI client, Packet Packet)
  5555. {
  5556. TrackAgentPacket TrackAgent =
  5557. (TrackAgentPacket) Packet;
  5558. #region Packet Session and User Check
  5559. if (m_checkPackets)
  5560. {
  5561. if (TrackAgent.AgentData.SessionID != SessionId ||
  5562. TrackAgent.AgentData.AgentID != AgentId)
  5563. return true;
  5564. }
  5565. #endregion
  5566. TrackAgentUpdate TrackAgentHandler = OnTrackAgent;
  5567. if (TrackAgentHandler != null)
  5568. {
  5569. TrackAgentHandler(this,
  5570. TrackAgent.AgentData.AgentID,
  5571. TrackAgent.TargetData.PreyID);
  5572. return true;
  5573. }
  5574. return false;
  5575. }
  5576. private bool HandlerRezObject(IClientAPI sender, Packet Pack)
  5577. {
  5578. RezObjectPacket rezPacket = (RezObjectPacket) Pack;
  5579. #region Packet Session and User Check
  5580. if (m_checkPackets)
  5581. {
  5582. if (rezPacket.AgentData.SessionID != SessionId ||
  5583. rezPacket.AgentData.AgentID != AgentId)
  5584. return true;
  5585. }
  5586. #endregion
  5587. RezObject handlerRezObject = OnRezObject;
  5588. if (handlerRezObject != null)
  5589. {
  5590. handlerRezObject(this, rezPacket.InventoryData.ItemID, rezPacket.RezData.RayEnd,
  5591. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  5592. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  5593. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  5594. rezPacket.RezData.FromTaskID);
  5595. }
  5596. return true;
  5597. }
  5598. private bool HandlerRezObjectFromNotecard(IClientAPI sender, Packet Pack)
  5599. {
  5600. RezObjectFromNotecardPacket rezPacket = (RezObjectFromNotecardPacket) Pack;
  5601. #region Packet Session and User Check
  5602. if (m_checkPackets)
  5603. {
  5604. if (rezPacket.AgentData.SessionID != SessionId ||
  5605. rezPacket.AgentData.AgentID != AgentId)
  5606. return true;
  5607. }
  5608. #endregion
  5609. RezObject handlerRezObject = OnRezObject;
  5610. if (handlerRezObject != null)
  5611. {
  5612. handlerRezObject(this, rezPacket.InventoryData[0].ItemID, rezPacket.RezData.RayEnd,
  5613. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  5614. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  5615. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  5616. rezPacket.RezData.FromTaskID);
  5617. }
  5618. return true;
  5619. }
  5620. private bool HandlerDeRezObject(IClientAPI sender, Packet Pack)
  5621. {
  5622. DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) Pack;
  5623. #region Packet Session and User Check
  5624. if (m_checkPackets)
  5625. {
  5626. if (DeRezPacket.AgentData.SessionID != SessionId ||
  5627. DeRezPacket.AgentData.AgentID != AgentId)
  5628. return true;
  5629. }
  5630. #endregion
  5631. DeRezObject handlerDeRezObject = OnDeRezObject;
  5632. if (handlerDeRezObject != null)
  5633. {
  5634. List<uint> deRezIDs = DeRezPacket.ObjectData.Select(data => data.ObjectLocalID).ToList();
  5635. // It just so happens that the values on the DeRezAction enumerator match the Destination
  5636. // values given by a Second Life client
  5637. handlerDeRezObject(this, deRezIDs,
  5638. DeRezPacket.AgentBlock.GroupID,
  5639. (DeRezAction) DeRezPacket.AgentBlock.Destination,
  5640. DeRezPacket.AgentBlock.DestinationID);
  5641. }
  5642. return true;
  5643. }
  5644. private bool HandlerModifyLand(IClientAPI sender, Packet Pack)
  5645. {
  5646. ModifyLandPacket modify = (ModifyLandPacket) Pack;
  5647. #region Packet Session and User Check
  5648. if (m_checkPackets)
  5649. {
  5650. if (modify.AgentData.SessionID != SessionId ||
  5651. modify.AgentData.AgentID != AgentId)
  5652. return true;
  5653. }
  5654. #endregion
  5655. //MainConsole.Instance.Info("[LAND]: LAND:" + modify.ToString());
  5656. if (modify.ParcelData.Length > 0)
  5657. {
  5658. if (OnModifyTerrain != null)
  5659. {
  5660. for (int i = 0; i < modify.ParcelData.Length; i++)
  5661. {
  5662. ModifyTerrain handlerModifyTerrain = OnModifyTerrain;
  5663. if (handlerModifyTerrain != null)
  5664. {
  5665. handlerModifyTerrain(AgentId, modify.ModifyBlock.Height, modify.ModifyBlock.Seconds,
  5666. modify.ModifyBlock.BrushSize,
  5667. modify.ModifyBlock.Action, modify.ParcelData[i].North,
  5668. modify.ParcelData[i].West, modify.ParcelData[i].South,
  5669. modify.ParcelData[i].East, AgentId,
  5670. modify.ModifyBlockExtended[i].BrushSize);
  5671. }
  5672. }
  5673. }
  5674. }
  5675. return true;
  5676. }
  5677. private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack)
  5678. {
  5679. Action<IClientAPI> handlerRegionHandShakeReply = OnRegionHandShakeReply;
  5680. if (handlerRegionHandShakeReply != null)
  5681. {
  5682. handlerRegionHandShakeReply(this);
  5683. }
  5684. return true;
  5685. }
  5686. private bool HandlerAgentWearablesRequest(IClientAPI sender, Packet Pack)
  5687. {
  5688. GenericCall1 handlerRequestWearables = OnRequestWearables;
  5689. if (handlerRequestWearables != null)
  5690. {
  5691. handlerRequestWearables(this);
  5692. }
  5693. Action<IClientAPI> handlerRequestAvatarsData = OnRequestAvatarsData;
  5694. if (handlerRequestAvatarsData != null)
  5695. {
  5696. handlerRequestAvatarsData(this);
  5697. }
  5698. return true;
  5699. }
  5700. private bool HandlerAgentSetAppearance(IClientAPI sender, Packet Pack)
  5701. {
  5702. AgentSetAppearancePacket appear = (AgentSetAppearancePacket) Pack;
  5703. #region Packet Session and User Check
  5704. if (m_checkPackets)
  5705. {
  5706. if (appear.AgentData.SessionID != SessionId ||
  5707. appear.AgentData.AgentID != AgentId)
  5708. return true;
  5709. }
  5710. #endregion
  5711. SetAppearance handlerSetAppearance = OnSetAppearance;
  5712. if (handlerSetAppearance != null)
  5713. {
  5714. // Temporarily protect ourselves from the mantis #951 failure.
  5715. // However, we could do this for several other handlers where a failure isn't terminal
  5716. // for the client session anyway, in order to protect ourselves against bad code in plugins
  5717. try
  5718. {
  5719. byte[] visualparams = new byte[appear.VisualParam.Length];
  5720. for (int i = 0; i < appear.VisualParam.Length; i++)
  5721. visualparams[i] = appear.VisualParam[i].ParamValue;
  5722. Primitive.TextureEntry te = null;
  5723. if (appear.ObjectData.TextureEntry.Length > 1)
  5724. te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0,
  5725. appear.ObjectData.TextureEntry.Length);
  5726. WearableCache[] items = new WearableCache[appear.WearableData.Length];
  5727. for (int i = 0; i < appear.WearableData.Length; i++)
  5728. {
  5729. WearableCache cache = new WearableCache
  5730. {
  5731. CacheID = appear.WearableData[i].CacheID,
  5732. TextureIndex = appear.WearableData[i].TextureIndex
  5733. };
  5734. items[i] = cache;
  5735. }
  5736. handlerSetAppearance(this, te, visualparams, items, appear.AgentData.SerialNum);
  5737. }
  5738. catch (Exception e)
  5739. {
  5740. MainConsole.Instance.ErrorFormat(
  5741. "[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}",
  5742. e);
  5743. }
  5744. }
  5745. return true;
  5746. }
  5747. /// <summary>
  5748. /// Send a response back to a client when it asks the asset server (via the region server) if it has
  5749. /// its appearance texture cached.
  5750. /// </summary>
  5751. /// <param name="simclient"></param>
  5752. /// <param name="packet"></param>
  5753. /// <returns></returns>
  5754. private bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
  5755. {
  5756. //MainConsole.Instance.Debug("texture cached: " + packet.ToString());
  5757. AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket) packet;
  5758. if (cachedtex.AgentData.SessionID != SessionId) return false;
  5759. List<CachedAgentArgs> args =
  5760. cachedtex.WearableData.Select(t => new CachedAgentArgs {ID = t.ID, TextureIndex = t.TextureIndex}).
  5761. ToList();
  5762. AgentCachedTextureRequest actr = OnAgentCachedTextureRequest;
  5763. if (actr != null)
  5764. actr(this, args);
  5765. return true;
  5766. }
  5767. public void SendAgentCachedTexture(List<CachedAgentArgs> args)
  5768. {
  5769. AgentCachedTextureResponsePacket cachedresp =
  5770. (AgentCachedTextureResponsePacket) PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
  5771. cachedresp.AgentData.AgentID = AgentId;
  5772. cachedresp.AgentData.SessionID = m_sessionId;
  5773. cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
  5774. m_cachedTextureSerial++;
  5775. cachedresp.WearableData =
  5776. new AgentCachedTextureResponsePacket.WearableDataBlock[args.Count];
  5777. for (int i = 0; i < args.Count; i++)
  5778. {
  5779. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock
  5780. {
  5781. TextureIndex = args[i].TextureIndex,
  5782. TextureID = args[i].ID,
  5783. HostName = new byte[0]
  5784. };
  5785. }
  5786. cachedresp.Header.Zerocoded = true;
  5787. OutPacket(cachedresp, ThrottleOutPacketType.Texture);
  5788. }
  5789. private bool HandlerAgentIsNowWearing(IClientAPI sender, Packet Pack)
  5790. {
  5791. if (OnAvatarNowWearing != null)
  5792. {
  5793. AgentIsNowWearingPacket nowWearing = (AgentIsNowWearingPacket) Pack;
  5794. #region Packet Session and User Check
  5795. if (m_checkPackets)
  5796. {
  5797. if (nowWearing.AgentData.SessionID != SessionId ||
  5798. nowWearing.AgentData.AgentID != AgentId)
  5799. return true;
  5800. }
  5801. #endregion
  5802. AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
  5803. foreach (
  5804. AvatarWearingArgs.Wearable wearable in
  5805. nowWearing.WearableData.Select(t => new AvatarWearingArgs.Wearable(t.ItemID,
  5806. t.WearableType)))
  5807. {
  5808. wearingArgs.NowWearing.Add(wearable);
  5809. }
  5810. AvatarNowWearing handlerAvatarNowWearing = OnAvatarNowWearing;
  5811. if (handlerAvatarNowWearing != null)
  5812. {
  5813. handlerAvatarNowWearing(this, wearingArgs);
  5814. }
  5815. }
  5816. return true;
  5817. }
  5818. private bool HandlerRezSingleAttachmentFromInv(IClientAPI sender, Packet Pack)
  5819. {
  5820. RezSingleAttachmentFromInv handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  5821. if (handlerRezSingleAttachment != null)
  5822. {
  5823. RezSingleAttachmentFromInvPacket rez = (RezSingleAttachmentFromInvPacket) Pack;
  5824. #region Packet Session and User Check
  5825. if (m_checkPackets)
  5826. {
  5827. if (rez.AgentData.SessionID != SessionId ||
  5828. rez.AgentData.AgentID != AgentId)
  5829. return true;
  5830. }
  5831. #endregion
  5832. handlerRezSingleAttachment(this, rez.ObjectData.ItemID,
  5833. rez.ObjectData.AttachmentPt);
  5834. }
  5835. return true;
  5836. }
  5837. private bool HandlerRezRestoreToWorld(IClientAPI sender, Packet Pack)
  5838. {
  5839. RezSingleAttachmentFromInv handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  5840. if (handlerRezSingleAttachment != null)
  5841. {
  5842. RezRestoreToWorldPacket rez = (RezRestoreToWorldPacket) Pack;
  5843. #region Packet Session and User Check
  5844. if (m_checkPackets)
  5845. {
  5846. if (rez.AgentData.SessionID != SessionId ||
  5847. rez.AgentData.AgentID != AgentId)
  5848. return true;
  5849. }
  5850. #endregion
  5851. handlerRezSingleAttachment(this, rez.InventoryData.ItemID,
  5852. 0);
  5853. }
  5854. return true;
  5855. }
  5856. private bool HandleRezMultipleAttachmentsFromInv(IClientAPI sender, Packet Pack)
  5857. {
  5858. RezSingleAttachmentFromInv handlerRezMultipleAttachments = OnRezSingleAttachmentFromInv;
  5859. if (handlerRezMultipleAttachments != null)
  5860. {
  5861. RezMultipleAttachmentsFromInvPacket rez = (RezMultipleAttachmentsFromInvPacket) Pack;
  5862. #region Packet Session and User Check
  5863. if (m_checkPackets)
  5864. {
  5865. if (rez.AgentData.SessionID != SessionId ||
  5866. rez.AgentData.AgentID != AgentId)
  5867. return true;
  5868. }
  5869. #endregion
  5870. foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in rez.ObjectData)
  5871. {
  5872. handlerRezMultipleAttachments(this, obj.ItemID, obj.AttachmentPt);
  5873. }
  5874. }
  5875. return true;
  5876. }
  5877. private bool HandleDetachAttachmentIntoInv(IClientAPI sender, Packet Pack)
  5878. {
  5879. UUIDNameRequest handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv;
  5880. if (handlerDetachAttachmentIntoInv != null)
  5881. {
  5882. DetachAttachmentIntoInvPacket detachtoInv = (DetachAttachmentIntoInvPacket) Pack;
  5883. #region Packet Session and User Check
  5884. //TODO!
  5885. // UNSUPPORTED ON THIS PACKET
  5886. #endregion
  5887. UUID itemID = detachtoInv.ObjectData.ItemID;
  5888. // UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
  5889. handlerDetachAttachmentIntoInv(itemID, this);
  5890. }
  5891. return true;
  5892. }
  5893. private bool HandleObjectAttach(IClientAPI sender, Packet Pack)
  5894. {
  5895. if (OnObjectAttach != null)
  5896. {
  5897. ObjectAttachPacket att = (ObjectAttachPacket) Pack;
  5898. #region Packet Session and User Check
  5899. if (m_checkPackets)
  5900. {
  5901. if (att.AgentData.SessionID != SessionId ||
  5902. att.AgentData.AgentID != AgentId)
  5903. return true;
  5904. }
  5905. #endregion
  5906. ObjectAttach handlerObjectAttach = OnObjectAttach;
  5907. if (handlerObjectAttach != null)
  5908. {
  5909. if (att.ObjectData.Length > 0)
  5910. {
  5911. handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, false);
  5912. }
  5913. }
  5914. }
  5915. return true;
  5916. }
  5917. private bool HandleObjectDetach(IClientAPI sender, Packet Pack)
  5918. {
  5919. ObjectDetachPacket dett = (ObjectDetachPacket) Pack;
  5920. #region Packet Session and User Check
  5921. if (m_checkPackets)
  5922. {
  5923. if (dett.AgentData.SessionID != SessionId ||
  5924. dett.AgentData.AgentID != AgentId)
  5925. return true;
  5926. }
  5927. #endregion
  5928. foreach (ObjectDetachPacket.ObjectDataBlock t in dett.ObjectData)
  5929. {
  5930. uint obj = t.ObjectLocalID;
  5931. ObjectDeselect handlerObjectDetach = OnObjectDetach;
  5932. if (handlerObjectDetach != null)
  5933. {
  5934. handlerObjectDetach(obj, this);
  5935. }
  5936. }
  5937. return true;
  5938. }
  5939. private bool HandleObjectDrop(IClientAPI sender, Packet Pack)
  5940. {
  5941. ObjectDropPacket dropp = (ObjectDropPacket) Pack;
  5942. #region Packet Session and User Check
  5943. if (m_checkPackets)
  5944. {
  5945. if (dropp.AgentData.SessionID != SessionId ||
  5946. dropp.AgentData.AgentID != AgentId)
  5947. return true;
  5948. }
  5949. #endregion
  5950. foreach (ObjectDropPacket.ObjectDataBlock t in dropp.ObjectData)
  5951. {
  5952. uint obj = t.ObjectLocalID;
  5953. ObjectDrop handlerObjectDrop = OnObjectDrop;
  5954. if (handlerObjectDrop != null)
  5955. {
  5956. handlerObjectDrop(obj, this);
  5957. }
  5958. }
  5959. return true;
  5960. }
  5961. private bool HandleSetAlwaysRun(IClientAPI sender, Packet Pack)
  5962. {
  5963. SetAlwaysRunPacket run = (SetAlwaysRunPacket) Pack;
  5964. #region Packet Session and User Check
  5965. if (m_checkPackets)
  5966. {
  5967. if (run.AgentData.SessionID != SessionId ||
  5968. run.AgentData.AgentID != AgentId)
  5969. return true;
  5970. }
  5971. #endregion
  5972. SetAlwaysRun handlerSetAlwaysRun = OnSetAlwaysRun;
  5973. if (handlerSetAlwaysRun != null)
  5974. handlerSetAlwaysRun(this, run.AgentData.AlwaysRun);
  5975. return true;
  5976. }
  5977. private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack)
  5978. {
  5979. GenericCall1 handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
  5980. if (handlerCompleteMovementToRegion != null)
  5981. {
  5982. handlerCompleteMovementToRegion(sender);
  5983. }
  5984. handlerCompleteMovementToRegion = null;
  5985. return true;
  5986. }
  5987. private bool HandleAgentAnimation(IClientAPI sender, Packet Pack)
  5988. {
  5989. AgentAnimationPacket AgentAni = (AgentAnimationPacket) Pack;
  5990. #region Packet Session and User Check
  5991. if (m_checkPackets)
  5992. {
  5993. if (AgentAni.AgentData.SessionID != SessionId ||
  5994. AgentAni.AgentData.AgentID != AgentId)
  5995. return true;
  5996. }
  5997. #endregion
  5998. foreach (AgentAnimationPacket.AnimationListBlock t in AgentAni.AnimationList)
  5999. {
  6000. if (t.StartAnim)
  6001. {
  6002. StartAnim handlerStartAnim = OnStartAnim;
  6003. if (handlerStartAnim != null)
  6004. {
  6005. handlerStartAnim(this, t.AnimID);
  6006. }
  6007. }
  6008. else
  6009. {
  6010. StopAnim handlerStopAnim = OnStopAnim;
  6011. if (handlerStopAnim != null)
  6012. {
  6013. handlerStopAnim(this, t.AnimID);
  6014. }
  6015. }
  6016. }
  6017. return true;
  6018. }
  6019. private bool HandleAgentRequestSit(IClientAPI sender, Packet Pack)
  6020. {
  6021. if (OnAgentRequestSit != null)
  6022. {
  6023. AgentRequestSitPacket agentRequestSit = (AgentRequestSitPacket) Pack;
  6024. #region Packet Session and User Check
  6025. if (m_checkPackets)
  6026. {
  6027. if (agentRequestSit.AgentData.SessionID != SessionId ||
  6028. agentRequestSit.AgentData.AgentID != AgentId)
  6029. return true;
  6030. }
  6031. #endregion
  6032. AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit;
  6033. if (handlerAgentRequestSit != null)
  6034. handlerAgentRequestSit(this,
  6035. agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
  6036. }
  6037. return true;
  6038. }
  6039. private bool HandleAgentSit(IClientAPI sender, Packet Pack)
  6040. {
  6041. if (OnAgentSit != null)
  6042. {
  6043. AgentSitPacket agentSit = (AgentSitPacket) Pack;
  6044. #region Packet Session and User Check
  6045. if (m_checkPackets)
  6046. {
  6047. if (agentSit.AgentData.SessionID != SessionId ||
  6048. agentSit.AgentData.AgentID != AgentId)
  6049. return true;
  6050. }
  6051. #endregion
  6052. AgentSit handlerAgentSit = OnAgentSit;
  6053. if (handlerAgentSit != null)
  6054. {
  6055. OnAgentSit(this, agentSit.AgentData.AgentID);
  6056. }
  6057. }
  6058. return true;
  6059. }
  6060. private bool HandleSoundTrigger(IClientAPI sender, Packet Pack)
  6061. {
  6062. SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket) Pack;
  6063. #region Packet Session and User Check
  6064. if (m_checkPackets)
  6065. {
  6066. //TODO!
  6067. // UNSUPPORTED ON THIS PACKET
  6068. }
  6069. #endregion
  6070. SoundTrigger handlerSoundTrigger = OnSoundTrigger;
  6071. if (handlerSoundTrigger != null)
  6072. {
  6073. // UUIDS are sent as zeroes by the client, substitute agent's id
  6074. handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, AgentId,
  6075. AgentId, AgentId,
  6076. soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
  6077. soundTriggerPacket.SoundData.Handle, 0);
  6078. }
  6079. return true;
  6080. }
  6081. private bool HandleAvatarPickerRequest(IClientAPI sender, Packet Pack)
  6082. {
  6083. AvatarPickerRequestPacket avRequestQuery = (AvatarPickerRequestPacket) Pack;
  6084. #region Packet Session and User Check
  6085. if (m_checkPackets)
  6086. {
  6087. if (avRequestQuery.AgentData.SessionID != SessionId ||
  6088. avRequestQuery.AgentData.AgentID != AgentId)
  6089. return true;
  6090. }
  6091. #endregion
  6092. AvatarPickerRequestPacket.AgentDataBlock Requestdata = avRequestQuery.AgentData;
  6093. AvatarPickerRequestPacket.DataBlock querydata = avRequestQuery.Data;
  6094. //MainConsole.Instance.Debug("Agent Sends:" + Utils.BytesToString(querydata.Name));
  6095. AvatarPickerRequest handlerAvatarPickerRequest = OnAvatarPickerRequest;
  6096. if (handlerAvatarPickerRequest != null)
  6097. {
  6098. handlerAvatarPickerRequest(this, Requestdata.AgentID, Requestdata.QueryID,
  6099. Utils.BytesToString(querydata.Name));
  6100. }
  6101. return true;
  6102. }
  6103. private bool HandleAgentDataUpdateRequest(IClientAPI sender, Packet Pack)
  6104. {
  6105. AgentDataUpdateRequestPacket avRequestDataUpdatePacket = (AgentDataUpdateRequestPacket) Pack;
  6106. #region Packet Session and User Check
  6107. if (m_checkPackets)
  6108. {
  6109. if (avRequestDataUpdatePacket.AgentData.SessionID != SessionId ||
  6110. avRequestDataUpdatePacket.AgentData.AgentID != AgentId)
  6111. return true;
  6112. }
  6113. #endregion
  6114. FetchInventory handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest;
  6115. if (handlerAgentDataUpdateRequest != null)
  6116. {
  6117. handlerAgentDataUpdateRequest(this, avRequestDataUpdatePacket.AgentData.AgentID,
  6118. avRequestDataUpdatePacket.AgentData.SessionID);
  6119. }
  6120. return true;
  6121. }
  6122. private bool HandleUserInfoRequest(IClientAPI sender, Packet Pack)
  6123. {
  6124. UserInfoRequest handlerUserInfoRequest = OnUserInfoRequest;
  6125. if (handlerUserInfoRequest != null)
  6126. {
  6127. handlerUserInfoRequest(this);
  6128. }
  6129. else
  6130. {
  6131. SendUserInfoReply(false, true, "");
  6132. }
  6133. return true;
  6134. }
  6135. private bool HandleUpdateUserInfo(IClientAPI sender, Packet Pack)
  6136. {
  6137. UpdateUserInfoPacket updateUserInfo = (UpdateUserInfoPacket) Pack;
  6138. #region Packet Session and User Check
  6139. if (m_checkPackets)
  6140. {
  6141. if (updateUserInfo.AgentData.SessionID != SessionId ||
  6142. updateUserInfo.AgentData.AgentID != AgentId)
  6143. return true;
  6144. }
  6145. #endregion
  6146. UpdateUserInfo handlerUpdateUserInfo = OnUpdateUserInfo;
  6147. if (handlerUpdateUserInfo != null)
  6148. {
  6149. bool visible = true;
  6150. string DirectoryVisibility =
  6151. Utils.BytesToString(updateUserInfo.UserData.DirectoryVisibility);
  6152. if (DirectoryVisibility == "hidden")
  6153. visible = false;
  6154. handlerUpdateUserInfo(
  6155. updateUserInfo.UserData.IMViaEMail,
  6156. visible, this);
  6157. }
  6158. return true;
  6159. }
  6160. private bool HandleSetStartLocationRequest(IClientAPI sender, Packet Pack)
  6161. {
  6162. SetStartLocationRequestPacket avSetStartLocationRequestPacket = (SetStartLocationRequestPacket) Pack;
  6163. #region Packet Session and User Check
  6164. if (m_checkPackets)
  6165. {
  6166. if (avSetStartLocationRequestPacket.AgentData.SessionID != SessionId ||
  6167. avSetStartLocationRequestPacket.AgentData.AgentID != AgentId)
  6168. return true;
  6169. }
  6170. #endregion
  6171. if (avSetStartLocationRequestPacket.AgentData.AgentID == AgentId &&
  6172. avSetStartLocationRequestPacket.AgentData.SessionID == SessionId)
  6173. {
  6174. // Linden Client limitation..
  6175. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f
  6176. || avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f)
  6177. {
  6178. IScenePresence avatar = null;
  6179. if (m_scene.TryGetScenePresence(AgentId, out avatar))
  6180. {
  6181. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f)
  6182. {
  6183. avSetStartLocationRequestPacket.StartLocationData.LocationPos.X = avatar.AbsolutePosition.X;
  6184. }
  6185. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f)
  6186. {
  6187. avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y = avatar.AbsolutePosition.Y;
  6188. }
  6189. }
  6190. }
  6191. TeleportLocationRequest handlerSetStartLocationRequest = OnSetStartLocationRequest;
  6192. if (handlerSetStartLocationRequest != null)
  6193. {
  6194. handlerSetStartLocationRequest(this, 0,
  6195. avSetStartLocationRequestPacket.StartLocationData.LocationPos,
  6196. avSetStartLocationRequestPacket.StartLocationData.LocationLookAt,
  6197. avSetStartLocationRequestPacket.StartLocationData.LocationID);
  6198. }
  6199. }
  6200. return true;
  6201. }
  6202. private bool HandleAgentThrottle(IClientAPI sender, Packet Pack)
  6203. {
  6204. AgentThrottlePacket atpack = (AgentThrottlePacket) Pack;
  6205. #region Packet Session and User Check
  6206. if (m_checkPackets)
  6207. {
  6208. if (atpack.AgentData.SessionID != SessionId ||
  6209. atpack.AgentData.AgentID != AgentId)
  6210. return true;
  6211. }
  6212. #endregion
  6213. m_udpClient.SetThrottles(atpack.Throttle.Throttles);
  6214. return true;
  6215. }
  6216. private bool HandleAgentPause(IClientAPI sender, Packet Pack)
  6217. {
  6218. #region Packet Session and User Check
  6219. if (m_checkPackets)
  6220. {
  6221. AgentPausePacket agentPausePacket = Pack as AgentPausePacket;
  6222. if (agentPausePacket != null && (agentPausePacket.AgentData.SessionID != SessionId ||
  6223. agentPausePacket.AgentData.AgentID != AgentId))
  6224. return true;
  6225. }
  6226. #endregion
  6227. m_udpClient.IsPaused = true;
  6228. return true;
  6229. }
  6230. private bool HandleAgentResume(IClientAPI sender, Packet Pack)
  6231. {
  6232. #region Packet Session and User Check
  6233. if (m_checkPackets)
  6234. {
  6235. AgentResumePacket agentResumePacket = Pack as AgentResumePacket;
  6236. if (agentResumePacket != null && (agentResumePacket.AgentData.SessionID != SessionId ||
  6237. agentResumePacket.AgentData.AgentID != AgentId))
  6238. return true;
  6239. }
  6240. #endregion
  6241. m_udpClient.IsPaused = false;
  6242. SendStartPingCheck(m_udpClient.CurrentPingSequence++);
  6243. return true;
  6244. }
  6245. private bool HandleForceScriptControlRelease(IClientAPI sender, Packet Pack)
  6246. {
  6247. ForceReleaseControls handlerForceReleaseControls = OnForceReleaseControls;
  6248. if (handlerForceReleaseControls != null)
  6249. {
  6250. handlerForceReleaseControls(this, AgentId);
  6251. }
  6252. return true;
  6253. }
  6254. #endregion Scene/Avatar
  6255. #region Objects/m_sceneObjects
  6256. private bool HandleObjectLink(IClientAPI sender, Packet Pack)
  6257. {
  6258. ObjectLinkPacket link = (ObjectLinkPacket) Pack;
  6259. #region Packet Session and User Check
  6260. if (m_checkPackets)
  6261. {
  6262. if (link.AgentData.SessionID != SessionId ||
  6263. link.AgentData.AgentID != AgentId)
  6264. return true;
  6265. }
  6266. #endregion
  6267. uint parentprimid = 0;
  6268. List<uint> childrenprims = new List<uint>();
  6269. if (link.ObjectData.Length > 1)
  6270. {
  6271. parentprimid = link.ObjectData[0].ObjectLocalID;
  6272. for (int i = 1; i < link.ObjectData.Length; i++)
  6273. {
  6274. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  6275. }
  6276. }
  6277. LinkObjects handlerLinkObjects = OnLinkObjects;
  6278. if (handlerLinkObjects != null)
  6279. {
  6280. handlerLinkObjects(this, parentprimid, childrenprims);
  6281. }
  6282. return true;
  6283. }
  6284. private bool HandleObjectDelink(IClientAPI sender, Packet Pack)
  6285. {
  6286. ObjectDelinkPacket delink = (ObjectDelinkPacket) Pack;
  6287. #region Packet Session and User Check
  6288. if (m_checkPackets)
  6289. {
  6290. if (delink.AgentData.SessionID != SessionId ||
  6291. delink.AgentData.AgentID != AgentId)
  6292. return true;
  6293. }
  6294. #endregion
  6295. // It appears the prim at index 0 is not always the root prim (for
  6296. // instance, when one prim of a link set has been edited independently
  6297. // of the others). Therefore, we'll pass all the ids onto the delink
  6298. // method for it to decide which is the root.
  6299. List<uint> prims = delink.ObjectData.Select(t => t.ObjectLocalID).ToList();
  6300. DelinkObjects handlerDelinkObjects = OnDelinkObjects;
  6301. if (handlerDelinkObjects != null)
  6302. {
  6303. handlerDelinkObjects(prims, this);
  6304. }
  6305. return true;
  6306. }
  6307. private bool HandleObjectAdd(IClientAPI sender, Packet Pack)
  6308. {
  6309. if (OnAddPrim != null)
  6310. {
  6311. ObjectAddPacket addPacket = (ObjectAddPacket) Pack;
  6312. #region Packet Session and User Check
  6313. if (m_checkPackets)
  6314. {
  6315. if (addPacket.AgentData.SessionID != SessionId ||
  6316. addPacket.AgentData.AgentID != AgentId)
  6317. return true;
  6318. }
  6319. #endregion
  6320. PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
  6321. // MainConsole.Instance.Info("[REZData]: " + addPacket.ToString());
  6322. //BypassRaycast: 1
  6323. //RayStart: <69.79469, 158.2652, 98.40343>
  6324. //RayEnd: <61.97724, 141.995, 92.58341>
  6325. //RayTargetID: 00000000-0000-0000-0000-000000000000
  6326. //Check to see if adding the prim is allowed; useful for any module wanting to restrict the
  6327. //object from rezing initially
  6328. AddNewPrim handlerAddPrim = OnAddPrim;
  6329. if (handlerAddPrim != null)
  6330. handlerAddPrim(AgentId, ActiveGroupId, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation,
  6331. shape, addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart,
  6332. addPacket.ObjectData.RayTargetID, addPacket.ObjectData.RayEndIsIntersection);
  6333. }
  6334. return true;
  6335. }
  6336. private bool HandleObjectShape(IClientAPI sender, Packet Pack)
  6337. {
  6338. ObjectShapePacket shapePacket = (ObjectShapePacket) Pack;
  6339. #region Packet Session and User Check
  6340. if (m_checkPackets)
  6341. {
  6342. if (shapePacket.AgentData.SessionID != SessionId ||
  6343. shapePacket.AgentData.AgentID != AgentId)
  6344. return true;
  6345. }
  6346. #endregion
  6347. foreach (ObjectShapePacket.ObjectDataBlock t in shapePacket.ObjectData)
  6348. {
  6349. UpdateShape handlerUpdatePrimShape = OnUpdatePrimShape;
  6350. if (handlerUpdatePrimShape != null)
  6351. {
  6352. UpdateShapeArgs shapeData = new UpdateShapeArgs
  6353. {
  6354. ObjectLocalID = t.ObjectLocalID,
  6355. PathBegin = t.PathBegin,
  6356. PathCurve = t.PathCurve,
  6357. PathEnd = t.PathEnd,
  6358. PathRadiusOffset = t.PathRadiusOffset,
  6359. PathRevolutions = t.PathRevolutions,
  6360. PathScaleX = t.PathScaleX,
  6361. PathScaleY = t.PathScaleY,
  6362. PathShearX = t.PathShearX,
  6363. PathShearY = t.PathShearY,
  6364. PathSkew = t.PathSkew,
  6365. PathTaperX = t.PathTaperX,
  6366. PathTaperY = t.PathTaperY,
  6367. PathTwist = t.PathTwist,
  6368. PathTwistBegin = t.PathTwistBegin,
  6369. ProfileBegin = t.ProfileBegin,
  6370. ProfileCurve = t.ProfileCurve,
  6371. ProfileEnd = t.ProfileEnd,
  6372. ProfileHollow = t.ProfileHollow
  6373. };
  6374. handlerUpdatePrimShape(m_agentId, t.ObjectLocalID,
  6375. shapeData);
  6376. }
  6377. }
  6378. return true;
  6379. }
  6380. private bool HandleObjectExtraParams(IClientAPI sender, Packet Pack)
  6381. {
  6382. ObjectExtraParamsPacket extraPar = (ObjectExtraParamsPacket) Pack;
  6383. #region Packet Session and User Check
  6384. if (m_checkPackets)
  6385. {
  6386. if (extraPar.AgentData.SessionID != SessionId ||
  6387. extraPar.AgentData.AgentID != AgentId)
  6388. return true;
  6389. }
  6390. #endregion
  6391. ObjectExtraParams handlerUpdateExtraParams = OnUpdateExtraParams;
  6392. if (handlerUpdateExtraParams != null)
  6393. {
  6394. foreach (ObjectExtraParamsPacket.ObjectDataBlock t in extraPar.ObjectData)
  6395. {
  6396. handlerUpdateExtraParams(m_agentId, t.ObjectLocalID,
  6397. t.ParamType,
  6398. t.ParamInUse, t.ParamData);
  6399. }
  6400. }
  6401. return true;
  6402. }
  6403. private bool HandleObjectDuplicate(IClientAPI sender, Packet Pack)
  6404. {
  6405. ObjectDuplicatePacket dupe = (ObjectDuplicatePacket) Pack;
  6406. #region Packet Session and User Check
  6407. if (m_checkPackets)
  6408. {
  6409. if (dupe.AgentData.SessionID != SessionId ||
  6410. dupe.AgentData.AgentID != AgentId)
  6411. return true;
  6412. }
  6413. #endregion
  6414. // ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData;
  6415. foreach (ObjectDuplicatePacket.ObjectDataBlock t in dupe.ObjectData)
  6416. {
  6417. ObjectDuplicate handlerObjectDuplicate = OnObjectDuplicate;
  6418. if (handlerObjectDuplicate != null)
  6419. {
  6420. handlerObjectDuplicate(t.ObjectLocalID, dupe.SharedData.Offset,
  6421. dupe.SharedData.DuplicateFlags, AgentId,
  6422. m_activeGroupID, Quaternion.Identity);
  6423. }
  6424. }
  6425. return true;
  6426. }
  6427. private bool HandleRequestMultipleObjects(IClientAPI sender, Packet Pack)
  6428. {
  6429. RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket) Pack;
  6430. #region Packet Session and User Check
  6431. if (m_checkPackets)
  6432. {
  6433. if (incomingRequest.AgentData.SessionID != SessionId ||
  6434. incomingRequest.AgentData.AgentID != AgentId)
  6435. return true;
  6436. }
  6437. #endregion
  6438. foreach (RequestMultipleObjectsPacket.ObjectDataBlock t in incomingRequest.ObjectData)
  6439. {
  6440. ObjectRequest handlerObjectRequest = OnObjectRequest;
  6441. if (handlerObjectRequest != null)
  6442. {
  6443. handlerObjectRequest(t.ID, t.CacheMissType,
  6444. this);
  6445. }
  6446. }
  6447. return true;
  6448. }
  6449. private bool HandleObjectSelect(IClientAPI sender, Packet Pack)
  6450. {
  6451. ObjectSelectPacket incomingselect = (ObjectSelectPacket) Pack;
  6452. #region Packet Session and User Check
  6453. if (m_checkPackets)
  6454. {
  6455. if (incomingselect.AgentData.SessionID != SessionId ||
  6456. incomingselect.AgentData.AgentID != AgentId)
  6457. return true;
  6458. }
  6459. #endregion
  6460. ObjectSelect handlerObjectSelect = null;
  6461. List<uint> LocalIDs = incomingselect.ObjectData.Select(t => t.ObjectLocalID).ToList();
  6462. handlerObjectSelect = OnObjectSelect;
  6463. if (handlerObjectSelect != null)
  6464. {
  6465. handlerObjectSelect(LocalIDs, this);
  6466. }
  6467. return true;
  6468. }
  6469. private bool HandleObjectDeselect(IClientAPI sender, Packet Pack)
  6470. {
  6471. ObjectDeselectPacket incomingdeselect = (ObjectDeselectPacket) Pack;
  6472. #region Packet Session and User Check
  6473. if (m_checkPackets)
  6474. {
  6475. if (incomingdeselect.AgentData.SessionID != SessionId ||
  6476. incomingdeselect.AgentData.AgentID != AgentId)
  6477. return true;
  6478. }
  6479. #endregion
  6480. foreach (ObjectDeselectPacket.ObjectDataBlock t in incomingdeselect.ObjectData)
  6481. {
  6482. ObjectDeselect handlerObjectDeselect = OnObjectDeselect;
  6483. if (handlerObjectDeselect != null)
  6484. {
  6485. OnObjectDeselect(t.ObjectLocalID, this);
  6486. }
  6487. }
  6488. return true;
  6489. }
  6490. private bool HandleObjectPosition(IClientAPI sender, Packet Pack)
  6491. {
  6492. // DEPRECATED: but till libsecondlife removes it, people will use it
  6493. ObjectPositionPacket position = (ObjectPositionPacket) Pack;
  6494. #region Packet Session and User Check
  6495. if (m_checkPackets)
  6496. {
  6497. if (position.AgentData.SessionID != SessionId ||
  6498. position.AgentData.AgentID != AgentId)
  6499. return true;
  6500. }
  6501. #endregion
  6502. foreach (ObjectPositionPacket.ObjectDataBlock t in position.ObjectData)
  6503. {
  6504. UpdateVectorWithUpdate handlerUpdateVector = OnUpdatePrimGroupPosition;
  6505. if (handlerUpdateVector != null)
  6506. handlerUpdateVector(t.ObjectLocalID, t.Position, this,
  6507. true);
  6508. }
  6509. return true;
  6510. }
  6511. private bool HandleObjectScale(IClientAPI sender, Packet Pack)
  6512. {
  6513. // DEPRECATED: but till libsecondlife removes it, people will use it
  6514. ObjectScalePacket scale = (ObjectScalePacket) Pack;
  6515. #region Packet Session and User Check
  6516. if (m_checkPackets)
  6517. {
  6518. if (scale.AgentData.SessionID != SessionId ||
  6519. scale.AgentData.AgentID != AgentId)
  6520. return true;
  6521. }
  6522. #endregion
  6523. foreach (ObjectScalePacket.ObjectDataBlock t in scale.ObjectData)
  6524. {
  6525. UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  6526. if (handlerUpdatePrimGroupScale != null)
  6527. handlerUpdatePrimGroupScale(t.ObjectLocalID, t.Scale, this);
  6528. }
  6529. return true;
  6530. }
  6531. private bool HandleObjectRotation(IClientAPI sender, Packet Pack)
  6532. {
  6533. // DEPRECATED: but till libsecondlife removes it, people will use it
  6534. ObjectRotationPacket rotation = (ObjectRotationPacket) Pack;
  6535. #region Packet Session and User Check
  6536. if (m_checkPackets)
  6537. {
  6538. if (rotation.AgentData.SessionID != SessionId ||
  6539. rotation.AgentData.AgentID != AgentId)
  6540. return true;
  6541. }
  6542. #endregion
  6543. foreach (ObjectRotationPacket.ObjectDataBlock t in rotation.ObjectData)
  6544. {
  6545. UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  6546. if (handlerUpdatePrimRotation != null)
  6547. handlerUpdatePrimRotation(t.ObjectLocalID, t.Rotation,
  6548. this);
  6549. }
  6550. return true;
  6551. }
  6552. private bool HandleObjectFlagUpdate(IClientAPI sender, Packet Pack)
  6553. {
  6554. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket) Pack;
  6555. #region Packet Session and User Check
  6556. if (m_checkPackets)
  6557. {
  6558. if (flags.AgentData.SessionID != SessionId ||
  6559. flags.AgentData.AgentID != AgentId)
  6560. return true;
  6561. }
  6562. #endregion
  6563. UpdatePrimFlags handlerUpdatePrimFlags = OnUpdatePrimFlags;
  6564. if (handlerUpdatePrimFlags != null)
  6565. {
  6566. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, flags.AgentData.UsePhysics,
  6567. flags.AgentData.IsTemporary, flags.AgentData.IsPhantom, flags.ExtraPhysics, this);
  6568. }
  6569. return true;
  6570. }
  6571. private bool HandleObjectImage(IClientAPI sender, Packet Pack)
  6572. {
  6573. ObjectImagePacket imagePack = (ObjectImagePacket) Pack;
  6574. foreach (ObjectImagePacket.ObjectDataBlock t in imagePack.ObjectData)
  6575. {
  6576. UpdatePrimTexture handlerUpdatePrimTexture = OnUpdatePrimTexture;
  6577. if (handlerUpdatePrimTexture != null)
  6578. {
  6579. handlerUpdatePrimTexture(t.ObjectLocalID,
  6580. t.TextureEntry, this);
  6581. }
  6582. }
  6583. return true;
  6584. }
  6585. private bool HandleObjectGrab(IClientAPI sender, Packet Pack)
  6586. {
  6587. ObjectGrabPacket grab = (ObjectGrabPacket) Pack;
  6588. #region Packet Session and User Check
  6589. if (m_checkPackets)
  6590. {
  6591. if (grab.AgentData.SessionID != SessionId ||
  6592. grab.AgentData.AgentID != AgentId)
  6593. return true;
  6594. }
  6595. #endregion
  6596. GrabObject handlerGrabObject = OnGrabObject;
  6597. if (handlerGrabObject != null)
  6598. {
  6599. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  6600. if ((grab.SurfaceInfo != null) && (grab.SurfaceInfo.Length > 0))
  6601. {
  6602. touchArgs.AddRange(grab.SurfaceInfo.Select(surfaceInfo => new SurfaceTouchEventArgs
  6603. {
  6604. Binormal = surfaceInfo.Binormal,
  6605. FaceIndex = surfaceInfo.FaceIndex,
  6606. Normal = surfaceInfo.Normal,
  6607. Position = surfaceInfo.Position,
  6608. STCoord = surfaceInfo.STCoord,
  6609. UVCoord = surfaceInfo.UVCoord
  6610. }));
  6611. }
  6612. handlerGrabObject(grab.ObjectData.LocalID, grab.ObjectData.GrabOffset, this, touchArgs);
  6613. }
  6614. return true;
  6615. }
  6616. private bool HandleObjectGrabUpdate(IClientAPI sender, Packet Pack)
  6617. {
  6618. ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket) Pack;
  6619. #region Packet Session and User Check
  6620. if (m_checkPackets)
  6621. {
  6622. if (grabUpdate.AgentData.SessionID != SessionId ||
  6623. grabUpdate.AgentData.AgentID != AgentId)
  6624. return true;
  6625. }
  6626. #endregion
  6627. MoveObject handlerGrabUpdate = OnGrabUpdate;
  6628. if (handlerGrabUpdate != null)
  6629. {
  6630. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  6631. if ((grabUpdate.SurfaceInfo != null) && (grabUpdate.SurfaceInfo.Length > 0))
  6632. {
  6633. touchArgs.AddRange(grabUpdate.SurfaceInfo.Select(surfaceInfo => new SurfaceTouchEventArgs
  6634. {
  6635. Binormal =
  6636. surfaceInfo.Binormal,
  6637. FaceIndex =
  6638. surfaceInfo.FaceIndex,
  6639. Normal = surfaceInfo.Normal,
  6640. Position =
  6641. surfaceInfo.Position,
  6642. STCoord =
  6643. surfaceInfo.STCoord,
  6644. UVCoord =
  6645. surfaceInfo.UVCoord
  6646. }));
  6647. }
  6648. handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial,
  6649. grabUpdate.ObjectData.GrabPosition, this, touchArgs);
  6650. }
  6651. return true;
  6652. }
  6653. private bool HandleObjectDeGrab(IClientAPI sender, Packet Pack)
  6654. {
  6655. ObjectDeGrabPacket deGrab = (ObjectDeGrabPacket) Pack;
  6656. #region Packet Session and User Check
  6657. if (m_checkPackets)
  6658. {
  6659. if (deGrab.AgentData.SessionID != SessionId ||
  6660. deGrab.AgentData.AgentID != AgentId)
  6661. return true;
  6662. }
  6663. #endregion
  6664. DeGrabObject handlerDeGrabObject = OnDeGrabObject;
  6665. if (handlerDeGrabObject != null)
  6666. {
  6667. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  6668. if ((deGrab.SurfaceInfo != null) && (deGrab.SurfaceInfo.Length > 0))
  6669. {
  6670. touchArgs.AddRange(deGrab.SurfaceInfo.Select(surfaceInfo => new SurfaceTouchEventArgs
  6671. {
  6672. Binormal = surfaceInfo.Binormal,
  6673. FaceIndex =
  6674. surfaceInfo.FaceIndex,
  6675. Normal = surfaceInfo.Normal,
  6676. Position = surfaceInfo.Position,
  6677. STCoord = surfaceInfo.STCoord,
  6678. UVCoord = surfaceInfo.UVCoord
  6679. }));
  6680. }
  6681. handlerDeGrabObject(deGrab.ObjectData.LocalID, this, touchArgs);
  6682. }
  6683. return true;
  6684. }
  6685. private bool HandleObjectSpinStart(IClientAPI sender, Packet Pack)
  6686. {
  6687. //MainConsole.Instance.Warn("[CLIENT]: unhandled ObjectSpinStart packet");
  6688. ObjectSpinStartPacket spinStart = (ObjectSpinStartPacket) Pack;
  6689. #region Packet Session and User Check
  6690. if (m_checkPackets)
  6691. {
  6692. if (spinStart.AgentData.SessionID != SessionId ||
  6693. spinStart.AgentData.AgentID != AgentId)
  6694. return true;
  6695. }
  6696. #endregion
  6697. SpinStart handlerSpinStart = OnSpinStart;
  6698. if (handlerSpinStart != null)
  6699. {
  6700. handlerSpinStart(spinStart.ObjectData.ObjectID, this);
  6701. }
  6702. return true;
  6703. }
  6704. private bool HandleObjectSpinUpdate(IClientAPI sender, Packet Pack)
  6705. {
  6706. //MainConsole.Instance.Warn("[CLIENT]: unhandled ObjectSpinUpdate packet");
  6707. ObjectSpinUpdatePacket spinUpdate = (ObjectSpinUpdatePacket) Pack;
  6708. #region Packet Session and User Check
  6709. if (m_checkPackets)
  6710. {
  6711. if (spinUpdate.AgentData.SessionID != SessionId ||
  6712. spinUpdate.AgentData.AgentID != AgentId)
  6713. return true;
  6714. }
  6715. #endregion
  6716. Vector3 axis;
  6717. float angle;
  6718. spinUpdate.ObjectData.Rotation.GetAxisAngle(out axis, out angle);
  6719. //MainConsole.Instance.Warn("[CLIENT]: ObjectSpinUpdate packet rot axis:" + axis + " angle:" + angle);
  6720. SpinObject handlerSpinUpdate = OnSpinUpdate;
  6721. if (handlerSpinUpdate != null)
  6722. {
  6723. handlerSpinUpdate(spinUpdate.ObjectData.ObjectID, spinUpdate.ObjectData.Rotation, this);
  6724. }
  6725. return true;
  6726. }
  6727. private bool HandleObjectSpinStop(IClientAPI sender, Packet Pack)
  6728. {
  6729. //MainConsole.Instance.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
  6730. ObjectSpinStopPacket spinStop = (ObjectSpinStopPacket) Pack;
  6731. #region Packet Session and User Check
  6732. if (m_checkPackets)
  6733. {
  6734. if (spinStop.AgentData.SessionID != SessionId ||
  6735. spinStop.AgentData.AgentID != AgentId)
  6736. return true;
  6737. }
  6738. #endregion
  6739. SpinStop handlerSpinStop = OnSpinStop;
  6740. if (handlerSpinStop != null)
  6741. {
  6742. handlerSpinStop(spinStop.ObjectData.ObjectID, this);
  6743. }
  6744. return true;
  6745. }
  6746. private bool HandleObjectDescription(IClientAPI sender, Packet Pack)
  6747. {
  6748. ObjectDescriptionPacket objDes = (ObjectDescriptionPacket) Pack;
  6749. #region Packet Session and User Check
  6750. if (m_checkPackets)
  6751. {
  6752. if (objDes.AgentData.SessionID != SessionId ||
  6753. objDes.AgentData.AgentID != AgentId)
  6754. return true;
  6755. }
  6756. #endregion
  6757. foreach (ObjectDescriptionPacket.ObjectDataBlock t in objDes.ObjectData)
  6758. {
  6759. GenericCall7 handlerObjectDescription = OnObjectDescription;
  6760. if (handlerObjectDescription != null)
  6761. {
  6762. handlerObjectDescription(this, t.LocalID,
  6763. Util.FieldToString(t.Description));
  6764. }
  6765. }
  6766. return true;
  6767. }
  6768. private bool HandleObjectName(IClientAPI sender, Packet Pack)
  6769. {
  6770. ObjectNamePacket objName = (ObjectNamePacket) Pack;
  6771. #region Packet Session and User Check
  6772. if (m_checkPackets)
  6773. {
  6774. if (objName.AgentData.SessionID != SessionId ||
  6775. objName.AgentData.AgentID != AgentId)
  6776. return true;
  6777. }
  6778. #endregion
  6779. foreach (ObjectNamePacket.ObjectDataBlock t in objName.ObjectData)
  6780. {
  6781. GenericCall7 handlerObjectName = OnObjectName;
  6782. if (handlerObjectName != null)
  6783. {
  6784. handlerObjectName(this, t.LocalID,
  6785. Util.FieldToString(t.Name));
  6786. }
  6787. }
  6788. return true;
  6789. }
  6790. private bool HandleObjectPermissions(IClientAPI sender, Packet Pack)
  6791. {
  6792. if (OnObjectPermissions != null)
  6793. {
  6794. ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket) Pack;
  6795. #region Packet Session and User Check
  6796. if (m_checkPackets)
  6797. {
  6798. if (newobjPerms.AgentData.SessionID != SessionId ||
  6799. newobjPerms.AgentData.AgentID != AgentId)
  6800. return true;
  6801. }
  6802. #endregion
  6803. UUID AgentID = newobjPerms.AgentData.AgentID;
  6804. UUID SessionID = newobjPerms.AgentData.SessionID;
  6805. foreach (ObjectPermissionsPacket.ObjectDataBlock permChanges in newobjPerms.ObjectData)
  6806. {
  6807. byte field = permChanges.Field;
  6808. uint localID = permChanges.ObjectLocalID;
  6809. uint mask = permChanges.Mask;
  6810. byte set = permChanges.Set;
  6811. ObjectPermissions handlerObjectPermissions = OnObjectPermissions;
  6812. if (handlerObjectPermissions != null)
  6813. handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set);
  6814. }
  6815. }
  6816. // Here's our data,
  6817. // PermField contains the field the info goes into
  6818. // PermField determines which mask we're changing
  6819. //
  6820. // chmask is the mask of the change
  6821. // setTF is whether we're adding it or taking it away
  6822. //
  6823. // objLocalID is the localID of the object.
  6824. // Unfortunately, we have to pass the event the packet because objData is an array
  6825. // That means multiple object perms may be updated in a single packet.
  6826. return true;
  6827. }
  6828. private bool HandleUndo(IClientAPI sender, Packet Pack)
  6829. {
  6830. UndoPacket undoitem = (UndoPacket) Pack;
  6831. #region Packet Session and User Check
  6832. if (m_checkPackets)
  6833. {
  6834. if (undoitem.AgentData.SessionID != SessionId ||
  6835. undoitem.AgentData.AgentID != AgentId)
  6836. return true;
  6837. }
  6838. #endregion
  6839. if (undoitem.ObjectData.Length > 0)
  6840. {
  6841. foreach (UndoPacket.ObjectDataBlock t in undoitem.ObjectData)
  6842. {
  6843. UUID objiD = t.ObjectID;
  6844. AgentSit handlerOnUndo = OnUndo;
  6845. if (handlerOnUndo != null)
  6846. {
  6847. handlerOnUndo(this, objiD);
  6848. }
  6849. }
  6850. }
  6851. return true;
  6852. }
  6853. private bool HandleLandUndo(IClientAPI sender, Packet Pack)
  6854. {
  6855. UndoLandPacket undolanditem = (UndoLandPacket) Pack;
  6856. #region Packet Session and User Check
  6857. if (m_checkPackets)
  6858. {
  6859. if (undolanditem.AgentData.SessionID != SessionId ||
  6860. undolanditem.AgentData.AgentID != AgentId)
  6861. return true;
  6862. }
  6863. #endregion
  6864. LandUndo handlerOnUndo = OnLandUndo;
  6865. if (handlerOnUndo != null)
  6866. {
  6867. handlerOnUndo(this);
  6868. }
  6869. return true;
  6870. }
  6871. private bool HandleRedo(IClientAPI sender, Packet Pack)
  6872. {
  6873. RedoPacket redoitem = (RedoPacket) Pack;
  6874. #region Packet Session and User Check
  6875. if (m_checkPackets)
  6876. {
  6877. if (redoitem.AgentData.SessionID != SessionId ||
  6878. redoitem.AgentData.AgentID != AgentId)
  6879. return true;
  6880. }
  6881. #endregion
  6882. if (redoitem.ObjectData.Length > 0)
  6883. {
  6884. foreach (RedoPacket.ObjectDataBlock t in redoitem.ObjectData)
  6885. {
  6886. UUID objiD = t.ObjectID;
  6887. AgentSit handlerOnRedo = OnRedo;
  6888. if (handlerOnRedo != null)
  6889. {
  6890. handlerOnRedo(this, objiD);
  6891. }
  6892. }
  6893. }
  6894. return true;
  6895. }
  6896. private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack)
  6897. {
  6898. ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket) Pack;
  6899. #region Packet Session and User Check
  6900. if (m_checkPackets)
  6901. {
  6902. if (dupeOnRay.AgentData.SessionID != SessionId ||
  6903. dupeOnRay.AgentData.AgentID != AgentId)
  6904. return true;
  6905. }
  6906. #endregion
  6907. foreach (ObjectDuplicateOnRayPacket.ObjectDataBlock t in dupeOnRay.ObjectData)
  6908. {
  6909. ObjectDuplicateOnRay handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay;
  6910. if (handlerObjectDuplicateOnRay != null)
  6911. {
  6912. handlerObjectDuplicateOnRay(t.ObjectLocalID,
  6913. dupeOnRay.AgentData.DuplicateFlags,
  6914. AgentId, m_activeGroupID, dupeOnRay.AgentData.RayTargetID,
  6915. dupeOnRay.AgentData.RayEnd,
  6916. dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast,
  6917. dupeOnRay.AgentData.RayEndIsIntersection,
  6918. dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
  6919. }
  6920. }
  6921. return true;
  6922. }
  6923. private bool HandleRequestObjectPropertiesFamily(IClientAPI sender, Packet Pack)
  6924. {
  6925. //This powers the little tooltip that appears when you move your mouse over an object
  6926. RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket) Pack;
  6927. #region Packet Session and User Check
  6928. if (m_checkPackets)
  6929. {
  6930. if (packToolTip.AgentData.SessionID != SessionId ||
  6931. packToolTip.AgentData.AgentID != AgentId)
  6932. return true;
  6933. }
  6934. #endregion
  6935. RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
  6936. RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily;
  6937. if (handlerRequestObjectPropertiesFamily != null)
  6938. {
  6939. handlerRequestObjectPropertiesFamily(this, m_agentId, packObjBlock.RequestFlags,
  6940. packObjBlock.ObjectID);
  6941. }
  6942. return true;
  6943. }
  6944. private bool HandleObjectIncludeInSearch(IClientAPI sender, Packet Pack)
  6945. {
  6946. //This lets us set objects to appear in search (stuff like DataSnapshot, etc)
  6947. ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket) Pack;
  6948. #region Packet Session and User Check
  6949. if (m_checkPackets)
  6950. {
  6951. if (packInSearch.AgentData.SessionID != SessionId ||
  6952. packInSearch.AgentData.AgentID != AgentId)
  6953. return true;
  6954. }
  6955. #endregion
  6956. foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData)
  6957. {
  6958. bool inSearch = objData.IncludeInSearch;
  6959. uint localID = objData.ObjectLocalID;
  6960. ObjectIncludeInSearch handlerObjectIncludeInSearch = OnObjectIncludeInSearch;
  6961. if (handlerObjectIncludeInSearch != null)
  6962. {
  6963. handlerObjectIncludeInSearch(this, inSearch, localID);
  6964. }
  6965. }
  6966. return true;
  6967. }
  6968. private bool HandleScriptAnswerYes(IClientAPI sender, Packet Pack)
  6969. {
  6970. ScriptAnswerYesPacket scriptAnswer = (ScriptAnswerYesPacket) Pack;
  6971. #region Packet Session and User Check
  6972. if (m_checkPackets)
  6973. {
  6974. if (scriptAnswer.AgentData.SessionID != SessionId ||
  6975. scriptAnswer.AgentData.AgentID != AgentId)
  6976. return true;
  6977. }
  6978. #endregion
  6979. ScriptAnswer handlerScriptAnswer = OnScriptAnswer;
  6980. if (handlerScriptAnswer != null)
  6981. {
  6982. handlerScriptAnswer(this, scriptAnswer.Data.TaskID, scriptAnswer.Data.ItemID,
  6983. scriptAnswer.Data.Questions);
  6984. }
  6985. return true;
  6986. }
  6987. private bool HandleObjectClickAction(IClientAPI sender, Packet Pack)
  6988. {
  6989. ObjectClickActionPacket ocpacket = (ObjectClickActionPacket) Pack;
  6990. #region Packet Session and User Check
  6991. if (m_checkPackets)
  6992. {
  6993. if (ocpacket.AgentData.SessionID != SessionId ||
  6994. ocpacket.AgentData.AgentID != AgentId)
  6995. return true;
  6996. }
  6997. #endregion
  6998. GenericCall7 handlerObjectClickAction = OnObjectClickAction;
  6999. if (handlerObjectClickAction != null)
  7000. {
  7001. foreach (ObjectClickActionPacket.ObjectDataBlock odata in ocpacket.ObjectData)
  7002. {
  7003. byte action = odata.ClickAction;
  7004. uint localID = odata.ObjectLocalID;
  7005. handlerObjectClickAction(this, localID, action.ToString());
  7006. }
  7007. }
  7008. return true;
  7009. }
  7010. private bool HandleObjectMaterial(IClientAPI sender, Packet Pack)
  7011. {
  7012. ObjectMaterialPacket ompacket = (ObjectMaterialPacket) Pack;
  7013. #region Packet Session and User Check
  7014. if (m_checkPackets)
  7015. {
  7016. if (ompacket.AgentData.SessionID != SessionId ||
  7017. ompacket.AgentData.AgentID != AgentId)
  7018. return true;
  7019. }
  7020. #endregion
  7021. GenericCall7 handlerObjectMaterial = OnObjectMaterial;
  7022. if (handlerObjectMaterial != null)
  7023. {
  7024. foreach (ObjectMaterialPacket.ObjectDataBlock odata in ompacket.ObjectData)
  7025. {
  7026. byte material = odata.Material;
  7027. uint localID = odata.ObjectLocalID;
  7028. handlerObjectMaterial(this, localID, material.ToString());
  7029. }
  7030. }
  7031. return true;
  7032. }
  7033. #endregion Objects/m_sceneObjects
  7034. #region Inventory/Asset/Other related packets
  7035. private bool HandleRequestImage(IClientAPI sender, Packet Pack)
  7036. {
  7037. RequestImagePacket imageRequest = (RequestImagePacket) Pack;
  7038. //MainConsole.Instance.Debug("image request: " + Pack.ToString());
  7039. #region Packet Session and User Check
  7040. if (m_checkPackets)
  7041. {
  7042. if (imageRequest.AgentData.SessionID != SessionId ||
  7043. imageRequest.AgentData.AgentID != AgentId)
  7044. return true;
  7045. }
  7046. #endregion
  7047. //handlerTextureRequest = null;
  7048. foreach (RequestImagePacket.RequestImageBlock t in imageRequest.RequestImage)
  7049. {
  7050. TextureRequestArgs args = new TextureRequestArgs();
  7051. RequestImagePacket.RequestImageBlock block = t;
  7052. args.RequestedAssetID = block.Image;
  7053. args.DiscardLevel = block.DiscardLevel;
  7054. args.PacketNumber = block.Packet;
  7055. args.Priority = block.DownloadPriority;
  7056. args.requestSequence = imageRequest.Header.Sequence;
  7057. // NOTE: This is not a built in part of the LLUDP protocol, but we double the
  7058. // priority of avatar textures to get avatars rezzing in faster than the
  7059. // surrounding scene
  7060. if ((ImageType) block.Type == ImageType.Baked)
  7061. args.Priority *= 2.0f;
  7062. // in the end, we null this, so we have to check if it's null
  7063. if (m_imageManager != null)
  7064. {
  7065. m_imageManager.EnqueueReq(args);
  7066. }
  7067. }
  7068. return true;
  7069. }
  7070. /// <summary>
  7071. /// This is the entry point for the UDP route by which the client can retrieve asset data. If the request
  7072. /// is successful then a TransferInfo packet will be sent back, followed by one or more TransferPackets
  7073. /// </summary>
  7074. /// <param name="sender"></param>
  7075. /// <param name="Pack"></param>
  7076. /// <returns>This parameter may be ignored since we appear to return true whatever happens</returns>
  7077. private bool HandleTransferRequest(IClientAPI sender, Packet Pack)
  7078. {
  7079. //MainConsole.Instance.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
  7080. TransferRequestPacket transfer = (TransferRequestPacket) Pack;
  7081. //MainConsole.Instance.Debug("Transfer Request: " + transfer.ToString());
  7082. // Validate inventory transfers
  7083. // Has to be done here, because AssetCache can't do it
  7084. //
  7085. UUID taskID = UUID.Zero;
  7086. if (transfer.TransferInfo.SourceType == (int) SourceType.SimInventoryItem)
  7087. {
  7088. taskID = new UUID(transfer.TransferInfo.Params, 48);
  7089. UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
  7090. UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
  7091. // MainConsole.Instance.DebugFormat(
  7092. // "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
  7093. // requestID, itemID, taskID, Name);
  7094. if (!m_scene.Permissions.BypassPermissions())
  7095. {
  7096. if (taskID != UUID.Zero) // Prim
  7097. {
  7098. ISceneChildEntity part = m_scene.GetSceneObjectPart(taskID);
  7099. if (part == null)
  7100. {
  7101. MainConsole.Instance.WarnFormat(
  7102. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
  7103. Name, requestID, itemID, taskID);
  7104. return true;
  7105. }
  7106. TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
  7107. if (tii == null)
  7108. {
  7109. MainConsole.Instance.WarnFormat(
  7110. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
  7111. Name, requestID, itemID, taskID);
  7112. return true;
  7113. }
  7114. if (tii.Type == (int) AssetType.LSLText)
  7115. {
  7116. if (!m_scene.Permissions.CanEditScript(itemID, taskID, AgentId))
  7117. return true;
  7118. }
  7119. else if (tii.Type == (int) AssetType.Notecard)
  7120. {
  7121. if (!m_scene.Permissions.CanEditNotecard(itemID, taskID, AgentId))
  7122. return true;
  7123. }
  7124. else
  7125. {
  7126. if (!m_scene.Permissions.CanEditObjectInventory(part.UUID, AgentId))
  7127. {
  7128. MainConsole.Instance.Warn(
  7129. "[LLClientView]: Permissions check for CanEditObjectInventory fell through to standard code!");
  7130. if (part.OwnerID != AgentId)
  7131. {
  7132. MainConsole.Instance.WarnFormat(
  7133. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
  7134. Name, requestID, itemID, taskID, part.OwnerID);
  7135. return true;
  7136. }
  7137. if ((part.OwnerMask & (uint) PermissionMask.Modify) == 0)
  7138. {
  7139. MainConsole.Instance.WarnFormat(
  7140. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
  7141. Name, requestID, itemID, taskID);
  7142. return true;
  7143. }
  7144. if (tii.OwnerID != AgentId)
  7145. {
  7146. MainConsole.Instance.WarnFormat(
  7147. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
  7148. Name, requestID, itemID, taskID, tii.OwnerID);
  7149. return true;
  7150. }
  7151. if ((
  7152. tii.CurrentPermissions &
  7153. ((uint) PermissionMask.Modify | (uint) PermissionMask.Copy |
  7154. (uint) PermissionMask.Transfer))
  7155. !=
  7156. ((uint) PermissionMask.Modify | (uint) PermissionMask.Copy |
  7157. (uint) PermissionMask.Transfer))
  7158. {
  7159. MainConsole.Instance.WarnFormat(
  7160. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
  7161. Name, requestID, itemID, taskID);
  7162. return true;
  7163. }
  7164. if (tii.AssetID != requestID)
  7165. {
  7166. MainConsole.Instance.WarnFormat(
  7167. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
  7168. Name, requestID, itemID, taskID, tii.AssetID);
  7169. return true;
  7170. }
  7171. }
  7172. }
  7173. }
  7174. else // Agent
  7175. {
  7176. IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
  7177. if (invAccess != null)
  7178. {
  7179. if (!invAccess.GetAgentInventoryItem(this, itemID, requestID))
  7180. return false;
  7181. }
  7182. else
  7183. return false;
  7184. }
  7185. }
  7186. }
  7187. MakeAssetRequest(transfer, taskID);
  7188. return true;
  7189. }
  7190. private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack)
  7191. {
  7192. AssetUploadRequestPacket request = (AssetUploadRequestPacket) Pack;
  7193. // MainConsole.Instance.Debug("upload request " + request.ToString());
  7194. // MainConsole.Instance.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
  7195. UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
  7196. UDPAssetUploadRequest handlerAssetUploadRequest = OnAssetUploadRequest;
  7197. if (handlerAssetUploadRequest != null)
  7198. {
  7199. handlerAssetUploadRequest(this, temp,
  7200. request.AssetBlock.TransactionID, request.AssetBlock.Type,
  7201. request.AssetBlock.AssetData, request.AssetBlock.StoreLocal,
  7202. request.AssetBlock.Tempfile);
  7203. }
  7204. return true;
  7205. }
  7206. private bool HandleRequestXfer(IClientAPI sender, Packet Pack)
  7207. {
  7208. RequestXferPacket xferReq = (RequestXferPacket) Pack;
  7209. RequestXfer handlerRequestXfer = OnRequestXfer;
  7210. if (handlerRequestXfer != null)
  7211. {
  7212. handlerRequestXfer(this, xferReq.XferID.ID, Util.FieldToString(xferReq.XferID.Filename));
  7213. }
  7214. return true;
  7215. }
  7216. private bool HandleSendXferPacket(IClientAPI sender, Packet Pack)
  7217. {
  7218. SendXferPacketPacket xferRec = (SendXferPacketPacket) Pack;
  7219. XferReceive handlerXferReceive = OnXferReceive;
  7220. if (handlerXferReceive != null)
  7221. {
  7222. handlerXferReceive(this, xferRec.XferID.ID, xferRec.XferID.Packet, xferRec.DataPacket.Data);
  7223. }
  7224. return true;
  7225. }
  7226. private bool HandleConfirmXferPacket(IClientAPI sender, Packet Pack)
  7227. {
  7228. ConfirmXferPacketPacket confirmXfer = (ConfirmXferPacketPacket) Pack;
  7229. ConfirmXfer handlerConfirmXfer = OnConfirmXfer;
  7230. if (handlerConfirmXfer != null)
  7231. {
  7232. handlerConfirmXfer(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet);
  7233. }
  7234. return true;
  7235. }
  7236. private bool HandleAbortXfer(IClientAPI sender, Packet Pack)
  7237. {
  7238. AbortXferPacket abortXfer = (AbortXferPacket) Pack;
  7239. AbortXfer handlerAbortXfer = OnAbortXfer;
  7240. if (handlerAbortXfer != null)
  7241. {
  7242. handlerAbortXfer(this, abortXfer.XferID.ID);
  7243. }
  7244. return true;
  7245. }
  7246. public void SendAbortXferPacket(ulong xferID)
  7247. {
  7248. AbortXferPacket xferItem = (AbortXferPacket) PacketPool.Instance.GetPacket(PacketType.AbortXfer);
  7249. xferItem.XferID.ID = xferID;
  7250. OutPacket(xferItem, ThrottleOutPacketType.Transfer);
  7251. }
  7252. private bool HandleCreateInventoryFolder(IClientAPI sender, Packet Pack)
  7253. {
  7254. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket) Pack;
  7255. #region Packet Session and User Check
  7256. if (m_checkPackets)
  7257. {
  7258. if (invFolder.AgentData.SessionID != SessionId ||
  7259. invFolder.AgentData.AgentID != AgentId)
  7260. return true;
  7261. }
  7262. #endregion
  7263. CreateInventoryFolder handlerCreateInventoryFolder = OnCreateNewInventoryFolder;
  7264. if (handlerCreateInventoryFolder != null)
  7265. {
  7266. handlerCreateInventoryFolder(this, invFolder.FolderData.FolderID,
  7267. (ushort) invFolder.FolderData.Type,
  7268. Util.FieldToString(invFolder.FolderData.Name),
  7269. invFolder.FolderData.ParentID);
  7270. }
  7271. return true;
  7272. }
  7273. private bool HandleUpdateInventoryFolder(IClientAPI sender, Packet Pack)
  7274. {
  7275. if (OnUpdateInventoryFolder != null)
  7276. {
  7277. UpdateInventoryFolderPacket invFolderx = (UpdateInventoryFolderPacket) Pack;
  7278. #region Packet Session and User Check
  7279. if (m_checkPackets)
  7280. {
  7281. if (invFolderx.AgentData.SessionID != SessionId ||
  7282. invFolderx.AgentData.AgentID != AgentId)
  7283. return true;
  7284. }
  7285. #endregion
  7286. foreach (UpdateInventoryFolderPacket.FolderDataBlock t in from t in invFolderx.FolderData
  7287. let handlerUpdateInventoryFolder =
  7288. OnUpdateInventoryFolder
  7289. where handlerUpdateInventoryFolder != null
  7290. select t)
  7291. {
  7292. OnUpdateInventoryFolder(this, t.FolderID,
  7293. (ushort) t.Type,
  7294. Util.FieldToString(t.Name),
  7295. t.ParentID);
  7296. }
  7297. }
  7298. return true;
  7299. }
  7300. private bool HandleMoveInventoryFolder(IClientAPI sender, Packet Pack)
  7301. {
  7302. if (OnMoveInventoryFolder != null)
  7303. {
  7304. MoveInventoryFolderPacket invFoldery = (MoveInventoryFolderPacket) Pack;
  7305. #region Packet Session and User Check
  7306. if (m_checkPackets)
  7307. {
  7308. if (invFoldery.AgentData.SessionID != SessionId ||
  7309. invFoldery.AgentData.AgentID != AgentId)
  7310. return true;
  7311. }
  7312. #endregion
  7313. foreach (MoveInventoryFolderPacket.InventoryDataBlock t in from t in invFoldery.InventoryData
  7314. let handlerMoveInventoryFolder =
  7315. OnMoveInventoryFolder
  7316. where handlerMoveInventoryFolder != null
  7317. select t)
  7318. {
  7319. OnMoveInventoryFolder(this, t.FolderID,
  7320. t.ParentID);
  7321. }
  7322. }
  7323. return true;
  7324. }
  7325. private bool HandleCreateInventoryItem(IClientAPI sender, Packet Pack)
  7326. {
  7327. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket) Pack;
  7328. #region Packet Session and User Check
  7329. if (m_checkPackets)
  7330. {
  7331. if (createItem.AgentData.SessionID != SessionId ||
  7332. createItem.AgentData.AgentID != AgentId)
  7333. return true;
  7334. }
  7335. #endregion
  7336. CreateNewInventoryItem handlerCreateNewInventoryItem = OnCreateNewInventoryItem;
  7337. if (handlerCreateNewInventoryItem != null)
  7338. {
  7339. handlerCreateNewInventoryItem(this, createItem.InventoryBlock.TransactionID,
  7340. createItem.InventoryBlock.FolderID,
  7341. createItem.InventoryBlock.CallbackID,
  7342. Util.FieldToString(createItem.InventoryBlock.Description),
  7343. Util.FieldToString(createItem.InventoryBlock.Name),
  7344. createItem.InventoryBlock.InvType,
  7345. createItem.InventoryBlock.Type,
  7346. createItem.InventoryBlock.WearableType,
  7347. createItem.InventoryBlock.NextOwnerMask,
  7348. Util.UnixTimeSinceEpoch());
  7349. }
  7350. return true;
  7351. }
  7352. private bool HandleLinkInventoryItem(IClientAPI sender, Packet Pack)
  7353. {
  7354. LinkInventoryItemPacket createLink = (LinkInventoryItemPacket) Pack;
  7355. #region Packet Session and User Check
  7356. if (m_checkPackets)
  7357. {
  7358. if (createLink.AgentData.SessionID != SessionId ||
  7359. createLink.AgentData.AgentID != AgentId)
  7360. return true;
  7361. }
  7362. #endregion
  7363. LinkInventoryItem linkInventoryItem = OnLinkInventoryItem;
  7364. if (linkInventoryItem != null)
  7365. {
  7366. linkInventoryItem(
  7367. this,
  7368. createLink.InventoryBlock.TransactionID,
  7369. createLink.InventoryBlock.FolderID,
  7370. createLink.InventoryBlock.CallbackID,
  7371. Util.FieldToString(createLink.InventoryBlock.Description),
  7372. Util.FieldToString(createLink.InventoryBlock.Name),
  7373. createLink.InventoryBlock.InvType,
  7374. createLink.InventoryBlock.Type,
  7375. createLink.InventoryBlock.OldItemID);
  7376. }
  7377. return true;
  7378. }
  7379. private bool HandleFetchInventory(IClientAPI sender, Packet Pack)
  7380. {
  7381. if (OnFetchInventory != null)
  7382. {
  7383. FetchInventoryPacket FetchInventoryx = (FetchInventoryPacket) Pack;
  7384. #region Packet Session and User Check
  7385. if (m_checkPackets)
  7386. {
  7387. if (FetchInventoryx.AgentData.SessionID != SessionId ||
  7388. FetchInventoryx.AgentData.AgentID != AgentId)
  7389. return true;
  7390. }
  7391. #endregion
  7392. foreach (FetchInventoryPacket.InventoryDataBlock t in FetchInventoryx.InventoryData)
  7393. {
  7394. FetchInventory handlerFetchInventory = OnFetchInventory;
  7395. if (handlerFetchInventory != null)
  7396. {
  7397. OnFetchInventory(this, t.ItemID,
  7398. t.OwnerID);
  7399. }
  7400. }
  7401. }
  7402. return true;
  7403. }
  7404. private bool HandleFetchInventoryDescendents(IClientAPI sender, Packet Pack)
  7405. {
  7406. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket) Pack;
  7407. #region Packet Session and User Check
  7408. if (m_checkPackets)
  7409. {
  7410. if (Fetch.AgentData.SessionID != SessionId ||
  7411. Fetch.AgentData.AgentID != AgentId)
  7412. return true;
  7413. }
  7414. #endregion
  7415. FetchInventoryDescendents handlerFetchInventoryDescendents = OnFetchInventoryDescendents;
  7416. if (handlerFetchInventoryDescendents != null)
  7417. {
  7418. handlerFetchInventoryDescendents(this, Fetch.InventoryData.FolderID, Fetch.InventoryData.OwnerID,
  7419. Fetch.InventoryData.FetchFolders, Fetch.InventoryData.FetchItems,
  7420. Fetch.InventoryData.SortOrder);
  7421. }
  7422. return true;
  7423. }
  7424. private bool HandlePurgeInventoryDescendents(IClientAPI sender, Packet Pack)
  7425. {
  7426. PurgeInventoryDescendentsPacket Purge = (PurgeInventoryDescendentsPacket) Pack;
  7427. #region Packet Session and User Check
  7428. if (m_checkPackets)
  7429. {
  7430. if (Purge.AgentData.SessionID != SessionId ||
  7431. Purge.AgentData.AgentID != AgentId)
  7432. return true;
  7433. }
  7434. #endregion
  7435. PurgeInventoryDescendents handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents;
  7436. if (handlerPurgeInventoryDescendents != null)
  7437. {
  7438. handlerPurgeInventoryDescendents(this, Purge.InventoryData.FolderID);
  7439. }
  7440. return true;
  7441. }
  7442. private bool HandleUpdateInventoryItem(IClientAPI sender, Packet Pack)
  7443. {
  7444. UpdateInventoryItemPacket inventoryItemUpdate = (UpdateInventoryItemPacket) Pack;
  7445. #region Packet Session and User Check
  7446. if (m_checkPackets)
  7447. {
  7448. if (inventoryItemUpdate.AgentData.SessionID != SessionId ||
  7449. inventoryItemUpdate.AgentData.AgentID != AgentId)
  7450. return true;
  7451. }
  7452. #endregion
  7453. if (OnUpdateInventoryItem != null)
  7454. {
  7455. foreach (UpdateInventoryItemPacket.InventoryDataBlock t in inventoryItemUpdate.InventoryData)
  7456. {
  7457. UpdateInventoryItem handlerUpdateInventoryItem = OnUpdateInventoryItem;
  7458. if (handlerUpdateInventoryItem == null) continue;
  7459. InventoryItemBase itemUpd = new InventoryItemBase
  7460. {
  7461. ID = t.ItemID,
  7462. Name =
  7463. Util.FieldToString(
  7464. t.Name),
  7465. Description =
  7466. Util.FieldToString(
  7467. t.Description),
  7468. GroupID = t.GroupID,
  7469. GroupOwned = t.GroupOwned,
  7470. GroupPermissions =
  7471. t.GroupMask,
  7472. NextPermissions =
  7473. t.NextOwnerMask,
  7474. EveryOnePermissions =
  7475. t.EveryoneMask,
  7476. CreationDate =
  7477. t.CreationDate,
  7478. Folder = t.FolderID,
  7479. InvType = t.InvType,
  7480. SalePrice = t.SalePrice,
  7481. SaleType = t.SaleType,
  7482. Flags = t.Flags
  7483. };
  7484. OnUpdateInventoryItem(this, t.TransactionID,
  7485. t.ItemID,
  7486. itemUpd);
  7487. }
  7488. }
  7489. return true;
  7490. }
  7491. private bool HandleCopyInventoryItem(IClientAPI sender, Packet Pack)
  7492. {
  7493. CopyInventoryItemPacket copyitem = (CopyInventoryItemPacket) Pack;
  7494. #region Packet Session and User Check
  7495. if (m_checkPackets)
  7496. {
  7497. if (copyitem.AgentData.SessionID != SessionId ||
  7498. copyitem.AgentData.AgentID != AgentId)
  7499. return true;
  7500. }
  7501. #endregion
  7502. if (OnCopyInventoryItem != null)
  7503. {
  7504. foreach (CopyInventoryItemPacket.InventoryDataBlock datablock in copyitem.InventoryData)
  7505. {
  7506. CopyInventoryItem handlerCopyInventoryItem = OnCopyInventoryItem;
  7507. if (handlerCopyInventoryItem != null)
  7508. {
  7509. handlerCopyInventoryItem(this, datablock.CallbackID, datablock.OldAgentID,
  7510. datablock.OldItemID, datablock.NewFolderID,
  7511. Util.FieldToString(datablock.NewName));
  7512. }
  7513. }
  7514. }
  7515. return true;
  7516. }
  7517. private bool HandleMoveInventoryItem(IClientAPI sender, Packet Pack)
  7518. {
  7519. MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket) Pack;
  7520. #region Packet Session and User Check
  7521. if (m_checkPackets)
  7522. {
  7523. if (moveitem.AgentData.SessionID != SessionId ||
  7524. moveitem.AgentData.AgentID != AgentId)
  7525. return true;
  7526. }
  7527. #endregion
  7528. if (OnMoveInventoryItem != null)
  7529. {
  7530. MoveInventoryItem handlerMoveInventoryItem = null;
  7531. List<InventoryItemBase> items =
  7532. moveitem.InventoryData.Select(
  7533. datablock =>
  7534. new InventoryItemBase(datablock.ItemID, AgentId)
  7535. {
  7536. Folder = datablock.FolderID,
  7537. Name = Util.FieldToString(datablock.NewName)
  7538. })
  7539. .ToList();
  7540. handlerMoveInventoryItem = OnMoveInventoryItem;
  7541. if (handlerMoveInventoryItem != null)
  7542. {
  7543. handlerMoveInventoryItem(this, items);
  7544. }
  7545. }
  7546. return true;
  7547. }
  7548. private bool HandleChangeInventoryItemFlags(IClientAPI sender, Packet Pack)
  7549. {
  7550. ChangeInventoryItemFlagsPacket inventoryItemUpdate = (ChangeInventoryItemFlagsPacket) Pack;
  7551. #region Packet Session and User Check
  7552. if (m_checkPackets)
  7553. {
  7554. if (inventoryItemUpdate.AgentData.SessionID != SessionId ||
  7555. inventoryItemUpdate.AgentData.AgentID != AgentId)
  7556. return true;
  7557. }
  7558. #endregion
  7559. if (OnChangeInventoryItemFlags != null)
  7560. {
  7561. foreach (
  7562. ChangeInventoryItemFlagsPacket.InventoryDataBlock t in from t in inventoryItemUpdate.InventoryData
  7563. let handlerUpdateInventoryItem =
  7564. OnChangeInventoryItemFlags
  7565. where handlerUpdateInventoryItem != null
  7566. select t)
  7567. {
  7568. OnChangeInventoryItemFlags(this,
  7569. t.ItemID,
  7570. t.Flags);
  7571. }
  7572. }
  7573. return true;
  7574. }
  7575. private bool HandleRemoveInventoryItem(IClientAPI sender, Packet Pack)
  7576. {
  7577. RemoveInventoryItemPacket removeItem = (RemoveInventoryItemPacket) Pack;
  7578. #region Packet Session and User Check
  7579. if (m_checkPackets)
  7580. {
  7581. if (removeItem.AgentData.SessionID != SessionId ||
  7582. removeItem.AgentData.AgentID != AgentId)
  7583. return true;
  7584. }
  7585. #endregion
  7586. if (OnRemoveInventoryItem != null)
  7587. {
  7588. RemoveInventoryItem handlerRemoveInventoryItem = null;
  7589. List<UUID> uuids = removeItem.InventoryData.Select(datablock => datablock.ItemID).ToList();
  7590. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  7591. if (handlerRemoveInventoryItem != null)
  7592. {
  7593. handlerRemoveInventoryItem(this, uuids);
  7594. }
  7595. }
  7596. return true;
  7597. }
  7598. private bool HandleRemoveInventoryFolder(IClientAPI sender, Packet Pack)
  7599. {
  7600. RemoveInventoryFolderPacket removeFolder = (RemoveInventoryFolderPacket) Pack;
  7601. #region Packet Session and User Check
  7602. if (m_checkPackets)
  7603. {
  7604. if (removeFolder.AgentData.SessionID != SessionId ||
  7605. removeFolder.AgentData.AgentID != AgentId)
  7606. return true;
  7607. }
  7608. #endregion
  7609. if (OnRemoveInventoryFolder != null)
  7610. {
  7611. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  7612. List<UUID> uuids = removeFolder.FolderData.Select(datablock => datablock.FolderID).ToList();
  7613. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  7614. if (handlerRemoveInventoryFolder != null)
  7615. {
  7616. handlerRemoveInventoryFolder(this, uuids);
  7617. }
  7618. }
  7619. return true;
  7620. }
  7621. private bool HandleRemoveInventoryObjects(IClientAPI sender, Packet Pack)
  7622. {
  7623. RemoveInventoryObjectsPacket removeObject = (RemoveInventoryObjectsPacket) Pack;
  7624. #region Packet Session and User Check
  7625. if (m_checkPackets)
  7626. {
  7627. if (removeObject.AgentData.SessionID != SessionId ||
  7628. removeObject.AgentData.AgentID != AgentId)
  7629. return true;
  7630. }
  7631. #endregion
  7632. if (OnRemoveInventoryFolder != null)
  7633. {
  7634. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  7635. List<UUID> uuids = removeObject.FolderData.Select(datablock => datablock.FolderID).ToList();
  7636. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  7637. if (handlerRemoveInventoryFolder != null)
  7638. {
  7639. handlerRemoveInventoryFolder(this, uuids);
  7640. }
  7641. }
  7642. if (OnRemoveInventoryItem != null)
  7643. {
  7644. RemoveInventoryItem handlerRemoveInventoryItem = null;
  7645. List<UUID> uuids = removeObject.ItemData.Select(datablock => datablock.ItemID).ToList();
  7646. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  7647. if (handlerRemoveInventoryItem != null)
  7648. {
  7649. handlerRemoveInventoryItem(this, uuids);
  7650. }
  7651. }
  7652. return true;
  7653. }
  7654. private bool HandleRequestTaskInventory(IClientAPI sender, Packet Pack)
  7655. {
  7656. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket) Pack;
  7657. #region Packet Session and User Check
  7658. if (m_checkPackets)
  7659. {
  7660. if (requesttask.AgentData.SessionID != SessionId ||
  7661. requesttask.AgentData.AgentID != AgentId)
  7662. return true;
  7663. }
  7664. #endregion
  7665. RequestTaskInventory handlerRequestTaskInventory = OnRequestTaskInventory;
  7666. if (handlerRequestTaskInventory != null)
  7667. {
  7668. handlerRequestTaskInventory(this, requesttask.InventoryData.LocalID);
  7669. }
  7670. return true;
  7671. }
  7672. private bool HandleUpdateTaskInventory(IClientAPI sender, Packet Pack)
  7673. {
  7674. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket) Pack;
  7675. #region Packet Session and User Check
  7676. if (m_checkPackets)
  7677. {
  7678. if (updatetask.AgentData.SessionID != SessionId ||
  7679. updatetask.AgentData.AgentID != AgentId)
  7680. return true;
  7681. }
  7682. #endregion
  7683. if (OnUpdateTaskInventory != null)
  7684. {
  7685. if (updatetask.UpdateData.Key == 0)
  7686. {
  7687. UpdateTaskInventory handlerUpdateTaskInventory = OnUpdateTaskInventory;
  7688. if (handlerUpdateTaskInventory != null)
  7689. {
  7690. TaskInventoryItem newTaskItem = new TaskInventoryItem
  7691. {
  7692. ItemID = updatetask.InventoryData.ItemID,
  7693. ParentID = updatetask.InventoryData.FolderID,
  7694. CreatorID = updatetask.InventoryData.CreatorID,
  7695. OwnerID = updatetask.InventoryData.OwnerID,
  7696. GroupID = updatetask.InventoryData.GroupID,
  7697. BasePermissions = updatetask.InventoryData.BaseMask,
  7698. CurrentPermissions = updatetask.InventoryData.OwnerMask,
  7699. GroupPermissions = updatetask.InventoryData.GroupMask,
  7700. EveryonePermissions =
  7701. updatetask.InventoryData.EveryoneMask,
  7702. NextPermissions = updatetask.InventoryData.NextOwnerMask,
  7703. Type = updatetask.InventoryData.Type,
  7704. InvType = updatetask.InventoryData.InvType,
  7705. Flags = updatetask.InventoryData.Flags,
  7706. SaleType = updatetask.InventoryData.SaleType,
  7707. SalePrice = updatetask.InventoryData.SalePrice,
  7708. Name = Util.FieldToString(updatetask.InventoryData.Name),
  7709. Description =
  7710. Util.FieldToString(
  7711. updatetask.InventoryData.Description),
  7712. CreationDate =
  7713. (uint) updatetask.InventoryData.CreationDate
  7714. };
  7715. // Unused? Clicking share with group sets GroupPermissions instead, so perhaps this is something
  7716. // different
  7717. //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
  7718. handlerUpdateTaskInventory(this, updatetask.InventoryData.TransactionID,
  7719. newTaskItem, updatetask.UpdateData.LocalID);
  7720. }
  7721. }
  7722. }
  7723. return true;
  7724. }
  7725. private bool HandleRemoveTaskInventory(IClientAPI sender, Packet Pack)
  7726. {
  7727. RemoveTaskInventoryPacket removeTask = (RemoveTaskInventoryPacket) Pack;
  7728. #region Packet Session and User Check
  7729. if (m_checkPackets)
  7730. {
  7731. if (removeTask.AgentData.SessionID != SessionId ||
  7732. removeTask.AgentData.AgentID != AgentId)
  7733. return true;
  7734. }
  7735. #endregion
  7736. RemoveTaskInventory handlerRemoveTaskItem = OnRemoveTaskItem;
  7737. if (handlerRemoveTaskItem != null)
  7738. {
  7739. handlerRemoveTaskItem(this, removeTask.InventoryData.ItemID, removeTask.InventoryData.LocalID);
  7740. }
  7741. return true;
  7742. }
  7743. private bool HandleMoveTaskInventory(IClientAPI sender, Packet Pack)
  7744. {
  7745. MoveTaskInventoryPacket moveTaskInventoryPacket = (MoveTaskInventoryPacket) Pack;
  7746. #region Packet Session and User Check
  7747. if (m_checkPackets)
  7748. {
  7749. if (moveTaskInventoryPacket.AgentData.SessionID != SessionId ||
  7750. moveTaskInventoryPacket.AgentData.AgentID != AgentId)
  7751. return true;
  7752. }
  7753. #endregion
  7754. MoveTaskInventory handlerMoveTaskItem = OnMoveTaskItem;
  7755. if (handlerMoveTaskItem != null)
  7756. {
  7757. handlerMoveTaskItem(
  7758. this, moveTaskInventoryPacket.AgentData.FolderID,
  7759. moveTaskInventoryPacket.InventoryData.LocalID,
  7760. moveTaskInventoryPacket.InventoryData.ItemID);
  7761. }
  7762. return true;
  7763. }
  7764. private bool HandleRezScript(IClientAPI sender, Packet Pack)
  7765. {
  7766. //MainConsole.Instance.Debug(Pack.ToString());
  7767. RezScriptPacket rezScriptx = (RezScriptPacket) Pack;
  7768. #region Packet Session and User Check
  7769. if (m_checkPackets)
  7770. {
  7771. if (rezScriptx.AgentData.SessionID != SessionId ||
  7772. rezScriptx.AgentData.AgentID != AgentId)
  7773. return true;
  7774. }
  7775. #endregion
  7776. RezScript handlerRezScript = OnRezScript;
  7777. InventoryItemBase item = new InventoryItemBase
  7778. {
  7779. ID = rezScriptx.InventoryBlock.ItemID,
  7780. Folder = rezScriptx.InventoryBlock.FolderID,
  7781. CreatorId = rezScriptx.InventoryBlock.CreatorID.ToString(),
  7782. Owner = rezScriptx.InventoryBlock.OwnerID,
  7783. BasePermissions = rezScriptx.InventoryBlock.BaseMask,
  7784. CurrentPermissions = rezScriptx.InventoryBlock.OwnerMask,
  7785. EveryOnePermissions = rezScriptx.InventoryBlock.EveryoneMask,
  7786. NextPermissions = rezScriptx.InventoryBlock.NextOwnerMask,
  7787. GroupPermissions = rezScriptx.InventoryBlock.GroupMask,
  7788. GroupOwned = rezScriptx.InventoryBlock.GroupOwned,
  7789. GroupID = rezScriptx.InventoryBlock.GroupID,
  7790. AssetType = rezScriptx.InventoryBlock.Type,
  7791. InvType = rezScriptx.InventoryBlock.InvType,
  7792. Flags = rezScriptx.InventoryBlock.Flags,
  7793. SaleType = rezScriptx.InventoryBlock.SaleType,
  7794. SalePrice = rezScriptx.InventoryBlock.SalePrice,
  7795. Name = Util.FieldToString(rezScriptx.InventoryBlock.Name),
  7796. Description = Util.FieldToString(rezScriptx.InventoryBlock.Description),
  7797. CreationDate = rezScriptx.InventoryBlock.CreationDate
  7798. };
  7799. if (handlerRezScript != null)
  7800. {
  7801. handlerRezScript(this, item, rezScriptx.InventoryBlock.TransactionID,
  7802. rezScriptx.UpdateBlock.ObjectLocalID);
  7803. }
  7804. return true;
  7805. }
  7806. private bool HandleMapLayerRequest(IClientAPI sender, Packet Pack)
  7807. {
  7808. #region Packet Session and User Check
  7809. if (m_checkPackets)
  7810. {
  7811. MapLayerRequestPacket mapLayerRequestPacket = Pack as MapLayerRequestPacket;
  7812. if (mapLayerRequestPacket != null && (mapLayerRequestPacket.AgentData.SessionID != SessionId ||
  7813. mapLayerRequestPacket.AgentData.AgentID != AgentId))
  7814. return true;
  7815. }
  7816. #endregion
  7817. return true;
  7818. }
  7819. private bool HandleMapBlockRequest(IClientAPI sender, Packet Pack)
  7820. {
  7821. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket) Pack;
  7822. #region Packet Session and User Check
  7823. if (m_checkPackets)
  7824. {
  7825. if (MapRequest.AgentData.SessionID != SessionId ||
  7826. MapRequest.AgentData.AgentID != AgentId)
  7827. return true;
  7828. }
  7829. #endregion
  7830. RequestMapBlocks handlerRequestMapBlocks = OnRequestMapBlocks;
  7831. if (handlerRequestMapBlocks != null)
  7832. {
  7833. handlerRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY,
  7834. MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY,
  7835. MapRequest.AgentData.Flags);
  7836. }
  7837. return true;
  7838. }
  7839. private bool HandleMapNameRequest(IClientAPI sender, Packet Pack)
  7840. {
  7841. MapNameRequestPacket map = (MapNameRequestPacket) Pack;
  7842. #region Packet Session and User Check
  7843. if (m_checkPackets)
  7844. {
  7845. if (map.AgentData.SessionID != SessionId ||
  7846. map.AgentData.AgentID != AgentId)
  7847. return true;
  7848. }
  7849. #endregion
  7850. string mapName = Util.UTF8.GetString(map.NameData.Name, 0,
  7851. map.NameData.Name.Length - 1);
  7852. RequestMapName handlerMapNameRequest = OnMapNameRequest;
  7853. if (handlerMapNameRequest != null)
  7854. {
  7855. handlerMapNameRequest(this, mapName, map.AgentData.Flags);
  7856. }
  7857. return true;
  7858. }
  7859. private bool HandleTeleportLandmarkRequest(IClientAPI sender, Packet Pack)
  7860. {
  7861. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket) Pack;
  7862. #region Packet Session and User Check
  7863. if (m_checkPackets)
  7864. {
  7865. if (tpReq.Info.SessionID != SessionId ||
  7866. tpReq.Info.AgentID != AgentId)
  7867. return true;
  7868. }
  7869. #endregion
  7870. UUID lmid = tpReq.Info.LandmarkID;
  7871. AssetLandmark lm;
  7872. if (lmid != UUID.Zero)
  7873. {
  7874. m_assetService.Get(lmid.ToString(), null, (id, s, lma) =>
  7875. {
  7876. if (lma == null)
  7877. {
  7878. // Failed to find landmark
  7879. TeleportCancelPacket tpCancel =
  7880. (TeleportCancelPacket)
  7881. PacketPool.Instance.GetPacket(
  7882. PacketType.TeleportCancel);
  7883. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  7884. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  7885. OutPacket(tpCancel, ThrottleOutPacketType.Asset);
  7886. }
  7887. try
  7888. {
  7889. lm = new AssetLandmark(lma);
  7890. }
  7891. catch (NullReferenceException)
  7892. {
  7893. // asset not found generates null ref inside the assetlandmark constructor.
  7894. TeleportCancelPacket tpCancel =
  7895. (TeleportCancelPacket)
  7896. PacketPool.Instance.GetPacket(
  7897. PacketType.TeleportCancel);
  7898. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  7899. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  7900. OutPacket(tpCancel, ThrottleOutPacketType.Asset);
  7901. return;
  7902. }
  7903. TeleportLandmarkRequest handlerTeleportLandmarkRequest
  7904. = OnTeleportLandmarkRequest;
  7905. if (handlerTeleportLandmarkRequest != null)
  7906. {
  7907. handlerTeleportLandmarkRequest(this, lm.RegionID,
  7908. lm.Position);
  7909. }
  7910. else
  7911. {
  7912. //no event handler so cancel request
  7913. TeleportCancelPacket tpCancel =
  7914. (TeleportCancelPacket)
  7915. PacketPool.Instance.GetPacket(
  7916. PacketType.TeleportCancel);
  7917. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  7918. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  7919. OutPacket(tpCancel, ThrottleOutPacketType.Asset);
  7920. }
  7921. });
  7922. }
  7923. else
  7924. {
  7925. // Teleport home request
  7926. UUIDNameRequest handlerTeleportHomeRequest = OnTeleportHomeRequest;
  7927. if (handlerTeleportHomeRequest != null)
  7928. {
  7929. handlerTeleportHomeRequest(AgentId, this);
  7930. }
  7931. return true;
  7932. }
  7933. return true;
  7934. }
  7935. private bool HandleTeleportLocationRequest(IClientAPI sender, Packet Pack)
  7936. {
  7937. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket) Pack;
  7938. // MainConsole.Instance.Debug(tpLocReq.ToString());
  7939. #region Packet Session and User Check
  7940. if (m_checkPackets)
  7941. {
  7942. if (tpLocReq.AgentData.SessionID != SessionId ||
  7943. tpLocReq.AgentData.AgentID != AgentId)
  7944. return true;
  7945. }
  7946. #endregion
  7947. TeleportLocationRequest handlerTeleportLocationRequest = OnTeleportLocationRequest;
  7948. if (handlerTeleportLocationRequest != null)
  7949. {
  7950. handlerTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position,
  7951. tpLocReq.Info.LookAt, 16);
  7952. }
  7953. else
  7954. {
  7955. //no event handler so cancel request
  7956. TeleportCancelPacket tpCancel =
  7957. (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  7958. tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
  7959. tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
  7960. OutPacket(tpCancel, ThrottleOutPacketType.Asset);
  7961. }
  7962. return true;
  7963. }
  7964. #endregion Inventory/Asset/Other related packets
  7965. private bool HandleUUIDNameRequest(IClientAPI sender, Packet Pack)
  7966. {
  7967. UUIDNameRequestPacket incoming = (UUIDNameRequestPacket) Pack;
  7968. foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
  7969. {
  7970. UUIDNameRequest handlerNameRequest = OnNameFromUUIDRequest;
  7971. if (handlerNameRequest != null)
  7972. {
  7973. handlerNameRequest(UUIDBlock.ID, this);
  7974. }
  7975. }
  7976. return true;
  7977. }
  7978. #region Parcel related packets
  7979. private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
  7980. {
  7981. RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket) Pack;
  7982. RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
  7983. if (handlerRegionHandleRequest != null)
  7984. {
  7985. handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
  7986. }
  7987. return true;
  7988. }
  7989. private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
  7990. {
  7991. ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket) Pack;
  7992. #region Packet Session and User Check
  7993. if (m_checkPackets)
  7994. {
  7995. if (pirPack.AgentData.SessionID != SessionId ||
  7996. pirPack.AgentData.AgentID != AgentId)
  7997. return true;
  7998. }
  7999. #endregion
  8000. ParcelInfoRequest handlerParcelInfoRequest = OnParcelInfoRequest;
  8001. if (handlerParcelInfoRequest != null)
  8002. {
  8003. handlerParcelInfoRequest(this, pirPack.Data.ParcelID);
  8004. }
  8005. return true;
  8006. }
  8007. private bool HandleParcelAccessListRequest(IClientAPI sender, Packet Pack)
  8008. {
  8009. ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket) Pack;
  8010. #region Packet Session and User Check
  8011. if (m_checkPackets)
  8012. {
  8013. if (requestPacket.AgentData.SessionID != SessionId ||
  8014. requestPacket.AgentData.AgentID != AgentId)
  8015. return true;
  8016. }
  8017. #endregion
  8018. ParcelAccessListRequest handlerParcelAccessListRequest = OnParcelAccessListRequest;
  8019. if (handlerParcelAccessListRequest != null)
  8020. {
  8021. handlerParcelAccessListRequest(requestPacket.AgentData.AgentID, requestPacket.AgentData.SessionID,
  8022. requestPacket.Data.Flags, requestPacket.Data.SequenceID,
  8023. requestPacket.Data.LocalID, this);
  8024. }
  8025. return true;
  8026. }
  8027. private bool HandleParcelAccessListUpdate(IClientAPI sender, Packet Pack)
  8028. {
  8029. ParcelAccessListUpdatePacket updatePacket = (ParcelAccessListUpdatePacket) Pack;
  8030. #region Packet Session and User Check
  8031. if (m_checkPackets)
  8032. {
  8033. if (updatePacket.AgentData.SessionID != SessionId ||
  8034. updatePacket.AgentData.AgentID != AgentId)
  8035. return true;
  8036. }
  8037. #endregion
  8038. List<ParcelManager.ParcelAccessEntry> entries =
  8039. updatePacket.List.Select(block => new ParcelManager.ParcelAccessEntry
  8040. {
  8041. AgentID = block.ID,
  8042. Flags = (AccessList) block.Flags,
  8043. Time = new DateTime()
  8044. }).ToList();
  8045. ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest;
  8046. if (handlerParcelAccessListUpdateRequest != null)
  8047. {
  8048. handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
  8049. updatePacket.AgentData.SessionID, updatePacket.Data.Flags,
  8050. updatePacket.Data.LocalID, entries, this);
  8051. }
  8052. return true;
  8053. }
  8054. private bool HandleParcelPropertiesRequest(IClientAPI sender, Packet Pack)
  8055. {
  8056. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket) Pack;
  8057. #region Packet Session and User Check
  8058. if (m_checkPackets)
  8059. {
  8060. if (propertiesRequest.AgentData.SessionID != SessionId ||
  8061. propertiesRequest.AgentData.AgentID != AgentId)
  8062. return true;
  8063. }
  8064. #endregion
  8065. ParcelPropertiesRequest handlerParcelPropertiesRequest = OnParcelPropertiesRequest;
  8066. if (handlerParcelPropertiesRequest != null)
  8067. {
  8068. handlerParcelPropertiesRequest((int) Math.Round(propertiesRequest.ParcelData.West),
  8069. (int) Math.Round(propertiesRequest.ParcelData.South),
  8070. (int) Math.Round(propertiesRequest.ParcelData.East),
  8071. (int) Math.Round(propertiesRequest.ParcelData.North),
  8072. propertiesRequest.ParcelData.SequenceID,
  8073. propertiesRequest.ParcelData.SnapSelection, this);
  8074. }
  8075. return true;
  8076. }
  8077. private bool HandleParcelDivide(IClientAPI sender, Packet Pack)
  8078. {
  8079. ParcelDividePacket landDivide = (ParcelDividePacket) Pack;
  8080. #region Packet Session and User Check
  8081. if (m_checkPackets)
  8082. {
  8083. if (landDivide.AgentData.SessionID != SessionId ||
  8084. landDivide.AgentData.AgentID != AgentId)
  8085. return true;
  8086. }
  8087. #endregion
  8088. ParcelDivideRequest handlerParcelDivideRequest = OnParcelDivideRequest;
  8089. if (handlerParcelDivideRequest != null)
  8090. {
  8091. handlerParcelDivideRequest((int) Math.Round(landDivide.ParcelData.West),
  8092. (int) Math.Round(landDivide.ParcelData.South),
  8093. (int) Math.Round(landDivide.ParcelData.East),
  8094. (int) Math.Round(landDivide.ParcelData.North), this);
  8095. }
  8096. return true;
  8097. }
  8098. private bool HandleParcelJoin(IClientAPI sender, Packet Pack)
  8099. {
  8100. ParcelJoinPacket landJoin = (ParcelJoinPacket) Pack;
  8101. #region Packet Session and User Check
  8102. if (m_checkPackets)
  8103. {
  8104. if (landJoin.AgentData.SessionID != SessionId ||
  8105. landJoin.AgentData.AgentID != AgentId)
  8106. return true;
  8107. }
  8108. #endregion
  8109. ParcelJoinRequest handlerParcelJoinRequest = OnParcelJoinRequest;
  8110. if (handlerParcelJoinRequest != null)
  8111. {
  8112. handlerParcelJoinRequest((int) Math.Round(landJoin.ParcelData.West),
  8113. (int) Math.Round(landJoin.ParcelData.South),
  8114. (int) Math.Round(landJoin.ParcelData.East),
  8115. (int) Math.Round(landJoin.ParcelData.North), this);
  8116. }
  8117. return true;
  8118. }
  8119. private bool HandleParcelPropertiesUpdate(IClientAPI sender, Packet Pack)
  8120. {
  8121. ParcelPropertiesUpdatePacket parcelPropertiesPacket = (ParcelPropertiesUpdatePacket) Pack;
  8122. #region Packet Session and User Check
  8123. if (m_checkPackets)
  8124. {
  8125. if (parcelPropertiesPacket.AgentData.SessionID != SessionId ||
  8126. parcelPropertiesPacket.AgentData.AgentID != AgentId)
  8127. return true;
  8128. }
  8129. #endregion
  8130. ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  8131. if (handlerParcelPropertiesUpdateRequest != null)
  8132. {
  8133. LandUpdateArgs args = new LandUpdateArgs
  8134. {
  8135. AuthBuyerID = parcelPropertiesPacket.ParcelData.AuthBuyerID,
  8136. Category = (ParcelCategory) parcelPropertiesPacket.ParcelData.Category,
  8137. Desc = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Desc),
  8138. GroupID = parcelPropertiesPacket.ParcelData.GroupID,
  8139. LandingType = parcelPropertiesPacket.ParcelData.LandingType,
  8140. MediaAutoScale = parcelPropertiesPacket.ParcelData.MediaAutoScale,
  8141. MediaID = parcelPropertiesPacket.ParcelData.MediaID,
  8142. MediaURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MediaURL),
  8143. MusicURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MusicURL),
  8144. Name = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Name),
  8145. ParcelFlags = parcelPropertiesPacket.ParcelData.ParcelFlags,
  8146. PassHours = parcelPropertiesPacket.ParcelData.PassHours,
  8147. PassPrice = parcelPropertiesPacket.ParcelData.PassPrice,
  8148. SalePrice = parcelPropertiesPacket.ParcelData.SalePrice,
  8149. SnapshotID = parcelPropertiesPacket.ParcelData.SnapshotID,
  8150. UserLocation = parcelPropertiesPacket.ParcelData.UserLocation,
  8151. UserLookAt = parcelPropertiesPacket.ParcelData.UserLookAt
  8152. };
  8153. handlerParcelPropertiesUpdateRequest(args, parcelPropertiesPacket.ParcelData.LocalID, this);
  8154. }
  8155. return true;
  8156. }
  8157. public void FireUpdateParcel(LandUpdateArgs args, int LocalID)
  8158. {
  8159. ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  8160. if (handlerParcelPropertiesUpdateRequest != null)
  8161. {
  8162. handlerParcelPropertiesUpdateRequest(args, LocalID, this);
  8163. }
  8164. }
  8165. private bool HandleParcelSelectObjects(IClientAPI sender, Packet Pack)
  8166. {
  8167. ParcelSelectObjectsPacket selectPacket = (ParcelSelectObjectsPacket) Pack;
  8168. #region Packet Session and User Check
  8169. if (m_checkPackets)
  8170. {
  8171. if (selectPacket.AgentData.SessionID != SessionId ||
  8172. selectPacket.AgentData.AgentID != AgentId)
  8173. return true;
  8174. }
  8175. #endregion
  8176. List<UUID> returnIDs = selectPacket.ReturnIDs.Select(rb => rb.ReturnID).ToList();
  8177. ParcelSelectObjects handlerParcelSelectObjects = OnParcelSelectObjects;
  8178. if (handlerParcelSelectObjects != null)
  8179. {
  8180. handlerParcelSelectObjects(selectPacket.ParcelData.LocalID,
  8181. Convert.ToInt32(selectPacket.ParcelData.ReturnType), returnIDs, this);
  8182. }
  8183. return true;
  8184. }
  8185. private bool HandleParcelObjectOwnersRequest(IClientAPI sender, Packet Pack)
  8186. {
  8187. ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket) Pack;
  8188. #region Packet Session and User Check
  8189. if (m_checkPackets)
  8190. {
  8191. if (reqPacket.AgentData.SessionID != SessionId ||
  8192. reqPacket.AgentData.AgentID != AgentId)
  8193. return true;
  8194. }
  8195. #endregion
  8196. ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest;
  8197. if (handlerParcelObjectOwnerRequest != null)
  8198. {
  8199. handlerParcelObjectOwnerRequest(reqPacket.ParcelData.LocalID, this);
  8200. }
  8201. return true;
  8202. }
  8203. private bool HandleParcelGodForceOwner(IClientAPI sender, Packet Pack)
  8204. {
  8205. ParcelGodForceOwnerPacket godForceOwnerPacket = (ParcelGodForceOwnerPacket) Pack;
  8206. #region Packet Session and User Check
  8207. if (m_checkPackets)
  8208. {
  8209. if (godForceOwnerPacket.AgentData.SessionID != SessionId ||
  8210. godForceOwnerPacket.AgentData.AgentID != AgentId)
  8211. return true;
  8212. }
  8213. #endregion
  8214. ParcelGodForceOwner handlerParcelGodForceOwner = OnParcelGodForceOwner;
  8215. if (handlerParcelGodForceOwner != null)
  8216. {
  8217. handlerParcelGodForceOwner(godForceOwnerPacket.Data.LocalID, godForceOwnerPacket.Data.OwnerID, this);
  8218. }
  8219. return true;
  8220. }
  8221. private bool HandleParcelRelease(IClientAPI sender, Packet Pack)
  8222. {
  8223. ParcelReleasePacket releasePacket = (ParcelReleasePacket) Pack;
  8224. #region Packet Session and User Check
  8225. if (m_checkPackets)
  8226. {
  8227. if (releasePacket.AgentData.SessionID != SessionId ||
  8228. releasePacket.AgentData.AgentID != AgentId)
  8229. return true;
  8230. }
  8231. #endregion
  8232. ParcelAbandonRequest handlerParcelAbandonRequest = OnParcelAbandonRequest;
  8233. if (handlerParcelAbandonRequest != null)
  8234. {
  8235. handlerParcelAbandonRequest(releasePacket.Data.LocalID, this);
  8236. }
  8237. return true;
  8238. }
  8239. private bool HandleParcelReclaim(IClientAPI sender, Packet Pack)
  8240. {
  8241. ParcelReclaimPacket reclaimPacket = (ParcelReclaimPacket) Pack;
  8242. #region Packet Session and User Check
  8243. if (m_checkPackets)
  8244. {
  8245. if (reclaimPacket.AgentData.SessionID != SessionId ||
  8246. reclaimPacket.AgentData.AgentID != AgentId)
  8247. return true;
  8248. }
  8249. #endregion
  8250. ParcelReclaim handlerParcelReclaim = OnParcelReclaim;
  8251. if (handlerParcelReclaim != null)
  8252. {
  8253. handlerParcelReclaim(reclaimPacket.Data.LocalID, this);
  8254. }
  8255. return true;
  8256. }
  8257. private bool HandleParcelReturnObjects(IClientAPI sender, Packet Pack)
  8258. {
  8259. ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket) Pack;
  8260. #region Packet Session and User Check
  8261. if (m_checkPackets)
  8262. {
  8263. if (parcelReturnObjects.AgentData.SessionID != SessionId ||
  8264. parcelReturnObjects.AgentData.AgentID != AgentId)
  8265. return true;
  8266. }
  8267. #endregion
  8268. UUID[] puserselectedOwnerIDs = new UUID[parcelReturnObjects.OwnerIDs.Length];
  8269. for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++)
  8270. puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID;
  8271. UUID[] puserselectedTaskIDs = new UUID[parcelReturnObjects.TaskIDs.Length];
  8272. for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++)
  8273. puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID;
  8274. ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest;
  8275. if (handlerParcelReturnObjectsRequest != null)
  8276. {
  8277. handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID,
  8278. parcelReturnObjects.ParcelData.ReturnType, puserselectedOwnerIDs,
  8279. puserselectedTaskIDs, this);
  8280. }
  8281. return true;
  8282. }
  8283. private bool HandleParcelSetOtherCleanTime(IClientAPI sender, Packet Pack)
  8284. {
  8285. ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket) Pack;
  8286. #region Packet Session and User Check
  8287. if (m_checkPackets)
  8288. {
  8289. if (parcelSetOtherCleanTimePacket.AgentData.SessionID != SessionId ||
  8290. parcelSetOtherCleanTimePacket.AgentData.AgentID != AgentId)
  8291. return true;
  8292. }
  8293. #endregion
  8294. ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
  8295. if (handlerParcelSetOtherCleanTime != null)
  8296. {
  8297. handlerParcelSetOtherCleanTime(this,
  8298. parcelSetOtherCleanTimePacket.ParcelData.LocalID,
  8299. parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
  8300. }
  8301. return true;
  8302. }
  8303. private bool HandleLandStatRequest(IClientAPI sender, Packet Pack)
  8304. {
  8305. LandStatRequestPacket lsrp = (LandStatRequestPacket) Pack;
  8306. #region Packet Session and User Check
  8307. if (m_checkPackets)
  8308. {
  8309. if (lsrp.AgentData.SessionID != SessionId ||
  8310. lsrp.AgentData.AgentID != AgentId)
  8311. return true;
  8312. }
  8313. #endregion
  8314. GodLandStatRequest handlerLandStatRequest = OnLandStatRequest;
  8315. if (handlerLandStatRequest != null)
  8316. {
  8317. handlerLandStatRequest(lsrp.RequestData.ParcelLocalID, lsrp.RequestData.ReportType,
  8318. lsrp.RequestData.RequestFlags, Utils.BytesToString(lsrp.RequestData.Filter), this);
  8319. }
  8320. return true;
  8321. }
  8322. private bool HandleParcelDwellRequest(IClientAPI sender, Packet Pack)
  8323. {
  8324. ParcelDwellRequestPacket dwellrq =
  8325. (ParcelDwellRequestPacket) Pack;
  8326. #region Packet Session and User Check
  8327. if (m_checkPackets)
  8328. {
  8329. if (dwellrq.AgentData.SessionID != SessionId ||
  8330. dwellrq.AgentData.AgentID != AgentId)
  8331. return true;
  8332. }
  8333. #endregion
  8334. ParcelDwellRequest handlerParcelDwellRequest = OnParcelDwellRequest;
  8335. if (handlerParcelDwellRequest != null)
  8336. {
  8337. handlerParcelDwellRequest(dwellrq.Data.LocalID, this);
  8338. }
  8339. return true;
  8340. }
  8341. #endregion Parcel related packets
  8342. #region Estate Packets
  8343. private bool HandleEstateOwnerMessage(IClientAPI sender, Packet Pack)
  8344. {
  8345. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket) Pack;
  8346. //MainConsole.Instance.Debug(messagePacket.ToString());
  8347. GodLandStatRequest handlerLandStatRequest;
  8348. #region Packet Session and User Check
  8349. if (m_checkPackets)
  8350. {
  8351. if (messagePacket.AgentData.SessionID != SessionId ||
  8352. messagePacket.AgentData.AgentID != AgentId)
  8353. return true;
  8354. }
  8355. #endregion
  8356. string method = Utils.BytesToString(messagePacket.MethodData.Method);
  8357. switch (method)
  8358. {
  8359. case "getinfo":
  8360. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8361. {
  8362. OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
  8363. }
  8364. return true;
  8365. case "setregioninfo":
  8366. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8367. {
  8368. OnSetEstateFlagsRequest(this, convertParamStringToBool(messagePacket.ParamList[0].Parameter),
  8369. convertParamStringToBool(messagePacket.ParamList[1].Parameter),
  8370. convertParamStringToBool(messagePacket.ParamList[2].Parameter),
  8371. convertParamStringToBool(messagePacket.ParamList[3].Parameter),
  8372. Convert.ToInt16(
  8373. Convert.ToDecimal(
  8374. Utils.BytesToString(messagePacket.ParamList[4].Parameter),
  8375. Culture.NumberFormatInfo)),
  8376. (float)
  8377. Convert.ToDecimal(
  8378. Utils.BytesToString(messagePacket.ParamList[5].Parameter),
  8379. Culture.NumberFormatInfo),
  8380. Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
  8381. convertParamStringToBool(messagePacket.ParamList[7].Parameter),
  8382. convertParamStringToBool(messagePacket.ParamList[8].Parameter));
  8383. }
  8384. return true;
  8385. // case "texturebase":
  8386. // if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  8387. // {
  8388. // foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  8389. // {
  8390. // string s = Utils.BytesToString(block.Parameter);
  8391. // string[] splitField = s.Split(' ');
  8392. // if (splitField.Length == 2)
  8393. // {
  8394. // UUID tempUUID = new UUID(splitField[1]);
  8395. // OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
  8396. // }
  8397. // }
  8398. // }
  8399. // break;
  8400. case "texturedetail":
  8401. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8402. {
  8403. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  8404. {
  8405. string s = Utils.BytesToString(block.Parameter);
  8406. string[] splitField = s.Split(' ');
  8407. if (splitField.Length == 2)
  8408. {
  8409. Int16 corner = Convert.ToInt16(splitField[0]);
  8410. UUID textureUUID = new UUID(splitField[1]);
  8411. OnSetEstateTerrainDetailTexture(this, corner, textureUUID);
  8412. }
  8413. }
  8414. }
  8415. return true;
  8416. case "textureheights":
  8417. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8418. {
  8419. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  8420. {
  8421. string s = Utils.BytesToString(block.Parameter);
  8422. string[] splitField = s.Split(' ');
  8423. if (splitField.Length == 3)
  8424. {
  8425. Int16 corner = Convert.ToInt16(splitField[0]);
  8426. float lowValue = (float) Convert.ToDecimal(splitField[1], Culture.NumberFormatInfo);
  8427. float highValue = (float) Convert.ToDecimal(splitField[2], Culture.NumberFormatInfo);
  8428. OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
  8429. }
  8430. }
  8431. }
  8432. return true;
  8433. case "texturecommit":
  8434. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8435. {
  8436. OnCommitEstateTerrainTextureRequest(this);
  8437. }
  8438. return true;
  8439. case "setregionterrain":
  8440. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8441. {
  8442. if (messagePacket.ParamList.Length != 9)
  8443. {
  8444. MainConsole.Instance.Error(
  8445. "EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
  8446. }
  8447. else
  8448. {
  8449. try
  8450. {
  8451. string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  8452. if (!tmp.Contains(".")) tmp += ".00";
  8453. float WaterHeight = (float) Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
  8454. tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  8455. if (!tmp.Contains(".")) tmp += ".00";
  8456. float TerrainRaiseLimit = (float) Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
  8457. tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
  8458. if (!tmp.Contains(".")) tmp += ".00";
  8459. float TerrainLowerLimit = (float) Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
  8460. bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
  8461. bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
  8462. float SunHour =
  8463. (float)
  8464. Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter),
  8465. Culture.NumberFormatInfo);
  8466. bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
  8467. bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
  8468. float EstateSunHour =
  8469. (float)
  8470. Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter),
  8471. Culture.NumberFormatInfo);
  8472. OnSetRegionTerrainSettings(AgentId, WaterHeight, TerrainRaiseLimit, TerrainLowerLimit,
  8473. UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun,
  8474. EstateSunHour);
  8475. }
  8476. catch (Exception ex)
  8477. {
  8478. MainConsole.Instance.Error(
  8479. "EstateOwnerMessage: Exception while setting terrain settings: \n" +
  8480. messagePacket + "\n" + ex);
  8481. }
  8482. }
  8483. }
  8484. return true;
  8485. case "restart":
  8486. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8487. {
  8488. // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
  8489. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  8490. {
  8491. float timeSeconds;
  8492. Utils.TryParseSingle(Utils.BytesToString(block.Parameter), out timeSeconds);
  8493. timeSeconds = (int) timeSeconds;
  8494. OnEstateRestartSimRequest(this, (int) timeSeconds);
  8495. }
  8496. }
  8497. return true;
  8498. case "estatechangecovenantid":
  8499. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8500. {
  8501. foreach (
  8502. UUID newCovenantID in
  8503. messagePacket.ParamList.Select(block => new UUID(Utils.BytesToString(block.Parameter))))
  8504. {
  8505. OnEstateChangeCovenantRequest(this, newCovenantID);
  8506. }
  8507. }
  8508. return true;
  8509. case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
  8510. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8511. {
  8512. int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  8513. OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType,
  8514. new UUID(
  8515. Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
  8516. }
  8517. return true;
  8518. case "simulatormessage":
  8519. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8520. {
  8521. UUID invoice = messagePacket.MethodData.Invoice;
  8522. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  8523. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  8524. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  8525. UUID sessionID = messagePacket.AgentData.SessionID;
  8526. OnSimulatorBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  8527. }
  8528. return true;
  8529. case "instantmessage":
  8530. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8531. {
  8532. UUID invoice = messagePacket.MethodData.Invoice;
  8533. UUID sessionID = messagePacket.AgentData.SessionID;
  8534. string Message = "";
  8535. string SenderName = "";
  8536. UUID SenderID = UUID.Zero;
  8537. if (messagePacket.ParamList.Length < 5)
  8538. {
  8539. SenderName = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  8540. Message = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  8541. SenderID = AgentId;
  8542. }
  8543. else
  8544. {
  8545. SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  8546. SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  8547. Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  8548. }
  8549. OnEstateBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  8550. }
  8551. return true;
  8552. case "setregiondebug":
  8553. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8554. {
  8555. UUID invoice = messagePacket.MethodData.Invoice;
  8556. UUID SenderID = messagePacket.AgentData.AgentID;
  8557. bool scripted = convertParamStringToBool(messagePacket.ParamList[0].Parameter);
  8558. bool collisionEvents = convertParamStringToBool(messagePacket.ParamList[1].Parameter);
  8559. bool physics = convertParamStringToBool(messagePacket.ParamList[2].Parameter);
  8560. OnEstateDebugRegionRequest(this, invoice, SenderID, scripted, collisionEvents, physics);
  8561. }
  8562. return true;
  8563. case "teleporthomeuser":
  8564. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8565. {
  8566. UUID invoice = messagePacket.MethodData.Invoice;
  8567. UUID SenderID = messagePacket.AgentData.AgentID;
  8568. UUID Prey;
  8569. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  8570. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey);
  8571. }
  8572. return true;
  8573. case "teleporthomeallusers":
  8574. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8575. {
  8576. UUID invoice = messagePacket.MethodData.Invoice;
  8577. UUID SenderID = messagePacket.AgentData.AgentID;
  8578. OnEstateTeleportAllUsersHomeRequest(this, invoice, SenderID);
  8579. }
  8580. return true;
  8581. case "colliders":
  8582. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8583. {
  8584. handlerLandStatRequest = OnLandStatRequest;
  8585. if (handlerLandStatRequest != null)
  8586. {
  8587. handlerLandStatRequest(0, 1, 0, "", this);
  8588. }
  8589. }
  8590. return true;
  8591. case "scripts":
  8592. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8593. {
  8594. handlerLandStatRequest = OnLandStatRequest;
  8595. if (handlerLandStatRequest != null)
  8596. {
  8597. handlerLandStatRequest(0, 0, 0, "", this);
  8598. }
  8599. }
  8600. return true;
  8601. case "terrain":
  8602. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8603. {
  8604. if (messagePacket.ParamList.Length > 0)
  8605. {
  8606. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "bake")
  8607. {
  8608. BakeTerrain handlerBakeTerrain = OnBakeTerrain;
  8609. if (handlerBakeTerrain != null)
  8610. {
  8611. handlerBakeTerrain(this);
  8612. }
  8613. }
  8614. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "download filename")
  8615. {
  8616. if (messagePacket.ParamList.Length > 1)
  8617. {
  8618. RequestTerrain handlerRequestTerrain = OnRequestTerrain;
  8619. if (handlerRequestTerrain != null)
  8620. {
  8621. handlerRequestTerrain(this,
  8622. Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  8623. }
  8624. }
  8625. }
  8626. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "upload filename")
  8627. {
  8628. if (messagePacket.ParamList.Length > 1)
  8629. {
  8630. RequestTerrain handlerUploadTerrain = OnUploadTerrain;
  8631. if (handlerUploadTerrain != null)
  8632. {
  8633. handlerUploadTerrain(this,
  8634. Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  8635. }
  8636. }
  8637. }
  8638. }
  8639. }
  8640. return true;
  8641. case "estatechangeinfo":
  8642. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8643. {
  8644. UUID invoice = messagePacket.MethodData.Invoice;
  8645. UUID SenderID = messagePacket.AgentData.AgentID;
  8646. UInt32 param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  8647. UInt32 param2 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  8648. EstateChangeInfo handlerEstateChangeInfo = OnEstateChangeInfo;
  8649. if (handlerEstateChangeInfo != null)
  8650. {
  8651. handlerEstateChangeInfo(this, invoice, SenderID, param1, param2);
  8652. }
  8653. }
  8654. return true;
  8655. case "refreshmapvisibility":
  8656. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8657. {
  8658. IMapImageGenerator mapModule = Scene.RequestModuleInterface<IMapImageGenerator>();
  8659. if (mapModule != null)
  8660. mapModule.CreateTerrainTexture(true);
  8661. }
  8662. return true;
  8663. case "kickestate":
  8664. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8665. {
  8666. UUID Prey;
  8667. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[0].Parameter), out Prey);
  8668. IClientAPI client;
  8669. m_scene.ClientManager.TryGetValue(Prey, out client);
  8670. if (client == null)
  8671. return true;
  8672. client.Kick("The Aurora Manager has kicked you");
  8673. IEntityTransferModule transferModule = Scene.RequestModuleInterface<IEntityTransferModule>();
  8674. if (transferModule != null)
  8675. transferModule.IncomingCloseAgent(Scene, Prey);
  8676. }
  8677. return true;
  8678. case "telehub":
  8679. if (m_scene.Permissions.CanIssueEstateCommand(AgentId, false))
  8680. {
  8681. List<string> Parameters =
  8682. messagePacket.ParamList.Select(block => Utils.BytesToString(block.Parameter)).ToList();
  8683. GodlikeMessage handlerEstateTelehubRequest = OnEstateTelehubRequest;
  8684. if (handlerEstateTelehubRequest != null)
  8685. {
  8686. handlerEstateTelehubRequest(this,
  8687. messagePacket.MethodData.Invoice,
  8688. Utils.BytesToString(messagePacket.MethodData.Method),
  8689. Parameters);
  8690. }
  8691. }
  8692. return true;
  8693. case "estateobjectreturn":
  8694. SimWideDeletesDelegate handlerSimWideDeletesRequest = OnSimWideDeletes;
  8695. if (handlerSimWideDeletesRequest != null)
  8696. {
  8697. UUID Prey;
  8698. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  8699. int flags = int.Parse(Utils.BytesToString(messagePacket.ParamList[0].Parameter));
  8700. handlerSimWideDeletesRequest(this, flags, Prey);
  8701. return true;
  8702. }
  8703. return true;
  8704. default:
  8705. MainConsole.Instance.WarnFormat(
  8706. "[LLCLIENTVIEW]: EstateOwnerMessage: Unknown method {0} requested for {1}",
  8707. method, Name);
  8708. for (int i = 0; i < messagePacket.ParamList.Length; i++)
  8709. {
  8710. EstateOwnerMessagePacket.ParamListBlock block = messagePacket.ParamList[i];
  8711. string data = (string) Utils.BytesToString(block.Parameter);
  8712. MainConsole.Instance.DebugFormat("[LLCLIENTVIEW]: Param {0}={1}", i, data);
  8713. }
  8714. return true;
  8715. }
  8716. }
  8717. private bool HandleRequestRegionInfo(IClientAPI sender, Packet Pack)
  8718. {
  8719. RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket) Pack).AgentData;
  8720. #region Packet Session and User Check
  8721. if (m_checkPackets)
  8722. {
  8723. if (mPacket.SessionID != SessionId ||
  8724. mPacket.AgentID != AgentId)
  8725. return true;
  8726. }
  8727. #endregion
  8728. RegionInfoRequest handlerRegionInfoRequest = OnRegionInfoRequest;
  8729. if (handlerRegionInfoRequest != null)
  8730. {
  8731. handlerRegionInfoRequest(this);
  8732. }
  8733. return true;
  8734. }
  8735. private bool HandleEstateCovenantRequest(IClientAPI sender, Packet Pack)
  8736. {
  8737. //EstateCovenantRequestPacket.AgentDataBlock epack =
  8738. // ((EstateCovenantRequestPacket)Pack).AgentData;
  8739. EstateCovenantRequest handlerEstateCovenantRequest = OnEstateCovenantRequest;
  8740. if (handlerEstateCovenantRequest != null)
  8741. {
  8742. handlerEstateCovenantRequest(this);
  8743. }
  8744. return true;
  8745. }
  8746. #endregion Estate Packets
  8747. #region GodPackets
  8748. private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack)
  8749. {
  8750. RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket) Pack;
  8751. RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
  8752. UUID token = rblock.Token;
  8753. #region Packet Session and User Check
  8754. if (m_checkPackets)
  8755. {
  8756. if (rglpPack.AgentData.SessionID != SessionId ||
  8757. rglpPack.AgentData.AgentID != AgentId)
  8758. return true;
  8759. }
  8760. #endregion
  8761. RequestGodlikePowersPacket.AgentDataBlock ablock = rglpPack.AgentData;
  8762. RequestGodlikePowers handlerReqGodlikePowers = OnRequestGodlikePowers;
  8763. if (handlerReqGodlikePowers != null)
  8764. {
  8765. handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this);
  8766. }
  8767. return true;
  8768. }
  8769. private bool HandleGodUpdateRegionInfoUpdate(IClientAPI client, Packet Packet)
  8770. {
  8771. GodUpdateRegionInfoPacket GodUpdateRegionInfo =
  8772. (GodUpdateRegionInfoPacket) Packet;
  8773. GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate;
  8774. #region Packet Session and User Check
  8775. if (m_checkPackets)
  8776. {
  8777. if (GodUpdateRegionInfo.AgentData.SessionID != SessionId ||
  8778. GodUpdateRegionInfo.AgentData.AgentID != AgentId)
  8779. return true;
  8780. }
  8781. #endregion
  8782. if (handlerGodUpdateRegionInfo != null)
  8783. {
  8784. handlerGodUpdateRegionInfo(this,
  8785. GodUpdateRegionInfo.RegionInfo.BillableFactor,
  8786. GodUpdateRegionInfo.RegionInfo.PricePerMeter,
  8787. GodUpdateRegionInfo.RegionInfo.EstateID,
  8788. GodUpdateRegionInfo.RegionInfo.RegionFlags,
  8789. GodUpdateRegionInfo.RegionInfo.SimName,
  8790. GodUpdateRegionInfo.RegionInfo.RedirectGridX,
  8791. GodUpdateRegionInfo.RegionInfo.RedirectGridY);
  8792. return true;
  8793. }
  8794. return false;
  8795. }
  8796. private bool HandleSimWideDeletes(IClientAPI client, Packet Packet)
  8797. {
  8798. SimWideDeletesPacket SimWideDeletesRequest =
  8799. (SimWideDeletesPacket) Packet;
  8800. #region Packet Session and User Check
  8801. if (m_checkPackets)
  8802. {
  8803. if (SimWideDeletesRequest.AgentData.SessionID != SessionId ||
  8804. SimWideDeletesRequest.AgentData.AgentID != AgentId)
  8805. return true;
  8806. }
  8807. #endregion
  8808. SimWideDeletesDelegate handlerSimWideDeletesRequest = OnSimWideDeletes;
  8809. if (handlerSimWideDeletesRequest != null)
  8810. {
  8811. handlerSimWideDeletesRequest(this, (int) SimWideDeletesRequest.DataBlock.Flags,
  8812. SimWideDeletesRequest.DataBlock.TargetID);
  8813. return true;
  8814. }
  8815. return false;
  8816. }
  8817. private bool HandleGodlikeMessage(IClientAPI client, Packet Packet)
  8818. {
  8819. GodlikeMessagePacket GodlikeMessage =
  8820. (GodlikeMessagePacket) Packet;
  8821. #region Packet Session and User Check
  8822. if (m_checkPackets)
  8823. {
  8824. if (GodlikeMessage.AgentData.SessionID != SessionId ||
  8825. GodlikeMessage.AgentData.AgentID != AgentId)
  8826. return true;
  8827. }
  8828. #endregion
  8829. GodlikeMessage handlerGodlikeMessage = OnGodlikeMessage;
  8830. List<string> Parameters =
  8831. GodlikeMessage.ParamList.Select(block => Utils.BytesToString(block.Parameter)).ToList();
  8832. if (handlerGodlikeMessage != null)
  8833. {
  8834. handlerGodlikeMessage(this,
  8835. GodlikeMessage.MethodData.Invoice,
  8836. Utils.BytesToString(GodlikeMessage.MethodData.Method),
  8837. Parameters);
  8838. return true;
  8839. }
  8840. return false;
  8841. }
  8842. private bool HandleSaveStatePacket(IClientAPI client, Packet Packet)
  8843. {
  8844. StateSavePacket SaveStateMessage =
  8845. (StateSavePacket) Packet;
  8846. #region Packet Session and User Check
  8847. if (m_checkPackets)
  8848. {
  8849. if (SaveStateMessage.AgentData.SessionID != SessionId ||
  8850. SaveStateMessage.AgentData.AgentID != AgentId)
  8851. return true;
  8852. }
  8853. #endregion
  8854. SaveStateHandler handlerSaveStatePacket = OnSaveState;
  8855. if (handlerSaveStatePacket != null)
  8856. {
  8857. handlerSaveStatePacket(this, SaveStateMessage.AgentData.AgentID);
  8858. return true;
  8859. }
  8860. return false;
  8861. }
  8862. private bool HandleGodKickUser(IClientAPI sender, Packet Pack)
  8863. {
  8864. GodKickUserPacket gkupack = (GodKickUserPacket) Pack;
  8865. if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID)
  8866. {
  8867. GodKickUser handlerGodKickUser = OnGodKickUser;
  8868. if (handlerGodKickUser != null)
  8869. {
  8870. handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID,
  8871. gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason);
  8872. }
  8873. }
  8874. else
  8875. {
  8876. SendAgentAlertMessage("Kick request denied", false);
  8877. }
  8878. return true;
  8879. }
  8880. #endregion GodPackets
  8881. #region Economy/Transaction Packets
  8882. private bool HandleMoneyBalanceRequest(IClientAPI sender, Packet Pack)
  8883. {
  8884. MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket) Pack;
  8885. #region Packet Session and User Check