Example #1
0
        /// <summary>
        /// Creates and sends an AgentIsNowWearing packet based on the local cached AgentWearablesData array.
        /// </summary>
        protected void SendAgentIsNowWearing()
        {
            AgentIsNowWearingPacket nowWearing = new AgentIsNowWearingPacket();

            nowWearing.AgentData.AgentID   = Client.Network.AgentID;
            nowWearing.AgentData.SessionID = Client.Network.SessionID;
            nowWearing.WearableData        = new AgentIsNowWearingPacket.WearableDataBlock[13];
            for (byte i = 0; i <= 12; i++)
            {
                nowWearing.WearableData[i] = new AgentIsNowWearingPacket.WearableDataBlock();
                nowWearing.WearableData[i].WearableType = i;
                nowWearing.WearableData[i].ItemID       = AgentWearablesData[i].ItemID;
            }

            Client.Network.SendPacket(nowWearing);
        }
Example #2
0
        /// <summary>
        /// Creates and sends an AgentIsNowWearing packet based on the local cached AgentWearablesData array.
        /// </summary>
        protected void SendAgentIsNowWearing()
        {
            AgentIsNowWearingPacket nowWearing = new AgentIsNowWearingPacket();
            nowWearing.AgentData.AgentID = Client.Network.AgentID;
            nowWearing.AgentData.SessionID = Client.Network.SessionID;
            nowWearing.WearableData = new AgentIsNowWearingPacket.WearableDataBlock[13];
            for (byte i = 0; i <= 12; i++)
            {
                nowWearing.WearableData[i] = new AgentIsNowWearingPacket.WearableDataBlock();
                nowWearing.WearableData[i].WearableType = i;
                nowWearing.WearableData[i].ItemID = AgentWearablesData[i].ItemID;
            }

            Client.Network.SendPacket(nowWearing);
        }
        /// <summary>
        /// Inform the sim which wearables are part of our current outfit
        /// </summary>
        private void SendAgentIsNowWearing()
        {
            AgentIsNowWearingPacket wearing = new AgentIsNowWearingPacket();
            wearing.AgentData.AgentID = Client.Self.AgentID;
            wearing.AgentData.SessionID = Client.Self.SessionID;
            wearing.WearableData = new AgentIsNowWearingPacket.WearableDataBlock[WEARABLE_COUNT];

            lock (Wearables)
            {
                for (int i = 0; i < WEARABLE_COUNT; i++)
                {
                    WearableType type = (WearableType)i;
                    wearing.WearableData[i] = new AgentIsNowWearingPacket.WearableDataBlock();
                    wearing.WearableData[i].WearableType = (byte)i;

                    if (Wearables.ContainsKey(type))
                        wearing.WearableData[i].ItemID = Wearables[type].ItemID;
                    else
                        wearing.WearableData[i].ItemID = UUID.Zero;
                }
            }

            Client.Network.SendPacket(wearing);
        }
Example #4
0
        private void SendAgentIsNowWearing()
        {
            Log.DebugLog("SendAgentIsNowWearing()");

            AgentIsNowWearingPacket wearing = new AgentIsNowWearingPacket();
            wearing.AgentData.AgentID = Network.AgentID;
            wearing.AgentData.SessionID = Network.SessionID;
            wearing.WearableData = new AgentIsNowWearingPacket.WearableDataBlock[WEARABLE_COUNT];

            for (int i = 0; i < WEARABLE_COUNT; i++)
            {
                WearableType type = (WearableType)i;
                wearing.WearableData[i] = new AgentIsNowWearingPacket.WearableDataBlock();
                wearing.WearableData[i].WearableType = (byte)i;

                if (Wearables.ContainsKey(type))
                    wearing.WearableData[i].ItemID = Wearables.Dictionary[type].Item.UUID;
                else
                    wearing.WearableData[i].ItemID = UUID.Zero;
            }

            Network.SendPacket(wearing);
        }
Example #5
0
        protected virtual void ProcessInPacket(Packet Pack)
        {
            ack_pack(Pack);
            if (debug)
            {
                if (Pack.Type != PacketType.AgentUpdate)
                {
                    Console.WriteLine(Pack.Type.ToString());
                }
            }

            if (this.ProcessPacketMethod(Pack))
            {
                //there is a handler registered that handled this packet type
                return;
            }
            else
            {
                System.Text.Encoding _enc = System.Text.Encoding.ASCII;

                switch (Pack.Type)
                {
                case PacketType.CompleteAgentMovement:
                    if (this.m_child)
                    {
                        this.UpgradeClient();
                    }
                    ClientAvatar.CompleteMovement(m_world);
                    ClientAvatar.SendInitialPosition();
                    break;

                case PacketType.RegionHandshakeReply:
                    m_world.SendLayerData(this);
                    break;

                case PacketType.AgentWearablesRequest:
                    ClientAvatar.SendInitialAppearance();
                    foreach (SimClient client in m_clientThreads.Values)
                    {
                        if (client.AgentID != this.AgentID)
                        {
                            ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket();
                            this.OutPacket(objupdate);
                            client.ClientAvatar.SendAppearanceToOtherAgent(this);
                        }
                    }
                    m_world.GetInitialPrims(this);
                    break;

                case PacketType.AgentIsNowWearing:
                    AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack;
                    //Console.WriteLine(Pack.ToString());
                    break;

                case PacketType.AgentSetAppearance:
                    AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
                    // Console.WriteLine(appear.ToString());
                    this.ClientAvatar.SetAppearance(appear);
                    break;

                case PacketType.ObjectAdd:
                    m_world.AddNewPrim((ObjectAddPacket)Pack, this);
                    break;

                case PacketType.ObjectLink:
                    OpenSim.Framework.Console.MainConsole.Instance.WriteLine(Pack.ToString());
                    ObjectLinkPacket        link         = (ObjectLinkPacket)Pack;
                    uint                    parentprimid = 0;
                    OpenSim.world.Primitive parentprim   = null;
                    if (link.ObjectData.Length > 1)
                    {
                        parentprimid = link.ObjectData[0].ObjectLocalID;
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == parentprimid)
                            {
                                parentprim = (OpenSim.world.Primitive)ent;
                            }
                        }
                        for (int i = 1; i < link.ObjectData.Length; i++)
                        {
                            foreach (Entity ent in m_world.Entities.Values)
                            {
                                if (ent.localid == link.ObjectData[i].ObjectLocalID)
                                {
                                    ((OpenSim.world.Primitive)ent).MakeParent(parentprim);
                                }
                            }
                        }
                    }
                    break;

                case PacketType.ObjectScale:
                    OpenSim.Framework.Console.MainConsole.Instance.WriteLine(Pack.ToString());
                    break;

                case PacketType.ObjectShape:
                    ObjectShapePacket shape = (ObjectShapePacket)Pack;
                    for (int i = 0; i < shape.ObjectData.Length; i++)
                    {
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == shape.ObjectData[i].ObjectLocalID)
                            {
                                ((OpenSim.world.Primitive)ent).UpdateShape(shape.ObjectData[i]);
                            }
                        }
                    }
                    break;

                case PacketType.RequestImage:
                    RequestImagePacket imageRequest = (RequestImagePacket)Pack;
                    for (int i = 0; i < imageRequest.RequestImage.Length; i++)
                    {
                        m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
                    }
                    break;

                case PacketType.TransferRequest:
                    //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
                    TransferRequestPacket transfer = (TransferRequestPacket)Pack;
                    m_assetCache.AddAssetRequest(this, transfer);
                    break;

                case PacketType.AgentUpdate:
                    ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack);
                    break;

                case PacketType.ObjectImage:
                    ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
                    for (int i = 0; i < imagePack.ObjectData.Length; i++)
                    {
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == imagePack.ObjectData[i].ObjectLocalID)
                            {
                                ((OpenSim.world.Primitive)ent).UpdateTexture(imagePack.ObjectData[i].TextureEntry);
                            }
                        }
                    }
                    break;

                case PacketType.ObjectFlagUpdate:
                    ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
                    foreach (Entity ent in m_world.Entities.Values)
                    {
                        if (ent.localid == flags.AgentData.ObjectLocalID)
                        {
                            ((OpenSim.world.Primitive)ent).UpdateObjectFlags(flags);
                        }
                    }
                    break;

                case PacketType.AssetUploadRequest:
                    AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
                    this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID));
                    break;

                case PacketType.RequestXfer:
                    //Console.WriteLine(Pack.ToString());
                    break;

                case PacketType.SendXferPacket:
                    this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack);
                    break;

                case PacketType.CreateInventoryFolder:
                    CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
                    m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
                    //Console.WriteLine(Pack.ToString());
                    break;

                case PacketType.CreateInventoryItem:
                    //Console.WriteLine(Pack.ToString());
                    CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
                    if (createItem.InventoryBlock.TransactionID != LLUUID.Zero)
                    {
                        this.UploadAssets.CreateInventoryItem(createItem);
                    }
                    else
                    {
                        // Console.Write(Pack.ToString());
                        this.CreateInventoryItem(createItem);
                    }
                    break;

                case PacketType.FetchInventory:
                    //Console.WriteLine("fetch item packet");
                    FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
                    m_inventoryCache.FetchInventory(this, FetchInventory);
                    break;

                case PacketType.FetchInventoryDescendents:
                    FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
                    m_inventoryCache.FetchInventoryDescendents(this, Fetch);
                    break;

                case PacketType.UpdateInventoryItem:
                    UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack;
                    //Console.WriteLine(Pack.ToString());
                    for (int i = 0; i < update.InventoryData.Length; i++)
                    {
                        if (update.InventoryData[i].TransactionID != LLUUID.Zero)
                        {
                            AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID));
                            if (asset != null)
                            {
                                // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " 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.ToStringHyphenated() + " 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.ViewerEffect:
                    ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
                    foreach (SimClient client in m_clientThreads.Values)
                    {
                        if (client.AgentID != this.AgentID)
                        {
                            viewer.AgentData.AgentID   = client.AgentID;
                            viewer.AgentData.SessionID = client.SessionID;
                            client.OutPacket(viewer);
                        }
                    }
                    break;

                case PacketType.RequestTaskInventory:
                    // Console.WriteLine(Pack.ToString());
                    RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
                    ReplyTaskInventoryPacket   replytask   = new ReplyTaskInventoryPacket();
                    bool foundent = false;
                    foreach (Entity ent in m_world.Entities.Values)
                    {
                        if (ent.localid == requesttask.InventoryData.LocalID)
                        {
                            replytask.InventoryData.TaskID   = ent.uuid;
                            replytask.InventoryData.Serial   = 0;
                            replytask.InventoryData.Filename = new byte[0];
                            foundent = true;
                        }
                    }
                    if (foundent)
                    {
                        this.OutPacket(replytask);
                    }
                    break;

                case PacketType.UpdateTaskInventory:
                    // Console.WriteLine(Pack.ToString());
                    UpdateTaskInventoryPacket updatetask  = (UpdateTaskInventoryPacket)Pack;
                    AgentInventory            myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
                    if (myinventory != null)
                    {
                        if (updatetask.UpdateData.Key == 0)
                        {
                            if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null)
                            {
                                if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7)
                                {
                                    LLUUID    noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID;
                                    AssetBase assBase = this.m_assetCache.GetAsset(noteaid);
                                    if (assBase != null)
                                    {
                                        foreach (Entity ent in m_world.Entities.Values)
                                        {
                                            if (ent.localid == updatetask.UpdateData.LocalID)
                                            {
                                                if (ent is OpenSim.world.Primitive)
                                                {
                                                    this.m_world.AddScript(ent, Util.FieldToString(assBase.Data));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;

                case PacketType.AgentAnimation:
                    if (!m_child)
                    {
                        AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
                        for (int i = 0; i < AgentAni.AnimationList.Length; i++)
                        {
                            if (AgentAni.AnimationList[i].StartAnim)
                            {
                                ClientAvatar.current_anim = AgentAni.AnimationList[i].AnimID;
                                ClientAvatar.anim_seq     = 1;
                                ClientAvatar.SendAnimPack();
                            }
                        }
                    }
                    break;

                case PacketType.ObjectSelect:
                    ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
                    for (int i = 0; i < incomingselect.ObjectData.Length; i++)
                    {
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == incomingselect.ObjectData[i].ObjectLocalID)
                            {
                                ((OpenSim.world.Primitive)ent).GetProperites(this);
                                break;
                            }
                        }
                    }
                    break;
                }
            }
        }
Example #6
0
        private void SendAgentIsNowWearing()
        {
            Logger.DebugLog("SendAgentIsNowWearing()", Client);

            AgentIsNowWearingPacket wearing = new AgentIsNowWearingPacket();
            wearing.AgentData.AgentID = Client.Self.AgentID;
            wearing.AgentData.SessionID = Client.Self.SessionID;
            wearing.WearableData = new AgentIsNowWearingPacket.WearableDataBlock[WEARABLE_COUNT];

            for (int i = 0; i < WEARABLE_COUNT; i++)
            {
                WearableType type = (WearableType)i;
                wearing.WearableData[i] = new AgentIsNowWearingPacket.WearableDataBlock();
                wearing.WearableData[i].WearableType = (byte)i;

                if (Wearables.ContainsKey(type))
                    wearing.WearableData[i].ItemID = Wearables.Dictionary[type].Item.Guid;
                else
                    wearing.WearableData[i].ItemID = Guid.Empty;
            }

            Client.Network.SendPacket(wearing);
        }
Example #7
0
        void AgentIsNowWearingHandler(Packet packet, Agent agent)
        {
            AgentIsNowWearingPacket wearing = (AgentIsNowWearingPacket)packet;

            for (int i = 0; i < wearing.WearableData.Length; i++)
            {
                UUID itemID = wearing.WearableData[i].ItemID;

                #region Update Wearables

                switch ((WearableType)wearing.WearableData[i].WearableType)
                {
                case WearableType.Shape:
                    agent.ShapeItem = itemID;
                    break;

                case WearableType.Skin:
                    agent.SkinItem = itemID;
                    break;

                case WearableType.Hair:
                    agent.HairItem = itemID;
                    break;

                case WearableType.Eyes:
                    agent.EyesItem = itemID;
                    break;

                case WearableType.Shirt:
                    agent.ShirtItem = itemID;
                    break;

                case WearableType.Pants:
                    agent.PantsItem = itemID;
                    break;

                case WearableType.Shoes:
                    agent.ShoesItem = itemID;
                    break;

                case WearableType.Socks:
                    agent.SocksItem = itemID;
                    break;

                case WearableType.Jacket:
                    agent.JacketItem = itemID;
                    break;

                case WearableType.Gloves:
                    agent.GlovesItem = itemID;
                    break;

                case WearableType.Undershirt:
                    agent.UndershirtItem = itemID;
                    break;

                case WearableType.Underpants:
                    agent.UnderpantsItem = itemID;
                    break;

                case WearableType.Skirt:
                    agent.SkirtItem = itemID;
                    break;
                }

                #endregion Update Wearables
            }

            // FIXME: GetCurrentWearables() is a very expensive call, remove it from this debug line
            Logger.DebugLog("Updated agent wearables, new count: " + GetCurrentWearables(agent).Count);
        }
        private void AgentIsNowWearingHandler(Packet packet, LLAgent agent)
        {
            // This odd function takes the incoming map of WearableType -> ItemID, converts it to
            // the LLAppearance format of string -> ItemID, fetches all of the wearable inventory
            // items, and converts them into the LLAppearance format of string -> AssetID before
            // updating the user's LLAppearance data

            AgentIsNowWearingPacket wearing = (AgentIsNowWearingPacket)packet;

            OSDMap      appearanceMap           = new OSDMap();
            List <UUID> requestIDs              = new List <UUID>(wearing.WearableData.Length);
            Dictionary <UUID, string> wornItems = new Dictionary <UUID, string>();
            int count = 0;

            // Put the ItemIDs in appearanceMap and requestIDs
            for (int i = 0; i < wearing.WearableData.Length; i++)
            {
                AgentIsNowWearingPacket.WearableDataBlock block = wearing.WearableData[i];

                #region WearableType Conversion

                switch ((WearableType)block.WearableType)
                {
                case WearableType.Shape:
                    appearanceMap["ShapeItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "ShapeAsset";
                    break;

                case WearableType.Skin:
                    appearanceMap["SkinItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]   = "SkinAsset";
                    break;

                case WearableType.Hair:
                    appearanceMap["HairItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]   = "HairAsset";
                    break;

                case WearableType.Eyes:
                    appearanceMap["EyesItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]   = "EyesAsset";
                    break;

                case WearableType.Shirt:
                    appearanceMap["ShirtItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "ShirtAsset";
                    break;

                case WearableType.Pants:
                    appearanceMap["PantsItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "PantsAsset";
                    break;

                case WearableType.Shoes:
                    appearanceMap["ShoesItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "ShoesAsset";
                    break;

                case WearableType.Socks:
                    appearanceMap["SocksItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "SocksAsset";
                    break;

                case WearableType.Jacket:
                    appearanceMap["JacketItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]     = "JacketAsset";
                    break;

                case WearableType.Gloves:
                    appearanceMap["GlovesItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]     = "GlovesAsset";
                    break;

                case WearableType.Undershirt:
                    appearanceMap["UndershirtItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]         = "UndershirtAsset";
                    break;

                case WearableType.Underpants:
                    appearanceMap["UnderpantsItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]         = "UnderpantsAsset";
                    break;

                case WearableType.Skirt:
                    appearanceMap["SkirtItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "SkirtAsset";
                    break;

                case WearableType.Alpha:
                    appearanceMap["AlphaItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]    = "AlphaAsset";
                    break;

                case WearableType.Tattoo:
                    appearanceMap["TattooItem"] = OSD.FromUUID(block.ItemID);
                    wornItems[block.ItemID]     = "TattooAsset";
                    break;
                }

                #endregion WearableType Conversion

                if (block.ItemID != UUID.Zero)
                {
                    requestIDs.Add(block.ItemID);
                    ++count;
                }
            }

            m_log.Debug("Updating agent wearables for " + agent.Name + ", new count: " + count);

            // Fetch all of the AssetIDs for inventory items listed in requestIDs
            IDictionary <UUID, UUID> itemsToAssetIDs;
            if (m_inventoryClient != null && m_inventoryClient.TryGetAssetIDs(agent.ID, requestIDs.ToArray(), out itemsToAssetIDs))
            {
                foreach (KeyValuePair <UUID, UUID> kvp in itemsToAssetIDs)
                {
                    // Put the AssetIDs in appearanceMap
                    string wearableAssetKey;
                    if (wornItems.TryGetValue(kvp.Key, out wearableAssetKey))
                    {
                        appearanceMap[wearableAssetKey] = OSD.FromUUID(kvp.Value);
                    }
                }

                m_log.Debug("Did " + itemsToAssetIDs.Count + " ItemID -> AssetID lookups for " + agent.Name);
            }
            else
            {
                m_log.Warn("Failed to resolve ItemIDs to AssetIDs for " + agent.Name);
            }

            if (m_userClient != null)
            {
                m_userClient.UpdateUserFields(agent.ID, new OSDMap {
                    { "LLAppearance", appearanceMap }
                });
            }
            else
            {
                m_log.Warn("Cannot save agent appearance without an IUserClient");
            }
        }