mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +01:00
Add changing mod settings to command / macro API.
This commit is contained in:
parent
22c3b3b629
commit
08ff9b679e
2 changed files with 93 additions and 38 deletions
|
|
@ -184,36 +184,9 @@ public class ModSettingsApi : IPenumbraApiModSettings, IApiService, IDisposable
|
|||
if (!_modManager.TryGetMod(modDirectory, modName, out var mod))
|
||||
return ApiHelpers.Return(PenumbraApiEc.ModMissing, args);
|
||||
|
||||
var groupIdx = mod.Groups.IndexOf(g => g.Name == optionGroupName);
|
||||
if (groupIdx < 0)
|
||||
return ApiHelpers.Return(PenumbraApiEc.OptionGroupMissing, args);
|
||||
|
||||
var setting = Setting.Zero;
|
||||
switch (mod.Groups[groupIdx])
|
||||
{
|
||||
case { Behaviour: GroupDrawBehaviour.SingleSelection } single:
|
||||
{
|
||||
var optionIdx = optionNames.Count == 0 ? -1 : single.Options.IndexOf(o => o.Name == optionNames[^1]);
|
||||
if (optionIdx < 0)
|
||||
return ApiHelpers.Return(PenumbraApiEc.OptionMissing, args);
|
||||
|
||||
setting = Setting.Single(optionIdx);
|
||||
break;
|
||||
}
|
||||
case { Behaviour: GroupDrawBehaviour.MultiSelection } multi:
|
||||
{
|
||||
foreach (var name in optionNames)
|
||||
{
|
||||
var optionIdx = multi.Options.IndexOf(o => o.Name == name);
|
||||
if (optionIdx < 0)
|
||||
return ApiHelpers.Return(PenumbraApiEc.OptionMissing, args);
|
||||
|
||||
setting |= Setting.Multi(optionIdx);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
var settingSuccess = ConvertModSetting(mod, optionGroupName, optionNames, out var groupIdx, out var setting);
|
||||
if (settingSuccess is not PenumbraApiEc.Success)
|
||||
return ApiHelpers.Return(settingSuccess, args);
|
||||
|
||||
var ret = _collectionEditor.SetModSetting(collection, mod, groupIdx, setting)
|
||||
? PenumbraApiEc.Success
|
||||
|
|
@ -283,4 +256,41 @@ public class ModSettingsApi : IPenumbraApiModSettings, IApiService, IDisposable
|
|||
|
||||
TriggerSettingEdited(mod);
|
||||
}
|
||||
|
||||
public static PenumbraApiEc ConvertModSetting(Mod mod, string groupName, IReadOnlyList<string> optionNames, out int groupIndex,
|
||||
out Setting setting)
|
||||
{
|
||||
groupIndex = mod.Groups.IndexOf(g => g.Name.Equals(groupName, StringComparison.OrdinalIgnoreCase));
|
||||
setting = Setting.Zero;
|
||||
if (groupIndex < 0)
|
||||
return PenumbraApiEc.OptionGroupMissing;
|
||||
|
||||
switch (mod.Groups[groupIndex])
|
||||
{
|
||||
case { Behaviour: GroupDrawBehaviour.SingleSelection } single:
|
||||
{
|
||||
var optionIdx = optionNames.Count == 0 ? -1 : single.Options.IndexOf(o => o.Name == optionNames[^1]);
|
||||
if (optionIdx < 0)
|
||||
return PenumbraApiEc.OptionMissing;
|
||||
|
||||
setting = Setting.Single(optionIdx);
|
||||
break;
|
||||
}
|
||||
case { Behaviour: GroupDrawBehaviour.MultiSelection } multi:
|
||||
{
|
||||
foreach (var name in optionNames)
|
||||
{
|
||||
var optionIdx = multi.Options.IndexOf(o => o.Name == name);
|
||||
if (optionIdx < 0)
|
||||
return PenumbraApiEc.OptionMissing;
|
||||
|
||||
setting |= Setting.Multi(optionIdx);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return PenumbraApiEc.Success;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ using Dalamud.Plugin.Services;
|
|||
using ImGuiNET;
|
||||
using OtterGui.Classes;
|
||||
using OtterGui.Services;
|
||||
using Penumbra.Api.Api;
|
||||
using Penumbra.Api.Enums;
|
||||
using Penumbra.Collections;
|
||||
using Penumbra.Collections.Manager;
|
||||
|
|
@ -379,16 +380,18 @@ public class CommandHandler : IDisposable, IApiService
|
|||
if (arguments.Length == 0)
|
||||
{
|
||||
var seString = new SeStringBuilder()
|
||||
.AddText("Use with /penumbra mod ").AddBlue("[enable|disable|inherit|toggle]").AddText(" ").AddYellow("[Collection Name]")
|
||||
.AddText("Use with /penumbra mod ").AddBlue("[enable|disable|inherit|toggle|setting]").AddText(" ")
|
||||
.AddYellow("[Collection Name]")
|
||||
.AddText(" | ")
|
||||
.AddPurple("[Mod Name or Mod Directory Name]");
|
||||
.AddPurple("[Mod Name or Mod Directory Name]")
|
||||
.AddGreen(" <| [Option Group Name] | [Option1;Option2;...]>");
|
||||
_chat.Print(seString.BuiltString);
|
||||
return true;
|
||||
}
|
||||
|
||||
var split = arguments.Split(' ', 2, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
||||
var nameSplit = split.Length != 2
|
||||
? Array.Empty<string>()
|
||||
? []
|
||||
: split[1].Split('|', 2, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
||||
if (nameSplit.Length != 2)
|
||||
{
|
||||
|
|
@ -406,6 +409,23 @@ public class CommandHandler : IDisposable, IApiService
|
|||
if (!GetModCollection(nameSplit[0], out var collection) || collection == ModCollection.Empty)
|
||||
return false;
|
||||
|
||||
var groupName = string.Empty;
|
||||
var optionNames = Array.Empty<string>();
|
||||
if (state is 4)
|
||||
{
|
||||
var split2 = nameSplit[1].Split('|', 3, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
||||
if (split2.Length < 2)
|
||||
{
|
||||
_chat.Print("Not enough arguments for changing settings provided.");
|
||||
return false;
|
||||
}
|
||||
|
||||
nameSplit[1] = split2[0];
|
||||
groupName = split2[1];
|
||||
if (split2.Length == 3)
|
||||
optionNames = split2[2].Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
if (!_modManager.TryGetMod(nameSplit[1], nameSplit[1], out var mod))
|
||||
{
|
||||
_chat.Print(new SeStringBuilder().AddText("The mod ").AddRed(nameSplit[1], true).AddText(" does not exist.")
|
||||
|
|
@ -413,12 +433,35 @@ public class CommandHandler : IDisposable, IApiService
|
|||
return false;
|
||||
}
|
||||
|
||||
if (HandleModState(state, collection!, mod))
|
||||
return true;
|
||||
if (state < 4)
|
||||
{
|
||||
if (HandleModState(state, collection!, mod))
|
||||
return true;
|
||||
|
||||
_chat.Print(new SeStringBuilder().AddText("Mod ").AddPurple(mod.Name, true)
|
||||
.AddText("already had the desired state in collection ")
|
||||
.AddYellow(collection!.Name, true).AddText(".").BuiltString);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (ModSettingsApi.ConvertModSetting(mod, groupName, optionNames, out var groupIndex, out var setting))
|
||||
{
|
||||
case PenumbraApiEc.OptionGroupMissing:
|
||||
_chat.Print(new SeStringBuilder().AddText("The mod ").AddRed(nameSplit[1], true).AddText(" has no group ")
|
||||
.AddGreen(groupName, true).AddText(".").BuiltString);
|
||||
return false;
|
||||
case PenumbraApiEc.OptionMissing:
|
||||
_chat.Print(new SeStringBuilder().AddText("Not all set options in the mod ").AddRed(nameSplit[1], true)
|
||||
.AddText(" could be found in group ").AddGreen(groupName, true).AddText(".").BuiltString);
|
||||
return false;
|
||||
case PenumbraApiEc.Success:
|
||||
_collectionEditor.SetModSetting(collection!, mod, groupIndex, setting);
|
||||
Print(() => new SeStringBuilder().AddText("Changed settings of group ").AddGreen(groupName, true).AddText(" in mod ")
|
||||
.AddPurple(mod.Name, true).AddText(" in collection ")
|
||||
.AddYellow(collection!.Name, true).AddText(".").BuiltString);
|
||||
return true;
|
||||
}
|
||||
|
||||
_chat.Print(new SeStringBuilder().AddText("Mod ").AddPurple(mod.Name, true)
|
||||
.AddText("already had the desired state in collection ")
|
||||
.AddYellow(collection!.Name, true).AddText(".").BuiltString);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -556,6 +599,8 @@ public class CommandHandler : IDisposable, IApiService
|
|||
"toggle" => 2,
|
||||
"inherit" => 3,
|
||||
"inherited" => 3,
|
||||
"setting" => 4,
|
||||
"settings" => 4,
|
||||
_ => -1,
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue