private bool ExitPlayer(ZoneClient client, int gid, int aid) { var player = _playerManager.FindPlayerByGID(gid); if (player == null) return true; player.Status = 0; var gdid = _guildManager.GetGDIDByGID(gid); if (gdid.HasValue) { var guild = _guildManager.GetGuild(gdid.Value); if (guild != null) { var member = guild.GuildMInfo.FirstOrDefault(x => x.GID == player.GID); if (member != null) { member.Status = player.Status; _guildManager.UpdateGuildMember(gdid.Value, member.GID, member.Service, member.MemberExp, member.Level, member.Job); BroadcastPacket(new IZ_UPDATE_CHARSTAT { GDID = gdid.Value, GID = gid, AID = aid, Status = member.Status, Sex = member.Sex, Head = member.Head, HeadPalette = member.HeadPalette, Job = (short)member.Job, Level = member.Level }); } // get other online players on this zone, if none, free guild var onlineMembers = guild.GuildMInfo.Where(x => x.Status == 1 && _playerManager.FindPlayerByGID(x.GID)?.ZSID == client.Sid); if (!onlineMembers.Any()) { client.EnqueuePacket(new IZ_FREE_GUILD { GDID = player.GDID }); _guildManager.FreeGuild(player.GDID); } } } var grid = _groupManager.GetMember(gid); if (grid.HasValue) { var g = _groupManager.GetGroup(grid.Value); var offlineMember = g.GroupMember.FirstOrDefault(x => x.GID == gid); foreach (var m in g.GroupMember.Where(x => x.GID != gid)) { ZonePacket(player.ZSID, new IZ_ADD_MEMBER_TO_GROUP2 { ReceiverAID = m.AID, AID = player.AID, Role = offlineMember?.Role ?? 0, State = 1, GroupName = g.GroupInfo.GroupName, CharacterName = player.CharacterName, MapName = player.MapName, ItemPickupRule = g.GroupInfo.ItemPickupRule, ItemDivisionRule = g.GroupInfo.ItemDivisionRule }); } } _playerManager.FreePlayer(aid); return true; }