using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using BinaryPack.Attributes;
using NitroxModel.DataStructures.GameLogic.Entities.Metadata;
using NitroxModel.DataStructures.Unity;
using ProtoBufNet;
namespace NitroxModel.DataStructures.GameLogic.Entities
{
/*
* A world entity is an object physically in the world with a transform. It is either a global root entity
* or something that phases out with the clip map manager.
*/
[Serializable]
[DataContract]
[ProtoInclude(50, typeof(PlaceholderGroupWorldEntity))]
[ProtoInclude(51, typeof(CellRootEntity))]
[ProtoInclude(52, typeof(GlobalRootEntity))]
[ProtoInclude(53, typeof(OxygenPipeEntity))]
[ProtoInclude(54, typeof(PlacedWorldEntity))]
[ProtoInclude(55, typeof(SerializedWorldEntity))]
[ProtoInclude(56, typeof(PrefabPlaceholderEntity))]
[ProtoInclude(57, typeof(GeyserWorldEntity))]
[ProtoInclude(58, typeof(ReefbackEntity))]
[ProtoInclude(59, typeof(ReefbackChildEntity))]
[ProtoInclude(60, typeof(CreatureRespawnEntity))]
public class WorldEntity : Entity
{
public virtual AbsoluteEntityCell AbsoluteEntityCell => new(Transform.Position, Level);
[DataMember(Order = 1)]
public NitroxTransform Transform { get; set; }
[DataMember(Order = 2)]
public int Level { get; set; }
///
/// Gets the prefab class id assigned by Unity Engine. This is a unique .
///
///
/// What is a prefab?
///
[DataMember(Order = 3)]
public string ClassId { get; set; }
///
/// Keeps track if an entity was spawned by the server or a player
/// Server-spawned entities need to be techType white-listed to be simulated
///
[DataMember(Order = 4)]
public bool SpawnedByServer;
[IgnoreConstructor]
protected WorldEntity()
{
// Constructor for serialization. Has to be "protected" for json serialization.
}
public WorldEntity(NitroxVector3 localPosition, NitroxQuaternion localRotation, NitroxVector3 scale, NitroxTechType techType, int level, string classId, bool spawnedByServer, NitroxId id, Entity parentEntity)
{
Transform = new NitroxTransform(localPosition, localRotation, scale);
TechType = techType;
Id = id;
Level = level;
ClassId = classId;
SpawnedByServer = spawnedByServer;
if (parentEntity != null)
{
ParentId = parentEntity.Id;
if (parentEntity is WorldEntity weParent)
{
Transform.SetParent(weParent.Transform, false);
}
}
}
/// Used for deserialization
public WorldEntity(NitroxTransform transform, int level, string classId, bool spawnedByServer, NitroxId id, NitroxTechType techType, EntityMetadata metadata, NitroxId parentId, List childEntities)
{
Id = id;
TechType = techType;
Metadata = metadata;
ParentId = parentId;
Transform = transform;
ChildEntities = childEntities;
Level = level;
ClassId = classId;
SpawnedByServer = spawnedByServer;
}
public override string ToString()
{
return $"[{GetType().Name} Transform: {Transform} Level: {Level} ClassId: {ClassId} SpawnedByServer: {SpawnedByServer} {base.ToString()}]";
}
}
}