first commit

This commit is contained in:
2025-07-06 00:23:46 +02:00
commit 38f50c8819
1788 changed files with 112878 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
using System.Collections;
using NitroxModel.DataStructures.GameLogic.Entities;
using NitroxModel.DataStructures.Util;
using NitroxModel_Subnautica.DataStructures;
using UnityEngine;
namespace NitroxClient.GameLogic.Spawning.WorldEntities;
public class PrefabPlaceholderEntitySpawner : IWorldEntitySpawner, IWorldEntitySyncSpawner
{
private readonly DefaultWorldEntitySpawner defaultEntitySpawner;
public PrefabPlaceholderEntitySpawner(DefaultWorldEntitySpawner defaultEntitySpawner)
{
this.defaultEntitySpawner = defaultEntitySpawner;
}
public IEnumerator SpawnAsync(WorldEntity entity, Optional<GameObject> parent, EntityCell cellRoot, TaskResult<Optional<GameObject>> result)
{
if (!VerifyCanSpawnOrError(entity, parent, out PrefabPlaceholder placeholder))
{
yield break;
}
yield return defaultEntitySpawner.SpawnAsync(entity, placeholder.transform.parent.gameObject, cellRoot, result);
if (!result.value.HasValue)
{
yield break;
}
SetupObject(entity, result.value.Value);
}
public bool SpawnsOwnChildren() => false;
public bool SpawnSync(WorldEntity entity, Optional<GameObject> parent, EntityCell cellRoot, TaskResult<Optional<GameObject>> result)
{
if (!VerifyCanSpawnOrError(entity, parent, out PrefabPlaceholder placeholder))
{
return true;
}
if (!defaultEntitySpawner.SpawnSync(entity, placeholder.transform.parent.gameObject, cellRoot, result))
{
return false;
}
SetupObject(entity, result.value.Value);
return true;
}
private bool VerifyCanSpawnOrError(WorldEntity entity, Optional<GameObject> parent, out PrefabPlaceholder placeholder)
{
if (entity is PrefabPlaceholderEntity prefabEntity &&
parent.Value && parent.Value.TryGetComponent(out PrefabPlaceholdersGroup group))
{
placeholder = group.prefabPlaceholders[prefabEntity.ComponentIndex];
return true;
}
Log.Error($"[{nameof(PrefabPlaceholderEntitySpawner)}] Can't find a {nameof(PrefabPlaceholdersGroup)} on parent for {entity.Id}");
placeholder = null;
return false;
}
private void SetupObject(WorldEntity entity, GameObject gameObject)
{
gameObject.transform.localPosition = entity.Transform.LocalPosition.ToUnity();
gameObject.transform.localRotation = entity.Transform.LocalRotation.ToUnity();
gameObject.transform.localScale = entity.Transform.LocalScale.ToUnity();
}
}