diff --git a/MareSynchronos/.editorconfig b/MareSynchronos/.editorconfig index 498103c..9222004 100644 --- a/MareSynchronos/.editorconfig +++ b/MareSynchronos/.editorconfig @@ -20,31 +20,31 @@ dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case dotnet_naming_symbols.interface.applicable_kinds = interface dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers = +dotnet_naming_symbols.interface.required_modifiers = dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers = +dotnet_naming_symbols.types.required_modifiers = dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers = +dotnet_naming_symbols.non_field_members.required_modifiers = # Naming styles dotnet_naming_style.begins_with_i.required_prefix = I -dotnet_naming_style.begins_with_i.required_suffix = -dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = dotnet_naming_style.begins_with_i.capitalization = pascal_case -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style.pascal_case.capitalization = pascal_case -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style.pascal_case.capitalization = pascal_case dotnet_style_operator_placement_when_wrapping = beginning_of_line tab_width = 4 @@ -94,7 +94,7 @@ csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion csharp_style_prefer_tuple_swap = true:suggestion csharp_style_prefer_utf8_string_literals = true:suggestion dotnet_diagnostic.S1075.severity = silent -dotnet_diagnostic.SS3358.severity = true:suggestion +dotnet_diagnostic.SS3358.severity = suggestion dotnet_diagnostic.MA0007.severity = silent dotnet_diagnostic.MA0075.severity = silent diff --git a/MareSynchronos/Interop/DalamudLogger.cs b/MareSynchronos/Interop/DalamudLogger.cs index e39d45a..277c3dc 100644 --- a/MareSynchronos/Interop/DalamudLogger.cs +++ b/MareSynchronos/Interop/DalamudLogger.cs @@ -18,7 +18,7 @@ internal sealed class DalamudLogger : ILogger _pluginLog = pluginLog; } - public IDisposable BeginScope(TState state) => default!; + public IDisposable BeginScope(TState state) where TState : notnull => default!; public bool IsEnabled(LogLevel logLevel) { diff --git a/MareSynchronos/Interop/GameChatHooks.cs b/MareSynchronos/Interop/GameChatHooks.cs index 1ad9cb2..87f8cc7 100644 --- a/MareSynchronos/Interop/GameChatHooks.cs +++ b/MareSynchronos/Interop/GameChatHooks.cs @@ -27,6 +27,7 @@ public unsafe sealed class GameChatHooks : IDisposable private readonly ILogger _logger; #region signatures + #pragma warning disable CS0649 // I do not know what kind of black magic this function performs [Signature("E8 ?? ?? ?? ?? 0F B7 7F 08 48 8B CE")] private readonly delegate* unmanaged ProcessStringStep2; @@ -62,7 +63,7 @@ public unsafe sealed class GameChatHooks : IDisposable DetourName = nameof(ShouldDoNameLookupDetour) )] private Hook? ShouldDoNameLookupHook { get; init; } - + #pragma warning restore CS0649 #endregion private ChatChannelOverride? _chatChannelOverride; diff --git a/MareSynchronos/Interop/Ipc/IpcCallerBrio.cs b/MareSynchronos/Interop/Ipc/IpcCallerBrio.cs index 6f6b11d..af8c7ad 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerBrio.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerBrio.cs @@ -94,6 +94,7 @@ public sealed class IpcCallerBrio : IIpcCaller var gameObject = await _dalamudUtilService.CreateGameObjectAsync(address).ConfigureAwait(false); if (gameObject == null) return default; var data = await _dalamudUtilService.RunOnFrameworkThread(() => _brioGetModelTransform.InvokeFunc(gameObject)).ConfigureAwait(false); + if (data.Item1 == null || data.Item2 == null || data.Item3 == null) return default; _logger.LogDebug("Getting Transform from Actor {actor}", gameObject.Name.TextValue); return new WorldData() diff --git a/MareSynchronos/Interop/VfxSpawnManager.cs b/MareSynchronos/Interop/VfxSpawnManager.cs index 18cd0f0..59dde4a 100644 --- a/MareSynchronos/Interop/VfxSpawnManager.cs +++ b/MareSynchronos/Interop/VfxSpawnManager.cs @@ -16,6 +16,8 @@ public unsafe class VfxSpawnManager : DisposableMediatorSubscriberBase { private static readonly byte[] _pool = "Client.System.Scheduler.Instance.VfxObject\0"u8.ToArray(); + #region signatures + #pragma warning disable CS0649 [Signature("E8 ?? ?? ?? ?? F3 0F 10 35 ?? ?? ?? ?? 48 89 43 08")] private readonly delegate* unmanaged _staticVfxCreate; @@ -24,6 +26,8 @@ public unsafe class VfxSpawnManager : DisposableMediatorSubscriberBase [Signature("40 53 48 83 EC 20 48 8B D9 48 8B 89 ?? ?? ?? ?? 48 85 C9 74 28 33 D2 E8 ?? ?? ?? ?? 48 8B 8B ?? ?? ?? ?? 48 85 C9")] private readonly delegate* unmanaged _staticVfxRemove; + #pragma warning restore CS0649 + #endregion public VfxSpawnManager(ILogger logger, IGameInteropProvider gameInteropProvider, MareMediator mareMediator) : base(logger, mareMediator) diff --git a/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs b/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs index 65cf435..97cee3a 100644 --- a/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs +++ b/MareSynchronos/MareConfiguration/ConfigurationServiceBase.cs @@ -56,11 +56,6 @@ public abstract class ConfigurationServiceBase : IConfigService where T : if (!File.Exists(ConfigurationPath)) { config = AttemptToLoadBackup(); - if (Equals(config, default(T))) - { - config = (T)Activator.CreateInstance(typeof(T))!; - Save(); - } } else { @@ -73,12 +68,12 @@ public abstract class ConfigurationServiceBase : IConfigService where T : // config failed to load for some reason config = AttemptToLoadBackup(); } + } - if (config == null || Equals(config, default(T))) - { - config = (T)Activator.CreateInstance(typeof(T))!; - Save(); - } + if (config == null || Equals(config, default(T))) + { + config = Activator.CreateInstance(); + Save(); } _configLastWriteTime = GetConfigLastWriteTime(); diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index dcb3406..b21f557 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -142,7 +142,7 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase Mediator.Subscribe(this, async (msg) => { Logger.LogDebug("Received Penumbra Mod settings change, updating player"); - _ = AddPlayerCacheToCreate(); + await AddPlayerCacheToCreate(); }); Mediator.Subscribe(this, (msg) => ProcessCacheCreation()); diff --git a/MareSynchronos/Services/CharacterAnalyzer.cs b/MareSynchronos/Services/CharacterAnalyzer.cs index 4d81a51..70b3ece 100644 --- a/MareSynchronos/Services/CharacterAnalyzer.cs +++ b/MareSynchronos/Services/CharacterAnalyzer.cs @@ -126,7 +126,7 @@ public sealed class CharacterAnalyzer : DisposableMediatorSubscriberBase Logger.LogWarning(ex, "Could not identify extension for {path}", filePath); } - var tris = await _xivDataAnalyzer.GetTrianglesByHash(fileEntry.Hash).ConfigureAwait(false); + var tris = await Task.Run(() => _xivDataAnalyzer.GetTrianglesByHash(fileEntry.Hash)).ConfigureAwait(false); foreach (var entry in fileCacheEntries) { diff --git a/MareSynchronos/Services/PairAnalyzer.cs b/MareSynchronos/Services/PairAnalyzer.cs index 92c50a4..a06e933 100644 --- a/MareSynchronos/Services/PairAnalyzer.cs +++ b/MareSynchronos/Services/PairAnalyzer.cs @@ -147,7 +147,7 @@ public sealed class PairAnalyzer : DisposableMediatorSubscriberBase Logger.LogWarning(ex, "Could not identify extension for {path}", filePath); } - var tris = await _xivDataAnalyzer.GetTrianglesByHash(fileEntry.Hash).ConfigureAwait(false); + var tris = await Task.Run(() => _xivDataAnalyzer.GetTrianglesByHash(fileEntry.Hash)).ConfigureAwait(false); foreach (var entry in fileCacheEntries) { diff --git a/MareSynchronos/Services/PlayerPerformanceService.cs b/MareSynchronos/Services/PlayerPerformanceService.cs index aed9989..899800b 100644 --- a/MareSynchronos/Services/PlayerPerformanceService.cs +++ b/MareSynchronos/Services/PlayerPerformanceService.cs @@ -66,7 +66,7 @@ public class PlayerPerformanceService : DisposableMediatorSubscriberBase foreach (var hash in moddedModelHashes) { - triUsage += await _xivDataAnalyzer.GetTrianglesByHash(hash).ConfigureAwait(false); + triUsage += await Task.Run(() => _xivDataAnalyzer.GetTrianglesByHash(hash)).ConfigureAwait(false); } pair.LastAppliedDataTris = triUsage; @@ -208,7 +208,7 @@ public class PlayerPerformanceService : DisposableMediatorSubscriberBase if (fileEntry == null) return; if (fileEntry.IsSubstEntry) return; - var texFormat = await _xivDataAnalyzer.GetTexFormatByHash(hash); + var texFormat = await Task.Run(() => _xivDataAnalyzer.GetTexFormatByHash(hash)); var filePath = fileEntry.ResolvedFilepath; var tmpFilePath = _fileCacheManager.GetSubstFilePath(Guid.NewGuid().ToString(), "tmp"); var newFilePath = _fileCacheManager.GetSubstFilePath(hash, "tex"); diff --git a/MareSynchronos/Services/XivDataAnalyzer.cs b/MareSynchronos/Services/XivDataAnalyzer.cs index 4919852..c988ec3 100644 --- a/MareSynchronos/Services/XivDataAnalyzer.cs +++ b/MareSynchronos/Services/XivDataAnalyzer.cs @@ -153,7 +153,7 @@ public sealed class XivDataAnalyzer return output; } - public async Task GetTrianglesByHash(string hash) + public long GetTrianglesByHash(string hash) { if (_configService.Current.TriangleDictionary.TryGetValue(hash, out var cachedTris) && cachedTris > 0) return cachedTris; @@ -215,7 +215,7 @@ public sealed class XivDataAnalyzer } } - public async Task<(uint Format, int MipCount, ushort Width, ushort Height)> GetTexFormatByHash(string hash) + public (uint Format, int MipCount, ushort Width, ushort Height) GetTexFormatByHash(string hash) { if (_configService.Current.TexDictionary.TryGetValue(hash, out var cachedTex) && cachedTex.Mip0Size > 0) return cachedTex; diff --git a/MareSynchronos/UI/CharaDataHubUi.Functions.cs b/MareSynchronos/UI/CharaDataHubUi.Functions.cs index 7c9cf41..3f2c809 100644 --- a/MareSynchronos/UI/CharaDataHubUi.Functions.cs +++ b/MareSynchronos/UI/CharaDataHubUi.Functions.cs @@ -13,14 +13,16 @@ internal sealed partial class CharaDataHubUi AccessTypeDto.AllPairs => "All Pairs", AccessTypeDto.ClosePairs => "Direct Pairs", AccessTypeDto.Individuals => "Specified", - AccessTypeDto.Public => "Everyone" + AccessTypeDto.Public => "Everyone", + _ => ((int)dto).ToString() }; private static string GetShareTypeString(ShareTypeDto dto) => dto switch - { - ShareTypeDto.Private => "Code Only", - ShareTypeDto.Shared => "Shared" - }; + { + ShareTypeDto.Private => "Code Only", + ShareTypeDto.Shared => "Shared", + _ => ((int)dto).ToString() + }; private static string GetWorldDataTooltipText(PoseEntryExtended poseEntry) { diff --git a/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs b/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs index 9ce5e89..220a8ad 100644 --- a/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs +++ b/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs @@ -480,8 +480,8 @@ internal sealed partial class CharaDataHubUi ImGui.SameLine(); ImGuiHelpers.ScaledDummy(10, 1); ImGui.SameLine(); - var worldData = pose.WorldData; - bool hasWorldData = (worldData ?? default) != default; + var worldData = pose.WorldData ?? default; + bool hasWorldData = worldData != default; _uiSharedService.IconText(FontAwesomeIcon.Globe, UiSharedService.GetBoolColor(hasWorldData)); var tooltipText = !hasWorldData ? "This Pose has no world data attached." : "This Pose has world data attached."; if (hasWorldData) @@ -491,8 +491,8 @@ internal sealed partial class CharaDataHubUi UiSharedService.AttachToolTip(tooltipText); if (hasWorldData && ImGui.IsItemClicked(ImGuiMouseButton.Left)) { - _dalamudUtilService.SetMarkerAndOpenMap(position: new Vector3(worldData.Value.PositionX, worldData.Value.PositionY, worldData.Value.PositionZ), - _dalamudUtilService.MapData.Value[worldData.Value.LocationInfo.MapId].Map); + _dalamudUtilService.SetMarkerAndOpenMap(position: new Vector3(worldData.PositionX, worldData.PositionY, worldData.PositionZ), + _dalamudUtilService.MapData.Value[worldData.LocationInfo.MapId].Map); } ImGui.SameLine(); using (ImRaii.Disabled(!_uiSharedService.IsInGpose || !(_charaDataManager.AttachingPoseTask?.IsCompleted ?? true) || !_charaDataManager.BrioAvailable)) diff --git a/MareSynchronos/UI/PermissionWindowUI.cs b/MareSynchronos/UI/PermissionWindowUI.cs index 8392b86..76b23f1 100644 --- a/MareSynchronos/UI/PermissionWindowUI.cs +++ b/MareSynchronos/UI/PermissionWindowUI.cs @@ -27,7 +27,7 @@ public class PermissionWindowUI : WindowMediatorSubscriberBase Pair = pair; _uiSharedService = uiSharedService; _apiController = apiController; - _ownPermissions = pair.UserPair.OwnPermissions.DeepClone(); + _ownPermissions = pair.UserPair?.OwnPermissions.DeepClone() ?? default; Flags = ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoResize; SizeConstraints = new() { @@ -49,6 +49,9 @@ public class PermissionWindowUI : WindowMediatorSubscriberBase _uiSharedService.BigText("Permissions for " + Pair.UserData.AliasOrUID); ImGuiHelpers.ScaledDummy(1f); + if (Pair.UserPair == null) + return; + if (ImGui.Checkbox("Pause Sync", ref paused)) { _ownPermissions.SetPaused(paused); diff --git a/MareSynchronos/UI/SyncshellAdminUI.cs b/MareSynchronos/UI/SyncshellAdminUI.cs index 07fc067..458e95f 100644 --- a/MareSynchronos/UI/SyncshellAdminUI.cs +++ b/MareSynchronos/UI/SyncshellAdminUI.cs @@ -351,7 +351,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase using var pushId = ImRaii.PushId(bannedUser.UID); if (_uiSharedService.IconTextButton(FontAwesomeIcon.Check, "Unban")) { - _apiController.GroupUnbanUser(bannedUser); + Task.Run(async () => await _apiController.GroupUnbanUser(bannedUser)); _bannedUsers.RemoveAll(b => string.Equals(b.UID, bannedUser.UID, StringComparison.Ordinal)); } } diff --git a/MareSynchronos/UI/UISharedService.cs b/MareSynchronos/UI/UISharedService.cs index c3077d0..839db3d 100644 --- a/MareSynchronos/UI/UISharedService.cs +++ b/MareSynchronos/UI/UISharedService.cs @@ -661,7 +661,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase } public T? DrawColorCombo(string comboName, IEnumerable comboItems, Func toEntry, - Action? onSelected = null, T? initialSelectedItem = default) + Action? onSelected = null, T? initialSelectedItem = default) { if (!comboItems.Any()) return default; @@ -689,7 +689,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase { entry = toEntry(item); ImGui.PushStyleColor(ImGuiCol.Text, ColorHelpers.RgbaUintToVector4(ColorHelpers.SwapEndianness(entry.Color))); - bool isSelected = EqualityComparer.Default.Equals(item, (T)selectedItem); + bool isSelected = EqualityComparer.Default.Equals(item, (T)selectedItem!); if (ImGui.Selectable(entry.Name, isSelected)) { _selectedComboItems[comboName] = item!; diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.cs b/MareSynchronos/WebAPI/SignalR/ApiController.cs index 366ad37..f618c46 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.cs @@ -215,13 +215,14 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM if (_dalamudUtil.HasModifiedGameFiles) { - Logger.LogError("Detected modified game files on connection"); - if (false) + Logger.LogWarning("Detected modified game files on connection"); +#if false Mediator.Publish(new NotificationMessage("Modified Game Files detected", "Dalamud has reported modified game files in your FFXIV installation. " + "You will be able to connect, but the synchronization functionality might be (partially) broken. " + "Exit the game and repair it through XIVLauncher to get rid of this message.", NotificationType.Error, TimeSpan.FromSeconds(15))); +#endif } await LoadIninitialPairs().ConfigureAwait(false); diff --git a/MareSynchronos/WebAPI/SignalR/HubConnectionConfig.cs b/MareSynchronos/WebAPI/SignalR/HubConnectionConfig.cs index 6ac65f2..ced9bbd 100644 --- a/MareSynchronos/WebAPI/SignalR/HubConnectionConfig.cs +++ b/MareSynchronos/WebAPI/SignalR/HubConnectionConfig.cs @@ -39,7 +39,7 @@ public record HubConnectionConfig "longpolling" => HttpTransportType.LongPolling, _ => HttpTransportType.None }; - }; + } return result; }