コード例 #1
0
        // Stat/Effect Point parsing based on work done by simc & https://github.com/TrinityCore/SpellWork
        public double?SupplyEffectPoint(int spellID, uint?effectIndex)
        {
            var points = 0.0f;

            using (var query = new SQLiteCommand("SELECT * FROM SpellEffect WHERE SpellID = :id AND EffectIndex = :effectIndex"))
            {
                query.Connection = db;
                query.Parameters.AddWithValue(":id", spellID);
                query.Parameters.AddWithValue(":effectIndex", effectIndex - 1);
                query.ExecuteNonQuery();

                var reader = query.ExecuteReader();
                if (!reader.HasRows)
                {
                    return(points);
                }

                while (reader.Read())
                {
                    var effectPoints    = reader.GetFloat(reader.GetOrdinal("EffectBasePointsF"));
                    var spellAttributes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                    using (var subQuery = new SQLiteCommand("SELECT * FROM SpellMisc WHERE ID = :id"))
                    {
                        subQuery.Connection = db;
                        subQuery.Parameters.AddWithValue(":id", spellID);
                        subQuery.ExecuteNonQuery();

                        var subReader = subQuery.ExecuteReader();
                        if (subReader.HasRows)
                        {
                            while (subReader.Read())
                            {
                                var spellAttrs = new List <int>();
                                for (int i = 0; i < 14; i++)
                                {
                                    spellAttrs.Add(subReader.GetInt32(subReader.GetOrdinal("Attributes_" + i)));
                                }
                                spellAttributes = spellAttrs.ToArray();
                            }
                        }
                    }

                    var coefficient = reader.GetFloat(reader.GetOrdinal("Coefficient"));

                    var scalingClass = reader.GetInt32(reader.GetOrdinal("ScalingClass"));

                    if (coefficient >= 0.0f)
                    {
                        // TODO: Not yet implemented

                        //SpellScaling? ItemLevel based scaling?
                        // TODO ScalingClass -1, -2, -3, -4, -5, -6, -7, -8, -9

                        // -6 - Sta
                        // -7 RandProp ?
                        // -8 RandProp DamageReplaceStatF
                        // -9 RandProp DamageReplaceStatF
                        // ItemLevel based scaling
                        if (itemID == 0)
                        {
                            return(effectPoints);
                        }

                        var itemLevel   = 0;
                        var itemSlot    = 0;
                        var itemQuality = 0;

                        using (var subquery = new SQLiteCommand("SELECT ItemLevel, InventoryType, OverallQualityID FROM ItemSparse WHERE ID = :id"))
                        {
                            subquery.Connection = db;
                            subquery.Parameters.AddWithValue(":id", itemID);
                            subquery.ExecuteNonQuery();

                            var subreader = subquery.ExecuteReader();
                            if (!subreader.HasRows)
                            {
                                return(effectPoints);
                            }

                            while (subreader.Read())
                            {
                                itemLevel   = subreader.GetInt32(subreader.GetOrdinal("ItemLevel"));
                                itemSlot    = subreader.GetInt32(subreader.GetOrdinal("InventoryType"));
                                itemQuality = subreader.GetInt32(subreader.GetOrdinal("OverallQualityID"));
                            }
                        }

                        var multiplier = GetItemMultiplier(itemSlot, itemLevel, build);

                        if (scalingClass == -7)
                        {
                            var(RandomPropField, RandomPropIndex) = TooltipUtils.GetRandomPropertyByInventoryType(itemQuality, itemSlot, 0);

                            using var rpropQuery  = new SQLiteCommand("SELECT " + RandomPropField + "F_0" + " FROM RandPropPoints WHERE ID = :id");
                            rpropQuery.Connection = db;
                            rpropQuery.Parameters.AddWithValue(":id", itemLevel);
                            rpropQuery.ExecuteNonQuery();

                            var   rpropReader = rpropQuery.ExecuteReader();
                            float randProp    = 0.0f;

                            while (rpropReader.Read())
                            {
                                randProp = rpropReader.GetFloat(0);
                            }

                            points = randProp * (float)multiplier;
                        }
                        else if (scalingClass == -8 || scalingClass == -9)
                        {
                            var randomPropField = "DamageReplaceStatF";
                            if (scalingClass == -9)
                            {
                                randomPropField = "DamageSecondaryF";
                            }

                            using var rpropQuery  = new SQLiteCommand("SELECT " + randomPropField + " FROM RandPropPoints WHERE ID = :id");
                            rpropQuery.Connection = db;
                            rpropQuery.Parameters.AddWithValue(":id", itemLevel);
                            rpropQuery.ExecuteNonQuery();

                            var   rpropReader = rpropQuery.ExecuteReader();
                            float randProp    = 0.0f;

                            while (rpropReader.Read())
                            {
                                randProp = rpropReader.GetFloat(0);
                            }

                            points = randProp;
                        }

                        return(points * coefficient);
                    }
                    else
                    {
                        //using (var subQuery = new SQLiteCommand("SELECT * FROM ExpectedStat WHERE Lvl = :id AND ExpansionID = :expansionID"))
                        //{
                        //    subQuery.Connection = db;
                        //    subQuery.Parameters.AddWithValue(":id", level);
                        //    subQuery.Parameters.AddWithValue(":expansionID", this.expansion);
                        //    subQuery.ExecuteNonQuery();

                        //    var subReader = subQuery.ExecuteReader();
                        //    if (subReader.HasRows)
                        //    {
                        //    }
                        //}

                        var expectedStatType =
                            TooltipUtils.GetExpectedStatTypeBySpellEffect(reader.GetInt32(reader.GetOrdinal("Effect")), reader.GetInt16(reader.GetOrdinal("EffectAura")), reader.GetInt32(reader.GetOrdinal("EffectMiscValue_0")));
                        if (expectedStatType != TooltipUtils.ExpectedStatType.None)
                        {
                            if ((spellAttributes[0] & 0x80000) == 0x80000)
                            {
                                expectedStatType = TooltipUtils.ExpectedStatType.CreatureAutoAttackDps;
                            }
                        }

                        return(effectPoints);
                    }
                }
            }

            return(points);
        }