// 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); }