From 476aa486f51efc5cdd15b679c316f07e6d2b71eb Mon Sep 17 00:00:00 2001 From: Arsenii Fomin Date: Sat, 24 Feb 2024 11:23:13 +0700 Subject: [PATCH 1/2] Implemented DistanceLoot loottables config to be used for chests loot adjustments --- EpicLoot/EpicLoot.cs | 4 +-- EpicLoot/LootConfig.cs | 9 +++++++ EpicLoot/LootRoller.cs | 54 +++++++++++++++++++++++++++++++------- EpicLoot/Terminal_Patch.cs | 3 ++- EpicLoot/loottables.json | 10 +++++++ 5 files changed, 68 insertions(+), 12 deletions(-) diff --git a/EpicLoot/EpicLoot.cs b/EpicLoot/EpicLoot.cs index 884bdd427..5487ea01d 100644 --- a/EpicLoot/EpicLoot.cs +++ b/EpicLoot/EpicLoot.cs @@ -1483,7 +1483,7 @@ private static void WriteLootTableDrops(StringBuilder t, LootTable lootTable) for (var i = 0; i < limit; i++) { var level = i + 1; - var dropTable = LootRoller.GetDropsForLevel(lootTable, level, false); + var dropTable = LootRoller.GetDropsForLevelOrDistance(lootTable, level, 0, false); if (dropTable == null || dropTable.Count == 0) { continue; @@ -1513,7 +1513,7 @@ private static void WriteLootTableItems(StringBuilder t, LootTable lootTable) for (var i = 0; i < limit; i++) { var level = i + 1; - var lootList = LootRoller.GetLootForLevel(lootTable, level, false); + var lootList = LootRoller.GetLootForLevelOrDistance(lootTable, level, 0, false); if (ArrayUtils.IsNullOrEmpty(lootList)) { continue; diff --git a/EpicLoot/LootConfig.cs b/EpicLoot/LootConfig.cs index 9dd956e9c..74ed0fe6c 100644 --- a/EpicLoot/LootConfig.cs +++ b/EpicLoot/LootConfig.cs @@ -19,6 +19,14 @@ public class LeveledLootDef public LootDrop[] Loot; } + [Serializable] + public class DistanceLootDef + { + public int Distance; + public float[][] Drops; + public LootDrop[] Loot; + } + [Serializable] public class LootTable { @@ -31,6 +39,7 @@ public class LootTable public LootDrop[] Loot2; public LootDrop[] Loot3; public List LeveledLoot = new List(); + public List DistanceLoot = new List(); } [Serializable] diff --git a/EpicLoot/LootRoller.cs b/EpicLoot/LootRoller.cs index a36f64a53..9583cc573 100644 --- a/EpicLoot/LootRoller.cs +++ b/EpicLoot/LootRoller.cs @@ -199,7 +199,9 @@ private static List RollLootTableInternal(LootTable lootTable, int l var luckFactor = GetLuckFactor(dropPoint); - var drops = GetDropsForLevel(lootTable, level); + int distanceFromWorldCenter = (int)new Vector3(dropPoint.x, 0, dropPoint.z).magnitude; + + var drops = GetDropsForLevelOrDistance(lootTable, level, distanceFromWorldCenter); if (drops.Count == 0) { return results; @@ -233,7 +235,7 @@ private static List RollLootTableInternal(LootTable lootTable, int l return results; } - var loot = GetLootForLevel(lootTable, level); + var loot = GetLootForLevelOrDistance(lootTable, level, distanceFromWorldCenter); if (loot == null) loot = new LootDrop[] { }; @@ -440,7 +442,7 @@ private static bool IsLootTableRefence(string lootDropItem, out LootDrop[] lootL var lootTable = LootTables[objectName].FirstOrDefault(); if (lootTable != null) { - lootList = GetLootForLevel(lootTable, level); + lootList = GetLootForLevelOrDistance(lootTable, level, 0); return true; } @@ -689,7 +691,7 @@ public static List GetLootTable(string objectName) return results; } - public static List> GetDropsForLevel([NotNull] LootTable lootTable, int level, bool useNextHighestIfNotPresent = true) + public static List> GetDropsForLevelOrDistance([NotNull] LootTable lootTable, int level, int distance, bool useNextHighestIfNotPresent = true) { if (level == 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Drops3)) { @@ -718,6 +720,23 @@ public static List> GetDropsForLevel([NotNull] LootTabl return ToDropList(lootTable.Drops); } + if(lootTable.DistanceLoot.Count > 0) + { + var drops = lootTable.Drops; + + int maxDistanceUsed = -1; + foreach (var distanceLoot in lootTable.DistanceLoot) + { + if(distance >= distanceLoot.Distance && distanceLoot.Distance > maxDistanceUsed) + { + drops = distanceLoot.Drops; + maxDistanceUsed = distanceLoot.Distance; + } + } + + return ToDropList(lootTable.Drops); + } + for (var lvl = level; lvl >= 1; --lvl) { var found = lootTable.LeveledLoot.Find(x => x.Level == lvl); @@ -741,7 +760,7 @@ private static List> ToDropList(float[][] drops) return drops.Select(x => new KeyValuePair((int) x[0], x[1])).ToList(); } - public static LootDrop[] GetLootForLevel([NotNull] LootTable lootTable, int level, bool useNextHighestIfNotPresent = true) + public static LootDrop[] GetLootForLevelOrDistance([NotNull] LootTable lootTable, int level, int distance, bool useNextHighestIfNotPresent = true) { if (level == 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Loot3)) { @@ -770,6 +789,23 @@ public static LootDrop[] GetLootForLevel([NotNull] LootTable lootTable, int leve return lootTable.Loot.ToArray(); } + if (lootTable.DistanceLoot.Count > 0) + { + var loot = lootTable.Loot; + + int maxDistanceUsed = -1; + foreach (var distanceLoot in lootTable.DistanceLoot) + { + if (distance >= distanceLoot.Distance && distanceLoot.Distance > maxDistanceUsed) + { + loot = distanceLoot.Loot; + maxDistanceUsed = distanceLoot.Distance; + } + } + + return loot.ToArray(); + } + for (var lvl = level; lvl >= 1; --lvl) { var found = lootTable.LeveledLoot.Find(x => x.Level == lvl); @@ -912,7 +948,7 @@ public static float GetSkewedLuckFactor(float luckFactor, float skewFactor) public static void PrintLuckTest(string lootTableName, float luckFactor) { var lootTable = GetLootTable(lootTableName)[0]; - var lootDrop = GetLootForLevel(lootTable, 1)[0]; + var lootDrop = GetLootForLevelOrDistance(lootTable, 1, 0)[0]; lootDrop = ResolveLootDrop(lootDrop); var rarityBase = GetRarityWeights(lootDrop.Rarity, 0); var rarityLuck = GetRarityWeights(lootDrop.Rarity, luckFactor); @@ -945,12 +981,12 @@ public static void PrintLuckTest(string lootTableName, float luckFactor) Debug.LogWarning(sb.ToString()); } - public static void PrintLootResolutionTest(string lootTableName, int level, int itemIndex) + public static void PrintLootResolutionTest(string lootTableName, int level, int distance, int itemIndex) { - Debug.LogWarning($"{lootTableName}:{level}:{itemIndex}"); + Debug.LogWarning($"{lootTableName}:{level}:{distance}:{itemIndex}"); var lootTable = GetLootTable(lootTableName)[0]; - var lootDrop = GetLootForLevel(lootTable, level)[itemIndex]; + var lootDrop = GetLootForLevelOrDistance(lootTable, level, distance)[itemIndex]; lootDrop = ResolveLootDrop(lootDrop); var rarity = lootDrop.Rarity; diff --git a/EpicLoot/Terminal_Patch.cs b/EpicLoot/Terminal_Patch.cs index f2720211e..4688c1c61 100644 --- a/EpicLoot/Terminal_Patch.cs +++ b/EpicLoot/Terminal_Patch.cs @@ -186,7 +186,8 @@ public static void Postfix() var lootTable = args.Length > 1 ? args[1] : "Greydwarf"; var level = args.Length > 2 ? int.Parse(args[2]) : 1; var itemIndex = args.Length > 3 ? int.Parse(args[3]) : 0; - LootRoller.PrintLootResolutionTest(lootTable, level, itemIndex); + var distance = args.Length > 4 ? int.Parse(args[4]) : 0; + LootRoller.PrintLootResolutionTest(lootTable, level, distance, itemIndex); })); new Terminal.ConsoleCommand("resetcooldowns", "", (args => { diff --git a/EpicLoot/loottables.json b/EpicLoot/loottables.json index 71a60f7ac..327cfba75 100644 --- a/EpicLoot/loottables.json +++ b/EpicLoot/loottables.json @@ -1456,6 +1456,16 @@ "Loot": [ { "Item": "Tier0Everything", "Weight": 4, "Rarity": [ 97, 2, 1, 0] }, { "Item": "Tier1Everything", "Weight": 1, "Rarity": [ 97, 2, 1, 0] } + ], + "DistanceLoot": [ + { + "Distance": 4000, + "Drops": [ [0, 40], [1, 38], [2, 20], [3, 2] ], + "Loot": [ + { "Item": "Tier0Everything", "Weight": 4, "Rarity": [ 97, 2, 1, 0] }, + { "Item": "Tier1Everything", "Weight": 1, "Rarity": [ 97, 2, 1, 0] } + ] + } ] }, //TreasureChest_blackforest From b73430d78e3fd23fb8ebff0f4c67777554505dee Mon Sep 17 00:00:00 2001 From: Arsenii Fomin Date: Sat, 24 Feb 2024 14:23:45 +0700 Subject: [PATCH 2/2] Hotfix --- EpicLoot/LootRoller.cs | 68 +++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/EpicLoot/LootRoller.cs b/EpicLoot/LootRoller.cs index 9583cc573..2ae6e6782 100644 --- a/EpicLoot/LootRoller.cs +++ b/EpicLoot/LootRoller.cs @@ -693,6 +693,23 @@ public static List GetLootTable(string objectName) public static List> GetDropsForLevelOrDistance([NotNull] LootTable lootTable, int level, int distance, bool useNextHighestIfNotPresent = true) { + if (lootTable.DistanceLoot.Count > 0) + { + var drops = lootTable.Drops; + + int maxDistanceUsed = -1; + foreach (var distanceLoot in lootTable.DistanceLoot) + { + if (distance >= distanceLoot.Distance && distanceLoot.Distance > maxDistanceUsed) + { + drops = distanceLoot.Drops; + maxDistanceUsed = distanceLoot.Distance; + } + } + + return ToDropList(drops); + } + if (level == 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Drops3)) { if (lootTable.LeveledLoot.Any(x => x.Level == level)) @@ -720,23 +737,6 @@ public static List> GetDropsForLevelOrDistance([NotNull return ToDropList(lootTable.Drops); } - if(lootTable.DistanceLoot.Count > 0) - { - var drops = lootTable.Drops; - - int maxDistanceUsed = -1; - foreach (var distanceLoot in lootTable.DistanceLoot) - { - if(distance >= distanceLoot.Distance && distanceLoot.Distance > maxDistanceUsed) - { - drops = distanceLoot.Drops; - maxDistanceUsed = distanceLoot.Distance; - } - } - - return ToDropList(lootTable.Drops); - } - for (var lvl = level; lvl >= 1; --lvl) { var found = lootTable.LeveledLoot.Find(x => x.Level == lvl); @@ -762,6 +762,23 @@ private static List> ToDropList(float[][] drops) public static LootDrop[] GetLootForLevelOrDistance([NotNull] LootTable lootTable, int level, int distance, bool useNextHighestIfNotPresent = true) { + if (lootTable.DistanceLoot.Count > 0) + { + var loot = lootTable.Loot; + + int maxDistanceUsed = -1; + foreach (var distanceLoot in lootTable.DistanceLoot) + { + if (distance >= distanceLoot.Distance && distanceLoot.Distance > maxDistanceUsed) + { + loot = distanceLoot.Loot; + maxDistanceUsed = distanceLoot.Distance; + } + } + + return loot.ToArray(); + } + if (level == 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Loot3)) { if (lootTable.LeveledLoot.Any(x => x.Level == level)) @@ -789,23 +806,6 @@ public static LootDrop[] GetLootForLevelOrDistance([NotNull] LootTable lootTable return lootTable.Loot.ToArray(); } - if (lootTable.DistanceLoot.Count > 0) - { - var loot = lootTable.Loot; - - int maxDistanceUsed = -1; - foreach (var distanceLoot in lootTable.DistanceLoot) - { - if (distance >= distanceLoot.Distance && distanceLoot.Distance > maxDistanceUsed) - { - loot = distanceLoot.Loot; - maxDistanceUsed = distanceLoot.Distance; - } - } - - return loot.ToArray(); - } - for (var lvl = level; lvl >= 1; --lvl) { var found = lootTable.LeveledLoot.Find(x => x.Level == lvl);