Skip to content

Commit

Permalink
fix edge tracking in character window
Browse files Browse the repository at this point in the history
  • Loading branch information
foglio1024 committed Apr 10, 2024
1 parent 8fb25aa commit c01c06a
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 3 deletions.
30 changes: 30 additions & 0 deletions TCC.Core/Data/Abnormalities/WarriorAbnormalityTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace TCC.Data.Abnormalities;

public class WarriorAbnormalityTracker : AbnormalityTracker
{
public static event Action<WarriorStance>? StanceChanged;
//private static readonly uint[] GambleIDs = { 100800, 100801, 100802, 100803 };
const uint GambleID = 100801;
static readonly uint[] AstanceIDs = [100100, 100101, 100102, 100103];
Expand All @@ -18,6 +19,17 @@ public class WarriorAbnormalityTracker : AbnormalityTracker

readonly Skill _bladeWaltz;

static WarriorStance _stance;
static WarriorStance Stance
{
set
{
if (_stance == value) return;
_stance = value;
StanceChanged?.Invoke(value);
}
}

public WarriorAbnormalityTracker()
{
Game.DB!.SkillsDatabase.TryGetSkillByIconName("icon_skills.doublesworddance_tex", Game.Me.Class, out var bw);
Expand Down Expand Up @@ -66,6 +78,9 @@ public override void OnAbnormalityEnd(S_ABNORMALITY_END p)
static void CheckAssaultStanceBegin(S_ABNORMALITY_BEGIN p)
{
if (!AstanceIDs.Contains(p.AbnormalityId)) return;

Stance = WarriorStance.Assault;

if (!TryGetClassViewModel<WarriorLayoutViewModel>(out var vm)) return;

vm.SetStance(WarriorStance.Assault);
Expand All @@ -74,6 +89,9 @@ static void CheckAssaultStanceBegin(S_ABNORMALITY_BEGIN p)
static void CheckAssaultStanceRefresh(S_ABNORMALITY_REFRESH p)
{
if (!AstanceIDs.Contains(p.AbnormalityId)) return;

Stance = WarriorStance.Assault;

if (!TryGetClassViewModel<WarriorLayoutViewModel>(out var vm)) return;

vm.SetStance(WarriorStance.Assault);
Expand All @@ -82,6 +100,9 @@ static void CheckAssaultStanceRefresh(S_ABNORMALITY_REFRESH p)
static void CheckAssaultStanceEnd(S_ABNORMALITY_END p)
{
if (!AstanceIDs.Contains(p.AbnormalityId)) return;

Stance = WarriorStance.None;

if (!TryGetClassViewModel<WarriorLayoutViewModel>(out var vm)) return;

vm.SetStance(WarriorStance.None);
Expand All @@ -90,6 +111,9 @@ static void CheckAssaultStanceEnd(S_ABNORMALITY_END p)
static void CheckDefensiveStanceBegin(S_ABNORMALITY_BEGIN p)
{
if (!DstanceIDs.Contains(p.AbnormalityId)) return;

Stance = WarriorStance.Defensive;

if (!TryGetClassViewModel<WarriorLayoutViewModel>(out var vm)) return;

vm.SetStance(WarriorStance.Defensive);
Expand All @@ -98,6 +122,9 @@ static void CheckDefensiveStanceBegin(S_ABNORMALITY_BEGIN p)
static void CheckDefensiveStanceRefresh(S_ABNORMALITY_REFRESH p)
{
if (!DstanceIDs.Contains(p.AbnormalityId)) return;

Stance = WarriorStance.Defensive;

if (!TryGetClassViewModel<WarriorLayoutViewModel>(out var vm)) return;

vm.SetStance(WarriorStance.Defensive);
Expand All @@ -106,6 +133,9 @@ static void CheckDefensiveStanceRefresh(S_ABNORMALITY_REFRESH p)
static void CheckDefensiveStanceEnd(S_ABNORMALITY_END p)
{
if (!DstanceIDs.Contains(p.AbnormalityId)) return;

Stance = WarriorStance.None;

if (!TryGetClassViewModel<WarriorLayoutViewModel>(out var vm)) return;

vm.SetStance(WarriorStance.None);
Expand Down
7 changes: 4 additions & 3 deletions TCC.Core/UI/Windows/Widgets/CharacterWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -672,9 +672,10 @@
</FrameworkElement.Style>
</elements:SorcererElementsControl>
<Grid>
<elements:EdgeRhombControl EdgeCounter="{Binding Player.StacksCounter}"
FillBrush="{Binding Player.WarriorStance.CurrentStance, Converter={converters:WarriorStanceToColorConverter Light=True, Fallback=True}}"
GlowColor="{Binding Player.WarriorStance.CurrentStance, Converter={converters:WarriorStanceToColorConverter Fallback=True}}"
<!-- TODO: this should be a content control and set based on the class -->
<elements:EdgeRhombControl EdgeCounter="{Binding EdgeCounter}"
FillBrush="{Binding WarriorStanceTracker.CurrentStance, Converter={converters:WarriorStanceToColorConverter Light=True, Fallback=True}}"
GlowColor="{Binding WarriorStanceTracker.CurrentStance, Converter={converters:WarriorStanceToColorConverter Fallback=True}}"
>
<FrameworkElement.Style>
<Style TargetType="FrameworkElement">
Expand Down
46 changes: 46 additions & 0 deletions TCC.Core/ViewModels/Widgets/CharacterWindowViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
using JetBrains.Annotations;
using System.ComponentModel;
using TCC.Data;
using TCC.Data.Abnormalities;
using TCC.Data.Pc;
using TCC.Settings.WindowSettings;
using TCC.Utilities;
using TCC.Utils;
using TeraDataLite;
using TeraPacketParser.Analysis;
using TeraPacketParser.Messages;

namespace TCC.ViewModels.Widgets;

Expand All @@ -26,6 +30,10 @@ or Class.Valkyrie

public bool ShowLeaderIcon => Game.Group.AmILeader;

public Counter EdgeCounter { get; set; } = new(10, true);

public StanceTracker<WarriorStance> WarriorStanceTracker { get; } = new();

public CustomLaurel Laurel
{
get
Expand All @@ -46,6 +54,44 @@ public CharacterWindowViewModel(CharacterWindowSettings settings) : base(setting
settings.ShowStaminaChanged += () => InvokePropertyChanged(nameof(ShowRe));
settings.CustomLaurelChanged += () => InvokePropertyChanged(nameof(Laurel));
}

protected override void InstallHooks()
{
PacketAnalyzer.Processor.Hook<S_LOGIN>(OnLogin);
PacketAnalyzer.Processor.Hook<S_GET_USER_LIST>(OnGetUserList);
}

protected override void RemoveHooks()
{
PacketAnalyzer.Processor.Unhook<S_LOGIN>(OnLogin);
PacketAnalyzer.Processor.Unhook<S_GET_USER_LIST>(OnGetUserList);
}

void OnLogin(S_LOGIN m)
{
if (m.CharacterClass is Class.Warrior)
{
PacketAnalyzer.Processor.Hook<S_PLAYER_STAT_UPDATE>(OnPlayerStatUpdate);
WarriorAbnormalityTracker.StanceChanged += OnStanceChanged;
}
}

private void OnStanceChanged(WarriorStance stance)
{
WarriorStanceTracker.CurrentStance = stance;
}

void OnGetUserList(S_GET_USER_LIST m)
{
PacketAnalyzer.Processor.Unhook<S_PLAYER_STAT_UPDATE>(OnPlayerStatUpdate);
WarriorAbnormalityTracker.StanceChanged -= OnStanceChanged;
}


void OnPlayerStatUpdate(S_PLAYER_STAT_UPDATE m)
{
EdgeCounter.Val = m.Edge;
}

void OnLeaderChanged()
{
Expand Down

0 comments on commit c01c06a

Please sign in to comment.