mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2026-02-19 14:07:43 +01:00
Add experimental automation condition for gearsets.
This commit is contained in:
parent
c11bd629da
commit
dd42b7ab7f
7 changed files with 185 additions and 32 deletions
|
|
@ -27,6 +27,7 @@ public class AutoDesign
|
|||
public Design? Design;
|
||||
public JobGroup Jobs;
|
||||
public Type ApplicationType;
|
||||
public short GearsetIndex = -1;
|
||||
|
||||
public string Name(bool incognito)
|
||||
=> Revert ? RevertName : incognito ? Design!.Incognito : Design!.Name.Text;
|
||||
|
|
@ -43,10 +44,22 @@ public class AutoDesign
|
|||
Design = Design,
|
||||
ApplicationType = ApplicationType,
|
||||
Jobs = Jobs,
|
||||
GearsetIndex = GearsetIndex,
|
||||
};
|
||||
|
||||
public unsafe bool IsActive(Actor actor)
|
||||
=> actor.IsCharacter && Jobs.Fits(actor.AsCharacter->CharacterData.ClassJob);
|
||||
{
|
||||
if (!actor.IsCharacter)
|
||||
return false;
|
||||
|
||||
var ret = true;
|
||||
if (GearsetIndex < 0)
|
||||
ret &= Jobs.Fits(actor.AsCharacter->CharacterData.ClassJob);
|
||||
else
|
||||
ret &= AutoDesignApplier.CheckGearset(GearsetIndex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public JObject Serialize()
|
||||
=> new()
|
||||
|
|
@ -58,9 +71,12 @@ public class AutoDesign
|
|||
|
||||
private JObject CreateConditionObject()
|
||||
{
|
||||
var ret = new JObject();
|
||||
if (Jobs.Id != 0)
|
||||
ret["JobGroup"] = Jobs.Id;
|
||||
var ret = new JObject
|
||||
{
|
||||
["Gearset"] = GearsetIndex,
|
||||
["JobGroup"] = Jobs.Id,
|
||||
};
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Dalamud.Plugin.Services;
|
||||
using FFXIVClientStructs.FFXIV.Client.UI.Misc;
|
||||
using Glamourer.Customization;
|
||||
using Glamourer.Designs;
|
||||
using Glamourer.Events;
|
||||
|
|
@ -26,6 +27,7 @@ public class AutoDesignApplier : IDisposable
|
|||
private readonly AutoDesignManager _manager;
|
||||
private readonly StateManager _state;
|
||||
private readonly JobService _jobs;
|
||||
private readonly EquippedGearset _equippedGearset;
|
||||
private readonly ActorService _actors;
|
||||
private readonly CustomizationService _customizations;
|
||||
private readonly CustomizeUnlockManager _customizeUnlocks;
|
||||
|
|
@ -49,7 +51,8 @@ public class AutoDesignApplier : IDisposable
|
|||
|
||||
public AutoDesignApplier(Configuration config, AutoDesignManager manager, StateManager state, JobService jobs,
|
||||
CustomizationService customizations, ActorService actors, ItemUnlockManager itemUnlocks, CustomizeUnlockManager customizeUnlocks,
|
||||
AutomationChanged @event, ObjectManager objects, WeaponLoading weapons, HumanModelList humans, IClientState clientState)
|
||||
AutomationChanged @event, ObjectManager objects, WeaponLoading weapons, HumanModelList humans, IClientState clientState,
|
||||
EquippedGearset equippedGearset)
|
||||
{
|
||||
_config = config;
|
||||
_manager = manager;
|
||||
|
|
@ -64,15 +67,18 @@ public class AutoDesignApplier : IDisposable
|
|||
_weapons = weapons;
|
||||
_humans = humans;
|
||||
_clientState = clientState;
|
||||
_equippedGearset = equippedGearset;
|
||||
_jobs.JobChanged += OnJobChange;
|
||||
_event.Subscribe(OnAutomationChange, AutomationChanged.Priority.AutoDesignApplier);
|
||||
_weapons.Subscribe(OnWeaponLoading, WeaponLoading.Priority.AutoDesignApplier);
|
||||
_equippedGearset.Subscribe(OnEquippedGearset, EquippedGearset.Priority.AutoDesignApplier);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_weapons.Unsubscribe(OnWeaponLoading);
|
||||
_event.Unsubscribe(OnAutomationChange);
|
||||
_equippedGearset.Unsubscribe(OnEquippedGearset);
|
||||
_jobs.JobChanged -= OnJobChange;
|
||||
}
|
||||
|
||||
|
|
@ -496,4 +502,38 @@ public class AutoDesignApplier : IDisposable
|
|||
totalMetaFlags |= 0x08;
|
||||
}
|
||||
}
|
||||
|
||||
internal static int NewGearsetId = -1;
|
||||
|
||||
private void OnEquippedGearset(string name, int id, int prior, byte _, byte job)
|
||||
{
|
||||
if (!_config.EnableAutoDesigns)
|
||||
return;
|
||||
|
||||
var (player, data) = _objects.PlayerData;
|
||||
if (!player.IsValid)
|
||||
return;
|
||||
|
||||
if (!GetPlayerSet(player, out var set) || !_state.TryGetValue(player, out var state))
|
||||
return;
|
||||
|
||||
var respectManual = prior == id;
|
||||
NewGearsetId = id;
|
||||
Reduce(data.Objects[0], state, set, respectManual, job != state.LastJob);
|
||||
NewGearsetId = -1;
|
||||
foreach (var actor in data.Objects)
|
||||
_state.ReapplyState(actor);
|
||||
}
|
||||
|
||||
public static unsafe bool CheckGearset(short check)
|
||||
{
|
||||
if (NewGearsetId != -1)
|
||||
return check == NewGearsetId;
|
||||
|
||||
var module = RaptureGearsetModule.Instance();
|
||||
if (module == null)
|
||||
return false;
|
||||
|
||||
return check == module->CurrentGearsetIndex;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,6 +306,7 @@ public class AutoDesignManager : ISavable, IReadOnlyList<AutoDesignSet>, IDispos
|
|||
return;
|
||||
|
||||
var design = set.Designs[which];
|
||||
|
||||
if (design.Jobs.Id == jobs.Id)
|
||||
return;
|
||||
|
||||
|
|
@ -316,6 +317,22 @@ public class AutoDesignManager : ISavable, IReadOnlyList<AutoDesignSet>, IDispos
|
|||
_event.Invoke(AutomationChanged.Type.ChangedConditions, set, (which, old, jobs));
|
||||
}
|
||||
|
||||
public void ChangeGearsetCondition(AutoDesignSet set, int which, short index)
|
||||
{
|
||||
if (which >= set.Designs.Count || which < 0)
|
||||
return;
|
||||
|
||||
var design = set.Designs[which];
|
||||
if (design.GearsetIndex == index)
|
||||
return;
|
||||
|
||||
var old = design.GearsetIndex;
|
||||
design.GearsetIndex = index;
|
||||
Save();
|
||||
Glamourer.Log.Debug($"Changed gearset condition from {old} to {index} for associated design {which + 1} in design set.");
|
||||
_event.Invoke(AutomationChanged.Type.ChangedConditions, set, (which, old, index));
|
||||
}
|
||||
|
||||
public void ChangeApplicationType(AutoDesignSet set, int which, AutoDesign.Type type)
|
||||
{
|
||||
if (which >= set.Designs.Count || which < 0)
|
||||
|
|
@ -338,10 +355,8 @@ public class AutoDesignManager : ISavable, IReadOnlyList<AutoDesignSet>, IDispos
|
|||
|
||||
public void Save(StreamWriter writer)
|
||||
{
|
||||
using var j = new JsonTextWriter(writer)
|
||||
{
|
||||
Formatting = Formatting.Indented,
|
||||
};
|
||||
using var j = new JsonTextWriter(writer);
|
||||
j.Formatting = Formatting.Indented;
|
||||
Serialize().WriteTo(j);
|
||||
}
|
||||
|
||||
|
|
@ -456,13 +471,16 @@ public class AutoDesignManager : ISavable, IReadOnlyList<AutoDesignSet>, IDispos
|
|||
{
|
||||
if (designIdentifier.Length == 0)
|
||||
{
|
||||
Glamourer.Messager.NotificationMessage($"Error parsing automatically applied design for set {setName}: No design specified.", NotificationType.Warning);
|
||||
Glamourer.Messager.NotificationMessage($"Error parsing automatically applied design for set {setName}: No design specified.",
|
||||
NotificationType.Warning);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!Guid.TryParse(designIdentifier, out var guid))
|
||||
{
|
||||
Glamourer.Messager.NotificationMessage($"Error parsing automatically applied design for set {setName}: {designIdentifier} is not a valid GUID.", NotificationType.Warning);
|
||||
Glamourer.Messager.NotificationMessage(
|
||||
$"Error parsing automatically applied design for set {setName}: {designIdentifier} is not a valid GUID.",
|
||||
NotificationType.Warning);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
@ -471,7 +489,8 @@ public class AutoDesignManager : ISavable, IReadOnlyList<AutoDesignSet>, IDispos
|
|||
if (design == null)
|
||||
{
|
||||
Glamourer.Messager.NotificationMessage(
|
||||
$"Error parsing automatically applied design for set {setName}: The specified design {guid} does not exist.", NotificationType.Warning);
|
||||
$"Error parsing automatically applied design for set {setName}: The specified design {guid} does not exist.",
|
||||
NotificationType.Warning);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -483,24 +502,31 @@ public class AutoDesignManager : ISavable, IReadOnlyList<AutoDesignSet>, IDispos
|
|||
Design = design,
|
||||
ApplicationType = applicationType & AutoDesign.Type.All,
|
||||
};
|
||||
return ParseConditions(setName, jObj, ret) ? ret : null;
|
||||
}
|
||||
|
||||
private bool ParseConditions(string setName, JObject jObj, AutoDesign ret)
|
||||
{
|
||||
var conditions = jObj["Conditions"];
|
||||
if (conditions == null)
|
||||
return ret;
|
||||
return true;
|
||||
|
||||
var jobs = conditions["JobGroup"]?.ToObject<int>() ?? -1;
|
||||
if (jobs >= 0)
|
||||
{
|
||||
if (!_jobs.JobGroups.TryGetValue((ushort)jobs, out var jobGroup))
|
||||
{
|
||||
Glamourer.Messager.NotificationMessage($"Error parsing automatically applied design for set {setName}: The job condition {jobs} does not exist.", NotificationType.Warning);
|
||||
return null;
|
||||
Glamourer.Messager.NotificationMessage(
|
||||
$"Error parsing automatically applied design for set {setName}: The job condition {jobs} does not exist.",
|
||||
NotificationType.Warning);
|
||||
return false;
|
||||
}
|
||||
|
||||
ret.Jobs = jobGroup;
|
||||
}
|
||||
|
||||
return ret;
|
||||
ret.GearsetIndex = conditions["Gearset"]?.ToObject<short>() ?? -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void Save()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue