Пример #1
0
        private void Disband(Character disbander) => OnlyWithLeader(disbander.ID, ldr =>
        {
            _log.Debug($"Disbanding party {partyId} by character {disbander.ID}");

            ForAllMembers(m =>
            {
                m.SendPacket(PartyPacket.MemberLeft(m, ldr, this, true, false));
                var c = m.GetCharacter(false);

                if (c != null)
                {
                    c.PartyID = 0;
                }
                else
                {
                    _log.Debug($"Unable to set PartyID to 0 of {m.id}");
                }
            }, -1, false);

            for (var i = 0; i < Constants.MaxPartyMembers; i++)
            {
                members[i] = null;
            }

            leader = null;

            Parties.Remove(partyId);
            var discardedInvites = Invites.Where(x => x.Value.partyId == partyId).Select(x => x.Key).ToArray();
            discardedInvites.ForEach(x => Invites.Remove(x));

            SendPartyDisband();
        });
Пример #2
0
        public void Expel(int expellerId, int toExpel) => OnlyWithLeader(expellerId, ldr =>
        {
            var slot = GetCharacterSlot(toExpel);

            if (slot == -1)
            {
                _log.Error($"Expelling {toExpel} from party {partyId} by {expellerId}, but was not in party???");
                return;
            }

            _log.Info($"Expelling {toExpel} from party {partyId} by {expellerId}?");

            var expelled  = members[slot];
            members[slot] = null;
            ForAllMembers(m => m.SendPacket(PartyPacket.MemberLeft(m, expelled, this, false, true)));
            expelled.SendPacket(PartyPacket.MemberLeft(expelled, expelled, this, false, true));

            var expellchr = expelled.GetCharacter(false);
            if (expellchr != null)
            {
                expellchr.PartyID = 0;
            }
            else
            {
                _log.Debug($"Unable to set PartyID to 0 of {toExpel}");
            }


            SendUpdatePartyData();
            UpdateAllDoors();
        });
Пример #3
0
        public void Leave(Character f****r)
        {
            var slot = GetCharacterSlot(f****r.ID);

            if (slot == -1 || f****r.PartyID == 0)
            {
                _log.Error($"{f****r.ID} tried to get out of party {partyId}, but is not in it?");
                f****r.SendPacket(PartyPacket.PartyError(PartyFunction.WITHDRAW_NOT_JOINED));
            }
            else if (f****r.ID == leader.id)
            {
                _log.Debug($"Disbanding because {f****r.ID} left the party {partyId} (leader)");
                Disband(f****r);
            }
            else
            {
                _log.Debug($"{f****r.ID} left the party {partyId} from slot {slot}");
                var leaving = members[slot];
                members[slot] = null;
                ForAllMembers(m => m.SendPacket(PartyPacket.MemberLeft(m, leaving, this, false, false)));
                leaving.SendPacket(PartyPacket.MemberLeft(leaving, leaving, this, false, false));
                f****r.PartyID = 0;
                SendUpdatePartyData();
                UpdateAllDoors();
            }
        }