Example #1
0
        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);
                }
            }
        }
Example #2
0
 public async Task Process(PartyInviteResponse response)
 {
     await partyManager.ProcessPartyInviteResponse(this, response);
 }
Example #3
0
        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);
        }