mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-18 13:57:46 +01:00
Make Resource Trees honor Incognito Mode
This commit is contained in:
parent
a6661f15e8
commit
f4bdbcac53
13 changed files with 123 additions and 75 deletions
|
|
@ -15,6 +15,7 @@ namespace Penumbra.Interop.ResourceTree;
|
|||
public class ResourceTree
|
||||
{
|
||||
public readonly string Name;
|
||||
public readonly string AnonymizedName;
|
||||
public readonly int GameObjectIndex;
|
||||
public readonly nint GameObjectAddress;
|
||||
public readonly nint DrawObjectAddress;
|
||||
|
|
@ -22,6 +23,7 @@ public class ResourceTree
|
|||
public readonly bool PlayerRelated;
|
||||
public readonly bool Networked;
|
||||
public readonly string CollectionName;
|
||||
public readonly string AnonymizedCollectionName;
|
||||
public readonly List<ResourceNode> Nodes;
|
||||
public readonly HashSet<ResourceNode> FlatNodes;
|
||||
|
||||
|
|
@ -29,18 +31,20 @@ public class ResourceTree
|
|||
public CustomizeData CustomizeData;
|
||||
public GenderRace RaceCode;
|
||||
|
||||
public ResourceTree(string name, int gameObjectIndex, nint gameObjectAddress, nint drawObjectAddress, bool localPlayerRelated, bool playerRelated, bool networked, string collectionName)
|
||||
public ResourceTree(string name, string anonymizedName, int gameObjectIndex, nint gameObjectAddress, nint drawObjectAddress, bool localPlayerRelated, bool playerRelated, bool networked, string collectionName, string anonymizedCollectionName)
|
||||
{
|
||||
Name = name;
|
||||
GameObjectIndex = gameObjectIndex;
|
||||
GameObjectAddress = gameObjectAddress;
|
||||
DrawObjectAddress = drawObjectAddress;
|
||||
LocalPlayerRelated = localPlayerRelated;
|
||||
Networked = networked;
|
||||
PlayerRelated = playerRelated;
|
||||
CollectionName = collectionName;
|
||||
Nodes = new List<ResourceNode>();
|
||||
FlatNodes = new HashSet<ResourceNode>();
|
||||
Name = name;
|
||||
AnonymizedName = anonymizedName;
|
||||
GameObjectIndex = gameObjectIndex;
|
||||
GameObjectAddress = gameObjectAddress;
|
||||
DrawObjectAddress = drawObjectAddress;
|
||||
LocalPlayerRelated = localPlayerRelated;
|
||||
Networked = networked;
|
||||
PlayerRelated = playerRelated;
|
||||
CollectionName = collectionName;
|
||||
AnonymizedCollectionName = anonymizedCollectionName;
|
||||
Nodes = new List<ResourceNode>();
|
||||
FlatNodes = new HashSet<ResourceNode>();
|
||||
}
|
||||
|
||||
public void ProcessPostfix(Action<ResourceNode, ResourceNode?> action)
|
||||
|
|
|
|||
|
|
@ -72,10 +72,10 @@ public class ResourceTreeFactory(
|
|||
return null;
|
||||
|
||||
var localPlayerRelated = cache.IsLocalPlayerRelated(character);
|
||||
var (name, related) = GetCharacterName(character, cache);
|
||||
var (name, anonymizedName, related) = GetCharacterName(character);
|
||||
var networked = character.ObjectId != Dalamud.Game.ClientState.Objects.Types.GameObject.InvalidGameObjectId;
|
||||
var tree = new ResourceTree(name, character.ObjectIndex, (nint)gameObjStruct, (nint)drawObjStruct, localPlayerRelated, related,
|
||||
networked, collectionResolveData.ModCollection.Name);
|
||||
var tree = new ResourceTree(name, anonymizedName, character.ObjectIndex, (nint)gameObjStruct, (nint)drawObjStruct, localPlayerRelated, related,
|
||||
networked, collectionResolveData.ModCollection.Name, collectionResolveData.ModCollection.AnonymizedName);
|
||||
var globalContext = new GlobalResolveContext(identifier, collectionResolveData.ModCollection,
|
||||
cache, (flags & Flags.WithUiData) != 0);
|
||||
using (var _ = pathState.EnterInternalResolve())
|
||||
|
|
@ -157,27 +157,30 @@ public class ResourceTreeFactory(
|
|||
}
|
||||
}
|
||||
|
||||
private unsafe (string Name, bool PlayerRelated) GetCharacterName(Dalamud.Game.ClientState.Objects.Types.Character character,
|
||||
TreeBuildCache cache)
|
||||
private unsafe (string Name, string AnonymizedName, bool PlayerRelated) GetCharacterName(Dalamud.Game.ClientState.Objects.Types.Character character)
|
||||
{
|
||||
var identifier = actors.FromObject((GameObject*)character.Address, out var owner, true, false, false);
|
||||
switch (identifier.Type)
|
||||
{
|
||||
case IdentifierType.Player: return (identifier.PlayerName.ToString(), true);
|
||||
case IdentifierType.Owned:
|
||||
var ownerChara = objects.Objects.CreateObjectReference(owner) as Dalamud.Game.ClientState.Objects.Types.Character;
|
||||
if (ownerChara != null)
|
||||
{
|
||||
var ownerName = GetCharacterName(ownerChara, cache);
|
||||
return ($"[{ownerName.Name}] {character.Name} ({identifier.Kind.ToName()})", ownerName.PlayerRelated);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return ($"{character.Name} ({identifier.Kind.ToName()})", false);
|
||||
var identifierStr = identifier.ToString();
|
||||
return (identifierStr, identifier.Incognito(identifierStr), IsPlayerRelated(identifier, owner));
|
||||
}
|
||||
|
||||
private unsafe bool IsPlayerRelated(Dalamud.Game.ClientState.Objects.Types.Character? character)
|
||||
{
|
||||
if (character == null)
|
||||
return false;
|
||||
|
||||
var identifier = actors.FromObject((GameObject*)character.Address, out var owner, true, false, false);
|
||||
return IsPlayerRelated(identifier, owner);
|
||||
}
|
||||
|
||||
private bool IsPlayerRelated(ActorIdentifier identifier, Actor owner)
|
||||
=> identifier.Type switch
|
||||
{
|
||||
IdentifierType.Player => true,
|
||||
IdentifierType.Owned => IsPlayerRelated(objects.Objects.CreateObjectReference(owner) as Dalamud.Game.ClientState.Objects.Types.Character),
|
||||
_ => false,
|
||||
};
|
||||
|
||||
[Flags]
|
||||
public enum Flags
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue