Beispiel #1
0
        public IReadOnlyList <ClanMember> RemoveMember(Guid clanId, Guid characterId)
        {
            var session = GetSession();

            if (!session.Authenticated)
            {
                return(null);
            }

            var user = gameData.GetUser(session.AccountId);

            if (user == null)
            {
                return(null);
            }

            var character = gameData.GetCharacter(characterId);

            if (character == null)
            {
                return(null);
            }
            if (character.UserId != user.Id)
            {
                return(null);
            }

            this.clanManager.RemoveClanMember(clanId, characterId);
            return(GetMembers(clanId));
        }
Beispiel #2
0
        public bool KickPlayer(Guid characterId)
        {
            var character    = gameData.GetCharacter(characterId);
            var userToRemove = gameData.GetUser(character.UserId);

            if (userToRemove == null)
            {
                return(false);
            }

            //var currentSession = gameData.GetSessionByUserId(userId);
            var currentSession = gameData.GetSessionByUserId(character.UserIdLock.GetValueOrDefault());

            if (currentSession == null)
            {
                return(false);
            }

            var characterUser = gameData.GetUser(character.UserId);
            var gameEvent     = gameData.CreateSessionEvent(
                GameEventType.PlayerRemove,
                currentSession,
                new PlayerRemove()
            {
                Reason      = $"{character.Name} was kicked remotely.",
                UserId      = characterUser.UserId,
                CharacterId = character.Id
            });

            gameData.Add(gameEvent);
            return(true);
        }
Beispiel #3
0
        public bool AssignPlayerToHouse(Guid sessionId, int slot, Guid characterId)
        {
            var session = gameData.GetSession(sessionId);
            var village = gameData.GetOrCreateVillageBySession(session);
            var houses  = gameData.GetOrCreateVillageHouses(village);

            var targetHouse = houses.FirstOrDefault(x => x.Slot == slot);

            if (targetHouse == null)
            {
                return(false);
            }

            var player = gameData.GetCharacter(characterId);

            if (player == null)
            {
                return(false);
            }

            var existingHouse = houses.FirstOrDefault(x => x.UserId == player.UserId);

            if (existingHouse != null)
            {
                existingHouse.UserId = null;
            }

            targetHouse.UserId = player.UserId;
            return(true);
        }
Beispiel #4
0
        public void UpdatePlayerIdentifier(Guid characterId, string identifier)
        {
            var c = gameData.GetCharacter(characterId);

            if (c != null)
            {
                c.Identifier = identifier;
            }
        }
        public MarketItemCollection GetItems(int offset, int size)
        {
            var collection      = new MarketItemCollection();
            var marketItemCount = gameData.GetMarketItemCount();
            var items           = gameData.GetMarketItems(offset, size);

            collection.Offset = offset;
            collection.Total  = marketItemCount;
            collection.AddRange(
                items.Select(x =>
            {
                var character     = gameData.GetCharacter(x.SellerCharacterId);
                var user          = gameData.GetUser(character.UserId);
                var item          = DataMapper.Map <Models.MarketItem, DataModels.MarketItem>(x);
                item.SellerUserId = user.UserId;
                return(item);
            }));

            return(collection);
        }
        public void ClanInviteAccepted(Guid clanId, Guid characterId, DateTime utcNow, Guid?inviterUserId)
        {
            var newMember = gameData.GetCharacter(characterId);

            if (newMember == null)
            {
                return;
            }

            var clan = gameData.GetClan(clanId);

            if (clan == null)
            {
                return;
            }

            var inviter = gameData.GetUser(inviterUserId.GetValueOrDefault());

            if (inviter == null)
            {
                inviter = gameData.GetUser(clan.UserId);
            }

            if (inviter == null)
            {
                return;
            }

            this.gameData.Add(new UserNotification
            {
                Id          = Guid.NewGuid(),
                Title       = $"{newMember.Name} has accepted your invite to {clan.Name}",
                Description = $"Welcome {newMember.Name} to {clan.Name}!",
                UserId      = inviter.Id,
                RedirectUrl = "/clan",
                Time        = DateTime.UtcNow
            });
        }
Beispiel #7
0
        public MarketItemCollection GetItems(int offset, int size)
        {
            try
            {
                var collection      = new MarketItemCollection();
                var marketItemCount = gameData.GetMarketItemCount();
                var items           = gameData.GetMarketItems(offset, size);

                collection.Offset = offset;
                collection.Total  = marketItemCount;
                collection.AddRange(
                    items.Select(x =>
                {
                    var character = gameData.GetCharacter(x.SellerCharacterId);
                    if (character == null)
                    {
                        return(null);
                    }
                    var user = gameData.GetUser(character.UserId);
                    if (user == null)
                    {
                        return(null);
                    }
                    var item          = DataMapper.Map <Models.MarketItem, DataModels.MarketItem>(x);
                    item.SellerUserId = user.UserId;
                    return(item);
                })
                    .Where(x => x != null));

                return(collection);
            }
            catch (Exception exc)
            {
                logger.LogError(exc.ToString());
                return(null);
            }
        }
Beispiel #8
0
        public Task <bool> RedeemRewardAsync(
            Guid streamerUserId,
            Guid characterId,
            DataModels.UserLoyaltyReward reward,
            int amount)
        {
            return(Task.Run(() =>
            {
                if (string.IsNullOrEmpty(reward.RewardData) ||
                    !Guid.TryParse(reward.RewardData, out var itemId))
                {
                    return false;
                }

                var streamer = gameData.GetUser(streamerUserId);
                if (streamer == null)
                {
                    return false;
                }

                var character = gameData.GetCharacter(characterId);
                if (character == null)
                {
                    return false;
                }

                var user = gameData.GetUser(character.UserId);
                if (user == null)
                {
                    return false;
                }

                if (amount < 1)
                {
                    return false;
                }

                var cost = reward.Points * amount;
                var loyalty = gameData.GetUserLoyalty(user.Id, streamerUserId);
                if (loyalty.Points < cost)
                {
                    return false;
                }

                loyalty.Points -= cost ?? 0;
                playerManager.AddItem(characterId, itemId, amount);
                return true;
            }));
        }
Beispiel #9
0
        public bool RemovePlayerInvite(Guid clanId, Guid characterId)
        {
            // character does not exist
            var character = gameData.GetCharacter(characterId);

            if (character == null)
            {
                return(false);
            }

            // clan does not exist
            var clan = gameData.GetClan(clanId);

            if (clan == null)
            {
                return(false);
            }

            // no invite available
            var invite = gameData.GetClanInvitesByCharacter(characterId).FirstOrDefault(x => x.ClanId == clanId);

            if (invite == null)
            {
                return(false);
            }

            if (invite.NotificationId != null)
            {
                var notification = gameData.GetNotification(invite.NotificationId.GetValueOrDefault());
                if (notification != null)
                {
                    gameData.Remove(notification);
                }
            }

            gameData.Remove(invite);
            return(true);
        }
        public bool VerifyPlayer(Guid sessionId, Guid characterId, float syncTime)
        {
            var gameSession = gameData.GetSession(sessionId);

            if (gameSession == null)
            {
                logger.LogError($"Player with ID {characterId} not part of session {sessionId}");
                return(false);
            }

#warning player integrity check disabled

            var character = gameData.GetCharacter(characterId);
            if (gameSession.UserId != character.UserIdLock)
            {
                return(false);
            }

            //var sessionState = gameData.GetSessionState(sessionId);
            var playerSessionState = gameData.GetCharacterSessionState(sessionId, characterId);
            if (playerSessionState.Compromised)
            {
                return(false);
            }

            return(true);

            // TODO(Zerratar): enable again in the future


            //var syncDelta = syncTime - sessionState.SyncTime;
            //var clientTime = gameSession.Started.AddSeconds(syncDelta);
            //if (clientTime - DateTime.UtcNow > TimeSpan.FromSeconds(MaxSyncTimeDeltaSeconds))
            //{
            //    logger.WriteError($"Player with ID {characterId} is compromised. CT: {clientTime}, SD: {syncDelta}");
            //    playerSessionState.Compromised = true;
            //    return false;
            //}

            //playerSessionState.SyncTime = syncTime;
            //return true;
        }
Beispiel #11
0
        public bool AttachPlayersToSession(SessionToken session, Guid[] characterIds)
        {
            var s = gameData.GetSession(session.SessionId);

            if (s != null)
            {
                var chars = gameData.GetSessionCharacters(s);
                foreach (var c in chars)
                {
                    c.UserIdLock = null;
                }
            }

            var result = false;

            foreach (var id in characterIds)
            {
                var c = gameData.GetCharacter(id);
                //if (c == null || (c.UserIdLock != null && c.UserIdLock != session))
                result = playerManager.AddPlayer(session, id) != null || result;
            }
            return(result);
        }
Beispiel #12
0
        public int UseExpScroll(SessionToken sessionToken, Guid characterId, int count)
        {
            if (count <= 0)
            {
                return(-1);
            }

            var session = gameData.GetSession(sessionToken.SessionId);

            if (session == null)
            {
                return(-1);
            }

            var character = gameData.GetCharacter(characterId);
            var inventory = inventoryProvider.Get(characterId);

            DataModels.UserBankItem bankItemScroll = null;

            var scrolls = inventory.GetUnequippedItems(DataModels.ItemCategory.Scroll);
            var scroll  = scrolls.FirstOrDefault(x => x.Item.Name.Contains("exp", StringComparison.OrdinalIgnoreCase));

            if (scroll.IsNull() || scroll.Amount <= 0)
            {
                var bankItems = gameData.GetUserBankItems(character.UserId);
                bankItemScroll = bankItems.FirstOrDefault(x => IsScrollOfType(x, ScrollType.Experience));
                if (bankItemScroll == null)
                {
                    return(-2);
                }
            }

            int left       = serverManager.GetIncreasableGlobalExpAmount();
            int usageCount = count;

            if (bankItemScroll != null)
            {
                usageCount = (int)bankItemScroll.Amount;
            }
            else
            {
                usageCount = (int)scroll.Amount;
            }

            usageCount = (int)Math.Min(count, Math.Min(usageCount, left));
            if (left <= 0 || usageCount <= 0)
            {
                return(0);
            }

            var user = gameData.GetUser(character.UserId);

            if (serverManager.IncreaseGlobalExpMultiplier(user, usageCount))
            {
                if (bankItemScroll != null)
                {
                    gameData.RemoveFromStash(bankItemScroll, usageCount);
                }
                else
                {
                    inventory.RemoveItem(scroll, usageCount);
                }

                return(usageCount);
            }

            return(0);
        }
Beispiel #13
0
        public void EquipBestItems()
        {
            lock (mutex)
            {
                var character = gameData.GetCharacter(characterId);
                var equippedPetInventoryItem = GetEquippedItem(ItemCategory.Pet);

                UnequipAllItems();

                var skills         = gameData.GetCharacterSkills(character.SkillsId);
                var inventoryItems = GetUnequippedItems()
                                     //.Select(x => new { InventoryItem = x, Item = x.Item })
                                     .Where(x => CanEquipItem(x.Item, skills))
                                     .OrderByDescending(x => GetItemValue(x.Item))
                                     .ToList();

                var meleeWeaponToEquip = inventoryItems.FirstOrDefault(x => x.Item.Category == (int)ItemCategory.Weapon && (x.Item.Type == (int)ItemType.OneHandedSword || x.Item.Type == (int)ItemType.TwoHandedSword || x.Item.Type == (int)ItemType.TwoHandedAxe));
                if (meleeWeaponToEquip.IsNotNull())
                {
                    EquipItem(meleeWeaponToEquip);
                }

                var rangedWeaponToEquip = inventoryItems.FirstOrDefault(x => x.Item.Category == (int)ItemCategory.Weapon && x.Item.Type == (int)ItemType.TwoHandedBow);
                if (rangedWeaponToEquip.IsNotNull())
                {
                    EquipItem(rangedWeaponToEquip);
                }

                var magicWeaponToEquip = inventoryItems.FirstOrDefault(x => x.Item.Category == (int)ItemCategory.Weapon && x.Item.Type == (int)ItemType.TwoHandedStaff);
                if (magicWeaponToEquip.IsNotNull())
                {
                    EquipItem(magicWeaponToEquip);
                }

                ReadOnlyInventoryItem equippedPet;
                if (equippedPetInventoryItem.IsNotNull())
                {
                    equippedPet = GetUnequippedItem(equippedPetInventoryItem.ItemId);
                    if (equippedPet.IsNotNull())
                    {
                        EquipItem(equippedPet);
                    }
                }
                else
                {
                    var petToEquip = GetUnequippedItem(ItemCategory.Pet);
                    if (petToEquip.IsNotNull())
                    {
                        EquipItem(petToEquip);
                    }
                }

                foreach (var itemGroup in inventoryItems
                         .Where(x =>
                                x.Item.Category != (int)ItemCategory.Weapon &&
                                x.Item.Category != (int)ItemCategory.Pet &&
                                x.Item.Category != (int)ItemCategory.StreamerToken &&
                                x.Item.Category != (int)ItemCategory.Scroll)
                         .GroupBy(x => x.Item.Type))
                {
                    var itemToEquip = itemGroup
                                      .OrderByDescending(x => GetItemValue(x.Item))
                                      .FirstOrDefault();

                    if (itemToEquip.IsNotNull())
                    {
                        EquipItem(itemToEquip);
                    }
                }
            }
        }
Beispiel #14
0
        public async Task <ExtensionPlayerJoinResult> PlayerJoin(string broadcasterId)
        {
            var result = new ExtensionPlayerJoinResult();

            if (string.IsNullOrEmpty(broadcasterId))
            {
                result.ErrorMessage = "Invalid broadcaster or bad character id";
                return(result);
            }

            var activeSession = gameData.GetOwnedSessionByUserId(broadcasterId);

            if (activeSession == null)
            {
                result.ErrorMessage = "Broadcaster does not have an active game session";
                return(result);
            }

            if (TryGetSession(out var sessionInfo))
            {
                var user = gameData.GetUser(sessionInfo.AccountId);
                if (user == null)
                {
                    result.ErrorMessage = "No such user.";
                    return(result);
                }

                var existingCharacters = gameData.GetCharactersByUserId(user.Id);
                if (existingCharacters.Count >= 3)
                {
                    result.ErrorMessage = "You already have 3 characters.";
                    return(result);
                }

                var index  = existingCharacters.Count + 1;
                var player = await playerManager.CreatePlayer(user.UserId, user.UserName, index.ToString());

                if (player == null)
                {
                    result.ErrorMessage = "Failed to create a new character.";
                    return(result);
                }

                var c = gameData.GetCharacter(player.Id);
                if (c == null)
                {
                    result.ErrorMessage = "Okay. We don't know what went wrong here. Very sorry!";
                    return(result);
                }

                // We are just going to assume that it was successeful
                // since, if it "fails" as the character is already in game. well. Then what harm done?
                result.Success = true;
                result.Player  = c.MapForWebsite(gameData, user);

                sessionInfoProvider.SetActiveCharacter(sessionInfo, c.Id);

                var gameEvent = gameData.CreateSessionEvent(
                    GameEventType.PlayerAdd,
                    activeSession,
                    new PlayerAdd()
                {
                    CharacterId = c.Id,
                    Identifier  = c.Identifier,
                    UserId      = sessionInfo.UserId,
                    UserName    = sessionInfo.UserName
                });

                gameData.Add(gameEvent);
            }
            else
            {
                result.ErrorMessage = "You don't seem to be authenticated.";
                return(result);
            }

            return(result);
        }