diff --git a/TCC.Core/UI/Windows/Widgets/GroupWindow.xaml b/TCC.Core/UI/Windows/Widgets/GroupWindow.xaml index 6d6806a1..4e7631e3 100644 --- a/TCC.Core/UI/Windows/Widgets/GroupWindow.xaml +++ b/TCC.Core/UI/Windows/Widgets/GroupWindow.xaml @@ -4,6 +4,7 @@ xmlns:controls="clr-namespace:TCC.UI.Controls" xmlns:converters="clr-namespace:Nostrum.WPF.Converters;assembly=Nostrum.WPF" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:extensions="clr-namespace:Nostrum.WPF.Extensions;assembly=Nostrum.WPF" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:widgets="clr-namespace:TCC.ViewModels.Widgets" xmlns:widgets1="clr-namespace:TCC.UI.Windows.Widgets" @@ -16,6 +17,30 @@ UseLayoutRounding="True" mc:Ignorable="d"> + + + + + @@ -113,91 +138,100 @@ BorderBrush="{StaticResource RevampBorderBrush}" CornerRadius="5" Opacity="0" - Style="{StaticResource DefaultBorderStyle}" - Visibility="{Binding Formed, Converter={converters:BoolToVisibility}}"> - + Visibility="{Binding Formed, Converter={converters:BoolToVisibility}}" + Style="{StaticResource DefaultBorderStyle}"> + + + + + + - - - - - - + + + + + + + + + + + - _raid; set => RaiseAndSetIfChanged(value, ref _raid); } + public int Size => Members.Count; public int ReadyCount => Members.Count(x => x.Ready == ReadyStatus.Ready); public int AliveCount => Members.Count(x => x.Alive); @@ -58,6 +63,10 @@ public bool Raid public bool Rolling { get; set; } public ICommand ShowLootWindowCommand { get; } + public ICommand ConfigureAbnormalitiesCommand { get; } + public ICommand LeaveGroupCommand { get; } + public ICommand DisbandGroupCommand { get; } + public ICommand ResetInstanceCommand { get; } public GroupWindowViewModel(GroupWindowSettings settings) : base(settings) { @@ -88,7 +97,6 @@ [new SortDescription(nameof(User.UserClass), ListSortDirection.Ascending)]) ]) ?? throw new Exception("Failed to create LiveCollectionView"); - Game.Teleported += OnTeleported; Game.EncounterChanged += OnEncounterChanged; settings.SettingsUpdated += NotifySettingUpdated; @@ -97,6 +105,38 @@ [new SortDescription(nameof(User.UserClass), ListSortDirection.Ascending)]) settings.LayoutChanged += OnLayoutChanged; ShowLootWindowCommand = new RelayCommand(Game.ShowLootDistributionWindow); + + ConfigureAbnormalitiesCommand = new RelayCommand(ConfigureAbnormalities); + LeaveGroupCommand = new RelayCommand(LeaveGroup); + DisbandGroupCommand = new RelayCommand(DisbandGroup); + ResetInstanceCommand = new RelayCommand(ResetInstance); + } + + private void ResetInstance() + { + if (!AmILeader) return; + StubInterface.Instance.StubClient.ResetInstance(); + } + + private void DisbandGroup() + { + if (!AmILeader) return; + StubInterface.Instance.StubClient.DisbandGroup(); + } + + private void LeaveGroup() + { + StubInterface.Instance.StubClient.LeaveGroup(); + } + + private void ConfigureAbnormalities() + { + _dispatcher.InvokeAsync(() => + { + if (TccWindow.Exists(typeof(AbnormalityConfigWindow))) return; + new AbnormalityConfigWindow().Show(); + }, + DispatcherPriority.Background); } private void OnEncounterChanged() @@ -123,7 +163,6 @@ private void OnTeleported() foreach (var u in Members.ToSyncList()) u.InRange = false; } - private void Members_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { //Task.Delay(0).ContinueWith(t => @@ -167,6 +206,7 @@ public bool TryGetUser(string name, [MaybeNullWhen(false)] out User u) u = exists ? Members.ToSyncList().FirstOrDefault(x => x.Name == name) : new User(_dispatcher); return exists; } + public bool TryGetUser(ulong id, [MaybeNullWhen(false)] out User u) { var exists = Exists(id); @@ -174,6 +214,7 @@ public bool TryGetUser(ulong id, [MaybeNullWhen(false)] out User u) u = exists ? Members.ToSyncList().FirstOrDefault(x => x.EntityId == id) : new User(_dispatcher); return u != null; } + public bool TryGetUser(uint pId, uint sId, [MaybeNullWhen(false)] out User u) { var exists = Exists(pId, sId); @@ -185,6 +226,7 @@ public bool IsLeader(string name) { return Members.FirstOrDefault(x => x.Name == name)?.IsLeader ?? false; } + public bool AmILeader => IsLeader(Game.Me.Name) || _leaderOverride; public void SetAggro(ulong target) @@ -216,6 +258,7 @@ private void SetAggroCircle(AggroCircle circle, AggroAction action, ulong user) SetAggro(user); } } + internal void BeginOrRefreshAbnormality(Abnormality ab, int stacks, uint duration, uint playerId, uint serverId) { _dispatcher.InvokeAsync(() => @@ -229,7 +272,7 @@ internal void BeginOrRefreshAbnormality(Abnormality ab, int stacks, uint duratio u.AddOrRefreshBuff(ab, duration, stacks); if (u.UserClass == Class.Warrior && ab.Id is >= 100200 and <= 100203) { - u.Role = Role.Tank; //def stance turned on: switch warrior to tank + u.Role = Role.Tank; //def stance turned on: switch warrior to tank } } else @@ -249,7 +292,6 @@ private void EndAbnormality(Abnormality ab, uint playerId, uint serverId) { _dispatcher.InvokeAsync(() => { - var u = Members.ToSyncList().FirstOrDefault(x => x.PlayerId == playerId && x.ServerId == serverId); if (u == null) return; @@ -275,6 +317,7 @@ private void ClearAbnormality(uint playerId, uint serverId) Members.ToSyncList().FirstOrDefault(x => x.PlayerId == playerId && x.ServerId == serverId)?.ClearAbnormalities(); }); } + [Obsolete] public void AddOrUpdateMember(User p) { @@ -376,7 +419,6 @@ private void SendLeaveMessage(string name) msg = "@0\vPartyPlayerName\v" + name + "\vparty\vparty"; } SystemMessagesProcessor.AnalyzeMessage(msg, opcode); - } private void RemoveMember(uint playerId, uint serverId, bool kick = false) @@ -480,7 +522,6 @@ private void EndRoll() { Rolling = false; - foreach (var m in Members.ToSyncList()) { m.IsRolling = false; @@ -500,9 +541,9 @@ private ulong GetWinningUser() return Members.ToSyncList().OrderByDescending(u => u.RollResult).First().EntityId; //Members.ToList().ForEach(user => user.IsWinning = user.EntityId == Members.OrderByDescending(u => u.RollResult).First().EntityId); } + public void SetReadyStatus(ReadyPartyMember p) { - if (_firstCheck) { foreach (var u in Members.ToSyncList()) @@ -691,7 +732,6 @@ protected override void RemoveHooks() PacketAnalyzer.Processor.Unhook(OnAbnormalityBegin); PacketAnalyzer.Processor.Unhook(OnAbnormalityRefresh); PacketAnalyzer.Processor.Unhook(OnAbnormalityEnd); - } private void OnDisconnected() @@ -759,7 +799,7 @@ private void OnCheckToReadyParty(S_CHECK_TO_READY_PARTY p) { _dispatcher.InvokeAsync(() => { - foreach (var readyPartyMember in p.Party) + foreach (var readyPartyMember in p.Party) SetReadyStatus(readyPartyMember); }); }