public static void DeleteClan(Clan deletedClan)
    {
        if (deletedClan != null)
        {
            foreach (var battleStation in GameManager.BattleStations.Values.Where(x => x.Clan.Id == deletedClan.Id))
            {
                battleStation.Destroy(null, DestructionType.MISC);
            }

            GameManager.Clans.TryRemove(deletedClan.Id, out deletedClan);

            foreach (var gameSession in GameManager.GameSessions.Values)
            {
                var member = gameSession?.Player;

                if (member != null && member.Clan.Id == deletedClan.Id)
                {
                    member.Clan = GameManager.GetClan(0);

                    var command = ClanChangedCommand.write(member.Clan.Tag, member.Clan.Id, member.Id);
                    member.SendCommand(command);
                    member.SendCommandToInRangePlayers(command);
                }
            }

            foreach (var clan in GameManager.Clans.Values)
            {
                clan.Diplomacies.Remove(deletedClan.Id);
            }
        }
    }
    public static void LeaveFromClan(Player player)
    {
        foreach (var battleStation in GameManager.BattleStations.Values)
        {
            if (battleStation.EquippedStationModule.ContainsKey(player.Clan.Id))
            {
                battleStation.EquippedStationModule[player.Clan.Id].ForEach(x => { if (x.OwnerId == player.Id)
                                                                                   {
                                                                                       x.Destroy(null, DestructionType.MISC);
                                                                                   }
                                                                            });
            }
        }

        if (player?.GameSession != null)
        {
            if (player.Clan.Id != 0)
            {
                player.Clan = GameManager.GetClan(0);

                var command = ClanChangedCommand.write(player.Clan.Tag, player.Clan.Id, player.Id);
                player.SendCommand(command);
                player.SendCommandToInRangePlayers(command);
            }
        }
    }
    public static void JoinToClan(Player player, Clan clan)
    {
        if (player?.GameSession != null && clan != null)
        {
            player.Clan = clan;

            var command = ClanChangedCommand.write(clan.Tag, clan.Id, player.Id);
            player.SendCommand(command);
            player.SendCommandToInRangePlayers(command);
        }
    }
예제 #4
0
        public static async Task <ValidatedView> AcceptJoinRequest(int accountId, int targetId)
        {
            try {
                ClanMemberModel clanMemberModel = await Model <ClanMemberModel> .AsQueryable()
                                                  .FirstOrDefault(x => x.AccountID == accountId);

                if (clanMemberModel == null || clanMemberModel.Role < ClanRole.VICE_LEADER)
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_ACCEPT_MEMBER_INSUFFICIENT_RIGHTS));
                }

                if (await Model <ClanMemberModel> .AsQueryable().Count(x => x.ClanID == clanMemberModel.ClanID) >= 50)
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_FULL));
                }

                ClanMemberPendingModel clanMemberPendingModel = await Model <ClanMemberPendingModel> .AsQueryable()
                                                                .FirstOrDefault(x => x.AccountID == targetId && x.ClanID == clanMemberModel.ClanID);

                if (clanMemberPendingModel == null)
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_PENDING_DID_NOT_REQUEST));
                }

                ClanMemberModel newClanMemberModel = new ClanMemberModel {
                    ClanID = clanMemberModel.ClanID, AccountID = targetId
                };
                await Model <ClanMemberPendingModel> .AsCollection().DeleteManyAsync(x => x.AccountID == targetId);

                await Model <ClanMemberModel> .AsCollection().InsertOneAsync(newClanMemberModel);

                if (GameManager.Get(accountId, out PlayerController controller))
                {
                    ValidatedView <ClanOverview> validatedView = await RetrieveClanOverviewFromMember(accountId);

                    if (validatedView.IsValid)
                    {
                        controller.Account.Clan = validatedView.Object ?? new ClanOverview();
                    }

                    ClanChangedCommand clanChangedCommand = PacketBuilder.ClanChangedCommand(controller);
                    controller.Send(clanChangedCommand);
                    controller.EntitesInRange(x => x.Send(clanChangedCommand));
                }

                return(ValidatedView.Valid());
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }
예제 #5
0
        public static async Task <ValidatedView> CreateClan(int accountId, ClanCreateView clanCreateView)
        {
            if (!clanCreateView.IsValid(out string message))
            {
                return(ValidatedView.Invalid(message));
            }

            try {
                if (await Model <ClanMemberModel> .AsQueryable().Any(x => x.AccountID == accountId))
                {
                    GameContext.Logger.LogCritical($"Player [id: '{accountId}'] tries creating a clan while being member of another!");
                    return(ValidatedView.Invalid(ErrorCode.CLAN_ALREADY_MEMBER));
                }

                if (await Model <ClanModel> .AsQueryable().Any(x => x.Name == clanCreateView.Name))
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_NAME_ALREADY_IN_USE));
                }

                if (await Model <ClanModel> .AsQueryable().Any(x => x.Tag == clanCreateView.Tag))
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_TAG_ALREADY_IN_USE));
                }

                ClanModel clanModel = Mapper <ClanCreateView> .Map <ClanModel>(clanCreateView);

                ClanMemberModel clanMemberModel = new ClanMemberModel {
                    ClanID = clanModel.ID, AccountID = accountId, Role = ClanRole.LEADER
                };

                await Model <ClanMemberPendingModel> .AsCollection().DeleteManyAsync(x => x.AccountID == accountId);

                await Model <ClanModel> .AsCollection().InsertOneAsync(clanModel);

                await Model <ClanMemberModel> .AsCollection().InsertOneAsync(clanMemberModel);

                if (GameManager.Get(accountId, out PlayerController controller))
                {
                    controller.Account.Clan = Mapper <ClanModel> .Map <ClanOverview>(clanModel);

                    ClanChangedCommand clanChangedCommand = PacketBuilder.ClanChangedCommand(controller);
                    controller.Send(clanChangedCommand);
                    controller.EntitesInRange(x => x.Send(clanChangedCommand));
                }

                return(ValidatedView.Valid());
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }
    public static void CreateClan(Player player, int clanId, int factionId, string name, string tag)
    {
        if (!GameManager.Clans.ContainsKey(clanId))
        {
            var clan = new Clan(clanId, name, tag, factionId);
            GameManager.Clans.TryAdd(clan.Id, clan);

            if (player?.GameSession != null)
            {
                player.Clan = clan;

                var command = ClanChangedCommand.write(clan.Tag, clan.Id, player.Id);
                player.SendCommand(command);
                player.SendCommandToInRangePlayers(command);
            }
        }
    }
    public static void ChangeClanData(Clan clan, string name, string tag, int factionId)
    {
        if (clan.Id != 0)
        {
            clan.Tag  = tag;
            clan.Name = name;
            //clan.FactionId = factionId;

            foreach (GameSession gameSession in GameManager.GameSessions.Values.Where(x => x.Player.Clan.Id == clan.Id))
            {
                var player = gameSession.Player;
                if (player != null)
                {
                    GameManager.SendCommandToMap(player.Spacemap.Id, ClanChangedCommand.write(clan.Tag, clan.Id, player.Id));
                }
            }
        }
    }
예제 #8
0
        public static async Task <ValidatedView> Edit(int accountId, ClanCreateView clanUpdateView)
        {
            if (!clanUpdateView.IsValid(out string message))
            {
                return(ValidatedView.Invalid(message));
            }

            try {
                ClanMemberModel clanMemberModel = await Model <ClanMemberModel>
                                                  .AsQueryable().FirstOrDefault(x => x.AccountID == accountId);

                if (clanMemberModel != null)
                {
                    ClanModel clanModel = await Model <ClanModel> .AsQueryable()
                                          .FirstOrDefault(x => x.ID == clanMemberModel.ClanID);

                    if (clanModel == null)
                    {
                        return(ValidatedView.Invalid(ErrorCode.CLAN_NOT_FOUND));
                    }
                    else
                    {
                        if (clanMemberModel.Role < ClanRole.LEADER)
                        {
                            return(ValidatedView.Invalid(ErrorCode.CLAN_MANAGE_INSUFFICIENT_RIGHTS));
                        }

                        if (clanModel.Name == clanUpdateView.Name &&
                            clanModel.Tag == clanUpdateView.Tag &&
                            clanModel.Description == clanUpdateView.Description)
                        {
                            return(ValidatedView.Valid());
                        }

                        if (clanModel.Name != clanUpdateView.Name &&
                            await Model <ClanModel> .AsQueryable().Any(x => x.Name == clanUpdateView.Name))
                        {
                            return(ValidatedView.Invalid(ErrorCode.CLAN_NAME_ALREADY_IN_USE));
                        }

                        bool clanTagChanged = clanModel.Tag != clanUpdateView.Tag;
                        if (clanTagChanged &&
                            await Model <ClanModel> .AsQueryable().Any(x => x.Tag == clanUpdateView.Tag))
                        {
                            return(ValidatedView.Invalid(ErrorCode.CLAN_TAG_ALREADY_IN_USE));
                        }

                        clanModel = Mapper <ClanCreateView> .Map(clanUpdateView, clanModel);

                        await Model <ClanModel> .AsCollection()
                        .ReplaceOneAsync(x => x.ID == clanModel.ID, clanModel);

                        foreach (ClanMemberModel member in await Model <ClanMemberModel> .AsQueryable()
                                 .Where(x => x.ClanID == clanModel.ID).ToList())
                        {
                            if (GameManager.Get(member.AccountID, out PlayerController controller))
                            {
                                controller.Account.Clan = Mapper <ClanModel> .Map <ClanOverview>(clanModel);

                                ClanChangedCommand clanChangedCommand = PacketBuilder.ClanChangedCommand(controller);
                                controller.Send(clanChangedCommand);
                                controller.EntitesInRange(x => x.Send(clanChangedCommand));
                            }
                        }

                        return(ValidatedView.Valid());
                    }
                }
                else
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_NOT_MEMBER));
                }
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }
예제 #9
0
        public static async Task <ValidatedView> Leave(int accountId)
        {
            try {
                ClanMemberModel clanMemberModel = await Model <ClanMemberModel>
                                                  .AsQueryable().FirstOrDefault(x => x.AccountID == accountId);

                if (clanMemberModel != null)
                {
                    ClanModel clanModel = await Model <ClanModel> .AsQueryable()
                                          .FirstOrDefault(x => x.ID == clanMemberModel.ClanID);

                    if (clanModel == null)
                    {
                        return(ValidatedView.Invalid(ErrorCode.CLAN_NOT_FOUND));
                    }
                    else
                    {
                        if (await Model <ClanMemberModel> .AsQueryable()
                            .Where(x => x.ClanID == clanModel.ID).Count() > 1 &&
                            clanMemberModel.Role == ClanRole.LEADER)
                        {
                            return(ValidatedView.Invalid(ErrorCode.CLAN_CANNOT_LEAVE_WHILE_LEADER));
                        }

                        if (GameManager.Get(accountId, out PlayerController controller))
                        {
                            if (!controller.ZoneAssembly.CanEquip)
                            {
                                return(ValidatedView.Invalid(ErrorCode.CLAN_CANNOT_LEAVE_WHILE_NOT_AT_BASE));
                            }
                        }

                        await Model <ClanMemberModel> .AsCollection()
                        .DeleteOneAsync(x => x.AccountID == accountId);

                        if (clanMemberModel.Role == ClanRole.LEADER)
                        {
                            await Delete(clanModel.ID);
                        }

                        if (GameManager.Get(accountId, out controller))
                        {
                            controller.Account.Clan = new ClanOverview();

                            ClanChangedCommand clanChangedCommand = PacketBuilder.ClanChangedCommand(controller);
                            controller.Send(clanChangedCommand);
                            controller.EntitesInRange(x => x.Send(clanChangedCommand));
                        }

                        return(ValidatedView.Valid());
                    }
                }
                else
                {
                    return(ValidatedView.Invalid(ErrorCode.CLAN_NOT_MEMBER));
                }
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }