Skip to content
This repository has been archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
fix: update positional drawing.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Jun 2, 2023
1 parent fa01bbc commit e8822f3
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 52 deletions.
110 changes: 64 additions & 46 deletions RotationSolver/UI/PainterManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,73 @@ namespace RotationSolver.UI;

internal static class PainterManager
{
class PositionalDrawing : Drawing3DPoly
{
Drawing3DCircularSectorFO _noneCir, _flankCir, _rearCir;

public EnemyPositional Positional { get; set; }

public GameObject Target { get; set; }

public PositionalDrawing()
{
var right = ImGui.ColorConvertFloat4ToU32(new Vector4(1, 1, 1, 0.15f));
var wrong = ImGui.ColorConvertFloat4ToU32(new Vector4(0.3f, 0.8f, 0.2f, 0.15f));

_noneCir = new Drawing3DCircularSectorFO(null, 3, wrong, 2);

_flankCir = new Drawing3DCircularSectorFO(null, 3, wrong, 2, XIVPainter.Enum.RadiusInclude.IncludeBoth,
new Vector2(MathF.PI * 0.25f, MathF.PI / 2), new Vector2(MathF.PI * 1.25f, MathF.PI / 2));
_rearCir = new Drawing3DCircularSectorFO(null, 3, wrong, 2, XIVPainter.Enum.RadiusInclude.IncludeBoth,
new Vector2(MathF.PI * 0.75f, MathF.PI / 2));

_noneCir.InsideColor = _flankCir.InsideColor = _rearCir.InsideColor = right;

SubItems = new IDrawing3D[] { _noneCir, _flankCir, _rearCir };
}

public override void UpdateOnFrame(XIVPainter.XIVPainter painter)
{
var pos = Positional;
if (!Target.HasPositional() || Player.Available && Player.Object.HasStatus(true, CustomRotation.TrueNorth.StatusProvide))
{
pos = EnemyPositional.None;
}
switch (pos)
{
case EnemyPositional.Flank:
_flankCir.Target = Target;
_rearCir.Target = null;
_noneCir.Target = null;
break;

case EnemyPositional.Rear:
_flankCir.Target = null;
_rearCir.Target = Target;
_noneCir.Target = null;
break;

default:
_flankCir.Target = null;
_rearCir.Target = null;
_noneCir.Target = Target;
break;
}
base.UpdateOnFrame(painter);
}
}

static XIVPainter.XIVPainter _painter;
static Drawing3DCircularSectorFO _noneCir, _flankCir, _rearCir;
static PositionalDrawing _positional;
static Drawing3DAnnulusFO _annulus;

public static void Init()
{
_painter = Svc.PluginInterface.Create<XIVPainter.XIVPainter>("RotationSolverOverlay");
_painter.UseTaskForAccelerate = false;

var right = ImGui.ColorConvertFloat4ToU32(new Vector4(1, 1, 1, 0.15f));
var wrong = ImGui.ColorConvertFloat4ToU32(new Vector4(0.3f, 0.8f, 0.2f, 0.15f));

_noneCir = new Drawing3DCircularSectorFO(null, 3, wrong, 2);

_flankCir = new Drawing3DCircularSectorFO(null, 3, wrong, 2, XIVPainter.Enum.RadiusInclude.IncludeBoth,
new Vector2( MathF.PI * 0.25f, MathF.PI / 2), new Vector2(MathF.PI * 1.25f, MathF.PI / 2));
_rearCir = new Drawing3DCircularSectorFO(null, 3, wrong, 2, XIVPainter.Enum.RadiusInclude.IncludeBoth,
new Vector2(MathF.PI * 0.75f, MathF.PI / 2));

_noneCir.InsideColor = _flankCir.InsideColor = _rearCir.InsideColor = right;

_annulus = new Drawing3DAnnulusFO(null, 3, 3 + Service.Config.MeleeRangeOffset, right, 2);
_annulus = new Drawing3DAnnulusFO(null, 3, 3 + Service.Config.MeleeRangeOffset,
ImGui.ColorConvertFloat4ToU32(new Vector4(1f, 0.5f, 0.4f, 0.15f)), 2);
_annulus.InsideColor = ImGui.ColorConvertFloat4ToU32(new Vector4(0.8f, 0.3f, 0.2f, 0.15f));

_annulus.UpdateEveryFrame = () =>
Expand All @@ -43,16 +88,9 @@ public static void Init()
}
};

_painter.AddDrawings(_noneCir, _flankCir, _rearCir, _annulus);
_positional = new PositionalDrawing();

if (Player.Available)
{
_painter.AddDrawings(new Drawing3DCircularSectorF(Player.Object.Position, 5, right, 2)
{
DeadTime = DateTime.Now.AddSeconds(5),
InsideColor = wrong,
});
}
_painter.AddDrawings(_positional, _annulus);
}

public static void UpdateOffset(GameObject target)
Expand All @@ -62,33 +100,13 @@ public static void UpdateOffset(GameObject target)

public static void UpdatePositional(EnemyPositional positional, GameObject target)
{
switch(positional)
{
case EnemyPositional.Flank:
_flankCir.Target = target;
_rearCir.Target = null;
_noneCir.Target = null;
break;

case EnemyPositional.Rear:
_flankCir.Target = null;
_rearCir.Target = target;
_noneCir.Target = null;
break;

default:
_flankCir.Target = null;
_rearCir.Target = null;
_noneCir.Target = target;
break;
}
_positional.Target = target;
_positional.Positional = positional;
}

public static void ClearPositional()
{
_flankCir.Target = null;
_rearCir.Target = null;
_noneCir.Target = null;
_positional.Target = null;
}

public static void Dispose()
Expand Down
9 changes: 4 additions & 5 deletions RotationSolver/Updaters/ActionUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,20 @@ internal static void UpdateNextAction()
{
NextGCDAction = GcdAction;

var pos = !GcdAction.Target.HasPositional() || localPlayer.HasStatus(true, CustomRotation.TrueNorth.StatusProvide) ?
EnemyPositional.None : GcdAction.EnemyPositional;

var rightJobAndTarget = (Player.Object.IsJobCategory(JobRole.Tank) || Player.Object.IsJobCategory(JobRole.Melee)) && GcdAction.Target.IsNPCEnemy();

if (Service.Config.DrawPositional && rightJobAndTarget && GcdAction.IsSingleTarget)
{
PainterManager.UpdatePositional(pos, GcdAction.Target);
PainterManager.UpdatePositional(GcdAction.EnemyPositional, GcdAction.Target);
}
else
{
PainterManager.ClearPositional();
}

if (pos != EnemyPositional.None)
if (GcdAction.EnemyPositional != EnemyPositional.None
&& GcdAction.Target.HasPositional()
&& !localPlayer.HasStatus(true, CustomRotation.TrueNorth.StatusProvide))
{

if (CheckAction(GcdAction.ID))
Expand Down
2 changes: 1 addition & 1 deletion XIVPainter

0 comments on commit e8822f3

Please sign in to comment.