/// <summary> /// Accept a friendship request /// </summary> /// <param name="fromAgentID">agentID of avatatar to form friendship with</param> /// <param name="imSessionID">imSessionID of the friendship request message</param> public void AcceptFriendship(UUID fromAgentID, UUID imSessionID) { UUID callingCardFolder = Client.Inventory.FindFolderForType(AssetType.CallingCard); AcceptFriendshipPacket request = new AcceptFriendshipPacket(); request.AgentData.AgentID = Client.Self.AgentID; request.AgentData.SessionID = Client.Self.SessionID; request.TransactionBlock.TransactionID = imSessionID; request.FolderData = new AcceptFriendshipPacket.FolderDataBlock[1]; request.FolderData[0] = new AcceptFriendshipPacket.FolderDataBlock(); request.FolderData[0].FolderID = callingCardFolder; Client.Network.SendPacket(request); FriendInfo friend = new FriendInfo(fromAgentID, FriendRights.CanSeeOnline, FriendRights.CanSeeOnline); if (!FriendList.ContainsKey(fromAgentID)) { FriendList.Add(friend.UUID, friend); } if (FriendRequests.ContainsKey(fromAgentID)) { FriendRequests.Remove(fromAgentID); } Client.Avatars.RequestAvatarName(fromAgentID); }
/// <summary> /// Process incoming avatar animations /// </summary> /// <param name="packet"></param> /// <param name="sim"></param> private void AvatarAnimationHandler(Packet packet, Simulator sim) { if (OnAvatarAnimation != null) { AvatarAnimationPacket anims = (AvatarAnimationPacket)packet; InternalDictionary <UUID, int> signaledAnims = new InternalDictionary <UUID, int>(); for (int i = 0; i < anims.AnimationList.Length; i++) { signaledAnims.Add(anims.AnimationList[i].AnimID, anims.AnimationList[i].AnimSequenceID); } try { OnAvatarAnimation(anims.Sender.ID, signaledAnims); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } }
/// <summary> /// Handles relevant messages from the server encapsulated in instant messages. /// </summary> /// <param name="im">InstantMessage object containing encapsalated instant message</param> /// <param name="simulator">Originating Simulator</param> private void MainAvatar_InstantMessage(InstantMessage im, Simulator simulator) { if (im.Dialog == InstantMessageDialog.FriendshipOffered) { if (OnFriendshipOffered != null) { lock (FriendRequests) { if (FriendRequests.ContainsKey(im.FromAgentID)) { FriendRequests[im.FromAgentID] = im.IMSessionID; } else { FriendRequests.Add(im.FromAgentID, im.IMSessionID); } } try { OnFriendshipOffered(im.FromAgentID, im.FromAgentName, im.IMSessionID); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } } else if (im.Dialog == InstantMessageDialog.FriendshipAccepted) { FriendInfo friend = new FriendInfo(im.FromAgentID, FriendRights.CanSeeOnline, FriendRights.CanSeeOnline); friend.Name = im.FromAgentName; lock (FriendList) FriendList[friend.UUID] = friend; if (OnFriendshipResponse != null) { try { OnFriendshipResponse(im.FromAgentID, im.FromAgentName, true); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } } else if (im.Dialog == InstantMessageDialog.FriendshipDeclined) { if (OnFriendshipResponse != null) { try { OnFriendshipResponse(im.FromAgentID, im.FromAgentName, false); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } } }
private void Self_IM(object sender, InstantMessageEventArgs e) { if (e.IM.Dialog == InstantMessageDialog.FriendshipOffered) { if (m_FriendshipOffered != null) { if (FriendRequests.ContainsKey(e.IM.FromAgentID)) { FriendRequests[e.IM.FromAgentID] = e.IM.IMSessionID; } else { FriendRequests.Add(e.IM.FromAgentID, e.IM.IMSessionID); } OnFriendshipOffered(new FriendshipOfferedEventArgs(e.IM.FromAgentID, e.IM.FromAgentName, e.IM.IMSessionID)); } } else if (e.IM.Dialog == InstantMessageDialog.FriendshipAccepted) { FriendInfo friend = new FriendInfo(e.IM.FromAgentID, FriendRights.CanSeeOnline, FriendRights.CanSeeOnline); friend.Name = e.IM.FromAgentName; lock (FriendList.Dictionary) FriendList[friend.UUID] = friend; if (m_FriendshipResponse != null) { OnFriendshipResponse(new FriendshipResponseEventArgs(e.IM.FromAgentID, e.IM.FromAgentName, true)); } RequestOnlineNotification(e.IM.FromAgentID); } else if (e.IM.Dialog == InstantMessageDialog.FriendshipDeclined) { if (m_FriendshipResponse != null) { OnFriendshipResponse(new FriendshipResponseEventArgs(e.IM.FromAgentID, e.IM.FromAgentName, false)); } } }
private void DecompressLand(Simulator simulator, BitPack bitpack, TerrainPatch.GroupHeader group) { int x; int y; int[] patches = new int[32 * 32]; int count = 0; while (true) { TerrainPatch.Header header = TerrainCompressor.DecodePatchHeader(bitpack); if (header.QuantWBits == TerrainCompressor.END_OF_PATCHES) { break; } x = header.X; y = header.Y; if (x >= TerrainCompressor.PATCHES_PER_EDGE || y >= TerrainCompressor.PATCHES_PER_EDGE) { Logger.Log(String.Format( "Invalid LayerData land packet, x={0}, y={1}, dc_offset={2}, range={3}, quant_wbits={4}, patchids={5}, count={6}", x, y, header.DCOffset, header.Range, header.QuantWBits, header.PatchIDs, count), Helpers.LogLevel.Warning, Client); return; } // Decode this patch TerrainCompressor.DecodePatch(patches, bitpack, header, group.PatchSize); // Decompress this patch float[] heightmap = TerrainCompressor.DecompressPatch(patches, header, group); count++; if (OnLandPatch != null) { try { OnLandPatch(simulator, x, y, group.PatchSize, heightmap); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } if (Client.Settings.STORE_LAND_PATCHES) { lock (SimPatches) { if (!SimPatches.ContainsKey(simulator.Handle)) { SimPatches.Add(simulator.Handle, new TerrainPatch[16 * 16]); } TerrainPatch patch = new TerrainPatch(); patch.Data = heightmap; patch.X = x; patch.Y = y; SimPatches[simulator.Handle][y * 16 + x] = patch; } } } }