From 5646e2fd524df9eb8123d944bdef3ccdad8776ae Mon Sep 17 00:00:00 2001 From: Ben Carter Date: Thu, 11 Jul 2024 23:49:02 -0400 Subject: [PATCH] This is the bonus enchantments added randomly to weapon drops on harder difficulties --- modules/items/bonus-enchantment.ts | 205 +++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 modules/items/bonus-enchantment.ts diff --git a/modules/items/bonus-enchantment.ts b/modules/items/bonus-enchantment.ts new file mode 100644 index 0000000..8de6dd6 --- /dev/null +++ b/modules/items/bonus-enchantment.ts @@ -0,0 +1,205 @@ + +import { ItemDetails } from "../classes/itemdetails"; +const SCALED_ITEMS_START = 20000000; + +function randomInteger(min: number, max: number) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function getEnchant(stat: string, min: number, max: number) { + + const sql = ` + SELECT ID + FROM acore_world.spellitemenchantment_dbc + WHERE Name_Lang_enUS REGEXP '^\\\\+[0-9]{1,3} ${stat}' + and EffectPointsMax_1 >= ${min} and EffectPointsMax_1 <= ${max} + and RequiredSkillRank = 0 + ORDER BY RAND() LIMIT 1 + `; + + const query = WorldDBQuery(sql); + if(!query) { + PrintError("Query Failed: ", sql ); + return null; + } + + if (query.GetRowCount() === 0) { + PrintError("BonusEnchantment/getEnchantment - No Enchant Found for stat: " + stat); + return null; + } + + return query.GetUInt32(0); +} + + +function rollEnchant(item: Item, highStats: boolean): number[] { + const itemDetails = new ItemDetails(item); + + const tankPrimary =[ + "Dodge Rating", + "Defense Rating", + "Block Rating", + "Block", + "Stamina" + ]; + + const resists = [ + "Fire Resist", + "Frost Resist", + "Nature Resist", + "Shadow Resist", + "Arcane Resist", + ]; + + const meleePrimary = [ + "Attack Power", + "Agility", + "Critical Strike", + "Strength", + "Armor Penetration", + "Hit Rating", + "Haste", + ]; + + const meleeSecondary = [ + "Stamina", + + "Dodge Rating", + "Intellect", + ].concat(meleePrimary, resists); + + const rangePrimary = [ + "Attack Power", + "Range Attack Power", + "Agility", + "Critical Strike", + "Hit Rating", + "Haste", + "Armor Penetration", + ]; + + const rangeSecondary = [ + "Stamina" + ].concat(rangePrimary, resists); + + const casterPrimary = [ + "Spell Power", + "Intellect", + "Critical Strike", + "Haste", + "Hit Rating", + "Spell Penetration", + ]; + + const casterSecondary = [ + "Stamina", + "Spirit", + "Mana every", + ].concat(casterPrimary); + + const tankSecondary = [ + "Strength", + ].concat(tankPrimary, meleePrimary, resists); + + let enchantId: number; + let secEnchantId: number; + let primary: string; + let secondary: string; + const itemCategory = itemDetails.IsArmor() ? itemDetails.GetArmorType() : itemDetails.GetWeaponType(); + + if(!itemCategory) { + PrintError("BonusEnchantment/rollEnchant - Failed to get item category for item: " + item.GetEntry()); + } + + switch(itemCategory) { + + case "Tank": { + primary = tankPrimary[randomInteger(0, tankPrimary.length - 1)]; + secondary = tankSecondary[randomInteger(0, tankSecondary.length - 1)]; + break; + } + case "Melee": { + primary = meleePrimary[randomInteger(0, meleePrimary.length - 1)]; + secondary = meleeSecondary[randomInteger(0, meleeSecondary.length - 1)]; + break; + } + case "Range": { + primary = rangePrimary[randomInteger(0, rangePrimary.length - 1)]; + secondary = rangeSecondary[randomInteger(0, rangeSecondary.length - 1)]; + break; + } + case "Caster": { + primary = casterPrimary[randomInteger(0, casterPrimary.length - 1)]; + secondary = casterSecondary[randomInteger(0, casterSecondary.length - 1)]; + break; + } + default: { + throw new Error("BonusEnchantment/rollEnchant - Invalid Armor Type"); + } + } + + if (highStats) { + enchantId = getEnchant(primary, 30, 150); + + } else { + enchantId = getEnchant(primary, 10, 30); + } + + if(secondary.includes("Resist")) { + if(highStats) { + secEnchantId = getEnchant(secondary, 50, 100); + } else { + secEnchantId = getEnchant(secondary, 34, 44); + } + } else { + secEnchantId = getEnchant(secondary, 5, 45); + } + + return [enchantId, secEnchantId]; +} + +RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LOOT_ITEM, (event, player, item) => { + const itemCls = item.GetClass(); + const subClass = item.GetSubClass(); + + if (item.GetQuality() < 2) { + return; + } + + // if (item.GetEntry() < SCALED_ITEMS_START) { + // return; + // } + + if (itemCls !== 2 && itemCls !== 4) { + return; + } + + const weaponList = [0,1,2,3,4,5,6,7,8,10,13,15,16,17,18,19]; + const armorList = [0,1,2,3,4,6] + + // not a weapon + if ( itemCls === 2 && !weaponList.includes(subClass)) { + return; + } + + // not armor + if ( itemCls === 4 && !armorList.includes(subClass)) { + return; + } + + const ids = rollEnchant(item, true); + + if(ids.length !== 2) { + PrintError("BonusEnchantment/OnLootITem - Failed to get enchant ids"); + return; + } + + if(ids[0]) { + item.SetEnchantment(ids[0], 4); + } + + if(ids[1]) { + item.SetEnchantment(ids[1], 5); + } + +}); \ No newline at end of file