protected void UpdateResources( IGameData gameData, DataModels.GameSession session, Character character, DataModels.Resources resources) { if (resources == null) { resources = new DataModels.Resources { Id = Guid.NewGuid(), }; gameData.Add(resources); character.ResourcesId = resources.Id; } var user = gameData.GetUser(character.UserId); var gameEvent = gameData.CreateSessionEvent(GameEventType.ResourceUpdate, session, new ResourceUpdate { UserId = user.UserId, FishAmount = resources.Fish, OreAmount = resources.Ore, WheatAmount = resources.Wheat, WoodAmount = resources.Wood, CoinsAmount = resources.Coins }); gameData.Add(gameEvent); }
//public bool FixCharacterExpGain(Guid characterId) //{ // var character = gameData.GetCharacter(characterId); // if (character == null) return false; // var playerSkills = gameData.GetSkills(character.SkillsId); // if (playerSkills == null) return false; // var skills = playerSkills.GetSkills(); // foreach (var skill in skills) // { // var level = skill.Level; // var cappedLevel = level > 170 ? 170 : level; // var expBase = GameMath.OLD_ExperienceToLevel(cappedLevel); // var newLevelDiff = level - cappedLevel; // var totalGainedExp = 0m; // for (var i = 1; i <= newLevelDiff; ++i) // { // totalGainedExp += GameMath.ExperienceForLevel(level + i); // } // skill.Experience // } //} public bool AddCoins(string query, string identifier) { var character = itemResolver.ResolveCharacter(query, identifier); if (character == null) { return(false); } var amount = query.Split(' ').LastOrDefault(); if (long.TryParse(amount, out var amountValue)) { var resx = gameData.GetResourcesByCharacterId(character.Id); if (resx == null) { resx = new DataModels.Resources { Id = Guid.NewGuid(), Coins = amountValue }; character.ResourcesId = resx.Id; gameData.Add(resx); return(true); } resx.Coins += amountValue; return(true); } return(false); }
private static void MergeResources(DataModels.Resources main, DataModels.Resources alt) { main.Arrows += alt.Arrows; main.Coins += alt.Coins; main.Fish += alt.Fish; main.Magic += alt.Magic; main.Ore += alt.Ore; main.Wheat += alt.Wheat; main.Wood += alt.Wood; }
protected DataModels.Resources GetVillageResources(IGameData gameData, DataModels.GameSession session) { DataModels.Resources resx = null; var village = gameData.GetVillageBySession(session); if (village != null) { resx = gameData.GetResources(village.ResourcesId); } return(resx); }
public override void Process( IIntegrityChecker integrityChecker, IGameData gameData, IPlayerInventoryProvider inventoryProvider, DataModels.GameSession session, Character character, CharacterState characterState) { var now = DateTime.UtcNow; var resources = gameData.GetResources(character.ResourcesId); if (resources == null) { resources = new DataModels.Resources { Id = Guid.NewGuid(), }; gameData.Add(resources); character.ResourcesId = resources.Id; } var state = gameData.GetCharacterSessionState(session.Id, character.Id); if (now - state.LastTaskUpdate >= TimeSpan.FromSeconds(ItemDropRateSettings.ResourceGatherInterval)) { session.Updated = DateTime.UtcNow; state.LastTaskUpdate = DateTime.UtcNow; if (resources.Ore >= OrePerIngot) { resources.Ore -= OrePerIngot; IncrementItemStack(gameData, inventoryProvider, session, character, IngotId); } if (resources.Wood >= WoodPerPlank) { resources.Wood -= WoodPerPlank; IncrementItemStack(gameData, inventoryProvider, session, character, PlankId); } UpdateResources(gameData, session, character, resources); } }
public ItemEnchantmentResult EnchantItem( System.Guid sessionId, DataModels.ClanSkill clanSkill, Character character, PlayerInventory inventory, ReadOnlyInventoryItem item, DataModels.Resources resources) { var user = gameData.GetUser(character.UserId); var invItem = inventory.Get(item); if (invItem == null) { // No such item in our inventory return(ItemEnchantmentResult.Error()); } var i = item.Item; var enchantable = // i.Type == (int)DataModels.ItemCategory.Pet || // in the future. :) i.Category == (int)DataModels.ItemCategory.Weapon || i.Category == (int)DataModels.ItemCategory.Armor || i.Category == (int)DataModels.ItemCategory.Ring || i.Category == (int)DataModels.ItemCategory.Amulet; if (!enchantable) { return(ItemEnchantmentResult.NotEnchantable); } var characterSessionState = gameData.GetCharacterSessionState(sessionId, character.Id); if (characterSessionState.EnchantmentCooldown > DateTime.MinValue && characterSessionState.EnchantmentCooldown > DateTime.UtcNow) { return(ItemEnchantmentResult.NotReady(characterSessionState.EnchantmentCooldown)); } try { //item = inventory.RemoveAttributes(item); var itemLvReq = (i.RequiredAttackLevel + i.RequiredDefenseLevel + i.RequiredMagicLevel + i.RequiredRangedLevel + i.RequiredSlayerLevel); var isStack = item.Amount > 1; var itemPercent = itemLvReq / (float)GameMath.MaxLevel; var itemMaxAttrCount = Math.Max(1, (int)Math.Floor(Math.Floor(itemLvReq / 10f) / 5)); var success = clanSkill.Level / (float)itemLvReq; var targetAttributeCount = 0; var rng = random.NextDouble(); if (rng <= success) { targetAttributeCount = Math.Max(1, itemMaxAttrCount); } else if (rng <= success * 1.33f) { targetAttributeCount = Math.Max(1, (int)Math.Floor(itemMaxAttrCount * 0.5f)); } else if (rng <= success * 2f) { targetAttributeCount = Math.Max(1, (int)Math.Floor(itemMaxAttrCount * 0.33f)); } else if (rng >= 0.75f) { targetAttributeCount = 1; } var maxEnchantments = (int)Math.Floor(Math.Max(MaximumEnchantmentCount, Math.Floor((float)clanSkill.Level / 3f))); targetAttributeCount = Math.Max(0, Math.Min(maxEnchantments, targetAttributeCount)); if (targetAttributeCount == 0) { characterSessionState.EnchantmentCooldown = GetCooldown(user, success, 0.1d); return(ItemEnchantmentResult.Failed(characterSessionState.EnchantmentCooldown)); } DataModels.InventoryItem enchantedItem = null; if (isStack) { inventory.RemoveItem(item, 1); enchantedItem = inventory.AddItemStack(item, 1); } else { enchantedItem = invItem; } enchantedItem.Soulbound = true; enchantedItem.Enchantment = FormatEnchantment(inventory.CreateRandomAttributes(enchantedItem, targetAttributeCount)); var itemName = gameData.GetItem(item.ItemId)?.Name; // Really stupid naming right now. enchantedItem.Name = "Enchanted " + itemName; var multiplier = gameData.GetActiveExpMultiplierEvent()?.Multiplier ?? 1d; var gainedExp = GameMath.GetEnchantingExperience(clanSkill.Level, targetAttributeCount, itemLvReq) * multiplier; // 1. Add exp whenever user successefully enchants an item clanSkill.Experience += gainedExp; var gainedLevels = 0; var nextLevel = GameMath.ExperienceForLevel(clanSkill.Level + 1); while (gainedExp >= nextLevel) { gainedExp -= nextLevel; nextLevel = GameMath.ExperienceForLevel(clanSkill.Level + 1); clanSkill.Level = clanSkill.Level + 1; ++gainedLevels; } // TODO: 2. Send exp update to clients where players in same clan is regarding current state of the clan skill // Set a time limit on how often/frequently a player can use enchanting after they have enchanted an item. // Success: add n Hours based on what type of item // Fail: Add 10% of n Hours based on what type of item characterSessionState.EnchantmentCooldown = GetCooldown(user, success); return(new ItemEnchantmentResult() { GainedExperience = gainedExp, GainedLevels = gainedLevels, EnchantedItem = DataMapper.Map <Models.InventoryItem, DataModels.InventoryItem>(enchantedItem), OldItemStack = DataMapper.Map <Models.InventoryItem, DataModels.InventoryItem>(invItem), Result = ItemEnchantmentResultValue.Success, Cooldown = characterSessionState.EnchantmentCooldown }); } finally { characterSessionState.LastEnchantmentTryAt = DateTime.UtcNow; } }