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; } }