diff --git a/Glamourer/Api/GlamourerIpc.Apply.cs b/Glamourer/Api/GlamourerIpc.Apply.cs index 8ffa0f6..da8e33e 100644 --- a/Glamourer/Api/GlamourerIpc.Apply.cs +++ b/Glamourer/Api/GlamourerIpc.Apply.cs @@ -18,6 +18,13 @@ public partial class GlamourerIpc public const string LabelApplyOnlyCustomization = "Glamourer.ApplyOnlyCustomization"; public const string LabelApplyOnlyCustomizationToCharacter = "Glamourer.ApplyOnlyCustomizationToCharacter"; + public const string LabelApplyAllLock = "Glamourer.ApplyAllLock"; + public const string LabelApplyAllToCharacterLock = "Glamourer.ApplyAllToCharacterLock"; + public const string LabelApplyOnlyEquipmentLock = "Glamourer.ApplyOnlyEquipmentLock"; + public const string LabelApplyOnlyEquipmentToCharacterLock = "Glamourer.ApplyOnlyEquipmentToCharacterLock"; + public const string LabelApplyOnlyCustomizationLock = "Glamourer.ApplyOnlyCustomizationLock"; + public const string LabelApplyOnlyCustomizationToCharacterLock = "Glamourer.ApplyOnlyCustomizationToCharacterLock"; + private readonly ActionProvider _applyAllProvider; private readonly ActionProvider _applyAllToCharacterProvider; private readonly ActionProvider _applyOnlyEquipmentProvider; @@ -25,6 +32,13 @@ public partial class GlamourerIpc private readonly ActionProvider _applyOnlyCustomizationProvider; private readonly ActionProvider _applyOnlyCustomizationToCharacterProvider; + private readonly ActionProvider _applyAllProviderLock; + private readonly ActionProvider _applyAllToCharacterProviderLock; + private readonly ActionProvider _applyOnlyEquipmentProviderLock; + private readonly ActionProvider _applyOnlyEquipmentToCharacterProviderLock; + private readonly ActionProvider _applyOnlyCustomizationProviderLock; + private readonly ActionProvider _applyOnlyCustomizationToCharacterProviderLock; + public static ActionSubscriber ApplyAllSubscriber(DalamudPluginInterface pi) => new(pi, LabelApplyAll); @@ -43,26 +57,45 @@ public partial class GlamourerIpc public static ActionSubscriber ApplyOnlyCustomizationToCharacterSubscriber(DalamudPluginInterface pi) => new(pi, LabelApplyOnlyCustomizationToCharacter); - public void ApplyAll(string base64, string characterName) - => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(characterName), version); + => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(characterName), version, 0); public void ApplyAllToCharacter(string base64, Character? character) - => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(character), version); + => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(character), version, 0); public void ApplyOnlyEquipment(string base64, string characterName) - => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(characterName), version); + => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(characterName), version, 0); public void ApplyOnlyEquipmentToCharacter(string base64, Character? character) - => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(character), version); + => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(character), version, 0); public void ApplyOnlyCustomization(string base64, string characterName) - => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(characterName), version); + => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(characterName), version, 0); public void ApplyOnlyCustomizationToCharacter(string base64, Character? character) - => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(character), version); + => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(character), version, 0); - private void ApplyDesign(DesignBase? design, IEnumerable actors, byte version) + + public void ApplyAllLock(string base64, string characterName, uint lockCode) + => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(characterName), version, lockCode); + + public void ApplyAllToCharacterLock(string base64, Character? character, uint lockCode) + => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(character), version, lockCode); + + public void ApplyOnlyEquipmentLock(string base64, string characterName, uint lockCode) + => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(characterName), version, lockCode); + + public void ApplyOnlyEquipmentToCharacterLock(string base64, Character? character, uint lockCode) + => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(character), version, lockCode); + + public void ApplyOnlyCustomizationLock(string base64, string characterName, uint lockCode) + => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(characterName), version, lockCode); + + public void ApplyOnlyCustomizationToCharacterLock(string base64, Character? character, uint lockCode) + => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(character), version, lockCode); + + + private void ApplyDesign(DesignBase? design, IEnumerable actors, byte version, uint lockCode) { if (design == null) return; @@ -78,10 +111,10 @@ public partial class GlamourerIpc continue; } - if ((hasModelId || state.ModelData.ModelId == 0) &&state.CanUnlock(0xDEADBEEF)) + if ((hasModelId || state.ModelData.ModelId == 0) && state.CanUnlock(lockCode)) { - _stateManager.ApplyDesign(design, state, StateChanged.Source.Ipc, 0xDEADBEEF); - state.Lock(0xDEADBEEF); + _stateManager.ApplyDesign(design, state, StateChanged.Source.Ipc, lockCode); + state.Lock(lockCode); } } } diff --git a/Glamourer/Api/GlamourerIpc.Events.cs b/Glamourer/Api/GlamourerIpc.Events.cs index dabaaf7..0186f6d 100644 --- a/Glamourer/Api/GlamourerIpc.Events.cs +++ b/Glamourer/Api/GlamourerIpc.Events.cs @@ -9,13 +9,19 @@ namespace Glamourer.Api; public partial class GlamourerIpc { public const string LabelStateChanged = "Glamourer.StateChanged"; + public const string LabelGPoseChanged = "Glamourer.GPoseChanged"; + private readonly GPoseService _gPose; private readonly StateChanged _stateChangedEvent; private readonly EventProvider> _stateChangedProvider; + private readonly EventProvider _gPoseChangedProvider; private void OnStateChanged(StateChanged.Type type, StateChanged.Source source, ActorState state, ActorData actors, object? data = null) { foreach (var actor in actors.Objects) _stateChangedProvider.Invoke(type, actor.Address, new Lazy(() => _designConverter.ShareBase64(state))); } + + private void OnGPoseChanged(bool value) + => _gPoseChangedProvider.Invoke(value); } diff --git a/Glamourer/Api/GlamourerIpc.Revert.cs b/Glamourer/Api/GlamourerIpc.Revert.cs index 37c057c..e9908b8 100644 --- a/Glamourer/Api/GlamourerIpc.Revert.cs +++ b/Glamourer/Api/GlamourerIpc.Revert.cs @@ -9,12 +9,20 @@ namespace Glamourer.Api; public partial class GlamourerIpc { - public const string LabelRevert = "Glamourer.Revert"; - public const string LabelRevertCharacter = "Glamourer.RevertCharacter"; + public const string LabelRevert = "Glamourer.Revert"; + public const string LabelRevertCharacter = "Glamourer.RevertCharacter"; + public const string LabelRevertLock = "Glamourer.RevertLock"; + public const string LabelRevertCharacterLock = "Glamourer.RevertCharacterLock"; + public const string LabelUnlock = "Glamourer.Unlock"; private readonly ActionProvider _revertProvider; private readonly ActionProvider _revertCharacterProvider; + private readonly ActionProvider _revertProviderLock; + private readonly ActionProvider _revertCharacterProviderLock; + + private readonly FuncProvider _unlockProvider; + public static ActionSubscriber RevertSubscriber(DalamudPluginInterface pi) => new(pi, LabelRevert); @@ -22,17 +30,38 @@ public partial class GlamourerIpc => new(pi, LabelRevertCharacter); public void Revert(string characterName) - => Revert(FindActors(characterName)); + => Revert(FindActors(characterName), 0); public void RevertCharacter(Character? character) - => Revert(FindActors(character)); + => Revert(FindActors(character), 0); - private void Revert(IEnumerable actors) + public void RevertLock(string characterName, uint lockCode) + => Revert(FindActors(characterName), lockCode); + + public void RevertCharacterLock(Character? character, uint lockCode) + => Revert(FindActors(character), lockCode); + + public bool Unlock(Character? character, uint lockCode) + => Unlock(FindActors(character), lockCode); + + private void Revert(IEnumerable actors, uint lockCode) { foreach (var id in actors) { if (_stateManager.TryGetValue(id, out var state)) - _stateManager.ResetState(state, StateChanged.Source.Ipc, 0xDEADBEEF); + _stateManager.ResetState(state, StateChanged.Source.Ipc, lockCode); } } + + private bool Unlock(IEnumerable actors, uint lockCode) + { + var ret = false; + foreach (var id in actors) + { + if (_stateManager.TryGetValue(id, out var state)) + ret |= state.Unlock(lockCode); + } + + return ret; + } } diff --git a/Glamourer/Api/GlamourerIpc.cs b/Glamourer/Api/GlamourerIpc.cs index f6f8620..036ff42 100644 --- a/Glamourer/Api/GlamourerIpc.cs +++ b/Glamourer/Api/GlamourerIpc.cs @@ -17,7 +17,7 @@ namespace Glamourer.Api; public partial class GlamourerIpc : IDisposable { public const int CurrentApiVersionMajor = 0; - public const int CurrentApiVersionMinor = 2; + public const int CurrentApiVersionMinor = 3; private readonly StateManager _stateManager; private readonly ObjectManager _objects; @@ -25,12 +25,13 @@ public partial class GlamourerIpc : IDisposable private readonly DesignConverter _designConverter; public GlamourerIpc(DalamudPluginInterface pi, StateManager stateManager, ObjectManager objects, ActorService actors, - DesignConverter designConverter, StateChanged stateChangedEvent) + DesignConverter designConverter, StateChanged stateChangedEvent, GPoseService gPose) { _stateManager = stateManager; _objects = objects; _actors = actors; _designConverter = designConverter; + _gPose = gPose; _stateChangedEvent = stateChangedEvent; _apiVersionProvider = new FuncProvider(pi, LabelApiVersion, ApiVersion); _apiVersionsProvider = new FuncProvider<(int Major, int Minor)>(pi, LabelApiVersions, ApiVersions); @@ -48,12 +49,28 @@ public partial class GlamourerIpc : IDisposable _applyOnlyCustomizationToCharacterProvider = new ActionProvider(pi, LabelApplyOnlyCustomizationToCharacter, ApplyOnlyCustomizationToCharacter); - _revertProvider = new ActionProvider(pi, LabelRevert, Revert); - _revertCharacterProvider = new ActionProvider(pi, LabelRevertCharacter, RevertCharacter); + _applyAllProviderLock = new ActionProvider(pi, LabelApplyAllLock, ApplyAllLock); + _applyAllToCharacterProviderLock = + new ActionProvider(pi, LabelApplyAllToCharacterLock, ApplyAllToCharacterLock); + _applyOnlyEquipmentProviderLock = new ActionProvider(pi, LabelApplyOnlyEquipmentLock, ApplyOnlyEquipmentLock); + _applyOnlyEquipmentToCharacterProviderLock = + new ActionProvider(pi, LabelApplyOnlyEquipmentToCharacterLock, ApplyOnlyEquipmentToCharacterLock); + _applyOnlyCustomizationProviderLock = + new ActionProvider(pi, LabelApplyOnlyCustomizationLock, ApplyOnlyCustomizationLock); + _applyOnlyCustomizationToCharacterProviderLock = + new ActionProvider(pi, LabelApplyOnlyCustomizationToCharacterLock, ApplyOnlyCustomizationToCharacterLock); + + _revertProvider = new ActionProvider(pi, LabelRevert, Revert); + _revertCharacterProvider = new ActionProvider(pi, LabelRevertCharacter, RevertCharacter); + _revertProviderLock = new ActionProvider(pi, LabelRevertLock, RevertLock); + _revertCharacterProviderLock = new ActionProvider(pi, LabelRevertCharacterLock, RevertCharacterLock); + _unlockProvider = new FuncProvider(pi, LabelUnlock, Unlock); _stateChangedProvider = new EventProvider>(pi, LabelStateChanged); + _gPoseChangedProvider = new EventProvider(pi, LabelGPoseChanged); _stateChangedEvent.Subscribe(OnStateChanged, StateChanged.Priority.GlamourerIpc); + _gPose.Subscribe(OnGPoseChanged, GPoseService.Priority.GlamourerIpc); } public void Dispose() @@ -70,11 +87,23 @@ public partial class GlamourerIpc : IDisposable _applyOnlyEquipmentToCharacterProvider.Dispose(); _applyOnlyCustomizationProvider.Dispose(); _applyOnlyCustomizationToCharacterProvider.Dispose(); + _applyAllProviderLock.Dispose(); + _applyAllToCharacterProviderLock.Dispose(); + _applyOnlyEquipmentProviderLock.Dispose(); + _applyOnlyEquipmentToCharacterProviderLock.Dispose(); + _applyOnlyCustomizationProviderLock.Dispose(); + _applyOnlyCustomizationToCharacterProviderLock.Dispose(); + _revertProvider.Dispose(); _revertCharacterProvider.Dispose(); + _revertProviderLock.Dispose(); + _revertCharacterProviderLock.Dispose(); + _unlockProvider.Dispose(); _stateChangedEvent.Unsubscribe(OnStateChanged); _stateChangedProvider.Dispose(); + _gPose.Unsubscribe(OnGPoseChanged); + _gPoseChangedProvider.Dispose(); } private IEnumerable FindActors(string actorName) diff --git a/Glamourer/Events/GPoseService.cs b/Glamourer/Events/GPoseService.cs index 358b116..363fa92 100644 --- a/Glamourer/Events/GPoseService.cs +++ b/Glamourer/Events/GPoseService.cs @@ -14,7 +14,9 @@ public class GPoseService : EventWrapper, GPoseService.Priority> private readonly ConcurrentQueue _onEnter = new(); public enum Priority - { } + { + GlamourerIpc = int.MinValue, + } public bool InGPose { get; private set; } = false; @@ -22,6 +24,7 @@ public class GPoseService : EventWrapper, GPoseService.Priority> : base(nameof(GPoseService)) { _framework = framework; + InGPose = GameMain.IsInGPose(); _framework.Update += OnFramework; }