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