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

Commit

Permalink
fix: update drawing.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Jun 1, 2023
1 parent 16359fe commit 46a2417
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 87 deletions.
1 change: 0 additions & 1 deletion RotationSolver.Basic/Configuration/PluginConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ public class PluginConfiguration : IPluginConfiguration
public bool UseTinctures = false;
public bool UseHealPotions = false;
public bool DrawPositional = true;
public bool DrawMeleeRange = true;
public bool DrawMeleeOffset = true;
public bool ShowMoveTarget = true;
public bool ShowHealthRatio = false;
Expand Down
1 change: 0 additions & 1 deletion RotationSolver/Localization/Strings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ internal partial class Strings
public string ConfigWindow_Param_ToastPositional { get; set; } = "Hint positional anticipation by Toast";
public string ConfigWindow_Param_SayPositional { get; set; } = "Hint positional anticipation by shouting";
public string ConfigWindow_Param_DrawPositional { get; set; } = "Draw Positional on the screen";
public string ConfigWindow_Param_DrawMeleeRange { get; set; } = "Draw the range of melee on the screen";

public string ConfigWindow_Param_DrawMeleeOffset { get; set; } = "Draw the offset of melee on the screen";
public string ConfigWindow_Param_AlphaInFill { get; set; } = "The alpha value in fill.";
Expand Down
3 changes: 2 additions & 1 deletion RotationSolver/RotationSolverPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public RotationSolverPlugin(DalamudPluginInterface pluginInterface)
Svc.PluginInterface.UiBuilder.Draw += OverlayWindow.Draw;

MajorUpdater.Enable();
PainterManager.Init();
Watcher.Enable();
OtherConfiguration.Init();
_dis.Add(new MovingController());
Expand Down Expand Up @@ -110,7 +111,7 @@ public void Dispose()
_dis?.Clear();

MajorUpdater.Dispose();

PainterManager.Dispose();
OtherConfiguration.Save();

ECommonsMain.Dispose();
Expand Down
122 changes: 61 additions & 61 deletions RotationSolver/UI/OverlayWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,69 +127,69 @@ private static void DrawTarget(BattleChara tar, uint color, float radius, out Ve
const int COUNT = 20;
private static void DrawPositional()
{
if (!Player.Object.IsJobCategory(JobRole.Tank)
&& !Player.Object.IsJobCategory(JobRole.Melee)) return;

var target = ActionUpdater.NextGCDAction?.Target?.IsNPCEnemy() ?? false
? ActionUpdater.NextGCDAction.Target
: Svc.Targets.Target?.IsNPCEnemy() ?? false
? Svc.Targets.Target
: null;

if (target == null) return;

if (ActionUpdater.NextGCDAction != null
&& !ActionUpdater.NextGCDAction.IsSingleTarget) return;

Vector3 pPosition = target.Position;

float radius = target.HitboxRadius + Player.Object.HitboxRadius + 3;
float rotation = target.Rotation;

if (Service.Config.DrawMeleeOffset && DataCenter.StateType != StateCommandType.Cancel)
{
var offsetColor = new Vector3(0.8f, 0.3f, 0.2f);
var pts1 = SectorPlots(pPosition, radius, 0, 4 * COUNT, 2 * Math.PI);

var pts2 = SectorPlots(pPosition, radius + Service.Config.MeleeRangeOffset, 0, 4 * COUNT, 2 * Math.PI);

DrawFill(pts1.ToArray(), pts2.ToArray(), offsetColor);

DrawBoundary(pts1, offsetColor);
DrawBoundary(pts2, offsetColor);
}

bool wrong = target.DistanceToPlayer() > 3;

var shouldPos = ActionUpdater.NextGCDAction?.EnemyPositional ?? EnemyPositional.None;
if (!wrong && shouldPos is EnemyPositional.Rear or EnemyPositional.Flank)
{
wrong = shouldPos != target.FindEnemyPositional();
}

switch (shouldPos)
{
case EnemyPositional.Flank when Service.Config.DrawPositional && CanDrawPositional(target):
DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, Math.PI * 0.25 + rotation, COUNT).Append(pPosition))), wrong);
DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, Math.PI * 1.25 + rotation, COUNT).Append(pPosition))), wrong);
break;
case EnemyPositional.Rear when Service.Config.DrawPositional && CanDrawPositional(target):
DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, Math.PI * 0.75 + rotation, COUNT).Append(pPosition))), wrong);
break;

default:
if (Service.Config.DrawMeleeRange)
{
DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, 0, 4 * COUNT, 2 * Math.PI))), wrong);
}
break;
}
//if (!Player.Object.IsJobCategory(JobRole.Tank)
// && !Player.Object.IsJobCategory(JobRole.Melee)) return;

//var target = ActionUpdater.NextGCDAction?.Target?.IsNPCEnemy() ?? false
// ? ActionUpdater.NextGCDAction.Target
// : Svc.Targets.Target?.IsNPCEnemy() ?? false
// ? Svc.Targets.Target
// : null;

//if (target == null) return;

//if (ActionUpdater.NextGCDAction != null
// && !ActionUpdater.NextGCDAction.IsSingleTarget) return;

//Vector3 pPosition = target.Position;

//float radius = target.HitboxRadius + Player.Object.HitboxRadius + 3;
//float rotation = target.Rotation;

//if (Service.Config.DrawMeleeOffset && DataCenter.StateType != StateCommandType.Cancel)
//{
// var offsetColor = new Vector3(0.8f, 0.3f, 0.2f);
// var pts1 = SectorPlots(pPosition, radius, 0, 4 * COUNT, 2 * Math.PI);

// var pts2 = SectorPlots(pPosition, radius + Service.Config.MeleeRangeOffset, 0, 4 * COUNT, 2 * Math.PI);

// DrawFill(pts1.ToArray(), pts2.ToArray(), offsetColor);

// DrawBoundary(pts1, offsetColor);
// DrawBoundary(pts2, offsetColor);
//}

//bool wrong = target.DistanceToPlayer() > 3;

//var shouldPos = ActionUpdater.NextGCDAction?.EnemyPositional ?? EnemyPositional.None;
//if (!wrong && shouldPos is EnemyPositional.Rear or EnemyPositional.Flank)
//{
// wrong = shouldPos != target.FindEnemyPositional();
//}

//switch (shouldPos)
//{
// case EnemyPositional.Flank when Service.Config.DrawPositional && CanDrawPositional(target):
// DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, Math.PI * 0.25 + rotation, COUNT).Append(pPosition))), wrong);
// DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, Math.PI * 1.25 + rotation, COUNT).Append(pPosition))), wrong);
// break;
// case EnemyPositional.Rear when Service.Config.DrawPositional && CanDrawPositional(target):
// DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, Math.PI * 0.75 + rotation, COUNT).Append(pPosition))), wrong);
// break;

// default:
// //if (Service.Config.DrawMeleeRange)
// {
// DrawRange(ClosePoints(GetPtsOnScreen(SectorPlots(pPosition, radius, 0, 4 * COUNT, 2 * Math.PI))), wrong);
// }
// break;
//}
}

private static bool CanDrawPositional(GameObject target)
{
return !Player.Object.HasStatus(true, CustomRotation.TrueNorth.StatusProvide) && target.HasPositional();
}
//private static bool CanDrawPositional(GameObject target)
//{
// return !Player.Object.HasStatus(true, CustomRotation.TrueNorth.StatusProvide) && target.HasPositional();
//}

static void DrawFill(Vector3[] pts1, Vector3[] pts2, Vector3 color)
{
Expand Down
62 changes: 56 additions & 6 deletions RotationSolver/UI/PainterManager.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,70 @@
using ECommons.DalamudServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XIVPainter.Element3D;

namespace RotationSolver.UI;

internal static class PainterManager
{
static XIVPainter.XIVPainter _painter;


static Drawing3DCircularSectorFO _noneCir;
static Drawing3DCircularSectorFO _flankCir1;
static Drawing3DCircularSectorFO _flankCir2;
static Drawing3DCircularSectorFO _rearCir;
static Drawing3DAnnulusFO _annulus;
public static void Init()
{
_painter = Svc.PluginInterface.Create<XIVPainter.XIVPainter>("RotationSolverOverlay");

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, 80, wrong, 2);
_flankCir1 = new Drawing3DCircularSectorFO(null, 3, 80, wrong, 2, MathF.PI * 0.25f, MathF.PI / 2);
_flankCir2 = new Drawing3DCircularSectorFO(null, 3, 80, wrong, 2, MathF.PI * 1.25f, MathF.PI / 2);
_rearCir = new Drawing3DCircularSectorFO(null, 3, 80, wrong, 2, MathF.PI * 0.75f, MathF.PI / 2);

_noneCir.InsideColor = _flankCir1.InsideColor = _flankCir2.InsideColor
= _rearCir.InsideColor = right;

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

public static void UpdateOffset(GameObject target)
{
_annulus.Target = target;
}

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

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

default:
_flankCir1.Target = _flankCir2.Target = null;
_rearCir.Target = null;
_noneCir.Target = target;
break;
}
}

public static void ClearPositional()
{
_flankCir1.Target = _flankCir2.Target = null;
_rearCir.Target = null;
_noneCir.Target = null;
}

public static void Dispose()
Expand Down
3 changes: 0 additions & 3 deletions RotationSolver/UI/RotationConfigWindow_Param.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,6 @@ private void DrawParamDisplay()
DrawCheckBox(LocalizationManager.RightLang.ConfigWindow_Param_DrawPositional,
ref Service.Config.DrawPositional, Service.Default.DrawPositional);

DrawCheckBox(LocalizationManager.RightLang.ConfigWindow_Param_DrawMeleeRange,
ref Service.Config.DrawMeleeRange, Service.Default.DrawMeleeRange);

DrawCheckBox(LocalizationManager.RightLang.ConfigWindow_Param_DrawMeleeOffset,
ref Service.Config.DrawMeleeOffset, Service.Default.DrawMeleeOffset);

Expand Down
52 changes: 38 additions & 14 deletions RotationSolver/Updaters/ActionUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using FFXIVClientStructs.FFXIV.Client.Game;
using RotationSolver.Commands;
using RotationSolver.Localization;
using RotationSolver.UI;

namespace RotationSolver.Updaters;

Expand Down Expand Up @@ -33,19 +34,45 @@ internal static void UpdateNextAction()

if (gcdAction is IBaseAction GcdAction)
{
NextGCDAction = GcdAction;

if (GcdAction.EnemyPositional != EnemyPositional.None && GcdAction.Target.HasPositional()
&& !localPlayer.HasStatus(true, StatusID.TrueNorth))
if(NextGCDAction != GcdAction)
{
if (CheckAction(GcdAction.ID))
NextGCDAction = GcdAction;

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

var rightJob = Player.Object.IsJobCategory(JobRole.Tank) || Player.Object.IsJobCategory(JobRole.Melee);
if(rightJob && Service.Config.DrawMeleeOffset)
{
PainterManager.UpdateOffset(GcdAction.Target);
}
else
{
PainterManager.UpdateOffset(null);
}

if (Service.Config.DrawPositional && GcdAction.IsSingleTarget && rightJob)
{
PainterManager.UpdatePositional(pos, GcdAction.Target);
}
else
{
string positional = GcdAction.EnemyPositional.ToName();
if (Service.Config.SayPositional) SpeechHelper.Speak(positional);
if (Service.Config.ToastPositional) Svc.Toasts.ShowQuest(" " + positional, new Dalamud.Game.Gui.Toast.QuestToastOptions()
PainterManager.ClearPositional();
}

if (pos != EnemyPositional.None)
{

if (CheckAction(GcdAction.ID))
{
IconId = GcdAction.IconID,
});
string positional = GcdAction.EnemyPositional.ToName();
if (Service.Config.SayPositional) SpeechHelper.Speak(positional);
if (Service.Config.ToastPositional) Svc.Toasts.ShowQuest(" " + positional,
new Dalamud.Game.Gui.Toast.QuestToastOptions()
{
IconId = GcdAction.IconID,
});
}
}
}
}
Expand All @@ -55,7 +82,6 @@ internal static void UpdateNextAction()
}
return;
}
NextAction = NextGCDAction = null;
}
catch (Exception ex)
{
Expand All @@ -65,13 +91,11 @@ internal static void UpdateNextAction()
NextAction = NextGCDAction = null;
}

static uint _lastSayingGCDAction;
static DateTime lastTime;
static bool CheckAction(uint actionID)
{
if ((_lastSayingGCDAction != actionID || DateTime.Now - lastTime > new TimeSpan(0, 0, 3)) && DataCenter.StateType != StateCommandType.Cancel)
if (DateTime.Now - lastTime > new TimeSpan(0, 0, 3) && DataCenter.StateType != StateCommandType.Cancel)
{
_lastSayingGCDAction = actionID;
lastTime = DateTime.Now;
return true;
}
Expand Down

0 comments on commit 46a2417

Please sign in to comment.