Add support for ActorIdentifier.FromUserString returning multiple identifiers.

This commit is contained in:
Ottermandias 2023-10-03 01:42:28 +02:00
parent 3d2ce1f4bb
commit e5427858e0
2 changed files with 64 additions and 52 deletions

View file

@ -21,7 +21,7 @@ public class CommandHandler : IDisposable
private readonly ICommandManager _commandManager; private readonly ICommandManager _commandManager;
private readonly RedrawService _redrawService; private readonly RedrawService _redrawService;
private readonly IChatGui _chat; private readonly IChatGui _chat;
private readonly Configuration _config; private readonly Configuration _config;
private readonly ConfigWindow _configWindow; private readonly ConfigWindow _configWindow;
private readonly ActorManager _actors; private readonly ActorManager _actors;
@ -30,7 +30,8 @@ public class CommandHandler : IDisposable
private readonly Penumbra _penumbra; private readonly Penumbra _penumbra;
private readonly CollectionEditor _collectionEditor; private readonly CollectionEditor _collectionEditor;
public CommandHandler(IFramework framework, ICommandManager commandManager, IChatGui chat, RedrawService redrawService, Configuration config, public CommandHandler(IFramework framework, ICommandManager commandManager, IChatGui chat, RedrawService redrawService,
Configuration config,
ConfigWindow configWindow, ModManager modManager, CollectionManager collectionManager, ActorService actors, Penumbra penumbra, ConfigWindow configWindow, ModManager modManager, CollectionManager collectionManager, ActorService actors, Penumbra penumbra,
CollectionEditor collectionEditor) CollectionEditor collectionEditor)
{ {
@ -270,7 +271,7 @@ public class CommandHandler : IDisposable
if (!GetModCollection(split[1], out var collection)) if (!GetModCollection(split[1], out var collection))
return false; return false;
var identifier = ActorIdentifier.Invalid; var identifiers = Array.Empty<ActorIdentifier>();
if (type is CollectionType.Individual) if (type is CollectionType.Individual)
{ {
if (split.Length == 2) if (split.Length == 2)
@ -284,17 +285,22 @@ public class CommandHandler : IDisposable
{ {
if (_redrawService.GetName(split[2].ToLowerInvariant(), out var obj)) if (_redrawService.GetName(split[2].ToLowerInvariant(), out var obj))
{ {
identifier = _actors.FromObject(obj, false, true, true); var identifier = _actors.FromObject(obj, false, true, true);
if (!identifier.IsValid) if (!identifier.IsValid)
{ {
_chat.Print(new SeStringBuilder().AddText("The placeholder ").AddGreen(split[2]) _chat.Print(new SeStringBuilder().AddText("The placeholder ").AddGreen(split[2])
.AddText(" did not resolve to a game object with a valid identifier.").BuiltString); .AddText(" did not resolve to a game object with a valid identifier.").BuiltString);
return false; return false;
} }
identifiers = new[]
{
identifier,
};
} }
else else
{ {
identifier = _actors.FromUserString(split[2]); identifiers = _actors.FromUserString(split[2], false);
} }
} }
catch (ActorManager.IdentifierParseError e) catch (ActorManager.IdentifierParseError e)
@ -306,55 +312,60 @@ public class CommandHandler : IDisposable
} }
} }
var oldCollection = _collectionManager.Active.ByType(type, identifier); var anySuccess = false;
if (collection == oldCollection) foreach (var identifier in identifiers.Distinct())
{ {
_chat.Print(collection == null var oldCollection = _collectionManager.Active.ByType(type, identifier);
? $"The {type.ToName()} Collection{(identifier.IsValid ? $" for {identifier}" : string.Empty)} is already unassigned" if (collection == oldCollection)
: $"{collection.Name} already is the {type.ToName()} Collection{(identifier.IsValid ? $" for {identifier}." : ".")}"); {
return false; _chat.Print(collection == null
? $"The {type.ToName()} Collection{(identifier.IsValid ? $" for {identifier}" : string.Empty)} is already unassigned"
: $"{collection.Name} already is the {type.ToName()} Collection{(identifier.IsValid ? $" for {identifier}." : ".")}");
continue;
}
var individualIndex = _collectionManager.Active.Individuals.Index(identifier);
if (oldCollection == null)
{
if (type.IsSpecial())
{
_collectionManager.Active.CreateSpecialCollection(type);
}
else if (identifier.IsValid)
{
var identifierGroup = _collectionManager.Active.Individuals.GetGroup(identifier);
individualIndex = _collectionManager.Active.Individuals.Count;
_collectionManager.Active.CreateIndividualCollection(identifierGroup);
}
}
else if (collection == null)
{
if (type.IsSpecial())
{
_collectionManager.Active.RemoveSpecialCollection(type);
}
else if (individualIndex >= 0)
{
_collectionManager.Active.RemoveIndividualCollection(individualIndex);
}
else
{
_chat.Print(
$"Can not remove the {type.ToName()} Collection assignment {(identifier.IsValid ? $" for {identifier}." : ".")}");
continue;
}
Print(
$"Removed {oldCollection.Name} as {type.ToName()} Collection assignment {(identifier.IsValid ? $" for {identifier}." : ".")}");
anySuccess = true;
}
_collectionManager.Active.SetCollection(collection!, type, individualIndex);
Print($"Assigned {collection!.Name} as {type.ToName()} Collection{(identifier.IsValid ? $" for {identifier}." : ".")}");
} }
var individualIndex = _collectionManager.Active.Individuals.Index(identifier); return anySuccess;
if (oldCollection == null)
{
if (type.IsSpecial())
{
_collectionManager.Active.CreateSpecialCollection(type);
}
else if (identifier.IsValid)
{
var identifiers = _collectionManager.Active.Individuals.GetGroup(identifier);
individualIndex = _collectionManager.Active.Individuals.Count;
_collectionManager.Active.CreateIndividualCollection(identifiers);
}
}
else if (collection == null)
{
if (type.IsSpecial())
{
_collectionManager.Active.RemoveSpecialCollection(type);
}
else if (individualIndex >= 0)
{
_collectionManager.Active.RemoveIndividualCollection(individualIndex);
}
else
{
_chat.Print(
$"Can not remove the {type.ToName()} Collection assignment {(identifier.IsValid ? $" for {identifier}." : ".")}");
return false;
}
Print(
$"Removed {oldCollection.Name} as {type.ToName()} Collection assignment {(identifier.IsValid ? $" for {identifier}." : ".")}");
return true;
}
_collectionManager.Active.SetCollection(collection!, type, individualIndex);
Print($"Assigned {collection!.Name} as {type.ToName()} Collection{(identifier.IsValid ? $" for {identifier}." : ".")}");
return true;
} }
private bool SetMod(string arguments) private bool SetMod(string arguments)

View file

@ -60,7 +60,8 @@ public unsafe class MetaState : IDisposable
private DisposableContainer _characterBaseCreateMetaChanges = DisposableContainer.Empty; private DisposableContainer _characterBaseCreateMetaChanges = DisposableContainer.Empty;
public MetaState(PerformanceTracker performance, CommunicatorService communicator, CollectionResolver collectionResolver, public MetaState(PerformanceTracker performance, CommunicatorService communicator, CollectionResolver collectionResolver,
ResourceLoader resources, GameEventManager gameEventManager, CharacterUtility characterUtility, Configuration config, IGameInteropProvider interop) ResourceLoader resources, GameEventManager gameEventManager, CharacterUtility characterUtility, Configuration config,
IGameInteropProvider interop)
{ {
_performance = performance; _performance = performance;
_communicator = communicator; _communicator = communicator;