public void GetStaticStats(int itemId, int rarity, List <NormalStat> normalStats, List <SpecialStat> specialStats) { //Get Static Stats int staticId = ItemMetadataStorage.GetOptionStatic(itemId); ItemOptionsStatic staticOptions = ItemOptionStaticMetadataStorage.GetMetadata(staticId, rarity); if (staticOptions == null) { BasicStats.AddRange(normalStats); BasicStats.AddRange(specialStats); return; } foreach (ParserStat stat in staticOptions.Stats) { NormalStat normalStat = normalStats.FirstOrDefault(x => x.ItemAttribute == stat.Id); if (normalStat == null) { normalStats.Add(new(stat.Id, stat.Flat, stat.Percent)); continue; } int index = normalStats.FindIndex(x => x.ItemAttribute == stat.Id); int summedFlat = normalStat.Flat + stat.Flat; float summedPercent = normalStat.Percent + stat.Percent; normalStats[index] = new(stat.Id, summedFlat, summedPercent); } foreach (ParserSpecialStat stat in staticOptions.SpecialStats) { SpecialStat normalStat = specialStats.FirstOrDefault(x => x.ItemAttribute == stat.Id); if (normalStat == null) { specialStats.Add(new(stat.Id, stat.Flat, stat.Percent)); continue; } int index = specialStats.FindIndex(x => x.ItemAttribute == stat.Id); float summedFlat = normalStat.Flat + stat.Flat; float summedPercent = normalStat.Percent + stat.Percent; specialStats[index] = new(stat.Id, summedFlat, summedPercent); } if (staticOptions.HiddenDefenseAdd > 0) { AddHiddenNormalStat(normalStats, StatId.Defense, staticOptions.HiddenDefenseAdd, staticOptions.DefenseCalibrationFactor); } if (staticOptions.HiddenWeaponAtkAdd > 0) { AddHiddenNormalStat(normalStats, StatId.MinWeaponAtk, staticOptions.HiddenWeaponAtkAdd, staticOptions.WeaponAtkCalibrationFactor); AddHiddenNormalStat(normalStats, StatId.MaxWeaponAtk, staticOptions.HiddenWeaponAtkAdd, staticOptions.WeaponAtkCalibrationFactor); } BasicStats.AddRange(normalStats); BasicStats.AddRange(specialStats); }
public static void AddHiddenNormalStat(List <ItemStat> stats, StatAttribute attribute, int value, float calibrationFactor) { ItemStat normalStat = stats.FirstOrDefault(x => x.ItemAttribute == attribute); if (normalStat == null) { return; } int calibratedValue = (int)(value * calibrationFactor); int index = stats.FindIndex(x => x.ItemAttribute == attribute); int biggerValue = Math.Max(value, calibratedValue); int smallerValue = Math.Min(value, calibratedValue); int summedFlat = (int)(normalStat.Flat + Random.Shared.Next(smallerValue, biggerValue)); stats[index] = new SpecialStat(normalStat.ItemAttribute, summedFlat, StatAttributeType.Flat); }
private static Dictionary <StatAttribute, ItemStat> CopyStats(Dictionary <StatAttribute, ItemStat> otherStats) { Dictionary <StatAttribute, ItemStat> stats = new(); foreach ((StatAttribute key, ItemStat value) in otherStats) { if (value is BasicStat) { stats[key] = new BasicStat(value.ItemAttribute, value.Flat + value.Rate, value.AttributeType); } else { stats[key] = new SpecialStat(value.ItemAttribute, value.Flat + value.Rate, value.AttributeType); } } return(stats); }
private static Item GetNextLevelItem(Item item) { Script script = ScriptLoader.GetScript("Functions/calcLimitBreakValues"); DynValue scriptResultRates = script.RunFunction("calcLimitBreakStatRateValues", item.LimitBreakLevel); DynValue scriptResultFlats = script.RunFunction("calcLimitBreakStatFlatValues", item.LimitBreakLevel); Item nextLevelItem = new(item) { Uid = 0 }; if (nextLevelItem.LimitBreakLevel == 0) { nextLevelItem.EnchantLevel = 0; nextLevelItem.Stats.LimitBreakEnchants = nextLevelItem.Stats.Enchants; nextLevelItem.Stats.Enchants = new(); } for (int i = 0; i < scriptResultRates.Tuple.Length; i += 2) { if (scriptResultRates.Tuple[i].Number == 0) { continue; } StatAttribute attribute = (StatAttribute)scriptResultRates.Tuple[i].Number; float boostRate = (float)scriptResultRates.Tuple[i + 1].Number; if (!nextLevelItem.Stats.LimitBreakEnchants.ContainsKey(attribute)) { if (boostRate == 0) { continue; } ItemStat stat = new BasicStat(attribute, boostRate, StatAttributeType.Rate); if (attribute > (StatAttribute)11000) { stat = new SpecialStat(attribute, boostRate, StatAttributeType.Rate); } stat.ItemAttribute = attribute; nextLevelItem.Stats.LimitBreakEnchants[attribute] = stat; continue; } nextLevelItem.Stats.LimitBreakEnchants[attribute].Rate += boostRate; } for (int i = 0; i < scriptResultFlats.Tuple.Length; i += 2) { if (scriptResultFlats.Tuple[i].Number == 0) { continue; } StatAttribute attribute = (StatAttribute)scriptResultFlats.Tuple[i].Number; int boostValue = (int)scriptResultFlats.Tuple[i + 1].Number; if (!nextLevelItem.Stats.LimitBreakEnchants.ContainsKey(attribute)) { ItemStat stat = new BasicStat(attribute, boostValue, StatAttributeType.Flat); if (attribute > (StatAttribute)11000) { stat = new SpecialStat(attribute, boostValue, StatAttributeType.Flat); } stat.ItemAttribute = attribute; nextLevelItem.Stats.LimitBreakEnchants[attribute] = stat; continue; } nextLevelItem.Stats.LimitBreakEnchants[attribute].Flat += boostValue; } nextLevelItem.LimitBreakLevel++; return(nextLevelItem); } }
private static void WriteSpecialStat(PacketWriter pWriter, SpecialStat stat) { pWriter.WriteShort(stat.WriteAttribute()); pWriter.WriteFloat(stat.Rate); pWriter.WriteFloat(stat.Flat); }
public override void Execute(GameCommandTrigger trigger) { string equipSlot = trigger.Get <string>("equipSlot"); string newAttributeId = trigger.Get <string>("newAttributeId"); float value = trigger.Get <float>("value"); byte isPercentage = trigger.Get <byte>("isPercentage"); byte category = trigger.Get <byte>("category"); if (string.IsNullOrEmpty(equipSlot)) { trigger.Session.SendNotice($"Type '/info {Aliases.First()}' for more details."); return; } if (!Enum.TryParse(equipSlot, ignoreCase: true, out ItemSlot itemSlot) || itemSlot == ItemSlot.NONE) { trigger.Session.SendNotice($"{equipSlot} is not a valid equip slot."); string slots = ""; foreach (object slot in Enum.GetValues(typeof(ItemSlot))) { slots += $"{slot} - {((ItemSlot) slot).GetEnumDescription()}, "; } trigger.Session.SendNotice($"Available slots: {slots.TrimEnd(',', ' ')}"); return; } if (!Enum.TryParse(newAttributeId, ignoreCase: true, out StatAttribute newAttribute)) { trigger.Session.SendNotice($"{newAttributeId} is not a valid attribute. Check StatAttribute.cs"); return; } Player player = trigger.Session.Player; if (!player.Inventory.Equips.TryGetValue(itemSlot, out Item item)) { trigger.Session.SendNotice($"You don't have an item in slot {itemSlot}."); return; } ItemStat itemStat; StatAttributeType attributeType = isPercentage == 1 ? StatAttributeType.Rate : StatAttributeType.Flat; if ((int)newAttribute > 11000) { itemStat = new SpecialStat(newAttribute, value, attributeType); } else { itemStat = new BasicStat(newAttribute, value, attributeType); } if (category == 0) { if (value == 0) { item.Stats.Constants.Remove(newAttribute); } else { item.Stats.Constants[newAttribute] = itemStat; } } else if (category == 1) { if (value == 0) { item.Stats.Statics.Remove(newAttribute); } else { item.Stats.Statics[newAttribute] = itemStat; } } else if (category == 2) { if (value == 0) { item.Stats.Randoms.Remove(newAttribute); } else { item.Stats.Randoms[newAttribute] = itemStat; } } trigger.Session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(player.FieldPlayer, item, itemSlot)); player.FieldPlayer.ComputeStats(); DatabaseManager.Items.Update(item); }