I use this build here exactly the same.
DMO Solor GR Build
The only area I'm lacking is Crit % mainly because I've had poor luck with jewelry. Every other item is optimized. I run full ancient gear and 7 pieces augmented with lvl 70+ gems. Paragon is currently at 920.
I list a wide time range because really the variance is high. I've gotten as fast as 7min and sometimes right down to the wire. It really depends on the map layout you get. The bots combat logic isn't good enough to deal with narrow lane maze style maps like sewers or the one with skeleton bones all over. You spend a lot of time running around. In order to do higher GR's you need to set the min Cluster value to higher than 9. Remember time is your enemy on anything GR 70. You can't waste your time fighting white mob clusters of 6 or less. It's really about finding a balance with the combat logic and variance of maps you may get. Normally I set mine to 9, anything higher I notice the bot gets stuck in choke points like stairs because it's found a cluster at a distance and it's trying to get to it but there are like 3 mobs blocking it and it just stands there trying to go through it. Can't run illusionary boots because you need other items in that slot or cube.
I would list my trinity settings but I think it's not going to help. It really takes trial and error and unless you have the exact items I do I can't say for sure you'll get the same results. It took me about 80 GR's to get to where I wanted my bot to be.
I made some slight modifications to the code to deal with some problems I was having below:
To deal with progression globes not being picked up.
Location: Trinity\Cache\Weighting.cs
Code:
#region Progression Globe
case TrinityObjectType.ProgressionGlobe:
{
//Ignore because we are blocked by objects or mobs.
if (IsNavBlocked(cacheObject))
{
cacheObject.WeightInfo += string.Format("Ignoring {0} - Nav Blocked.",
cacheObject.InternalName);
break;
}
//Ignore because we are TownPortaling
if (TownRun.IsTryingToTownPortal())
{
cacheObject.WeightInfo += string.Format("Ignoring {0} - Town Portal.",
cacheObject.InternalName);
break;
}
if (!Settings.Combat.Misc.CollectHealthGlobe)
{
cacheObject.WeightInfo +=
string.Format("Ignoring {0} - Collect Health Globe Setting.",
cacheObject.InternalName);
}
if (cacheObject.Distance <= [COLOR="#FF0000"][B]150f[/B][/COLOR])
{
cacheObject.WeightInfo += string.Format("Maxxing {0} - Progression Globe.",
cacheObject.InternalName);
cacheObject.Weight += MaxWeight;
break;
}
Spectral Blade being out of range. This isn't a legit fix, I just shortened the distance a little more to make sure orbs hit more often, still not 100%.
Location: Trinity\Combat\Abilities\WizardCombat.cs
Code:
// Spectral Blade
if (CanCast(SNOPower.Wizard_SpectralBlade))
{
[COLOR="#FF0000"][B]//[/B][/COLOR]var bladeRange = Runes.Wizard.ArcaneOrbit.IsActive ? 4f : 15f;
return new TrinityPower(SNOPower.Wizard_SpectralBlade, [COLOR="#FF0000"][B]2f[/B][/COLOR], CurrentTarget.ACDGuid);
}
I couldn't figure out teleport with safe passage yet, so I switched to calamtiy. What I noticed was when teleport is on cooldown the bot would tele and hop to the next biggest cluster. While in theory this makes sense you end up bouncing between cluster points a lot. It's best to just stay in a specific cluster and let enemies come to you. The only application where this doesn't make sense is if the cluster is more range mobs than melee. I essentially made the bot teleport forward a bit then rotate.
Code:
// Offensive Teleport: Calamity
if (CanCast(SNOPower.Wizard_Teleport, CanCastFlags.NoTimer) && Runes.Wizard.Calamity.IsActive &&
(!Legendary.AetherWalker.IsEquipped || Player.PrimaryResource > 40))
{
var bestClusterPoint = TargetUtil.GetBestClusterPoint(5f, 10f);
// Teleporting exactly on top of targets prevents them from taking damage
var slightlyForwardPosition = MathEx.GetPointAt(bestClusterPoint, 4f, Player.Rotation);
return new TrinityPower(SNOPower.Wizard_Teleport, [COLOR="#FF0000"][B]5f, Player.Rotation[/B][/COLOR]);
}
Slow time was being cast too all over the place for my preference. It didn't allow for good clustering. I changed values to limit the search range so essentially slow time is cast more on top of current fighting area.
Location: Trinity\Combat\Abilities\WizardCombat.cs
Code:
// Slow Time for in combat
if (!Player.IsIncapacitated && Skills.Wizard.SlowTime.CanCast(CanCastFlags.NoTimer) && TargetUtil.AnyMobsInRange(60))
{
var bubbles = SpellHistory.History.Where(s => s.Power.SNOPower == SNOPower.Wizard_SlowTime && s.TimeSinceUse.TotalSeconds < 12).ToList();
var bubblePositions = new HashSet<Vector3>(bubbles.Select(b => b.TargetPosition));
var clusterPosition = TargetUtil.GetBestClusterPoint();
// Function to check if bubble is already in (or close enough to) a position
Func<Vector3, bool> IsValidBubblePosition = pos => !bubblePositions.Any(b => b.Distance2D(pos) <= 14f);
var isBubbleAtPlayerValid = IsValidBubblePosition(Player.Position);
TrinityPower bubblePower = null;
// Always bubble ourselves when cooldown Rune is active.
if (Runes.Wizard.Exhaustion.IsActive && isBubbleAtPlayerValid)
{
var slightlyForwardPosition = MathEx.GetPointAt(Player.Position, [COLOR="#FF0000"][B]3f[/B][/COLOR], Player.Rotation);
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, slightlyForwardPosition);
}
// Defensive Bubble is Priority
else if (Enemies.Nearby.UnitCount >= 8 && (Runes.Wizard.PointOfNoReturn.IsActive || Runes.Wizard.StretchTime.IsActive) && isBubbleAtPlayerValid)
{
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, Player.Position);
}
// Then casting on elites
else if (CurrentTarget.IsBossOrEliteRareUnique && CurrentTarget.Distance < 57f && IsValidBubblePosition(CurrentTarget.Position))
{
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, CurrentTarget.Position);
}
// Then big clusters
else if (TargetUtil.ClusterExists([COLOR="#FF0000"][B]40f[/B][/COLOR], 5) && clusterPosition.Distance2D(Player.Position) < 57f && IsValidBubblePosition(clusterPosition))
{
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, clusterPosition);
}
// Cooldown isnt an issue with Magnum Opus, so just cast it somewhere.
else if (Sets.DelseresMagnumOpus.IsEquipped)
{
if (Enemies.BestLargeCluster.Exists && Enemies.BestLargeCluster.Position.Distance2D(Player.Position) < 57f && IsValidBubblePosition(Enemies.BestLargeCluster.Position))
{
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, Enemies.BestLargeCluster.Position);
}
else if (TargetUtil.AnyMobsInRange([COLOR="#FF0000"][B]30[/B][/COLOR]) && IsValidBubblePosition(Enemies.BestCluster.Position))
{
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, Enemies.BestCluster.Position);
}
else if (isBubbleAtPlayerValid)
{
bubblePower = new TrinityPower(SNOPower.Wizard_SlowTime, 0f, Player.Position);
}
}
if (bubblePower != null)
{
return bubblePower;
}
}
I haven't had the time to study the bot code to rewrite the slow time routine altogether but it definitely needs to be redone, no offense to the person who wrote it but the logic is counter intuitive to the way the build should be played.