Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions EpicLoot/EpicLoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions EpicLoot/LootConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -31,6 +39,7 @@ public class LootTable
public LootDrop[] Loot2;
public LootDrop[] Loot3;
public List<LeveledLootDef> LeveledLoot = new List<LeveledLootDef>();
public List<DistanceLootDef> DistanceLoot = new List<DistanceLootDef>();
}

[Serializable]
Expand Down
54 changes: 45 additions & 9 deletions EpicLoot/LootRoller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,9 @@ private static List<GameObject> 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;
Expand Down Expand Up @@ -233,7 +235,7 @@ private static List<GameObject> RollLootTableInternal(LootTable lootTable, int l
return results;
}

var loot = GetLootForLevel(lootTable, level);
var loot = GetLootForLevelOrDistance(lootTable, level, distanceFromWorldCenter);

if (loot == null)
loot = new LootDrop[] { };
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -689,8 +691,25 @@ public static List<LootTable> GetLootTable(string objectName)
return results;
}

public static List<KeyValuePair<int, float>> GetDropsForLevel([NotNull] LootTable lootTable, int level, bool useNextHighestIfNotPresent = true)
public static List<KeyValuePair<int, float>> 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))
Expand Down Expand Up @@ -741,8 +760,25 @@ private static List<KeyValuePair<int, float>> ToDropList(float[][] drops)
return drops.Select(x => new KeyValuePair<int, float>((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 (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))
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion EpicLoot/Terminal_Patch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 =>
{
Expand Down
10 changes: 10 additions & 0 deletions EpicLoot/loottables.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down