public static void OnCharacterDeath(string characterName, int level, Vector3 dropPoint) { var lootTables = LootRoller.GetLootTable(characterName, level); if (lootTables != null && lootTables.Count > 0) { List <GameObject> loot = LootRoller.RollLootTableAndSpawnObjects(lootTables, characterName, dropPoint); Debug.Log($"Rolling on loot table: {characterName} (lvl {level}), spawned {loot.Count} items at drop point({dropPoint})."); DropItems(loot, dropPoint); foreach (var l in loot) { var itemData = l.GetComponent <ItemDrop>().m_itemData; var magicItem = itemData.GetMagicItem(); if (magicItem != null) { Debug.Log($" - {itemData.m_shared.m_name} <{l.transform.position}>: {string.Join(", ", magicItem.Effects.Select(x => x.EffectType.ToString()))}"); } } } else { Debug.Log($"Could not find loot table for: {characterName} (lvl {level})"); } }
public static void SpawnMagicItemWithEffect(Console __instance, string[] args) { if (args.Length < 3) { EpicLoot.LogError("Specify effect and item name"); return; } if (Player.m_localPlayer == null) { return; } var effectArg = args[1]; var itemPrefabNameArg = args[2]; __instance.AddString($"magicitem - {itemPrefabNameArg} with effect: {effectArg}"); var magicItemEffectDef = MagicItemEffectDefinitions.Get(effectArg); if (magicItemEffectDef == null) { __instance.AddString($"> Could not find effect: {effectArg}"); return; } var itemPrefab = ObjectDB.instance.GetItemPrefab(itemPrefabNameArg); if (itemPrefab == null) { __instance.AddString($"> Could not find item: {itemPrefabNameArg}"); return; } var fromItemData = itemPrefab.GetComponent <ItemDrop>().m_itemData; if (!EpicLoot.CanBeMagicItem(fromItemData)) { __instance.AddString($"> Can't be magic item: {itemPrefabNameArg}"); return; } var effectRequirements = magicItemEffectDef.Requirements; var itemRarity = effectRequirements.AllowedRarities.Count == 0 ? ItemRarity.Legendary : effectRequirements.AllowedRarities.First(); var rarityTable = GetRarityTable(itemRarity.ToString()); var loot = new LootTable { Object = "Console", Drops = new[] { new[] { 1, 1 } }, Loot = new[] { new LootDrop { Item = itemPrefab.name, Rarity = rarityTable } } }; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; // TODO add better hook for desired effect - currently effect will be discarded on next game load // if effect was added when magicItem had maximum of available effect // however still good for debug LootRoller.CheatForceMagicEffect = true; LootRoller.ForcedMagicEffect = effectArg; LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint); LootRoller.CheatForceMagicEffect = false; LootRoller.ForcedMagicEffect = string.Empty; }
public static void MagicItem(Console __instance, string[] args) { var rarityArg = args.Length >= 2 ? args[1] : "random"; var itemArg = args.Length >= 3 ? args[2] : "random"; var count = args.Length >= 4 ? int.Parse(args[3]) : 1; var effectCount = args.Length >= 5 ? int.Parse(args[4]) : -1; __instance.AddString($"magicitem - rarity:{rarityArg}, item:{itemArg}, count:{count}"); var allItemNames = ObjectDB.instance.m_items .Where(x => EpicLoot.CanBeMagicItem(x.GetComponent <ItemDrop>().m_itemData)) .Where(x => x.name != "HelmetDverger" && x.name != "BeltStrength" && x.name != "Wishbone") .Select(x => x.name) .ToList(); if (Player.m_localPlayer == null) { return; } LootRoller.CheatEffectCount = effectCount; for (var i = 0; i < count; i++) { int[] rarityTable = GetRarityTable(rarityArg); var item = itemArg; if (item == "random") { var weightedRandomTable = new WeightedRandomCollection <string>(_random, allItemNames, x => 1); item = weightedRandomTable.Roll(); } if (ObjectDB.instance.GetItemPrefab(item) == null) { __instance.AddString($"> Could not find item: {item}"); break; } __instance.AddString($"> {i + 1} - rarity: [{string.Join(", ", rarityTable)}], item: {item}"); var loot = new LootTable() { Object = "Console", Drops = new[] { new[] { 1, 1 } }, Loot = new[] { new LootDrop() { Item = item, Rarity = rarityTable, Weight = 1 } } }; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint); } LootRoller.CheatEffectCount = -1; }
private static void SpawnLegendaryItemHelper(string legendaryID, string itemType, Terminal context) { if (!UniqueLegendaryHelper.TryGetLegendaryInfo(legendaryID, out var legendaryInfo)) { if (context != null) { context.AddString($"> Could not find info for legendaryID: ({legendaryID})"); } return; } if (string.IsNullOrEmpty(itemType)) { var dummyMagicItem = new MagicItem { Rarity = ItemRarity.Legendary }; var allowedItems = new List <ItemDrop>(); foreach (var itemName in GatedItemTypeHelper.ItemInfoByID.Keys) { var itemPrefab = ObjectDB.instance.GetItemPrefab(itemName); if (itemPrefab == null) { continue; } var itemDrop = itemPrefab.GetComponent <ItemDrop>(); if (itemDrop == null) { continue; } var itemData = itemDrop.m_itemData; if (legendaryInfo.Requirements.CheckRequirements(itemData, dummyMagicItem)) { allowedItems.Add(itemDrop); } } itemType = allowedItems.LastOrDefault()?.name; } if (string.IsNullOrEmpty(itemType)) { itemType = "Club"; } var loot = new LootTable { Object = "Console", Drops = new[] { new float[] { 1, 1 } }, Loot = new[] { new LootDrop { Item = itemType, Rarity = new float[] { 0, 0, 0, 1 } } } }; LootRoller.CheatForceLegendary = legendaryID; var previousDisableGatingState = LootRoller.CheatDisableGating; LootRoller.CheatDisableGating = true; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint); LootRoller.CheatForceLegendary = null; LootRoller.CheatDisableGating = previousDisableGatingState; }
public static void SpawnMagicItemWithEffect(Terminal context, string[] args) { if (args.Length < 3) { EpicLoot.LogError("Specify effect and item name"); return; } if (Player.m_localPlayer == null) { return; } var effectArg = args[1]; var itemPrefabNameArg = args[2]; context.AddString($"magicitem - {itemPrefabNameArg} with effect: {effectArg}"); var magicItemEffectDef = MagicItemEffectDefinitions.Get(effectArg); if (magicItemEffectDef == null) { context.AddString($"> Could not find effect: {effectArg}"); return; } var itemPrefab = ObjectDB.instance.GetItemPrefab(itemPrefabNameArg); if (itemPrefab == null) { context.AddString($"> Could not find item: {itemPrefabNameArg}"); return; } var fromItemData = itemPrefab.GetComponent <ItemDrop>().m_itemData; if (!EpicLoot.CanBeMagicItem(fromItemData)) { context.AddString($"> Can't be magic item: {itemPrefabNameArg}"); return; } var effectRequirements = magicItemEffectDef.Requirements; var itemRarity = effectRequirements.AllowedRarities.Count == 0 ? ItemRarity.Magic : effectRequirements.AllowedRarities.First(); var rarityTable = GetRarityTable(itemRarity.ToString()); var loot = new LootTable { Object = "Console", Drops = new[] { new float[] { 1, 1 } }, Loot = new[] { new LootDrop { Item = itemPrefab.name, Rarity = rarityTable } } }; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; LootRoller.CheatForceMagicEffect = true; LootRoller.ForcedMagicEffect = effectArg; LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint); LootRoller.CheatForceMagicEffect = false; LootRoller.ForcedMagicEffect = string.Empty; }
public static void MagicItem(Console __instance, string[] args) { var rarityArg = args.Length >= 2 ? args[1] : "random"; var itemArg = args.Length >= 3 ? args[2] : "random"; var count = args.Length >= 4 ? int.Parse(args[3]) : 1; __instance.AddString($"magicitem - rarity:{rarityArg}, item:{itemArg}, count:{count}"); var items = new List <GameObject>(); var allItemNames = ObjectDB.instance.m_items .Where(x => EpicLoot.CanBeMagicItem(x.GetComponent <ItemDrop>().m_itemData)) .Select(x => x.name) .ToList(); if (Player.m_localPlayer == null) { return; } for (var i = 0; i < count; i++) { var rarityTable = new[] { 1, 1, 1, 1 }; switch (rarityArg.ToLowerInvariant()) { case "magic": rarityTable = new[] { 1, 0, 0, 0, }; break; case "rare": rarityTable = new[] { 0, 1, 0, 0, }; break; case "epic": rarityTable = new[] { 0, 0, 1, 0, }; break; case "legendary": rarityTable = new[] { 0, 0, 0, 1, }; break; } var item = itemArg; if (item == "random") { var weightedRandomTable = new WeightedRandomCollection <string>(_random, allItemNames, x => 1); item = weightedRandomTable.Roll(); } if (ObjectDB.instance.GetItemPrefab(item) == null) { __instance.AddString($"> Could not find item: {item}"); break; } __instance.AddString($" {i + 1} - rarity: [{string.Join(", ", rarityTable)}], item: {item}"); var loot = new LootTable() { Object = "Console", Drops = new[] { new[] { 1, 1 } }, Loot = new[] { new LootDrop() { Item = item, Rarity = rarityTable } } }; var randomOffset = UnityEngine.Random.insideUnitSphere; var dropPoint = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset; items.AddRange(LootRoller.RollLootTableAndSpawnObjects(loot, loot.Object, dropPoint)); } }