// Update is called once per frame void Update() { if (life <= 0) { GameObject lt_gameObject = GameObject.FindGameObjectWithTag("Loot"); LootTables lt = lt_gameObject.GetComponent <LootTables>(); GameObject go; go = lt.looting(nombre); if (go != null) { if (go.GetComponent <Item>() != null) { go.GetComponent <Item>().tienda = false; } Instantiate(go, transform.position, Quaternion.identity); } int n = Random.Range(0, 99); if (n < 25) { go = lt.looting(nombre); if (go.GetComponent <Item>() != null) { go.GetComponent <Item>().tienda = false; } if (go != null) { Instantiate(go, transform.position, Quaternion.identity); } } Destroy(gameObject); } }
internal static void DisableQueuedGadgets() { Logger.Log("Unloading Gadgets..."); foreach (GadgetInfo gadget in QueuedGadgets) { gadget.Gadget.Unload(); LootTables.RemoveModEntries(gadget.Gadget.ModID); GadgetCoreAPI.RemoveModResources(gadget.Gadget.ModID); GadgetCoreAPI.UnregisterStatModifiers(gadget.Gadget.ModID); GadgetNetwork.UnregisterSyncVars(gadget.Gadget.ModID); PlanetRegistry.UnregisterGadget(gadget.Gadget.ModID); foreach (Registry reg in GameRegistry.ListAllRegistries()) { reg.UnregisterGadget(gadget); } } Logger.Log("Done unloading Gadgets."); Logger.Log("Unpatching Gadgets..."); foreach (GadgetInfo gadget in QueuedGadgets.ToList()) { try { gadget.Gadget.HarmonyInstance.UnpatchAll(gadget.Mod.Name + "." + gadget.Attribute.Name + ".gadget"); } catch (Exception e) { Logger.LogError("Exception Unpatching Gadget '" + gadget.Attribute.Name + "':" + Environment.NewLine + e.ToString()); } } Logger.Log("Done patching Gadgets."); Logger.Log("Sorting Gadgets..."); Gadgets.SortGadgets(); Logger.Log("Done sorting Gadgets."); QueuedGadgets.Clear(); }
void OnEnable() { if (EditorPrefs.HasKey("LootTablePath")) { string objectPath = EditorPrefs.GetString("LootTablePath"); lootTables = AssetDatabase.LoadAssetAtPath(objectPath, typeof(LootTables)) as LootTables; } }
/// <summary> /// Generates items in the given item collection based on loot table key. /// Any existing items will be destroyed. /// </summary> public static void GenerateDungeonItems(ItemCollection collection, int dungeonIndex) { DaggerfallUnityItem[] newitems = LootTables.GenerateDungeonLootItems(dungeonIndex); FormulaHelper.ModifyFoundLootItems(ref newitems); collection.Import(newitems); }
/// <summary> /// Generates items in the given item collection based on loot table key. /// Any existing items will be destroyed. /// </summary> public static void GenerateItems(string LootTableKey, ItemCollection collection) { LootChanceMatrix matrix = LootTables.GetMatrix(LootTableKey); DaggerfallUnityItem[] newitems = LootTables.GenerateRandomLoot(LootTableKey, matrix, GameManager.Instance.PlayerEntity); collection.Import(newitems); }
/// <summary> /// Regenerates items in this container based on loot table key. /// Existing items will be destroyed. /// </summary> public void GenerateItems() { LootChanceMatrix matrix = LootTables.GetMatrix(LootTableKey); DaggerfallUnityItem[] newitems = LootTables.GenerateRandomLoot(LootTableKey, matrix, GameManager.Instance.PlayerEntity); items.Import(newitems); }
public static LootTables Create() { LootTables asset = ScriptableObject.CreateInstance <LootTables> (); asset.lootTables = new List <LootTable> (); AssetDatabase.CreateAsset(asset, "Assets/LootTables.asset"); AssetDatabase.SaveAssets(); return(asset); }
void CreateNewLootTables() { lootTableViewIndex = 1; lootTables = CreateLootTables.Create(); if (lootTables) { string relPath = AssetDatabase.GetAssetPath(lootTables); EditorPrefs.SetString("LootTablePath", relPath); } }
/// <summary> /// Generates items in the given item collection based on loot table key. /// Any existing items will be destroyed. /// </summary> public static void GenerateItems(string LootTableKey, ItemCollection collection) { LootChanceMatrix matrix = LootTables.GetMatrix(LootTableKey); DaggerfallUnityItem[] newitems = LootTables.GenerateRandomLoot(matrix, GameManager.Instance.PlayerEntity); DaggerfallUnityItem[] modifieditems = FormulaHelper.ModifyFoundLootItems(ref newitems); collection.Import(modifieditems); }
private static void MutateSocietyArmor(WorldObject wo, TreasureDeath profile, bool isMagical) { int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } if (wo.GemCode != null) { wo.GemCount = GemCountChance.Roll(wo.GemCode.Value, profile.Tier); } else { wo.GemCount = ThreadSafeRandom.Next(1, 6); } wo.GemType = RollGemType(profile.Tier); int workmanship = GetWorkmanship(profile.Tier); wo.ItemWorkmanship = workmanship; double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; // wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data if (isMagical) { // looks like society armor always had impen on it AssignMagic(wo, profile, true); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } wo = AssignArmorLevel(wo, profile.Tier, LootTables.ArmorType.SocietyArmor); wo.LongDesc = GetLongDesc(wo); // try mutate burden, if MutateFilter exists if (wo.HasMutateFilter(MutateFilter.EncumbranceVal)) { MutateBurden(wo, profile, false); } }
private static void MutateJewelry(WorldObject wo, TreasureDeath profile, bool isMagical) { wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship; wo.LongDesc = wo.Name; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int workmanship = GetWorkmanship(profile.Tier); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo.ItemWorkmanship = workmanship; wo.ItemSkillLevelLimit = null; if (profile.Tier > 6) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data var wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.WieldDifficulty = wield; } if (isMagical) { wo = AssignMagic(wo, profile); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; wo.ManaRate = null; } RandomizeColor(wo); }
static public LootTables ExtractLootTables(string root) { var lootTables = new LootTables(); // Chests foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/chests", "*.json")) { dynamic chest = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }); chest.Name = Path.GetFileNameWithoutExtension(file); lootTables.Chests.Add(chest); } // Entities foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/entities", "*.json")) { var entity = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }); entity.Name = Path.GetFileNameWithoutExtension(file); lootTables.Entities.Add(entity); } // Equipment foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/equipment", "*.json")) { var equipment = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }); equipment.Name = Path.GetFileNameWithoutExtension(file); lootTables.Equipment.Add(equipment); } // Fishing lootTables.Gameplay.FishingJson = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(root + "/loot_tables/gameplay/fishing.json"), new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }); foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/gameplay/Fishing", "*.json")) { var fishing = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }); fishing.Name = Path.GetFileNameWithoutExtension(file); lootTables.Gameplay.Fishing.Add(fishing); } return(lootTables); }
public static void Postfix(ChestScript __instance) { if (__instance.isGold) { LootTables.DropLoot("chest:gold", __instance.transform.position, 0.2f); } else { LootTables.DropLoot("chest:basic", __instance.transform.position, 0.2f); } }
private static void MutateDinnerware_ItemValue(WorldObject wo) { var materialMod = LootTables.getMaterialValueModifier(wo); var gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var baseValue = ThreadSafeRandom.Next(300, 600); var workmanship = wo.ItemWorkmanship ?? 1; wo.Value = (int)(baseValue * gemMaterialMod * materialMod * workmanship); }
public override void Save(JsonValue root) { base.Save(root); var drops = new JsonArray(); foreach (var d in Drops) { drops.Add(LootTables.WriteDrop(d)); } root["drops"] = drops; }
void OpenLootTables() { string absPath = EditorUtility.OpenFilePanel("Select LootTables SO", "", ""); if (absPath.StartsWith(Application.dataPath)) { string relPath = absPath.Substring(Application.dataPath.Length - "Assets".Length); lootTables = AssetDatabase.LoadAssetAtPath(relPath, typeof(LootTables)) as LootTables; if (lootTables) { EditorPrefs.SetString("LootTablePath", relPath); } } }
public override void Load(JsonValue root) { base.Load(root); if (root["drops"].IsJsonArray) { var drops = root["drops"].AsJsonArray; Drops = new Drop[drops.Count]; for (var i = 0; i < Drops.Length; i++) { Drops[i] = LootTables.ParseDrop(drops[i]); } } }
public static void RenderDebug(JsonValue root) { root.InputFloat("Chance", "chance"); if (!root["drops"].IsJsonArray) { root["drops"] = new JsonArray(); } var drops = root["drops"].AsJsonArray; var toRemove = -1; for (var i = 0; i < drops.Count; i++) { if (LootTables.RenderDrop(drops[i]) && ImGui.Button("Remove drop")) { toRemove = i; } } if (toRemove > -1) { drops.Remove(toRemove); } if (DropNames == null) { DropNames = new string[DropRegistry.Defined.Count]; var i = 0; foreach (var v in DropRegistry.Defined.Values) { DropNames[i++] = v.Id; } } ImGui.Separator(); ImGui.Combo("##tp", ref CurrentDrop, DropNames, DropNames.Length); ImGui.SameLine(); if (ImGui.Button("Add drop")) { drops.Add(new JsonObject { ["type"] = DropNames[CurrentDrop] }); } }
/// <summary> /// Generates items in the given item collection based on loot table key. /// Any existing items will be destroyed. /// </summary> public static void GenerateEnemyItems(ItemCollection collection, int[] traits, EnemyEntity enemyEnt) { DaggerfallEntity enemy = enemyEnt as DaggerfallEntity; int[] enemyPredefLootTableProperties; int[] enemyExtraLootProperties; enemyPredefLootTableProperties = EnemyBasics.EnemyPredefLootTableCalculator(enemy, traits); enemyExtraLootProperties = EnemyBasics.EnemyExtraLootCalculator(enemy, traits, enemyPredefLootTableProperties); EnemyBasics.TraitExtraLootModCalculator(traits, enemyPredefLootTableProperties, enemyExtraLootProperties, out enemyPredefLootTableProperties, out enemyExtraLootProperties); DaggerfallUnityItem[] newitems = LootTables.GenerateEnemyLoot(enemy, traits, enemyPredefLootTableProperties, enemyExtraLootProperties); FormulaHelper.ModifyFoundLootItems(ref newitems); collection.Import(newitems); }
/// <summary> /// Generates items in the given item collection based on loot table key. /// Any existing items will be destroyed. /// </summary> public static void GenerateBuildingItems(ItemCollection collection, int[] traits, EnemyEntity enemyEnt = null) { DaggerfallEntity enemy = enemyEnt as DaggerfallEntity; // This may not work as i'm expecting, will have to see. int[] enemyPredefLootTableProperties; int[] enemyExtraLootProperties; enemyPredefLootTableProperties = EnemyBasics.EnemyPredefLootTableCalculator(enemy, traits); enemyExtraLootProperties = EnemyBasics.EnemyExtraLootCalculator(enemy, traits, enemyPredefLootTableProperties); EnemyBasics.TraitExtraLootModCalculator(traits, enemyPredefLootTableProperties, enemyExtraLootProperties, out enemyPredefLootTableProperties, out enemyExtraLootProperties); // Now will start actually creating the items based on enemyPredefLootTableProperties and enemyExtraLootProperties, after that is done, likely add the "flavor" items from the traits afterward. DaggerfallUnityItem[] newitems = LootTables.GenerateEnemyLoot(enemy, traits, enemyPredefLootTableProperties, enemyExtraLootProperties); FormulaHelper.ModifyFoundLootItems(ref newitems); collection.Import(newitems); }
// Use this for initialization void Start() { table = GameObject.Find("Controller").GetComponent <LootTables> (); player = GameObject.Find("Player").GetComponent <Player> (); int i = Random.Range(0, 100); if (name.Contains("Wbox")) { //int result = table.Weapons [tier] [i]; w = ItemTemplates.GetWeaponOfTier(tier); Damage = w.Damage; } else if (name.Contains("Abox")) { //int result = table.Armour [tier] [i]; a = ItemTemplates.GetArmourOfTier(tier); Damage = (int)a.Resistances [0]; } }
private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "Hero") { GameObject lt_gameObject = GameObject.FindGameObjectWithTag("Loot"); LootTables lt = lt_gameObject.GetComponent <LootTables>(); go = lt.looting("Chest"); go.GetComponent <Item>().tienda = false; player = GameObject.FindGameObjectWithTag("Hero"); PlayerItems pi = player.GetComponent <PlayerItems>(); if (pi.llaves >= 1) { pi.llaves--; pi.UILlaves.text = "x " + pi.llaves.ToString("00"); Instantiate(go, transform.position, Quaternion.identity); Destroy(this.gameObject); } } }
private Inventory GetLoot(Area arena, int level) { long score = Modifiers.CurrentScore; Inventory loot = new Inventory(); LootTables <string> lt = new LootTables <string>(arena.loot, Program.rng); for (; score > 0; score -= 100) { if (Program.Chance(score)) { Item item; if (Program.Chance(10)) { item = Item.CreateRune(1); } else if (arena.ValidTable(arena.loot)) { item = Item.LoadItem(lt.GetItem(out _).Trim()); item.Scale(level); } else { item = Item.RandomGear(level * 5, true); } loot.Add(item, 1, -1); if (Program.Chance(20)) { loot.Add(Item.CreateRepairKit(1), 1, -1); } } } return(loot); }
private static WorldObject CreateArmor(TreasureDeath profile, bool isMagical, bool isArmor, LootBias lootBias = LootBias.UnBiased, bool mutate = true) { var minType = LootTables.ArmorType.Helms; LootTables.ArmorType maxType; switch (profile.Tier) { case 1: default: maxType = LootTables.ArmorType.ChainmailArmor; break; case 2: maxType = LootTables.ArmorType.DiforsaArmor; break; case 3: case 4: maxType = LootTables.ArmorType.CovenantArmor; break; case 5: maxType = LootTables.ArmorType.AlduressaArmor; break; case 6: maxType = LootTables.ArmorType.HaebreanArmor; break; case 7: case 8: maxType = LootTables.ArmorType.OlthoiAlduressaArmor; break; } // Added for making clothing drops their own drop, and not involved in armor roll chance LootTables.ArmorType armorType; if (isArmor) { armorType = (LootTables.ArmorType)ThreadSafeRandom.Next((int)minType, (int)maxType); } else { armorType = LootTables.ArmorType.MiscClothing; } int[] table = LootTables.GetLootTable(armorType); int rng = ThreadSafeRandom.Next(0, table.Length - 1); int armorWeenie = table[rng]; WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie); if (wo != null && mutate) { MutateArmor(wo, profile, isMagical, armorType); } return(wo); }
private static void MutateArmor(WorldObject wo, TreasureDeath profile, bool isMagical, LootTables.ArmorType armorType) { wo.LongDesc = wo.Name; //wo.AppraisalItemSkill = 7; //wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int workmanship = GetWorkmanship(profile.Tier); wo.ItemWorkmanship = workmanship; double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (profile.Tier > 6 && armorType != LootTables.ArmorType.CovenantArmor) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.WieldDifficulty = wield; } if (armorType == LootTables.ArmorType.CovenantArmor) { int chance = ThreadSafeRandom.Next(1, 3); var wieldSkill = chance switch { 1 => Skill.MagicDefense, 2 => Skill.MissileDefense, _ => Skill.MeleeDefense, }; wield = GetCovenantWieldReq(profile.Tier, wieldSkill); wo.WieldRequirements = WieldRequirement.RawSkill; wo.WieldSkillType = (int)wieldSkill; wo.WieldDifficulty = wield; // used by tinkering requirements for copper/silver wo.ItemSkillLimit = (uint)wieldSkill; } // Setting random color wo.PaletteTemplate = ThreadSafeRandom.Next(1, 2047); wo.Shade = .1 * ThreadSafeRandom.Next(0, 9); wo = AssignArmorLevel(wo, profile.Tier, armorType); wo = AssignEquipmentSetId(wo, profile); if (isMagical) { bool covenantArmor = false || (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor); wo = AssignMagic(wo, profile, covenantArmor); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } // try mutate burden, if MutateFilter exists if (wo.HasMutateFilter(MutateFilter.EncumbranceVal)) { MutateBurden(wo, profile.Tier, false); } RandomizeColor(wo); }
/// <summary> /// Add interior flats. /// </summary> private void AddFlats(PlayerGPS.DiscoveredBuilding buildingData) { GameObject node = new GameObject("Interior Flats"); node.transform.parent = this.transform; // Add block flats markers.Clear(); foreach (DFBlock.RmbBlockFlatObjectRecord obj in recordData.Interior.BlockFlatObjectRecords) { // Calculate position Vector3 billboardPosition = new Vector3(obj.XPos, -obj.YPos, obj.ZPos) * MeshReader.GlobalScale; // Import custom 3d gameobject instead of flat if (MeshReplacement.ImportCustomFlatGameobject(obj.TextureArchive, obj.TextureRecord, billboardPosition, node.transform) != null) { continue; } // Spawn billboard gameobject GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(obj.TextureArchive, obj.TextureRecord, node.transform); // Set position DaggerfallBillboard dfBillboard = go.GetComponent <DaggerfallBillboard>(); go.transform.position = billboardPosition; go.transform.position += new Vector3(0, dfBillboard.Summary.Size.y / 2, 0); // Add editor markers to list if (obj.TextureArchive == TextureReader.EditorFlatsTextureArchive) { InteriorEditorMarker marker = new InteriorEditorMarker(); marker.type = (InteriorMarkerTypes)obj.TextureRecord; marker.gameObject = go; markers.Add(marker); // Add loot containers for treasure markers (always use pile of clothes icon) if (marker.type == InteriorMarkerTypes.Treasure) { // Create unique LoadID for save system, using 9 lsb and the sign bit from each coord pos int ulong loadID = ((ulong)buildingData.buildingKey) << 30 | (uint)(obj.XPos << 1 & posMask) << 20 | (uint)(obj.YPos << 1 & posMask) << 10 | (uint)(obj.ZPos << 1 & posMask); DaggerfallLoot loot = GameObjectHelper.CreateLootContainer( LootContainerTypes.RandomTreasure, InventoryContainerImages.Chest, billboardPosition, node.transform, DaggerfallLootDataTables.clothingArchive, 0, loadID); if (!LootTables.GenerateLoot(loot, (int)GameManager.Instance.PlayerGPS.CurrentLocationType)) { DaggerfallUnity.LogMessage(string.Format("DaggerfallInterior: Location type {0} is out of range or unknown.", GameManager.Instance.PlayerGPS.CurrentLocationType), true); } } } // Add point lights if (obj.TextureArchive == TextureReader.LightsTextureArchive) { AddLight(obj, go.transform); } } }
public static void Postfix(Destroyer __instance) { LootTables.DropLoot("entity:" + (__instance.wormDisassemble != null ? __instance.wormDisassemble.transform : __instance.transform).GetHighestParent().name.Split('(')[0], __instance.transform.position); }
public static void Postfix(ScarabScript __instance) { LootTables.DropLoot("entity:" + __instance.name.Split(' ', '(')[0], __instance.transform.position); }
private static WorldObject CreateArmor(int tier, bool isMagical, LootBias lootBias = LootBias.UnBiased) { int lowSpellTier = 0; int highSpellTier = 0; int equipSetId = 0; int materialType = 0; int armorPiece = 0; int armorType = 0; int armorWeenie = 0; switch (tier) { case 1: lowSpellTier = 1; highSpellTier = 3; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.ChainmailArmor); break; case 2: lowSpellTier = 3; highSpellTier = 5; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.DiforsaArmor); break; case 3: lowSpellTier = 4; highSpellTier = 6; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.CovenantArmor); break; case 4: lowSpellTier = 5; highSpellTier = 6; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.CovenantArmor); break; case 5: lowSpellTier = 5; highSpellTier = 7; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.AlduressaArmor); break; case 6: lowSpellTier = 6; highSpellTier = 7; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.HaebreanArmor); break; case 7: lowSpellTier = 6; highSpellTier = 8; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.OlthoiAlduressaArmor); break; default: lowSpellTier = 7; highSpellTier = 8; if (lootBias == LootBias.Armor) // Armor Mana Forge Chests don't include clothing type items { armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.Helms, (int)LootTables.ArmorType.OlthoiAlduressaArmor); } else { armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.OlthoiAlduressaArmor); } break; } switch (armorType) { case (int)LootTables.ArmorType.MiscClothing: armorPiece = ThreadSafeRandom.Next(0, 47); armorWeenie = LootTables.MiscClothing[armorPiece]; break; case (int)LootTables.ArmorType.Helms: armorPiece = ThreadSafeRandom.Next(0, 8); armorWeenie = LootTables.Helms[armorPiece]; break; case (int)LootTables.ArmorType.Shields: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.Shields[armorPiece]; break; case (int)LootTables.ArmorType.LeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 15); armorWeenie = LootTables.LeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.StuddedLeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 14); armorWeenie = LootTables.StuddedLeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.ChainmailArmor: armorPiece = ThreadSafeRandom.Next(0, 12); armorWeenie = LootTables.ChainmailArmor[armorPiece]; break; case (int)LootTables.ArmorType.PlatemailArmor: armorPiece = ThreadSafeRandom.Next(0, 10); armorWeenie = LootTables.PlatemailArmor[armorPiece]; break; case (int)LootTables.ArmorType.ScalemailArmor: armorPiece = ThreadSafeRandom.Next(0, 13); armorWeenie = LootTables.ScalemailArmor[armorPiece]; break; case (int)LootTables.ArmorType.YoroiArmor: armorPiece = ThreadSafeRandom.Next(0, 7); armorWeenie = LootTables.YoroiArmor[armorPiece]; break; case (int)LootTables.ArmorType.DiforsaArmor: armorPiece = ThreadSafeRandom.Next(0, 12); armorWeenie = LootTables.DiforsaArmor[armorPiece]; break; case (int)LootTables.ArmorType.CeldonArmor: armorPiece = ThreadSafeRandom.Next(0, 3); armorWeenie = LootTables.CeldonArmor[armorPiece]; break; case (int)LootTables.ArmorType.AmuliArmor: armorPiece = ThreadSafeRandom.Next(0, 1); armorWeenie = LootTables.AmuliArmor[armorPiece]; break; case (int)LootTables.ArmorType.KoujiaArmor: armorPiece = ThreadSafeRandom.Next(0, 2); armorWeenie = LootTables.KoujiaArmor[armorPiece]; break; case (int)LootTables.ArmorType.TenassaArmor: armorPiece = ThreadSafeRandom.Next(0, 2); armorWeenie = LootTables.TenassaArmor[armorPiece]; break; case (int)LootTables.ArmorType.CovenantArmor: armorPiece = ThreadSafeRandom.Next(0, 9); armorWeenie = LootTables.CovenantArmor[armorPiece]; break; case (int)LootTables.ArmorType.LoricaArmor: armorPiece = ThreadSafeRandom.Next(0, 5); armorWeenie = LootTables.LoricaArmor[armorPiece]; break; case (int)LootTables.ArmorType.NariyidArmor: armorPiece = ThreadSafeRandom.Next(0, 6); armorWeenie = LootTables.NariyidArmor[armorPiece]; break; case (int)LootTables.ArmorType.ChiranArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.ChiranArmor[armorPiece]; break; case (int)LootTables.ArmorType.AlduressaArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.AlduressaArmor[armorPiece]; break; case (int)LootTables.ArmorType.KnorrAcademyArmor: armorPiece = ThreadSafeRandom.Next(0, 7); armorWeenie = LootTables.KnorrAcademyArmor[armorPiece]; break; case (int)LootTables.ArmorType.SedgemailLeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 5); armorWeenie = LootTables.SedgemailLeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.HaebreanArmor: armorPiece = ThreadSafeRandom.Next(0, 8); armorWeenie = LootTables.HaebreanArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiArmor: armorPiece = ThreadSafeRandom.Next(0, 9); armorWeenie = LootTables.OlthoiArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiAmuliArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiAmuliArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiCeldonArmor: armorPiece = ThreadSafeRandom.Next(0, 6); armorWeenie = LootTables.OlthoiCeldonArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiKoujiaArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiKoujiaArmor[armorPiece]; break; default: // Olthoi Alduressa armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiAlduressaArmor[armorPiece]; break; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.AppraisalItemSkill, 7); wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (tier > 6 && armorType != (int)LootTables.ArmorType.CovenantArmor) { wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (armorType == (int)LootTables.ArmorType.CovenantArmor) { Skill wieldSkill; int chance = ThreadSafeRandom.Next(1, 3); switch (chance) { case 1: // Magic Def wieldSkill = Skill.MagicDefense; break; case 2: // Missile Def wieldSkill = Skill.MissileDefense; break; default: // Melee Def wieldSkill = Skill.MeleeDefense; break; } wield = GetCovenantWieldReq(tier, wieldSkill); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkill); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } // Setting random color wo.SetProperty(PropertyInt.PaletteTemplate, ThreadSafeRandom.Next(1, 2047)); double shade = .1 * ThreadSafeRandom.Next(0, 9); wo.SetProperty(PropertyFloat.Shade, shade); var baseArmorLevel = wo.GetProperty(PropertyInt.ArmorLevel) ?? 0; if (baseArmorLevel > 0) { int adjustedArmorLevel = baseArmorLevel + GetArmorLevelModifier(tier, armorType); wo.SetProperty(PropertyInt.ArmorLevel, adjustedArmorLevel); } wo.SetProperty(PropertyInt.EquipmentSetId, equipSetId); if (isMagical) { wo.SetProperty(PropertyInt.UiEffects, (int)UiEffects.Magical); int numSpells = GetNumSpells(tier); int spellcraft = GetSpellcraft(numSpells, tier); wo.SetProperty(PropertyInt.ItemSpellcraft, spellcraft); wo.SetProperty(PropertyInt.ItemDifficulty, GetDifficulty(tier, spellcraft)); int maxMana = GetMaxMana(numSpells, tier); wo.SetProperty(PropertyInt.ItemMaxMana, maxMana); wo.SetProperty(PropertyInt.ItemCurMana, maxMana); int[][] spells; int[][] cantrips; spells = LootTables.ArmorSpells; cantrips = LootTables.ArmorCantrips; int[] shuffledValues = new int[spells.Length]; for (int i = 0; i < spells.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int minorCantrips = GetNumMinorCantrips(tier); int majorCantrips = GetNumMajorCantrips(tier); int epicCantrips = GetNumEpicCantrips(tier); int legendaryCantrips = GetNumLegendaryCantrips(tier); int numCantrips = minorCantrips + majorCantrips + epicCantrips + legendaryCantrips; if (numSpells - numCantrips > 0) { for (int a = 0; a < numSpells - numCantrips; a++) { int col = ThreadSafeRandom.Next(lowSpellTier - 1, highSpellTier - 1); int spellID = spells[shuffledValues[a]][col]; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } if (numCantrips > 0) { shuffledValues = new int[cantrips.Length]; for (int i = 0; i < cantrips.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int shuffledPlace = 0; //minor cantripps for (int a = 0; a < minorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][0]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //major cantrips for (int a = 0; a < majorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][1]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } // epic cantrips for (int a = 0; a < epicCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][2]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //legendary cantrips for (int a = 0; a < legendaryCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][3]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
private static void MutateMeleeWeapon(WorldObject wo, TreasureDeath profile, bool isMagical, int weaponType, int subtype) { Skill wieldSkillType = Skill.None; int damage = 0; double damageVariance = 0; double weaponDefense = 0; double weaponOffense = 0; // Properties for weapons double magicD = GetMagicMissileDMod(profile.Tier); double missileD = GetMagicMissileDMod(profile.Tier); int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); int workmanship = GetWorkmanship(profile.Tier); int wieldDiff = GetWieldDifficulty(profile.Tier, WieldType.MeleeWeapon); WieldRequirement wieldRequirments = WieldRequirement.RawSkill; // Weapon Types // 0 = Heavy // 1 = Light // 2 = Finesse // default = Two Handed switch (weaponType) { case 0: // Heavy Weapons wieldSkillType = Skill.HeavyWeapons; switch (subtype) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); if (subtype == 3) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); } if (subtype == 4 || subtype == 5) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 10: case 11: case 12: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (subtype == 20) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 1: // Light Weapons; wieldSkillType = Skill.LightWeapons; switch (subtype) { case 0: case 1: case 2: case 3: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); break; case 6: case 7: case 8: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 9: case 10: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 11: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 12: case 13: case 14: case 15: case 16: case 17: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (subtype == 14) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 18: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 2: // Finesse Weapons; wieldSkillType = Skill.FinesseWeapons; switch (subtype) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (subtype == 3 || subtype == 4) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: case 10: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); if (subtype == 9) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Jitte); } break; case 11: case 12: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (subtype == 15) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; default: // Two handed wieldSkillType = Skill.TwoHandedCombat; damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Cleaving); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); switch (subtype) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); break; case 3: case 4: case 5: case 6: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); break; case 7: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); break; case 8: case 9: case 10: default: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spears); break; } break; } // Description wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship | AppraisalLongDescDecorations.AppendGemInfo; wo.LongDesc = wo.Name; // GemTypes, Material, Workmanship wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.ItemWorkmanship = workmanship; // Burden MutateBurden(wo, profile.Tier, true); // Weapon Stats wo.Damage = damage; wo.DamageVariance = damageVariance; wo.WeaponDefense = weaponDefense; wo.WeaponOffense = weaponOffense; wo.WeaponMissileDefense = missileD; wo.WeaponMagicDefense = magicD; // Adding Wield Reqs if required if (wieldDiff > 0) { wo.WieldDifficulty = wieldDiff; wo.WieldRequirements = wieldRequirments; wo.WieldSkillType = (int)wieldSkillType; } else { // If no wield, remove wield reqs wo.WieldDifficulty = null; wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; } // Adding Magic Spells if (isMagical) { wo = AssignMagic(wo, profile); } else { // If no spells remove magic properites wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; RandomizeColor(wo); }