diff options
Diffstat (limited to '')
4 files changed, 217 insertions, 7 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 412f969..19983dc 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -1009,6 +1009,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1009 | 1009 | ||
1010 | public event MapItemRequest OnMapItemRequest; | 1010 | public event MapItemRequest OnMapItemRequest; |
1011 | 1011 | ||
1012 | public event OfferCallingCard OnOfferCallingCard; | ||
1013 | public event AcceptCallingCard OnAcceptCallingCard; | ||
1014 | public event DeclineCallingCard OnDeclineCallingCard; | ||
1015 | |||
1012 | // voire si c'est necessaire | 1016 | // voire si c'est necessaire |
1013 | public void ActivateGesture(UUID assetId, UUID gestureId) | 1017 | public void ActivateGesture(UUID assetId, UUID gestureId) |
1014 | { | 1018 | { |
@@ -6447,6 +6451,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6447 | parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime); | 6451 | parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime); |
6448 | } | 6452 | } |
6449 | break; | 6453 | break; |
6454 | |||
6455 | case PacketType.OfferCallingCard: | ||
6456 | OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack; | ||
6457 | if (OnOfferCallingCard != null) | ||
6458 | { | ||
6459 | OnOfferCallingCard(this, | ||
6460 | offerCallingCardPacket.AgentBlock.DestID, | ||
6461 | offerCallingCardPacket.AgentBlock.TransactionID); | ||
6462 | } | ||
6463 | break; | ||
6464 | |||
6465 | case PacketType.AcceptCallingCard: | ||
6466 | AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack; | ||
6467 | // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should | ||
6468 | // contain exactly one entry | ||
6469 | if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0) | ||
6470 | { | ||
6471 | OnAcceptCallingCard(this, | ||
6472 | acceptCallingCardPacket.TransactionBlock.TransactionID, | ||
6473 | acceptCallingCardPacket.FolderData[0].FolderID); | ||
6474 | } | ||
6475 | break; | ||
6476 | |||
6477 | case PacketType.DeclineCallingCard: | ||
6478 | DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack; | ||
6479 | if (OnDeclineCallingCard != null) | ||
6480 | { | ||
6481 | OnDeclineCallingCard(this, | ||
6482 | declineCallingCardPacket.TransactionBlock.TransactionID); | ||
6483 | } | ||
6484 | break; | ||
6485 | |||
6450 | default: | 6486 | default: |
6451 | m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString()); | 6487 | m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString()); |
6452 | break; | 6488 | break; |
@@ -7161,6 +7197,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7161 | 7197 | ||
7162 | } | 7198 | } |
7163 | 7199 | ||
7200 | public void SendOfferCallingCard(UUID srcID, UUID transactionID) | ||
7201 | { | ||
7202 | // a bit special, as this uses AgentID to store the source instead | ||
7203 | // of the destination. The destination (the receiver) goes into destID | ||
7204 | OfferCallingCardPacket p = (OfferCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.OfferCallingCard); | ||
7205 | p.AgentData.AgentID = srcID; | ||
7206 | p.AgentData.SessionID = UUID.Zero; | ||
7207 | p.AgentBlock.DestID = AgentId; | ||
7208 | p.AgentBlock.TransactionID = transactionID; | ||
7209 | OutPacket(p, ThrottleOutPacketType.Task); | ||
7210 | } | ||
7211 | |||
7212 | public void SendAcceptCallingCard(UUID transactionID) | ||
7213 | { | ||
7214 | AcceptCallingCardPacket p = (AcceptCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard); | ||
7215 | p.AgentData.AgentID = AgentId; | ||
7216 | p.AgentData.SessionID = UUID.Zero; | ||
7217 | p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1]; | ||
7218 | p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock(); | ||
7219 | p.FolderData[0].FolderID = UUID.Zero; | ||
7220 | OutPacket(p, ThrottleOutPacketType.Task); | ||
7221 | } | ||
7222 | |||
7223 | public void SendDeclineCallingCard(UUID transactionID) | ||
7224 | { | ||
7225 | DeclineCallingCardPacket p = (DeclineCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard); | ||
7226 | p.AgentData.AgentID = AgentId; | ||
7227 | p.AgentData.SessionID = UUID.Zero; | ||
7228 | p.TransactionBlock.TransactionID = transactionID; | ||
7229 | OutPacket(p, ThrottleOutPacketType.Task); | ||
7230 | } | ||
7231 | |||
7164 | public void KillEndDone() | 7232 | public void KillEndDone() |
7165 | { | 7233 | { |
7166 | KillPacket kp = new KillPacket(); | 7234 | KillPacket kp = new KillPacket(); |
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs index 0be540d..c51bcc1 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs | |||
@@ -48,6 +48,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
48 | private Dictionary<UUID, ulong> m_rootAgents = new Dictionary<UUID, ulong>(); | 48 | private Dictionary<UUID, ulong> m_rootAgents = new Dictionary<UUID, ulong>(); |
49 | private Dictionary<UUID, List<StoredFriendListUpdate>> StoredFriendListUpdates = new Dictionary<UUID, List<StoredFriendListUpdate>>(); | 49 | private Dictionary<UUID, List<StoredFriendListUpdate>> StoredFriendListUpdates = new Dictionary<UUID, List<StoredFriendListUpdate>>(); |
50 | 50 | ||
51 | private Dictionary<UUID, UUID> m_pendingCallingcardRequests = new Dictionary<UUID,UUID>(); | ||
52 | |||
51 | private List<Scene> m_scene = new List<Scene>(); | 53 | private List<Scene> m_scene = new List<Scene>(); |
52 | 54 | ||
53 | #region IRegionModule Members | 55 | #region IRegionModule Members |
@@ -109,7 +111,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
109 | 111 | ||
110 | UUID.TryParse((string)requestData["agent_id"], out notifyAboutAgentId); | 112 | UUID.TryParse((string)requestData["agent_id"], out notifyAboutAgentId); |
111 | m_log.InfoFormat("[PRESENCE]: Got presence update for {0}, and we're telling {1}, with a status {2}", notifyAboutAgentId.ToString(), notifyAgentId.ToString(), notifyOnlineStatus.ToString()); | 113 | m_log.InfoFormat("[PRESENCE]: Got presence update for {0}, and we're telling {1}, with a status {2}", notifyAboutAgentId.ToString(), notifyAgentId.ToString(), notifyOnlineStatus.ToString()); |
112 | ScenePresence avatar = GetPresenceFromAgentID(notifyAgentId); | 114 | ScenePresence avatar = GetRootPresenceFromAgentID(notifyAgentId); |
113 | if (avatar != null) | 115 | if (avatar != null) |
114 | { | 116 | { |
115 | if (avatar.IsChildAgent) | 117 | if (avatar.IsChildAgent) |
@@ -184,6 +186,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
184 | client.OnApproveFriendRequest += OnApprovedFriendRequest; | 186 | client.OnApproveFriendRequest += OnApprovedFriendRequest; |
185 | client.OnDenyFriendRequest += OnDenyFriendRequest; | 187 | client.OnDenyFriendRequest += OnDenyFriendRequest; |
186 | client.OnTerminateFriendship += OnTerminateFriendship; | 188 | client.OnTerminateFriendship += OnTerminateFriendship; |
189 | client.OnOfferCallingCard += OnOfferCallingCard; | ||
190 | client.OnAcceptCallingCard += OnAcceptCallingCard; | ||
191 | client.OnDeclineCallingCard += OnDeclineCallingCard; | ||
187 | 192 | ||
188 | doFriendListUpdateOnline(client.AgentId); | 193 | doFriendListUpdateOnline(client.AgentId); |
189 | 194 | ||
@@ -228,7 +233,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
228 | } | 233 | } |
229 | foreach (UUID user in UpdateUsers) | 234 | foreach (UUID user in UpdateUsers) |
230 | { | 235 | { |
231 | ScenePresence av = GetPresenceFromAgentID(user); | 236 | ScenePresence av = GetRootPresenceFromAgentID(user); |
232 | if (av != null) | 237 | if (av != null) |
233 | { | 238 | { |
234 | List<FriendListItem> usrfl = new List<FriendListItem>(); | 239 | List<FriendListItem> usrfl = new List<FriendListItem>(); |
@@ -257,7 +262,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
257 | 262 | ||
258 | if (UpdateUsers.Count > 0) | 263 | if (UpdateUsers.Count > 0) |
259 | { | 264 | { |
260 | ScenePresence avatar = GetPresenceFromAgentID(AgentId); | 265 | ScenePresence avatar = GetRootPresenceFromAgentID(AgentId); |
261 | if (avatar != null) | 266 | if (avatar != null) |
262 | { | 267 | { |
263 | avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray()); | 268 | avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray()); |
@@ -349,7 +354,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
349 | 354 | ||
350 | for (int i = 0; i < updateUsers.Count; i++) | 355 | for (int i = 0; i < updateUsers.Count; i++) |
351 | { | 356 | { |
352 | ScenePresence av = GetPresenceFromAgentID(updateUsers[i]); | 357 | ScenePresence av = GetRootPresenceFromAgentID(updateUsers[i]); |
353 | if (av != null) | 358 | if (av != null) |
354 | { | 359 | { |
355 | UUID[] agents = new UUID[1]; | 360 | UUID[] agents = new UUID[1]; |
@@ -427,7 +432,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
427 | } | 432 | } |
428 | } | 433 | } |
429 | 434 | ||
430 | private ScenePresence GetPresenceFromAgentID(UUID AgentID) | 435 | private ScenePresence GetRootPresenceFromAgentID(UUID AgentID) |
431 | { | 436 | { |
432 | ScenePresence returnAgent = null; | 437 | ScenePresence returnAgent = null; |
433 | lock (m_scene) | 438 | lock (m_scene) |
@@ -449,6 +454,25 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
449 | return returnAgent; | 454 | return returnAgent; |
450 | } | 455 | } |
451 | 456 | ||
457 | private ScenePresence GetAnyPresenceFromAgentID(UUID AgentID) | ||
458 | { | ||
459 | ScenePresence returnAgent = null; | ||
460 | lock (m_scene) | ||
461 | { | ||
462 | ScenePresence queryagent = null; | ||
463 | for (int i = 0; i < m_scene.Count; i++) | ||
464 | { | ||
465 | queryagent = m_scene[i].GetScenePresence(AgentID); | ||
466 | if (queryagent != null) | ||
467 | { | ||
468 | returnAgent = queryagent; | ||
469 | break; | ||
470 | } | ||
471 | } | ||
472 | } | ||
473 | return returnAgent; | ||
474 | } | ||
475 | |||
452 | #region FriendRequestHandling | 476 | #region FriendRequestHandling |
453 | 477 | ||
454 | private void OnInstantMessage(IClientAPI client, UUID fromAgentID, | 478 | private void OnInstantMessage(IClientAPI client, UUID fromAgentID, |
@@ -520,7 +544,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
520 | Scene SceneAgentIn = m_scene[0]; | 544 | Scene SceneAgentIn = m_scene[0]; |
521 | 545 | ||
522 | // Found Pending Friend Request with that Transaction.. | 546 | // Found Pending Friend Request with that Transaction.. |
523 | ScenePresence agentpresence = GetPresenceFromAgentID(agentID); | 547 | ScenePresence agentpresence = GetRootPresenceFromAgentID(agentID); |
524 | if (agentpresence != null) | 548 | if (agentpresence != null) |
525 | { | 549 | { |
526 | SceneAgentIn = agentpresence.Scene; | 550 | SceneAgentIn = agentpresence.Scene; |
@@ -564,7 +588,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
564 | Scene SceneAgentIn = m_scene[0]; | 588 | Scene SceneAgentIn = m_scene[0]; |
565 | 589 | ||
566 | // Found Pending Friend Request with that Transaction.. | 590 | // Found Pending Friend Request with that Transaction.. |
567 | ScenePresence agentpresence = GetPresenceFromAgentID(agentID); | 591 | ScenePresence agentpresence = GetRootPresenceFromAgentID(agentID); |
568 | if (agentpresence != null) | 592 | if (agentpresence != null) |
569 | { | 593 | { |
570 | SceneAgentIn = agentpresence.Scene; | 594 | SceneAgentIn = agentpresence.Scene; |
@@ -607,8 +631,94 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
607 | } | 631 | } |
608 | 632 | ||
609 | #endregion | 633 | #endregion |
634 | |||
635 | #region CallingCards | ||
636 | |||
637 | private void OnOfferCallingCard(IClientAPI client, UUID destID, UUID transactionID) | ||
638 | { | ||
639 | m_log.DebugFormat("[CALLING CARD]: got offer from {0} for {1}, transaction {2}", | ||
640 | client.AgentId, destID, transactionID); | ||
641 | // This might be slightly wrong. On a multi-region server, we might get the child-agent instead of the root-agent | ||
642 | // (or the root instead of the child) | ||
643 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
644 | if (destAgent == null) | ||
645 | { | ||
646 | client.SendAlertMessage("The person you have offered a card to can't be found anymore."); | ||
647 | return; | ||
648 | } | ||
649 | |||
650 | m_pendingCallingcardRequests[transactionID] = client.AgentId; | ||
651 | // inform the destination agent about the offer | ||
652 | destAgent.ControllingClient.SendOfferCallingCard(client.AgentId, transactionID); | ||
653 | } | ||
654 | |||
655 | private void CreateCallingCard(IClientAPI client, UUID creator, UUID folder, string name) | ||
656 | { | ||
657 | InventoryItemBase item = new InventoryItemBase(); | ||
658 | item.AssetID = UUID.Zero; | ||
659 | item.AssetType = (int)AssetType.CallingCard; | ||
660 | item.BasePermissions = (uint)PermissionMask.Copy; | ||
661 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
662 | item.Creator = creator; | ||
663 | item.CurrentPermissions = item.BasePermissions; | ||
664 | item.Description = ""; | ||
665 | item.EveryOnePermissions = (uint)PermissionMask.None; | ||
666 | item.Flags = 0; | ||
667 | item.Folder = folder; | ||
668 | item.GroupID = UUID.Zero; | ||
669 | item.GroupOwned = false; | ||
670 | item.ID = UUID.Random(); | ||
671 | item.InvType = (int)InventoryType.CallingCard; | ||
672 | item.Name = name; | ||
673 | item.NextPermissions = item.EveryOnePermissions; | ||
674 | item.Owner = client.AgentId; | ||
675 | item.SalePrice = 10; | ||
676 | item.SaleType = (byte)SaleType.Not; | ||
677 | ((Scene)client.Scene).AddInventoryItem(client, item); | ||
678 | } | ||
679 | |||
680 | private void OnAcceptCallingCard(IClientAPI client, UUID transactionID, UUID folderID) | ||
681 | { | ||
682 | m_log.DebugFormat("[CALLING CARD]: User {0} ({1} {2}) accepted tid {3}, folder {4}", | ||
683 | client.AgentId, | ||
684 | client.FirstName, client.LastName, | ||
685 | transactionID, folderID); | ||
686 | UUID destID; | ||
687 | if (m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) | ||
688 | { | ||
689 | m_pendingCallingcardRequests.Remove(transactionID); | ||
690 | |||
691 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
692 | // inform sender of the card that destination declined the offer | ||
693 | if (destAgent != null) destAgent.ControllingClient.SendAcceptCallingCard(transactionID); | ||
694 | |||
695 | // put a calling card into the inventory of receiver | ||
696 | CreateCallingCard(client, destID, folderID, destAgent.Name); | ||
697 | } | ||
698 | else m_log.WarnFormat("[CALLING CARD]: Got a AcceptCallingCard from {0} {1} without an offer before.", | ||
699 | client.FirstName, client.LastName); | ||
700 | } | ||
701 | |||
702 | private void OnDeclineCallingCard(IClientAPI client, UUID transactionID) | ||
703 | { | ||
704 | m_log.DebugFormat("[CALLING CARD]: User {0} declined card, tid {2}", | ||
705 | client.AgentId, transactionID); | ||
706 | UUID destID; | ||
707 | if (m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) | ||
708 | { | ||
709 | m_pendingCallingcardRequests.Remove(transactionID); | ||
710 | |||
711 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
712 | // inform sender of the card that destination declined the offer | ||
713 | if (destAgent != null) destAgent.ControllingClient.SendDeclineCallingCard(transactionID); | ||
714 | } | ||
715 | else m_log.WarnFormat("[CALLING CARD]: Got a DeclineCallingCard from {0} {1} without an offer before.", | ||
716 | client.FirstName, client.LastName); | ||
717 | } | ||
610 | } | 718 | } |
611 | 719 | ||
720 | #endregion | ||
721 | |||
612 | public struct StoredFriendListUpdate | 722 | public struct StoredFriendListUpdate |
613 | { | 723 | { |
614 | public UUID storedFor; | 724 | public UUID storedFor; |
diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index 52a2792..9aa0403 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs | |||
@@ -334,6 +334,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC | |||
334 | 334 | ||
335 | public event MapItemRequest OnMapItemRequest; | 335 | public event MapItemRequest OnMapItemRequest; |
336 | 336 | ||
337 | public event OfferCallingCard OnOfferCallingCard; | ||
338 | public event AcceptCallingCard OnAcceptCallingCard; | ||
339 | public event DeclineCallingCard OnDeclineCallingCard; | ||
340 | |||
337 | 341 | ||
338 | #pragma warning restore 67 | 342 | #pragma warning restore 67 |
339 | 343 | ||
@@ -939,5 +943,17 @@ namespace OpenSim.Region.Environment.Modules.World.NPC | |||
939 | public void SendEventInfoReply (EventData info) | 943 | public void SendEventInfoReply (EventData info) |
940 | { | 944 | { |
941 | } | 945 | } |
946 | |||
947 | public void SendOfferCallingCard (UUID destID, UUID transactionID) | ||
948 | { | ||
949 | } | ||
950 | |||
951 | public void SendAcceptCallingCard (UUID transactionID) | ||
952 | { | ||
953 | } | ||
954 | |||
955 | public void SendDeclineCallingCard (UUID transactionID) | ||
956 | { | ||
957 | } | ||
942 | } | 958 | } |
943 | } | 959 | } |
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index af60323..5e7523f 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs | |||
@@ -229,6 +229,10 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
229 | 229 | ||
230 | public event MapItemRequest OnMapItemRequest; | 230 | public event MapItemRequest OnMapItemRequest; |
231 | 231 | ||
232 | public event OfferCallingCard OnOfferCallingCard; | ||
233 | public event AcceptCallingCard OnAcceptCallingCard; | ||
234 | public event DeclineCallingCard OnDeclineCallingCard; | ||
235 | |||
232 | 236 | ||
233 | #pragma warning restore 67 | 237 | #pragma warning restore 67 |
234 | 238 | ||
@@ -938,5 +942,17 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
938 | public void SendEventInfoReply (EventData info) | 942 | public void SendEventInfoReply (EventData info) |
939 | { | 943 | { |
940 | } | 944 | } |
945 | |||
946 | public void SendOfferCallingCard (UUID destID, UUID transactionID) | ||
947 | { | ||
948 | } | ||
949 | |||
950 | public void SendAcceptCallingCard (UUID transactionID) | ||
951 | { | ||
952 | } | ||
953 | |||
954 | public void SendDeclineCallingCard (UUID transactionID) | ||
955 | { | ||
956 | } | ||
941 | } | 957 | } |
942 | } | 958 | } |