2008-05-02 19:21:33 +00:00
/ *
* Copyright ( c ) Contributors , http : //opensimulator.org/
* See CONTRIBUTORS . TXT for a full list of copyright holders .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ` ` AS IS ' ' AND ANY
* EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
* ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
* LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* /
using System ;
using System.Collections.Generic ;
using System.Net ;
using System.Net.Sockets ;
using System.Reflection ;
using System.Text ;
using System.Threading ;
using System.Timers ;
2008-09-13 19:51:56 +00:00
using System.Xml ;
2008-09-06 07:52:41 +00:00
using OpenMetaverse ;
using OpenMetaverse.Packets ;
2008-05-02 19:21:33 +00:00
using log4net ;
using OpenSim.Framework ;
using OpenSim.Framework.Communications.Cache ;
2008-06-04 16:30:44 +00:00
using OpenSim.Framework.Statistics ;
2008-05-02 19:21:33 +00:00
using OpenSim.Region.ClientStack.LindenUDP ;
using OpenSim.Region.Environment.Scenes ;
2008-07-08 11:02:53 +00:00
using Timer = System . Timers . Timer ;
2008-05-02 19:21:33 +00:00
namespace OpenSim.Region.ClientStack.LindenUDP
{
public delegate bool PacketMethod ( IClientAPI simClient , Packet packet ) ;
2008-07-08 11:02:53 +00:00
2008-05-02 19:21:33 +00:00
/// <summary>
/// Handles new client connections
/// Constructor takes a single Packet and authenticates everything
/// </summary>
public class LLClientView : IClientAPI
{
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
// ~ClientView()
// {
2008-08-25 23:21:07 +00:00
// m_log.Info("[CLIENT]: LLClientView destructor called");
2008-05-02 19:21:33 +00:00
// }
/* static variables */
2008-05-16 01:22:11 +00:00
public static SynchronizeClientHandler SynchronizeClient = null ;
2008-05-02 19:21:33 +00:00
/* private variables */
2008-09-06 07:52:41 +00:00
private readonly UUID m_sessionId ;
private UUID m_secureSessionId = UUID . Zero ;
2008-05-02 19:21:33 +00:00
//private AgentAssetUpload UploadAssets;
private int m_debug = 0 ;
private readonly AssetCache m_assetCache ;
// private InventoryCache m_inventoryCache;
private int m_cachedTextureSerial = 0 ;
private Timer m_clientPingTimer ;
private bool m_clientBlocked = false ;
private int m_probesWithNoIngressPackets = 0 ;
2008-07-24 16:03:17 +00:00
//private int m_lastPacketsReceived = 0;
2008-08-09 21:24:27 +00:00
//private byte[] ZeroOutBuffer = new byte[4096];
2008-05-02 19:21:33 +00:00
2008-09-06 07:52:41 +00:00
private readonly UUID m_agentId ;
2008-05-02 19:21:33 +00:00
private readonly uint m_circuitCode ;
private int m_moneyBalance ;
2008-07-22 17:58:42 +00:00
private IPacketHandler m_PacketHandler ;
2008-05-28 08:40:22 +00:00
2008-05-02 19:21:33 +00:00
private int m_animationSequenceNumber = 1 ;
2008-09-25 14:57:40 +00:00
private byte [ ] m_channelVersion = Utils . StringToBytes ( "OpenSimulator Server" ) ; // Dummy value needed by libSL
2008-05-02 19:21:33 +00:00
2008-09-06 07:52:41 +00:00
private Dictionary < string , UUID > m_defaultAnimations = new Dictionary < string , UUID > ( ) ;
2008-05-11 21:27:12 +00:00
2008-08-25 07:35:17 +00:00
private bool m_SendLogoutPacketWhenClosing = true ;
2008-09-03 03:35:54 +00:00
private int m_inPacketsChecked = 0 ;
2008-05-02 19:21:33 +00:00
/* protected variables */
protected static Dictionary < PacketType , PacketMethod > PacketHandlers =
new Dictionary < PacketType , PacketMethod > ( ) ; //Global/static handlers for all clients
protected Dictionary < PacketType , PacketMethod > m_packetHandlers = new Dictionary < PacketType , PacketMethod > ( ) ;
protected IScene m_scene ;
protected AgentCircuitManager m_authenticateSessionsHandler ;
protected LLPacketServer m_networkServer ;
/* public variables */
protected string m_firstName ;
protected string m_lastName ;
protected Thread m_clientThread ;
2008-09-06 07:52:41 +00:00
protected Vector3 m_startpos ;
2008-05-02 19:21:33 +00:00
protected EndPoint m_userEndPoint ;
protected EndPoint m_proxyEndPoint ;
2008-09-06 07:52:41 +00:00
protected UUID m_activeGroupID = UUID . Zero ;
2008-05-17 00:16:16 +00:00
protected string m_activeGroupName = String . Empty ;
protected ulong m_activeGroupPowers = 0 ;
2008-09-09 01:26:48 +00:00
protected Dictionary < UUID , ulong > m_groupPowers = new Dictionary < UUID , ulong > ( ) ;
2008-05-02 19:21:33 +00:00
/* Instantiated Designated Event Delegates */
//- used so we don't create new objects for each incoming packet and then toss it out later */
2008-09-09 05:25:29 +00:00
private GenericMessage handlerGenericMessage = null ;
2008-05-02 19:21:33 +00:00
private RequestAvatarProperties handlerRequestAvatarProperties = null ; //OnRequestAvatarProperties;
private UpdateAvatarProperties handlerUpdateAvatarProperties = null ; // OnUpdateAvatarProperties;
2008-10-03 14:53:11 +00:00
private ChatMessage handlerChatFromClient = null ; //OnChatFromClient;
private ChatMessage handlerChatFromClient2 = null ; //OnChatFromClient;
2008-05-02 19:21:33 +00:00
private ImprovedInstantMessage handlerInstantMessage = null ; //OnInstantMessage;
private FriendActionDelegate handlerApproveFriendRequest = null ; //OnApproveFriendRequest;
private FriendshipTermination handlerTerminateFriendship = null ; //OnTerminateFriendship;
private RezObject handlerRezObject = null ; //OnRezObject;
private GenericCall4 handlerDeRezObject = null ; //OnDeRezObject;
private ModifyTerrain handlerModifyTerrain = null ;
2008-06-19 20:57:00 +00:00
private BakeTerrain handlerBakeTerrain = null ;
2008-07-18 02:40:47 +00:00
private EstateChangeInfo handlerEstateChangeInfo = null ;
2008-05-02 19:21:33 +00:00
private Action < IClientAPI > handlerRegionHandShakeReply = null ; //OnRegionHandShakeReply;
private GenericCall2 handlerRequestWearables = null ; //OnRequestWearables;
private Action < IClientAPI > handlerRequestAvatarsData = null ; //OnRequestAvatarsData;
private SetAppearance handlerSetAppearance = null ; //OnSetAppearance;
private AvatarNowWearing handlerAvatarNowWearing = null ; //OnAvatarNowWearing;
private RezSingleAttachmentFromInv handlerRezSingleAttachment = null ; //OnRezSingleAttachmentFromInv;
private UUIDNameRequest handlerDetachAttachmentIntoInv = null ; // Detach attachment!
private ObjectAttach handlerObjectAttach = null ; //OnObjectAttach;
private SetAlwaysRun handlerSetAlwaysRun = null ; //OnSetAlwaysRun;
private GenericCall2 handlerCompleteMovementToRegion = null ; //OnCompleteMovementToRegion;
private UpdateAgent handlerAgentUpdate = null ; //OnAgentUpdate;
private StartAnim handlerStartAnim = null ;
private StopAnim handlerStopAnim = null ;
private AgentRequestSit handlerAgentRequestSit = null ; //OnAgentRequestSit;
private AgentSit handlerAgentSit = null ; //OnAgentSit;
private AvatarPickerRequest handlerAvatarPickerRequest = null ; //OnAvatarPickerRequest;
private FetchInventory handlerAgentDataUpdateRequest = null ; //OnAgentDataUpdateRequest;
private FetchInventory handlerUserInfoRequest = null ; //OnUserInfoRequest;
private TeleportLocationRequest handlerSetStartLocationRequest = null ; //OnSetStartLocationRequest;
private TeleportLandmarkRequest handlerTeleportLandmarkRequest = null ; //OnTeleportLandmarkRequest;
private LinkObjects handlerLinkObjects = null ; //OnLinkObjects;
private DelinkObjects handlerDelinkObjects = null ; //OnDelinkObjects;
private AddNewPrim handlerAddPrim = null ; //OnAddPrim;
private UpdateShape handlerUpdatePrimShape = null ; //null;
private ObjectExtraParams handlerUpdateExtraParams = null ; //OnUpdateExtraParams;
private ObjectDuplicate handlerObjectDuplicate = null ;
private ObjectDuplicateOnRay handlerObjectDuplicateOnRay = null ;
private ObjectSelect handlerObjectSelect = null ;
private ObjectDeselect handlerObjectDeselect = null ;
private ObjectIncludeInSearch handlerObjectIncludeInSearch = null ;
private UpdatePrimFlags handlerUpdatePrimFlags = null ; //OnUpdatePrimFlags;
private UpdatePrimTexture handlerUpdatePrimTexture = null ;
private UpdateVector handlerGrabObject = null ; //OnGrabObject;
private MoveObject handlerGrabUpdate = null ; //OnGrabUpdate;
private ObjectSelect handlerDeGrabObject = null ; //OnDeGrabObject;
private GenericCall7 handlerObjectDescription = null ;
private GenericCall7 handlerObjectName = null ;
2008-09-12 20:42:04 +00:00
private GenericCall7 handlerObjectClickAction = null ;
2008-10-03 12:00:13 +00:00
private GenericCall7 handlerObjectMaterial = null ;
2008-05-02 19:21:33 +00:00
private ObjectPermissions handlerObjectPermissions = null ;
private RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily = null ; //OnRequestObjectPropertiesFamily;
private TextureRequest handlerTextureRequest = null ;
private UDPAssetUploadRequest handlerAssetUploadRequest = null ; //OnAssetUploadRequest;
private RequestXfer handlerRequestXfer = null ; //OnRequestXfer;
private XferReceive handlerXferReceive = null ; //OnXferReceive;
private ConfirmXfer handlerConfirmXfer = null ; //OnConfirmXfer;
private CreateInventoryFolder handlerCreateInventoryFolder = null ; //OnCreateNewInventoryFolder;
private UpdateInventoryFolder handlerUpdateInventoryFolder = null ;
private MoveInventoryFolder handlerMoveInventoryFolder = null ;
private CreateNewInventoryItem handlerCreateNewInventoryItem = null ; //OnCreateNewInventoryItem;
private FetchInventory handlerFetchInventory = null ;
private FetchInventoryDescendents handlerFetchInventoryDescendents = null ; //OnFetchInventoryDescendents;
private PurgeInventoryDescendents handlerPurgeInventoryDescendents = null ; //OnPurgeInventoryDescendents;
private UpdateInventoryItem handlerUpdateInventoryItem = null ;
private CopyInventoryItem handlerCopyInventoryItem = null ;
private MoveInventoryItem handlerMoveInventoryItem = null ;
private RemoveInventoryItem handlerRemoveInventoryItem = null ;
private RemoveInventoryFolder handlerRemoveInventoryFolder = null ;
private RequestTaskInventory handlerRequestTaskInventory = null ; //OnRequestTaskInventory;
private UpdateTaskInventory handlerUpdateTaskInventory = null ; //OnUpdateTaskInventory;
2008-05-16 01:22:11 +00:00
private MoveTaskInventory handlerMoveTaskItem = null ;
2008-05-02 19:21:33 +00:00
private RemoveTaskInventory handlerRemoveTaskItem = null ; //OnRemoveTaskItem;
private RezScript handlerRezScript = null ; //OnRezScript;
private RequestMapBlocks handlerRequestMapBlocks = null ; //OnRequestMapBlocks;
private RequestMapName handlerMapNameRequest = null ; //OnMapNameRequest;
private TeleportLocationRequest handlerTeleportLocationRequest = null ; //OnTeleportLocationRequest;
private MoneyBalanceRequest handlerMoneyBalanceRequest = null ; //OnMoneyBalanceRequest;
private UUIDNameRequest handlerNameRequest = null ;
private ParcelAccessListRequest handlerParcelAccessListRequest = null ; //OnParcelAccessListRequest;
private ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest = null ; //OnParcelAccessListUpdateRequest;
private ParcelPropertiesRequest handlerParcelPropertiesRequest = null ; //OnParcelPropertiesRequest;
private ParcelDivideRequest handlerParcelDivideRequest = null ; //OnParcelDivideRequest;
private ParcelJoinRequest handlerParcelJoinRequest = null ; //OnParcelJoinRequest;
private ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest = null ; //OnParcelPropertiesUpdateRequest;
private ParcelSelectObjects handlerParcelSelectObjects = null ; //OnParcelSelectObjects;
private ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest = null ; //OnParcelObjectOwnerRequest;
2008-05-13 16:22:57 +00:00
private ParcelAbandonRequest handlerParcelAbandonRequest = null ;
2008-06-26 13:45:36 +00:00
private ParcelReclaim handlerParcelReclaim = null ;
2008-05-24 11:10:21 +00:00
private ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest = null ;
2008-05-02 19:21:33 +00:00
private RegionInfoRequest handlerRegionInfoRequest = null ; //OnRegionInfoRequest;
private EstateCovenantRequest handlerEstateCovenantRequest = null ; //OnEstateCovenantRequest;
private RequestGodlikePowers handlerReqGodlikePowers = null ; //OnRequestGodlikePowers;
private GodKickUser handlerGodKickUser = null ; //OnGodKickUser;
private ViewerEffectEventHandler handlerViewerEffect = null ; //OnViewerEffect;
private Action < IClientAPI > handlerLogout = null ; //OnLogout;
private MoneyTransferRequest handlerMoneyTransferRequest = null ; //OnMoneyTransferRequest;
private ParcelBuy handlerParcelBuy = null ;
private EconomyDataRequest handlerEconomoyDataRequest = null ;
private UpdateVector handlerUpdatePrimSinglePosition = null ; //OnUpdatePrimSinglePosition;
private UpdatePrimSingleRotation handlerUpdatePrimSingleRotation = null ; //OnUpdatePrimSingleRotation;
private UpdateVector handlerUpdatePrimScale = null ; //OnUpdatePrimScale;
private UpdateVector handlerUpdatePrimGroupScale = null ; //OnUpdateGroupScale;
private UpdateVector handlerUpdateVector = null ; //OnUpdatePrimGroupPosition;
private UpdatePrimRotation handlerUpdatePrimRotation = null ; //OnUpdatePrimGroupRotation;
2008-06-27 23:03:39 +00:00
// private UpdatePrimGroupRotation handlerUpdatePrimGroupRotation = null; //OnUpdatePrimGroupMouseRotation;
// private RequestAsset handlerRequestAsset = null; // OnRequestAsset;
2008-05-02 19:21:33 +00:00
private UUIDNameRequest handlerTeleportHomeRequest = null ;
2008-08-16 19:20:14 +00:00
private RegionHandleRequest handlerRegionHandleRequest = null ; // OnRegionHandleRequest
private ParcelInfoRequest handlerParcelInfoRequest = null ; // OnParcelInfoRequest
2008-08-18 00:39:10 +00:00
2008-05-02 19:21:33 +00:00
private ScriptAnswer handlerScriptAnswer = null ;
private RequestPayPrice handlerRequestPayPrice = null ;
2008-08-24 00:51:21 +00:00
private ObjectSaleInfo handlerObjectSaleInfo = null ;
private ObjectBuy handlerObjectBuy = null ;
2008-08-25 21:35:22 +00:00
//private BuyObjectInventory handlerBuyObjectInventory = null;
2008-05-02 19:21:33 +00:00
private ObjectDeselect handlerObjectDetach = null ;
2008-10-04 01:09:22 +00:00
private ObjectDrop handlerObjectDrop = null ;
2008-05-02 19:21:33 +00:00
private AgentSit handlerOnUndo = null ;
2008-05-07 19:41:03 +00:00
private ForceReleaseControls handlerForceReleaseControls = null ;
2008-05-25 11:22:05 +00:00
private GodLandStatRequest handlerLandStatRequest = null ;
2008-05-18 03:21:22 +00:00
private UUIDNameRequest handlerUUIDGroupNameRequest = null ;
private RequestObjectPropertiesFamily handlerObjectGroupRequest = null ;
2008-05-26 16:16:48 +00:00
private ScriptReset handlerScriptReset = null ;
2008-06-28 16:08:12 +00:00
private GetScriptRunning handlerGetScriptRunning = null ;
private SetScriptRunning handlerSetScriptRunning = null ;
2008-06-06 12:51:20 +00:00
private UpdateVector handlerAutoPilotGo = null ;
2008-08-20 01:48:51 +00:00
//Gesture
private ActivateGesture handlerActivateGesture = null ;
private DeactivateGesture handlerDeactivateGesture = null ;
2008-05-18 03:21:22 +00:00
2008-10-04 22:29:37 +00:00
private DirPlacesQuery handlerDirPlacesQuery = null ;
2008-10-06 00:00:55 +00:00
private MapItemRequest handlerMapItemRequest = null ;
2008-07-24 16:03:17 +00:00
//private TerrainUnacked handlerUnackedTerrain = null;
2008-07-21 15:13:34 +00:00
//**
2008-05-02 19:21:33 +00:00
/* Properties */
2008-09-06 07:52:41 +00:00
public UUID SecureSessionId
2008-05-02 19:21:33 +00:00
{
get { return m_secureSessionId ; }
}
public IScene Scene
{
get { return m_scene ; }
}
2008-09-06 07:52:41 +00:00
public UUID SessionId
2008-05-02 19:21:33 +00:00
{
get { return m_sessionId ; }
}
2008-09-06 07:52:41 +00:00
public Vector3 StartPos
2008-05-02 19:21:33 +00:00
{
get { return m_startpos ; }
set { m_startpos = value ; }
}
2008-09-06 07:52:41 +00:00
public UUID AgentId
2008-05-02 19:21:33 +00:00
{
get { return m_agentId ; }
}
2008-09-06 07:52:41 +00:00
public UUID ActiveGroupId
2008-05-17 00:16:16 +00:00
{
get { return m_activeGroupID ; }
}
public string ActiveGroupName
{
get { return m_activeGroupName ; }
}
public ulong ActiveGroupPowers
{
get { return m_activeGroupPowers ; }
}
2008-09-09 01:26:48 +00:00
public ulong GetGroupPowers ( UUID groupID )
2008-08-07 12:55:46 +00:00
{
if ( m_groupPowers . ContainsKey ( groupID ) )
return m_groupPowers [ groupID ] ;
return 0 ;
}
2008-07-25 03:45:17 +00:00
2008-05-02 19:21:33 +00:00
/// <summary>
/// This is a utility method used by single states to not duplicate kicks and blue card of death messages.
/// </summary>
public bool ChildAgentStatus ( )
{
return m_scene . PresenceChildStatus ( AgentId ) ;
}
/// <summary>
/// First name of the agent/avatar represented by the client
/// </summary>
public string FirstName
{
get { return m_firstName ; }
}
/// <summary>
/// Last name of the agent/avatar represented by the client
/// </summary>
public string LastName
{
get { return m_lastName ; }
}
/// <summary>
/// Full name of the client (first name and last name)
/// </summary>
public string Name
{
get { return FirstName + " " + LastName ; }
}
public uint CircuitCode
{
get { return m_circuitCode ; }
}
public int MoneyBalance
{
get { return m_moneyBalance ; }
}
public int NextAnimationSequenceNumber
{
get { return m_animationSequenceNumber + + ; }
}
2008-07-22 17:58:42 +00:00
public IPacketHandler PacketHandler
{
get { return m_PacketHandler ; }
}
bool m_IsActive = true ;
public bool IsActive
{
get { return m_IsActive ; }
set { m_IsActive = value ; }
}
2008-08-25 07:35:17 +00:00
public bool SendLogoutPacketWhenClosing
{
set { m_SendLogoutPacketWhenClosing = value ; }
2008-08-28 14:41:54 +00:00
}
2008-08-25 07:35:17 +00:00
2008-05-02 19:21:33 +00:00
/* METHODS */
2008-09-07 03:22:33 +00:00
/// <summary>
/// Constructor
/// </summary>
/// <param name="remoteEP"></param>
/// <param name="scene"></param>
/// <param name="assetCache"></param>
/// <param name="packServer"></param>
/// <param name="authenSessions"></param>
/// <param name="agentId"></param>
/// <param name="sessionId"></param>
/// <param name="circuitCode"></param>
/// <param name="proxyEP"></param>
2008-10-03 19:42:35 +00:00
public LLClientView (
EndPoint remoteEP , IScene scene , AssetCache assetCache , LLPacketServer packServer ,
AgentCircuitManager authenSessions , UUID agentId , UUID sessionId , uint circuitCode , EndPoint proxyEP ,
ClientStackUserSettings userSettings )
2008-08-18 00:39:10 +00:00
{
2008-05-02 19:21:33 +00:00
m_moneyBalance = 1000 ;
2008-09-06 07:52:41 +00:00
m_channelVersion = Utils . StringToBytes ( scene . GetSimulatorVersion ( ) ) ;
2008-05-02 19:21:33 +00:00
2008-05-11 21:27:12 +00:00
InitDefaultAnimations ( ) ;
2008-05-02 19:21:33 +00:00
m_scene = scene ;
m_assetCache = assetCache ;
m_networkServer = packServer ;
// m_inventoryCache = inventoryCache;
2008-08-18 00:39:10 +00:00
m_authenticateSessionsHandler = authenSessions ;
2008-05-02 19:21:33 +00:00
m_agentId = agentId ;
m_sessionId = sessionId ;
m_circuitCode = circuitCode ;
m_userEndPoint = remoteEP ;
m_proxyEndPoint = proxyEP ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
m_startpos = m_authenticateSessionsHandler . GetPosition ( circuitCode ) ;
// While working on this, the BlockingQueue had me fooled for a bit.
2008-05-16 01:22:11 +00:00
// The Blocking queue causes the thread to stop until there's something
// in it to process. It's an on-purpose threadlock though because
2008-05-02 19:21:33 +00:00
// without it, the clientloop will suck up all sim resources.
2008-10-03 19:42:35 +00:00
m_PacketHandler = new LLPacketHandler ( this , m_networkServer , userSettings ) ;
2008-07-22 17:58:42 +00:00
m_PacketHandler . SynchronizeClient = SynchronizeClient ;
2008-05-02 19:21:33 +00:00
RegisterLocalPacketHandlers ( ) ;
m_clientThread = new Thread ( new ThreadStart ( AuthUser ) ) ;
m_clientThread . Name = "ClientThread" ;
m_clientThread . IsBackground = true ;
m_clientThread . Start ( ) ;
2008-08-01 20:16:28 +00:00
ThreadTracker . Add ( m_clientThread ) ;
2008-05-02 19:21:33 +00:00
}
public void SetDebug ( int newDebug )
{
m_debug = newDebug ;
}
# region Client Methods
private void CloseCleanup ( bool shutdownCircuit )
{
m_scene . RemoveClient ( AgentId ) ;
//m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false));
2008-05-16 01:22:11 +00:00
//m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true));
2008-05-02 19:21:33 +00:00
2008-05-16 01:22:11 +00:00
// Send the STOP packet
2008-05-02 19:21:33 +00:00
DisableSimulatorPacket disable = ( DisableSimulatorPacket ) PacketPool . Instance . GetPacket ( PacketType . DisableSimulator ) ;
OutPacket ( disable , ThrottleOutPacketType . Unknown ) ;
Thread . Sleep ( 2000 ) ;
// Shut down timers
m_clientPingTimer . Stop ( ) ;
// This is just to give the client a reasonable chance of
// flushing out all it's packets. There should probably
// be a better mechanism here
2008-05-16 01:22:11 +00:00
// We can't reach into other scenes and close the connection
2008-05-02 19:21:33 +00:00
// We need to do this over grid communications
//m_scene.CloseAllAgents(CircuitCode);
// If we're not shutting down the circuit, then this is the last time we'll go here.
2008-05-16 01:22:11 +00:00
// If we are shutting down the circuit, the UDP Server will come back here with
2008-05-02 19:21:33 +00:00
// ShutDownCircuit = false
if ( ! ( shutdownCircuit ) )
{
GC . Collect ( ) ;
2008-08-25 07:35:17 +00:00
2008-08-28 14:41:54 +00:00
// Sends a KillPacket object, with which, the
// blockingqueue dequeues and sees it's a killpacket
2008-08-25 07:35:17 +00:00
// and terminates within the context of the client thread.
2008-08-28 14:41:54 +00:00
// This ensures that it's done from within the context
2008-08-25 07:35:17 +00:00
// of the client thread regardless of where Close() is called.
KillEndDone ( ) ;
2008-05-02 19:21:33 +00:00
}
}
/// <summary>
/// Close down the client view. This *must* be the last method called, since the last #
/// statement of CloseCleanup() aborts the thread.
/// </summary>
/// <param name="shutdownCircuit"></param>
public void Close ( bool shutdownCircuit )
{
2008-08-18 21:14:38 +00:00
m_clientPingTimer . Enabled = false ;
2008-08-19 02:59:27 +00:00
2008-08-12 19:00:13 +00:00
m_log . DebugFormat (
2008-08-18 00:39:10 +00:00
"[CLIENT]: Close has been called with shutdownCircuit = {0} on scene {1}" ,
2008-08-12 19:00:13 +00:00
shutdownCircuit , m_scene . RegionInfo . RegionName ) ;
2008-08-18 00:39:10 +00:00
2008-07-22 17:58:42 +00:00
m_PacketHandler . Flush ( ) ;
2008-05-02 19:21:33 +00:00
2008-08-12 19:00:13 +00:00
// raise an event on the packet server to Shutdown the circuit
// Now, if we raise the event then the packet server will call this method itself, so don't try cleanup
// here otherwise we'll end up calling it twice.
// FIXME: In truth, I might be wrong but this whole business of calling this method twice (with different args) looks
// horribly tangly. Hopefully it should be possible to greatly simplify it.
2008-05-02 19:21:33 +00:00
if ( shutdownCircuit )
{
2008-09-25 05:13:44 +00:00
if ( OnConnectionClosed ! = null )
OnConnectionClosed ( this ) ;
2008-05-02 19:21:33 +00:00
}
2008-08-12 19:00:13 +00:00
else
{
CloseCleanup ( shutdownCircuit ) ;
}
2008-05-02 19:21:33 +00:00
}
public void Kick ( string message )
{
if ( ! ChildAgentStatus ( ) )
{
KickUserPacket kupack = ( KickUserPacket ) PacketPool . Instance . GetPacket ( PacketType . KickUser ) ;
kupack . UserInfo . AgentID = AgentId ;
kupack . UserInfo . SessionID = SessionId ;
kupack . TargetBlock . TargetIP = ( uint ) 0 ;
kupack . TargetBlock . TargetPort = ( ushort ) 0 ;
2008-09-06 07:52:41 +00:00
kupack . UserInfo . Reason = Utils . StringToBytes ( message ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( kupack , ThrottleOutPacketType . Task ) ;
2008-05-10 13:11:09 +00:00
// You must sleep here or users get no message!
Thread . Sleep ( 500 ) ;
2008-05-02 19:21:33 +00:00
}
}
public void Stop ( )
{
// Shut down timers
m_clientPingTimer . Stop ( ) ;
}
public void Restart ( )
{
// re-construct
2008-07-22 17:58:42 +00:00
m_PacketHandler . Clear ( ) ;
2008-05-02 19:21:33 +00:00
m_clientPingTimer = new Timer ( 5000 ) ;
m_clientPingTimer . Elapsed + = new ElapsedEventHandler ( CheckClientConnectivity ) ;
m_clientPingTimer . Enabled = true ;
}
public void Terminate ( )
{
2008-07-22 17:58:42 +00:00
m_PacketHandler . Stop ( ) ;
2008-05-02 19:21:33 +00:00
// wait for thread stoped
m_clientThread . Join ( ) ;
// delete circuit code
m_networkServer . CloseClient ( this ) ;
}
# endregion
# region Packet Handling
public static bool AddPacketHandler ( PacketType packetType , PacketMethod handler )
{
bool result = false ;
lock ( PacketHandlers )
{
if ( ! PacketHandlers . ContainsKey ( packetType ) )
{
PacketHandlers . Add ( packetType , handler ) ;
result = true ;
}
}
return result ;
}
public bool AddLocalPacketHandler ( PacketType packetType , PacketMethod handler )
{
bool result = false ;
lock ( m_packetHandlers )
{
if ( ! m_packetHandlers . ContainsKey ( packetType ) )
{
m_packetHandlers . Add ( packetType , handler ) ;
result = true ;
}
}
return result ;
}
/// <summary>
/// Try to process a packet using registered packet handlers
/// </summary>
/// <param name="packet"></param>
/// <returns>True if a handler was found which successfully processed the packet.</returns>
protected virtual bool ProcessPacketMethod ( Packet packet )
{
bool result = false ;
bool found = false ;
PacketMethod method ;
if ( m_packetHandlers . TryGetValue ( packet . Type , out method ) )
{
//there is a local handler for this packet type
result = method ( this , packet ) ;
}
else
{
//there is not a local handler so see if there is a Global handler
lock ( PacketHandlers )
{
found = PacketHandlers . TryGetValue ( packet . Type , out method ) ;
}
if ( found )
{
result = method ( this , packet ) ;
}
}
return result ;
}
protected void DebugPacket ( string direction , Packet packet )
{
if ( m_debug > 0 )
{
string info = String . Empty ;
if ( m_debug < 255 & & packet . Type = = PacketType . AgentUpdate )
return ;
if ( m_debug < 254 & & packet . Type = = PacketType . ViewerEffect )
return ;
if ( m_debug < 253 & & (
packet . Type = = PacketType . CompletePingCheck | |
packet . Type = = PacketType . StartPingCheck
) )
return ;
if ( m_debug < 252 & & packet . Type = = PacketType . PacketAck )
return ;
if ( m_debug > 1 )
{
info = packet . ToString ( ) ;
}
else
{
info = packet . Type . ToString ( ) ;
}
Console . WriteLine ( m_circuitCode + ":" + direction + ": " + info ) ;
}
}
2008-09-20 19:05:00 +00:00
/// <summary>
/// Main packet processing loop for the UDP component of the client session. Both incoming and outgoing
/// packets are processed here.
/// </summary>
2008-05-02 19:21:33 +00:00
protected virtual void ClientLoop ( )
{
2008-09-20 19:05:00 +00:00
m_log . DebugFormat (
"[CLIENT]: Entered main packet processing loop for {0} {1}" , FirstName , LastName ) ;
2008-09-09 01:26:48 +00:00
2008-05-02 19:21:33 +00:00
while ( true )
{
2008-07-22 17:58:42 +00:00
LLQueItem nextPacket = m_PacketHandler . PacketQueue . Dequeue ( ) ;
2008-09-20 19:05:00 +00:00
2008-05-02 19:21:33 +00:00
if ( nextPacket . Incoming )
{
DebugPacket ( "IN" , nextPacket . Packet ) ;
2008-08-07 14:48:45 +00:00
m_PacketHandler . ProcessInPacket ( nextPacket ) ;
2008-09-20 19:05:00 +00:00
}
2008-05-02 19:21:33 +00:00
else
{
DebugPacket ( "OUT" , nextPacket . Packet ) ;
2008-08-07 14:48:45 +00:00
m_PacketHandler . ProcessOutPacket ( nextPacket ) ;
2008-05-02 19:21:33 +00:00
}
}
}
# endregion
2008-07-21 15:13:34 +00:00
protected int m_terrainCheckerCount = 0 ;
2008-08-18 00:39:10 +00:00
2008-06-28 00:33:17 +00:00
/// <summary>
/// Event handler for check client timer
2008-08-13 21:45:17 +00:00
/// Checks to ensure that the client is still connected. If the client has failed to respond to many pings
/// in succession then close down the connection.
2008-06-28 00:33:17 +00:00
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2008-05-02 19:21:33 +00:00
protected void CheckClientConnectivity ( object sender , ElapsedEventArgs e )
{
2008-09-03 03:35:54 +00:00
if ( m_PacketHandler . PacketsReceived = = m_inPacketsChecked )
2008-05-02 19:21:33 +00:00
{
2008-09-03 03:35:54 +00:00
// no packet came in since the last time we checked...
2008-09-09 01:26:48 +00:00
2008-05-02 19:21:33 +00:00
m_probesWithNoIngressPackets + + ;
2008-09-03 03:35:54 +00:00
if ( ( m_probesWithNoIngressPackets > 30 & & ! m_clientBlocked ) // agent active
2008-09-09 01:26:48 +00:00
| | ( m_probesWithNoIngressPackets > 90 & & m_clientBlocked ) ) // agent paused
2008-05-02 19:21:33 +00:00
{
2008-08-18 21:14:38 +00:00
m_clientPingTimer . Enabled = false ;
2008-08-19 02:59:27 +00:00
2008-08-18 21:14:38 +00:00
m_log . WarnFormat (
"[CLIENT]: Client for agent {0} {1} has stopped responding to pings. Closing connection" ,
Name , AgentId ) ;
2008-08-19 02:59:27 +00:00
2008-05-02 19:21:33 +00:00
if ( OnConnectionClosed ! = null )
{
OnConnectionClosed ( this ) ;
2008-08-19 02:59:27 +00:00
}
2008-05-02 19:21:33 +00:00
}
else
{
// this will normally trigger at least one packet (ping response)
SendStartPingCheck ( 0 ) ;
}
}
else
{
// Something received in the meantime - we can reset the counters
m_probesWithNoIngressPackets = 0 ;
2008-09-09 01:26:48 +00:00
// ... and store the current number of packets received to find out if another one got in on the next cycle
2008-09-03 03:35:54 +00:00
m_inPacketsChecked = m_PacketHandler . PacketsReceived ;
2008-05-02 19:21:33 +00:00
}
2008-07-21 15:13:34 +00:00
2008-05-02 19:21:33 +00:00
}
# region Setup
2008-06-28 00:33:17 +00:00
/// <summary>
/// Starts up the timers to check the client and resend unacked packets
/// Adds the client to the OpenSim.Region.Environment.Scenes.Scene
/// </summary>
2008-05-02 19:21:33 +00:00
protected virtual void InitNewClient ( )
{
//this.UploadAssets = new AgentAssetUpload(this, m_assetCache, m_inventoryCache);
2008-05-16 01:22:11 +00:00
// Establish our two timers. We could probably get this down to one
2008-05-02 19:21:33 +00:00
2008-08-13 21:45:17 +00:00
// Ping the client regularly to check that it's still there
2008-05-02 19:21:33 +00:00
m_clientPingTimer = new Timer ( 5000 ) ;
m_clientPingTimer . Elapsed + = new ElapsedEventHandler ( CheckClientConnectivity ) ;
m_clientPingTimer . Enabled = true ;
2008-08-18 00:39:10 +00:00
2008-05-02 19:21:33 +00:00
m_scene . AddNewClient ( this , true ) ;
}
2008-06-03 20:27:52 +00:00
/// <summary>
/// Authorize an incoming user session. This method lies at the base of the entire client thread.
/// </summary>
2008-05-02 19:21:33 +00:00
protected virtual void AuthUser ( )
{
2008-07-11 15:40:56 +00:00
//tell this thread we are using the culture set up for the sim (currently hardcoded to en_US)
//otherwise it will override this and use the system default
Culture . SetCurrentCulture ( ) ;
2008-06-03 20:27:52 +00:00
try
2008-05-02 19:21:33 +00:00
{
2008-06-03 20:27:52 +00:00
// AuthenticateResponse sessionInfo = m_gridServer.AuthenticateSession(m_cirpack.m_circuitCode.m_sessionId, m_cirpack.m_circuitCode.ID, m_cirpack.m_circuitCode.Code);
AuthenticateResponse sessionInfo =
2008-09-07 03:22:33 +00:00
m_authenticateSessionsHandler . AuthenticateSession ( m_sessionId , m_agentId , m_circuitCode ) ;
2008-09-09 01:26:48 +00:00
2008-06-03 20:27:52 +00:00
if ( ! sessionInfo . Authorised )
2008-05-02 19:21:33 +00:00
{
2008-06-03 20:27:52 +00:00
//session/circuit not authorised
2008-06-05 01:55:45 +00:00
m_log . WarnFormat (
2008-06-05 02:12:44 +00:00
"[CLIENT]: New user request denied to avatar {0} connecting with circuit code {1} from {2}" ,
2008-06-05 01:55:45 +00:00
m_agentId , m_circuitCode , m_userEndPoint ) ;
2008-07-08 11:02:53 +00:00
2008-07-22 17:58:42 +00:00
m_PacketHandler . Stop ( ) ;
2008-06-03 20:27:52 +00:00
m_clientThread . Abort ( ) ;
2008-05-02 19:21:33 +00:00
}
2008-06-03 20:27:52 +00:00
else
{
m_log . Info ( "[CLIENT]: Got authenticated connection from " + m_userEndPoint . ToString ( ) ) ;
//session is authorised
m_firstName = sessionInfo . LoginInfo . First ;
m_lastName = sessionInfo . LoginInfo . Last ;
2008-09-06 07:52:41 +00:00
if ( sessionInfo . LoginInfo . SecureSession ! = UUID . Zero )
2008-06-03 20:27:52 +00:00
{
m_secureSessionId = sessionInfo . LoginInfo . SecureSession ;
}
2008-07-08 11:02:53 +00:00
2008-06-03 20:27:52 +00:00
// This sets up all the timers
InitNewClient ( ) ;
2008-05-02 19:21:33 +00:00
2008-06-03 20:27:52 +00:00
ClientLoop ( ) ;
}
2008-10-03 14:18:17 +00:00
}
2008-09-27 22:06:51 +00:00
catch ( System . Exception e )
2008-06-03 20:27:52 +00:00
{
2008-06-04 01:25:31 +00:00
if ( e is ThreadAbortException )
throw e ;
2008-07-08 11:02:53 +00:00
2008-06-04 16:30:44 +00:00
if ( StatsManager . SimExtraStats ! = null )
StatsManager . SimExtraStats . AddAbnormalClientThreadTermination ( ) ;
2008-07-08 11:02:53 +00:00
2008-06-03 20:27:52 +00:00
// Don't let a failure in an individual client thread crash the whole sim.
2008-10-03 14:18:17 +00:00
m_log . ErrorFormat (
"[CLIENT]: Client thread for {0} {1} crashed. Logging them out. Exception {2}" , Name , AgentId , e ) ;
2008-06-05 01:20:17 +00:00
try
2008-06-10 08:35:46 +00:00
{
2008-06-05 01:20:17 +00:00
// Make an attempt to alert the user that their session has crashed
2008-07-08 11:02:53 +00:00
AgentAlertMessagePacket packet
2008-06-05 01:20:17 +00:00
= BuildAgentAlertPacket (
"Unfortunately the session for this client on the server has crashed.\n"
+ "Any further actions taken will not be processed.\n"
2008-07-08 11:02:53 +00:00
+ "Please relog" , true ) ;
2008-08-07 14:48:45 +00:00
LLQueItem item = new LLQueItem ( ) ;
item . Packet = packet ;
2008-08-18 00:39:10 +00:00
2008-08-07 14:48:45 +00:00
m_PacketHandler . ProcessOutPacket ( item ) ;
2008-07-08 11:02:53 +00:00
2008-06-05 01:20:17 +00:00
// There may be a better way to do this. Perhaps kick? Not sure this propogates notifications to
// listeners yet, though.
Logout ( this ) ;
}
catch ( Exception e2 )
{
if ( e2 is ThreadAbortException )
2008-06-10 08:35:46 +00:00
throw e2 ;
2008-07-08 11:02:53 +00:00
2008-06-05 01:20:17 +00:00
m_log . ErrorFormat ( "[CLIENT]: Further exception thrown on forced session logout. {0}" , e2 ) ;
2008-06-10 08:35:46 +00:00
}
2008-05-02 19:21:33 +00:00
}
}
# endregion
// Previously ClientView.API partial class
2008-09-09 05:25:29 +00:00
public event GenericMessage OnGenericMessage ;
2008-05-02 19:21:33 +00:00
public event Action < IClientAPI > OnLogout ;
public event ObjectPermissions OnObjectPermissions ;
public event Action < IClientAPI > OnConnectionClosed ;
public event ViewerEffectEventHandler OnViewerEffect ;
public event ImprovedInstantMessage OnInstantMessage ;
2008-10-03 14:53:11 +00:00
public event ChatMessage OnChatFromClient ;
2008-05-02 19:21:33 +00:00
public event TextureRequest OnRequestTexture ;
public event RezObject OnRezObject ;
public event GenericCall4 OnDeRezObject ;
public event ModifyTerrain OnModifyTerrain ;
public event Action < IClientAPI > OnRegionHandShakeReply ;
public event GenericCall2 OnRequestWearables ;
public event SetAppearance OnSetAppearance ;
public event AvatarNowWearing OnAvatarNowWearing ;
public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv ;
public event UUIDNameRequest OnDetachAttachmentIntoInv ;
public event ObjectAttach OnObjectAttach ;
public event ObjectDeselect OnObjectDetach ;
2008-10-04 01:09:22 +00:00
public event ObjectDrop OnObjectDrop ;
2008-05-02 19:21:33 +00:00
public event GenericCall2 OnCompleteMovementToRegion ;
public event UpdateAgent OnAgentUpdate ;
public event AgentRequestSit OnAgentRequestSit ;
public event AgentSit OnAgentSit ;
public event AvatarPickerRequest OnAvatarPickerRequest ;
public event StartAnim OnStartAnim ;
public event StopAnim OnStopAnim ;
public event Action < IClientAPI > OnRequestAvatarsData ;
public event LinkObjects OnLinkObjects ;
public event DelinkObjects OnDelinkObjects ;
public event UpdateVector OnGrabObject ;
public event ObjectSelect OnDeGrabObject ;
public event ObjectDuplicate OnObjectDuplicate ;
public event ObjectDuplicateOnRay OnObjectDuplicateOnRay ;
public event MoveObject OnGrabUpdate ;
public event AddNewPrim OnAddPrim ;
public event RequestGodlikePowers OnRequestGodlikePowers ;
public event GodKickUser OnGodKickUser ;
public event ObjectExtraParams OnUpdateExtraParams ;
public event UpdateShape OnUpdatePrimShape ;
public event ObjectSelect OnObjectSelect ;
public event ObjectDeselect OnObjectDeselect ;
public event GenericCall7 OnObjectDescription ;
public event GenericCall7 OnObjectName ;
2008-09-12 20:42:04 +00:00
public event GenericCall7 OnObjectClickAction ;
2008-10-03 12:00:13 +00:00
public event GenericCall7 OnObjectMaterial ;
2008-05-02 19:21:33 +00:00
public event ObjectIncludeInSearch OnObjectIncludeInSearch ;
public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily ;
public event UpdatePrimFlags OnUpdatePrimFlags ;
public event UpdatePrimTexture OnUpdatePrimTexture ;
public event UpdateVector OnUpdatePrimGroupPosition ;
public event UpdateVector OnUpdatePrimSinglePosition ;
public event UpdatePrimRotation OnUpdatePrimGroupRotation ;
public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation ;
public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation ;
public event UpdateVector OnUpdatePrimScale ;
public event UpdateVector OnUpdatePrimGroupScale ;
public event StatusChange OnChildAgentStatus ;
public event GenericCall2 OnStopMovement ;
2008-09-06 07:52:41 +00:00
public event Action < UUID > OnRemoveAvatar ;
2008-05-02 19:21:33 +00:00
public event RequestMapBlocks OnRequestMapBlocks ;
public event RequestMapName OnMapNameRequest ;
public event TeleportLocationRequest OnTeleportLocationRequest ;
public event TeleportLandmarkRequest OnTeleportLandmarkRequest ;
public event DisconnectUser OnDisconnectUser ;
public event RequestAvatarProperties OnRequestAvatarProperties ;
public event SetAlwaysRun OnSetAlwaysRun ;
public event FetchInventory OnAgentDataUpdateRequest ;
public event FetchInventory OnUserInfoRequest ;
public event TeleportLocationRequest OnSetStartLocationRequest ;
public event UpdateAvatarProperties OnUpdateAvatarProperties ;
public event CreateNewInventoryItem OnCreateNewInventoryItem ;
public event CreateInventoryFolder OnCreateNewInventoryFolder ;
public event UpdateInventoryFolder OnUpdateInventoryFolder ;
public event MoveInventoryFolder OnMoveInventoryFolder ;
public event FetchInventoryDescendents OnFetchInventoryDescendents ;
public event PurgeInventoryDescendents OnPurgeInventoryDescendents ;
public event FetchInventory OnFetchInventory ;
public event RequestTaskInventory OnRequestTaskInventory ;
public event UpdateInventoryItem OnUpdateInventoryItem ;
public event CopyInventoryItem OnCopyInventoryItem ;
public event MoveInventoryItem OnMoveInventoryItem ;
public event RemoveInventoryItem OnRemoveInventoryItem ;
public event RemoveInventoryFolder OnRemoveInventoryFolder ;
public event UDPAssetUploadRequest OnAssetUploadRequest ;
public event XferReceive OnXferReceive ;
public event RequestXfer OnRequestXfer ;
public event ConfirmXfer OnConfirmXfer ;
public event RezScript OnRezScript ;
public event UpdateTaskInventory OnUpdateTaskInventory ;
public event MoveTaskInventory OnMoveTaskItem ;
public event RemoveTaskInventory OnRemoveTaskItem ;
public event RequestAsset OnRequestAsset ;
public event UUIDNameRequest OnNameFromUUIDRequest ;
public event ParcelAccessListRequest OnParcelAccessListRequest ;
public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest ;
public event ParcelPropertiesRequest OnParcelPropertiesRequest ;
public event ParcelDivideRequest OnParcelDivideRequest ;
public event ParcelJoinRequest OnParcelJoinRequest ;
public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest ;
public event ParcelSelectObjects OnParcelSelectObjects ;
2008-05-16 01:22:11 +00:00
public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest ;
2008-05-13 16:22:57 +00:00
public event ParcelAbandonRequest OnParcelAbandonRequest ;
2008-06-26 13:45:36 +00:00
public event ParcelReclaim OnParcelReclaim ;
2008-05-24 11:10:21 +00:00
public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest ;
2008-05-02 19:21:33 +00:00
public event RegionInfoRequest OnRegionInfoRequest ;
public event EstateCovenantRequest OnEstateCovenantRequest ;
public event FriendActionDelegate OnApproveFriendRequest ;
public event FriendActionDelegate OnDenyFriendRequest ;
public event FriendshipTermination OnTerminateFriendship ;
public event MoneyTransferRequest OnMoneyTransferRequest ;
public event EconomyDataRequest OnEconomyDataRequest ;
public event MoneyBalanceRequest OnMoneyBalanceRequest ;
public event ParcelBuy OnParcelBuy ;
public event UUIDNameRequest OnTeleportHomeRequest ;
2008-05-18 03:21:22 +00:00
public event UUIDNameRequest OnUUIDGroupNameRequest ;
2008-05-02 19:21:33 +00:00
public event ScriptAnswer OnScriptAnswer ;
public event RequestPayPrice OnRequestPayPrice ;
2008-08-24 00:51:21 +00:00
public event ObjectSaleInfo OnObjectSaleInfo ;
public event ObjectBuy OnObjectBuy ;
public event BuyObjectInventory OnBuyObjectInventory ;
2008-05-02 19:21:33 +00:00
public event AgentSit OnUndo ;
2008-05-07 19:41:03 +00:00
public event ForceReleaseControls OnForceReleaseControls ;
2008-05-25 11:22:05 +00:00
public event GodLandStatRequest OnLandStatRequest ;
2008-05-18 03:21:22 +00:00
public event RequestObjectPropertiesFamily OnObjectGroupRequest ;
2008-05-04 18:59:18 +00:00
public event DetailedEstateDataRequest OnDetailedEstateDataRequest ;
public event SetEstateFlagsRequest OnSetEstateFlagsRequest ;
public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture ;
public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture ;
public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights ;
public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest ;
public event SetRegionTerrainSettings OnSetRegionTerrainSettings ;
2008-06-19 20:57:00 +00:00
public event BakeTerrain OnBakeTerrain ;
2008-07-18 02:40:47 +00:00
public event EstateChangeInfo OnEstateChangeInfo ;
2008-05-04 18:59:18 +00:00
public event EstateRestartSimRequest OnEstateRestartSimRequest ;
public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest ;
public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest ;
public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest ;
public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest ;
public event EstateDebugRegionRequest OnEstateDebugRegionRequest ;
public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest ;
2008-09-28 22:01:37 +00:00
public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest ;
2008-08-16 19:20:14 +00:00
public event RegionHandleRequest OnRegionHandleRequest ;
public event ParcelInfoRequest OnParcelInfoRequest ;
2008-05-26 16:16:48 +00:00
public event ScriptReset OnScriptReset ;
2008-06-28 16:08:12 +00:00
public event GetScriptRunning OnGetScriptRunning ;
public event SetScriptRunning OnSetScriptRunning ;
2008-06-06 12:51:20 +00:00
public event UpdateVector OnAutoPilotGo ;
2008-05-04 18:59:18 +00:00
2008-07-21 15:13:34 +00:00
public event TerrainUnacked OnUnackedTerrain ;
2008-08-20 01:48:51 +00:00
public event ActivateGesture OnActivateGesture ;
public event DeactivateGesture OnDeactivateGesture ;
2008-10-04 22:29:37 +00:00
public event DirPlacesQuery OnDirPlacesQuery ;
2008-10-06 00:00:55 +00:00
public event MapItemRequest OnMapItemRequest ;
2008-08-20 01:48:51 +00:00
// voire si c'est necessaire
2008-09-06 07:52:41 +00:00
public void ActivateGesture ( UUID assetId , UUID gestureId )
2008-08-20 01:48:51 +00:00
{
}
2008-09-06 07:52:41 +00:00
public void DeactivateGesture ( UUID assetId , UUID gestureId )
2008-08-20 01:48:51 +00:00
{
}
2008-05-02 19:21:33 +00:00
#region Scene/Avatar to Client
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="regionInfo"></param>
2008-05-06 18:29:58 +00:00
public void SendRegionHandshake ( RegionInfo regionInfo , RegionHandshakeArgs args )
2008-05-02 19:21:33 +00:00
{
RegionHandshakePacket handshake = ( RegionHandshakePacket ) PacketPool . Instance . GetPacket ( PacketType . RegionHandshake ) ;
2008-05-06 18:29:58 +00:00
handshake . RegionInfo . BillableFactor = args . billableFactor ;
handshake . RegionInfo . IsEstateManager = args . isEstateManager ;
handshake . RegionInfo . TerrainHeightRange00 = args . terrainHeightRange0 ;
handshake . RegionInfo . TerrainHeightRange01 = args . terrainHeightRange1 ;
handshake . RegionInfo . TerrainHeightRange10 = args . terrainHeightRange2 ;
handshake . RegionInfo . TerrainHeightRange11 = args . terrainHeightRange3 ;
handshake . RegionInfo . TerrainStartHeight00 = args . terrainStartHeight0 ;
handshake . RegionInfo . TerrainStartHeight01 = args . terrainStartHeight1 ;
handshake . RegionInfo . TerrainStartHeight10 = args . terrainStartHeight2 ;
handshake . RegionInfo . TerrainStartHeight11 = args . terrainStartHeight3 ;
handshake . RegionInfo . SimAccess = args . simAccess ;
handshake . RegionInfo . WaterHeight = args . waterHeight ;
handshake . RegionInfo . RegionFlags = args . regionFlags ;
2008-09-06 07:52:41 +00:00
handshake . RegionInfo . SimName = Utils . StringToBytes ( args . regionName ) ;
2008-05-06 18:29:58 +00:00
handshake . RegionInfo . SimOwner = args . SimOwner ;
handshake . RegionInfo . TerrainBase0 = args . terrainBase0 ;
handshake . RegionInfo . TerrainBase1 = args . terrainBase1 ;
handshake . RegionInfo . TerrainBase2 = args . terrainBase2 ;
handshake . RegionInfo . TerrainBase3 = args . terrainBase3 ;
handshake . RegionInfo . TerrainDetail0 = args . terrainDetail0 ;
handshake . RegionInfo . TerrainDetail1 = args . terrainDetail1 ;
handshake . RegionInfo . TerrainDetail2 = args . terrainDetail2 ;
handshake . RegionInfo . TerrainDetail3 = args . terrainDetail3 ;
2008-09-06 07:52:41 +00:00
handshake . RegionInfo . CacheID = UUID . Random ( ) ; //I guess this is for the client to remember an old setting?
2008-05-02 19:21:33 +00:00
OutPacket ( handshake , ThrottleOutPacketType . Task ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="regInfo"></param>
2008-09-06 07:52:41 +00:00
public void MoveAgentIntoRegion ( RegionInfo regInfo , Vector3 pos , Vector3 look )
2008-05-02 19:21:33 +00:00
{
AgentMovementCompletePacket mov = ( AgentMovementCompletePacket ) PacketPool . Instance . GetPacket ( PacketType . AgentMovementComplete ) ;
mov . SimData . ChannelVersion = m_channelVersion ;
mov . AgentData . SessionID = m_sessionId ;
mov . AgentData . AgentID = AgentId ;
mov . Data . RegionHandle = regInfo . RegionHandle ;
2008-08-30 17:51:12 +00:00
mov . Data . Timestamp = ( uint ) Util . UnixTimeSinceEpoch ( ) ;
2008-05-02 19:21:33 +00:00
if ( ( pos . X = = 0 ) & & ( pos . Y = = 0 ) & & ( pos . Z = = 0 ) )
{
mov . Data . Position = m_startpos ;
}
else
{
mov . Data . Position = pos ;
}
mov . Data . LookAt = look ;
// Hack to get this out immediately and skip the throttles
OutPacket ( mov , ThrottleOutPacketType . Unknown ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="message"></param>
/// <param name="type"></param>
/// <param name="fromPos"></param>
/// <param name="fromName"></param>
/// <param name="fromAgentID"></param>
2008-09-06 07:52:41 +00:00
public void SendChatMessage ( string message , byte type , Vector3 fromPos , string fromName ,
UUID fromAgentID , byte source , byte audible )
2008-05-02 19:21:33 +00:00
{
2008-09-06 07:52:41 +00:00
SendChatMessage ( Utils . StringToBytes ( message ) , type , fromPos , fromName , fromAgentID , source , audible ) ;
2008-05-02 19:21:33 +00:00
}
2008-09-06 07:52:41 +00:00
public void SendChatMessage ( byte [ ] message , byte type , Vector3 fromPos , string fromName ,
UUID fromAgentID , byte source , byte audible )
2008-05-02 19:21:33 +00:00
{
ChatFromSimulatorPacket reply = ( ChatFromSimulatorPacket ) PacketPool . Instance . GetPacket ( PacketType . ChatFromSimulator ) ;
2008-05-05 15:53:11 +00:00
reply . ChatData . Audible = audible ;
2008-05-02 19:21:33 +00:00
reply . ChatData . Message = message ;
reply . ChatData . ChatType = type ;
2008-05-05 15:53:11 +00:00
reply . ChatData . SourceType = source ;
2008-05-02 19:21:33 +00:00
reply . ChatData . Position = fromPos ;
2008-09-06 07:52:41 +00:00
reply . ChatData . FromName = Utils . StringToBytes ( fromName ) ;
2008-05-02 19:21:33 +00:00
reply . ChatData . OwnerID = fromAgentID ;
reply . ChatData . SourceID = fromAgentID ;
OutPacket ( reply , ThrottleOutPacketType . Task ) ;
}
/// <summary>
/// Send an instant message to this client
/// </summary>
/// <param name="message"></param>
/// <param name="target"></param>
2008-09-06 07:52:41 +00:00
public void SendInstantMessage ( UUID fromAgent , UUID fromAgentSession , string message , UUID toAgent ,
UUID imSessionID , string fromName , byte dialog , uint timeStamp )
2008-05-02 19:21:33 +00:00
{
SendInstantMessage (
2008-05-16 01:22:11 +00:00
fromAgent , fromAgentSession , message , toAgent ,
2008-05-02 19:21:33 +00:00
imSessionID , fromName , dialog , timeStamp , new byte [ 0 ] ) ;
}
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
/// <summary>
/// Send an instant message to this client
/// </summary>
/// <param name="message"></param>
/// <param name="target"></param>
2008-09-06 07:52:41 +00:00
public void SendInstantMessage ( UUID fromAgent , UUID fromAgentSession , string message , UUID toAgent ,
UUID imSessionID , string fromName , byte dialog , uint timeStamp ,
2008-05-02 19:21:33 +00:00
byte [ ] binaryBucket )
{
2008-05-13 16:22:57 +00:00
if ( ( ( Scene ) ( this . m_scene ) ) . ExternalChecks . ExternalChecksCanInstantMessage ( fromAgent , toAgent ) )
{
ImprovedInstantMessagePacket msg
= ( ImprovedInstantMessagePacket ) PacketPool . Instance . GetPacket ( PacketType . ImprovedInstantMessage ) ;
msg . AgentData . AgentID = fromAgent ;
msg . AgentData . SessionID = fromAgentSession ;
2008-09-06 07:52:41 +00:00
msg . MessageBlock . FromAgentName = Utils . StringToBytes ( fromName ) ;
2008-05-13 16:22:57 +00:00
msg . MessageBlock . Dialog = dialog ;
msg . MessageBlock . FromGroup = false ;
msg . MessageBlock . ID = imSessionID ;
msg . MessageBlock . Offline = 0 ;
msg . MessageBlock . ParentEstateID = 0 ;
2008-09-06 07:52:41 +00:00
msg . MessageBlock . Position = new Vector3 ( ) ;
msg . MessageBlock . RegionID = UUID . Random ( ) ;
2008-05-13 16:22:57 +00:00
msg . MessageBlock . Timestamp = timeStamp ;
msg . MessageBlock . ToAgentID = toAgent ;
2008-09-06 07:52:41 +00:00
msg . MessageBlock . Message = Utils . StringToBytes ( message ) ;
2008-05-13 16:22:57 +00:00
msg . MessageBlock . BinaryBucket = binaryBucket ;
OutPacket ( msg , ThrottleOutPacketType . Task ) ;
}
2008-05-02 19:21:33 +00:00
}
2008-09-09 05:25:29 +00:00
public void SendGenericMessage ( string method , List < string > message )
{
GenericMessagePacket gmp = new GenericMessagePacket ( ) ;
gmp . MethodData . Method = Utils . StringToBytes ( method ) ;
gmp . ParamList = new GenericMessagePacket . ParamListBlock [ message . Count ] ;
int i = 0 ;
foreach ( string val in message )
{
gmp . ParamList [ i ] = new GenericMessagePacket . ParamListBlock ( ) ;
gmp . ParamList [ i + + ] . Parameter = Utils . StringToBytes ( val ) ;
}
OutPacket ( gmp , ThrottleOutPacketType . Task ) ;
}
2008-05-02 19:21:33 +00:00
/// <summary>
/// Send the region heightmap to the client
/// </summary>
/// <param name="map">heightmap</param>
public virtual void SendLayerData ( float [ ] map )
{
2008-05-22 19:44:57 +00:00
ThreadPool . QueueUserWorkItem ( new WaitCallback ( DoSendLayerData ) , ( object ) map ) ;
}
2008-07-03 23:04:12 +00:00
/// <summary>
/// Send terrain layer information to the client.
/// </summary>
/// <param name="o"></param>
2008-05-22 19:44:57 +00:00
private void DoSendLayerData ( object o )
{
float [ ] map = ( float [ ] ) o ;
2008-07-08 11:02:53 +00:00
2008-05-02 19:21:33 +00:00
try
{
for ( int y = 0 ; y < 16 ; y + + )
{
2008-07-03 23:04:12 +00:00
// For some terrains, sending more than one terrain patch at once results in a libsecondlife exception
2008-08-18 00:39:10 +00:00
// see http://opensimulator.org/mantis/view.php?id=1662
2008-07-03 23:04:12 +00:00
//for (int x = 0; x < 16; x += 4)
//{
// SendLayerPacket(map, y, x);
// Thread.Sleep(150);
//}
2008-07-08 11:02:53 +00:00
for ( int x = 0 ; x < 16 ; x + + )
2008-05-02 19:21:33 +00:00
{
2008-07-08 11:02:53 +00:00
SendLayerData ( x , y , map ) ;
Thread . Sleep ( 35 ) ;
2008-05-02 19:21:33 +00:00
}
}
}
catch ( Exception e )
{
2008-07-03 23:04:12 +00:00
m_log . Warn ( "[CLIENT]: ClientView.API.cs: SendLayerData() - Failed with exception " + e . ToString ( ) ) ;
2008-05-02 19:21:33 +00:00
}
}
2008-07-03 23:04:12 +00:00
/// <summary>
/// Sends a set of four patches (x, x+1, ..., x+3) to the client
/// </summary>
2008-08-18 00:39:10 +00:00
/// <param name="map">heightmap</param>
2008-07-03 23:04:12 +00:00
/// <param name="px">X coordinate for patches 0..12</param>
/// <param name="py">Y coordinate for patches 0..15</param>
2008-07-04 10:19:58 +00:00
// private void SendLayerPacket(float[] map, int y, int x)
// {
// int[] patches = new int[4];
// patches[0] = x + 0 + y * 16;
// patches[1] = x + 1 + y * 16;
// patches[2] = x + 2 + y * 16;
// patches[3] = x + 3 + y * 16;
// Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches);
// OutPacket(layerpack, ThrottleOutPacketType.Land);
// }
2008-05-22 19:44:57 +00:00
2008-05-02 19:21:33 +00:00
/// <summary>
/// Sends a specified patch to a client
/// </summary>
2008-07-03 23:04:12 +00:00
/// <param name="px">Patch coordinate (x) 0..15</param>
/// <param name="py">Patch coordinate (y) 0..15</param>
2008-05-02 19:21:33 +00:00
/// <param name="map">heightmap</param>
public void SendLayerData ( int px , int py , float [ ] map )
{
try
{
int [ ] patches = new int [ 1 ] ;
int patchx , patchy ;
patchx = px ;
patchy = py ;
patches [ 0 ] = patchx + 0 + patchy * 16 ;
2008-09-06 07:52:41 +00:00
LayerDataPacket layerpack = TerrainCompressor . CreateLandPacket ( map , patches ) ;
2008-05-10 10:28:49 +00:00
layerpack . Header . Zerocoded = true ;
2008-09-25 11:46:05 +00:00
2008-05-02 19:21:33 +00:00
OutPacket ( layerpack , ThrottleOutPacketType . Land ) ;
2008-09-25 11:46:05 +00:00
2008-05-02 19:21:33 +00:00
}
catch ( Exception e )
{
2008-07-03 23:04:12 +00:00
m_log . Warn ( "[client]: ClientView.API.cs: SendLayerData() - Failed with exception " + e . ToString ( ) ) ;
2008-05-02 19:21:33 +00:00
}
}
2008-09-25 11:46:05 +00:00
/// <summary>
/// Send the region heightmap to the client
/// </summary>
2008-09-26 17:25:22 +00:00
/// <param name="windSpeeds">16x16 array of wind speeds</param>
public virtual void SendWindData ( Vector2 [ ] windSpeeds )
2008-09-25 11:46:05 +00:00
{
2008-09-26 17:25:22 +00:00
ThreadPool . QueueUserWorkItem ( new WaitCallback ( DoSendWindData ) , ( object ) windSpeeds ) ;
2008-09-25 11:46:05 +00:00
}
/// <summary>
/// Send terrain layer information to the client.
/// </summary>
/// <param name="o"></param>
2008-09-26 17:25:22 +00:00
private void DoSendWindData ( object o )
{
Vector2 [ ] windSpeeds = ( Vector2 [ ] ) o ;
TerrainPatch [ ] patches = new TerrainPatch [ 2 ] ;
patches [ 0 ] = new TerrainPatch ( ) ;
patches [ 0 ] . Data = new float [ 16 * 16 ] ;
patches [ 1 ] = new TerrainPatch ( ) ;
patches [ 1 ] . Data = new float [ 16 * 16 ] ;
for ( int y = 0 ; y < 16 ; y + + )
{
for ( int x = 0 ; x < 16 ; x + + )
{
patches [ 0 ] . Data [ y * 16 + x ] = windSpeeds [ y * 16 + x ] . X ;
patches [ 1 ] . Data [ y * 16 + x ] = windSpeeds [ y * 16 + x ] . Y ;
}
}
LayerDataPacket layerpack = TerrainCompressor . CreateLayerDataPacket ( patches , TerrainPatch . LayerType . Wind ) ;
layerpack . Header . Zerocoded = true ;
OutPacket ( layerpack , ThrottleOutPacketType . Wind ) ;
}
2008-09-25 11:46:05 +00:00
/// <summary>
/// Sends a set of four patches (x, x+1, ..., x+3) to the client
/// </summary>
/// <param name="map">heightmap</param>
/// <param name="px">X coordinate for patches 0..12</param>
/// <param name="py">Y coordinate for patches 0..15</param>
// private void SendLayerPacket(float[] map, int y, int x)
// {
// int[] patches = new int[4];
// patches[0] = x + 0 + y * 16;
// patches[1] = x + 1 + y * 16;
// patches[2] = x + 2 + y * 16;
// patches[3] = x + 3 + y * 16;
// Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches);
// OutPacket(layerpack, ThrottleOutPacketType.Land);
// }
2008-05-02 19:21:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
/// Tell the client that the given neighbour region is ready to receive a child agent.
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="neighbourHandle"></param>
/// <param name="neighbourIP"></param>
/// <param name="neighbourPort"></param>
public void InformClientOfNeighbour ( ulong neighbourHandle , IPEndPoint neighbourEndPoint )
{
IPAddress neighbourIP = neighbourEndPoint . Address ;
ushort neighbourPort = ( ushort ) neighbourEndPoint . Port ;
EnableSimulatorPacket enablesimpacket = ( EnableSimulatorPacket ) PacketPool . Instance . GetPacket ( PacketType . EnableSimulator ) ;
// TODO: don't create new blocks if recycling an old packet
enablesimpacket . SimulatorInfo = new EnableSimulatorPacket . SimulatorInfoBlock ( ) ;
enablesimpacket . SimulatorInfo . Handle = neighbourHandle ;
byte [ ] byteIP = neighbourIP . GetAddressBytes ( ) ;
enablesimpacket . SimulatorInfo . IP = ( uint ) byteIP [ 3 ] < < 24 ;
enablesimpacket . SimulatorInfo . IP + = ( uint ) byteIP [ 2 ] < < 16 ;
enablesimpacket . SimulatorInfo . IP + = ( uint ) byteIP [ 1 ] < < 8 ;
enablesimpacket . SimulatorInfo . IP + = ( uint ) byteIP [ 0 ] ;
enablesimpacket . SimulatorInfo . Port = neighbourPort ;
OutPacket ( enablesimpacket , ThrottleOutPacketType . Task ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <returns></returns>
public AgentCircuitData RequestClientInfo ( )
{
AgentCircuitData agentData = new AgentCircuitData ( ) ;
agentData . AgentID = AgentId ;
agentData . SessionID = m_sessionId ;
agentData . SecureSessionID = SecureSessionId ;
agentData . circuitcode = m_circuitCode ;
agentData . child = false ;
agentData . firstname = m_firstName ;
agentData . lastname = m_lastName ;
agentData . CapsPath = m_scene . GetCapsPath ( m_agentId ) ;
return agentData ;
}
2008-09-06 07:52:41 +00:00
public void CrossRegion ( ulong newRegionHandle , Vector3 pos , Vector3 lookAt , IPEndPoint externalIPEndPoint ,
2008-05-02 19:21:33 +00:00
string capsURL )
{
2008-09-06 07:52:41 +00:00
Vector3 look = new Vector3 ( lookAt . X * 10 , lookAt . Y * 10 , lookAt . Z * 10 ) ;
2008-05-02 19:21:33 +00:00
//CrossedRegionPacket newSimPack = (CrossedRegionPacket)PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
CrossedRegionPacket newSimPack = new CrossedRegionPacket ( ) ;
// TODO: don't create new blocks if recycling an old packet
newSimPack . AgentData = new CrossedRegionPacket . AgentDataBlock ( ) ;
newSimPack . AgentData . AgentID = AgentId ;
newSimPack . AgentData . SessionID = m_sessionId ;
newSimPack . Info = new CrossedRegionPacket . InfoBlock ( ) ;
newSimPack . Info . Position = pos ;
newSimPack . Info . LookAt = look ;
newSimPack . RegionData = new CrossedRegionPacket . RegionDataBlock ( ) ;
newSimPack . RegionData . RegionHandle = newRegionHandle ;
byte [ ] byteIP = externalIPEndPoint . Address . GetAddressBytes ( ) ;
newSimPack . RegionData . SimIP = ( uint ) byteIP [ 3 ] < < 24 ;
newSimPack . RegionData . SimIP + = ( uint ) byteIP [ 2 ] < < 16 ;
newSimPack . RegionData . SimIP + = ( uint ) byteIP [ 1 ] < < 8 ;
newSimPack . RegionData . SimIP + = ( uint ) byteIP [ 0 ] ;
newSimPack . RegionData . SimPort = ( ushort ) externalIPEndPoint . Port ;
2008-09-06 07:52:41 +00:00
newSimPack . RegionData . SeedCapability = Utils . StringToBytes ( capsURL ) ;
2008-05-02 19:21:33 +00:00
// Hack to get this out immediately and skip throttles
OutPacket ( newSimPack , ThrottleOutPacketType . Unknown ) ;
}
2008-06-25 20:14:47 +00:00
internal void SendMapBlockSplit ( List < MapBlockData > mapBlocks , uint flag )
2008-05-02 19:21:33 +00:00
{
MapBlockReplyPacket mapReply = ( MapBlockReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . MapBlockReply ) ;
// TODO: don't create new blocks if recycling an old packet
2008-06-12 20:19:42 +00:00
MapBlockData [ ] mapBlocks2 = mapBlocks . ToArray ( ) ;
2008-05-02 19:21:33 +00:00
mapReply . AgentData . AgentID = AgentId ;
2008-06-12 20:19:42 +00:00
mapReply . Data = new MapBlockReplyPacket . DataBlock [ mapBlocks2 . Length ] ;
2008-06-25 20:14:47 +00:00
mapReply . AgentData . Flags = flag ;
2008-05-02 19:21:33 +00:00
2008-06-12 20:19:42 +00:00
for ( int i = 0 ; i < mapBlocks2 . Length ; i + + )
2008-05-02 19:21:33 +00:00
{
mapReply . Data [ i ] = new MapBlockReplyPacket . DataBlock ( ) ;
2008-06-12 20:19:42 +00:00
mapReply . Data [ i ] . MapImageID = mapBlocks2 [ i ] . MapImageId ;
2008-06-14 02:39:27 +00:00
//m_log.Warn(mapBlocks2[i].MapImageId.ToString());
2008-06-12 20:19:42 +00:00
mapReply . Data [ i ] . X = mapBlocks2 [ i ] . X ;
mapReply . Data [ i ] . Y = mapBlocks2 [ i ] . Y ;
mapReply . Data [ i ] . WaterHeight = mapBlocks2 [ i ] . WaterHeight ;
2008-09-06 07:52:41 +00:00
mapReply . Data [ i ] . Name = Utils . StringToBytes ( mapBlocks2 [ i ] . Name ) ;
2008-06-12 20:19:42 +00:00
mapReply . Data [ i ] . RegionFlags = mapBlocks2 [ i ] . RegionFlags ;
mapReply . Data [ i ] . Access = mapBlocks2 [ i ] . Access ;
mapReply . Data [ i ] . Agents = mapBlocks2 [ i ] . Agents ;
2008-05-02 19:21:33 +00:00
}
OutPacket ( mapReply , ThrottleOutPacketType . Land ) ;
}
2008-06-25 20:14:47 +00:00
public void SendMapBlock ( List < MapBlockData > mapBlocks , uint flag )
2008-06-12 20:19:42 +00:00
{
2008-07-08 11:02:53 +00:00
2008-06-12 20:19:42 +00:00
MapBlockData [ ] mapBlocks2 = mapBlocks . ToArray ( ) ;
2008-07-08 11:02:53 +00:00
2008-06-12 20:19:42 +00:00
int maxsend = 10 ;
2008-07-08 11:02:53 +00:00
2008-06-12 20:19:42 +00:00
//int packets = Math.Ceiling(mapBlocks2.Length / maxsend);
List < MapBlockData > sendingBlocks = new List < MapBlockData > ( ) ;
2008-07-08 11:02:53 +00:00
2008-06-12 20:19:42 +00:00
for ( int i = 0 ; i < mapBlocks2 . Length ; i + + )
{
sendingBlocks . Add ( mapBlocks2 [ i ] ) ;
2008-10-02 22:14:34 +00:00
if ( ( ( i + 1 ) = = mapBlocks2 . Length ) | | ( ( ( i + 1 ) % maxsend ) = = 0 ) )
2008-06-12 20:19:42 +00:00
{
2008-06-25 20:14:47 +00:00
SendMapBlockSplit ( sendingBlocks , flag ) ;
2008-06-12 20:19:42 +00:00
sendingBlocks = new List < MapBlockData > ( ) ;
}
}
}
2008-09-06 07:52:41 +00:00
public void SendLocalTeleport ( Vector3 position , Vector3 lookAt , uint flags )
2008-05-02 19:21:33 +00:00
{
TeleportLocalPacket tpLocal = ( TeleportLocalPacket ) PacketPool . Instance . GetPacket ( PacketType . TeleportLocal ) ;
tpLocal . Info . AgentID = AgentId ;
tpLocal . Info . TeleportFlags = flags ;
tpLocal . Info . LocationID = 2 ;
tpLocal . Info . LookAt = lookAt ;
tpLocal . Info . Position = position ;
// Hack to get this out immediately and skip throttles
OutPacket ( tpLocal , ThrottleOutPacketType . Unknown ) ;
}
public void SendRegionTeleport ( ulong regionHandle , byte simAccess , IPEndPoint newRegionEndPoint , uint locationID ,
uint flags , string capsURL )
{
//TeleportFinishPacket teleport = (TeleportFinishPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
TeleportFinishPacket teleport = new TeleportFinishPacket ( ) ;
teleport . Info . AgentID = AgentId ;
teleport . Info . RegionHandle = regionHandle ;
teleport . Info . SimAccess = simAccess ;
2008-09-06 07:52:41 +00:00
teleport . Info . SeedCapability = Utils . StringToBytes ( capsURL ) ;
2008-05-02 19:21:33 +00:00
IPAddress oIP = newRegionEndPoint . Address ;
byte [ ] byteIP = oIP . GetAddressBytes ( ) ;
uint ip = ( uint ) byteIP [ 3 ] < < 24 ;
ip + = ( uint ) byteIP [ 2 ] < < 16 ;
ip + = ( uint ) byteIP [ 1 ] < < 8 ;
ip + = ( uint ) byteIP [ 0 ] ;
teleport . Info . SimIP = ip ;
teleport . Info . SimPort = ( ushort ) newRegionEndPoint . Port ;
teleport . Info . LocationID = 4 ;
teleport . Info . TeleportFlags = 1 < < 4 ;
// Hack to get this out immediately and skip throttles.
OutPacket ( teleport , ThrottleOutPacketType . Unknown ) ;
}
/// <summary>
2008-08-25 21:26:58 +00:00
/// Inform the client that a teleport attempt has failed
2008-05-02 19:21:33 +00:00
/// </summary>
public void SendTeleportFailed ( string reason )
{
TeleportFailedPacket tpFailed = ( TeleportFailedPacket ) PacketPool . Instance . GetPacket ( PacketType . TeleportFailed ) ;
tpFailed . Info . AgentID = AgentId ;
2008-09-06 07:52:41 +00:00
tpFailed . Info . Reason = Utils . StringToBytes ( reason ) ;
2008-05-02 19:21:33 +00:00
// Hack to get this out immediately and skip throttles
OutPacket ( tpFailed , ThrottleOutPacketType . Unknown ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
public void SendTeleportLocationStart ( )
{
//TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart);
TeleportStartPacket tpStart = new TeleportStartPacket ( ) ;
tpStart . Info . TeleportFlags = 16 ; // Teleport via location
// Hack to get this out immediately and skip throttles
OutPacket ( tpStart , ThrottleOutPacketType . Unknown ) ;
}
2008-09-06 07:52:41 +00:00
public void SendMoneyBalance ( UUID transaction , bool success , byte [ ] description , int balance )
2008-05-02 19:21:33 +00:00
{
MoneyBalanceReplyPacket money = ( MoneyBalanceReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . MoneyBalanceReply ) ;
money . MoneyData . AgentID = AgentId ;
money . MoneyData . TransactionID = transaction ;
money . MoneyData . TransactionSuccess = success ;
money . MoneyData . Description = description ;
money . MoneyData . MoneyBalance = balance ;
OutPacket ( money , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendPayPrice ( UUID objectID , int [ ] payPrice )
2008-05-02 19:21:33 +00:00
{
2008-05-14 05:11:23 +00:00
if ( payPrice [ 0 ] = = 0 & &
payPrice [ 1 ] = = 0 & &
payPrice [ 2 ] = = 0 & &
payPrice [ 3 ] = = 0 & &
payPrice [ 4 ] = = 0 )
2008-05-02 19:21:33 +00:00
return ;
PayPriceReplyPacket payPriceReply = ( PayPriceReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . PayPriceReply ) ;
payPriceReply . ObjectData . ObjectID = objectID ;
payPriceReply . ObjectData . DefaultPayPrice = payPrice [ 0 ] ;
2008-07-08 11:02:53 +00:00
payPriceReply . ButtonData = new PayPriceReplyPacket . ButtonDataBlock [ 4 ] ;
payPriceReply . ButtonData [ 0 ] = new PayPriceReplyPacket . ButtonDataBlock ( ) ;
2008-05-02 19:21:33 +00:00
payPriceReply . ButtonData [ 0 ] . PayButton = payPrice [ 1 ] ;
2008-07-08 11:02:53 +00:00
payPriceReply . ButtonData [ 1 ] = new PayPriceReplyPacket . ButtonDataBlock ( ) ;
2008-05-02 19:21:33 +00:00
payPriceReply . ButtonData [ 1 ] . PayButton = payPrice [ 2 ] ;
2008-07-08 11:02:53 +00:00
payPriceReply . ButtonData [ 2 ] = new PayPriceReplyPacket . ButtonDataBlock ( ) ;
2008-05-02 19:21:33 +00:00
payPriceReply . ButtonData [ 2 ] . PayButton = payPrice [ 3 ] ;
2008-07-08 11:02:53 +00:00
payPriceReply . ButtonData [ 3 ] = new PayPriceReplyPacket . ButtonDataBlock ( ) ;
2008-05-02 19:21:33 +00:00
payPriceReply . ButtonData [ 3 ] . PayButton = payPrice [ 4 ] ;
OutPacket ( payPriceReply , ThrottleOutPacketType . Task ) ;
}
public void SendStartPingCheck ( byte seq )
{
StartPingCheckPacket pc = ( StartPingCheckPacket ) PacketPool . Instance . GetPacket ( PacketType . StartPingCheck ) ;
pc . PingID . PingID = seq ;
pc . Header . Reliable = false ;
OutPacket ( pc , ThrottleOutPacketType . Unknown ) ;
}
2008-09-06 07:52:41 +00:00
public void SendKiPrimitive ( ulong regionHandle , uint localID )
2008-05-02 19:21:33 +00:00
{
KillObjectPacket kill = ( KillObjectPacket ) PacketPool . Instance . GetPacket ( PacketType . KillObject ) ;
// TODO: don't create new blocks if recycling an old packet
kill . ObjectData = new KillObjectPacket . ObjectDataBlock [ 1 ] ;
kill . ObjectData [ 0 ] = new KillObjectPacket . ObjectDataBlock ( ) ;
kill . ObjectData [ 0 ] . ID = localID ;
kill . Header . Reliable = false ;
2008-05-10 10:28:49 +00:00
kill . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( kill , ThrottleOutPacketType . Task ) ;
}
/// <summary>
/// Send information about the items contained in a folder to the client.
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// XXX This method needs some refactoring loving
/// </summary>
/// <param name="ownerID">The owner of the folder</param>
/// <param name="folderID">The id of the folder</param>
/// <param name="items">The items contained in the folder identified by folderID</param>
/// <param name="fetchFolders">Do we need to send folder information?</param>
/// <param name="fetchItems">Do we need to send item information?</param>
2008-09-06 07:52:41 +00:00
public void SendInventoryFolderDetails ( UUID ownerID , UUID folderID , List < InventoryItemBase > items ,
2008-05-02 19:21:33 +00:00
List < InventoryFolderBase > folders ,
bool fetchFolders , bool fetchItems )
2008-05-16 01:22:11 +00:00
{
// An inventory descendents packet consists of a single agent section and an inventory details
2008-05-02 19:21:33 +00:00
// section for each inventory item. The size of each inventory item is approximately 550 bytes.
// In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent
// packets containing metadata for in excess of 100 items. But in practice, there may be other
// factors (e.g. firewalls) restraining the maximum UDP packet size. See,
/ /
// http://opensimulator.org/mantis/view.php?id=226
/ /
// for one example of this kind of thing. In fact, the Linden servers appear to only send about
// 6 to 7 items at a time, so let's stick with 6
int MAX_ITEMS_PER_PACKET = 6 ;
2008-07-08 11:02:53 +00:00
//Ckrinke This variable is not used, so comment out to remove the warning from the compiler (3-21-08)
//Ckrinke uint FULL_MASK_PERMISSIONS = 2147483647;
2008-05-02 19:21:33 +00:00
if ( fetchItems )
{
InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket ( ownerID , folderID ) ;
if ( items . Count < MAX_ITEMS_PER_PACKET )
{
descend . ItemData = new InventoryDescendentsPacket . ItemDataBlock [ items . Count ] ;
}
else
{
descend . ItemData = new InventoryDescendentsPacket . ItemDataBlock [ MAX_ITEMS_PER_PACKET ] ;
}
2008-08-16 19:37:30 +00:00
// Descendents must contain the *total* number of descendents (plus folders, whether we
// fetch them or not), not the number of entries we send in this packet. For consistency,
// I'll use it for folder-requests, too, although I wasn't able to get one with
// FetchFolders = true.
// TODO this should be checked with FetchFolders = true
descend . AgentData . Descendents = items . Count + folders . Count ;
2008-05-02 19:21:33 +00:00
int count = 0 ;
int i = 0 ;
foreach ( InventoryItemBase item in items )
{
descend . ItemData [ i ] = new InventoryDescendentsPacket . ItemDataBlock ( ) ;
descend . ItemData [ i ] . ItemID = item . ID ;
descend . ItemData [ i ] . AssetID = item . AssetID ;
descend . ItemData [ i ] . CreatorID = item . Creator ;
descend . ItemData [ i ] . BaseMask = item . BasePermissions ;
2008-09-06 07:52:41 +00:00
descend . ItemData [ i ] . Description = Utils . StringToBytes ( item . Description ) ;
2008-05-02 19:21:33 +00:00
descend . ItemData [ i ] . EveryoneMask = item . EveryOnePermissions ;
descend . ItemData [ i ] . OwnerMask = item . CurrentPermissions ;
descend . ItemData [ i ] . FolderID = item . Folder ;
descend . ItemData [ i ] . InvType = ( sbyte ) item . InvType ;
2008-09-06 07:52:41 +00:00
descend . ItemData [ i ] . Name = Utils . StringToBytes ( item . Name ) ;
2008-05-02 19:21:33 +00:00
descend . ItemData [ i ] . NextOwnerMask = item . NextPermissions ;
descend . ItemData [ i ] . OwnerID = item . Owner ;
descend . ItemData [ i ] . Type = ( sbyte ) item . AssetType ;
2008-09-06 07:52:41 +00:00
//descend.ItemData[i].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
2008-05-02 19:21:33 +00:00
descend . ItemData [ i ] . GroupID = item . GroupID ;
descend . ItemData [ i ] . GroupOwned = item . GroupOwned ;
descend . ItemData [ i ] . GroupMask = 0 ;
descend . ItemData [ i ] . CreationDate = item . CreationDate ;
descend . ItemData [ i ] . SalePrice = item . SalePrice ;
descend . ItemData [ i ] . SaleType = item . SaleType ;
descend . ItemData [ i ] . Flags = item . Flags ;
descend . ItemData [ i ] . CRC =
Helpers . InventoryCRC ( descend . ItemData [ i ] . CreationDate , descend . ItemData [ i ] . SaleType ,
descend . ItemData [ i ] . InvType , descend . ItemData [ i ] . Type ,
descend . ItemData [ i ] . AssetID , descend . ItemData [ i ] . GroupID ,
descend . ItemData [ i ] . SalePrice ,
descend . ItemData [ i ] . OwnerID , descend . ItemData [ i ] . CreatorID ,
descend . ItemData [ i ] . ItemID , descend . ItemData [ i ] . FolderID ,
descend . ItemData [ i ] . EveryoneMask ,
descend . ItemData [ i ] . Flags , descend . ItemData [ i ] . OwnerMask ,
descend . ItemData [ i ] . GroupMask , item . CurrentPermissions ) ;
i + + ;
count + + ;
if ( i = = MAX_ITEMS_PER_PACKET )
{
2008-05-10 10:28:49 +00:00
descend . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( descend , ThrottleOutPacketType . Asset ) ;
if ( ( items . Count - count ) > 0 )
{
descend = CreateInventoryDescendentsPacket ( ownerID , folderID ) ;
if ( ( items . Count - count ) < MAX_ITEMS_PER_PACKET )
{
descend . ItemData = new InventoryDescendentsPacket . ItemDataBlock [ items . Count - count ] ;
}
else
{
descend . ItemData = new InventoryDescendentsPacket . ItemDataBlock [ MAX_ITEMS_PER_PACKET ] ;
}
2008-08-16 19:37:30 +00:00
descend . AgentData . Descendents = items . Count + folders . Count ;
2008-05-02 19:21:33 +00:00
i = 0 ;
}
}
}
if ( i < MAX_ITEMS_PER_PACKET )
{
OutPacket ( descend , ThrottleOutPacketType . Asset ) ;
}
}
//send subfolders
if ( fetchFolders )
{
InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket ( ownerID , folderID ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
if ( folders . Count < MAX_ITEMS_PER_PACKET )
{
descend . FolderData = new InventoryDescendentsPacket . FolderDataBlock [ folders . Count ] ;
}
else
{
descend . FolderData = new InventoryDescendentsPacket . FolderDataBlock [ MAX_ITEMS_PER_PACKET ] ;
}
// Not sure if this scenario ever actually occurs, but nonetheless we include the items
// count even if we're not sending item data for the same reasons as above.
2008-08-16 19:37:30 +00:00
descend . AgentData . Descendents = items . Count + folders . Count ;
2008-05-02 19:21:33 +00:00
int i = 0 ;
int count = 0 ;
foreach ( InventoryFolderBase folder in folders )
{
descend . FolderData [ i ] = new InventoryDescendentsPacket . FolderDataBlock ( ) ;
descend . FolderData [ i ] . FolderID = folder . ID ;
2008-09-06 07:52:41 +00:00
descend . FolderData [ i ] . Name = Utils . StringToBytes ( folder . Name ) ;
2008-05-02 19:21:33 +00:00
descend . FolderData [ i ] . ParentID = folder . ParentID ;
2008-07-08 11:02:53 +00:00
descend . FolderData [ i ] . Type = ( sbyte ) folder . Type ;
2008-05-02 19:21:33 +00:00
i + + ;
count + + ;
if ( i = = MAX_ITEMS_PER_PACKET )
{
OutPacket ( descend , ThrottleOutPacketType . Asset ) ;
if ( ( folders . Count - count ) > 0 )
{
descend = CreateInventoryDescendentsPacket ( ownerID , folderID ) ;
if ( ( folders . Count - count ) < MAX_ITEMS_PER_PACKET )
{
descend . FolderData =
new InventoryDescendentsPacket . FolderDataBlock [ folders . Count - count ] ;
}
else
{
descend . FolderData =
new InventoryDescendentsPacket . FolderDataBlock [ MAX_ITEMS_PER_PACKET ] ;
}
2008-08-16 19:37:30 +00:00
descend . AgentData . Descendents = items . Count + folders . Count ;
2008-05-02 19:21:33 +00:00
i = 0 ;
}
}
}
if ( i < MAX_ITEMS_PER_PACKET )
{
OutPacket ( descend , ThrottleOutPacketType . Asset ) ;
}
}
}
2008-09-06 07:52:41 +00:00
private InventoryDescendentsPacket CreateInventoryDescendentsPacket ( UUID ownerID , UUID folderID )
2008-05-02 19:21:33 +00:00
{
InventoryDescendentsPacket descend = ( InventoryDescendentsPacket ) PacketPool . Instance . GetPacket ( PacketType . InventoryDescendents ) ;
2008-05-10 10:28:49 +00:00
descend . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
descend . AgentData . AgentID = AgentId ;
descend . AgentData . OwnerID = ownerID ;
descend . AgentData . FolderID = folderID ;
descend . AgentData . Version = 1 ;
return descend ;
}
2008-09-06 07:52:41 +00:00
public void SendInventoryItemDetails ( UUID ownerID , InventoryItemBase item )
2008-05-02 19:21:33 +00:00
{
uint FULL_MASK_PERMISSIONS = ( uint ) PermissionMask . All ;
FetchInventoryReplyPacket inventoryReply = ( FetchInventoryReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . FetchInventoryReply ) ;
// TODO: don't create new blocks if recycling an old packet
inventoryReply . AgentData . AgentID = AgentId ;
inventoryReply . InventoryData = new FetchInventoryReplyPacket . InventoryDataBlock [ 1 ] ;
inventoryReply . InventoryData [ 0 ] = new FetchInventoryReplyPacket . InventoryDataBlock ( ) ;
inventoryReply . InventoryData [ 0 ] . ItemID = item . ID ;
inventoryReply . InventoryData [ 0 ] . AssetID = item . AssetID ;
inventoryReply . InventoryData [ 0 ] . CreatorID = item . Creator ;
inventoryReply . InventoryData [ 0 ] . BaseMask = item . BasePermissions ;
inventoryReply . InventoryData [ 0 ] . CreationDate =
( int ) ( DateTime . UtcNow - new DateTime ( 1970 , 1 , 1 ) ) . TotalSeconds ;
2008-09-06 07:52:41 +00:00
inventoryReply . InventoryData [ 0 ] . Description = Utils . StringToBytes ( item . Description ) ;
2008-05-02 19:21:33 +00:00
inventoryReply . InventoryData [ 0 ] . EveryoneMask = item . EveryOnePermissions ;
inventoryReply . InventoryData [ 0 ] . FolderID = item . Folder ;
inventoryReply . InventoryData [ 0 ] . InvType = ( sbyte ) item . InvType ;
2008-09-06 07:52:41 +00:00
inventoryReply . InventoryData [ 0 ] . Name = Utils . StringToBytes ( item . Name ) ;
2008-05-02 19:21:33 +00:00
inventoryReply . InventoryData [ 0 ] . NextOwnerMask = item . NextPermissions ;
inventoryReply . InventoryData [ 0 ] . OwnerID = item . Owner ;
inventoryReply . InventoryData [ 0 ] . OwnerMask = item . CurrentPermissions ;
inventoryReply . InventoryData [ 0 ] . Type = ( sbyte ) item . AssetType ;
2008-09-06 07:52:41 +00:00
//inventoryReply.InventoryData[0].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
2008-05-02 19:21:33 +00:00
inventoryReply . InventoryData [ 0 ] . GroupID = item . GroupID ;
inventoryReply . InventoryData [ 0 ] . GroupOwned = item . GroupOwned ;
inventoryReply . InventoryData [ 0 ] . GroupMask = 0 ;
inventoryReply . InventoryData [ 0 ] . Flags = item . Flags ;
inventoryReply . InventoryData [ 0 ] . SalePrice = item . SalePrice ;
inventoryReply . InventoryData [ 0 ] . SaleType = item . SaleType ;
inventoryReply . InventoryData [ 0 ] . CRC =
Helpers . InventoryCRC ( 1000 , 0 , inventoryReply . InventoryData [ 0 ] . InvType ,
inventoryReply . InventoryData [ 0 ] . Type , inventoryReply . InventoryData [ 0 ] . AssetID ,
inventoryReply . InventoryData [ 0 ] . GroupID , 100 ,
inventoryReply . InventoryData [ 0 ] . OwnerID , inventoryReply . InventoryData [ 0 ] . CreatorID ,
inventoryReply . InventoryData [ 0 ] . ItemID , inventoryReply . InventoryData [ 0 ] . FolderID ,
FULL_MASK_PERMISSIONS , 1 , FULL_MASK_PERMISSIONS , FULL_MASK_PERMISSIONS ,
FULL_MASK_PERMISSIONS ) ;
2008-05-10 10:28:49 +00:00
inventoryReply . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( inventoryReply , ThrottleOutPacketType . Asset ) ;
}
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
/// <see>IClientAPI.SendBulkUpdateInventory(InventoryItemBase)</see>
2008-05-16 01:22:11 +00:00
public void SendBulkUpdateInventory ( InventoryItemBase item )
{
2008-05-02 19:21:33 +00:00
uint FULL_MASK_PERMISSIONS = ( uint ) PermissionMask . All ;
2008-05-16 01:22:11 +00:00
BulkUpdateInventoryPacket bulkUpdate
2008-05-02 19:21:33 +00:00
= ( BulkUpdateInventoryPacket ) PacketPool . Instance . GetPacket ( PacketType . BulkUpdateInventory ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
bulkUpdate . AgentData . AgentID = AgentId ;
2008-09-06 07:52:41 +00:00
bulkUpdate . AgentData . TransactionID = UUID . Random ( ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
bulkUpdate . FolderData = new BulkUpdateInventoryPacket . FolderDataBlock [ 1 ] ;
bulkUpdate . FolderData [ 0 ] = new BulkUpdateInventoryPacket . FolderDataBlock ( ) ;
2008-09-06 07:52:41 +00:00
bulkUpdate . FolderData [ 0 ] . FolderID = UUID . Zero ;
bulkUpdate . FolderData [ 0 ] . ParentID = UUID . Zero ;
2008-05-02 19:21:33 +00:00
bulkUpdate . FolderData [ 0 ] . Type = - 1 ;
bulkUpdate . FolderData [ 0 ] . Name = new byte [ 0 ] ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
bulkUpdate . ItemData = new BulkUpdateInventoryPacket . ItemDataBlock [ 1 ] ;
2008-05-16 01:22:11 +00:00
bulkUpdate . ItemData [ 0 ] = new BulkUpdateInventoryPacket . ItemDataBlock ( ) ;
2008-05-02 19:21:33 +00:00
bulkUpdate . ItemData [ 0 ] . ItemID = item . ID ;
bulkUpdate . ItemData [ 0 ] . AssetID = item . AssetID ;
bulkUpdate . ItemData [ 0 ] . CreatorID = item . Creator ;
bulkUpdate . ItemData [ 0 ] . BaseMask = item . BasePermissions ;
bulkUpdate . ItemData [ 0 ] . CreationDate = 1000 ;
2008-09-06 07:52:41 +00:00
bulkUpdate . ItemData [ 0 ] . Description = Utils . StringToBytes ( item . Description ) ;
2008-05-02 19:21:33 +00:00
bulkUpdate . ItemData [ 0 ] . EveryoneMask = item . EveryOnePermissions ;
bulkUpdate . ItemData [ 0 ] . FolderID = item . Folder ;
bulkUpdate . ItemData [ 0 ] . InvType = ( sbyte ) item . InvType ;
2008-09-06 07:52:41 +00:00
bulkUpdate . ItemData [ 0 ] . Name = Utils . StringToBytes ( item . Name ) ;
2008-05-02 19:21:33 +00:00
bulkUpdate . ItemData [ 0 ] . NextOwnerMask = item . NextPermissions ;
bulkUpdate . ItemData [ 0 ] . OwnerID = item . Owner ;
bulkUpdate . ItemData [ 0 ] . OwnerMask = item . CurrentPermissions ;
bulkUpdate . ItemData [ 0 ] . Type = ( sbyte ) item . AssetType ;
2008-09-06 07:52:41 +00:00
//bulkUpdate.ItemData[0].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
2008-05-02 19:21:33 +00:00
bulkUpdate . ItemData [ 0 ] . GroupID = item . GroupID ;
bulkUpdate . ItemData [ 0 ] . GroupOwned = item . GroupOwned ;
bulkUpdate . ItemData [ 0 ] . GroupMask = 0 ;
bulkUpdate . ItemData [ 0 ] . Flags = item . Flags ;
bulkUpdate . ItemData [ 0 ] . SalePrice = item . SalePrice ;
bulkUpdate . ItemData [ 0 ] . SaleType = item . SaleType ;
bulkUpdate . ItemData [ 0 ] . CRC =
Helpers . InventoryCRC ( 1000 , 0 , bulkUpdate . ItemData [ 0 ] . InvType ,
bulkUpdate . ItemData [ 0 ] . Type , bulkUpdate . ItemData [ 0 ] . AssetID ,
bulkUpdate . ItemData [ 0 ] . GroupID , 100 ,
bulkUpdate . ItemData [ 0 ] . OwnerID , bulkUpdate . ItemData [ 0 ] . CreatorID ,
bulkUpdate . ItemData [ 0 ] . ItemID , bulkUpdate . ItemData [ 0 ] . FolderID ,
FULL_MASK_PERMISSIONS , 1 , FULL_MASK_PERMISSIONS , FULL_MASK_PERMISSIONS ,
FULL_MASK_PERMISSIONS ) ;
2008-05-10 10:28:49 +00:00
bulkUpdate . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( bulkUpdate , ThrottleOutPacketType . Asset ) ;
}
/// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see>
public void SendInventoryItemCreateUpdate ( InventoryItemBase Item )
{
uint FULL_MASK_PERMISSIONS = ( uint ) PermissionMask . All ;
2008-05-16 01:22:11 +00:00
UpdateCreateInventoryItemPacket InventoryReply
2008-05-02 19:21:33 +00:00
= ( UpdateCreateInventoryItemPacket ) PacketPool . Instance . GetPacket (
PacketType . UpdateCreateInventoryItem ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
// TODO: don't create new blocks if recycling an old packet
InventoryReply . AgentData . AgentID = AgentId ;
InventoryReply . AgentData . SimApproved = true ;
InventoryReply . InventoryData = new UpdateCreateInventoryItemPacket . InventoryDataBlock [ 1 ] ;
InventoryReply . InventoryData [ 0 ] = new UpdateCreateInventoryItemPacket . InventoryDataBlock ( ) ;
InventoryReply . InventoryData [ 0 ] . ItemID = Item . ID ;
InventoryReply . InventoryData [ 0 ] . AssetID = Item . AssetID ;
InventoryReply . InventoryData [ 0 ] . CreatorID = Item . Creator ;
InventoryReply . InventoryData [ 0 ] . BaseMask = Item . BasePermissions ;
2008-09-06 07:52:41 +00:00
InventoryReply . InventoryData [ 0 ] . Description = Utils . StringToBytes ( Item . Description ) ;
2008-05-02 19:21:33 +00:00
InventoryReply . InventoryData [ 0 ] . EveryoneMask = Item . EveryOnePermissions ;
InventoryReply . InventoryData [ 0 ] . FolderID = Item . Folder ;
InventoryReply . InventoryData [ 0 ] . InvType = ( sbyte ) Item . InvType ;
2008-09-06 07:52:41 +00:00
InventoryReply . InventoryData [ 0 ] . Name = Utils . StringToBytes ( Item . Name ) ;
2008-05-02 19:21:33 +00:00
InventoryReply . InventoryData [ 0 ] . NextOwnerMask = Item . NextPermissions ;
InventoryReply . InventoryData [ 0 ] . OwnerID = Item . Owner ;
InventoryReply . InventoryData [ 0 ] . OwnerMask = Item . CurrentPermissions ;
InventoryReply . InventoryData [ 0 ] . Type = ( sbyte ) Item . AssetType ;
2008-09-06 07:52:41 +00:00
//InventoryReply.InventoryData[0].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
2008-05-02 19:21:33 +00:00
InventoryReply . InventoryData [ 0 ] . GroupID = Item . GroupID ;
InventoryReply . InventoryData [ 0 ] . GroupOwned = Item . GroupOwned ;
InventoryReply . InventoryData [ 0 ] . GroupMask = 0 ;
InventoryReply . InventoryData [ 0 ] . Flags = Item . Flags ;
InventoryReply . InventoryData [ 0 ] . SalePrice = Item . SalePrice ;
InventoryReply . InventoryData [ 0 ] . SaleType = Item . SaleType ;
2008-07-13 18:57:13 +00:00
InventoryReply . InventoryData [ 0 ] . CreationDate = Item . CreationDate ;
2008-05-02 19:21:33 +00:00
InventoryReply . InventoryData [ 0 ] . CRC =
Helpers . InventoryCRC ( 1000 , 0 , InventoryReply . InventoryData [ 0 ] . InvType ,
InventoryReply . InventoryData [ 0 ] . Type , InventoryReply . InventoryData [ 0 ] . AssetID ,
InventoryReply . InventoryData [ 0 ] . GroupID , 100 ,
InventoryReply . InventoryData [ 0 ] . OwnerID , InventoryReply . InventoryData [ 0 ] . CreatorID ,
InventoryReply . InventoryData [ 0 ] . ItemID , InventoryReply . InventoryData [ 0 ] . FolderID ,
FULL_MASK_PERMISSIONS , 1 , FULL_MASK_PERMISSIONS , FULL_MASK_PERMISSIONS ,
FULL_MASK_PERMISSIONS ) ;
2008-05-10 10:28:49 +00:00
InventoryReply . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( InventoryReply , ThrottleOutPacketType . Asset ) ;
}
2008-09-06 07:52:41 +00:00
public void SendRemoveInventoryItem ( UUID itemID )
2008-05-02 19:21:33 +00:00
{
RemoveInventoryItemPacket remove = ( RemoveInventoryItemPacket ) PacketPool . Instance . GetPacket ( PacketType . RemoveInventoryItem ) ;
// TODO: don't create new blocks if recycling an old packet
remove . AgentData . AgentID = AgentId ;
remove . AgentData . SessionID = m_sessionId ;
remove . InventoryData = new RemoveInventoryItemPacket . InventoryDataBlock [ 1 ] ;
remove . InventoryData [ 0 ] = new RemoveInventoryItemPacket . InventoryDataBlock ( ) ;
remove . InventoryData [ 0 ] . ItemID = itemID ;
2008-05-10 10:28:49 +00:00
remove . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( remove , ThrottleOutPacketType . Asset ) ;
}
2008-05-06 02:47:14 +00:00
public void SendTakeControls ( int controls , bool passToAgent , bool TakeControls )
{
ScriptControlChangePacket scriptcontrol = ( ScriptControlChangePacket ) PacketPool . Instance . GetPacket ( PacketType . ScriptControlChange ) ;
ScriptControlChangePacket . DataBlock [ ] data = new ScriptControlChangePacket . DataBlock [ 1 ] ;
ScriptControlChangePacket . DataBlock ddata = new ScriptControlChangePacket . DataBlock ( ) ;
ddata . Controls = ( uint ) controls ;
ddata . PassToAgent = passToAgent ;
ddata . TakeControls = TakeControls ;
data [ 0 ] = ddata ;
scriptcontrol . Data = data ;
OutPacket ( scriptcontrol , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendTaskInventory ( UUID taskID , short serial , byte [ ] fileName )
2008-05-02 19:21:33 +00:00
{
ReplyTaskInventoryPacket replytask = ( ReplyTaskInventoryPacket ) PacketPool . Instance . GetPacket ( PacketType . ReplyTaskInventory ) ;
replytask . InventoryData . TaskID = taskID ;
replytask . InventoryData . Serial = serial ;
replytask . InventoryData . Filename = fileName ;
OutPacket ( replytask , ThrottleOutPacketType . Asset ) ;
}
public void SendXferPacket ( ulong xferID , uint packet , byte [ ] data )
{
SendXferPacketPacket sendXfer = ( SendXferPacketPacket ) PacketPool . Instance . GetPacket ( PacketType . SendXferPacket ) ;
sendXfer . XferID . ID = xferID ;
sendXfer . XferID . Packet = packet ;
sendXfer . DataPacket . Data = data ;
OutPacket ( sendXfer , ThrottleOutPacketType . Task ) ;
}
public void SendEconomyData ( float EnergyEfficiency , int ObjectCapacity , int ObjectCount , int PriceEnergyUnit ,
int PriceGroupCreate , int PriceObjectClaim , float PriceObjectRent , float PriceObjectScaleFactor ,
int PriceParcelClaim , float PriceParcelClaimFactor , int PriceParcelRent , int PricePublicObjectDecay ,
int PricePublicObjectDelete , int PriceRentLight , int PriceUpload , int TeleportMinPrice , float TeleportPriceExponent )
{
EconomyDataPacket economyData = ( EconomyDataPacket ) PacketPool . Instance . GetPacket ( PacketType . EconomyData ) ;
economyData . Info . EnergyEfficiency = EnergyEfficiency ;
economyData . Info . ObjectCapacity = ObjectCapacity ;
economyData . Info . ObjectCount = ObjectCount ;
economyData . Info . PriceEnergyUnit = PriceEnergyUnit ;
economyData . Info . PriceGroupCreate = PriceGroupCreate ;
economyData . Info . PriceObjectClaim = PriceObjectClaim ;
economyData . Info . PriceObjectRent = PriceObjectRent ;
economyData . Info . PriceObjectScaleFactor = PriceObjectScaleFactor ;
economyData . Info . PriceParcelClaim = PriceParcelClaim ;
economyData . Info . PriceParcelClaimFactor = PriceParcelClaimFactor ;
economyData . Info . PriceParcelRent = PriceParcelRent ;
economyData . Info . PricePublicObjectDecay = PricePublicObjectDecay ;
economyData . Info . PricePublicObjectDelete = PricePublicObjectDelete ;
economyData . Info . PriceRentLight = PriceRentLight ;
economyData . Info . PriceUpload = PriceUpload ;
economyData . Info . TeleportMinPrice = TeleportMinPrice ;
economyData . Info . TeleportPriceExponent = TeleportPriceExponent ;
economyData . Header . Reliable = true ;
OutPacket ( economyData , ThrottleOutPacketType . Unknown ) ;
}
2008-05-07 20:31:48 +00:00
public void SendAvatarPickerReply ( AvatarPickerReplyAgentDataArgs AgentData , List < AvatarPickerReplyDataArgs > Data )
2008-05-02 19:21:33 +00:00
{
2008-05-07 20:31:48 +00:00
//construct the AvatarPickerReply packet.
AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket ( ) ;
replyPacket . AgentData . AgentID = AgentData . AgentID ;
replyPacket . AgentData . QueryID = AgentData . QueryID ;
2008-05-08 20:45:50 +00:00
//int i = 0;
2008-05-07 20:31:48 +00:00
List < AvatarPickerReplyPacket . DataBlock > data_block = new List < AvatarPickerReplyPacket . DataBlock > ( ) ;
foreach ( AvatarPickerReplyDataArgs arg in Data )
{
AvatarPickerReplyPacket . DataBlock db = new AvatarPickerReplyPacket . DataBlock ( ) ;
db . AvatarID = arg . AvatarID ;
db . FirstName = arg . FirstName ;
db . LastName = arg . LastName ;
data_block . Add ( db ) ;
}
replyPacket . Data = data_block . ToArray ( ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( replyPacket , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendAgentDataUpdate ( UUID agentid , UUID activegroupid , string firstname , string lastname , ulong grouppowers , string groupname , string grouptitle )
2008-05-02 19:21:33 +00:00
{
2008-05-17 00:16:16 +00:00
m_activeGroupID = activegroupid ;
m_activeGroupName = groupname ;
m_activeGroupPowers = grouppowers ;
2008-05-02 19:21:33 +00:00
AgentDataUpdatePacket sendAgentDataUpdate = ( AgentDataUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . AgentDataUpdate ) ;
sendAgentDataUpdate . AgentData . ActiveGroupID = activegroupid ;
sendAgentDataUpdate . AgentData . AgentID = agentid ;
2008-09-06 07:52:41 +00:00
sendAgentDataUpdate . AgentData . FirstName = Utils . StringToBytes ( firstname ) ;
sendAgentDataUpdate . AgentData . GroupName = Utils . StringToBytes ( groupname ) ;
2008-05-02 19:21:33 +00:00
sendAgentDataUpdate . AgentData . GroupPowers = grouppowers ;
2008-09-06 07:52:41 +00:00
sendAgentDataUpdate . AgentData . GroupTitle = Utils . StringToBytes ( grouptitle ) ;
sendAgentDataUpdate . AgentData . LastName = Utils . StringToBytes ( lastname ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( sendAgentDataUpdate , ThrottleOutPacketType . Task ) ;
}
/// <summary>
/// Send an alert message to the client. On the Linden client (tested 1.19.1.4), this pops up a brief duration
/// blue information box in the bottom right hand corner.
/// </summary>
/// <param name="message"></param>
public void SendAlertMessage ( string message )
{
AlertMessagePacket alertPack = ( AlertMessagePacket ) PacketPool . Instance . GetPacket ( PacketType . AlertMessage ) ;
2008-09-06 07:52:41 +00:00
alertPack . AlertData . Message = Utils . StringToBytes ( message ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( alertPack , ThrottleOutPacketType . Task ) ;
}
/// <summary>
/// Send an agent alert message to the client.
/// </summary>
/// <param name="message"></param>
/// <param name="modal">On the linden client, if this true then it displays a one button text box placed in the
2008-05-16 01:22:11 +00:00
/// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
2008-05-02 19:21:33 +00:00
/// the AlertMessage packet).</param>
public void SendAgentAlertMessage ( string message , bool modal )
2008-06-05 01:20:17 +00:00
{
OutPacket ( BuildAgentAlertPacket ( message , modal ) , ThrottleOutPacketType . Task ) ;
}
2008-07-08 11:02:53 +00:00
2008-06-05 01:20:17 +00:00
/// <summary>
/// Construct an agent alert packet
/// </summary>
/// <param name="message"></param>
/// <param name="modal"></param>
/// <returns></returns>
protected AgentAlertMessagePacket BuildAgentAlertPacket ( string message , bool modal )
2008-05-02 19:21:33 +00:00
{
AgentAlertMessagePacket alertPack = ( AgentAlertMessagePacket ) PacketPool . Instance . GetPacket ( PacketType . AgentAlertMessage ) ;
alertPack . AgentData . AgentID = AgentId ;
2008-09-06 07:52:41 +00:00
alertPack . AlertData . Message = Utils . StringToBytes ( message ) ;
2008-05-02 19:21:33 +00:00
alertPack . AlertData . Modal = modal ;
2008-07-08 11:02:53 +00:00
2008-06-05 01:20:17 +00:00
return alertPack ;
2008-05-02 19:21:33 +00:00
}
2008-09-06 07:52:41 +00:00
public void SendLoadURL ( string objectname , UUID objectID , UUID ownerID , bool groupOwned , string message ,
2008-05-02 19:21:33 +00:00
string url )
{
LoadURLPacket loadURL = ( LoadURLPacket ) PacketPool . Instance . GetPacket ( PacketType . LoadURL ) ;
2008-09-06 07:52:41 +00:00
loadURL . Data . ObjectName = Utils . StringToBytes ( objectname ) ;
2008-05-02 19:21:33 +00:00
loadURL . Data . ObjectID = objectID ;
loadURL . Data . OwnerID = ownerID ;
loadURL . Data . OwnerIsGroup = groupOwned ;
2008-09-06 07:52:41 +00:00
loadURL . Data . Message = Utils . StringToBytes ( message ) ;
loadURL . Data . URL = Utils . StringToBytes ( url ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( loadURL , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendDialog ( string objectname , UUID objectID , UUID ownerID , string msg , UUID textureID , int ch , string [ ] buttonlabels )
2008-05-02 19:21:33 +00:00
{
ScriptDialogPacket dialog = ( ScriptDialogPacket ) PacketPool . Instance . GetPacket ( PacketType . ScriptDialog ) ;
dialog . Data . ObjectID = objectID ;
2008-09-06 07:52:41 +00:00
dialog . Data . ObjectName = Utils . StringToBytes ( objectname ) ;
dialog . Data . FirstName = Utils . StringToBytes ( this . FirstName ) ;
dialog . Data . LastName = Utils . StringToBytes ( this . LastName ) ;
dialog . Data . Message = Utils . StringToBytes ( msg ) ;
2008-05-02 19:21:33 +00:00
dialog . Data . ImageID = textureID ;
dialog . Data . ChatChannel = ch ;
ScriptDialogPacket . ButtonsBlock [ ] buttons = new ScriptDialogPacket . ButtonsBlock [ buttonlabels . Length ] ;
for ( int i = 0 ; i < buttonlabels . Length ; i + + )
{
buttons [ i ] = new ScriptDialogPacket . ButtonsBlock ( ) ;
2008-09-06 07:52:41 +00:00
buttons [ i ] . ButtonLabel = Utils . StringToBytes ( buttonlabels [ i ] ) ;
2008-05-02 19:21:33 +00:00
}
dialog . Buttons = buttons ;
OutPacket ( dialog , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendPreLoadSound ( UUID objectID , UUID ownerID , UUID soundID )
2008-05-02 19:21:33 +00:00
{
PreloadSoundPacket preSound = ( PreloadSoundPacket ) PacketPool . Instance . GetPacket ( PacketType . PreloadSound ) ;
// TODO: don't create new blocks if recycling an old packet
preSound . DataBlock = new PreloadSoundPacket . DataBlockBlock [ 1 ] ;
preSound . DataBlock [ 0 ] = new PreloadSoundPacket . DataBlockBlock ( ) ;
preSound . DataBlock [ 0 ] . ObjectID = objectID ;
preSound . DataBlock [ 0 ] . OwnerID = ownerID ;
preSound . DataBlock [ 0 ] . SoundID = soundID ;
2008-05-10 10:28:49 +00:00
preSound . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( preSound , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendPlayAttachedSound ( UUID soundID , UUID objectID , UUID ownerID , float gain , byte flags )
2008-05-02 19:21:33 +00:00
{
AttachedSoundPacket sound = ( AttachedSoundPacket ) PacketPool . Instance . GetPacket ( PacketType . AttachedSound ) ;
sound . DataBlock . SoundID = soundID ;
sound . DataBlock . ObjectID = objectID ;
sound . DataBlock . OwnerID = ownerID ;
sound . DataBlock . Gain = gain ;
sound . DataBlock . Flags = flags ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
OutPacket ( sound , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendTriggeredSound ( UUID soundID , UUID ownerID , UUID objectID , UUID parentID , ulong handle , Vector3 position , float gain )
2008-05-02 19:21:33 +00:00
{
SoundTriggerPacket sound = ( SoundTriggerPacket ) PacketPool . Instance . GetPacket ( PacketType . SoundTrigger ) ;
sound . SoundData . SoundID = soundID ;
sound . SoundData . OwnerID = ownerID ;
sound . SoundData . ObjectID = objectID ;
sound . SoundData . ParentID = parentID ;
sound . SoundData . Handle = handle ;
sound . SoundData . Position = position ;
sound . SoundData . Gain = gain ;
OutPacket ( sound , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendAttachedSoundGainChange ( UUID objectID , float gain )
2008-05-02 19:21:33 +00:00
{
AttachedSoundGainChangePacket sound = ( AttachedSoundGainChangePacket ) PacketPool . Instance . GetPacket ( PacketType . AttachedSoundGainChange ) ;
sound . DataBlock . ObjectID = objectID ;
sound . DataBlock . Gain = gain ;
OutPacket ( sound , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendSunPos ( Vector3 Position , Vector3 Velocity , ulong CurrentTime , uint SecondsPerSunCycle , uint SecondsPerYear , float OrbitalPosition )
2008-05-02 19:21:33 +00:00
{
SimulatorViewerTimeMessagePacket viewertime = ( SimulatorViewerTimeMessagePacket ) PacketPool . Instance . GetPacket ( PacketType . SimulatorViewerTimeMessage ) ;
2008-07-08 11:02:53 +00:00
viewertime . TimeInfo . SunDirection = Position ;
2008-05-07 14:15:59 +00:00
viewertime . TimeInfo . SunAngVelocity = Velocity ;
viewertime . TimeInfo . UsecSinceStart = CurrentTime ;
2008-07-08 11:02:53 +00:00
viewertime . TimeInfo . SecPerDay = SecondsPerSunCycle ;
viewertime . TimeInfo . SecPerYear = SecondsPerYear ;
viewertime . TimeInfo . SunPhase = OrbitalPosition ;
viewertime . Header . Reliable = false ;
2008-05-10 10:28:49 +00:00
viewertime . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( viewertime , ThrottleOutPacketType . Task ) ;
}
2008-05-07 14:15:59 +00:00
// Currently Deprecated
2008-05-02 19:21:33 +00:00
public void SendViewerTime ( int phase )
{
2008-05-07 14:15:59 +00:00
/ *
2008-05-02 19:21:33 +00:00
Console . WriteLine ( "SunPhase: {0}" , phase ) ;
SimulatorViewerTimeMessagePacket viewertime = ( SimulatorViewerTimeMessagePacket ) PacketPool . Instance . GetPacket ( PacketType . SimulatorViewerTimeMessage ) ;
//viewertime.TimeInfo.SecPerDay = 86400;
//viewertime.TimeInfo.SecPerYear = 31536000;
viewertime . TimeInfo . SecPerDay = 1000 ;
viewertime . TimeInfo . SecPerYear = 365000 ;
viewertime . TimeInfo . SunPhase = 1 ;
int sunPhase = ( phase + 2 ) / 2 ;
if ( ( sunPhase < 6 ) | | ( sunPhase > 36 ) )
{
2008-09-06 07:52:41 +00:00
viewertime . TimeInfo . SunDirection = new Vector3 ( 0f , 0.8f , - 0.8f ) ;
2008-05-02 19:21:33 +00:00
Console . WriteLine ( "sending night" ) ;
}
else
{
if ( sunPhase < 12 )
{
sunPhase = 12 ;
}
sunPhase = sunPhase - 12 ;
float yValue = 0.1f * ( sunPhase ) ;
Console . WriteLine ( "Computed SunPhase: {0}, yValue: {1}" , sunPhase , yValue ) ;
if ( yValue > 1.2f )
{
yValue = yValue - 1.2f ;
}
yValue = Util . Clip ( yValue , 0 , 1 ) ;
if ( sunPhase < 14 )
{
yValue = 1 - yValue ;
}
if ( sunPhase < 12 )
{
yValue * = - 1 ;
}
2008-09-06 07:52:41 +00:00
viewertime . TimeInfo . SunDirection = new Vector3 ( 0f , yValue , 0.3f ) ;
2008-05-02 19:21:33 +00:00
Console . WriteLine ( "sending sun update " + yValue ) ;
}
2008-09-06 07:52:41 +00:00
viewertime . TimeInfo . SunAngVelocity = new Vector3 ( 0 , 0.0f , 10.0f ) ;
2008-05-02 19:21:33 +00:00
viewertime . TimeInfo . UsecSinceStart = ( ulong ) Util . UnixTimeSinceEpoch ( ) ;
viewertime . Header . Reliable = false ;
OutPacket ( viewertime , ThrottleOutPacketType . Task ) ;
2008-05-07 14:15:59 +00:00
* /
2008-05-02 19:21:33 +00:00
}
2008-09-06 07:52:41 +00:00
public void SendAvatarProperties ( UUID avatarID , string aboutText , string bornOn , Byte [ ] charterMember ,
string flAbout , uint flags , UUID flImageID , UUID imageID , string profileURL ,
UUID partnerID )
2008-05-02 19:21:33 +00:00
{
AvatarPropertiesReplyPacket avatarReply = ( AvatarPropertiesReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . AvatarPropertiesReply ) ;
avatarReply . AgentData . AgentID = AgentId ;
avatarReply . AgentData . AvatarID = avatarID ;
if ( aboutText ! = null )
2008-09-06 07:52:41 +00:00
avatarReply . PropertiesData . AboutText = Utils . StringToBytes ( aboutText ) ;
2008-05-02 19:21:33 +00:00
else
2008-09-06 07:52:41 +00:00
avatarReply . PropertiesData . AboutText = Utils . StringToBytes ( "" ) ;
avatarReply . PropertiesData . BornOn = Utils . StringToBytes ( bornOn ) ;
2008-08-15 19:19:24 +00:00
avatarReply . PropertiesData . CharterMember = charterMember ;
2008-05-02 19:21:33 +00:00
if ( flAbout ! = null )
2008-09-06 07:52:41 +00:00
avatarReply . PropertiesData . FLAboutText = Utils . StringToBytes ( flAbout ) ;
2008-05-02 19:21:33 +00:00
else
2008-09-06 07:52:41 +00:00
avatarReply . PropertiesData . FLAboutText = Utils . StringToBytes ( "" ) ;
2008-08-15 19:19:24 +00:00
avatarReply . PropertiesData . Flags = flags ;
2008-05-02 19:21:33 +00:00
avatarReply . PropertiesData . FLImageID = flImageID ;
avatarReply . PropertiesData . ImageID = imageID ;
2008-09-06 07:52:41 +00:00
avatarReply . PropertiesData . ProfileURL = Utils . StringToBytes ( profileURL ) ;
2008-05-02 19:21:33 +00:00
avatarReply . PropertiesData . PartnerID = partnerID ;
OutPacket ( avatarReply , ThrottleOutPacketType . Task ) ;
}
# endregion
2008-08-20 01:48:51 +00:00
// Gesture
2008-05-02 19:21:33 +00:00
#region Appearance/ Wearables Methods
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="wearables"></param>
public void SendWearables ( AvatarWearable [ ] wearables , int serial )
{
AgentWearablesUpdatePacket aw = ( AgentWearablesUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . AgentWearablesUpdate ) ;
aw . AgentData . AgentID = AgentId ;
aw . AgentData . SerialNum = ( uint ) serial ;
aw . AgentData . SessionID = m_sessionId ;
// TODO: don't create new blocks if recycling an old packet
aw . WearableData = new AgentWearablesUpdatePacket . WearableDataBlock [ 13 ] ;
AgentWearablesUpdatePacket . WearableDataBlock awb ;
for ( int i = 0 ; i < wearables . Length ; i + + )
{
awb = new AgentWearablesUpdatePacket . WearableDataBlock ( ) ;
awb . WearableType = ( byte ) i ;
awb . AssetID = wearables [ i ] . AssetID ;
awb . ItemID = wearables [ i ] . ItemID ;
aw . WearableData [ i ] = awb ;
}
OutPacket ( aw , ThrottleOutPacketType . Task ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="agentID"></param>
/// <param name="visualParams"></param>
/// <param name="textureEntry"></param>
2008-09-06 07:52:41 +00:00
public void SendAppearance ( UUID agentID , byte [ ] visualParams , byte [ ] textureEntry )
2008-05-02 19:21:33 +00:00
{
AvatarAppearancePacket avp = ( AvatarAppearancePacket ) PacketPool . Instance . GetPacket ( PacketType . AvatarAppearance ) ;
// TODO: don't create new blocks if recycling an old packet
avp . VisualParam = new AvatarAppearancePacket . VisualParamBlock [ 218 ] ;
avp . ObjectData . TextureEntry = textureEntry ;
AvatarAppearancePacket . VisualParamBlock avblock = null ;
for ( int i = 0 ; i < visualParams . Length ; i + + )
{
avblock = new AvatarAppearancePacket . VisualParamBlock ( ) ;
avblock . ParamValue = visualParams [ i ] ;
avp . VisualParam [ i ] = avblock ;
}
avp . Sender . IsTrial = false ;
avp . Sender . ID = agentID ;
OutPacket ( avp , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendAnimations ( UUID [ ] animations , int [ ] seqs , UUID sourceAgentId )
2008-05-02 19:21:33 +00:00
{
AvatarAnimationPacket ani = ( AvatarAnimationPacket ) PacketPool . Instance . GetPacket ( PacketType . AvatarAnimation ) ;
// TODO: don't create new blocks if recycling an old packet
ani . AnimationSourceList = new AvatarAnimationPacket . AnimationSourceListBlock [ 1 ] ;
ani . AnimationSourceList [ 0 ] = new AvatarAnimationPacket . AnimationSourceListBlock ( ) ;
ani . AnimationSourceList [ 0 ] . ObjectID = sourceAgentId ;
ani . Sender = new AvatarAnimationPacket . SenderBlock ( ) ;
ani . Sender . ID = sourceAgentId ;
ani . AnimationList = new AvatarAnimationPacket . AnimationListBlock [ animations . Length ] ;
for ( int i = 0 ; i < animations . Length ; + + i )
{
ani . AnimationList [ i ] = new AvatarAnimationPacket . AnimationListBlock ( ) ;
ani . AnimationList [ i ] . AnimID = animations [ i ] ;
ani . AnimationList [ i ] . AnimSequenceID = seqs [ i ] ;
}
ani . Header . Reliable = false ;
OutPacket ( ani , ThrottleOutPacketType . Task ) ;
}
# endregion
#region Avatar Packet/data sending Methods
/// <summary>
/// send a objectupdate packet with information about the clients avatar
/// </summary>
/// <param name="regionInfo"></param>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
/// <param name="avatarID"></param>
/// <param name="avatarLocalID"></param>
/// <param name="Pos"></param>
2008-09-06 07:52:41 +00:00
public void SendAvatarData ( ulong regionHandle , string firstName , string lastName , UUID avatarID ,
uint avatarLocalID , Vector3 Pos , byte [ ] textureEntry , uint parentID , Quaternion rotation )
2008-05-02 19:21:33 +00:00
{
ObjectUpdatePacket objupdate = ( ObjectUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . ObjectUpdate ) ;
// TODO: don't create new blocks if recycling an old packet
objupdate . RegionData . RegionHandle = regionHandle ;
objupdate . RegionData . TimeDilation = ushort . MaxValue ;
objupdate . ObjectData = new ObjectUpdatePacket . ObjectDataBlock [ 1 ] ;
objupdate . ObjectData [ 0 ] = CreateDefaultAvatarPacket ( textureEntry ) ;
//give this avatar object a local id and assign the user a name
objupdate . ObjectData [ 0 ] . ID = avatarLocalID ;
objupdate . ObjectData [ 0 ] . FullID = avatarID ;
objupdate . ObjectData [ 0 ] . ParentID = parentID ;
objupdate . ObjectData [ 0 ] . NameValue =
2008-09-06 07:52:41 +00:00
Utils . StringToBytes ( "FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName ) ;
2008-07-23 11:07:59 +00:00
2008-09-06 07:52:41 +00:00
Vector3 pos2 = new Vector3 ( ( float ) Pos . X , ( float ) Pos . Y , ( float ) Pos . Z ) ;
2008-05-02 19:21:33 +00:00
byte [ ] pb = pos2 . GetBytes ( ) ;
Array . Copy ( pb , 0 , objupdate . ObjectData [ 0 ] . ObjectData , 16 , pb . Length ) ;
2008-07-23 11:07:59 +00:00
byte [ ] rot = rotation . GetBytes ( ) ;
Array . Copy ( rot , 0 , objupdate . ObjectData [ 0 ] . ObjectData , 52 , rot . Length ) ;
2008-05-10 10:28:49 +00:00
objupdate . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( objupdate , ThrottleOutPacketType . Task ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="timeDilation"></param>
/// <param name="localID"></param>
/// <param name="position"></param>
/// <param name="velocity"></param>
2008-09-06 07:52:41 +00:00
public void SendAvatarTerseUpdate ( ulong regionHandle , ushort timeDilation , uint localID , Vector3 position ,
Vector3 velocity , Quaternion rotation )
2008-05-02 19:21:33 +00:00
{
2008-05-22 19:09:51 +00:00
if ( rotation . X = = rotation . Y & & rotation . Y = = rotation . Z & & rotation . Z = = rotation . W & & rotation . W = = 0 )
2008-09-06 07:52:41 +00:00
rotation = Quaternion . Identity ;
2008-05-21 17:29:03 +00:00
2008-05-02 19:21:33 +00:00
ImprovedTerseObjectUpdatePacket . ObjectDataBlock terseBlock =
CreateAvatarImprovedBlock ( localID , position , velocity , rotation ) ;
ImprovedTerseObjectUpdatePacket terse = ( ImprovedTerseObjectUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . ImprovedTerseObjectUpdate ) ;
// TODO: don't create new blocks if recycling an old packet
terse . RegionData . RegionHandle = regionHandle ;
terse . RegionData . TimeDilation = timeDilation ;
terse . ObjectData = new ImprovedTerseObjectUpdatePacket . ObjectDataBlock [ 1 ] ;
terse . ObjectData [ 0 ] = terseBlock ;
terse . Header . Reliable = false ;
2008-05-10 10:28:49 +00:00
terse . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( terse , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendCoarseLocationUpdate ( List < Vector3 > CoarseLocations )
2008-05-02 19:21:33 +00:00
{
CoarseLocationUpdatePacket loc = ( CoarseLocationUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . CoarseLocationUpdate ) ;
// TODO: don't create new blocks if recycling an old packet
int total = CoarseLocations . Count ;
CoarseLocationUpdatePacket . IndexBlock ib =
new CoarseLocationUpdatePacket . IndexBlock ( ) ;
loc . Location = new CoarseLocationUpdatePacket . LocationBlock [ total ] ;
for ( int i = 0 ; i < total ; i + + )
{
CoarseLocationUpdatePacket . LocationBlock lb =
new CoarseLocationUpdatePacket . LocationBlock ( ) ;
lb . X = ( byte ) CoarseLocations [ i ] . X ;
lb . Y = ( byte ) CoarseLocations [ i ] . Y ;
lb . Z = ( byte ) ( CoarseLocations [ i ] . Z / 4 ) ;
loc . Location [ i ] = lb ;
}
ib . You = - 1 ;
ib . Prey = - 1 ;
loc . Index = ib ;
loc . Header . Reliable = false ;
2008-05-10 10:28:49 +00:00
loc . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( loc , ThrottleOutPacketType . Task ) ;
}
# endregion
#region Primitive Packet/data Sending Methods
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="localID"></param>
/// <param name="rotation"></param>
/// <param name="attachPoint"></param>
2008-09-06 07:52:41 +00:00
public void AttachObject ( uint localID , Quaternion rotation , byte attachPoint )
2008-05-02 19:21:33 +00:00
{
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
ObjectAttachPacket attach = ( ObjectAttachPacket ) PacketPool . Instance . GetPacket ( PacketType . ObjectAttach ) ;
Console . WriteLine ( "Attach object!" ) ;
// TODO: don't create new blocks if recycling an old packet
attach . AgentData . AgentID = AgentId ;
attach . AgentData . SessionID = m_sessionId ;
attach . AgentData . AttachmentPoint = attachPoint ;
attach . ObjectData = new ObjectAttachPacket . ObjectDataBlock [ 1 ] ;
attach . ObjectData [ 0 ] = new ObjectAttachPacket . ObjectDataBlock ( ) ;
attach . ObjectData [ 0 ] . ObjectLocalID = localID ;
attach . ObjectData [ 0 ] . Rotation = rotation ;
2008-05-10 10:28:49 +00:00
attach . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( attach , ThrottleOutPacketType . Task ) ;
}
public void SendPrimitiveToClient (
2008-05-16 01:22:11 +00:00
ulong regionHandle , ushort timeDilation , uint localID , PrimitiveBaseShape primShape ,
2008-09-06 07:52:41 +00:00
Vector3 pos , Vector3 vel , Vector3 acc , Quaternion rotation , Vector3 rvel ,
uint flags , UUID objectID , UUID ownerID , string text , byte [ ] color ,
2008-10-03 12:00:13 +00:00
uint parentID , byte [ ] particleSystem , byte clickAction , byte material )
2008-05-02 19:21:33 +00:00
{
byte [ ] textureanim = new byte [ 0 ] ;
2008-05-07 18:40:18 +00:00
SendPrimitiveToClient ( regionHandle , timeDilation , localID , primShape , pos , vel ,
acc , rotation , rvel , flags ,
2008-05-02 19:21:33 +00:00
objectID , ownerID , text , color , parentID , particleSystem ,
2008-10-03 12:00:13 +00:00
clickAction , material , textureanim , false , ( uint ) 0 , UUID . Zero , UUID . Zero , 0 , 0 , 0 ) ;
2008-05-02 19:21:33 +00:00
}
2008-05-07 18:40:18 +00:00
2008-05-02 19:21:33 +00:00
public void SendPrimitiveToClient (
2008-05-16 01:22:11 +00:00
ulong regionHandle , ushort timeDilation , uint localID , PrimitiveBaseShape primShape ,
2008-09-06 07:52:41 +00:00
Vector3 pos , Vector3 velocity , Vector3 acceleration , Quaternion rotation , Vector3 rotational_velocity ,
2008-05-02 19:21:33 +00:00
uint flags ,
2008-09-06 07:52:41 +00:00
UUID objectID , UUID ownerID , string text , byte [ ] color , uint parentID , byte [ ] particleSystem ,
2008-10-03 12:00:13 +00:00
byte clickAction , byte material , byte [ ] textureanim , bool attachment , uint AttachPoint , UUID AssetId , UUID SoundId , double SoundGain , byte SoundFlags , double SoundRadius )
2008-05-02 19:21:33 +00:00
{
2008-07-21 15:13:34 +00:00
2008-05-22 19:09:51 +00:00
if ( rotation . X = = rotation . Y & & rotation . Y = = rotation . Z & & rotation . Z = = rotation . W & & rotation . W = = 0 )
2008-09-06 07:52:41 +00:00
rotation = Quaternion . Identity ;
2008-05-21 17:29:03 +00:00
2008-05-02 19:21:33 +00:00
ObjectUpdatePacket outPacket = ( ObjectUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . ObjectUpdate ) ;
2008-05-28 14:03:08 +00:00
2008-05-30 08:35:57 +00:00
2008-05-28 14:03:08 +00:00
2008-05-02 19:21:33 +00:00
// TODO: don't create new blocks if recycling an old packet
outPacket . RegionData . RegionHandle = regionHandle ;
outPacket . RegionData . TimeDilation = timeDilation ;
outPacket . ObjectData = new ObjectUpdatePacket . ObjectDataBlock [ 1 ] ;
outPacket . ObjectData [ 0 ] = CreatePrimUpdateBlock ( primShape , flags ) ;
outPacket . ObjectData [ 0 ] . ID = localID ;
outPacket . ObjectData [ 0 ] . FullID = objectID ;
outPacket . ObjectData [ 0 ] . OwnerID = ownerID ;
2008-05-16 01:22:11 +00:00
2008-08-05 20:34:34 +00:00
// Anything more than 254 will cause libsecondlife to barf
2008-09-06 07:52:41 +00:00
// (libsl 1550) adds an \0 on the Utils.StringToBytes conversion if it isn't present
2008-08-05 20:34:34 +00:00
if ( text . Length > 254 )
2008-05-02 19:21:33 +00:00
{
2008-08-05 20:34:34 +00:00
text = text . Remove ( 254 ) ;
2008-05-02 19:21:33 +00:00
}
2008-05-16 01:22:11 +00:00
2008-09-06 07:52:41 +00:00
outPacket . ObjectData [ 0 ] . Text = Utils . StringToBytes ( text ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
outPacket . ObjectData [ 0 ] . TextColor [ 0 ] = color [ 0 ] ;
outPacket . ObjectData [ 0 ] . TextColor [ 1 ] = color [ 1 ] ;
outPacket . ObjectData [ 0 ] . TextColor [ 2 ] = color [ 2 ] ;
outPacket . ObjectData [ 0 ] . TextColor [ 3 ] = color [ 3 ] ;
outPacket . ObjectData [ 0 ] . ParentID = parentID ;
outPacket . ObjectData [ 0 ] . PSBlock = particleSystem ;
outPacket . ObjectData [ 0 ] . ClickAction = clickAction ;
2008-10-03 12:00:13 +00:00
outPacket . ObjectData [ 0 ] . Material = material ;
2008-05-28 14:03:08 +00:00
outPacket . ObjectData [ 0 ] . Flags = 0 ;
2008-05-02 19:21:33 +00:00
if ( attachment )
{
// Necessary???
2008-09-06 07:52:41 +00:00
outPacket . ObjectData [ 0 ] . JointAxisOrAnchor = new Vector3 ( 0 , 0 , 2 ) ;
outPacket . ObjectData [ 0 ] . JointPivot = new Vector3 ( 0 , 0 , 0 ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
// Item from inventory???
outPacket . ObjectData [ 0 ] . NameValue =
2008-09-06 07:52:41 +00:00
Utils . StringToBytes ( "AttachItemID STRING RW SV " + AssetId . Guid ) ;
2008-05-02 19:21:33 +00:00
outPacket . ObjectData [ 0 ] . State = ( byte ) ( ( AttachPoint % 16 ) * 16 + ( AttachPoint / 16 ) ) ;
}
2008-05-28 14:03:08 +00:00
// Xantor 20080528: Send sound info as well
2008-05-30 15:34:54 +00:00
// Xantor 20080530: Zero out everything if there's no SoundId, so zerocompression will work again
outPacket . ObjectData [ 0 ] . Sound = SoundId ;
2008-09-06 07:52:41 +00:00
if ( SoundId = = UUID . Zero )
2008-05-30 15:34:54 +00:00
{
2008-09-06 07:52:41 +00:00
outPacket . ObjectData [ 0 ] . OwnerID = UUID . Zero ;
2008-05-30 15:34:54 +00:00
outPacket . ObjectData [ 0 ] . Gain = 0.0f ;
outPacket . ObjectData [ 0 ] . Radius = 0.0f ;
outPacket . ObjectData [ 0 ] . Flags = 0 ;
}
else
{
outPacket . ObjectData [ 0 ] . OwnerID = ownerID ;
outPacket . ObjectData [ 0 ] . Gain = ( float ) SoundGain ;
outPacket . ObjectData [ 0 ] . Radius = ( float ) SoundRadius ;
outPacket . ObjectData [ 0 ] . Flags = SoundFlags ;
}
2008-05-02 19:21:33 +00:00
byte [ ] pb = pos . GetBytes ( ) ;
2008-05-07 19:34:06 +00:00
Array . Copy ( pb , 0 , outPacket . ObjectData [ 0 ] . ObjectData , 0 , pb . Length ) ;
2008-05-02 19:21:33 +00:00
2008-05-07 19:48:34 +00:00
byte [ ] vel = velocity . GetBytes ( ) ;
Array . Copy ( vel , 0 , outPacket . ObjectData [ 0 ] . ObjectData , pb . Length , vel . Length ) ;
2008-05-07 19:37:37 +00:00
2008-05-07 19:34:06 +00:00
byte [ ] rot = rotation . GetBytes ( ) ;
Array . Copy ( rot , 0 , outPacket . ObjectData [ 0 ] . ObjectData , 36 , rot . Length ) ;
2008-05-02 19:21:33 +00:00
2008-05-07 19:37:37 +00:00
byte [ ] rvel = rotational_velocity . GetBytes ( ) ;
2008-05-07 19:44:22 +00:00
Array . Copy ( rvel , 0 , outPacket . ObjectData [ 0 ] . ObjectData , 36 + rot . Length , rvel . Length ) ;
2008-05-07 19:37:37 +00:00
2008-05-02 19:21:33 +00:00
if ( textureanim . Length > 0 )
{
outPacket . ObjectData [ 0 ] . TextureAnim = textureanim ;
}
2008-05-10 10:28:49 +00:00
outPacket . Header . Zerocoded = true ;
2008-07-21 15:13:34 +00:00
2008-08-18 18:59:06 +00:00
OutPacket ( outPacket , ThrottleOutPacketType . Task | ThrottleOutPacketType . LowPriority ) ;
2008-05-02 19:21:33 +00:00
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="timeDilation"></param>
/// <param name="localID"></param>
/// <param name="position"></param>
/// <param name="rotation"></param>
2008-09-06 07:52:41 +00:00
public void SendPrimTerseUpdate ( ulong regionHandle , ushort timeDilation , uint localID , Vector3 position ,
Quaternion rotation , Vector3 velocity , Vector3 rotationalvelocity , byte state , UUID AssetId )
2008-05-02 19:21:33 +00:00
{
2008-05-22 19:09:51 +00:00
if ( rotation . X = = rotation . Y & & rotation . Y = = rotation . Z & & rotation . Z = = rotation . W & & rotation . W = = 0 )
2008-09-06 07:52:41 +00:00
rotation = Quaternion . Identity ;
2008-05-02 19:21:33 +00:00
ImprovedTerseObjectUpdatePacket terse = ( ImprovedTerseObjectUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . ImprovedTerseObjectUpdate ) ;
// TODO: don't create new blocks if recycling an old packet
terse . RegionData . RegionHandle = regionHandle ;
terse . RegionData . TimeDilation = timeDilation ;
terse . ObjectData = new ImprovedTerseObjectUpdatePacket . ObjectDataBlock [ 1 ] ;
2008-05-16 01:22:11 +00:00
terse . ObjectData [ 0 ] = CreatePrimImprovedBlock ( localID , position , rotation , velocity , rotationalvelocity , state ) ; // AssetID should fall into here probably somehow...
2008-05-02 19:21:33 +00:00
terse . Header . Reliable = false ;
2008-05-10 10:28:49 +00:00
terse . Header . Zerocoded = true ;
2008-08-18 18:59:06 +00:00
OutPacket ( terse , ThrottleOutPacketType . Task | ThrottleOutPacketType . LowPriority ) ;
2008-05-02 19:21:33 +00:00
}
2008-09-06 07:52:41 +00:00
public void SendPrimTerseUpdate ( ulong regionHandle , ushort timeDilation , uint localID , Vector3 position ,
Quaternion rotation , Vector3 velocity , Vector3 rotationalvelocity )
2008-05-02 19:21:33 +00:00
{
2008-05-22 19:09:51 +00:00
if ( rotation . X = = rotation . Y & & rotation . Y = = rotation . Z & & rotation . Z = = rotation . W & & rotation . W = = 0 )
2008-09-06 07:52:41 +00:00
rotation = Quaternion . Identity ;
2008-05-02 19:21:33 +00:00
ImprovedTerseObjectUpdatePacket terse = ( ImprovedTerseObjectUpdatePacket ) PacketPool . Instance . GetPacket ( PacketType . ImprovedTerseObjectUpdate ) ;
// TODO: don't create new blocks if recycling an old packet
terse . RegionData . RegionHandle = regionHandle ;
terse . RegionData . TimeDilation = timeDilation ;
terse . ObjectData = new ImprovedTerseObjectUpdatePacket . ObjectDataBlock [ 1 ] ;
terse . ObjectData [ 0 ] = CreatePrimImprovedBlock ( localID , position , rotation , velocity , rotationalvelocity , 0 ) ;
terse . Header . Reliable = false ;
2008-05-10 10:28:49 +00:00
terse . Header . Zerocoded = true ;
2008-08-18 18:59:06 +00:00
OutPacket ( terse , ThrottleOutPacketType . Task | ThrottleOutPacketType . LowPriority ) ;
2008-05-02 19:21:33 +00:00
}
2008-05-30 08:35:57 +00:00
2008-09-06 07:52:41 +00:00
public void SendAssetUploadCompleteMessage ( sbyte AssetType , bool Success , UUID AssetFullID )
2008-05-10 12:01:36 +00:00
{
AssetUploadCompletePacket newPack = new AssetUploadCompletePacket ( ) ;
newPack . AssetBlock . Type = AssetType ;
newPack . AssetBlock . Success = Success ;
newPack . AssetBlock . UUID = AssetFullID ;
newPack . Header . Zerocoded = true ;
OutPacket ( newPack , ThrottleOutPacketType . Asset ) ;
}
2008-05-30 08:35:57 +00:00
2008-09-06 07:52:41 +00:00
public void SendXferRequest ( ulong XferID , short AssetType , UUID vFileID , byte FilePath , byte [ ] FileName )
2008-05-10 12:01:36 +00:00
{
RequestXferPacket newPack = new RequestXferPacket ( ) ;
newPack . XferID . ID = XferID ;
newPack . XferID . VFileType = AssetType ;
newPack . XferID . VFileID = vFileID ;
newPack . XferID . FilePath = FilePath ;
newPack . XferID . Filename = FileName ;
newPack . Header . Zerocoded = true ;
OutPacket ( newPack , ThrottleOutPacketType . Asset ) ;
}
2008-05-30 08:35:57 +00:00
2008-05-10 12:01:36 +00:00
public void SendConfirmXfer ( ulong xferID , uint PacketID )
{
ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket ( ) ;
newPack . XferID . ID = xferID ;
newPack . XferID . Packet = PacketID ;
newPack . Header . Zerocoded = true ;
OutPacket ( newPack , ThrottleOutPacketType . Asset ) ;
}
2008-05-30 08:35:57 +00:00
2008-09-06 07:52:41 +00:00
public void SendImagePart ( ushort numParts , UUID ImageUUID , uint ImageSize , byte [ ] ImageData , byte imageCodec )
2008-05-10 12:45:41 +00:00
{
ImageDataPacket im = new ImageDataPacket ( ) ;
im . Header . Reliable = false ;
im . ImageID . Packets = numParts ;
im . ImageID . ID = ImageUUID ;
if ( ImageSize > 0 )
im . ImageID . Size = ImageSize ;
2008-05-16 01:22:11 +00:00
2008-05-10 12:45:41 +00:00
im . ImageData . Data = ImageData ;
im . ImageID . Codec = imageCodec ;
im . Header . Zerocoded = true ;
OutPacket ( im , ThrottleOutPacketType . Texture ) ;
}
2008-05-30 08:35:57 +00:00
2008-05-10 13:11:09 +00:00
public void SendShutdownConnectionNotice ( )
{
OutPacket ( PacketPool . Instance . GetPacket ( PacketType . DisableSimulator ) , ThrottleOutPacketType . Unknown ) ;
}
public void SendSimStats ( Packet pack )
{
2008-07-08 11:02:53 +00:00
pack . Header . Reliable = false ;
OutPacket ( pack , ThrottleOutPacketType . Task ) ;
2008-05-10 13:11:09 +00:00
}
2008-09-06 07:52:41 +00:00
public void SendObjectPropertiesFamilyData ( uint RequestFlags , UUID ObjectUUID , UUID OwnerID , UUID GroupID ,
2008-05-10 20:25:40 +00:00
uint BaseMask , uint OwnerMask , uint GroupMask , uint EveryoneMask ,
2008-07-08 11:02:53 +00:00
uint NextOwnerMask , int OwnershipCost , byte SaleType , int SalePrice , uint Category ,
2008-09-06 07:52:41 +00:00
UUID LastOwnerID , string ObjectName , string Description )
2008-05-10 20:25:40 +00:00
{
ObjectPropertiesFamilyPacket objPropFamilyPack = ( ObjectPropertiesFamilyPacket ) PacketPool . Instance . GetPacket ( PacketType . ObjectPropertiesFamily ) ;
// TODO: don't create new blocks if recycling an old packet
ObjectPropertiesFamilyPacket . ObjectDataBlock objPropDB = new ObjectPropertiesFamilyPacket . ObjectDataBlock ( ) ;
objPropDB . RequestFlags = RequestFlags ;
objPropDB . ObjectID = ObjectUUID ;
objPropDB . OwnerID = OwnerID ;
objPropDB . GroupID = GroupID ;
objPropDB . BaseMask = BaseMask ;
objPropDB . OwnerMask = OwnerMask ;
objPropDB . GroupMask = GroupMask ;
objPropDB . EveryoneMask = EveryoneMask ;
objPropDB . NextOwnerMask = NextOwnerMask ;
// TODO: More properties are needed in SceneObjectPart!
objPropDB . OwnershipCost = OwnershipCost ;
objPropDB . SaleType = SaleType ;
objPropDB . SalePrice = SalePrice ;
objPropDB . Category = Category ;
objPropDB . LastOwnerID = LastOwnerID ;
2008-09-06 07:52:41 +00:00
objPropDB . Name = Utils . StringToBytes ( ObjectName ) ;
objPropDB . Description = Utils . StringToBytes ( Description ) ;
2008-05-10 20:25:40 +00:00
objPropFamilyPack . ObjectData = objPropDB ;
objPropFamilyPack . Header . Zerocoded = true ;
OutPacket ( objPropFamilyPack , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendObjectPropertiesReply ( UUID ItemID , ulong CreationDate , UUID CreatorUUID , UUID FolderUUID , UUID FromTaskUUID ,
UUID GroupUUID , short InventorySerial , UUID LastOwnerUUID , UUID ObjectUUID ,
UUID OwnerUUID , string TouchTitle , byte [ ] TextureID , string SitTitle , string ItemName ,
2008-05-16 01:22:11 +00:00
string ItemDescription , uint OwnerMask , uint NextOwnerMask , uint GroupMask , uint EveryoneMask ,
2008-08-24 00:51:21 +00:00
uint BaseMask , byte saleType , int salePrice )
2008-05-10 20:25:40 +00:00
{
ObjectPropertiesPacket proper = ( ObjectPropertiesPacket ) PacketPool . Instance . GetPacket ( PacketType . ObjectProperties ) ;
// TODO: don't create new blocks if recycling an old packet
proper . ObjectData = new ObjectPropertiesPacket . ObjectDataBlock [ 1 ] ;
proper . ObjectData [ 0 ] = new ObjectPropertiesPacket . ObjectDataBlock ( ) ;
proper . ObjectData [ 0 ] . ItemID = ItemID ;
proper . ObjectData [ 0 ] . CreationDate = CreationDate ;
proper . ObjectData [ 0 ] . CreatorID = CreatorUUID ;
proper . ObjectData [ 0 ] . FolderID = FolderUUID ;
proper . ObjectData [ 0 ] . FromTaskID = FromTaskUUID ;
proper . ObjectData [ 0 ] . GroupID = GroupUUID ;
proper . ObjectData [ 0 ] . InventorySerial = InventorySerial ;
proper . ObjectData [ 0 ] . LastOwnerID = LastOwnerUUID ;
2008-09-06 07:52:41 +00:00
// proper.ObjectData[0].LastOwnerID = UUID.Zero;
2008-05-10 20:25:40 +00:00
proper . ObjectData [ 0 ] . ObjectID = ObjectUUID ;
proper . ObjectData [ 0 ] . OwnerID = OwnerUUID ;
2008-09-06 07:52:41 +00:00
proper . ObjectData [ 0 ] . TouchName = Utils . StringToBytes ( TouchTitle ) ;
2008-05-10 20:25:40 +00:00
proper . ObjectData [ 0 ] . TextureID = TextureID ;
2008-09-06 07:52:41 +00:00
proper . ObjectData [ 0 ] . SitName = Utils . StringToBytes ( SitTitle ) ;
proper . ObjectData [ 0 ] . Name = Utils . StringToBytes ( ItemName ) ;
proper . ObjectData [ 0 ] . Description = Utils . StringToBytes ( ItemDescription ) ;
2008-05-10 20:25:40 +00:00
proper . ObjectData [ 0 ] . OwnerMask = OwnerMask ;
proper . ObjectData [ 0 ] . NextOwnerMask = NextOwnerMask ;
proper . ObjectData [ 0 ] . GroupMask = GroupMask ;
proper . ObjectData [ 0 ] . EveryoneMask = EveryoneMask ;
proper . ObjectData [ 0 ] . BaseMask = BaseMask ;
// proper.ObjectData[0].AggregatePerms = 53;
// proper.ObjectData[0].AggregatePermTextures = 0;
// proper.ObjectData[0].AggregatePermTexturesOwner = 0;
2008-08-24 00:51:21 +00:00
proper . ObjectData [ 0 ] . SaleType = saleType ;
proper . ObjectData [ 0 ] . SalePrice = salePrice ;
2008-05-10 20:25:40 +00:00
proper . Header . Zerocoded = true ;
OutPacket ( proper , ThrottleOutPacketType . Task ) ;
}
2008-05-02 19:21:33 +00:00
# endregion
2008-05-04 18:59:18 +00:00
#region Estate Data Sending Methods
2008-05-30 08:35:57 +00:00
private bool convertParamStringToBool ( byte [ ] field )
{
2008-09-06 07:52:41 +00:00
string s = Utils . BytesToString ( field ) ;
2008-05-30 08:35:57 +00:00
if ( s = = "1" | | s . ToLower ( ) = = "y" | | s . ToLower ( ) = = "yes" | | s . ToLower ( ) = = "t" | | s . ToLower ( ) = = "true" )
2008-05-04 18:59:18 +00:00
{
2008-05-30 08:35:57 +00:00
return true ;
}
return false ;
}
2008-05-04 18:59:18 +00:00
2008-09-06 07:52:41 +00:00
public void SendEstateManagersList ( UUID invoice , UUID [ ] EstateManagers , uint estateID )
2008-05-30 08:35:57 +00:00
{
EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket ( ) ;
2008-09-06 07:52:41 +00:00
packet . AgentData . TransactionID = UUID . Random ( ) ;
2008-05-30 08:35:57 +00:00
packet . AgentData . AgentID = this . AgentId ;
packet . AgentData . SessionID = this . SessionId ;
packet . MethodData . Invoice = invoice ;
2008-09-06 07:52:41 +00:00
packet . MethodData . Method = Utils . StringToBytes ( "setaccess" ) ;
2008-05-04 18:59:18 +00:00
2008-05-30 08:35:57 +00:00
EstateOwnerMessagePacket . ParamListBlock [ ] returnblock = new EstateOwnerMessagePacket . ParamListBlock [ 6 + EstateManagers . Length ] ;
2008-05-04 18:59:18 +00:00
2008-05-30 08:35:57 +00:00
for ( int i = 0 ; i < ( 6 + EstateManagers . Length ) ; i + + )
2008-05-04 18:59:18 +00:00
{
2008-05-30 08:35:57 +00:00
returnblock [ i ] = new EstateOwnerMessagePacket . ParamListBlock ( ) ;
2008-05-04 18:59:18 +00:00
}
2008-05-30 08:35:57 +00:00
int j = 0 ;
2008-09-06 07:52:41 +00:00
returnblock [ j ] . Parameter = Utils . StringToBytes ( estateID . ToString ( ) ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( ( ( int ) Constants . EstateAccessCodex . EstateManagers ) . ToString ( ) ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( "0" ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( "0" ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( "0" ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( EstateManagers . Length . ToString ( ) ) ; j + + ;
2008-05-30 08:35:57 +00:00
for ( int i = 0 ; i < EstateManagers . Length ; i + + )
2008-05-04 18:59:18 +00:00
{
2008-05-30 08:35:57 +00:00
returnblock [ j ] . Parameter = EstateManagers [ i ] . GetBytes ( ) ; j + + ;
2008-05-04 18:59:18 +00:00
}
2008-05-30 08:35:57 +00:00
packet . ParamList = returnblock ;
packet . Header . Reliable = false ;
this . OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-05-04 19:19:18 +00:00
2008-09-06 07:52:41 +00:00
public void SendBannedUserList ( UUID invoice , EstateBan [ ] bl , uint estateID )
2008-06-21 03:29:08 +00:00
{
2008-09-06 07:52:41 +00:00
List < UUID > BannedUsers = new List < UUID > ( ) ;
2008-06-21 03:29:08 +00:00
for ( int i = 0 ; i < bl . Length ; i + + )
{
if ( bl [ i ] = = null )
continue ;
2008-09-06 07:52:41 +00:00
if ( bl [ i ] . bannedUUID = = UUID . Zero )
2008-07-18 02:40:47 +00:00
continue ;
BannedUsers . Add ( bl [ i ] . bannedUUID ) ;
2008-06-21 03:29:08 +00:00
}
2008-07-08 11:02:53 +00:00
2008-06-21 03:29:08 +00:00
EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket ( ) ;
2008-09-06 07:52:41 +00:00
packet . AgentData . TransactionID = UUID . Random ( ) ;
2008-06-21 03:29:08 +00:00
packet . AgentData . AgentID = this . AgentId ;
packet . AgentData . SessionID = this . SessionId ;
packet . MethodData . Invoice = invoice ;
2008-09-06 07:52:41 +00:00
packet . MethodData . Method = Utils . StringToBytes ( "setaccess" ) ;
2008-06-21 03:29:08 +00:00
2008-07-18 02:40:47 +00:00
EstateOwnerMessagePacket . ParamListBlock [ ] returnblock = new EstateOwnerMessagePacket . ParamListBlock [ 6 + BannedUsers . Count ] ;
2008-06-21 03:29:08 +00:00
2008-07-18 02:40:47 +00:00
for ( int i = 0 ; i < ( 6 + BannedUsers . Count ) ; i + + )
2008-06-21 03:29:08 +00:00
{
returnblock [ i ] = new EstateOwnerMessagePacket . ParamListBlock ( ) ;
}
int j = 0 ;
2008-09-06 07:52:41 +00:00
returnblock [ j ] . Parameter = Utils . StringToBytes ( estateID . ToString ( ) ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( ( ( int ) Constants . EstateAccessCodex . EstateBans ) . ToString ( ) ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( "0" ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( "0" ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( BannedUsers . Count . ToString ( ) ) ; j + + ;
returnblock [ j ] . Parameter = Utils . StringToBytes ( "0" ) ; j + + ;
2008-06-21 03:29:08 +00:00
2008-09-06 07:52:41 +00:00
foreach ( UUID banned in BannedUsers )
2008-06-21 03:29:08 +00:00
{
2008-07-18 02:40:47 +00:00
returnblock [ j ] . Parameter = banned . GetBytes ( ) ; j + + ;
2008-06-21 03:29:08 +00:00
}
packet . ParamList = returnblock ;
packet . Header . Reliable = false ;
this . OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-07-08 11:30:08 +00:00
public void SendRegionInfoToEstateMenu ( RegionInfoForEstateMenuArgs args )
2008-05-30 08:35:57 +00:00
{
RegionInfoPacket rinfopack = new RegionInfoPacket ( ) ;
RegionInfoPacket . RegionInfoBlock rinfoblk = new RegionInfoPacket . RegionInfoBlock ( ) ;
rinfopack . AgentData . AgentID = this . AgentId ;
rinfopack . AgentData . SessionID = this . SessionId ;
2008-07-08 11:02:53 +00:00
rinfoblk . BillableFactor = args . billableFactor ;
2008-05-30 08:35:57 +00:00
rinfoblk . EstateID = args . estateID ;
rinfoblk . MaxAgents = args . maxAgents ;
2008-07-08 11:02:53 +00:00
rinfoblk . ObjectBonusFactor = args . objectBonusFactor ;
2008-05-30 08:35:57 +00:00
rinfoblk . ParentEstateID = args . parentEstateID ;
rinfoblk . PricePerMeter = args . pricePerMeter ;
rinfoblk . RedirectGridX = args . redirectGridX ;
rinfoblk . RedirectGridY = args . redirectGridY ;
rinfoblk . RegionFlags = args . regionFlags ;
rinfoblk . SimAccess = args . simAccess ;
rinfoblk . SunHour = args . sunHour ;
rinfoblk . TerrainLowerLimit = args . terrainLowerLimit ;
rinfoblk . TerrainRaiseLimit = args . terrainRaiseLimit ;
rinfoblk . UseEstateSun = args . useEstateSun ;
rinfoblk . WaterHeight = args . waterHeight ;
2008-09-06 07:52:41 +00:00
rinfoblk . SimName = Utils . StringToBytes ( args . simName ) ;
2008-05-30 08:35:57 +00:00
rinfopack . RegionInfo = rinfoblk ;
this . OutPacket ( rinfopack , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendEstateCovenantInformation ( UUID covenant )
2008-05-30 08:35:57 +00:00
{
EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket ( ) ;
EstateCovenantReplyPacket . DataBlock edata = new EstateCovenantReplyPacket . DataBlock ( ) ;
2008-07-18 02:40:47 +00:00
edata . CovenantID = covenant ;
2008-05-30 08:35:57 +00:00
edata . CovenantTimestamp = 0 ;
2008-09-06 07:52:41 +00:00
if ( m_scene . RegionInfo . EstateSettings . EstateOwner ! = UUID . Zero )
2008-08-12 22:55:47 +00:00
edata . EstateOwnerID = m_scene . RegionInfo . EstateSettings . EstateOwner ;
else
edata . EstateOwnerID = m_scene . RegionInfo . MasterAvatarAssignedUUID ;
2008-09-06 07:52:41 +00:00
edata . EstateName = Utils . StringToBytes ( m_scene . RegionInfo . EstateSettings . EstateName ) ;
2008-05-30 08:35:57 +00:00
einfopack . Data = edata ;
this . OutPacket ( einfopack , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendDetailedEstateData ( UUID invoice , string estateName , uint estateID , uint parentEstate , uint estateFlags , uint sunPosition , UUID covenant , string abuseEmail )
2008-05-30 08:35:57 +00:00
{
EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket ( ) ;
packet . MethodData . Invoice = invoice ;
2008-09-06 07:52:41 +00:00
packet . AgentData . TransactionID = UUID . Random ( ) ;
packet . MethodData . Method = Utils . StringToBytes ( "estateupdateinfo" ) ;
2008-08-01 21:08:00 +00:00
EstateOwnerMessagePacket . ParamListBlock [ ] returnblock = new EstateOwnerMessagePacket . ParamListBlock [ 10 ] ;
2008-05-30 08:35:57 +00:00
2008-08-01 21:08:00 +00:00
for ( int i = 0 ; i < 10 ; i + + )
2008-05-04 19:19:18 +00:00
{
2008-05-30 08:35:57 +00:00
returnblock [ i ] = new EstateOwnerMessagePacket . ParamListBlock ( ) ;
2008-05-04 19:19:18 +00:00
}
2008-05-30 08:35:57 +00:00
//Sending Estate Settings
2008-09-06 07:52:41 +00:00
returnblock [ 0 ] . Parameter = Utils . StringToBytes ( estateName ) ;
2008-08-15 13:13:39 +00:00
// TODO: remove this cruft once MasterAvatar is fully deprecated
/ /
2008-09-06 07:52:41 +00:00
if ( m_scene . RegionInfo . EstateSettings . EstateOwner ! = UUID . Zero )
returnblock [ 1 ] . Parameter = Utils . StringToBytes ( m_scene . RegionInfo . EstateSettings . EstateOwner . ToString ( ) ) ;
2008-08-15 13:13:39 +00:00
else
2008-09-06 07:52:41 +00:00
returnblock [ 1 ] . Parameter = Utils . StringToBytes ( m_scene . RegionInfo . MasterAvatarAssignedUUID . ToString ( ) ) ;
returnblock [ 2 ] . Parameter = Utils . StringToBytes ( estateID . ToString ( ) ) ;
2008-05-30 08:35:57 +00:00
2008-09-06 07:52:41 +00:00
returnblock [ 3 ] . Parameter = Utils . StringToBytes ( estateFlags . ToString ( ) ) ;
returnblock [ 4 ] . Parameter = Utils . StringToBytes ( sunPosition . ToString ( ) ) ;
returnblock [ 5 ] . Parameter = Utils . StringToBytes ( parentEstate . ToString ( ) ) ;
returnblock [ 6 ] . Parameter = Utils . StringToBytes ( covenant . ToString ( ) ) ;
returnblock [ 7 ] . Parameter = Utils . StringToBytes ( "1160895077" ) ; // what is this?
returnblock [ 8 ] . Parameter = Utils . StringToBytes ( "1" ) ; // what is this?
returnblock [ 9 ] . Parameter = Utils . StringToBytes ( abuseEmail ) ;
2008-05-30 08:35:57 +00:00
packet . ParamList = returnblock ;
packet . Header . Reliable = false ;
//System.Console.WriteLine("[ESTATE]: SIM--->" + packet.ToString());
this . OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-05-04 18:59:18 +00:00
# endregion
2008-05-05 17:44:40 +00:00
#region Land Data Sending Methods
2008-05-30 08:35:57 +00:00
2008-07-08 11:30:08 +00:00
public void SendLandParcelOverlay ( byte [ ] data , int sequence_id )
2008-05-06 18:29:58 +00:00
{
ParcelOverlayPacket packet ;
packet = ( ParcelOverlayPacket ) PacketPool . Instance . GetPacket ( PacketType . ParcelOverlay ) ;
packet . ParcelData . Data = data ;
packet . ParcelData . SequenceID = sequence_id ;
2008-05-10 10:28:49 +00:00
packet . Header . Zerocoded = true ;
2008-05-06 18:29:58 +00:00
this . OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-05-30 08:35:57 +00:00
2008-07-08 11:30:08 +00:00
public void SendLandProperties ( IClientAPI remote_client , int sequence_id , bool snap_selection , int request_result , LandData landData , float simObjectBonusFactor , int parcelObjectCapacity , int simObjectCapacity , uint regionFlags )
2008-05-05 17:44:40 +00:00
{
2008-07-08 11:02:53 +00:00
ParcelPropertiesPacket updatePacket = ( ParcelPropertiesPacket ) PacketPool . Instance . GetPacket ( PacketType . ParcelProperties ) ;
2008-05-05 17:44:40 +00:00
// TODO: don't create new blocks if recycling an old packet
updatePacket . ParcelData . AABBMax = landData . AABBMax ;
updatePacket . ParcelData . AABBMin = landData . AABBMin ;
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . Area = landData . Area ;
updatePacket . ParcelData . AuctionID = landData . AuctionID ;
updatePacket . ParcelData . AuthBuyerID = landData . AuthBuyerID ; //unemplemented
updatePacket . ParcelData . Bitmap = landData . Bitmap ;
2008-09-06 07:52:41 +00:00
updatePacket . ParcelData . Desc = Utils . StringToBytes ( landData . Description ) ;
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . Category = ( byte ) landData . Category ;
updatePacket . ParcelData . ClaimDate = landData . ClaimDate ;
updatePacket . ParcelData . ClaimPrice = landData . ClaimPrice ;
updatePacket . ParcelData . GroupID = landData . GroupID ;
updatePacket . ParcelData . GroupPrims = landData . GroupPrims ;
updatePacket . ParcelData . IsGroupOwned = landData . IsGroupOwned ;
updatePacket . ParcelData . LandingType = ( byte ) landData . LandingType ;
updatePacket . ParcelData . LocalID = landData . LocalID ;
if ( landData . Area > 0 )
2008-05-05 17:44:40 +00:00
{
2008-06-11 17:31:43 +00:00
updatePacket . ParcelData . MaxPrims = parcelObjectCapacity ;
2008-05-05 17:44:40 +00:00
}
else
{
updatePacket . ParcelData . MaxPrims = 0 ;
}
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . MediaAutoScale = landData . MediaAutoScale ;
updatePacket . ParcelData . MediaID = landData . MediaID ;
2008-09-06 07:52:41 +00:00
updatePacket . ParcelData . MediaURL = Utils . StringToBytes ( landData . MediaURL ) ;
updatePacket . ParcelData . MusicURL = Utils . StringToBytes ( landData . MusicURL ) ;
updatePacket . ParcelData . Name = Utils . StringToBytes ( landData . Name ) ;
2008-05-05 17:44:40 +00:00
updatePacket . ParcelData . OtherCleanTime = 0 ; //unemplemented
updatePacket . ParcelData . OtherCount = 0 ; //unemplemented
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . OtherPrims = landData . OtherPrims ;
updatePacket . ParcelData . OwnerID = landData . OwnerID ;
updatePacket . ParcelData . OwnerPrims = landData . OwnerPrims ;
updatePacket . ParcelData . ParcelFlags = landData . Flags ;
2008-05-06 18:29:58 +00:00
updatePacket . ParcelData . ParcelPrimBonus = simObjectBonusFactor ;
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . PassHours = landData . PassHours ;
updatePacket . ParcelData . PassPrice = landData . PassPrice ;
2008-05-05 17:44:40 +00:00
updatePacket . ParcelData . PublicCount = 0 ; //unemplemented
2008-09-26 17:25:22 +00:00
updatePacket . ParcelData . RegionDenyAnonymous = ( ( regionFlags & ( uint ) RegionFlags . DenyAnonymous ) >
2008-05-05 17:44:40 +00:00
0 ) ;
2008-09-26 17:25:22 +00:00
updatePacket . ParcelData . RegionDenyIdentified = ( ( regionFlags & ( uint ) RegionFlags . DenyIdentified ) >
2008-05-05 17:44:40 +00:00
0 ) ;
2008-09-26 17:25:22 +00:00
updatePacket . ParcelData . RegionDenyTransacted = ( ( regionFlags & ( uint ) RegionFlags . DenyTransacted ) >
2008-05-05 17:44:40 +00:00
0 ) ;
2008-09-26 17:25:22 +00:00
updatePacket . ParcelData . RegionPushOverride = ( ( regionFlags & ( uint ) RegionFlags . RestrictPushObject ) >
2008-05-05 17:44:40 +00:00
0 ) ;
updatePacket . ParcelData . RentPrice = 0 ;
updatePacket . ParcelData . RequestResult = request_result ;
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . SalePrice = landData . SalePrice ;
updatePacket . ParcelData . SelectedPrims = landData . SelectedPrims ;
2008-05-05 17:44:40 +00:00
updatePacket . ParcelData . SelfCount = 0 ; //unemplemented
updatePacket . ParcelData . SequenceID = sequence_id ;
2008-07-23 15:50:32 +00:00
if ( landData . SimwideArea > 0 )
2008-05-05 17:44:40 +00:00
{
2008-06-11 17:31:43 +00:00
updatePacket . ParcelData . SimWideMaxPrims = parcelObjectCapacity ;
2008-05-05 17:44:40 +00:00
}
else
{
updatePacket . ParcelData . SimWideMaxPrims = 0 ;
}
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . SimWideTotalPrims = landData . SimwidePrims ;
2008-05-05 17:44:40 +00:00
updatePacket . ParcelData . SnapSelection = snap_selection ;
2008-07-23 15:50:32 +00:00
updatePacket . ParcelData . SnapshotID = landData . SnapshotID ;
updatePacket . ParcelData . Status = ( byte ) landData . Status ;
updatePacket . ParcelData . TotalPrims = landData . OwnerPrims + landData . GroupPrims + landData . OtherPrims +
landData . SelectedPrims ;
updatePacket . ParcelData . UserLocation = landData . UserLocation ;
updatePacket . ParcelData . UserLookAt = landData . UserLookAt ;
2008-05-10 10:28:49 +00:00
updatePacket . Header . Zerocoded = true ;
2008-07-08 11:02:53 +00:00
remote_client . OutPacket ( ( Packet ) updatePacket , ThrottleOutPacketType . Task ) ;
2008-05-05 17:44:40 +00:00
}
2008-09-06 07:52:41 +00:00
public void SendLandAccessListData ( List < UUID > avatars , uint accessFlag , int localLandID )
2008-05-05 17:44:40 +00:00
{
ParcelAccessListReplyPacket replyPacket = ( ParcelAccessListReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . ParcelAccessListReply ) ;
replyPacket . Data . AgentID = this . AgentId ;
replyPacket . Data . Flags = accessFlag ;
replyPacket . Data . LocalID = localLandID ;
replyPacket . Data . SequenceID = 0 ;
List < ParcelAccessListReplyPacket . ListBlock > list = new List < ParcelAccessListReplyPacket . ListBlock > ( ) ;
2008-09-06 07:52:41 +00:00
foreach ( UUID avatar in avatars )
2008-05-05 17:44:40 +00:00
{
ParcelAccessListReplyPacket . ListBlock block = new ParcelAccessListReplyPacket . ListBlock ( ) ;
block . Flags = accessFlag ;
block . ID = avatar ;
block . Time = 0 ;
}
replyPacket . List = list . ToArray ( ) ;
2008-05-10 10:28:49 +00:00
replyPacket . Header . Zerocoded = true ;
2008-05-05 17:44:40 +00:00
this . OutPacket ( ( Packet ) replyPacket , ThrottleOutPacketType . Task ) ;
}
2008-07-08 11:30:08 +00:00
public void SendForceClientSelectObjects ( List < uint > ObjectIDs )
2008-05-05 17:44:40 +00:00
{
bool firstCall = true ;
int MAX_OBJECTS_PER_PACKET = 251 ;
ForceObjectSelectPacket pack = ( ForceObjectSelectPacket ) PacketPool . Instance . GetPacket ( PacketType . ForceObjectSelect ) ;
ForceObjectSelectPacket . DataBlock [ ] data ;
while ( ObjectIDs . Count > 0 )
{
if ( firstCall )
{
pack . _Header . ResetList = true ;
firstCall = false ;
}
else
{
pack . _Header . ResetList = false ;
}
if ( ObjectIDs . Count > MAX_OBJECTS_PER_PACKET )
{
data = new ForceObjectSelectPacket . DataBlock [ MAX_OBJECTS_PER_PACKET ] ;
}
else
{
data = new ForceObjectSelectPacket . DataBlock [ ObjectIDs . Count ] ;
}
int i ;
for ( i = 0 ; i < MAX_OBJECTS_PER_PACKET & & ObjectIDs . Count > 0 ; i + + )
{
data [ i ] = new ForceObjectSelectPacket . DataBlock ( ) ;
data [ i ] . LocalID = Convert . ToUInt32 ( ObjectIDs [ 0 ] ) ;
ObjectIDs . RemoveAt ( 0 ) ;
}
pack . Data = data ;
2008-05-10 10:28:49 +00:00
pack . Header . Zerocoded = true ;
2008-05-05 17:44:40 +00:00
this . OutPacket ( ( Packet ) pack , ThrottleOutPacketType . Task ) ;
}
}
2008-09-06 07:52:41 +00:00
public void SendLandObjectOwners ( Dictionary < UUID , int > ownersAndCount )
2008-05-05 17:44:40 +00:00
{
int notifyCount = ownersAndCount . Count ;
ParcelObjectOwnersReplyPacket pack = ( ParcelObjectOwnersReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . ParcelObjectOwnersReply ) ;
if ( notifyCount > 0 )
{
if ( notifyCount > 32 )
{
m_log . InfoFormat (
"[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}"
+ " - a developer might want to investigate whether this is a hard limit" , 32 ) ;
notifyCount = 32 ;
}
ParcelObjectOwnersReplyPacket . DataBlock [ ] dataBlock
= new ParcelObjectOwnersReplyPacket . DataBlock [ notifyCount ] ;
int num = 0 ;
2008-09-06 07:52:41 +00:00
foreach ( UUID owner in ownersAndCount . Keys )
2008-05-05 17:44:40 +00:00
{
dataBlock [ num ] = new ParcelObjectOwnersReplyPacket . DataBlock ( ) ;
dataBlock [ num ] . Count = ownersAndCount [ owner ] ;
dataBlock [ num ] . IsGroupOwned = false ; //TODO: fix me when group support is added
dataBlock [ num ] . OnlineStatus = true ; //TODO: fix me later
dataBlock [ num ] . OwnerID = owner ;
num + + ;
if ( num > = notifyCount )
{
break ;
}
}
pack . Data = dataBlock ;
}
2008-05-10 10:28:49 +00:00
pack . Header . Zerocoded = true ;
2008-05-05 17:44:40 +00:00
this . OutPacket ( pack , ThrottleOutPacketType . Task ) ;
}
# endregion
2008-05-30 08:35:57 +00:00
#region Helper Methods
2008-05-02 19:21:33 +00:00
2008-09-06 07:52:41 +00:00
protected ImprovedTerseObjectUpdatePacket . ObjectDataBlock CreateAvatarImprovedBlock ( uint localID , Vector3 pos ,
Vector3 velocity ,
Quaternion rotation )
2008-05-02 19:21:33 +00:00
{
byte [ ] bytes = new byte [ 60 ] ;
int i = 0 ;
ImprovedTerseObjectUpdatePacket . ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket . ObjectDataBlock ( ) ;
dat . TextureEntry = new byte [ 0 ] ; // AvatarTemplate.TextureEntry;
uint ID = localID ;
bytes [ i + + ] = ( byte ) ( ID % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ID > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ID > > 16 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ID > > 24 ) % 256 ) ;
bytes [ i + + ] = 0 ;
bytes [ i + + ] = 1 ;
i + = 14 ;
bytes [ i + + ] = 128 ;
bytes [ i + + ] = 63 ;
byte [ ] pb = pos . GetBytes ( ) ;
Array . Copy ( pb , 0 , bytes , i , pb . Length ) ;
i + = 12 ;
ushort InternVelocityX ;
ushort InternVelocityY ;
ushort InternVelocityZ ;
Vector3 internDirec = new Vector3 ( 0 , 0 , 0 ) ;
internDirec = new Vector3 ( velocity . X , velocity . Y , velocity . Z ) ;
internDirec = internDirec / 128.0f ;
2008-09-06 07:52:41 +00:00
internDirec . X + = 1 ;
internDirec . Y + = 1 ;
internDirec . Z + = 1 ;
2008-05-02 19:21:33 +00:00
2008-09-06 07:52:41 +00:00
InternVelocityX = ( ushort ) ( 32768 * internDirec . X ) ;
InternVelocityY = ( ushort ) ( 32768 * internDirec . Y ) ;
InternVelocityZ = ( ushort ) ( 32768 * internDirec . Z ) ;
2008-05-02 19:21:33 +00:00
ushort ac = 32767 ;
bytes [ i + + ] = ( byte ) ( InternVelocityX % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( InternVelocityX > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( InternVelocityY % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( InternVelocityY > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( InternVelocityZ % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( InternVelocityZ > > 8 ) % 256 ) ;
//accel
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
//rotation
ushort rw , rx , ry , rz ;
rw = ( ushort ) ( 32768 * ( rotation . W + 1 ) ) ;
rx = ( ushort ) ( 32768 * ( rotation . X + 1 ) ) ;
ry = ( ushort ) ( 32768 * ( rotation . Y + 1 ) ) ;
rz = ( ushort ) ( 32768 * ( rotation . Z + 1 ) ) ;
//rot
bytes [ i + + ] = ( byte ) ( rx % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rx > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ry % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ry > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( rz % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rz > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( rw % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rw > > 8 ) % 256 ) ;
//rotation vel
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
dat . Data = bytes ;
return ( dat ) ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="localID"></param>
/// <param name="position"></param>
/// <param name="rotation"></param>
/// <returns></returns>
protected ImprovedTerseObjectUpdatePacket . ObjectDataBlock CreatePrimImprovedBlock ( uint localID ,
2008-09-06 07:52:41 +00:00
Vector3 position ,
Quaternion rotation ,
Vector3 velocity ,
Vector3 rotationalvelocity ,
2008-05-02 19:21:33 +00:00
byte state )
{
uint ID = localID ;
byte [ ] bytes = new byte [ 60 ] ;
int i = 0 ;
ImprovedTerseObjectUpdatePacket . ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket . ObjectDataBlock ( ) ;
dat . TextureEntry = new byte [ 0 ] ;
bytes [ i + + ] = ( byte ) ( ID % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ID > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ID > > 16 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ID > > 24 ) % 256 ) ;
bytes [ i + + ] = state ;
bytes [ i + + ] = 0 ;
2008-05-07 15:01:02 +00:00
byte [ ] pb = position . GetBytes ( ) ;
Array . Copy ( pb , 0 , bytes , i , pb . Length ) ;
2008-05-07 14:41:59 +00:00
i + = 12 ;
2008-05-07 15:01:02 +00:00
ushort ac = 32767 ;
2008-05-02 19:21:33 +00:00
2008-05-07 15:01:02 +00:00
ushort velx , vely , velz ;
Vector3 vel = new Vector3 ( velocity . X , velocity . Y , velocity . Z ) ;
vel = vel / 128.0f ;
2008-09-06 07:52:41 +00:00
vel . X + = 1 ;
vel . Y + = 1 ;
vel . Z + = 1 ;
2008-05-07 15:01:02 +00:00
//vel
2008-09-06 07:52:41 +00:00
velx = ( ushort ) ( 32768 * ( vel . X ) ) ;
vely = ( ushort ) ( 32768 * ( vel . Y ) ) ;
velz = ( ushort ) ( 32768 * ( vel . Z ) ) ;
2008-05-07 15:01:02 +00:00
bytes [ i + + ] = ( byte ) ( velx % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( velx > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( vely % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( vely > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( velz % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( velz > > 8 ) % 256 ) ;
2008-05-07 14:41:59 +00:00
2008-05-07 15:01:02 +00:00
//accel
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ac % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ac > > 8 ) % 256 ) ;
2008-05-02 19:21:33 +00:00
ushort rw , rx , ry , rz ;
rw = ( ushort ) ( 32768 * ( rotation . W + 1 ) ) ;
rx = ( ushort ) ( 32768 * ( rotation . X + 1 ) ) ;
ry = ( ushort ) ( 32768 * ( rotation . Y + 1 ) ) ;
rz = ( ushort ) ( 32768 * ( rotation . Z + 1 ) ) ;
//rot
bytes [ i + + ] = ( byte ) ( rx % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rx > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( ry % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( ry > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( rz % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rz > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( rw % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rw > > 8 ) % 256 ) ;
2008-05-07 15:01:02 +00:00
//rotation vel
ushort rvelx , rvely , rvelz ;
Vector3 rvel = new Vector3 ( rotationalvelocity . X , rotationalvelocity . Y , rotationalvelocity . Z ) ;
rvel = rvel / 128.0f ;
2008-09-06 07:52:41 +00:00
rvel . X + = 1 ;
rvel . Y + = 1 ;
rvel . Z + = 1 ;
2008-05-07 15:01:02 +00:00
//vel
2008-09-06 07:52:41 +00:00
rvelx = ( ushort ) ( 32768 * ( rvel . X ) ) ;
rvely = ( ushort ) ( 32768 * ( rvel . Y ) ) ;
rvelz = ( ushort ) ( 32768 * ( rvel . Z ) ) ;
2008-05-07 15:01:02 +00:00
bytes [ i + + ] = ( byte ) ( rvelx % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rvelx > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( rvely % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rvely > > 8 ) % 256 ) ;
bytes [ i + + ] = ( byte ) ( rvelz % 256 ) ;
bytes [ i + + ] = ( byte ) ( ( rvelz > > 8 ) % 256 ) ;
2008-05-02 19:21:33 +00:00
dat . Data = bytes ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
return dat ;
}
/// <summary>
/// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
/// </summary>
/// <param name="primData"></param>
/// <returns></returns>
protected ObjectUpdatePacket . ObjectDataBlock CreatePrimUpdateBlock ( PrimitiveBaseShape primShape , uint flags )
{
ObjectUpdatePacket . ObjectDataBlock objupdate = new ObjectUpdatePacket . ObjectDataBlock ( ) ;
SetDefaultPrimPacketValues ( objupdate ) ;
objupdate . UpdateFlags = flags ;
SetPrimPacketShapeData ( objupdate , primShape ) ;
if ( ( primShape . PCode = = ( byte ) PCode . NewTree ) | | ( primShape . PCode = = ( byte ) PCode . Tree ) | | ( primShape . PCode = = ( byte ) PCode . Grass ) )
{
objupdate . Data = new byte [ 1 ] ;
objupdate . Data [ 0 ] = primShape . State ;
}
return objupdate ;
}
protected void SetPrimPacketShapeData ( ObjectUpdatePacket . ObjectDataBlock objectData , PrimitiveBaseShape primData )
{
objectData . TextureEntry = primData . TextureEntry ;
objectData . PCode = primData . PCode ;
objectData . State = primData . State ;
objectData . PathBegin = primData . PathBegin ;
objectData . PathEnd = primData . PathEnd ;
objectData . PathScaleX = primData . PathScaleX ;
objectData . PathScaleY = primData . PathScaleY ;
objectData . PathShearX = primData . PathShearX ;
objectData . PathShearY = primData . PathShearY ;
objectData . PathSkew = primData . PathSkew ;
objectData . ProfileBegin = primData . ProfileBegin ;
objectData . ProfileEnd = primData . ProfileEnd ;
objectData . Scale = primData . Scale ;
objectData . PathCurve = primData . PathCurve ;
objectData . ProfileCurve = primData . ProfileCurve ;
objectData . ProfileHollow = primData . ProfileHollow ;
objectData . PathRadiusOffset = primData . PathRadiusOffset ;
objectData . PathRevolutions = primData . PathRevolutions ;
objectData . PathTaperX = primData . PathTaperX ;
objectData . PathTaperY = primData . PathTaperY ;
objectData . PathTwist = primData . PathTwist ;
objectData . PathTwistBegin = primData . PathTwistBegin ;
objectData . ExtraParams = primData . ExtraParams ;
}
/// <summary>
/// Set some default values in a ObjectUpdatePacket
/// </summary>
/// <param name="objdata"></param>
protected void SetDefaultPrimPacketValues ( ObjectUpdatePacket . ObjectDataBlock objdata )
{
objdata . PSBlock = new byte [ 0 ] ;
objdata . ExtraParams = new byte [ 1 ] ;
objdata . MediaURL = new byte [ 0 ] ;
objdata . NameValue = new byte [ 0 ] ;
objdata . Text = new byte [ 0 ] ;
objdata . TextColor = new byte [ 4 ] ;
2008-09-06 07:52:41 +00:00
objdata . JointAxisOrAnchor = new Vector3 ( 0 , 0 , 0 ) ;
objdata . JointPivot = new Vector3 ( 0 , 0 , 0 ) ;
2008-05-02 19:21:33 +00:00
objdata . Material = 3 ;
objdata . TextureAnim = new byte [ 0 ] ;
2008-09-06 07:52:41 +00:00
objdata . Sound = UUID . Zero ;
2008-05-02 19:21:33 +00:00
objdata . State = 0 ;
objdata . Data = new byte [ 0 ] ;
objdata . ObjectData = new byte [ 60 ] ;
objdata . ObjectData [ 46 ] = 128 ;
objdata . ObjectData [ 47 ] = 63 ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <returns></returns>
public ObjectUpdatePacket . ObjectDataBlock CreateDefaultAvatarPacket ( byte [ ] textureEntry )
{
ObjectUpdatePacket . ObjectDataBlock objdata = new ObjectUpdatePacket . ObjectDataBlock ( ) ;
2008-09-06 07:52:41 +00:00
// new OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
2008-05-02 19:21:33 +00:00
SetDefaultAvatarPacketValues ( ref objdata ) ;
objdata . UpdateFlags = 61 + ( 9 < < 8 ) + ( 130 < < 16 ) + ( 16 < < 24 ) ;
objdata . PathCurve = 16 ;
objdata . ProfileCurve = 1 ;
objdata . PathScaleX = 100 ;
objdata . PathScaleY = 100 ;
objdata . ParentID = 0 ;
2008-09-06 07:52:41 +00:00
objdata . OwnerID = UUID . Zero ;
objdata . Scale = new Vector3 ( 1 , 1 , 1 ) ;
2008-05-02 19:21:33 +00:00
objdata . PCode = ( byte ) PCode . Avatar ;
if ( textureEntry ! = null )
{
objdata . TextureEntry = textureEntry ;
}
2008-09-06 07:52:41 +00:00
Vector3 pos = new Vector3 ( objdata . ObjectData , 16 ) ;
2008-05-02 19:21:33 +00:00
pos . X = 100f ;
objdata . ID = 8880000 ;
2008-09-06 07:52:41 +00:00
objdata . NameValue = Utils . StringToBytes ( "FirstName STRING RW SV Test \nLastName STRING RW SV User " ) ;
//Vector3 pos2 = new Vector3(100f, 100f, 23f);
2008-05-02 19:21:33 +00:00
//objdata.FullID=user.AgentId;
byte [ ] pb = pos . GetBytes ( ) ;
Array . Copy ( pb , 0 , objdata . ObjectData , 16 , pb . Length ) ;
return objdata ;
}
/// <summary>
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// </summary>
/// <param name="objdata"></param>
protected void SetDefaultAvatarPacketValues ( ref ObjectUpdatePacket . ObjectDataBlock objdata )
{
objdata . PSBlock = new byte [ 0 ] ;
objdata . ExtraParams = new byte [ 1 ] ;
objdata . MediaURL = new byte [ 0 ] ;
objdata . NameValue = new byte [ 0 ] ;
objdata . Text = new byte [ 0 ] ;
objdata . TextColor = new byte [ 4 ] ;
2008-09-06 07:52:41 +00:00
objdata . JointAxisOrAnchor = new Vector3 ( 0 , 0 , 0 ) ;
objdata . JointPivot = new Vector3 ( 0 , 0 , 0 ) ;
2008-05-02 19:21:33 +00:00
objdata . Material = 4 ;
objdata . TextureAnim = new byte [ 0 ] ;
2008-09-06 07:52:41 +00:00
objdata . Sound = UUID . Zero ;
Primitive . TextureEntry ntex = new Primitive . TextureEntry ( new UUID ( "00000000-0000-0000-5005-000000000005" ) ) ;
2008-05-02 19:21:33 +00:00
objdata . TextureEntry = ntex . ToBytes ( ) ;
objdata . State = 0 ;
objdata . Data = new byte [ 0 ] ;
objdata . ObjectData = new byte [ 76 ] ;
objdata . ObjectData [ 15 ] = 128 ;
objdata . ObjectData [ 16 ] = 63 ;
objdata . ObjectData [ 56 ] = 128 ;
objdata . ObjectData [ 61 ] = 102 ;
objdata . ObjectData [ 62 ] = 40 ;
objdata . ObjectData [ 63 ] = 61 ;
objdata . ObjectData [ 64 ] = 189 ;
}
2008-09-06 07:52:41 +00:00
public void SendNameReply ( UUID profileId , string firstname , string lastname )
2008-05-02 19:21:33 +00:00
{
UUIDNameReplyPacket packet = ( UUIDNameReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . UUIDNameReply ) ;
// TODO: don't create new blocks if recycling an old packet
packet . UUIDNameBlock = new UUIDNameReplyPacket . UUIDNameBlockBlock [ 1 ] ;
packet . UUIDNameBlock [ 0 ] = new UUIDNameReplyPacket . UUIDNameBlockBlock ( ) ;
packet . UUIDNameBlock [ 0 ] . ID = profileId ;
2008-09-06 07:52:41 +00:00
packet . UUIDNameBlock [ 0 ] . FirstName = Utils . StringToBytes ( firstname ) ;
packet . UUIDNameBlock [ 0 ] . LastName = Utils . StringToBytes ( lastname ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
# endregion
2008-06-28 00:33:17 +00:00
/// <summary>
/// This is a different way of processing packets then ProcessInPacket
/// </summary>
2008-05-02 19:21:33 +00:00
protected virtual void RegisterLocalPacketHandlers ( )
{
AddLocalPacketHandler ( PacketType . LogoutRequest , Logout ) ;
2008-05-08 04:34:02 +00:00
AddLocalPacketHandler ( PacketType . ViewerEffect , HandleViewerEffect ) ;
2008-05-02 19:21:33 +00:00
AddLocalPacketHandler ( PacketType . AgentCachedTexture , AgentTextureCached ) ;
AddLocalPacketHandler ( PacketType . MultipleObjectUpdate , MultipleObjUpdate ) ;
AddLocalPacketHandler ( PacketType . MoneyTransferRequest , HandleMoneyTransferRequest ) ;
AddLocalPacketHandler ( PacketType . ParcelBuy , HandleParcelBuyRequest ) ;
2008-05-18 03:21:22 +00:00
AddLocalPacketHandler ( PacketType . UUIDGroupNameRequest , HandleUUIDGroupNameRequest ) ;
AddLocalPacketHandler ( PacketType . ObjectGroup , HandleObjectGroupRequest ) ;
2008-09-09 05:25:29 +00:00
AddLocalPacketHandler ( PacketType . GenericMessage , HandleGenericMessage ) ;
2008-05-02 19:21:33 +00:00
}
private bool HandleMoneyTransferRequest ( IClientAPI sender , Packet Pack )
{
MoneyTransferRequestPacket money = ( MoneyTransferRequestPacket ) Pack ;
// validate the agent owns the agentID and sessionID
if ( money . MoneyData . SourceID = = sender . AgentId & & money . AgentData . AgentID = = sender . AgentId & & money . AgentData . SessionID = = sender . SessionId )
{
handlerMoneyTransferRequest = OnMoneyTransferRequest ;
if ( handlerMoneyTransferRequest ! = null )
{
handlerMoneyTransferRequest ( money . MoneyData . SourceID , money . MoneyData . DestID ,
money . MoneyData . Amount , money . MoneyData . TransactionType ,
Util . FieldToString ( money . MoneyData . Description ) ) ;
}
return true ;
}
else
{
return false ;
}
}
private bool HandleParcelBuyRequest ( IClientAPI sender , Packet Pack )
{
ParcelBuyPacket parcel = ( ParcelBuyPacket ) Pack ;
if ( parcel . AgentData . AgentID = = AgentId & & parcel . AgentData . SessionID = = this . SessionId )
{
handlerParcelBuy = OnParcelBuy ;
if ( handlerParcelBuy ! = null )
{
handlerParcelBuy ( parcel . AgentData . AgentID , parcel . Data . GroupID , parcel . Data . Final , parcel . Data . IsGroupOwned ,
parcel . Data . RemoveContribution , parcel . Data . LocalID , parcel . ParcelData . Area , parcel . ParcelData . Price ,
false ) ;
}
return true ;
}
else
{
return false ;
}
}
2008-05-18 03:21:22 +00:00
private bool HandleUUIDGroupNameRequest ( IClientAPI sender , Packet Pack )
{
2008-07-08 11:02:53 +00:00
UUIDGroupNameRequestPacket upack = ( UUIDGroupNameRequestPacket ) Pack ;
2008-05-18 03:21:22 +00:00
2008-07-08 11:02:53 +00:00
for ( int i = 0 ; i < upack . UUIDNameBlock . Length ; i + + )
2008-05-18 03:21:22 +00:00
{
handlerUUIDGroupNameRequest = OnUUIDGroupNameRequest ;
if ( handlerUUIDGroupNameRequest ! = null )
{
2008-07-08 11:02:53 +00:00
handlerUUIDGroupNameRequest ( upack . UUIDNameBlock [ i ] . ID , this ) ;
2008-05-18 03:21:22 +00:00
}
}
return true ;
}
2008-09-09 05:25:29 +00:00
public bool HandleGenericMessage ( IClientAPI sender , Packet pack )
{
GenericMessagePacket gmpack = ( GenericMessagePacket ) pack ;
handlerGenericMessage = OnGenericMessage ;
List < string > msg = new List < string > ( ) ;
2008-09-10 05:17:28 +00:00
if ( handlerGenericMessage ! = null )
2008-09-09 05:25:29 +00:00
{
string method = Util . FieldToString ( gmpack . MethodData . Method ) ;
foreach ( GenericMessagePacket . ParamListBlock block in gmpack . ParamList )
{
msg . Add ( Util . FieldToString ( block . Parameter ) ) ;
}
handlerGenericMessage ( this , method , msg ) ;
}
return true ;
}
2008-05-18 03:21:22 +00:00
public bool HandleObjectGroupRequest ( IClientAPI sender , Packet Pack )
{
2008-05-25 23:27:38 +00:00
2008-05-18 03:21:22 +00:00
ObjectGroupPacket ogpack = ( ObjectGroupPacket ) Pack ;
handlerObjectGroupRequest = OnObjectGroupRequest ;
if ( handlerObjectGroupRequest ! = null )
{
for ( int i = 0 ; i < ogpack . ObjectData . Length ; i + + )
{
2008-09-06 07:52:41 +00:00
handlerObjectGroupRequest ( this , ogpack . AgentData . GroupID , ogpack . ObjectData [ i ] . ObjectLocalID , UUID . Zero ) ;
2008-05-18 03:21:22 +00:00
}
}
return true ;
}
2008-05-02 19:21:33 +00:00
private bool HandleViewerEffect ( IClientAPI sender , Packet Pack )
{
ViewerEffectPacket viewer = ( ViewerEffectPacket ) Pack ;
handlerViewerEffect = OnViewerEffect ;
if ( handlerViewerEffect ! = null )
{
2008-05-07 20:31:48 +00:00
int length = viewer . Effect . Length ;
List < ViewerEffectEventHandlerArg > args = new List < ViewerEffectEventHandlerArg > ( length ) ;
for ( int i = 0 ; i < length ; i + + )
{
//copy the effects block arguments into the event handler arg.
ViewerEffectEventHandlerArg argument = new ViewerEffectEventHandlerArg ( ) ;
argument . AgentID = viewer . Effect [ i ] . AgentID ;
argument . Color = viewer . Effect [ i ] . Color ;
argument . Duration = viewer . Effect [ i ] . Duration ;
argument . ID = viewer . Effect [ i ] . ID ;
argument . Type = viewer . Effect [ i ] . Type ;
2008-05-08 14:09:12 +00:00
argument . TypeData = viewer . Effect [ i ] . TypeData ;
2008-05-07 20:31:48 +00:00
args . Add ( argument ) ;
}
handlerViewerEffect ( sender , args ) ;
2008-05-02 19:21:33 +00:00
}
return true ;
}
2008-05-16 01:22:11 +00:00
2008-09-06 07:52:41 +00:00
public void SendScriptQuestion ( UUID taskID , string taskName , string ownerName , UUID itemID , int question )
2008-05-02 19:21:33 +00:00
{
ScriptQuestionPacket scriptQuestion = ( ScriptQuestionPacket ) PacketPool . Instance . GetPacket ( PacketType . ScriptQuestion ) ;
scriptQuestion . Data = new ScriptQuestionPacket . DataBlock ( ) ;
// TODO: don't create new blocks if recycling an old packet
scriptQuestion . Data . TaskID = taskID ;
scriptQuestion . Data . ItemID = itemID ;
scriptQuestion . Data . Questions = question ;
2008-09-06 07:52:41 +00:00
scriptQuestion . Data . ObjectName = Utils . StringToBytes ( taskName ) ;
scriptQuestion . Data . ObjectOwner = Utils . StringToBytes ( ownerName ) ;
2008-05-02 19:21:33 +00:00
OutPacket ( scriptQuestion , ThrottleOutPacketType . Task ) ;
}
2008-05-14 05:11:23 +00:00
2008-05-12 01:23:03 +00:00
private void InitDefaultAnimations ( )
{
2008-09-13 19:51:56 +00:00
using ( XmlTextReader reader = new XmlTextReader ( "data/avataranimations.xml" ) )
{
XmlDocument doc = new XmlDocument ( ) ;
doc . Load ( reader ) ;
foreach ( XmlNode nod in doc . DocumentElement . ChildNodes )
{
if ( nod . Attributes [ "name" ] ! = null )
{
string name = ( string ) nod . Attributes [ "name" ] . Value . ToLower ( ) ;
string id = ( string ) nod . InnerText ;
2008-09-26 17:25:22 +00:00
m_defaultAnimations . Add ( name , ( UUID ) id ) ;
2008-09-13 19:51:56 +00:00
}
}
}
2008-05-12 01:23:03 +00:00
}
2008-05-11 21:27:12 +00:00
2008-09-06 07:52:41 +00:00
public UUID GetDefaultAnimation ( string name )
2008-05-11 21:27:12 +00:00
{
2008-05-14 05:11:23 +00:00
if ( m_defaultAnimations . ContainsKey ( name ) )
2008-05-11 21:27:12 +00:00
return m_defaultAnimations [ name ] ;
2008-09-06 07:52:41 +00:00
return UUID . Zero ;
2008-05-11 21:27:12 +00:00
}
2008-05-02 19:21:33 +00:00
2008-06-05 01:20:17 +00:00
/// <summary>
/// Handler called when we receive a logout packet.
/// </summary>
/// <param name="client"></param>
/// <param name="packet"></param>
/// <returns></returns>
2008-05-02 19:21:33 +00:00
protected virtual bool Logout ( IClientAPI client , Packet packet )
2008-06-05 01:20:17 +00:00
{
return Logout ( client ) ;
}
2008-07-08 11:02:53 +00:00
2008-06-05 01:20:17 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-05 01:20:17 +00:00
/// </summary>
2008-08-13 21:45:17 +00:00
/// <param name="client"></param>
/// <returns></returns>
2008-06-05 01:20:17 +00:00
protected virtual bool Logout ( IClientAPI client )
2008-05-02 19:21:33 +00:00
{
m_log . Info ( "[CLIENT]: Got a logout request" ) ;
handlerLogout = OnLogout ;
if ( handlerLogout ! = null )
{
handlerLogout ( client ) ;
}
return true ;
}
/// <summary>
/// Send a response back to a client when it asks the asset server (via the region server) if it has
/// its appearance texture cached.
2008-05-16 01:22:11 +00:00
///
2008-05-02 19:21:33 +00:00
/// At the moment, we always reply that there is no cached texture.
/// </summary>
/// <param name="simclient"></param>
/// <param name="packet"></param>
/// <returns></returns>
protected bool AgentTextureCached ( IClientAPI simclient , Packet packet )
{
//Console.WriteLine("texture cached: " + packet.ToString());
AgentCachedTexturePacket cachedtex = ( AgentCachedTexturePacket ) packet ;
AgentCachedTextureResponsePacket cachedresp = ( AgentCachedTextureResponsePacket ) PacketPool . Instance . GetPacket ( PacketType . AgentCachedTextureResponse ) ;
// TODO: don't create new blocks if recycling an old packet
cachedresp . AgentData . AgentID = AgentId ;
cachedresp . AgentData . SessionID = m_sessionId ;
cachedresp . AgentData . SerialNum = m_cachedTextureSerial ;
m_cachedTextureSerial + + ;
cachedresp . WearableData =
new AgentCachedTextureResponsePacket . WearableDataBlock [ cachedtex . WearableData . Length ] ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
for ( int i = 0 ; i < cachedtex . WearableData . Length ; i + + )
{
cachedresp . WearableData [ i ] = new AgentCachedTextureResponsePacket . WearableDataBlock ( ) ;
cachedresp . WearableData [ i ] . TextureIndex = cachedtex . WearableData [ i ] . TextureIndex ;
2008-09-06 07:52:41 +00:00
cachedresp . WearableData [ i ] . TextureID = UUID . Zero ;
2008-05-02 19:21:33 +00:00
cachedresp . WearableData [ i ] . HostName = new byte [ 0 ] ;
}
2008-05-16 01:22:11 +00:00
// Temporarily throw these packets on to the wind queue, so we can identify whether these
2008-05-02 19:21:33 +00:00
// are somehow the source of the packet bloat.
2008-05-10 10:28:49 +00:00
cachedresp . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( cachedresp , ThrottleOutPacketType . Wind ) ;
return true ;
}
protected bool MultipleObjUpdate ( IClientAPI simClient , Packet packet )
{
MultipleObjectUpdatePacket multipleupdate = ( MultipleObjectUpdatePacket ) packet ;
// Console.WriteLine("new multi update packet " + multipleupdate.ToString());
Scene tScene = ( Scene ) m_scene ;
for ( int i = 0 ; i < multipleupdate . ObjectData . Length ; i + + )
{
MultipleObjectUpdatePacket . ObjectDataBlock block = multipleupdate . ObjectData [ i ] ;
// Can't act on Null Data
if ( block . Data ! = null )
{
uint localId = block . ObjectLocalID ;
SceneObjectPart part = tScene . GetSceneObjectPart ( localId ) ;
if ( part = = null )
{
// It's a ghost! tell the client to delete it from view.
2008-09-06 07:52:41 +00:00
simClient . SendKiPrimitive ( Scene . RegionInfo . RegionHandle ,
2008-05-02 19:21:33 +00:00
localId ) ;
}
else
{
2008-09-06 07:52:41 +00:00
// UUID partId = part.UUID;
2008-05-02 19:21:33 +00:00
UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation ;
UpdatePrimGroupRotation handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation ;
switch ( block . Type )
{
case 1 :
2008-09-06 07:52:41 +00:00
Vector3 pos1 = new Vector3 ( block . Data , 0 ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition ;
if ( handlerUpdatePrimSinglePosition ! = null )
{
// Console.WriteLine("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
handlerUpdatePrimSinglePosition ( localId , pos1 , this ) ;
}
break ;
case 2 :
2008-09-06 07:52:41 +00:00
Quaternion rot1 = new Quaternion ( block . Data , 0 , true ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation ;
if ( handlerUpdatePrimSingleRotation ! = null )
{
//Console.WriteLine("new tab rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
handlerUpdatePrimSingleRotation ( localId , rot1 , this ) ;
}
break ;
case 3 :
2008-09-06 07:52:41 +00:00
Quaternion rot2 = new Quaternion ( block . Data , 12 , true ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation ;
if ( handlerUpdatePrimSingleRotation ! = null )
{
//Console.WriteLine("new mouse rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
handlerUpdatePrimSingleRotation ( localId , rot2 , this ) ;
}
break ;
case 5 :
2008-09-06 07:52:41 +00:00
Vector3 scale1 = new Vector3 ( block . Data , 12 ) ;
Vector3 pos11 = new Vector3 ( block . Data , 0 ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimScale = OnUpdatePrimScale ;
if ( handlerUpdatePrimScale ! = null )
{
// Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
handlerUpdatePrimScale ( localId , scale1 , this ) ;
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition ;
if ( handlerUpdatePrimSinglePosition ! = null )
{
handlerUpdatePrimSinglePosition ( localId , pos11 , this ) ;
}
}
break ;
case 9 :
2008-09-06 07:52:41 +00:00
Vector3 pos2 = new Vector3 ( block . Data , 0 ) ;
2008-05-02 19:21:33 +00:00
handlerUpdateVector = OnUpdatePrimGroupPosition ;
if ( handlerUpdateVector ! = null )
{
handlerUpdateVector ( localId , pos2 , this ) ;
}
break ;
case 10 :
2008-09-06 07:52:41 +00:00
Quaternion rot3 = new Quaternion ( block . Data , 0 , true ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimRotation = OnUpdatePrimGroupRotation ;
if ( handlerUpdatePrimRotation ! = null )
{
// Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
handlerUpdatePrimRotation ( localId , rot3 , this ) ;
}
break ;
case 11 :
2008-09-06 07:52:41 +00:00
Vector3 pos3 = new Vector3 ( block . Data , 0 ) ;
Quaternion rot4 = new Quaternion ( block . Data , 12 , true ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation ;
if ( handlerUpdatePrimGroupRotation ! = null )
{
//Console.WriteLine("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
// Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
handlerUpdatePrimGroupRotation ( localId , pos3 , rot4 , this ) ;
}
break ;
case 13 :
2008-09-06 07:52:41 +00:00
Vector3 scale2 = new Vector3 ( block . Data , 12 ) ;
Vector3 pos4 = new Vector3 ( block . Data , 0 ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimScale = OnUpdatePrimScale ;
if ( handlerUpdatePrimScale ! = null )
{
//Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
handlerUpdatePrimScale ( localId , scale2 , this ) ;
// Change the position based on scale (for bug number 246)
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition ;
// Console.WriteLine("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
if ( handlerUpdatePrimSinglePosition ! = null )
{
handlerUpdatePrimSinglePosition ( localId , pos4 , this ) ;
}
}
break ;
case 29 :
2008-09-06 07:52:41 +00:00
Vector3 scale5 = new Vector3 ( block . Data , 12 ) ;
Vector3 pos5 = new Vector3 ( block . Data , 0 ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale ;
if ( handlerUpdatePrimGroupScale ! = null )
{
2008-05-14 05:11:23 +00:00
// Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
2008-05-02 19:21:33 +00:00
handlerUpdatePrimGroupScale ( localId , scale5 , this ) ;
handlerUpdateVector = OnUpdatePrimGroupPosition ;
if ( handlerUpdateVector ! = null )
{
handlerUpdateVector ( localId , pos5 , this ) ;
}
}
break ;
case 21 :
2008-09-06 07:52:41 +00:00
Vector3 scale6 = new Vector3 ( block . Data , 12 ) ;
Vector3 pos6 = new Vector3 ( block . Data , 0 ) ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimScale = OnUpdatePrimScale ;
if ( handlerUpdatePrimScale ! = null )
{
// Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
handlerUpdatePrimScale ( localId , scale6 , this ) ;
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition ;
if ( handlerUpdatePrimSinglePosition ! = null )
{
handlerUpdatePrimSinglePosition ( localId , pos6 , this ) ;
}
}
break ;
}
}
}
}
return true ;
}
public void RequestMapLayer ( )
{
//should be getting the map layer from the grid server
//send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
MapLayerReplyPacket mapReply = ( MapLayerReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . MapLayerReply ) ;
// TODO: don't create new blocks if recycling an old packet
mapReply . AgentData . AgentID = AgentId ;
mapReply . AgentData . Flags = 0 ;
mapReply . LayerData = new MapLayerReplyPacket . LayerDataBlock [ 1 ] ;
mapReply . LayerData [ 0 ] = new MapLayerReplyPacket . LayerDataBlock ( ) ;
mapReply . LayerData [ 0 ] . Bottom = 0 ;
mapReply . LayerData [ 0 ] . Left = 0 ;
mapReply . LayerData [ 0 ] . Top = 30000 ;
mapReply . LayerData [ 0 ] . Right = 30000 ;
2008-09-06 07:52:41 +00:00
mapReply . LayerData [ 0 ] . ImageID = new UUID ( "00000000-0000-1111-9999-000000000006" ) ;
2008-05-10 10:28:49 +00:00
mapReply . Header . Zerocoded = true ;
2008-05-02 19:21:33 +00:00
OutPacket ( mapReply , ThrottleOutPacketType . Land ) ;
}
public void RequestMapBlocksX ( int minX , int minY , int maxX , int maxY )
{
/ *
IList simMapProfiles = m_gridServer . RequestMapBlocks ( minX , minY , maxX , maxY ) ;
MapBlockReplyPacket mbReply = new MapBlockReplyPacket ( ) ;
mbReply . AgentData . AgentId = this . AgentId ;
int len ;
if ( simMapProfiles = = null )
len = 0 ;
else
len = simMapProfiles . Count ;
mbReply . Data = new MapBlockReplyPacket . DataBlock [ len ] ;
int iii ;
for ( iii = 0 ; iii < len ; iii + + )
{
Hashtable mp = ( Hashtable ) simMapProfiles [ iii ] ;
mbReply . Data [ iii ] = new MapBlockReplyPacket . DataBlock ( ) ;
mbReply . Data [ iii ] . Name = System . Text . Encoding . UTF8 . GetBytes ( ( string ) mp [ "name" ] ) ;
mbReply . Data [ iii ] . Access = System . Convert . ToByte ( mp [ "access" ] ) ;
mbReply . Data [ iii ] . Agents = System . Convert . ToByte ( mp [ "agents" ] ) ;
2008-09-06 07:52:41 +00:00
mbReply . Data [ iii ] . MapImageID = new UUID ( ( string ) mp [ "map-image-id" ] ) ;
2008-05-02 19:21:33 +00:00
mbReply . Data [ iii ] . RegionFlags = System . Convert . ToUInt32 ( mp [ "region-flags" ] ) ;
mbReply . Data [ iii ] . WaterHeight = System . Convert . ToByte ( mp [ "water-height" ] ) ;
mbReply . Data [ iii ] . X = System . Convert . ToUInt16 ( mp [ "x" ] ) ;
mbReply . Data [ iii ] . Y = System . Convert . ToUInt16 ( mp [ "y" ] ) ;
}
this . OutPacket ( mbReply , ThrottleOutPacketType . Land ) ;
* /
}
2008-06-28 00:33:17 +00:00
/// <summary>
/// returns a byte array of the client set throttles Gets multiplied by the multiplier
2008-08-18 00:39:10 +00:00
///
2008-06-28 00:33:17 +00:00
/// </summary>
/// <param name="multiplier">non 1 multiplier for subdividing the throttles between individual regions</param>
/// <returns></returns>
2008-05-02 19:21:33 +00:00
public byte [ ] GetThrottlesPacked ( float multiplier )
{
2008-07-22 17:58:42 +00:00
return m_PacketHandler . PacketQueue . GetThrottlesPacked ( multiplier ) ;
2008-05-02 19:21:33 +00:00
}
2008-06-28 00:33:17 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
/// sets the throttles from values supplied by the client
2008-06-28 00:33:17 +00:00
/// </summary>
/// <param name="throttles"></param>
2008-05-02 19:21:33 +00:00
public void SetChildAgentThrottle ( byte [ ] throttles )
{
2008-07-22 17:58:42 +00:00
m_PacketHandler . PacketQueue . SetThrottleFromClient ( throttles ) ;
2008-05-02 19:21:33 +00:00
}
2008-08-08 09:19:23 +00:00
/// <summary>
/// Method gets called when a new packet has arrived from the UDP
/// server. This happens after it's been decoded into a libsl object.
2008-06-28 00:33:17 +00:00
/// </summary>
2008-08-08 09:19:23 +00:00
/// <param name="NewPack">object containing the packet.</param>
public virtual void InPacket ( object NewPack )
2008-05-02 19:21:33 +00:00
{
2008-08-08 09:19:23 +00:00
// Cast NewPack to Packet.
m_PacketHandler . InPacket ( ( Packet ) NewPack ) ;
2008-07-21 15:13:34 +00:00
}
2008-08-25 07:35:17 +00:00
2008-06-28 00:33:17 +00:00
/// <summary>
2008-07-22 17:58:42 +00:00
/// The dreaded OutPacket. This should only be called from within
/// the ClientStack itself right now
/// This is the entry point for simulator packets to go out to
/// the client.
2008-06-28 00:33:17 +00:00
/// </summary>
/// <param name="NewPack"></param>
/// <param name="throttlePacketType">Corresponds to the type of data that is going out. Enum</param>
2008-05-02 19:21:33 +00:00
public virtual void OutPacket ( Packet NewPack , ThrottleOutPacketType throttlePacketType )
{
2008-07-22 17:58:42 +00:00
m_PacketHandler . OutPacket ( NewPack , throttlePacketType ) ;
2008-05-02 19:21:33 +00:00
}
public bool AddMoney ( int debit )
{
if ( m_moneyBalance + debit > = 0 )
{
m_moneyBalance + = debit ;
2008-09-06 07:52:41 +00:00
SendMoneyBalance ( UUID . Zero , true , Utils . StringToBytes ( "Poof Poof!" ) , m_moneyBalance ) ;
2008-05-02 19:21:33 +00:00
return true ;
}
else
{
return false ;
}
}
2008-06-28 00:33:17 +00:00
/// <summary>
/// Breaks down the genericMessagePacket into specific events
/// </summary>
/// <param name="gmMethod"></param>
/// <param name="gmInvoice"></param>
/// <param name="gmParams"></param>
2008-09-06 07:52:41 +00:00
public void DecipherGenericMessage ( string gmMethod , UUID gmInvoice , GenericMessagePacket . ParamListBlock [ ] gmParams )
2008-06-06 12:51:20 +00:00
{
switch ( gmMethod )
{
case "autopilot" :
float locx = 0f ;
float locy = 0f ;
float locz = 0f ;
uint regionX = 0 ;
uint regionY = 0 ;
try
{
2008-07-08 11:02:53 +00:00
Helpers . LongToUInts ( Scene . RegionInfo . RegionHandle , out regionX , out regionY ) ;
2008-09-06 07:52:41 +00:00
locx = Convert . ToSingle ( Utils . BytesToString ( gmParams [ 0 ] . Parameter ) ) - ( float ) regionX ;
locy = Convert . ToSingle ( Utils . BytesToString ( gmParams [ 1 ] . Parameter ) ) - ( float ) regionY ;
locz = Convert . ToSingle ( Utils . BytesToString ( gmParams [ 2 ] . Parameter ) ) ;
2008-06-06 12:51:20 +00:00
}
catch ( InvalidCastException )
{
m_log . Error ( "[CLIENT]: Invalid autopilot request" ) ;
return ;
}
handlerAutoPilotGo = OnAutoPilotGo ;
if ( handlerAutoPilotGo ! = null )
{
2008-09-06 07:52:41 +00:00
handlerAutoPilotGo ( 0 , new Vector3 ( locx , locy , locz ) , this ) ;
2008-06-06 12:51:20 +00:00
}
m_log . InfoFormat ( "[CLIENT]: Client Requests autopilot to position <{0},{1},{2}>" , locx , locy , locz ) ;
2008-05-02 19:21:33 +00:00
2008-06-06 12:51:20 +00:00
break ;
2008-07-08 11:02:53 +00:00
default :
2008-06-06 12:51:20 +00:00
m_log . Debug ( "[CLIENT]: Unknown Generic Message, Method: " + gmMethod + ". Invoice: " + gmInvoice . ToString ( ) + ". Dumping Params:" ) ;
for ( int hi = 0 ; hi < gmParams . Length ; hi + + )
{
System . Console . WriteLine ( gmParams [ hi ] . ToString ( ) ) ;
}
//gmpack.MethodData.
break ;
}
}
2008-06-28 00:33:17 +00:00
/// <summary>
/// Entryway from the client to the simulator
/// all UDP packets from the client will end up here
/// </summary>
2008-09-06 07:52:41 +00:00
/// <param name="Pack">OpenMetaverse.packet</param>
2008-07-22 17:58:42 +00:00
public void ProcessInPacket ( Packet Pack )
2008-05-02 19:21:33 +00:00
{
2008-06-28 00:33:17 +00:00
// check if we've got a local packet handler for this packet.type. See RegisterLocalPacketHandlers()
2008-05-02 19:21:33 +00:00
if ( ProcessPacketMethod ( Pack ) )
{
2008-05-16 01:22:11 +00:00
//there is a handler registered that handled this packet type
2008-05-02 19:21:33 +00:00
return ;
}
else
{
2008-06-28 00:33:17 +00:00
// Main packet processing conditional
2008-05-02 19:21:33 +00:00
switch ( Pack . Type )
{
2008-05-30 08:35:57 +00:00
#region Scene/Avatar
2008-05-02 19:21:33 +00:00
2008-06-06 12:51:20 +00:00
case PacketType . GenericMessage :
GenericMessagePacket gmpack = ( GenericMessagePacket ) Pack ;
2008-07-08 11:02:53 +00:00
2008-09-06 07:52:41 +00:00
DecipherGenericMessage ( Utils . BytesToString ( gmpack . MethodData . Method ) , gmpack . MethodData . Invoice , gmpack . ParamList ) ;
2008-07-08 11:02:53 +00:00
2008-06-06 12:51:20 +00:00
break ;
2008-05-02 19:21:33 +00:00
case PacketType . AvatarPropertiesRequest :
AvatarPropertiesRequestPacket avatarProperties = ( AvatarPropertiesRequestPacket ) Pack ;
handlerRequestAvatarProperties = OnRequestAvatarProperties ;
if ( handlerRequestAvatarProperties ! = null )
{
handlerRequestAvatarProperties ( this , avatarProperties . AgentData . AvatarID ) ;
}
break ;
case PacketType . ChatFromViewer :
ChatFromViewerPacket inchatpack = ( ChatFromViewerPacket ) Pack ;
string fromName = String . Empty ; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
byte [ ] message = inchatpack . ChatData . Message ;
byte type = inchatpack . ChatData . Type ;
2008-09-06 07:52:41 +00:00
Vector3 fromPos = new Vector3 ( ) ; // ClientAvatar.Pos;
// UUID fromAgentID = AgentId;
2008-05-02 19:21:33 +00:00
int channel = inchatpack . ChatData . Channel ;
2008-10-03 14:53:11 +00:00
if ( OnChatFromClient ! = null )
2008-05-02 19:21:33 +00:00
{
2008-07-25 10:05:50 +00:00
OSChatMessage args = new OSChatMessage ( ) ;
2008-05-02 19:21:33 +00:00
args . Channel = channel ;
args . From = fromName ;
2008-09-06 07:52:41 +00:00
args . Message = Utils . BytesToString ( message ) ;
2008-05-02 19:21:33 +00:00
args . Type = ( ChatTypeEnum ) type ;
args . Position = fromPos ;
args . Scene = Scene ;
args . Sender = this ;
2008-10-03 14:53:11 +00:00
handlerChatFromClient = OnChatFromClient ;
if ( handlerChatFromClient ! = null )
handlerChatFromClient ( this , args ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . AvatarPropertiesUpdate :
AvatarPropertiesUpdatePacket Packet = ( AvatarPropertiesUpdatePacket ) Pack ;
handlerUpdateAvatarProperties = OnUpdateAvatarProperties ;
if ( handlerUpdateAvatarProperties ! = null )
{
AvatarPropertiesUpdatePacket . PropertiesDataBlock Properties = Packet . PropertiesData ;
UserProfileData UserProfile = new UserProfileData ( ) ;
UserProfile . ID = AgentId ;
2008-09-06 07:52:41 +00:00
UserProfile . AboutText = Utils . BytesToString ( Properties . AboutText ) ;
UserProfile . FirstLifeAboutText = Utils . BytesToString ( Properties . FLAboutText ) ;
2008-05-02 19:21:33 +00:00
UserProfile . FirstLifeImage = Properties . FLImageID ;
UserProfile . Image = Properties . ImageID ;
handlerUpdateAvatarProperties ( this , UserProfile ) ;
}
break ;
case PacketType . ScriptDialogReply :
ScriptDialogReplyPacket rdialog = ( ScriptDialogReplyPacket ) Pack ;
int ch = rdialog . Data . ChatChannel ;
byte [ ] msg = rdialog . Data . ButtonLabel ;
2008-10-03 14:53:11 +00:00
if ( OnChatFromClient ! = null )
2008-05-02 19:21:33 +00:00
{
2008-07-25 10:05:50 +00:00
OSChatMessage args = new OSChatMessage ( ) ;
2008-05-02 19:21:33 +00:00
args . Channel = ch ;
args . From = String . Empty ;
2008-09-06 07:52:41 +00:00
args . Message = Utils . BytesToString ( msg ) ;
2008-05-02 19:21:33 +00:00
args . Type = ChatTypeEnum . Shout ;
2008-09-06 07:52:41 +00:00
args . Position = new Vector3 ( ) ;
2008-05-02 19:21:33 +00:00
args . Scene = Scene ;
args . Sender = this ;
2008-10-03 14:53:11 +00:00
handlerChatFromClient2 = OnChatFromClient ;
if ( handlerChatFromClient2 ! = null )
handlerChatFromClient2 ( this , args ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . ImprovedInstantMessage :
ImprovedInstantMessagePacket msgpack = ( ImprovedInstantMessagePacket ) Pack ;
string IMfromName = Util . FieldToString ( msgpack . MessageBlock . FromAgentName ) ;
2008-09-06 07:52:41 +00:00
string IMmessage = Utils . BytesToString ( msgpack . MessageBlock . Message ) ;
2008-05-02 19:21:33 +00:00
handlerInstantMessage = OnInstantMessage ;
if ( handlerInstantMessage ! = null )
{
handlerInstantMessage ( this , msgpack . AgentData . AgentID , msgpack . AgentData . SessionID ,
msgpack . MessageBlock . ToAgentID , msgpack . MessageBlock . ID ,
msgpack . MessageBlock . Timestamp , IMfromName , IMmessage ,
msgpack . MessageBlock . Dialog , msgpack . MessageBlock . FromGroup ,
msgpack . MessageBlock . Offline , msgpack . MessageBlock . ParentEstateID ,
msgpack . MessageBlock . Position , msgpack . MessageBlock . RegionID ,
msgpack . MessageBlock . BinaryBucket ) ;
}
break ;
case PacketType . AcceptFriendship :
AcceptFriendshipPacket afriendpack = ( AcceptFriendshipPacket ) Pack ;
// My guess is this is the folder to stick the calling card into
2008-09-06 07:52:41 +00:00
List < UUID > callingCardFolders = new List < UUID > ( ) ;
2008-05-02 19:21:33 +00:00
2008-09-06 07:52:41 +00:00
UUID agentID = afriendpack . AgentData . AgentID ;
UUID transactionID = afriendpack . TransactionBlock . TransactionID ;
2008-05-02 19:21:33 +00:00
for ( int fi = 0 ; fi < afriendpack . FolderData . Length ; fi + + )
{
callingCardFolders . Add ( afriendpack . FolderData [ fi ] . FolderID ) ;
}
handlerApproveFriendRequest = OnApproveFriendRequest ;
if ( handlerApproveFriendRequest ! = null )
{
handlerApproveFriendRequest ( this , agentID , transactionID , callingCardFolders ) ;
}
break ;
case PacketType . TerminateFriendship :
TerminateFriendshipPacket tfriendpack = ( TerminateFriendshipPacket ) Pack ;
2008-09-06 07:52:41 +00:00
UUID listOwnerAgentID = tfriendpack . AgentData . AgentID ;
UUID exFriendID = tfriendpack . ExBlock . OtherID ;
2008-05-02 19:21:33 +00:00
handlerTerminateFriendship = OnTerminateFriendship ;
if ( handlerTerminateFriendship ! = null )
{
handlerTerminateFriendship ( this , listOwnerAgentID , exFriendID ) ;
}
break ;
case PacketType . RezObject :
RezObjectPacket rezPacket = ( RezObjectPacket ) Pack ;
handlerRezObject = OnRezObject ;
if ( handlerRezObject ! = null )
{
//rezPacket.RezData.BypassRaycast;
//rezPacket.RezData.RayEnd;
//rezPacket.RezData.RayEndIsIntersection;
//rezPacket.RezData.RayStart;
//rezPacket.RezData.RayTargetID;
//rezPacket.RezData.RemoveItem;
//rezPacket.RezData.RezSelected;
//rezPacket.RezData.FromTaskID;
//m_log.Info("[REZData]: " + rezPacket.ToString());
handlerRezObject ( this , rezPacket . InventoryData . ItemID , rezPacket . RezData . RayEnd ,
rezPacket . RezData . RayStart , rezPacket . RezData . RayTargetID ,
rezPacket . RezData . BypassRaycast , rezPacket . RezData . RayEndIsIntersection ,
rezPacket . RezData . RezSelected , rezPacket . RezData . RemoveItem ,
rezPacket . RezData . FromTaskID ) ;
}
break ;
case PacketType . DeRezObject :
handlerDeRezObject = OnDeRezObject ;
if ( handlerDeRezObject ! = null )
{
handlerDeRezObject ( Pack , this ) ;
}
break ;
case PacketType . ModifyLand :
ModifyLandPacket modify = ( ModifyLandPacket ) Pack ;
//m_log.Info("[LAND]: LAND:" + modify.ToString());
if ( modify . ParcelData . Length > 0 )
{
if ( OnModifyTerrain ! = null )
{
for ( int i = 0 ; i < modify . ParcelData . Length ; i + + )
{
handlerModifyTerrain = OnModifyTerrain ;
if ( handlerModifyTerrain ! = null )
{
handlerModifyTerrain ( modify . ModifyBlock . Height , modify . ModifyBlock . Seconds ,
modify . ModifyBlock . BrushSize ,
modify . ModifyBlock . Action , modify . ParcelData [ i ] . North ,
modify . ParcelData [ i ] . West , modify . ParcelData [ i ] . South ,
modify . ParcelData [ i ] . East , this ) ;
}
}
}
}
break ;
case PacketType . RegionHandshakeReply :
handlerRegionHandShakeReply = OnRegionHandShakeReply ;
if ( handlerRegionHandShakeReply ! = null )
{
handlerRegionHandShakeReply ( this ) ;
}
break ;
case PacketType . AgentWearablesRequest :
handlerRequestWearables = OnRequestWearables ;
if ( handlerRequestWearables ! = null )
{
handlerRequestWearables ( ) ;
}
handlerRequestAvatarsData = OnRequestAvatarsData ;
if ( handlerRequestAvatarsData ! = null )
{
handlerRequestAvatarsData ( this ) ;
}
break ;
case PacketType . AgentSetAppearance :
AgentSetAppearancePacket appear = ( AgentSetAppearancePacket ) Pack ;
handlerSetAppearance = OnSetAppearance ;
if ( handlerSetAppearance ! = null )
{
// Temporarily protect ourselves from the mantis #951 failure.
// However, we could do this for several other handlers where a failure isn't terminal
2008-05-16 01:22:11 +00:00
// for the client session anyway, in order to protect ourselves against bad code in plugins
2008-05-02 19:21:33 +00:00
try
{
2008-05-07 20:31:48 +00:00
List < byte > visualparams = new List < byte > ( ) ;
foreach ( AgentSetAppearancePacket . VisualParamBlock x in appear . VisualParam )
{
visualparams . Add ( x . ParamValue ) ;
}
handlerSetAppearance ( appear . ObjectData . TextureEntry , visualparams ) ;
2008-05-02 19:21:33 +00:00
}
catch ( Exception e )
{
m_log . ErrorFormat (
2008-05-16 01:22:11 +00:00
"[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}" ,
2008-05-02 19:21:33 +00:00
e ) ;
}
}
break ;
case PacketType . AgentIsNowWearing :
if ( OnAvatarNowWearing ! = null )
{
AgentIsNowWearingPacket nowWearing = ( AgentIsNowWearingPacket ) Pack ;
AvatarWearingArgs wearingArgs = new AvatarWearingArgs ( ) ;
for ( int i = 0 ; i < nowWearing . WearableData . Length ; i + + )
{
AvatarWearingArgs . Wearable wearable =
new AvatarWearingArgs . Wearable ( nowWearing . WearableData [ i ] . ItemID ,
nowWearing . WearableData [ i ] . WearableType ) ;
wearingArgs . NowWearing . Add ( wearable ) ;
}
handlerAvatarNowWearing = OnAvatarNowWearing ;
if ( handlerAvatarNowWearing ! = null )
{
handlerAvatarNowWearing ( this , wearingArgs ) ;
}
}
break ;
case PacketType . RezSingleAttachmentFromInv :
handlerRezSingleAttachment = OnRezSingleAttachmentFromInv ;
if ( handlerRezSingleAttachment ! = null )
{
RezSingleAttachmentFromInvPacket rez = ( RezSingleAttachmentFromInvPacket ) Pack ;
handlerRezSingleAttachment ( this , rez . ObjectData . ItemID ,
2008-10-04 15:54:21 +00:00
rez . ObjectData . AttachmentPt ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . DetachAttachmentIntoInv :
handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv ;
if ( handlerDetachAttachmentIntoInv ! = null )
{
DetachAttachmentIntoInvPacket detachtoInv = ( DetachAttachmentIntoInvPacket ) Pack ;
2008-05-16 01:22:11 +00:00
2008-09-06 07:52:41 +00:00
UUID itemID = detachtoInv . ObjectData . ItemID ;
// UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
2008-05-02 19:21:33 +00:00
handlerDetachAttachmentIntoInv ( itemID , this ) ;
}
break ;
case PacketType . ObjectAttach :
if ( OnObjectAttach ! = null )
{
ObjectAttachPacket att = ( ObjectAttachPacket ) Pack ;
handlerObjectAttach = OnObjectAttach ;
if ( handlerObjectAttach ! = null )
{
if ( att . ObjectData . Length > 0 )
{
handlerObjectAttach ( this , att . ObjectData [ 0 ] . ObjectLocalID , att . AgentData . AttachmentPoint , att . ObjectData [ 0 ] . Rotation ) ;
}
}
}
break ;
case PacketType . ObjectDetach :
ObjectDetachPacket dett = ( ObjectDetachPacket ) Pack ;
for ( int j = 0 ; j < dett . ObjectData . Length ; j + + )
{
uint obj = dett . ObjectData [ j ] . ObjectLocalID ;
handlerObjectDetach = OnObjectDetach ;
if ( handlerObjectDetach ! = null )
{
2008-07-08 11:02:53 +00:00
handlerObjectDetach ( obj , this ) ;
2008-05-02 19:21:33 +00:00
}
}
2008-10-04 01:09:22 +00:00
break ;
case PacketType . ObjectDrop :
ObjectDropPacket dropp = ( ObjectDropPacket ) Pack ;
for ( int j = 0 ; j < dropp . ObjectData . Length ; j + + )
{
uint obj = dropp . ObjectData [ j ] . ObjectLocalID ;
handlerObjectDrop = OnObjectDrop ;
if ( handlerObjectDrop ! = null )
{
handlerObjectDrop ( obj , this ) ;
}
}
2008-05-02 19:21:33 +00:00
break ;
case PacketType . SetAlwaysRun :
SetAlwaysRunPacket run = ( SetAlwaysRunPacket ) Pack ;
handlerSetAlwaysRun = OnSetAlwaysRun ;
if ( handlerSetAlwaysRun ! = null )
handlerSetAlwaysRun ( this , run . AgentData . AlwaysRun ) ;
break ;
case PacketType . CompleteAgentMovement :
handlerCompleteMovementToRegion = OnCompleteMovementToRegion ;
if ( handlerCompleteMovementToRegion ! = null )
{
handlerCompleteMovementToRegion ( ) ;
}
handlerCompleteMovementToRegion = null ;
break ;
case PacketType . AgentUpdate :
if ( OnAgentUpdate ! = null )
{
AgentUpdatePacket agenUpdate = ( AgentUpdatePacket ) Pack ;
2008-05-07 20:31:48 +00:00
AgentUpdatePacket . AgentDataBlock x = agenUpdate . AgentData ;
AgentUpdateArgs arg = new AgentUpdateArgs ( ) ;
2008-07-08 11:02:53 +00:00
arg . AgentID = x . AgentID ;
arg . BodyRotation = x . BodyRotation ;
arg . CameraAtAxis = x . CameraAtAxis ;
arg . CameraCenter = x . CameraCenter ;
arg . CameraLeftAxis = x . CameraLeftAxis ;
arg . CameraUpAxis = x . CameraUpAxis ;
arg . ControlFlags = x . ControlFlags ;
arg . Far = x . Far ;
arg . Flags = x . Flags ;
arg . HeadRotation = x . HeadRotation ;
arg . SessionID = x . SessionID ;
arg . State = x . State ;
2008-05-07 20:31:48 +00:00
2008-05-02 19:21:33 +00:00
handlerAgentUpdate = OnAgentUpdate ;
if ( handlerAgentUpdate ! = null )
2008-05-07 20:31:48 +00:00
OnAgentUpdate ( this , arg ) ;
2008-05-02 19:21:33 +00:00
handlerAgentUpdate = null ;
//agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotationa);
}
break ;
case PacketType . AgentAnimation :
AgentAnimationPacket AgentAni = ( AgentAnimationPacket ) Pack ;
handlerStartAnim = null ;
handlerStopAnim = null ;
for ( int i = 0 ; i < AgentAni . AnimationList . Length ; i + + )
{
if ( AgentAni . AnimationList [ i ] . StartAnim )
{
handlerStartAnim = OnStartAnim ;
if ( handlerStartAnim ! = null )
{
handlerStartAnim ( this , AgentAni . AnimationList [ i ] . AnimID ) ;
}
}
else
{
handlerStopAnim = OnStopAnim ;
if ( handlerStopAnim ! = null )
{
handlerStopAnim ( this , AgentAni . AnimationList [ i ] . AnimID ) ;
}
}
}
break ;
case PacketType . AgentRequestSit :
if ( OnAgentRequestSit ! = null )
{
AgentRequestSitPacket agentRequestSit = ( AgentRequestSitPacket ) Pack ;
handlerAgentRequestSit = OnAgentRequestSit ;
if ( handlerAgentRequestSit ! = null )
handlerAgentRequestSit ( this , agentRequestSit . AgentData . AgentID ,
agentRequestSit . TargetObject . TargetID , agentRequestSit . TargetObject . Offset ) ;
}
break ;
case PacketType . AgentSit :
if ( OnAgentSit ! = null )
{
AgentSitPacket agentSit = ( AgentSitPacket ) Pack ;
handlerAgentSit = OnAgentSit ;
if ( handlerAgentSit ! = null )
{
OnAgentSit ( this , agentSit . AgentData . AgentID ) ;
}
}
break ;
case PacketType . AvatarPickerRequest :
AvatarPickerRequestPacket avRequestQuery = ( AvatarPickerRequestPacket ) Pack ;
AvatarPickerRequestPacket . AgentDataBlock Requestdata = avRequestQuery . AgentData ;
AvatarPickerRequestPacket . DataBlock querydata = avRequestQuery . Data ;
2008-09-06 07:52:41 +00:00
//Console.WriteLine("Agent Sends:" + Utils.BytesToString(querydata.Name));
2008-05-02 19:21:33 +00:00
handlerAvatarPickerRequest = OnAvatarPickerRequest ;
if ( handlerAvatarPickerRequest ! = null )
{
handlerAvatarPickerRequest ( this , Requestdata . AgentID , Requestdata . QueryID ,
2008-09-06 07:52:41 +00:00
Utils . BytesToString ( querydata . Name ) ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . AgentDataUpdateRequest :
AgentDataUpdateRequestPacket avRequestDataUpdatePacket = ( AgentDataUpdateRequestPacket ) Pack ;
handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest ;
if ( handlerAgentDataUpdateRequest ! = null )
{
handlerAgentDataUpdateRequest ( this , avRequestDataUpdatePacket . AgentData . AgentID , avRequestDataUpdatePacket . AgentData . SessionID ) ;
}
break ;
case PacketType . UserInfoRequest :
UserInfoRequestPacket avUserInfoRequestPacket = ( UserInfoRequestPacket ) Pack ;
handlerUserInfoRequest = OnUserInfoRequest ;
if ( handlerUserInfoRequest ! = null )
{
handlerUserInfoRequest ( this , avUserInfoRequestPacket . AgentData . AgentID , avUserInfoRequestPacket . AgentData . SessionID ) ;
}
break ;
case PacketType . SetStartLocationRequest :
SetStartLocationRequestPacket avSetStartLocationRequestPacket = ( SetStartLocationRequestPacket ) Pack ;
if ( avSetStartLocationRequestPacket . AgentData . AgentID = = AgentId & & avSetStartLocationRequestPacket . AgentData . SessionID = = SessionId )
{
handlerSetStartLocationRequest = OnSetStartLocationRequest ;
if ( handlerSetStartLocationRequest ! = null )
{
handlerSetStartLocationRequest ( this , 0 , avSetStartLocationRequestPacket . StartLocationData . LocationPos ,
avSetStartLocationRequestPacket . StartLocationData . LocationLookAt ,
avSetStartLocationRequestPacket . StartLocationData . LocationID ) ;
}
}
break ;
case PacketType . AgentThrottle :
AgentThrottlePacket atpack = ( AgentThrottlePacket ) Pack ;
2008-07-22 17:58:42 +00:00
m_PacketHandler . PacketQueue . SetThrottleFromClient ( atpack . Throttle . Throttles ) ;
2008-05-02 19:21:33 +00:00
break ;
case PacketType . AgentPause :
m_probesWithNoIngressPackets = 0 ;
m_clientBlocked = true ;
break ;
case PacketType . AgentResume :
m_probesWithNoIngressPackets = 0 ;
m_clientBlocked = false ;
SendStartPingCheck ( 0 ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
break ;
2008-05-07 19:41:03 +00:00
case PacketType . ForceScriptControlRelease :
handlerForceReleaseControls = OnForceReleaseControls ;
if ( handlerForceReleaseControls ! = null )
{
handlerForceReleaseControls ( this , AgentId ) ;
}
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
2008-05-30 08:35:57 +00:00
#region Objects/m_sceneObjects
2008-05-02 19:21:33 +00:00
case PacketType . ObjectLink :
ObjectLinkPacket link = ( ObjectLinkPacket ) Pack ;
uint parentprimid = 0 ;
List < uint > childrenprims = new List < uint > ( ) ;
if ( link . ObjectData . Length > 1 )
{
parentprimid = link . ObjectData [ 0 ] . ObjectLocalID ;
for ( int i = 1 ; i < link . ObjectData . Length ; i + + )
{
childrenprims . Add ( link . ObjectData [ i ] . ObjectLocalID ) ;
}
}
handlerLinkObjects = OnLinkObjects ;
if ( handlerLinkObjects ! = null )
{
handlerLinkObjects ( this , parentprimid , childrenprims ) ;
}
break ;
case PacketType . ObjectDelink :
ObjectDelinkPacket delink = ( ObjectDelinkPacket ) Pack ;
// It appears the prim at index 0 is not always the root prim (for
// instance, when one prim of a link set has been edited independently
// of the others). Therefore, we'll pass all the ids onto the delink
// method for it to decide which is the root.
List < uint > prims = new List < uint > ( ) ;
for ( int i = 0 ; i < delink . ObjectData . Length ; i + + )
{
prims . Add ( delink . ObjectData [ i ] . ObjectLocalID ) ;
}
handlerDelinkObjects = OnDelinkObjects ;
if ( handlerDelinkObjects ! = null )
{
handlerDelinkObjects ( prims ) ;
}
break ;
case PacketType . ObjectAdd :
if ( OnAddPrim ! = null )
{
ObjectAddPacket addPacket = ( ObjectAddPacket ) Pack ;
PrimitiveBaseShape shape = GetShapeFromAddPacket ( addPacket ) ;
// m_log.Info("[REZData]: " + addPacket.ToString());
//BypassRaycast: 1
//RayStart: <69.79469, 158.2652, 98.40343>
2008-05-16 01:22:11 +00:00
//RayEnd: <61.97724, 141.995, 92.58341>
2008-05-02 19:21:33 +00:00
//RayTargetID: 00000000-0000-0000-0000-000000000000
2008-05-07 17:33:57 +00:00
//Check to see if adding the prim is allowed; useful for any module wanting to restrict the
//object from rezing initially
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
handlerAddPrim = OnAddPrim ;
if ( handlerAddPrim ! = null )
handlerAddPrim ( AgentId , addPacket . ObjectData . RayEnd , addPacket . ObjectData . Rotation , shape , addPacket . ObjectData . BypassRaycast , addPacket . ObjectData . RayStart , addPacket . ObjectData . RayTargetID , addPacket . ObjectData . RayEndIsIntersection ) ;
}
break ;
case PacketType . ObjectShape :
ObjectShapePacket shapePacket = ( ObjectShapePacket ) Pack ;
handlerUpdatePrimShape = null ;
for ( int i = 0 ; i < shapePacket . ObjectData . Length ; i + + )
{
handlerUpdatePrimShape = OnUpdatePrimShape ;
if ( handlerUpdatePrimShape ! = null )
{
2008-05-07 20:31:48 +00:00
UpdateShapeArgs shapeData = new UpdateShapeArgs ( ) ;
shapeData . ObjectLocalID = shapePacket . ObjectData [ i ] . ObjectLocalID ;
shapeData . PathBegin = shapePacket . ObjectData [ i ] . PathBegin ;
shapeData . PathCurve = shapePacket . ObjectData [ i ] . PathCurve ;
shapeData . PathEnd = shapePacket . ObjectData [ i ] . PathEnd ;
shapeData . PathRadiusOffset = shapePacket . ObjectData [ i ] . PathRadiusOffset ;
shapeData . PathRevolutions = shapePacket . ObjectData [ i ] . PathRevolutions ;
shapeData . PathScaleX = shapePacket . ObjectData [ i ] . PathScaleX ;
shapeData . PathScaleY = shapePacket . ObjectData [ i ] . PathScaleY ;
shapeData . PathShearX = shapePacket . ObjectData [ i ] . PathShearX ;
shapeData . PathShearY = shapePacket . ObjectData [ i ] . PathShearY ;
shapeData . PathSkew = shapePacket . ObjectData [ i ] . PathSkew ;
shapeData . PathTaperX = shapePacket . ObjectData [ i ] . PathTaperX ;
shapeData . PathTaperY = shapePacket . ObjectData [ i ] . PathTaperY ;
shapeData . PathTwist = shapePacket . ObjectData [ i ] . PathTwist ;
shapeData . PathTwistBegin = shapePacket . ObjectData [ i ] . PathTwistBegin ;
shapeData . ProfileBegin = shapePacket . ObjectData [ i ] . ProfileBegin ;
shapeData . ProfileCurve = shapePacket . ObjectData [ i ] . ProfileCurve ;
shapeData . ProfileEnd = shapePacket . ObjectData [ i ] . ProfileEnd ;
shapeData . ProfileHollow = shapePacket . ObjectData [ i ] . ProfileHollow ;
2008-05-02 19:21:33 +00:00
handlerUpdatePrimShape ( m_agentId , shapePacket . ObjectData [ i ] . ObjectLocalID ,
2008-05-07 20:31:48 +00:00
shapeData ) ;
2008-05-02 19:21:33 +00:00
}
}
break ;
case PacketType . ObjectExtraParams :
ObjectExtraParamsPacket extraPar = ( ObjectExtraParamsPacket ) Pack ;
handlerUpdateExtraParams = OnUpdateExtraParams ;
if ( handlerUpdateExtraParams ! = null )
{
handlerUpdateExtraParams ( m_agentId , extraPar . ObjectData [ 0 ] . ObjectLocalID ,
extraPar . ObjectData [ 0 ] . ParamType ,
extraPar . ObjectData [ 0 ] . ParamInUse , extraPar . ObjectData [ 0 ] . ParamData ) ;
}
break ;
case PacketType . ObjectDuplicate :
ObjectDuplicatePacket dupe = ( ObjectDuplicatePacket ) Pack ;
ObjectDuplicatePacket . AgentDataBlock AgentandGroupData = dupe . AgentData ;
handlerObjectDuplicate = null ;
for ( int i = 0 ; i < dupe . ObjectData . Length ; i + + )
{
handlerObjectDuplicate = OnObjectDuplicate ;
if ( handlerObjectDuplicate ! = null )
{
handlerObjectDuplicate ( dupe . ObjectData [ i ] . ObjectLocalID , dupe . SharedData . Offset ,
dupe . SharedData . DuplicateFlags , AgentandGroupData . AgentID ,
AgentandGroupData . GroupID ) ;
}
}
break ;
case PacketType . ObjectSelect :
ObjectSelectPacket incomingselect = ( ObjectSelectPacket ) Pack ;
handlerObjectSelect = null ;
for ( int i = 0 ; i < incomingselect . ObjectData . Length ; i + + )
{
handlerObjectSelect = OnObjectSelect ;
if ( handlerObjectSelect ! = null )
{
handlerObjectSelect ( incomingselect . ObjectData [ i ] . ObjectLocalID , this ) ;
}
}
break ;
case PacketType . ObjectDeselect :
ObjectDeselectPacket incomingdeselect = ( ObjectDeselectPacket ) Pack ;
handlerObjectDeselect = null ;
for ( int i = 0 ; i < incomingdeselect . ObjectData . Length ; i + + )
{
handlerObjectDeselect = OnObjectDeselect ;
if ( handlerObjectDeselect ! = null )
{
OnObjectDeselect ( incomingdeselect . ObjectData [ i ] . ObjectLocalID , this ) ;
}
}
2008-05-11 04:38:02 +00:00
break ;
case PacketType . ObjectPosition :
// DEPRECATED: but till libsecondlife removes it, people will use it
ObjectPositionPacket position = ( ObjectPositionPacket ) Pack ;
2008-07-08 11:02:53 +00:00
for ( int i = 0 ; i < position . ObjectData . Length ; i + + )
2008-05-11 04:38:02 +00:00
{
handlerUpdateVector = OnUpdatePrimGroupPosition ;
if ( handlerUpdateVector ! = null )
handlerUpdateVector ( position . ObjectData [ i ] . ObjectLocalID , position . ObjectData [ i ] . Position , this ) ;
}
break ;
case PacketType . ObjectScale :
// DEPRECATED: but till libsecondlife removes it, people will use it
ObjectScalePacket scale = ( ObjectScalePacket ) Pack ;
2008-07-08 11:02:53 +00:00
for ( int i = 0 ; i < scale . ObjectData . Length ; i + + )
2008-05-11 04:38:02 +00:00
{
handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale ;
if ( handlerUpdatePrimGroupScale ! = null )
handlerUpdatePrimGroupScale ( scale . ObjectData [ i ] . ObjectLocalID , scale . ObjectData [ i ] . Scale , this ) ;
}
break ;
case PacketType . ObjectRotation :
// DEPRECATED: but till libsecondlife removes it, people will use it
ObjectRotationPacket rotation = ( ObjectRotationPacket ) Pack ;
2008-07-08 11:02:53 +00:00
for ( int i = 0 ; i < rotation . ObjectData . Length ; i + + )
2008-05-11 04:38:02 +00:00
{
handlerUpdatePrimRotation = OnUpdatePrimGroupRotation ;
if ( handlerUpdatePrimRotation ! = null )
handlerUpdatePrimRotation ( rotation . ObjectData [ i ] . ObjectLocalID , rotation . ObjectData [ i ] . Rotation , this ) ;
}
2008-05-02 19:21:33 +00:00
break ;
case PacketType . ObjectFlagUpdate :
ObjectFlagUpdatePacket flags = ( ObjectFlagUpdatePacket ) Pack ;
handlerUpdatePrimFlags = OnUpdatePrimFlags ;
if ( handlerUpdatePrimFlags ! = null )
{
handlerUpdatePrimFlags ( flags . AgentData . ObjectLocalID , Pack , this ) ;
}
break ;
case PacketType . ObjectImage :
ObjectImagePacket imagePack = ( ObjectImagePacket ) Pack ;
handlerUpdatePrimTexture = null ;
for ( int i = 0 ; i < imagePack . ObjectData . Length ; i + + )
{
handlerUpdatePrimTexture = OnUpdatePrimTexture ;
if ( handlerUpdatePrimTexture ! = null )
{
handlerUpdatePrimTexture ( imagePack . ObjectData [ i ] . ObjectLocalID ,
imagePack . ObjectData [ i ] . TextureEntry , this ) ;
}
}
break ;
case PacketType . ObjectGrab :
ObjectGrabPacket grab = ( ObjectGrabPacket ) Pack ;
handlerGrabObject = OnGrabObject ;
if ( handlerGrabObject ! = null )
{
handlerGrabObject ( grab . ObjectData . LocalID , grab . ObjectData . GrabOffset , this ) ;
}
break ;
case PacketType . ObjectGrabUpdate :
ObjectGrabUpdatePacket grabUpdate = ( ObjectGrabUpdatePacket ) Pack ;
handlerGrabUpdate = OnGrabUpdate ;
if ( handlerGrabUpdate ! = null )
{
handlerGrabUpdate ( grabUpdate . ObjectData . ObjectID , grabUpdate . ObjectData . GrabOffsetInitial ,
grabUpdate . ObjectData . GrabPosition , this ) ;
}
break ;
case PacketType . ObjectDeGrab :
ObjectDeGrabPacket deGrab = ( ObjectDeGrabPacket ) Pack ;
handlerDeGrabObject = OnDeGrabObject ;
if ( handlerDeGrabObject ! = null )
{
handlerDeGrabObject ( deGrab . ObjectData . LocalID , this ) ;
}
break ;
case PacketType . ObjectDescription :
ObjectDescriptionPacket objDes = ( ObjectDescriptionPacket ) Pack ;
handlerObjectDescription = null ;
for ( int i = 0 ; i < objDes . ObjectData . Length ; i + + )
{
handlerObjectDescription = OnObjectDescription ;
if ( handlerObjectDescription ! = null )
{
handlerObjectDescription ( this , objDes . ObjectData [ i ] . LocalID ,
Util . FieldToString ( objDes . ObjectData [ i ] . Description ) ) ;
}
}
break ;
case PacketType . ObjectName :
ObjectNamePacket objName = ( ObjectNamePacket ) Pack ;
handlerObjectName = null ;
for ( int i = 0 ; i < objName . ObjectData . Length ; i + + )
{
handlerObjectName = OnObjectName ;
if ( handlerObjectName ! = null )
{
handlerObjectName ( this , objName . ObjectData [ i ] . LocalID ,
Util . FieldToString ( objName . ObjectData [ i ] . Name ) ) ;
}
}
break ;
case PacketType . ObjectPermissions :
if ( OnObjectPermissions ! = null )
{
ObjectPermissionsPacket newobjPerms = ( ObjectPermissionsPacket ) Pack ;
2008-09-06 07:52:41 +00:00
UUID AgentID = newobjPerms . AgentData . AgentID ;
UUID SessionID = newobjPerms . AgentData . SessionID ;
2008-05-02 19:21:33 +00:00
handlerObjectPermissions = null ;
for ( int i = 0 ; i < newobjPerms . ObjectData . Length ; i + + )
{
ObjectPermissionsPacket . ObjectDataBlock permChanges = newobjPerms . ObjectData [ i ] ;
byte field = permChanges . Field ;
uint localID = permChanges . ObjectLocalID ;
uint mask = permChanges . Mask ;
byte set = permChanges . Set ;
handlerObjectPermissions = OnObjectPermissions ;
if ( handlerObjectPermissions ! = null )
2008-05-15 19:28:10 +00:00
handlerObjectPermissions ( this , AgentID , SessionID , field , localID , mask , set ) ;
2008-05-02 19:21:33 +00:00
}
}
2008-05-16 01:22:11 +00:00
// Here's our data,
2008-05-02 19:21:33 +00:00
// PermField contains the field the info goes into
// PermField determines which mask we're changing
2008-05-16 01:22:11 +00:00
/ /
2008-05-02 19:21:33 +00:00
// chmask is the mask of the change
// setTF is whether we're adding it or taking it away
/ /
// objLocalID is the localID of the object.
// Unfortunately, we have to pass the event the packet because objData is an array
// That means multiple object perms may be updated in a single packet.
break ;
case PacketType . Undo :
UndoPacket undoitem = ( UndoPacket ) Pack ;
if ( undoitem . ObjectData . Length > 0 )
{
for ( int i = 0 ; i < undoitem . ObjectData . Length ; i + + )
{
2008-09-06 07:52:41 +00:00
UUID objiD = undoitem . ObjectData [ i ] . ObjectID ;
2008-05-02 19:21:33 +00:00
handlerOnUndo = OnUndo ;
if ( handlerOnUndo ! = null )
{
handlerOnUndo ( this , objiD ) ;
}
}
}
break ;
case PacketType . ObjectDuplicateOnRay :
ObjectDuplicateOnRayPacket dupeOnRay = ( ObjectDuplicateOnRayPacket ) Pack ;
handlerObjectDuplicateOnRay = null ;
for ( int i = 0 ; i < dupeOnRay . ObjectData . Length ; i + + )
{
handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay ;
if ( handlerObjectDuplicateOnRay ! = null )
{
handlerObjectDuplicateOnRay ( dupeOnRay . ObjectData [ i ] . ObjectLocalID , dupeOnRay . AgentData . DuplicateFlags ,
dupeOnRay . AgentData . AgentID , dupeOnRay . AgentData . GroupID , dupeOnRay . AgentData . RayTargetID , dupeOnRay . AgentData . RayEnd ,
dupeOnRay . AgentData . RayStart , dupeOnRay . AgentData . BypassRaycast , dupeOnRay . AgentData . RayEndIsIntersection ,
dupeOnRay . AgentData . CopyCenters , dupeOnRay . AgentData . CopyRotates ) ;
}
}
break ;
case PacketType . RequestObjectPropertiesFamily :
//This powers the little tooltip that appears when you move your mouse over an object
RequestObjectPropertiesFamilyPacket packToolTip = ( RequestObjectPropertiesFamilyPacket ) Pack ;
RequestObjectPropertiesFamilyPacket . ObjectDataBlock packObjBlock = packToolTip . ObjectData ;
handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily ;
if ( handlerRequestObjectPropertiesFamily ! = null )
{
handlerRequestObjectPropertiesFamily ( this , m_agentId , packObjBlock . RequestFlags ,
packObjBlock . ObjectID ) ;
}
break ;
case PacketType . ObjectIncludeInSearch :
//This lets us set objects to appear in search (stuff like DataSnapshot, etc)
ObjectIncludeInSearchPacket packInSearch = ( ObjectIncludeInSearchPacket ) Pack ;
handlerObjectIncludeInSearch = null ;
2008-05-14 05:33:32 +00:00
foreach ( ObjectIncludeInSearchPacket . ObjectDataBlock objData in packInSearch . ObjectData )
{
2008-05-02 19:21:33 +00:00
bool inSearch = objData . IncludeInSearch ;
uint localID = objData . ObjectLocalID ;
handlerObjectIncludeInSearch = OnObjectIncludeInSearch ;
2008-05-14 05:33:32 +00:00
if ( handlerObjectIncludeInSearch ! = null )
{
2008-05-02 19:21:33 +00:00
handlerObjectIncludeInSearch ( this , inSearch , localID ) ;
}
}
break ;
case PacketType . ScriptAnswerYes :
ScriptAnswerYesPacket scriptAnswer = ( ScriptAnswerYesPacket ) Pack ;
handlerScriptAnswer = OnScriptAnswer ;
if ( handlerScriptAnswer ! = null )
{
handlerScriptAnswer ( this , scriptAnswer . Data . TaskID , scriptAnswer . Data . ItemID , scriptAnswer . Data . Questions ) ;
}
break ;
2008-09-10 00:19:36 +00:00
case PacketType . ObjectClickAction :
ObjectClickActionPacket ocpacket = ( ObjectClickActionPacket ) Pack ;
2008-09-12 20:42:04 +00:00
handlerObjectClickAction = OnObjectClickAction ;
2008-09-13 22:07:07 +00:00
if ( handlerObjectClickAction ! = null )
2008-09-10 00:19:36 +00:00
{
2008-09-12 20:42:04 +00:00
foreach ( ObjectClickActionPacket . ObjectDataBlock odata in ocpacket . ObjectData )
{
byte action = odata . ClickAction ;
uint localID = odata . ObjectLocalID ;
handlerObjectClickAction ( this , localID , action . ToString ( ) ) ;
}
2008-09-10 00:19:36 +00:00
}
break ;
2008-05-02 19:21:33 +00:00
2008-10-03 12:00:13 +00:00
case PacketType . ObjectMaterial :
ObjectMaterialPacket ompacket = ( ObjectMaterialPacket ) Pack ;
handlerObjectMaterial = OnObjectMaterial ;
if ( handlerObjectMaterial ! = null )
{
foreach ( ObjectMaterialPacket . ObjectDataBlock odata in ompacket . ObjectData )
{
byte material = odata . Material ;
uint localID = odata . ObjectLocalID ;
handlerObjectMaterial ( this , localID , material . ToString ( ) ) ;
}
}
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
2008-05-30 08:35:57 +00:00
#region Inventory/Asset/Other related packets
2008-05-02 19:21:33 +00:00
case PacketType . RequestImage :
RequestImagePacket imageRequest = ( RequestImagePacket ) Pack ;
//Console.WriteLine("image request: " + Pack.ToString());
handlerTextureRequest = null ;
for ( int i = 0 ; i < imageRequest . RequestImage . Length ; i + + )
{
if ( OnRequestTexture ! = null )
{
TextureRequestArgs args = new TextureRequestArgs ( ) ;
args . RequestedAssetID = imageRequest . RequestImage [ i ] . Image ;
args . DiscardLevel = imageRequest . RequestImage [ i ] . DiscardLevel ;
args . PacketNumber = imageRequest . RequestImage [ i ] . Packet ;
args . Priority = imageRequest . RequestImage [ i ] . DownloadPriority ;
handlerTextureRequest = OnRequestTexture ;
if ( handlerTextureRequest ! = null )
OnRequestTexture ( this , args ) ;
}
}
break ;
case PacketType . TransferRequest :
//Console.WriteLine("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
TransferRequestPacket transfer = ( TransferRequestPacket ) Pack ;
2008-07-12 06:24:43 +00:00
// Validate inventory transfers
// Has to be done here, because AssetCache can't do it
/ /
if ( transfer . TransferInfo . SourceType = = 3 )
{
2008-09-26 17:25:22 +00:00
UUID taskID = UUID . Zero ;
UUID itemID = UUID . Zero ;
UUID requestID = UUID . Zero ;
2008-09-06 07:52:41 +00:00
taskID = new UUID ( transfer . TransferInfo . Params , 48 ) ;
itemID = new UUID ( transfer . TransferInfo . Params , 64 ) ;
requestID = new UUID ( transfer . TransferInfo . Params , 80 ) ;
2008-07-12 06:24:43 +00:00
if ( ! ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksBypassPermissions ( ) ) )
{
2008-09-06 07:52:41 +00:00
if ( taskID ! = UUID . Zero ) // Prim
2008-07-12 06:24:43 +00:00
{
SceneObjectPart part = ( ( Scene ) m_scene ) . GetSceneObjectPart ( taskID ) ;
2008-07-23 13:24:25 +00:00
if ( part = = null )
2008-07-12 06:24:43 +00:00
break ;
2008-07-23 13:24:25 +00:00
if ( part . OwnerID ! = AgentId )
2008-07-12 06:24:43 +00:00
break ;
2008-07-23 13:24:25 +00:00
if ( ( part . OwnerMask & ( uint ) PermissionMask . Modify ) = = 0 )
2008-07-12 06:24:43 +00:00
break ;
TaskInventoryItem ti = part . GetInventoryItem ( itemID ) ;
2008-07-23 13:24:25 +00:00
if ( ti = = null )
2008-07-12 06:24:43 +00:00
break ;
2008-07-23 13:24:25 +00:00
if ( ti . OwnerID ! = AgentId )
2008-07-12 06:24:43 +00:00
break ;
2008-07-23 22:14:29 +00:00
if ( ( ti . CurrentPermissions & ( ( uint ) PermissionMask . Modify | ( uint ) PermissionMask . Copy | ( uint ) PermissionMask . Transfer ) ) ! = ( ( uint ) PermissionMask . Modify | ( uint ) PermissionMask . Copy | ( uint ) PermissionMask . Transfer ) )
2008-07-12 06:24:43 +00:00
break ;
2008-07-23 13:24:25 +00:00
if ( ti . AssetID ! = requestID )
2008-07-12 06:24:43 +00:00
break ;
}
else // Agent
{
CachedUserInfo userInfo = ( ( Scene ) m_scene ) . CommsManager . UserProfileCacheService . GetUserDetails ( AgentId ) ;
2008-07-23 13:24:25 +00:00
if ( userInfo = = null )
2008-07-12 06:24:43 +00:00
break ;
2008-07-23 13:24:25 +00:00
if ( userInfo . RootFolder = = null )
2008-07-12 06:24:43 +00:00
break ;
InventoryItemBase assetRequestItem = userInfo . RootFolder . FindItem ( itemID ) ;
2008-07-23 13:24:25 +00:00
if ( assetRequestItem = = null )
2008-07-12 13:42:32 +00:00
{
2008-09-19 17:41:21 +00:00
assetRequestItem = ( ( Scene ) m_scene ) . CommsManager . UserProfileCacheService . LibraryRoot . FindItem ( itemID ) ;
2008-07-23 13:24:25 +00:00
if ( assetRequestItem = = null )
2008-07-12 13:42:32 +00:00
return ;
}
2008-07-12 06:24:43 +00:00
2008-09-22 22:33:00 +00:00
// At this point, we need to apply perms
// only to notecards and scripts. All
// other asset types are always available
/ /
if ( assetRequestItem . AssetType = = 10 )
{
if ( ! ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanViewScript ( itemID , UUID . Zero , AgentId ) )
{
SendAgentAlertMessage ( "Insufficient permissions to view script" , false ) ;
break ;
}
}
else if ( assetRequestItem . AssetType = = 7 )
{
if ( ! ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanViewNotecard ( itemID , UUID . Zero , AgentId ) )
{
SendAgentAlertMessage ( "Insufficient permissions to view notecard" , false ) ;
break ;
}
}
2008-07-23 13:24:25 +00:00
if ( assetRequestItem . AssetID ! = requestID )
2008-07-12 06:24:43 +00:00
break ;
}
}
}
2008-05-02 19:21:33 +00:00
m_assetCache . AddAssetRequest ( this , transfer ) ;
/ * RequestAsset = OnRequestAsset ;
if ( RequestAsset ! = null )
{
RequestAsset ( this , transfer ) ;
} * /
break ;
case PacketType . AssetUploadRequest :
AssetUploadRequestPacket request = ( AssetUploadRequestPacket ) Pack ;
// Console.WriteLine("upload request " + Pack.ToString());
// Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
2008-09-06 07:52:41 +00:00
UUID temp = UUID . Combine ( request . AssetBlock . TransactionID , SecureSessionId ) ;
2008-05-02 19:21:33 +00:00
handlerAssetUploadRequest = OnAssetUploadRequest ;
if ( handlerAssetUploadRequest ! = null )
{
handlerAssetUploadRequest ( this , temp ,
request . AssetBlock . TransactionID , request . AssetBlock . Type ,
request . AssetBlock . AssetData , request . AssetBlock . StoreLocal ,
request . AssetBlock . Tempfile ) ;
}
break ;
case PacketType . RequestXfer :
RequestXferPacket xferReq = ( RequestXferPacket ) Pack ;
handlerRequestXfer = OnRequestXfer ;
if ( handlerRequestXfer ! = null )
{
handlerRequestXfer ( this , xferReq . XferID . ID , Util . FieldToString ( xferReq . XferID . Filename ) ) ;
}
break ;
case PacketType . SendXferPacket :
SendXferPacketPacket xferRec = ( SendXferPacketPacket ) Pack ;
handlerXferReceive = OnXferReceive ;
if ( handlerXferReceive ! = null )
{
handlerXferReceive ( this , xferRec . XferID . ID , xferRec . XferID . Packet , xferRec . DataPacket . Data ) ;
}
break ;
case PacketType . ConfirmXferPacket :
ConfirmXferPacketPacket confirmXfer = ( ConfirmXferPacketPacket ) Pack ;
handlerConfirmXfer = OnConfirmXfer ;
if ( handlerConfirmXfer ! = null )
{
handlerConfirmXfer ( this , confirmXfer . XferID . ID , confirmXfer . XferID . Packet ) ;
}
break ;
case PacketType . CreateInventoryFolder :
CreateInventoryFolderPacket invFolder = ( CreateInventoryFolderPacket ) Pack ;
handlerCreateInventoryFolder = OnCreateNewInventoryFolder ;
if ( handlerCreateInventoryFolder ! = null )
{
handlerCreateInventoryFolder ( this , invFolder . FolderData . FolderID ,
( ushort ) invFolder . FolderData . Type ,
Util . FieldToString ( invFolder . FolderData . Name ) ,
invFolder . FolderData . ParentID ) ;
}
break ;
case PacketType . UpdateInventoryFolder :
if ( OnUpdateInventoryFolder ! = null )
{
UpdateInventoryFolderPacket invFolderx = ( UpdateInventoryFolderPacket ) Pack ;
handlerUpdateInventoryFolder = null ;
for ( int i = 0 ; i < invFolderx . FolderData . Length ; i + + )
{
handlerUpdateInventoryFolder = OnUpdateInventoryFolder ;
if ( handlerUpdateInventoryFolder ! = null )
{
OnUpdateInventoryFolder ( this , invFolderx . FolderData [ i ] . FolderID ,
( ushort ) invFolderx . FolderData [ i ] . Type ,
Util . FieldToString ( invFolderx . FolderData [ i ] . Name ) ,
invFolderx . FolderData [ i ] . ParentID ) ;
}
}
}
break ;
case PacketType . MoveInventoryFolder :
if ( OnMoveInventoryFolder ! = null )
{
MoveInventoryFolderPacket invFoldery = ( MoveInventoryFolderPacket ) Pack ;
handlerMoveInventoryFolder = null ;
for ( int i = 0 ; i < invFoldery . InventoryData . Length ; i + + )
{
handlerMoveInventoryFolder = OnMoveInventoryFolder ;
if ( handlerMoveInventoryFolder ! = null )
{
OnMoveInventoryFolder ( this , invFoldery . InventoryData [ i ] . FolderID ,
invFoldery . InventoryData [ i ] . ParentID ) ;
}
}
}
break ;
case PacketType . CreateInventoryItem :
CreateInventoryItemPacket createItem = ( CreateInventoryItemPacket ) Pack ;
handlerCreateNewInventoryItem = OnCreateNewInventoryItem ;
if ( handlerCreateNewInventoryItem ! = null )
{
handlerCreateNewInventoryItem ( this , createItem . InventoryBlock . TransactionID ,
createItem . InventoryBlock . FolderID ,
createItem . InventoryBlock . CallbackID ,
Util . FieldToString ( createItem . InventoryBlock . Description ) ,
Util . FieldToString ( createItem . InventoryBlock . Name ) ,
createItem . InventoryBlock . InvType ,
createItem . InventoryBlock . Type ,
createItem . InventoryBlock . WearableType ,
2008-07-13 18:57:13 +00:00
createItem . InventoryBlock . NextOwnerMask ,
Util . UnixTimeSinceEpoch ( ) ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . FetchInventory :
if ( OnFetchInventory ! = null )
{
FetchInventoryPacket FetchInventoryx = ( FetchInventoryPacket ) Pack ;
handlerFetchInventory = null ;
for ( int i = 0 ; i < FetchInventoryx . InventoryData . Length ; i + + )
{
handlerFetchInventory = OnFetchInventory ;
if ( handlerFetchInventory ! = null )
{
OnFetchInventory ( this , FetchInventoryx . InventoryData [ i ] . ItemID ,
FetchInventoryx . InventoryData [ i ] . OwnerID ) ;
}
}
}
break ;
case PacketType . FetchInventoryDescendents :
FetchInventoryDescendentsPacket Fetch = ( FetchInventoryDescendentsPacket ) Pack ;
handlerFetchInventoryDescendents = OnFetchInventoryDescendents ;
if ( handlerFetchInventoryDescendents ! = null )
{
handlerFetchInventoryDescendents ( this , Fetch . InventoryData . FolderID , Fetch . InventoryData . OwnerID ,
Fetch . InventoryData . FetchFolders , Fetch . InventoryData . FetchItems ,
Fetch . InventoryData . SortOrder ) ;
}
break ;
case PacketType . PurgeInventoryDescendents :
PurgeInventoryDescendentsPacket Purge = ( PurgeInventoryDescendentsPacket ) Pack ;
handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents ;
if ( handlerPurgeInventoryDescendents ! = null )
{
handlerPurgeInventoryDescendents ( this , Purge . InventoryData . FolderID ) ;
}
break ;
case PacketType . UpdateInventoryItem :
UpdateInventoryItemPacket update = ( UpdateInventoryItemPacket ) Pack ;
if ( OnUpdateInventoryItem ! = null )
{
handlerUpdateInventoryItem = null ;
for ( int i = 0 ; i < update . InventoryData . Length ; i + + )
{
handlerUpdateInventoryItem = OnUpdateInventoryItem ;
if ( handlerUpdateInventoryItem ! = null )
{
InventoryItemBase itemUpd = new InventoryItemBase ( ) ;
itemUpd . ID = update . InventoryData [ i ] . ItemID ;
itemUpd . Name = Util . FieldToString ( update . InventoryData [ i ] . Name ) ;
itemUpd . Description = Util . FieldToString ( update . InventoryData [ i ] . Description ) ;
itemUpd . GroupID = update . InventoryData [ i ] . GroupID ;
itemUpd . GroupOwned = update . InventoryData [ i ] . GroupOwned ;
itemUpd . NextPermissions = update . InventoryData [ i ] . NextOwnerMask ;
itemUpd . EveryOnePermissions = update . InventoryData [ i ] . EveryoneMask ;
itemUpd . CreationDate = update . InventoryData [ i ] . CreationDate ;
itemUpd . Folder = update . InventoryData [ i ] . FolderID ;
itemUpd . InvType = update . InventoryData [ i ] . InvType ;
itemUpd . SalePrice = update . InventoryData [ i ] . SalePrice ;
itemUpd . SaleType = update . InventoryData [ i ] . SaleType ;
itemUpd . Flags = update . InventoryData [ i ] . Flags ;
/ *
OnUpdateInventoryItem ( this , update . InventoryData [ i ] . TransactionID ,
update . InventoryData [ i ] . ItemID ,
Util . FieldToString ( update . InventoryData [ i ] . Name ) ,
Util . FieldToString ( update . InventoryData [ i ] . Description ) ,
update . InventoryData [ i ] . NextOwnerMask ) ;
* /
OnUpdateInventoryItem ( this , update . InventoryData [ i ] . TransactionID ,
update . InventoryData [ i ] . ItemID ,
itemUpd ) ;
}
}
}
//Console.WriteLine(Pack.ToString());
/ * for ( int i = 0 ; i < update . InventoryData . Length ; i + + )
{
2008-09-06 07:52:41 +00:00
if ( update . InventoryData [ i ] . TransactionID ! = UUID . Zero )
2008-05-02 19:21:33 +00:00
{
AssetBase asset = m_assetCache . GetAsset ( update . InventoryData [ i ] . TransactionID . Combine ( this . SecureSessionId ) ) ;
if ( asset ! = null )
{
// Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToString() + " already in cache");
m_inventoryCache . UpdateInventoryItemAsset ( this , update . InventoryData [ i ] . ItemID , asset ) ;
}
else
{
asset = this . UploadAssets . AddUploadToAssetCache ( update . InventoryData [ i ] . TransactionID ) ;
if ( asset ! = null )
{
//Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToString() + " to cache");
m_inventoryCache . UpdateInventoryItemAsset ( this , update . InventoryData [ i ] . ItemID , asset ) ;
}
else
{
//Console.WriteLine("trying to update inventory item, but asset is null");
}
}
}
else
{
m_inventoryCache . UpdateInventoryItemDetails ( this , update . InventoryData [ i ] . ItemID , update . InventoryData [ i ] ) ; ;
}
} * /
break ;
case PacketType . CopyInventoryItem :
CopyInventoryItemPacket copyitem = ( CopyInventoryItemPacket ) Pack ;
handlerCopyInventoryItem = null ;
if ( OnCopyInventoryItem ! = null )
{
foreach ( CopyInventoryItemPacket . InventoryDataBlock datablock in copyitem . InventoryData )
{
handlerCopyInventoryItem = OnCopyInventoryItem ;
if ( handlerCopyInventoryItem ! = null )
{
handlerCopyInventoryItem ( this , datablock . CallbackID , datablock . OldAgentID ,
datablock . OldItemID , datablock . NewFolderID ,
Util . FieldToString ( datablock . NewName ) ) ;
}
}
}
break ;
case PacketType . MoveInventoryItem :
MoveInventoryItemPacket moveitem = ( MoveInventoryItemPacket ) Pack ;
if ( OnMoveInventoryItem ! = null )
{
handlerMoveInventoryItem = null ;
foreach ( MoveInventoryItemPacket . InventoryDataBlock datablock in moveitem . InventoryData )
{
handlerMoveInventoryItem = OnMoveInventoryItem ;
if ( handlerMoveInventoryItem ! = null )
{
handlerMoveInventoryItem ( this , datablock . FolderID , datablock . ItemID , datablock . Length ,
Util . FieldToString ( datablock . NewName ) ) ;
}
}
}
break ;
case PacketType . RemoveInventoryItem :
RemoveInventoryItemPacket removeItem = ( RemoveInventoryItemPacket ) Pack ;
if ( OnRemoveInventoryItem ! = null )
{
handlerRemoveInventoryItem = null ;
foreach ( RemoveInventoryItemPacket . InventoryDataBlock datablock in removeItem . InventoryData )
{
handlerRemoveInventoryItem = OnRemoveInventoryItem ;
if ( handlerRemoveInventoryItem ! = null )
{
handlerRemoveInventoryItem ( this , datablock . ItemID ) ;
}
}
}
break ;
case PacketType . RemoveInventoryFolder :
RemoveInventoryFolderPacket removeFolder = ( RemoveInventoryFolderPacket ) Pack ;
if ( OnRemoveInventoryFolder ! = null )
{
handlerRemoveInventoryFolder = null ;
foreach ( RemoveInventoryFolderPacket . FolderDataBlock datablock in removeFolder . FolderData )
{
handlerRemoveInventoryFolder = OnRemoveInventoryFolder ;
if ( handlerRemoveInventoryFolder ! = null )
{
handlerRemoveInventoryFolder ( this , datablock . FolderID ) ;
}
}
}
break ;
case PacketType . RequestTaskInventory :
RequestTaskInventoryPacket requesttask = ( RequestTaskInventoryPacket ) Pack ;
handlerRequestTaskInventory = OnRequestTaskInventory ;
if ( handlerRequestTaskInventory ! = null )
{
handlerRequestTaskInventory ( this , requesttask . InventoryData . LocalID ) ;
}
break ;
case PacketType . UpdateTaskInventory :
UpdateTaskInventoryPacket updatetask = ( UpdateTaskInventoryPacket ) Pack ;
if ( OnUpdateTaskInventory ! = null )
{
if ( updatetask . UpdateData . Key = = 0 )
{
handlerUpdateTaskInventory = OnUpdateTaskInventory ;
if ( handlerUpdateTaskInventory ! = null )
{
2008-07-08 11:02:53 +00:00
TaskInventoryItem newTaskItem = new TaskInventoryItem ( ) ;
newTaskItem . ItemID = updatetask . InventoryData . ItemID ;
newTaskItem . ParentID = updatetask . InventoryData . FolderID ;
newTaskItem . CreatorID = updatetask . InventoryData . CreatorID ;
newTaskItem . OwnerID = updatetask . InventoryData . OwnerID ;
newTaskItem . GroupID = updatetask . InventoryData . GroupID ;
2008-07-23 22:14:29 +00:00
newTaskItem . BasePermissions = updatetask . InventoryData . BaseMask ;
newTaskItem . CurrentPermissions = updatetask . InventoryData . OwnerMask ;
newTaskItem . GroupPermissions = updatetask . InventoryData . GroupMask ;
newTaskItem . EveryonePermissions = updatetask . InventoryData . EveryoneMask ;
newTaskItem . NextPermissions = updatetask . InventoryData . NextOwnerMask ;
2008-05-23 02:45:52 +00:00
//newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
2008-07-08 11:02:53 +00:00
newTaskItem . Type = updatetask . InventoryData . Type ;
newTaskItem . InvType = updatetask . InventoryData . InvType ;
newTaskItem . Flags = updatetask . InventoryData . Flags ;
2008-05-23 02:45:52 +00:00
//newTaskItem.SaleType=updatetask.InventoryData.SaleType;
//newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;;
2008-07-08 11:02:53 +00:00
newTaskItem . Name = Util . FieldToString ( updatetask . InventoryData . Name ) ;
newTaskItem . Description = Util . FieldToString ( updatetask . InventoryData . Description ) ;
newTaskItem . CreationDate = ( uint ) updatetask . InventoryData . CreationDate ;
2008-05-23 02:45:52 +00:00
handlerUpdateTaskInventory ( this , updatetask . InventoryData . TransactionID ,
newTaskItem , updatetask . UpdateData . LocalID ) ;
2008-05-02 19:21:33 +00:00
}
}
}
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
break ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . RemoveTaskInventory :
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
RemoveTaskInventoryPacket removeTask = ( RemoveTaskInventoryPacket ) Pack ;
handlerRemoveTaskItem = OnRemoveTaskItem ;
if ( handlerRemoveTaskItem ! = null )
{
handlerRemoveTaskItem ( this , removeTask . InventoryData . ItemID , removeTask . InventoryData . LocalID ) ;
}
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
break ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . MoveTaskInventory :
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
MoveTaskInventoryPacket moveTaskInventoryPacket = ( MoveTaskInventoryPacket ) Pack ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
handlerMoveTaskItem = OnMoveTaskItem ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
if ( handlerMoveTaskItem ! = null )
{
handlerMoveTaskItem (
2008-05-16 01:22:11 +00:00
this , moveTaskInventoryPacket . AgentData . FolderID ,
moveTaskInventoryPacket . InventoryData . LocalID ,
2008-05-02 19:21:33 +00:00
moveTaskInventoryPacket . InventoryData . ItemID ) ;
}
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
break ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . RezScript :
//Console.WriteLine(Pack.ToString());
RezScriptPacket rezScriptx = ( RezScriptPacket ) Pack ;
handlerRezScript = OnRezScript ;
2008-07-08 11:02:53 +00:00
InventoryItemBase item = new InventoryItemBase ( ) ;
item . ID = rezScriptx . InventoryBlock . ItemID ;
item . Folder = rezScriptx . InventoryBlock . FolderID ;
item . Creator = rezScriptx . InventoryBlock . CreatorID ;
item . Owner = rezScriptx . InventoryBlock . OwnerID ;
item . BasePermissions = rezScriptx . InventoryBlock . BaseMask ;
item . CurrentPermissions = rezScriptx . InventoryBlock . OwnerMask ;
item . EveryOnePermissions = rezScriptx . InventoryBlock . EveryoneMask ;
item . NextPermissions = rezScriptx . InventoryBlock . NextOwnerMask ;
item . GroupOwned = rezScriptx . InventoryBlock . GroupOwned ;
item . GroupID = rezScriptx . InventoryBlock . GroupID ;
item . AssetType = rezScriptx . InventoryBlock . Type ;
item . InvType = rezScriptx . InventoryBlock . InvType ;
item . Flags = rezScriptx . InventoryBlock . Flags ;
item . SaleType = rezScriptx . InventoryBlock . SaleType ;
item . SalePrice = rezScriptx . InventoryBlock . SalePrice ;
item . Name = Util . FieldToString ( rezScriptx . InventoryBlock . Name ) ;
item . Description = Util . FieldToString ( rezScriptx . InventoryBlock . Description ) ;
item . CreationDate = ( int ) rezScriptx . InventoryBlock . CreationDate ;
2008-05-02 19:21:33 +00:00
if ( handlerRezScript ! = null )
{
2008-05-16 23:11:00 +00:00
handlerRezScript ( this , item , rezScriptx . InventoryBlock . TransactionID , rezScriptx . UpdateBlock . ObjectLocalID ) ;
2008-05-02 19:21:33 +00:00
}
break ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . MapLayerRequest :
RequestMapLayer ( ) ;
break ;
case PacketType . MapBlockRequest :
MapBlockRequestPacket MapRequest = ( MapBlockRequestPacket ) Pack ;
handlerRequestMapBlocks = OnRequestMapBlocks ;
if ( handlerRequestMapBlocks ! = null )
{
handlerRequestMapBlocks ( this , MapRequest . PositionData . MinX , MapRequest . PositionData . MinY ,
2008-06-25 20:03:16 +00:00
MapRequest . PositionData . MaxX , MapRequest . PositionData . MaxY , MapRequest . AgentData . Flags ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . MapNameRequest :
MapNameRequestPacket map = ( MapNameRequestPacket ) Pack ;
string mapName = UTF8Encoding . UTF8 . GetString ( map . NameData . Name , 0 ,
map . NameData . Name . Length - 1 ) ;
handlerMapNameRequest = OnMapNameRequest ;
if ( handlerMapNameRequest ! = null )
{
handlerMapNameRequest ( this , mapName ) ;
}
break ;
case PacketType . TeleportLandmarkRequest :
TeleportLandmarkRequestPacket tpReq = ( TeleportLandmarkRequestPacket ) Pack ;
2008-09-06 07:52:41 +00:00
UUID lmid = tpReq . Info . LandmarkID ;
2008-05-02 19:21:33 +00:00
AssetLandmark lm ;
2008-09-06 07:52:41 +00:00
if ( lmid ! = UUID . Zero )
2008-05-02 19:21:33 +00:00
{
AssetBase lma = m_assetCache . GetAsset ( lmid , false ) ;
if ( lma = = null )
{
// Failed to find landmark
TeleportCancelPacket tpCancel = ( TeleportCancelPacket ) PacketPool . Instance . GetPacket ( PacketType . TeleportCancel ) ;
tpCancel . Info . SessionID = tpReq . Info . SessionID ;
tpCancel . Info . AgentID = tpReq . Info . AgentID ;
OutPacket ( tpCancel , ThrottleOutPacketType . Task ) ;
}
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
try
{
lm = new AssetLandmark ( lma ) ;
}
catch ( NullReferenceException )
{
// asset not found generates null ref inside the assetlandmark constructor.
TeleportCancelPacket tpCancel = ( TeleportCancelPacket ) PacketPool . Instance . GetPacket ( PacketType . TeleportCancel ) ;
tpCancel . Info . SessionID = tpReq . Info . SessionID ;
tpCancel . Info . AgentID = tpReq . Info . AgentID ;
OutPacket ( tpCancel , ThrottleOutPacketType . Task ) ;
break ;
}
}
else
{
// Teleport home request
handlerTeleportHomeRequest = OnTeleportHomeRequest ;
if ( handlerTeleportHomeRequest ! = null )
{
2008-07-08 11:02:53 +00:00
handlerTeleportHomeRequest ( this . AgentId , this ) ;
2008-05-02 19:21:33 +00:00
}
break ;
}
handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest ;
if ( handlerTeleportLandmarkRequest ! = null )
{
2008-08-14 00:04:37 +00:00
handlerTeleportLandmarkRequest ( this , lm . RegionID , lm . Position ) ;
2008-05-02 19:21:33 +00:00
}
else
{
//no event handler so cancel request
TeleportCancelPacket tpCancel = ( TeleportCancelPacket ) PacketPool . Instance . GetPacket ( PacketType . TeleportCancel ) ;
tpCancel . Info . AgentID = tpReq . Info . AgentID ;
tpCancel . Info . SessionID = tpReq . Info . SessionID ;
OutPacket ( tpCancel , ThrottleOutPacketType . Task ) ;
}
break ;
case PacketType . TeleportLocationRequest :
TeleportLocationRequestPacket tpLocReq = ( TeleportLocationRequestPacket ) Pack ;
// Console.WriteLine(tpLocReq.ToString());
handlerTeleportLocationRequest = OnTeleportLocationRequest ;
if ( handlerTeleportLocationRequest ! = null )
{
handlerTeleportLocationRequest ( this , tpLocReq . Info . RegionHandle , tpLocReq . Info . Position ,
tpLocReq . Info . LookAt , 16 ) ;
}
else
{
//no event handler so cancel request
TeleportCancelPacket tpCancel = ( TeleportCancelPacket ) PacketPool . Instance . GetPacket ( PacketType . TeleportCancel ) ;
tpCancel . Info . SessionID = tpLocReq . AgentData . SessionID ;
tpCancel . Info . AgentID = tpLocReq . AgentData . AgentID ;
OutPacket ( tpCancel , ThrottleOutPacketType . Task ) ;
}
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . UUIDNameRequest :
UUIDNameRequestPacket incoming = ( UUIDNameRequestPacket ) Pack ;
foreach ( UUIDNameRequestPacket . UUIDNameBlockBlock UUIDBlock in incoming . UUIDNameBlock )
{
handlerNameRequest = OnNameFromUUIDRequest ;
if ( handlerNameRequest ! = null )
{
handlerNameRequest ( UUIDBlock . ID , this ) ;
}
}
break ;
2008-05-30 08:35:57 +00:00
#region Parcel related packets
2008-05-02 19:21:33 +00:00
2008-08-16 19:20:14 +00:00
case PacketType . RegionHandleRequest :
RegionHandleRequestPacket rhrPack = ( RegionHandleRequestPacket ) Pack ;
2008-08-18 00:39:10 +00:00
2008-08-16 19:20:14 +00:00
handlerRegionHandleRequest = OnRegionHandleRequest ;
if ( handlerRegionHandleRequest ! = null )
{
handlerRegionHandleRequest ( this , rhrPack . RequestBlock . RegionID ) ;
}
break ;
2008-08-18 00:39:10 +00:00
2008-08-16 19:20:14 +00:00
case PacketType . ParcelInfoRequest :
ParcelInfoRequestPacket pirPack = ( ParcelInfoRequestPacket ) Pack ;
2008-08-18 00:39:10 +00:00
2008-08-16 19:20:14 +00:00
handlerParcelInfoRequest = OnParcelInfoRequest ;
if ( handlerParcelInfoRequest ! = null )
{
handlerParcelInfoRequest ( this , pirPack . Data . ParcelID ) ;
}
break ;
2008-08-18 00:39:10 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . ParcelAccessListRequest :
ParcelAccessListRequestPacket requestPacket = ( ParcelAccessListRequestPacket ) Pack ;
handlerParcelAccessListRequest = OnParcelAccessListRequest ;
if ( handlerParcelAccessListRequest ! = null )
{
handlerParcelAccessListRequest ( requestPacket . AgentData . AgentID , requestPacket . AgentData . SessionID ,
requestPacket . Data . Flags , requestPacket . Data . SequenceID ,
requestPacket . Data . LocalID , this ) ;
}
break ;
case PacketType . ParcelAccessListUpdate :
ParcelAccessListUpdatePacket updatePacket = ( ParcelAccessListUpdatePacket ) Pack ;
List < ParcelManager . ParcelAccessEntry > entries = new List < ParcelManager . ParcelAccessEntry > ( ) ;
foreach ( ParcelAccessListUpdatePacket . ListBlock block in updatePacket . List )
{
ParcelManager . ParcelAccessEntry entry = new ParcelManager . ParcelAccessEntry ( ) ;
entry . AgentID = block . ID ;
2008-09-26 17:25:22 +00:00
entry . Flags = ( AccessList ) block . Flags ;
2008-05-02 19:21:33 +00:00
entry . Time = new DateTime ( ) ;
entries . Add ( entry ) ;
}
handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest ;
if ( handlerParcelAccessListUpdateRequest ! = null )
{
handlerParcelAccessListUpdateRequest ( updatePacket . AgentData . AgentID ,
updatePacket . AgentData . SessionID , updatePacket . Data . Flags ,
updatePacket . Data . LocalID , entries , this ) ;
}
break ;
case PacketType . ParcelPropertiesRequest :
ParcelPropertiesRequestPacket propertiesRequest = ( ParcelPropertiesRequestPacket ) Pack ;
handlerParcelPropertiesRequest = OnParcelPropertiesRequest ;
if ( handlerParcelPropertiesRequest ! = null )
{
handlerParcelPropertiesRequest ( ( int ) Math . Round ( propertiesRequest . ParcelData . West ) ,
( int ) Math . Round ( propertiesRequest . ParcelData . South ) ,
( int ) Math . Round ( propertiesRequest . ParcelData . East ) ,
( int ) Math . Round ( propertiesRequest . ParcelData . North ) ,
propertiesRequest . ParcelData . SequenceID ,
propertiesRequest . ParcelData . SnapSelection , this ) ;
}
break ;
case PacketType . ParcelDivide :
ParcelDividePacket landDivide = ( ParcelDividePacket ) Pack ;
handlerParcelDivideRequest = OnParcelDivideRequest ;
if ( handlerParcelDivideRequest ! = null )
{
handlerParcelDivideRequest ( ( int ) Math . Round ( landDivide . ParcelData . West ) ,
( int ) Math . Round ( landDivide . ParcelData . South ) ,
( int ) Math . Round ( landDivide . ParcelData . East ) ,
( int ) Math . Round ( landDivide . ParcelData . North ) , this ) ;
}
break ;
case PacketType . ParcelJoin :
ParcelJoinPacket landJoin = ( ParcelJoinPacket ) Pack ;
handlerParcelJoinRequest = OnParcelJoinRequest ;
if ( handlerParcelJoinRequest ! = null )
{
handlerParcelJoinRequest ( ( int ) Math . Round ( landJoin . ParcelData . West ) ,
( int ) Math . Round ( landJoin . ParcelData . South ) ,
( int ) Math . Round ( landJoin . ParcelData . East ) ,
( int ) Math . Round ( landJoin . ParcelData . North ) , this ) ;
}
break ;
case PacketType . ParcelPropertiesUpdate :
ParcelPropertiesUpdatePacket parcelPropertiesPacket = ( ParcelPropertiesUpdatePacket ) Pack ;
handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest ;
if ( handlerParcelPropertiesUpdateRequest ! = null )
{
2008-05-05 17:44:40 +00:00
LandUpdateArgs args = new LandUpdateArgs ( ) ;
args . AuthBuyerID = parcelPropertiesPacket . ParcelData . AuthBuyerID ;
args . Category = ( Parcel . ParcelCategory ) parcelPropertiesPacket . ParcelData . Category ;
2008-09-06 07:52:41 +00:00
args . Desc = Utils . BytesToString ( parcelPropertiesPacket . ParcelData . Desc ) ;
2008-05-05 17:44:40 +00:00
args . GroupID = parcelPropertiesPacket . ParcelData . GroupID ;
args . LandingType = parcelPropertiesPacket . ParcelData . LandingType ;
args . MediaAutoScale = parcelPropertiesPacket . ParcelData . MediaAutoScale ;
args . MediaID = parcelPropertiesPacket . ParcelData . MediaID ;
2008-09-06 07:52:41 +00:00
args . MediaURL = Utils . BytesToString ( parcelPropertiesPacket . ParcelData . MediaURL ) ;
args . MusicURL = Utils . BytesToString ( parcelPropertiesPacket . ParcelData . MusicURL ) ;
args . Name = Utils . BytesToString ( parcelPropertiesPacket . ParcelData . Name ) ;
2008-05-05 17:44:40 +00:00
args . ParcelFlags = parcelPropertiesPacket . ParcelData . ParcelFlags ;
args . PassHours = parcelPropertiesPacket . ParcelData . PassHours ;
args . PassPrice = parcelPropertiesPacket . ParcelData . PassPrice ;
args . SalePrice = parcelPropertiesPacket . ParcelData . SalePrice ;
args . SnapshotID = parcelPropertiesPacket . ParcelData . SnapshotID ;
args . UserLocation = parcelPropertiesPacket . ParcelData . UserLocation ;
args . UserLookAt = parcelPropertiesPacket . ParcelData . UserLookAt ;
handlerParcelPropertiesUpdateRequest ( args , parcelPropertiesPacket . ParcelData . LocalID , this ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . ParcelSelectObjects :
ParcelSelectObjectsPacket selectPacket = ( ParcelSelectObjectsPacket ) Pack ;
handlerParcelSelectObjects = OnParcelSelectObjects ;
if ( handlerParcelSelectObjects ! = null )
{
handlerParcelSelectObjects ( selectPacket . ParcelData . LocalID ,
Convert . ToInt32 ( selectPacket . ParcelData . ReturnType ) , this ) ;
}
break ;
case PacketType . ParcelObjectOwnersRequest :
//Console.WriteLine(Pack.ToString());
ParcelObjectOwnersRequestPacket reqPacket = ( ParcelObjectOwnersRequestPacket ) Pack ;
handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest ;
if ( handlerParcelObjectOwnerRequest ! = null )
{
handlerParcelObjectOwnerRequest ( reqPacket . ParcelData . LocalID , this ) ;
}
break ;
2008-05-13 16:22:57 +00:00
case PacketType . ParcelRelease :
ParcelReleasePacket releasePacket = ( ParcelReleasePacket ) Pack ;
2008-05-16 01:22:11 +00:00
2008-05-13 16:22:57 +00:00
handlerParcelAbandonRequest = OnParcelAbandonRequest ;
if ( handlerParcelAbandonRequest ! = null )
{
handlerParcelAbandonRequest ( releasePacket . Data . LocalID , this ) ;
}
break ;
2008-06-26 13:45:36 +00:00
case PacketType . ParcelReclaim :
ParcelReclaimPacket reclaimPacket = ( ParcelReclaimPacket ) Pack ;
handlerParcelReclaim = OnParcelReclaim ;
if ( handlerParcelReclaim ! = null )
{
handlerParcelReclaim ( reclaimPacket . Data . LocalID , this ) ;
}
break ;
2008-05-24 11:10:21 +00:00
case PacketType . ParcelReturnObjects :
2008-05-25 23:27:38 +00:00
2008-05-24 11:10:21 +00:00
ParcelReturnObjectsPacket parcelReturnObjects = ( ParcelReturnObjectsPacket ) Pack ;
2008-05-25 23:27:38 +00:00
2008-09-06 07:52:41 +00:00
UUID [ ] puserselectedOwnerIDs = new UUID [ parcelReturnObjects . OwnerIDs . Length ] ;
2008-05-24 11:10:21 +00:00
for ( int parceliterator = 0 ; parceliterator < parcelReturnObjects . OwnerIDs . Length ; parceliterator + + )
puserselectedOwnerIDs [ parceliterator ] = parcelReturnObjects . OwnerIDs [ parceliterator ] . OwnerID ;
2008-09-06 07:52:41 +00:00
UUID [ ] puserselectedTaskIDs = new UUID [ parcelReturnObjects . TaskIDs . Length ] ;
2008-05-24 11:10:21 +00:00
for ( int parceliterator = 0 ; parceliterator < parcelReturnObjects . TaskIDs . Length ; parceliterator + + )
puserselectedTaskIDs [ parceliterator ] = parcelReturnObjects . TaskIDs [ parceliterator ] . TaskID ;
handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest ;
if ( handlerParcelReturnObjectsRequest ! = null )
{
2008-07-08 11:02:53 +00:00
handlerParcelReturnObjectsRequest ( parcelReturnObjects . ParcelData . LocalID , parcelReturnObjects . ParcelData . ReturnType , puserselectedOwnerIDs , puserselectedTaskIDs , this ) ;
2008-05-25 23:27:38 +00:00
2008-05-24 11:10:21 +00:00
}
break ;
2008-05-25 23:27:38 +00:00
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
2008-05-30 08:35:57 +00:00
#region Estate Packets
2008-05-02 19:21:33 +00:00
case PacketType . EstateOwnerMessage :
EstateOwnerMessagePacket messagePacket = ( EstateOwnerMessagePacket ) Pack ;
2008-09-06 07:52:41 +00:00
switch ( Utils . BytesToString ( messagePacket . MethodData . Method ) )
2008-05-02 19:21:33 +00:00
{
2008-05-04 18:59:18 +00:00
case "getinfo" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
OnDetailedEstateDataRequest ( this , messagePacket . MethodData . Invoice ) ;
}
break ;
case "setregioninfo" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
2008-07-08 11:02:53 +00:00
OnSetEstateFlagsRequest ( convertParamStringToBool ( messagePacket . ParamList [ 0 ] . Parameter ) , convertParamStringToBool ( messagePacket . ParamList [ 1 ] . Parameter ) ,
2008-05-04 18:59:18 +00:00
convertParamStringToBool ( messagePacket . ParamList [ 2 ] . Parameter ) , ! convertParamStringToBool ( messagePacket . ParamList [ 3 ] . Parameter ) ,
2008-09-06 07:52:41 +00:00
Convert . ToInt16 ( Convert . ToDecimal ( Utils . BytesToString ( messagePacket . ParamList [ 4 ] . Parameter ) ) ) ,
( float ) Convert . ToDecimal ( Utils . BytesToString ( messagePacket . ParamList [ 5 ] . Parameter ) ) ,
Convert . ToInt16 ( Utils . BytesToString ( messagePacket . ParamList [ 6 ] . Parameter ) ) ,
2008-07-08 11:02:53 +00:00
convertParamStringToBool ( messagePacket . ParamList [ 7 ] . Parameter ) , convertParamStringToBool ( messagePacket . ParamList [ 8 ] . Parameter ) ) ;
2008-05-04 18:59:18 +00:00
}
break ;
2008-07-14 01:39:36 +00:00
// case "texturebase":
2008-08-14 18:08:22 +00:00
// if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(this.AgentId, false))
2008-07-14 01:39:36 +00:00
// {
// foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
// {
2008-09-06 07:52:41 +00:00
// string s = Utils.BytesToString(block.Parameter);
2008-07-14 01:39:36 +00:00
// string[] splitField = s.Split(' ');
// if (splitField.Length == 2)
// {
2008-09-06 07:52:41 +00:00
// UUID tempUUID = new UUID(splitField[1]);
2008-07-14 01:39:36 +00:00
// OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
// }
// }
// }
// break;
2008-05-04 18:59:18 +00:00
case "texturedetail" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
foreach ( EstateOwnerMessagePacket . ParamListBlock block in messagePacket . ParamList )
{
2008-09-06 07:52:41 +00:00
string s = Utils . BytesToString ( block . Parameter ) ;
2008-05-04 18:59:18 +00:00
string [ ] splitField = s . Split ( ' ' ) ;
if ( splitField . Length = = 2 )
{
Int16 corner = Convert . ToInt16 ( splitField [ 0 ] ) ;
2008-09-06 07:52:41 +00:00
UUID textureUUID = new UUID ( splitField [ 1 ] ) ;
2008-05-04 18:59:18 +00:00
2008-07-08 11:02:53 +00:00
OnSetEstateTerrainDetailTexture ( this , corner , textureUUID ) ;
2008-05-04 18:59:18 +00:00
}
}
}
break ;
case "textureheights" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
foreach ( EstateOwnerMessagePacket . ParamListBlock block in messagePacket . ParamList )
{
2008-09-06 07:52:41 +00:00
string s = Utils . BytesToString ( block . Parameter ) ;
2008-05-04 18:59:18 +00:00
string [ ] splitField = s . Split ( ' ' ) ;
if ( splitField . Length = = 3 )
{
Int16 corner = Convert . ToInt16 ( splitField [ 0 ] ) ;
float lowValue = ( float ) Convert . ToDecimal ( splitField [ 1 ] ) ;
float highValue = ( float ) Convert . ToDecimal ( splitField [ 2 ] ) ;
2008-07-08 11:02:53 +00:00
OnSetEstateTerrainTextureHeights ( this , corner , lowValue , highValue ) ;
2008-05-04 18:59:18 +00:00
}
}
}
break ;
case "texturecommit" :
OnCommitEstateTerrainTextureRequest ( this ) ;
break ;
case "setregionterrain" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
if ( messagePacket . ParamList . Length ! = 9 )
{
m_log . Error ( "EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length" ) ;
}
else
{
try
{
string tmp ;
2008-09-06 07:52:41 +00:00
tmp = Utils . BytesToString ( messagePacket . ParamList [ 0 ] . Parameter ) ;
2008-05-04 18:59:18 +00:00
if ( ! tmp . Contains ( "." ) ) tmp + = ".00" ;
float WaterHeight = ( float ) Convert . ToDecimal ( tmp ) ;
2008-09-06 07:52:41 +00:00
tmp = Utils . BytesToString ( messagePacket . ParamList [ 1 ] . Parameter ) ;
2008-05-04 18:59:18 +00:00
if ( ! tmp . Contains ( "." ) ) tmp + = ".00" ;
float TerrainRaiseLimit = ( float ) Convert . ToDecimal ( tmp ) ;
2008-09-06 07:52:41 +00:00
tmp = Utils . BytesToString ( messagePacket . ParamList [ 2 ] . Parameter ) ;
2008-05-04 18:59:18 +00:00
if ( ! tmp . Contains ( "." ) ) tmp + = ".00" ;
float TerrainLowerLimit = ( float ) Convert . ToDecimal ( tmp ) ;
2008-07-18 02:40:47 +00:00
bool UseEstateSun = convertParamStringToBool ( messagePacket . ParamList [ 3 ] . Parameter ) ;
2008-05-04 18:59:18 +00:00
bool UseFixedSun = convertParamStringToBool ( messagePacket . ParamList [ 4 ] . Parameter ) ;
2008-09-06 07:52:41 +00:00
float SunHour = ( float ) Convert . ToDecimal ( Utils . BytesToString ( messagePacket . ParamList [ 5 ] . Parameter ) ) ;
2008-07-18 02:40:47 +00:00
bool UseGlobal = convertParamStringToBool ( messagePacket . ParamList [ 6 ] . Parameter ) ;
bool EstateFixedSun = convertParamStringToBool ( messagePacket . ParamList [ 7 ] . Parameter ) ;
2008-09-06 07:52:41 +00:00
float EstateSunHour = ( float ) Convert . ToDecimal ( Utils . BytesToString ( messagePacket . ParamList [ 8 ] . Parameter ) ) ;
2008-05-04 18:59:18 +00:00
2008-07-18 02:40:47 +00:00
OnSetRegionTerrainSettings ( WaterHeight , TerrainRaiseLimit , TerrainLowerLimit , UseEstateSun , UseFixedSun , SunHour , UseGlobal , EstateFixedSun , EstateSunHour ) ;
2008-05-16 01:22:11 +00:00
2008-05-04 18:59:18 +00:00
}
catch ( Exception ex )
{
m_log . Error ( "EstateOwnerMessage: Exception while setting terrain settings: \n" + messagePacket . ToString ( ) + "\n" + ex . ToString ( ) ) ;
}
}
}
break ;
case "restart" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
// There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
foreach ( EstateOwnerMessagePacket . ParamListBlock block in messagePacket . ParamList )
{
float timeSeconds = 0 ;
2008-09-06 07:52:41 +00:00
Utils . TryParseSingle ( Utils . BytesToString ( block . Parameter ) , out timeSeconds ) ;
2008-05-04 18:59:18 +00:00
timeSeconds = ( int ) timeSeconds ;
OnEstateRestartSimRequest ( this , ( int ) timeSeconds ) ;
}
}
break ;
case "estatechangecovenantid" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
foreach ( EstateOwnerMessagePacket . ParamListBlock block in messagePacket . ParamList )
{
2008-09-06 07:52:41 +00:00
UUID newCovenantID = new UUID ( Utils . BytesToString ( block . Parameter ) ) ;
2008-05-04 18:59:18 +00:00
OnEstateChangeCovenantRequest ( this , newCovenantID ) ;
}
}
break ;
case "estateaccessdelta" : // Estate access delta manages the banlist and allow list too.
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
2008-09-06 07:52:41 +00:00
int estateAccessType = Convert . ToInt16 ( Utils . BytesToString ( messagePacket . ParamList [ 1 ] . Parameter ) ) ;
OnUpdateEstateAccessDeltaRequest ( this , messagePacket . MethodData . Invoice , estateAccessType , new UUID ( Utils . BytesToString ( messagePacket . ParamList [ 2 ] . Parameter ) ) ) ;
2008-05-04 18:59:18 +00:00
}
break ;
case "simulatormessage" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
2008-09-06 07:52:41 +00:00
UUID invoice = messagePacket . MethodData . Invoice ;
UUID SenderID = new UUID ( Utils . BytesToString ( messagePacket . ParamList [ 2 ] . Parameter ) ) ;
string SenderName = Utils . BytesToString ( messagePacket . ParamList [ 3 ] . Parameter ) ;
string Message = Utils . BytesToString ( messagePacket . ParamList [ 4 ] . Parameter ) ;
UUID sessionID = messagePacket . AgentData . SessionID ;
2008-07-08 11:02:53 +00:00
OnSimulatorBlueBoxMessageRequest ( this , invoice , SenderID , sessionID , SenderName , Message ) ;
2008-05-04 18:59:18 +00:00
}
break ;
case "instantmessage" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
2008-07-27 19:12:40 +00:00
if ( messagePacket . ParamList . Length < 5 )
break ;
2008-09-06 07:52:41 +00:00
UUID invoice = messagePacket . MethodData . Invoice ;
UUID SenderID = new UUID ( Utils . BytesToString ( messagePacket . ParamList [ 2 ] . Parameter ) ) ;
string SenderName = Utils . BytesToString ( messagePacket . ParamList [ 3 ] . Parameter ) ;
string Message = Utils . BytesToString ( messagePacket . ParamList [ 4 ] . Parameter ) ;
UUID sessionID = messagePacket . AgentData . SessionID ;
2008-07-08 11:02:53 +00:00
OnEstateBlueBoxMessageRequest ( this , invoice , SenderID , sessionID , SenderName , Message ) ;
2008-05-04 18:59:18 +00:00
}
break ;
case "setregiondebug" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
2008-09-06 07:52:41 +00:00
UUID invoice = messagePacket . MethodData . Invoice ;
UUID SenderID = messagePacket . AgentData . AgentID ;
2008-05-04 18:59:18 +00:00
bool scripted = convertParamStringToBool ( messagePacket . ParamList [ 0 ] . Parameter ) ;
bool collisionEvents = convertParamStringToBool ( messagePacket . ParamList [ 1 ] . Parameter ) ;
bool physics = convertParamStringToBool ( messagePacket . ParamList [ 2 ] . Parameter ) ;
2008-07-08 11:02:53 +00:00
OnEstateDebugRegionRequest ( this , invoice , SenderID , scripted , collisionEvents , physics ) ;
2008-05-04 18:59:18 +00:00
}
break ;
case "teleporthomeuser" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-05-04 18:59:18 +00:00
{
2008-09-06 07:52:41 +00:00
UUID invoice = messagePacket . MethodData . Invoice ;
UUID SenderID = messagePacket . AgentData . AgentID ;
UUID Prey = UUID . Zero ;
2008-05-04 18:59:18 +00:00
2008-09-06 07:52:41 +00:00
UUID . TryParse ( Utils . BytesToString ( messagePacket . ParamList [ 1 ] . Parameter ) , out Prey ) ;
2008-05-16 01:22:11 +00:00
2008-07-08 11:02:53 +00:00
OnEstateTeleportOneUserHomeRequest ( this , invoice , SenderID , Prey ) ;
2008-05-04 18:59:18 +00:00
}
break ;
2008-09-28 22:01:37 +00:00
case "teleporthomeallusers" :
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
{
UUID invoice = messagePacket . MethodData . Invoice ;
UUID SenderID = messagePacket . AgentData . AgentID ;
OnEstateTeleportAllUsersHomeRequest ( this , invoice , SenderID ) ;
}
break ;
2008-05-25 11:22:05 +00:00
case "colliders" :
handlerLandStatRequest = OnLandStatRequest ;
if ( handlerLandStatRequest ! = null )
{
handlerLandStatRequest ( 0 , 1 , 0 , "" , this ) ;
}
break ;
2008-05-25 20:50:45 +00:00
case "scripts" :
handlerLandStatRequest = OnLandStatRequest ;
if ( handlerLandStatRequest ! = null )
{
handlerLandStatRequest ( 0 , 0 , 0 , "" , this ) ;
}
break ;
2008-06-19 20:57:00 +00:00
case "terrain" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-06-19 20:57:00 +00:00
{
handlerBakeTerrain = OnBakeTerrain ;
if ( handlerBakeTerrain ! = null )
{
handlerBakeTerrain ( this ) ;
}
}
break ;
2008-07-18 02:40:47 +00:00
case "estatechangeinfo" :
2008-08-14 18:08:22 +00:00
if ( ( ( Scene ) m_scene ) . ExternalChecks . ExternalChecksCanIssueEstateCommand ( this . AgentId , false ) )
2008-07-18 02:40:47 +00:00
{
2008-09-06 07:52:41 +00:00
UUID invoice = messagePacket . MethodData . Invoice ;
UUID SenderID = messagePacket . AgentData . AgentID ;
UInt32 param1 = Convert . ToUInt32 ( Utils . BytesToString ( messagePacket . ParamList [ 1 ] . Parameter ) ) ;
UInt32 param2 = Convert . ToUInt32 ( Utils . BytesToString ( messagePacket . ParamList [ 2 ] . Parameter ) ) ;
2008-07-18 02:40:47 +00:00
handlerEstateChangeInfo = OnEstateChangeInfo ;
if ( handlerEstateChangeInfo ! = null )
{
handlerEstateChangeInfo ( this , invoice , SenderID , param1 , param2 ) ;
}
}
break ;
2008-05-04 18:59:18 +00:00
default :
m_log . Error ( "EstateOwnerMessage: Unknown method requested\n" + messagePacket . ToString ( ) ) ;
break ;
2008-05-02 19:21:33 +00:00
}
break ;
2008-05-25 11:22:05 +00:00
case PacketType . LandStatRequest :
LandStatRequestPacket lsrp = ( LandStatRequestPacket ) Pack ;
2008-05-25 23:27:38 +00:00
2008-05-25 11:22:05 +00:00
handlerLandStatRequest = OnLandStatRequest ;
if ( handlerLandStatRequest ! = null )
{
2008-09-06 07:52:41 +00:00
handlerLandStatRequest ( lsrp . RequestData . ParcelLocalID , lsrp . RequestData . ReportType , lsrp . RequestData . RequestFlags , Utils . BytesToString ( lsrp . RequestData . Filter ) , this ) ;
2008-05-25 11:22:05 +00:00
}
//int parcelID, uint reportType, uint requestflags, string filter
//lsrp.RequestData.ParcelLocalID;
//lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
//lsrp.RequestData.RequestFlags;
//lsrp.RequestData.Filter;
2008-05-25 23:27:38 +00:00
2008-05-25 11:22:05 +00:00
break ;
2008-05-02 19:21:33 +00:00
case PacketType . RequestRegionInfo :
2008-06-27 23:03:39 +00:00
// RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
2008-05-02 19:21:33 +00:00
handlerRegionInfoRequest = OnRegionInfoRequest ;
if ( handlerRegionInfoRequest ! = null )
{
2008-05-04 18:59:18 +00:00
handlerRegionInfoRequest ( this ) ;
2008-05-02 19:21:33 +00:00
}
break ;
case PacketType . EstateCovenantRequest :
2008-06-27 23:03:39 +00:00
// EstateCovenantRequestPacket.AgentDataBlock epack =
// ((EstateCovenantRequestPacket)Pack).AgentData;
2008-05-02 19:21:33 +00:00
handlerEstateCovenantRequest = OnEstateCovenantRequest ;
if ( handlerEstateCovenantRequest ! = null )
{
2008-05-04 18:59:18 +00:00
handlerEstateCovenantRequest ( this ) ;
2008-05-02 19:21:33 +00:00
}
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
2008-05-30 08:35:57 +00:00
#region GodPackets
2008-05-02 19:21:33 +00:00
case PacketType . RequestGodlikePowers :
RequestGodlikePowersPacket rglpPack = ( RequestGodlikePowersPacket ) Pack ;
RequestGodlikePowersPacket . RequestBlockBlock rblock = rglpPack . RequestBlock ;
2008-09-06 07:52:41 +00:00
UUID token = rblock . Token ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
RequestGodlikePowersPacket . AgentDataBlock ablock = rglpPack . AgentData ;
handlerReqGodlikePowers = OnRequestGodlikePowers ;
if ( handlerReqGodlikePowers ! = null )
{
handlerReqGodlikePowers ( ablock . AgentID , ablock . SessionID , token , rblock . Godlike , this ) ;
}
break ;
case PacketType . GodKickUser :
GodKickUserPacket gkupack = ( GodKickUserPacket ) Pack ;
if ( gkupack . UserInfo . GodSessionID = = SessionId & & AgentId = = gkupack . UserInfo . GodID )
{
handlerGodKickUser = OnGodKickUser ;
if ( handlerGodKickUser ! = null )
{
handlerGodKickUser ( gkupack . UserInfo . GodID , gkupack . UserInfo . GodSessionID ,
gkupack . UserInfo . AgentID , ( uint ) 0 , gkupack . UserInfo . Reason ) ;
}
}
else
{
SendAgentAlertMessage ( "Kick request denied" , false ) ;
}
//KickUserPacket kupack = new KickUserPacket();
//KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo;
//kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID;
//kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID;
//kupack.TargetBlock.TargetIP = (uint)0;
//kupack.TargetBlock.TargetPort = (ushort)0;
//kupack.UserInfo.Reason = gkupack.UserInfo.Reason;
//OutPacket(kupack, ThrottleOutPacketType.Task);
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
2008-05-30 08:35:57 +00:00
#region Economy/Transaction Packets
2008-05-02 19:21:33 +00:00
case PacketType . MoneyBalanceRequest :
MoneyBalanceRequestPacket moneybalancerequestpacket = ( MoneyBalanceRequestPacket ) Pack ;
handlerMoneyBalanceRequest = OnMoneyBalanceRequest ;
if ( handlerMoneyBalanceRequest ! = null )
{
handlerMoneyBalanceRequest ( this , moneybalancerequestpacket . AgentData . AgentID , moneybalancerequestpacket . AgentData . SessionID , moneybalancerequestpacket . MoneyData . TransactionID ) ;
}
break ;
case PacketType . EconomyDataRequest :
handlerEconomoyDataRequest = OnEconomyDataRequest ;
if ( handlerEconomoyDataRequest ! = null )
{
handlerEconomoyDataRequest ( AgentId ) ;
}
// TODO: handle this packet
//m_log.Warn("[CLIENT]: unhandled EconomyDataRequest packet");
break ;
case PacketType . RequestPayPrice :
RequestPayPricePacket requestPayPricePacket = ( RequestPayPricePacket ) Pack ;
handlerRequestPayPrice = OnRequestPayPrice ;
if ( handlerRequestPayPrice ! = null )
{
handlerRequestPayPrice ( this , requestPayPricePacket . ObjectData . ObjectID ) ;
}
break ;
2008-08-24 00:51:21 +00:00
case PacketType . ObjectSaleInfo :
ObjectSaleInfoPacket objectSaleInfoPacket = ( ObjectSaleInfoPacket ) Pack ;
handlerObjectSaleInfo = OnObjectSaleInfo ;
if ( handlerObjectSaleInfo ! = null )
{
foreach ( ObjectSaleInfoPacket . ObjectDataBlock d
in objectSaleInfoPacket . ObjectData )
{
handlerObjectSaleInfo ( this ,
objectSaleInfoPacket . AgentData . AgentID ,
objectSaleInfoPacket . AgentData . SessionID ,
d . LocalID ,
d . SaleType ,
d . SalePrice ) ;
}
}
break ;
case PacketType . ObjectBuy :
ObjectBuyPacket objectBuyPacket = ( ObjectBuyPacket ) Pack ;
handlerObjectBuy = OnObjectBuy ;
Console . WriteLine ( objectBuyPacket . ToString ( ) ) ;
if ( handlerObjectBuy ! = null )
{
foreach ( ObjectBuyPacket . ObjectDataBlock d
in objectBuyPacket . ObjectData )
{
handlerObjectBuy ( this ,
objectBuyPacket . AgentData . AgentID ,
objectBuyPacket . AgentData . SessionID ,
objectBuyPacket . AgentData . GroupID ,
objectBuyPacket . AgentData . CategoryID ,
d . ObjectLocalID ,
d . SaleType ,
d . SalePrice ) ;
}
}
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
2008-07-08 11:02:53 +00:00
#region Script Packets
case PacketType . GetScriptRunning :
GetScriptRunningPacket scriptRunning = ( GetScriptRunningPacket ) Pack ;
handlerGetScriptRunning = OnGetScriptRunning ;
if ( handlerGetScriptRunning ! = null )
{
handlerGetScriptRunning ( this , scriptRunning . Script . ObjectID , scriptRunning . Script . ItemID ) ;
}
break ;
case PacketType . SetScriptRunning :
SetScriptRunningPacket setScriptRunning = ( SetScriptRunningPacket ) Pack ;
handlerSetScriptRunning = OnSetScriptRunning ;
if ( handlerSetScriptRunning ! = null )
{
handlerSetScriptRunning ( this , setScriptRunning . Script . ObjectID , setScriptRunning . Script . ItemID , setScriptRunning . Script . Running ) ;
}
break ;
case PacketType . ScriptReset :
ScriptResetPacket scriptResetPacket = ( ScriptResetPacket ) Pack ;
handlerScriptReset = OnScriptReset ;
if ( handlerScriptReset ! = null )
{
handlerScriptReset ( this , scriptResetPacket . Script . ObjectID , scriptResetPacket . Script . ItemID ) ;
}
break ;
# endregion
2008-08-20 01:48:51 +00:00
#region Gesture Managment
case PacketType . ActivateGestures :
ActivateGesturesPacket activateGesturePacket = ( ActivateGesturesPacket ) Pack ;
handlerActivateGesture = OnActivateGesture ;
if ( handlerActivateGesture ! = null )
{
handlerActivateGesture ( this ,
2008-09-18 15:54:27 +00:00
activateGesturePacket . Data [ 0 ] . AssetID ,
activateGesturePacket . Data [ 0 ] . ItemID ) ;
2008-08-20 01:48:51 +00:00
}
else m_log . Error ( "Null pointer for activateGesture" ) ;
2008-08-28 14:41:54 +00:00
2008-08-20 01:48:51 +00:00
break ;
case PacketType . DeactivateGestures :
DeactivateGesturesPacket deactivateGesturePacket = ( DeactivateGesturesPacket ) Pack ;
handlerDeactivateGesture = OnDeactivateGesture ;
if ( handlerDeactivateGesture ! = null )
{
handlerDeactivateGesture ( this , deactivateGesturePacket . Data [ 0 ] . ItemID ) ;
}
break ;
# endregion
2008-05-30 08:35:57 +00:00
#region unimplemented handlers
2008-05-02 19:21:33 +00:00
case PacketType . StartPingCheck :
// Send the client the ping response back
// Pass the same PingID in the matching packet
// Handled In the packet processing
//m_log.Debug("[CLIENT]: possibly unhandled StartPingCheck packet");
break ;
case PacketType . CompletePingCheck :
// TODO: Perhaps this should be processed on the Sim to determine whether or not to drop a dead client
//m_log.Warn("[CLIENT]: unhandled CompletePingCheck packet");
break ;
2008-07-08 11:02:53 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . ViewerStats :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled ViewerStats packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . CreateGroupRequest :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled CreateGroupRequest packet");
2008-05-02 19:21:33 +00:00
break ;
2008-06-06 12:51:20 +00:00
//case PacketType.GenericMessage:
2008-07-08 11:02:53 +00:00
// TODO: handle this packet
//m_log.Warn("[CLIENT]: unhandled GenericMessage packet");
//break;
2008-05-02 19:21:33 +00:00
case PacketType . MapItemRequest :
// TODO: handle this packet
2008-10-06 00:00:55 +00:00
MapItemRequestPacket mirpk = ( MapItemRequestPacket ) Pack ;
//System.Console.WriteLine(mirpk.ToString());
handlerMapItemRequest = OnMapItemRequest ;
if ( handlerMapItemRequest ! = null )
{
handlerMapItemRequest ( this , mirpk . AgentData . Flags , mirpk . AgentData . EstateID ,
mirpk . AgentData . Godlike , mirpk . RequestData . ItemType ,
mirpk . RequestData . RegionHandle ) ;
}
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled MapItemRequest packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . TransferAbort :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled TransferAbort packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . MuteListRequest :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled MuteListRequest packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . ParcelDwellRequest :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled ParcelDwellRequest packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . UseCircuitCode :
// TODO: Don't display this one, we handle it at a lower level
//m_log.Warn("[CLIENT]: unhandled UseCircuitCode packet");
break ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
case PacketType . AgentHeightWidth :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled AgentHeightWidth packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . ObjectSpinStop :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . SoundTrigger :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled SoundTrigger packet");
2008-05-02 19:21:33 +00:00
break ;
case PacketType . InventoryDescendents :
// TODO: handle this packet
2008-08-25 22:01:51 +00:00
//m_log.Warn("[CLIENT]: unhandled InventoryDescent packet");
2008-05-02 19:21:33 +00:00
break ;
2008-10-04 22:29:37 +00:00
case PacketType . DirPlacesQuery :
DirPlacesQueryPacket dirPlacesQueryPacket = ( DirPlacesQueryPacket ) Pack ;
2008-10-05 05:00:30 +00:00
//Console.WriteLine(dirPlacesQueryPacket.ToString());
2008-10-04 22:29:37 +00:00
handlerDirPlacesQuery = OnDirPlacesQuery ;
if ( handlerDirPlacesQuery ! = null )
{
handlerDirPlacesQuery ( this ,
dirPlacesQueryPacket . QueryData . QueryID ,
Utils . BytesToString (
dirPlacesQueryPacket . QueryData . QueryText ) ,
( int ) dirPlacesQueryPacket . QueryData . QueryFlags ,
( int ) dirPlacesQueryPacket . QueryData . Category ,
Utils . BytesToString (
dirPlacesQueryPacket . QueryData . SimName ) ,
dirPlacesQueryPacket . QueryData . QueryStart ) ;
}
break ;
2008-05-02 19:21:33 +00:00
default :
m_log . Warn ( "[CLIENT]: unhandled packet " + Pack . ToString ( ) ) ;
break ;
2008-05-30 08:35:57 +00:00
# endregion
2008-05-02 19:21:33 +00:00
}
}
PacketPool . Instance . ReturnPacket ( Pack ) ;
}
private static PrimitiveBaseShape GetShapeFromAddPacket ( ObjectAddPacket addPacket )
{
PrimitiveBaseShape shape = new PrimitiveBaseShape ( ) ;
shape . PCode = addPacket . ObjectData . PCode ;
shape . State = addPacket . ObjectData . State ;
shape . PathBegin = addPacket . ObjectData . PathBegin ;
shape . PathEnd = addPacket . ObjectData . PathEnd ;
shape . PathScaleX = addPacket . ObjectData . PathScaleX ;
shape . PathScaleY = addPacket . ObjectData . PathScaleY ;
shape . PathShearX = addPacket . ObjectData . PathShearX ;
shape . PathShearY = addPacket . ObjectData . PathShearY ;
shape . PathSkew = addPacket . ObjectData . PathSkew ;
shape . ProfileBegin = addPacket . ObjectData . ProfileBegin ;
shape . ProfileEnd = addPacket . ObjectData . ProfileEnd ;
shape . Scale = addPacket . ObjectData . Scale ;
shape . PathCurve = addPacket . ObjectData . PathCurve ;
shape . ProfileCurve = addPacket . ObjectData . ProfileCurve ;
shape . ProfileHollow = addPacket . ObjectData . ProfileHollow ;
shape . PathRadiusOffset = addPacket . ObjectData . PathRadiusOffset ;
shape . PathRevolutions = addPacket . ObjectData . PathRevolutions ;
shape . PathTaperX = addPacket . ObjectData . PathTaperX ;
shape . PathTaperY = addPacket . ObjectData . PathTaperY ;
shape . PathTwist = addPacket . ObjectData . PathTwist ;
shape . PathTwistBegin = addPacket . ObjectData . PathTwistBegin ;
2008-09-06 07:52:41 +00:00
Primitive . TextureEntry ntex = new Primitive . TextureEntry ( new UUID ( "89556747-24cb-43ed-920b-47caed15465f" ) ) ;
2008-05-02 19:21:33 +00:00
shape . TextureEntry = ntex . ToBytes ( ) ;
//shape.Textures = ntex;
return shape ;
}
2008-06-28 00:33:17 +00:00
/// <summary>
/// Send the client an Estate message blue box pop-down with a single OK button
/// </summary>
/// <param name="FromAvatarID"></param>
/// <param name="fromSessionID"></param>
/// <param name="FromAvatarName"></param>
/// <param name="Message"></param>
2008-09-06 07:52:41 +00:00
public void SendBlueBoxMessage ( UUID FromAvatarID , UUID fromSessionID , String FromAvatarName , String Message )
2008-05-02 19:21:33 +00:00
{
if ( ! ChildAgentStatus ( ) )
SendInstantMessage ( FromAvatarID , fromSessionID , Message , AgentId , SessionId , FromAvatarName , ( byte ) 1 , ( uint ) Util . UnixTimeSinceEpoch ( ) ) ;
//SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
}
public void SendLogoutPacket ( )
{
2008-08-25 07:35:17 +00:00
// I know this is a bit of a hack, however there are times when you don't
// want to send this, but still need to do the rest of the shutdown process
// this method gets called from the packet server.. which makes it practically
// impossible to do any other way.
2008-05-02 19:21:33 +00:00
2008-08-25 07:35:17 +00:00
if ( m_SendLogoutPacketWhenClosing )
{
LogoutReplyPacket logReply = ( LogoutReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . LogoutReply ) ;
// TODO: don't create new blocks if recycling an old packet
logReply . AgentData . AgentID = AgentId ;
logReply . AgentData . SessionID = SessionId ;
logReply . InventoryData = new LogoutReplyPacket . InventoryDataBlock [ 1 ] ;
logReply . InventoryData [ 0 ] = new LogoutReplyPacket . InventoryDataBlock ( ) ;
2008-09-06 07:52:41 +00:00
logReply . InventoryData [ 0 ] . ItemID = UUID . Zero ;
2008-08-25 07:35:17 +00:00
OutPacket ( logReply , ThrottleOutPacketType . Task ) ;
}
2008-05-02 19:21:33 +00:00
}
2008-05-14 03:57:30 +00:00
2008-05-03 15:39:40 +00:00
public void SendHealth ( float health )
{
HealthMessagePacket healthpacket = ( HealthMessagePacket ) PacketPool . Instance . GetPacket ( PacketType . HealthMessage ) ;
healthpacket . HealthData . Health = health ;
OutPacket ( healthpacket , ThrottleOutPacketType . Task ) ;
}
2008-05-02 19:21:33 +00:00
2008-09-06 07:52:41 +00:00
public void SendAgentOnline ( UUID [ ] agentIDs )
2008-05-14 03:57:30 +00:00
{
OnlineNotificationPacket onp = new OnlineNotificationPacket ( ) ;
OnlineNotificationPacket . AgentBlockBlock [ ] onpb = new OnlineNotificationPacket . AgentBlockBlock [ agentIDs . Length ] ;
for ( int i = 0 ; i < agentIDs . Length ; i + + )
{
OnlineNotificationPacket . AgentBlockBlock onpbl = new OnlineNotificationPacket . AgentBlockBlock ( ) ;
onpbl . AgentID = agentIDs [ i ] ;
onpb [ i ] = onpbl ;
}
onp . AgentBlock = onpb ;
2008-06-03 07:12:09 +00:00
onp . Header . Reliable = true ;
2008-05-14 03:57:30 +00:00
OutPacket ( onp , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendAgentOffline ( UUID [ ] agentIDs )
2008-05-14 03:57:30 +00:00
{
OfflineNotificationPacket offp = new OfflineNotificationPacket ( ) ;
OfflineNotificationPacket . AgentBlockBlock [ ] offpb = new OfflineNotificationPacket . AgentBlockBlock [ agentIDs . Length ] ;
for ( int i = 0 ; i < agentIDs . Length ; i + + )
{
OfflineNotificationPacket . AgentBlockBlock onpbl = new OfflineNotificationPacket . AgentBlockBlock ( ) ;
onpbl . AgentID = agentIDs [ i ] ;
offpb [ i ] = onpbl ;
}
offp . AgentBlock = offpb ;
2008-06-03 07:12:09 +00:00
offp . Header . Reliable = true ;
2008-05-14 03:57:30 +00:00
OutPacket ( offp , ThrottleOutPacketType . Task ) ;
}
2008-05-14 04:57:32 +00:00
2008-09-06 07:52:41 +00:00
public void SendSitResponse ( UUID TargetID , Vector3 OffsetPos , Quaternion SitOrientation , bool autopilot ,
Vector3 CameraAtOffset , Vector3 CameraEyeOffset , bool ForceMouseLook )
2008-05-14 04:57:32 +00:00
{
AvatarSitResponsePacket avatarSitResponse = new AvatarSitResponsePacket ( ) ;
avatarSitResponse . SitObject . ID = TargetID ;
2008-09-06 07:52:41 +00:00
if ( CameraAtOffset ! = Vector3 . Zero )
2008-05-14 04:57:32 +00:00
{
avatarSitResponse . SitTransform . CameraAtOffset = CameraAtOffset ;
avatarSitResponse . SitTransform . CameraEyeOffset = CameraEyeOffset ;
}
avatarSitResponse . SitTransform . ForceMouselook = ForceMouseLook ;
avatarSitResponse . SitTransform . AutoPilot = autopilot ;
avatarSitResponse . SitTransform . SitPosition = OffsetPos ;
avatarSitResponse . SitTransform . SitRotation = SitOrientation ;
OutPacket ( avatarSitResponse , ThrottleOutPacketType . Task ) ;
}
2008-05-14 06:58:32 +00:00
2008-09-06 07:52:41 +00:00
public void SendAdminResponse ( UUID Token , uint AdminLevel )
2008-05-14 04:57:32 +00:00
{
GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket ( ) ;
GrantGodlikePowersPacket . GrantDataBlock gdb = new GrantGodlikePowersPacket . GrantDataBlock ( ) ;
GrantGodlikePowersPacket . AgentDataBlock adb = new GrantGodlikePowersPacket . AgentDataBlock ( ) ;
adb . AgentID = AgentId ;
2008-05-16 01:22:11 +00:00
adb . SessionID = SessionId ; // More security
2008-05-14 04:57:32 +00:00
gdb . GodLevel = ( byte ) AdminLevel ;
gdb . Token = Token ;
//respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
respondPacket . GrantData = gdb ;
respondPacket . AgentData = adb ;
OutPacket ( respondPacket , ThrottleOutPacketType . Task ) ;
}
2008-05-14 06:58:32 +00:00
public void SendGroupMembership ( GroupData [ ] GroupMembership )
{
AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket ( ) ;
AgentGroupDataUpdatePacket . GroupDataBlock [ ] Groups = new AgentGroupDataUpdatePacket . GroupDataBlock [ GroupMembership . Length ] ;
for ( int i = 0 ; i < GroupMembership . Length ; i + + )
{
AgentGroupDataUpdatePacket . GroupDataBlock Group = new AgentGroupDataUpdatePacket . GroupDataBlock ( ) ;
Group . AcceptNotices = GroupMembership [ i ] . AcceptNotices ;
Group . Contribution = GroupMembership [ i ] . contribution ;
Group . GroupID = GroupMembership [ i ] . GroupID ;
Group . GroupInsigniaID = GroupMembership [ i ] . GroupPicture ;
2008-09-06 07:52:41 +00:00
Group . GroupName = Utils . StringToBytes ( GroupMembership [ i ] . groupName ) ;
2008-05-14 06:58:32 +00:00
Group . GroupPowers = GroupMembership [ i ] . groupPowers ;
Groups [ i ] = Group ;
Groupupdate . GroupData = Groups ;
2008-05-16 01:22:11 +00:00
2008-05-14 06:58:32 +00:00
}
Groupupdate . AgentData . AgentID = AgentId ;
OutPacket ( Groupupdate , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendGroupNameReply ( UUID groupLLUID , string GroupName )
2008-05-18 03:21:22 +00:00
{
UUIDGroupNameReplyPacket pack = new UUIDGroupNameReplyPacket ( ) ;
UUIDGroupNameReplyPacket . UUIDNameBlockBlock [ ] uidnameblock = new UUIDGroupNameReplyPacket . UUIDNameBlockBlock [ 1 ] ;
UUIDGroupNameReplyPacket . UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket . UUIDNameBlockBlock ( ) ;
uidnamebloc . ID = groupLLUID ;
2008-09-06 07:52:41 +00:00
uidnamebloc . GroupName = Utils . StringToBytes ( GroupName ) ;
2008-05-18 03:21:22 +00:00
uidnameblock [ 0 ] = uidnamebloc ;
pack . UUIDNameBlock = uidnameblock ;
OutPacket ( pack , ThrottleOutPacketType . Task ) ;
}
2008-05-25 11:22:05 +00:00
public void SendLandStatReply ( uint reportType , uint requestFlags , uint resultCount , LandStatReportItem [ ] lsrpia )
{
LandStatReplyPacket lsrp = new LandStatReplyPacket ( ) ;
2008-06-27 23:03:39 +00:00
// LandStatReplyPacket.RequestDataBlock lsreqdpb = new LandStatReplyPacket.RequestDataBlock();
2008-05-25 11:22:05 +00:00
LandStatReplyPacket . ReportDataBlock [ ] lsrepdba = new LandStatReplyPacket . ReportDataBlock [ lsrpia . Length ] ;
//LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
// lsrepdb.
lsrp . RequestData . ReportType = reportType ;
lsrp . RequestData . RequestFlags = requestFlags ;
lsrp . RequestData . TotalObjectCount = resultCount ;
for ( int i = 0 ; i < lsrpia . Length ; i + + )
{
LandStatReplyPacket . ReportDataBlock lsrepdb = new LandStatReplyPacket . ReportDataBlock ( ) ;
lsrepdb . LocationX = lsrpia [ i ] . LocationX ;
lsrepdb . LocationY = lsrpia [ i ] . LocationY ;
lsrepdb . LocationZ = lsrpia [ i ] . LocationZ ;
lsrepdb . Score = lsrpia [ i ] . Score ;
lsrepdb . TaskID = lsrpia [ i ] . TaskID ;
lsrepdb . TaskLocalID = lsrpia [ i ] . TaskLocalID ;
2008-09-06 07:52:41 +00:00
lsrepdb . TaskName = Utils . StringToBytes ( lsrpia [ i ] . TaskName ) ;
lsrepdb . OwnerName = Utils . StringToBytes ( lsrpia [ i ] . OwnerName ) ;
2008-05-25 11:22:05 +00:00
lsrepdba [ i ] = lsrepdb ;
}
lsrp . ReportData = lsrepdba ;
OutPacket ( lsrp , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendScriptRunningReply ( UUID objectID , UUID itemID , bool running )
2008-06-28 16:08:12 +00:00
{
ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket ( ) ;
scriptRunningReply . Script . ObjectID = objectID ;
scriptRunningReply . Script . ItemID = itemID ;
scriptRunningReply . Script . Running = running ;
OutPacket ( scriptRunningReply , ThrottleOutPacketType . Task ) ;
}
2008-06-18 23:04:15 +00:00
public void SendAsset ( AssetRequestToClient req )
{
2008-07-08 11:02:53 +00:00
2008-06-18 23:04:15 +00:00
//Console.WriteLine("sending asset " + req.RequestAssetID);
TransferInfoPacket Transfer = new TransferInfoPacket ( ) ;
Transfer . TransferInfo . ChannelType = 2 ;
Transfer . TransferInfo . Status = 0 ;
Transfer . TransferInfo . TargetType = 0 ;
if ( req . AssetRequestSource = = 2 )
{
Transfer . TransferInfo . Params = new byte [ 20 ] ;
Array . Copy ( req . RequestAssetID . GetBytes ( ) , 0 , Transfer . TransferInfo . Params , 0 , 16 ) ;
int assType = ( int ) req . AssetInf . Type ;
Array . Copy ( Helpers . IntToBytes ( assType ) , 0 , Transfer . TransferInfo . Params , 16 , 4 ) ;
}
else if ( req . AssetRequestSource = = 3 )
{
Transfer . TransferInfo . Params = req . Params ;
// Transfer.TransferInfo.Params = new byte[100];
//Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
//Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
}
Transfer . TransferInfo . Size = ( int ) req . AssetInf . Data . Length ;
Transfer . TransferInfo . TransferID = req . TransferRequestID ;
Transfer . Header . Zerocoded = true ;
OutPacket ( Transfer , ThrottleOutPacketType . Asset ) ;
if ( req . NumPackets = = 1 )
{
TransferPacketPacket TransferPacket = new TransferPacketPacket ( ) ;
TransferPacket . TransferData . Packet = 0 ;
TransferPacket . TransferData . ChannelType = 2 ;
TransferPacket . TransferData . TransferID = req . TransferRequestID ;
TransferPacket . TransferData . Data = req . AssetInf . Data ;
TransferPacket . TransferData . Status = 1 ;
TransferPacket . Header . Zerocoded = true ;
OutPacket ( TransferPacket , ThrottleOutPacketType . Asset ) ;
}
else
{
int processedLength = 0 ;
2008-09-06 07:52:41 +00:00
int maxChunkSize = Settings . MAX_PACKET_SIZE - 100 ;
2008-06-18 23:04:15 +00:00
int packetNumber = 0 ;
while ( processedLength < req . AssetInf . Data . Length )
{
TransferPacketPacket TransferPacket = new TransferPacketPacket ( ) ;
TransferPacket . TransferData . Packet = packetNumber ;
TransferPacket . TransferData . ChannelType = 2 ;
TransferPacket . TransferData . TransferID = req . TransferRequestID ;
int chunkSize = Math . Min ( req . AssetInf . Data . Length - processedLength , maxChunkSize ) ;
byte [ ] chunk = new byte [ chunkSize ] ;
Array . Copy ( req . AssetInf . Data , processedLength , chunk , 0 , chunk . Length ) ;
TransferPacket . TransferData . Data = chunk ;
// 0 indicates more packets to come, 1 indicates last packet
if ( req . AssetInf . Data . Length - processedLength > maxChunkSize )
{
TransferPacket . TransferData . Status = 0 ;
}
else
{
TransferPacket . TransferData . Status = 1 ;
}
TransferPacket . Header . Zerocoded = true ;
OutPacket ( TransferPacket , ThrottleOutPacketType . Asset ) ;
processedLength + = chunkSize ;
packetNumber + + ;
}
}
}
2008-06-28 00:33:17 +00:00
public void SendTexture ( AssetBase TextureAsset )
{
2008-07-08 11:02:53 +00:00
2008-06-28 00:33:17 +00:00
}
2008-05-02 19:21:33 +00:00
public ClientInfo GetClientInfo ( )
{
2008-07-22 17:58:42 +00:00
ClientInfo info = m_PacketHandler . GetClientInfo ( ) ;
2008-05-16 01:22:11 +00:00
2008-05-02 19:21:33 +00:00
info . userEP = this . m_userEndPoint ;
info . proxyEP = this . m_proxyEndPoint ;
info . agentcircuit = new sAgentCircuitData ( RequestClientInfo ( ) ) ;
return info ;
}
public void SetClientInfo ( ClientInfo info )
{
2008-07-22 17:58:42 +00:00
m_PacketHandler . SetClientInfo ( info ) ;
2008-05-02 19:21:33 +00:00
}
2008-07-08 14:17:59 +00:00
#region Media Parcel Members
2008-07-09 11:01:26 +00:00
public void SendParcelMediaCommand ( uint flags , ParcelMediaCommandEnum command , float time )
2008-07-08 14:17:59 +00:00
{
ParcelMediaCommandMessagePacket commandMessagePacket = new ParcelMediaCommandMessagePacket ( ) ;
commandMessagePacket . CommandBlock . Flags = ( uint ) flags ;
2008-07-09 11:01:26 +00:00
commandMessagePacket . CommandBlock . Command = ( uint ) command ;
2008-07-08 14:17:59 +00:00
commandMessagePacket . CommandBlock . Time = time ;
OutPacket ( commandMessagePacket , ThrottleOutPacketType . Unknown ) ;
}
2008-09-06 07:52:41 +00:00
public void SendParcelMediaUpdate ( string mediaUrl , UUID mediaTextureID ,
2008-07-08 14:17:59 +00:00
byte autoScale , string mediaType , string mediaDesc , int mediaWidth , int mediaHeight ,
byte mediaLoop )
{
ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket ( ) ;
2008-09-06 07:52:41 +00:00
updatePacket . DataBlock . MediaURL = Utils . StringToBytes ( mediaUrl ) ;
2008-07-08 14:17:59 +00:00
updatePacket . DataBlock . MediaID = mediaTextureID ;
updatePacket . DataBlock . MediaAutoScale = autoScale ;
2008-09-06 07:52:41 +00:00
updatePacket . DataBlockExtended . MediaType = Utils . StringToBytes ( mediaType ) ;
updatePacket . DataBlockExtended . MediaDesc = Utils . StringToBytes ( mediaDesc ) ;
2008-07-08 14:17:59 +00:00
updatePacket . DataBlockExtended . MediaWidth = mediaWidth ;
updatePacket . DataBlockExtended . MediaWidth = mediaHeight ;
updatePacket . DataBlockExtended . MediaLoop = mediaLoop ;
OutPacket ( updatePacket , ThrottleOutPacketType . Unknown ) ;
}
# endregion
2008-08-18 00:39:10 +00:00
2008-07-31 12:31:31 +00:00
#region Camera
2008-08-18 00:39:10 +00:00
2008-09-06 07:52:41 +00:00
public void SendSetFollowCamProperties ( UUID objectID , SortedDictionary < int , float > parameters )
2008-07-31 12:31:31 +00:00
{
SetFollowCamPropertiesPacket packet = ( SetFollowCamPropertiesPacket ) PacketPool . Instance . GetPacket ( PacketType . SetFollowCamProperties ) ;
packet . ObjectData . ObjectID = objectID ;
SetFollowCamPropertiesPacket . CameraPropertyBlock [ ] camPropBlock = new SetFollowCamPropertiesPacket . CameraPropertyBlock [ parameters . Count ] ;
uint idx = 0 ;
2008-08-07 12:55:46 +00:00
foreach ( KeyValuePair < int , float > pair in parameters )
2008-07-31 12:31:31 +00:00
{
SetFollowCamPropertiesPacket . CameraPropertyBlock block = new SetFollowCamPropertiesPacket . CameraPropertyBlock ( ) ;
block . Type = pair . Key ;
block . Value = pair . Value ;
2008-08-18 00:39:10 +00:00
2008-07-31 12:31:31 +00:00
camPropBlock [ idx + + ] = block ;
}
packet . CameraProperty = camPropBlock ;
OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-09-06 07:52:41 +00:00
public void SendClearFollowCamProperties ( UUID objectID )
2008-07-31 12:31:31 +00:00
{
ClearFollowCamPropertiesPacket packet = ( ClearFollowCamPropertiesPacket ) PacketPool . Instance . GetPacket ( PacketType . ClearFollowCamProperties ) ;
packet . ObjectData . ObjectID = objectID ;
OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
# endregion
2008-08-16 19:20:14 +00:00
2008-09-06 07:52:41 +00:00
public void SendRegionHandle ( UUID regionID , ulong handle ) {
2008-08-16 19:20:14 +00:00
RegionIDAndHandleReplyPacket reply = ( RegionIDAndHandleReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . RegionIDAndHandleReply ) ;
reply . ReplyBlock . RegionID = regionID ;
reply . ReplyBlock . RegionHandle = handle ;
OutPacket ( reply , ThrottleOutPacketType . Land ) ;
}
2008-08-18 00:39:10 +00:00
2008-09-06 07:52:41 +00:00
public void SendParcelInfo ( RegionInfo info , LandData land , UUID parcelID , uint x , uint y )
2008-08-16 19:20:14 +00:00
{
ParcelInfoReplyPacket reply = ( ParcelInfoReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . ParcelInfoReply ) ;
reply . AgentData . AgentID = m_agentId ;
reply . Data . ParcelID = parcelID ;
reply . Data . OwnerID = land . OwnerID ;
2008-09-06 07:52:41 +00:00
reply . Data . Name = Utils . StringToBytes ( land . Name ) ;
reply . Data . Desc = Utils . StringToBytes ( land . Description ) ;
2008-08-16 19:20:14 +00:00
reply . Data . ActualArea = land . Area ;
reply . Data . BillableArea = land . Area ; // TODO: what is this?
2008-08-18 00:39:10 +00:00
2008-08-16 19:20:14 +00:00
// Bit 0: Mature, bit 7: on sale, other bits: no idea
reply . Data . Flags = ( byte ) (
( ( land . Flags & ( uint ) Parcel . ParcelFlags . MaturePublish ) ! = 0 ? ( 1 < < 0 ) : 0 ) +
( ( land . Flags & ( uint ) Parcel . ParcelFlags . ForSale ) ! = 0 ? ( 1 < < 7 ) : 0 ) ) ;
2008-08-18 00:39:10 +00:00
2008-09-06 07:52:41 +00:00
Vector3 pos = land . UserLocation ;
if ( pos . Equals ( Vector3 . Zero ) )
2008-08-16 19:20:14 +00:00
{
2008-08-18 00:39:10 +00:00
pos = ( land . AABBMax + land . AABBMin ) * 0.5f ;
2008-08-16 19:20:14 +00:00
}
reply . Data . GlobalX = info . RegionLocX * Constants . RegionSize + x ;
reply . Data . GlobalY = info . RegionLocY * Constants . RegionSize + y ;
reply . Data . GlobalZ = pos . Z ;
2008-09-06 07:52:41 +00:00
reply . Data . SimName = Utils . StringToBytes ( info . RegionName ) ;
2008-08-16 19:20:14 +00:00
reply . Data . SnapshotID = land . SnapshotID ;
reply . Data . Dwell = 0 ; // TODO: not implemented yet
reply . Data . SalePrice = land . SalePrice ;
reply . Data . AuctionID = ( int ) land . AuctionID ;
2008-08-18 00:39:10 +00:00
2008-08-16 19:20:14 +00:00
OutPacket ( reply , ThrottleOutPacketType . Land ) ;
}
2008-08-25 07:35:17 +00:00
2008-10-01 21:30:48 +00:00
public void SendScriptTeleportRequest ( string objName , string simName , Vector3 pos , Vector3 lookAt )
{
ScriptTeleportRequestPacket packet = ( ScriptTeleportRequestPacket ) PacketPool . Instance . GetPacket ( PacketType . ScriptTeleportRequest ) ;
packet . Data . ObjectName = Utils . StringToBytes ( objName ) ;
packet . Data . SimName = Utils . StringToBytes ( simName ) ;
packet . Data . SimPosition = pos ;
packet . Data . LookAt = lookAt ;
OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-09-28 19:45:42 +00:00
public void SetClientOption ( string option , string value )
{
switch ( option )
{
case "ReliableIsImportant" :
bool val = false ;
if ( bool . TryParse ( value , out val ) )
m_PacketHandler . ReliableIsImportant = val ;
break ;
default :
break ;
}
}
public string GetClientOption ( string option )
{
switch ( option )
{
2008-09-29 19:11:48 +00:00
case "ReliableIsImportant" :
return m_PacketHandler . ReliableIsImportant . ToString ( ) ;
default :
break ;
2008-09-28 19:45:42 +00:00
}
return string . Empty ;
}
2008-10-05 02:25:53 +00:00
public void SendDirPlacesReply ( UUID queryID , DirPlacesReplyData [ ] data )
{
DirPlacesReplyPacket packet = ( DirPlacesReplyPacket ) PacketPool . Instance . GetPacket ( PacketType . DirPlacesReply ) ;
packet . AgentData = new DirPlacesReplyPacket . AgentDataBlock ( ) ;
packet . QueryData = new DirPlacesReplyPacket . QueryDataBlock [ 1 ] ;
packet . QueryData [ 0 ] = new DirPlacesReplyPacket . QueryDataBlock ( ) ;
packet . QueryReplies =
new DirPlacesReplyPacket . QueryRepliesBlock [ data . Length ] ;
packet . AgentData . AgentID = AgentId ;
packet . QueryData [ 0 ] . QueryID = queryID ;
int i = 0 ;
foreach ( DirPlacesReplyData d in data )
{
packet . QueryReplies [ i ] =
new DirPlacesReplyPacket . QueryRepliesBlock ( ) ;
packet . QueryReplies [ i ] . ParcelID = d . parcelID ;
packet . QueryReplies [ i ] . Name = Utils . StringToBytes ( d . name ) ;
packet . QueryReplies [ i ] . ForSale = d . forSale ;
packet . QueryReplies [ i ] . Auction = d . auction ;
packet . QueryReplies [ i ] . Dwell = d . dwell ;
2008-10-05 03:01:19 +00:00
i + + ;
2008-10-05 02:25:53 +00:00
}
OutPacket ( packet , ThrottleOutPacketType . Task ) ;
}
2008-10-06 00:00:55 +00:00
public void SendMapItemReply ( mapItemReply [ ] replies , uint mapitemtype , uint flags )
{
MapItemReplyPacket mirplk = new MapItemReplyPacket ( ) ;
mirplk . AgentData . AgentID = AgentId ;
mirplk . RequestData . ItemType = mapitemtype ;
mirplk . Data = new MapItemReplyPacket . DataBlock [ replies . Length ] ;
for ( int i = 0 ; i < replies . Length ; i + + )
{
MapItemReplyPacket . DataBlock mrdata = new MapItemReplyPacket . DataBlock ( ) ;
mrdata . X = replies [ i ] . x ;
mrdata . Y = replies [ i ] . y ;
mrdata . ID = replies [ i ] . id ;
mrdata . Extra = replies [ i ] . Extra ;
mrdata . Extra2 = replies [ i ] . Extra2 ;
mrdata . Name = Utils . StringToBytes ( replies [ i ] . name ) ;
mirplk . Data [ i ] = mrdata ;
}
//System.Console.WriteLine(mirplk.ToString());
OutPacket ( mirplk , ThrottleOutPacketType . Task ) ;
}
2008-10-05 02:25:53 +00:00
2008-08-25 07:35:17 +00:00
public void KillEndDone ( )
{
KillPacket kp = new KillPacket ( ) ;
OutPacket ( kp , ThrottleOutPacketType . Task | ThrottleOutPacketType . LowPriority ) ;
}
2008-05-02 19:21:33 +00:00
}
2008-05-07 14:15:59 +00:00
}