public void ParseShouldSetTextWithPlaceHoldersFromStatDataService() { const string expected = "Stat text with placeholders"; string[] itemStringLines = this.itemStringBuilder .WithType("Oriath's Virtue's Eye") .WithItemLevel(73) .WithItemStat("Drops additional Currency Items", StatCategory.Monster) .WithDescription(Resources.OrganItemDescriptor) .BuildLines(); this.statsDataServiceMock.Setup(x => x.GetStatData(It.IsAny <string>(), It.IsAny <bool>(), StatCategory.Monster.GetDisplayName())) .Returns(new StatData { Text = expected, Type = StatCategory.Monster.GetDisplayName() }); ItemStats result = this.organItemStatsParser.Parse(itemStringLines, false); Assert.That(result.AllStats, Has.Count.EqualTo(1)); Assert.That(result.MonsterStats, Has.Count.EqualTo(1)); ItemStat stat = result.MonsterStats.First(); Assert.That(stat.TextWithPlaceholders, Is.EqualTo(expected)); }
public async Task <List <ItemStatResponse> > CreateOrUpdateItemStats(List <CreateItemStatRequest> createItemStatsRequest) { var itemStatsToUpdate = new List <CreateItemStatRequest>(); var itemStatsToCreate = new List <CreateItemStatRequest>(); var allItemStates = await _itemStatRepository.AllAsync(); foreach (var itemStat in createItemStatsRequest) { ItemStat foundItemStat = allItemStates.Find(x => x.Code == itemStat.Code && x.DisplayName == itemStat.DisplayName && x.Name == itemStat.Name); if (foundItemStat != null) { itemStat.Id = foundItemStat.Id; itemStatsToUpdate.Add(itemStat); } else { itemStatsToCreate.Add(itemStat); } } await _itemStatRepository.AddMultipleAsync(_mapper.Map <List <ItemStat> >(itemStatsToCreate)); await _itemStatRepository.BulkUpdate(_mapper.Map <List <ItemStat> >(itemStatsToUpdate)); return(_mapper.Map <List <ItemStatResponse> >(createItemStatsRequest)); }
public ItemStat(ItemStat itemStat) { this.Id = itemStat.Id; this.Text = itemStat.Text; this.TextWithPlaceholders = itemStat.TextWithPlaceholders; this.StatCategory = itemStat.StatCategory; }
// 아이템 팔 때 발생하는 이벤트 // 아이템을 팔 때, 캐릭터 스텟을 가져와서 캐릭터 스텟을 수정한다. public void OnDropItemSellEvent(Item draggedItem) { if (PlayerItems.Count == 0) { return; } // TODO : 골드 최대치 검사하는 코드 넣기 // 아이템 해제 후 캐릭터 스텟 수정 { if (Managers.Game.Player == null) { return; } CharacterStat characterStat = Managers.Game.Player.GetComponent <PlayerController>().Stat; ItemStat itemStat = draggedItem.ItemStat; characterStat.ItemUnEquipment(itemStat); } Managers.Game.Player.GetComponent <CharacterStat>().Gold += draggedItem.GetComponent <ItemStat>().Price; PlayerItems.Remove(draggedItem); // 아이템을 팔 때는 아이템이 사라지는 것이니까 특별히 아래와 같은 코드를 넣어줄 것 draggedItem.ItemImage.raycastTarget = true; draggedItem.ItemCanvas.sortingOrder = 0; draggedItem.ItemCanvas.overrideSorting = false; Managers.Resource.Destroy(draggedItem.gameObject); }
public Resource(string name, string symbol, double ore_threshold, double ingot_threshold) { this.name = name; this.symbol = symbol; this.ore = new ItemStat(ore_threshold); this.ingot = new ItemStat(ingot_threshold); }
private ItemStats.StatTranslator.AddStat Single(ItemStat stat) { return(delegate(ItemStats x, Poe_ItemMod m) { x.AddToMod(stat, (float)m.Value1); }); }
private ItemStats.StatTranslator.AddStat Average(ItemStat stat) { return(delegate(ItemStats x, Poe_ItemMod m) { x.AddToMod(stat, (float)(m.Value1 + m.Value2) / 2f); }); }
private void HandleChangeAttributes(GameSession session, PacketReader packet) { short lockIndex = -1; long itemUid = packet.ReadLong(); packet.Skip(8); bool useLock = packet.ReadBool(); if (useLock) { packet.Skip(1); lockIndex = packet.ReadShort(); } if (session.Player.Inventory.Items.TryGetValue(itemUid, out Item item)) { item.TimesAttributesChanged++; var newItem = new Item(item); int attributeCount = newItem.Stats.BonusAttributes.Count; var rng = new Random(); for (int i = 0; i < attributeCount; i++) { if (i == lockIndex) { continue; } // TODO: Don't RNG the same attribute twice newItem.Stats.BonusAttributes[i] = ItemStat.Of((ItemAttribute)rng.Next(35), 0.01f); } session.StateStorage[NEW_ITEM_KEY] = newItem; session.Send(ChangeAttributesPacket.PreviewNewItem(newItem)); } }
public Dictionary <int, ItemStat> GetItemStats(int level) { SetStatConfigCollection(LoadResourceController.GetCharacterConfigCollection()); if (itemDict == null) { itemDict = new Dictionary <int, ItemStat>(); } for (int i = 0; i < statTypes.Length; i++) { var baseValue = statConfigCollection.GetStatConfigData(statTypes[i]).GetBaseValue(level); if (!itemDict.ContainsKey(statTypes[i])) { ItemStat itemStat = new ItemStat(baseValue, statTypes[i]); itemDict.Add(statTypes[i], itemStat); } else { itemDict[statTypes[i]].baseStat.RemoveAllModifiers(); itemDict[statTypes[i]].baseStat.baseValue = baseValue; } } return(itemDict); }
public static ItemStat GetItemStat(string item) { var stat = new ItemStat(); for (int i = 0; i < item.Length; i++) { switch (item[i]) { case '1': stat.Count1++; stat.Count++; break; case '2': stat.Count2++; stat.Count++; break; case '3': stat.Count3++; stat.Count++; break; } } if (stat.Count > 0) { stat.Pct1 = Math.Round(stat.Count1 * 100D / stat.Count, 1); stat.Pct2 = Math.Round(stat.Count2 * 100D / stat.Count, 1); stat.Pct3 = Math.Round(stat.Count3 * 100D / stat.Count, 1); } return(stat); }
public void ParseShouldAddResultFromPseudoItemStatsParserToResult() { ItemStat expected = new ItemStat(StatCategory.Pseudo) { Id = "test id" }; string[] itemStringLines = this.itemStringBuilder .WithName("Titan Greaves") .WithItemLevel(75) .WithItemStat("statText", StatCategory.Explicit) .BuildLines(); this.statsDataServiceMock.Setup(x => x.GetStatData(It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <string[]>())) .Returns(new StatData()); this.pseudoItemStatsParserMock.Setup(x => x.Parse(It.IsAny <IEnumerable <ItemStat> >())) .Returns(new List <ItemStat> { expected }); ItemStats result = this.itemStatsParser.Parse(itemStringLines, false); Assert.That(result.AllStats, Contains.Item(expected)); }
public SingleValueItemStat(ItemStat itemStat) : base(itemStat) { if (itemStat is SingleValueItemStat singleValueItemStat) { this.Value = singleValueItemStat.Value; } }
public static ItemStat Read(IBitReader reader, ushort id) { var itemStat = new ItemStat(); var property = Core.MetaData.ItemStatCostData.GetById(id); if (property == null) { throw new Exception($"No ItemStatCost record found for id: {id} at bit {reader.Position - 9}"); } itemStat.Id = id; itemStat.Stat = property["Stat"].Value; int saveParamBitCount = property["Save Param Bits"].ToInt32(); int encode = property["Encode"].ToInt32(); if (saveParamBitCount != 0) { int saveParam = reader.ReadInt32(saveParamBitCount); //todo is there a better way to identify skill tab stats. switch (property["descfunc"].ToInt32()) { case 14: //+[value] to [skilltab] Skill Levels ([class] Only) : stat id 188 itemStat.SkillTab = saveParam & 0x7; itemStat.SkillLevel = (saveParam >> 3) & 0x1fff; break; default: break; } switch (encode) { case 2: //chance to cast skill case 3: //skill charges itemStat.SkillLevel = saveParam & 0x3f; itemStat.SkillId = (saveParam >> 6) & 0x3ff; break; case 1: case 4: //by times default: itemStat.Param = saveParam; break; } } int saveBits = reader.ReadInt32(property["Save Bits"].ToInt32()); saveBits -= property["Save Add"].ToInt32(); switch (encode) { case 3: //skill charges itemStat.MaxCharges = (saveBits >> 8) & 0xff; itemStat.Value = saveBits & 0xff; break; default: itemStat.Value = saveBits; break; } return(itemStat); }
public MinMaxValueItemStat(ItemStat itemStat) : base(itemStat) { if (itemStat is MinMaxValueItemStat minMaxValueItemStat) { this.MinValue = minMaxValueItemStat.MinValue; this.MaxValue = minMaxValueItemStat.MaxValue; } }
public void CreateShouldSetIsEnabledTrueIfQueryRequestContainsFilter(ItemStat itemStat) { SearchQueryRequest queryRequest = GetQueryRequestWithStatFilter(itemStat.Id, new MinMaxFilter()); StatFilterViewModel result = this.statFilterViewModelFactory.Create(itemStat, queryRequest); Assert.That(result.IsEnabled, Is.True); }
private ItemStats.StatTranslator.AddStat Dual(ItemStat s1, ItemStat s2) { return(delegate(ItemStats x, Poe_ItemMod m) { x.AddToMod(s1, (float)m.Value1); x.AddToMod(s2, (float)m.Value2); }); }
public void CreateShouldNotReturnStatFilterViewModelIfItemStatIsItemStatWithoutValue() { var itemStat = new ItemStat(StatCategory.Explicit); StatFilterViewModel result = this.statFilterViewModelFactory.Create(itemStat, new SearchQueryRequest()); Assert.IsNotNull(result); Assert.IsNotInstanceOf <MinMaxStatFilterViewModel>(result); }
private static ItemStat GetSingleValueItemStat(ItemStat itemStat) { decimal?value = GetFirstNumericValue(itemStat.Text.Substring(itemStat.TextWithPlaceholders.IndexOf(Placeholder))); return(value.HasValue ? new SingleValueItemStat(itemStat) { Value = value.Value } : itemStat); }
private ItemStats.StatTranslator.AddStat MultipleSame(params ItemStat[] stats) { return(delegate(ItemStats x, Poe_ItemMod m) { ItemStat[] stats2 = stats; for (int i = 0; i < stats2.Length; i++) { ItemStat stat = stats2[i]; x.AddToMod(stat, (float)m.Value1); } }); }
public void ItemUnEquipment(ItemStat itemStat) { Hp -= itemStat.Hp; Attack -= itemStat.Attack; Defense -= itemStat.Defense; MoveSpeed -= itemStat.MoveSpeed; AttackSpeed -= itemStat.AttackSpeed; Animator playerAnimator = Managers.Game.Player.GetComponent <PlayerController>().PlayerAnimator; playerAnimator.SetFloat("AttackSpeed", AttackSpeed); }
void SetStat1(ItemStat firstStat) { Stat1forPickup = firstStat; string theName = "nada"; switch (firstStat.TheStat) { case StatType.None: { theName = " "; break; } case StatType.SpellMod: { theName = "Spell Power"; firstStat.StatAmount *= .3f; break; } case StatType.MeleeMod: { theName = "Attack Damage"; firstStat.StatAmount *= .3f; break; } case StatType.MaxHP: { theName = "Max HP"; firstStat.StatAmount *= 2; break; } case StatType.MaxLight: { theName = "Max Light"; firstStat.StatAmount *= 1.3f; break; } } ToolTipTexts._ItemStat1 = theName; if (firstStat.StatAmount == 0) { ToolTipTexts._ItemAmount2 = " "; } else { ToolTipTexts._ItemAmount1 = firstStat.StatAmount.ToString(); } }
// 아이템을 살 때는 빈 곳 부터 채우기 // 아이템 살 때 발생하는 이벤트 // 아이템을 살 때, 동시에 캐릭터 스텟을 가져와ㅅ 캐릭터 스텟을 올려준다. public void OnDropItemBuyEvent(Item draggedItem) { if (PlayerItems.Count == 6) { Debug.Log("Full Inventory"); return; } if (Managers.Game.Player.GetComponent <CharacterStat>().Gold < draggedItem.GetComponent <ItemStat>().Price) { Debug.Log("lack of Money"); return; } Managers.Game.Player.GetComponent <CharacterStat>().Gold -= draggedItem.GetComponent <ItemStat>().Price; Item newItem = Managers.Resource.Instantiate($"Prefabs/Item/{draggedItem.name}").GetComponent <Item>(); foreach (Transform child in transform.GetComponentInChildren <Transform>()) { if (child.childCount == 0) { newItem.transform.SetParent(child); break; } else { continue; } } RectTransform rectTransform = newItem.GetComponent <RectTransform>(); rectTransform.localPosition = Vector2.zero; rectTransform.localScale = Vector3.one; PlayerItems.Add(newItem); // 아이템 장착 후 캐릭터 스텟 수정 { if (Managers.Game.Player == null) { return; } CharacterStat characterStat = Managers.Game.Player.GetComponent <PlayerController>().Stat; // newItem은 아직 Start가 실행되지 않기 때문에, draggedItem으로 접근해야한다. ItemStat itemStat = draggedItem.ItemStat; characterStat.ItemEquipment(itemStat); } }
public async Task GetStatDataShouldReturnCorrectStatDataForImplicitStat() { const StatCategory statCategory = StatCategory.Implicit; var implicitItemStat = new ItemStat(statCategory) { Text = "3% increased Movement Speed" }; var expected = new StatData { Id = "stat_12345678", Text = "#% increased Movement Speed", Type = statCategory.GetDisplayName().ToLower() }; await this.GetStatDataShouldReturnCorrectStatData(implicitItemStat, expected); }
public virtual ItemStat GetStatNextLevel(int level) { if (statConfigCollection == null) { statConfigCollection = LoadResourceController.GetStatConfigCollection(); } // Get base data from scriptable object var baseValue = statConfigCollection.GetStatConfigData(statType).GetBaseValue(level + 1); ItemStat itemStat = new ItemStat(baseValue, statType); return(itemStat); }
// Example: "item id:20000027" private static void ProcessItemCommand(GameSession session, string command) { Dictionary <string, string> config = command.ToMap(); if (!int.TryParse(config.GetValueOrDefault("id", "20000027"), out int itemId)) { return; } if (!ItemMetadataStorage.IsValid(itemId)) { session.SendNotice("Invalid item: " + itemId); return; } // Add some bonus attributes to equips and pets ItemStats stats = new ItemStats(); if (ItemMetadataStorage.GetTab(itemId) == InventoryTab.Gear || ItemMetadataStorage.GetTab(itemId) == InventoryTab.Pets) { Random rng = new Random(); stats.BonusAttributes.Add(ItemStat.Of((ItemAttribute)rng.Next(35), 0.01f)); stats.BonusAttributes.Add(ItemStat.Of((ItemAttribute)rng.Next(35), 0.01f)); } Item item = new Item(itemId) { CreationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), TransferFlag = TransferFlag.Splitable | TransferFlag.Tradeable, Stats = stats, PlayCount = itemId.ToString().StartsWith("35") ? 10 : 0 }; if (int.TryParse(config.GetValueOrDefault("rarity", "5"), out int rarity)) { item.Rarity = rarity; } if (int.TryParse(config.GetValueOrDefault("amount", "1"), out int amount)) { item.Amount = amount; } // Simulate looting item InventoryController.Add(session, item, true); /*if (session.Player.Inventory.Add(item)) * { * session.Send(ItemInventoryPacket.Add(item)); * session.Send(ItemInventoryPacket.MarkItemNew(item, item.Amount)); * }*/ }
public async Task GetStatDataShouldReturnCorrectStatDataForEnchantedStat() { const StatCategory statCategory = StatCategory.Enchant; var craftedItemStat = new ItemStat(statCategory) { Text = "10% increased Movement Speed" }; var expected = new StatData { Id = "stat_1234", Text = "#% increased Movement Speed", Type = statCategory.GetDisplayName().ToLower() }; await this.GetStatDataShouldReturnCorrectStatData(craftedItemStat, expected); }
public async Task GetStatDataShouldReturnCorrectStatDataForMonsterStat() { const StatCategory statCategory = StatCategory.Monster; var monsterItemStat = new ItemStat(statCategory) { Text = "Drops additional Currency Items" }; var expected = new StatData { Id = "stat_2250533757", Text = "Drops additional Currency Items (×#)", Type = statCategory.GetDisplayName().ToLower() }; await this.GetStatDataShouldReturnCorrectStatData(monsterItemStat, expected); }
public async Task GetStatDataShouldReturnCorrectStatDataEvenIfTextWithPlaceholdersDoesNotFullyMatch() { const StatCategory statCategory = StatCategory.Implicit; var explicitItemStat = new ItemStat(statCategory) { Text = "+10 to Maximum Mana per Green Socket" }; var expected = new StatData { Id = "stat_2250533757", Text = "+# to Maximum Mana per Green Socket", Type = statCategory.GetDisplayName().ToLower() }; await this.GetStatDataShouldReturnCorrectStatData(explicitItemStat, expected); }
public StatFilterViewModel Create(ItemStat itemStat, SearchQueryRequest queryRequest) { StatFilterViewModel result; var matchingFilter = FindMatchingFilter(itemStat, queryRequest); (decimal minValue, decimal maxValue)? minMaxTuple = GetMinMaxTuple(itemStat); result = minMaxTuple.HasValue ? GetMinMaxStatFilterViewModel(itemStat, matchingFilter, minMaxTuple.Value) : GetStatFilterViewModel(itemStat, matchingFilter); return(result); }
private static void HandleSearch(GameSession session, PacketReader packet) { int minCategoryId = packet.ReadInt(); int maxCategoryId = packet.ReadInt(); int minLevel = packet.ReadInt(); int maxLevel = packet.ReadInt(); JobFlag job = (JobFlag)packet.ReadInt(); int rarity = packet.ReadInt(); int minEnchantLevel = packet.ReadInt(); int maxEnchantLevel = packet.ReadInt(); byte minSockets = packet.ReadByte(); byte maxSockets = packet.ReadByte(); string name = packet.ReadUnicodeString(); int startPage = packet.ReadInt(); long sort = packet.ReadLong(); packet.ReadShort(); bool additionalOptionsEnabled = packet.ReadBool(); List <ItemStat> stats = new(); if (additionalOptionsEnabled) { packet.ReadByte(); // always 1 for (int i = 0; i < 3; i++) { int statId = packet.ReadInt(); int value = packet.ReadInt(); if (value == 0) { continue; } ItemStat stat = ReadStat(statId, value); if (stat == null) { continue; } stats.Add(stat); } } List <string> itemCategories = BlackMarketTableMetadataStorage.GetItemCategories(minCategoryId, maxCategoryId); List <BlackMarketListing> searchResults = GameServer.BlackMarketManager.GetSearchedListings(itemCategories, minLevel, maxLevel, rarity, name, job, minEnchantLevel, maxEnchantLevel, minSockets, maxSockets, startPage, sort, additionalOptionsEnabled, stats); session.Send(BlackMarketPacket.SearchResults(searchResults)); }
public static int GetSocketBonus(ItemStat stat, int level) { switch (stat) { case ItemStat.AGILITY: return 3922 + (level - 1) * 24; case ItemStat.STRENGTH: return 3923 + (level - 1) * 24; case ItemStat.INTELLECT: return 3924 + (level - 1) * 24; case ItemStat.SPIRIT: return 3925 + (level - 1) * 24; case ItemStat.STAMINA: return 3926 + (level - 1) * 24; case ItemStat.DEFENSE_RATING: return 3927 + (level - 1) * 24; case ItemStat.DODGE_RATING: return 3928 + (level - 1) * 24; case ItemStat.PARRY_RATING: return 3929 + (level - 1) * 24; case ItemStat.BLOCK_RATING: return 3930 + (level - 1) * 24; case ItemStat.HIT_MELEE_RATING: return 3931 + (level - 1) * 24; case ItemStat.HIT_SPELL_RATING: return 3932 + (level - 1) * 24; case ItemStat.CRIT_MELEE_RATING: return 3933 + (level - 1) * 24; case ItemStat.CRIT_SPELL_RATING: return 3934 + (level - 1) * 24; case ItemStat.HASTE_MELEE_RATING: return 3935 + (level - 1) * 24; case ItemStat.HASTE_SPELL_RATING: return 3936 + (level - 1) * 24; case ItemStat.EXPERTISE_RATING: return 3937 + (level - 1) * 24; case ItemStat.ATTACK_POWER: return 3938 + (level - 1) * 24; case ItemStat.SPELL_HEALING: return 3939 + (level - 1) * 24; case ItemStat.SPELL_DAMAGE: return 3940 + (level - 1) * 24; case ItemStat.MANA_REGEN: return 3941 + (level - 1) * 24; case ItemStat.ARMOR_PENETRATION_RATING: return 3942 + (level - 1) * 24; case ItemStat.HEALTH_REGEN: return 3943 + (level - 1) * 24; case ItemStat.SPELL_PENETRATION: return 3944 + (level - 1) * 24; case ItemStat.BLOCK_VALUE: return 3945 + (level - 1) * 24; default: return 0; } }
private ItemStats.StatTranslator.AddStat Average(ItemStat stat) { return delegate(ItemStats x, ItemMod m) { x.AddToMod(stat, (float)(m.Value1 + m.Value2) / 2f); }; }
private void AddToMod(ItemStat stat, float value) { this.stats[(int)stat] += value; }
public float GetStat(ItemStat stat) { return this.stats[(int)stat]; }
private ItemStats.StatTranslator.AddStat Single(ItemStat stat) { return delegate(ItemStats x, ItemMod m) { x.AddToMod(stat, (float)m.Value1); }; }
private ItemStats.StatTranslator.AddStat Dual(ItemStat s1, ItemStat s2) { return delegate(ItemStats x, ItemMod m) { x.AddToMod(s1, (float)m.Value1); x.AddToMod(s2, (float)m.Value2); }; }