Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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);
    }
}
Ejemplo n.º 5
0
 private static void WriteSpecialStat(PacketWriter pWriter, SpecialStat stat)
 {
     pWriter.WriteShort(stat.WriteAttribute());
     pWriter.WriteFloat(stat.Rate);
     pWriter.WriteFloat(stat.Flat);
 }
Ejemplo n.º 6
0
    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);
    }