Exemple #1
0
        public static PartyModel FromStorageParty(PartyStorageModel input)
        {
            var players = input.Players.ConvertAll(x => FromStoragePlayer(x));

            return(new PartyModel
            {
                Name = input.Name,
                SpectatorCode = input.SpectatorCode,
                Players = players
            });
        }
Exemple #2
0
 public async Task CreateParty(PartyStorageModel party)
 {
     await _parties.InsertOneAsync(party);
 }
Exemple #3
0
        public async Task JoinParty(string partyName, string spectatorCode, string playerObj)
        {
            // if spectatorCode is empty, fetch it
            if (string.IsNullOrEmpty(spectatorCode))
            {
                spectatorCode = SpectatorHelper.ToSpectatorCode(partyName, _key);
            }
            // if partyname is empty, fetch it
            else if (string.IsNullOrEmpty(partyName))
            {
                partyName = SpectatorHelper.ToPartyName(spectatorCode, _key);
            }

            var player = CompressionHelper.Decompress <PlayerModel>(playerObj);

            player.ConnectionID = Context.ConnectionId;

            var update = await _mongoRepository.UpdatePartyNameInConnectionIndex(ConnectionId, partyName);

            if (update == null)
            {
                await AddToIndex(partyName);
            }

            var storageParty = await _mongoRepository.GetParty(partyName);

            if (storageParty == null)
            {
                if (player.IsSpectator)
                {
                    await Clients.Caller.SendAsync("GroupNotFoundOrEmpty");
                }
                else
                {
                    player.IsLeader = true;
                    storageParty    = new PartyStorageModel()
                    {
                        Name = partyName, Players = new List <PlayerStorageModel> {
                            StorageHelper.ToStoragePlayer(player)
                        }, SpectatorCode = spectatorCode
                    };
                    await _mongoRepository.CreateParty(storageParty);

                    storageParty.Name = "";
                    var party = StorageHelper.FromStorageParty(storageParty);
                    await Clients.Caller.SendAsync("EnteredParty", CompressionHelper.Compress(party), CompressionHelper.Compress(player));
                }
            }
            else
            {
                if (player.IsSpectator && !storageParty.Players.Any(x => !x.IsSpectator))
                {
                    await Clients.Caller.SendAsync("GroupNotFoundOrEmpty");
                }
                else
                {
                    var oldPlayer = storageParty.Players.FirstOrDefault(x => (x.ConnectionID == player.ConnectionID || (x.Character != null && player.Character != null && x.Character.Name == player.Character.Name)));

                    // if the party were joining doesnt have a leader, make the player leader
                    if (!storageParty.Players.Any(x => x.IsLeader))
                    {
                        player.IsLeader = true;
                    }

                    var storagePlayer = StorageHelper.ToStoragePlayer(player);
                    if (oldPlayer == null)
                    {
                        await _mongoRepository.AddPlayerToParty(partyName, storagePlayer);
                    }
                    else
                    {
                        await _mongoRepository.UpdatePlayerInParty(partyName, storagePlayer);
                    }

                    storageParty = await _mongoRepository.GetParty(partyName);

                    storageParty.Name = "";
                    var party = StorageHelper.FromStorageParty(storageParty);
                    await Clients.Caller.SendAsync("EnteredParty", CompressionHelper.Compress(party), CompressionHelper.Compress(player));
                }
            }

            await Groups.AddToGroupAsync(Context.ConnectionId, partyName);

            await Clients.OthersInGroup(partyName).SendAsync("PlayerJoined", CompressionHelper.Compress(player));

            if (!player.IsSpectator)
            {
                await Clients.Group(partyName).SendAsync("PlayerUpdated", CompressionHelper.Compress(player));
            }
        }