using NitroxClient.Unity.Helper;
using NitroxModel.DataStructures.GameLogic.Entities.Metadata.Bases;
using NitroxModel_Subnautica.DataStructures;
using UnityEngine;
namespace NitroxClient.GameLogic.Bases;
///
/// Because of the multiple possible types for Ghost components, the retrieving of their metadata is inappropriate for the MetadataExtractor system
///
public static class GhostMetadataRetriever
{
public static GhostMetadata GetMetadataForGhost(BaseGhost baseGhost)
{
// Specific case in which a piece was deconstructed and resulted in a BaseDeconstructable with a normal BaseGhost
if (BuildUtils.IsUnderBaseDeconstructable(baseGhost, true))
{
return GetBaseDeconstructableMetadata(baseGhost);
}
GhostMetadata metadata = baseGhost switch
{
BaseAddWaterPark or BaseAddPartitionDoorGhost or BaseAddModuleGhost or BaseAddFaceGhost => baseGhost.GetBaseAnchoredFaceMetadata(),
BaseAddPartitionGhost => baseGhost.GetBaseAnchoredCellMetadata(),
_ => baseGhost.GetMetadata(),
};
return metadata;
}
public static T GetMetadata(this BaseGhost baseGhost) where T : GhostMetadata, new()
{
T metadata = new()
{
TargetOffset = baseGhost.targetOffset.ToDto()
};
return metadata;
}
public static BaseDeconstructableGhostMetadata GetBaseDeconstructableMetadata(this BaseGhost baseGhost)
{
BaseDeconstructableGhostMetadata metadata = baseGhost.GetMetadata();
if (baseGhost.TryGetComponentInParent(out ConstructableBase constructableBase, true) && constructableBase.moduleFace.HasValue)
{
Base.Face moduleFace = constructableBase.moduleFace.Value;
metadata.ModuleFace = moduleFace.ToDto();
moduleFace.cell += baseGhost.targetBase.GetAnchor();
Component baseModule = baseGhost.targetBase.GetModule(moduleFace).AliveOrNull();
if (baseModule && baseModule.TryGetComponent(out PrefabIdentifier identifier))
{
metadata.ClassId = identifier.ClassId;
}
}
return metadata;
}
public static BaseAnchoredFaceGhostMetadata GetBaseAnchoredFaceMetadata(this BaseGhost baseGhost)
{
BaseAnchoredFaceGhostMetadata metadata = baseGhost.GetMetadata();
metadata.AnchoredFace = baseGhost switch
{
BaseAddWaterPark ghost => ghost.anchoredFace?.ToDto(),
BaseAddPartitionDoorGhost ghost => ghost.anchoredFace?.ToDto(),
BaseAddModuleGhost ghost => ghost.anchoredFace?.ToDto(),
BaseAddFaceGhost ghost => ghost.anchoredFace?.ToDto(),
_ => null
};
return metadata;
}
public static BaseAnchoredCellGhostMetadata GetBaseAnchoredCellMetadata(this BaseGhost baseGhost)
{
BaseAnchoredCellGhostMetadata metadata = baseGhost.GetMetadata();
if (baseGhost is BaseAddPartitionGhost ghost && ghost.anchoredCell.HasValue)
{
metadata.AnchoredCell = ghost.anchoredCell.Value.ToDto();
}
return metadata;
}
}