public async Task ProcessPartyInviteResponse(ConnectedUser usr, PartyInviteResponse response) { RemoveOldInvites(); if (response.Accepted) { var inv = partyInvites.FirstOrDefault(x => x.PartyID == response.PartyID); if ((inv != null) && (inv.Invitee == usr.Name)) { var inviteeUser = usr; var inviterUser = server.ConnectedUsers.Get(inv.Inviter); if (inviterUser != null) { var targetBattle = inviterUser.MyBattle ?? inviteeUser.MyBattle; // join inviter user's battle, if its empty join invitee user's battle if (targetBattle != null) { if (inviteeUser.MyBattle != targetBattle) { await server.ForceJoinBattle(inviteeUser.Name, targetBattle); } if (inviterUser.MyBattle != targetBattle) { await server.ForceJoinBattle(inviterUser.Name, targetBattle); } } } var inviterParty = parties.FirstOrDefault(x => x.PartyID == response.PartyID); var inviteeParty = parties.FirstOrDefault(x => x.UserNames.Contains(usr.Name)); Party party = null; if ((inviterParty == null) && (inviteeParty != null)) { party = inviteeParty; } if ((inviterParty == null) && (inviteeParty == null)) { party = new Party(inv.PartyID); parties.Add(party); } if ((inviterParty != null) && (inviteeParty == null)) { party = inviterParty; } if ((inviterParty != null) && (inviteeParty != null)) { await RemoveFromParty(inviterParty, inv.Invitee); party = inviterParty; } await AddToParty(party, inv.Invitee, inv.Inviter); } } }
public async Task Process(PartyInviteResponse response) { await partyManager.ProcessPartyInviteResponse(this, response); }
void HandlePartyInviteResponse(PartyInviteResponse packet) { Group group = GetPlayer().GetGroupInvite(); if (!group) { return; } if (packet.Accept) { // Remove player from invitees in any case group.RemoveInvite(GetPlayer()); if (group.GetLeaderGUID() == GetPlayer().GetGUID()) { Log.outError(LogFilter.Network, "HandleGroupAcceptOpcode: player {0} ({1}) tried to accept an invite to his own group", GetPlayer().GetName(), GetPlayer().GetGUID().ToString()); return; } // Group is full if (group.IsFull()) { SendPartyResult(PartyOperation.Invite, "", PartyResult.GroupFull); return; } Player leader = Global.ObjAccessor.FindPlayer(group.GetLeaderGUID()); // Forming a new group, create it if (!group.IsCreated()) { // This can happen if the leader is zoning. To be removed once delayed actions for zoning are implemented if (!leader) { group.RemoveAllInvites(); return; } // If we're about to create a group there really should be a leader present Cypher.Assert(leader); group.RemoveInvite(leader); group.Create(leader); Global.GroupMgr.AddGroup(group); } // Everything is fine, do it, PLAYER'S GROUP IS SET IN ADDMEMBER!!! if (!group.AddMember(GetPlayer())) { return; } group.BroadcastGroupUpdate(); } else { // Remember leader if online (group will be invalid if group gets disbanded) Player leader = Global.ObjAccessor.FindPlayer(group.GetLeaderGUID()); // uninvite, group can be deleted GetPlayer().UninviteFromGroup(); if (!leader || leader.GetSession() == null) { return; } // report GroupDecline decline = new(GetPlayer().GetName()); leader.SendPacket(decline); } }
/// <inheritdoc/> public void HandlePacket(Player player, Span <byte> packet) { PartyInviteResponse message = packet; this.action.HandleResponse(player, message.Accepted); }