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(); });
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(); });
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(); } }