Greetings,
after some attempts I made it work modifying the default COE Bufflist Plugin. However, there is one issue I can't figure out now:
- The best solution would be, that the strongest elemental bonus is always the rightmost one; I have no quick idea how to determine how many shifts need to be done in the PaintInfoList. Fortunately, the current strongest element for Wiz is the last one, so it works fine for me. A generic solution would be nice for that. Here you can find the updates Versions for PlayerBuffs and ProtraitBuffs. Enjoy!
../plugins/User/COEBuffListPlugin.cs (personal BuffPainter on top of your char)
Code:
using System.Collections.Generic;
using System.Linq;
using System;
using Turbo.Plugins.Default;
namespace Turbo.Plugins.User
{
public class COEBuffListPlugin : BasePlugin, IInGameTopPainter
{
public bool HideWhenUiIsHidden { get; set; }
public BuffPainter BuffPainter { get; set; }
private BuffRuleCalculator _ruleCalculator;
private float IconSize = 0.7f;
private float YPositionOffset = 0.18f;
public COEBuffListPlugin()
{
Enabled = true;
}
public override void Load(IController hud)
{
base.Load(hud);
HideWhenUiIsHidden = false;
BuffPainter = new BuffPainter(Hud, true)
{
Opacity = 0.7f,
TimeLeftFont = Hud.Render.CreateFont("tahoma", 8, 255, 255, 255, 255, true, false, 255, 0, 0, 0, true),
};
_ruleCalculator = new BuffRuleCalculator(Hud);
_ruleCalculator.SizeMultiplier = IconSize;
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 1, MinimumIconCount = 0, DisableName = true }); // Arcane
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 2, MinimumIconCount = 0, DisableName = true }); // Cold
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 3, MinimumIconCount = 0, DisableName = true }); // Fire
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 4, MinimumIconCount = 0, DisableName = true }); // Holy
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 5, MinimumIconCount = 0, DisableName = true }); // Lightning
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 6, MinimumIconCount = 0, DisableName = true }); // Physical
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 7, MinimumIconCount = 0, DisableName = true }); // Poison
}
private IEnumerable<BuffRule> GetCurrentRules(HeroClass heroClass)
{
for (int i = 1; i <= 7; i++)
{
switch (heroClass)
{
case HeroClass.Barbarian: if (i == 1 || i == 4 || i == 7) continue; break; //2356
case HeroClass.Crusader: if (i == 1 || i == 2 || i == 7) continue; break; //3456
case HeroClass.DemonHunter: if (i == 1 || i == 4 || i == 7) continue; break; //2356
case HeroClass.Monk: if (i == 1 || i == 7) continue; break; //23456
case HeroClass.WitchDoctor: if (i == 1 || i == 4 || i == 5) continue; break; //2367
case HeroClass.Wizard: if (i == 4 || i == 6 || i == 7) continue; break; //1235
case HeroClass.Necromancer: if (i == 1 || i == 3 || i == 4 || i == 5) continue; break; //267
}
yield return _ruleCalculator.Rules[i - 1];
}
}
public void PaintTopInGame(ClipState clipState)
{
if (clipState != ClipState.BeforeClip) return;
if (HideWhenUiIsHidden && Hud.Render.UiHidden) return;
foreach (var player in Hud.Game.Players)
{
if (player.IsMe)
{
var buff = player.Powers.GetBuff(430674);
if ((buff == null) || (buff.IconCounts[0] <= 0)) break;
var classSpecificRules = GetCurrentRules(player.HeroClassDefinition.HeroClass);
_ruleCalculator.CalculatePaintInfo(player, classSpecificRules);
if (_ruleCalculator.PaintInfoList.Count == 0) return;
var highestElementalBonus = player.Offense.HighestElementalDamageBonus;
for (int orderIndex = 0; orderIndex < _ruleCalculator.PaintInfoList.Count; orderIndex++)
{
var info = _ruleCalculator.PaintInfoList[orderIndex];
var best = false;
switch (info.Rule.IconIndex)
{
case 1: best = player.Offense.BonusToArcane == highestElementalBonus; break;
case 2: best = player.Offense.BonusToCold == highestElementalBonus; break;
case 3: best = player.Offense.BonusToFire == highestElementalBonus; break;
case 4: best = player.Offense.BonusToHoly == highestElementalBonus; break;
case 5: best = player.Offense.BonusToLightning == highestElementalBonus; break;
case 6: best = player.Offense.BonusToPhysical == highestElementalBonus; break;
case 7: best = player.Offense.BonusToPoison == highestElementalBonus; break;
}
if (best) info.Size *= 1.00f;
}
var y = Hud.Window.Size.Height * 0.5f - Hud.Window.Size.Height * YPositionOffset;
BuffPainter.PaintHorizontalCenter(_ruleCalculator.PaintInfoList, 0, y, Hud.Window.Size.Width, _ruleCalculator.StandardIconSize, 0);
break;
}
} // end foreach
} // end PaintTopInGame
} // end class
}
../plugins/Default/BuffLists/ConventionOfElementsBuffListPlugin.cs (portrait BuffPainter for all players in party)
Code:
using System.Collections.Generic;
using System.Linq;
namespace Turbo.Plugins.Default
{
public class ConventionOfElementsBuffListPlugin : BasePlugin, IInGameTopPainter
{
public bool HideWhenUiIsHidden { get; set; }
public BuffPainter BuffPainter { get; set; }
private BuffRuleCalculator _ruleCalculator;
public ConventionOfElementsBuffListPlugin()
{
Enabled = true;
}
public override void Load(IController hud)
{
base.Load(hud);
HideWhenUiIsHidden = false;
BuffPainter = new BuffPainter(Hud, true)
{
Opacity = 1.0f,
TimeLeftFont = Hud.Render.CreateFont("tahoma", 8, 255, 255, 255, 255, true, false, 255, 0, 0, 0, true),
};
_ruleCalculator = new BuffRuleCalculator(Hud);
_ruleCalculator.SizeMultiplier = 0.55f;
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 1, MinimumIconCount = 0, DisableName = true }); // Arcane
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 2, MinimumIconCount = 0, DisableName = true }); // Cold
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 3, MinimumIconCount = 0, DisableName = true }); // Fire
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 4, MinimumIconCount = 0, DisableName = true }); // Holy
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 5, MinimumIconCount = 0, DisableName = true }); // Lightning
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 6, MinimumIconCount = 0, DisableName = true }); // Physical
_ruleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 7, MinimumIconCount = 0, DisableName = true }); // Poison
}
private IEnumerable<BuffRule> GetCurrentRules(HeroClass heroClass)
{
for (int i = 1; i <= 7; i++)
{
switch (heroClass)
{
case HeroClass.Barbarian: if (i == 1 || i == 4 || i == 7) continue; break;
case HeroClass.Crusader: if (i == 1 || i == 2 || i == 7) continue; break;
case HeroClass.DemonHunter: if (i == 1 || i == 4 || i == 7) continue; break;
case HeroClass.Monk: if (i == 1 || i == 7) continue; break;
case HeroClass.Necromancer: if (i == 1 || i == 3 || i == 4 || i == 5) continue; break;
case HeroClass.WitchDoctor: if (i == 1 || i == 4 || i == 5) continue; break;
case HeroClass.Wizard: if (i == 4 || i == 6 || i == 7) continue; break;
}
yield return _ruleCalculator.Rules[i - 1];
}
}
public void PaintTopInGame(ClipState clipState)
{
if (clipState != ClipState.BeforeClip) return;
if (HideWhenUiIsHidden && Hud.Render.UiHidden) return;
foreach (var player in Hud.Game.Players)
{
if (player.ActorId == 0) continue;
var buff = player.Powers.GetBuff(430674);
if ((buff == null) || (buff.IconCounts[0] <= 0)) continue;
var classSpecificRules = GetCurrentRules(player.HeroClassDefinition.HeroClass);
_ruleCalculator.CalculatePaintInfo(player, classSpecificRules);
if (_ruleCalculator.PaintInfoList.Count == 0) return;
if (!_ruleCalculator.PaintInfoList.Any(info => info.TimeLeft > 0)) return;
var highestElementalBonus = player.Offense.HighestElementalDamageBonus;
for (int orderIndex = 0; orderIndex < _ruleCalculator.PaintInfoList.Count; orderIndex++)
{
var info = _ruleCalculator.PaintInfoList[orderIndex];
var best = false;
switch (info.Rule.IconIndex)
{
case 1: best = player.Offense.BonusToArcane == highestElementalBonus; break;
case 2: best = player.Offense.BonusToCold == highestElementalBonus; break;
case 3: best = player.Offense.BonusToFire == highestElementalBonus; break;
case 4: best = player.Offense.BonusToHoly == highestElementalBonus; break;
case 5: best = player.Offense.BonusToLightning == highestElementalBonus; break;
case 6: best = player.Offense.BonusToPhysical == highestElementalBonus; break;
case 7: best = player.Offense.BonusToPoison == highestElementalBonus; break;
}
if (best) info.Size *= 1.35f;
}
var portraitRect = player.PortraitUiElement.Rectangle;
var x = portraitRect.Right;
var y = portraitRect.Top + portraitRect.Height * 0.51f;
BuffPainter.PaintHorizontal(_ruleCalculator.PaintInfoList, x, y, _ruleCalculator.StandardIconSize, 0);
}
}
}
}
All the best. See you ingame!
- MLPFUN