using System;
using System.Collections;
using NitroxClient.MonoBehaviours;
using NitroxClient.MonoBehaviours.Overrides;
using NitroxModel.DataStructures;
using UnityEngine;
namespace NitroxClient.GameLogic.Spawning.Bases;
public static class BuildingPostSpawner
{
public static IEnumerator ApplyPostSpawner(GameObject gameObject, NitroxId objectId)
{
// If we end up having more than 2-3 ifs in here in the future, create a PostSpawner generic class with detection of the required components from gameObject
if (gameObject.TryGetComponent(out Constructable constructable) && constructable.techType.Equals(TechType.Bench))
{
SetupBench(constructable.gameObject, objectId);
return null;
}
else if (gameObject.TryGetComponent(out WaterPark waterPark))
{
SetupWaterPark(waterPark, objectId);
return null;
}
return null;
}
private const int LAYER_USEABLE = 13;
///
/// For better immersion we split the Bench in three parts (left/center/right). On each can sit one player.
///
public static void SetupBench(GameObject gameObject, NitroxId benchId)
{
if (!gameObject.TryGetComponent(out Bench bench))
{
Log.Error($"[{nameof(BuildingPostSpawner)}] Could not find {nameof(Bench)} on {gameObject.name}");
return;
}
try
{
GameObject benchTileLeft = new("BenchPlaceLeft") { layer = LAYER_USEABLE };
benchTileLeft.transform.SetParent(gameObject.transform, false);
benchTileLeft.transform.localPosition -= new Vector3(0.75f, 0, 0);
BoxCollider benchTileLeftCollider = benchTileLeft.AddComponent();
benchTileLeftCollider.center = new Vector3(0, 0.25f, 0);
benchTileLeftCollider.size = new Vector3(0.85f, 0.5f, 0.65f);
benchTileLeftCollider.isTrigger = true;
GameObject benchTileCenter = new("BenchPlaceCenter") { layer = LAYER_USEABLE };
benchTileCenter.transform.SetParent(gameObject.transform, false);
BoxCollider benchTileCenterCollider = benchTileCenter.AddComponent();
benchTileCenterCollider.center = new Vector3(0, 0.25f, 0);
benchTileCenterCollider.size = new Vector3(0.7f, 0.5f, 0.65f);
benchTileCenterCollider.isTrigger = true;
GameObject benchTileRight = new("BenchPlaceRight") { layer = LAYER_USEABLE };
benchTileRight.transform.SetParent(gameObject.transform, false);
benchTileRight.transform.localPosition += new Vector3(0.75f, 0, 0);
BoxCollider benchTileRightCollider = benchTileRight.AddComponent();
benchTileRightCollider.center = new Vector3(0, 0.25f, 0);
benchTileRightCollider.size = new Vector3(0.85f, 0.5f, 0.65f);
benchTileRightCollider.isTrigger = true;
GameObject animationRoot = gameObject.FindChild("bench_animation");
MultiplayerBench.FromBench(bench, benchTileLeft, MultiplayerBench.Side.LEFT, animationRoot);
MultiplayerBench.FromBench(bench, benchTileCenter, MultiplayerBench.Side.CENTER, animationRoot);
MultiplayerBench.FromBench(bench, benchTileRight, MultiplayerBench.Side.RIGHT, animationRoot);
NitroxId benchLeftId = benchId.Increment();
NitroxId benchCenterId = benchLeftId.Increment();
NitroxId benchRightId = benchCenterId.Increment();
NitroxEntity.SetNewId(benchTileLeft, benchLeftId);
NitroxEntity.SetNewId(benchTileCenter, benchCenterId);
NitroxEntity.SetNewId(benchTileRight, benchRightId);
UnityEngine.Object.Destroy(bench);
UnityEngine.Object.Destroy(gameObject.FindChild("Builder Trigger"));
}
catch (Exception ex)
{
Log.Error(ex);
}
}
public static void SetupWaterPark(WaterPark waterPark, NitroxId waterParkId)
{
if (waterPark is LargeRoomWaterPark largeRoomWaterPark)
{
NitroxId leftId = waterParkId.Increment();
NitroxId rightId = leftId.Increment();
NitroxEntity.SetNewId(largeRoomWaterPark.planters.leftPlanter.gameObject, leftId);
NitroxEntity.SetNewId(largeRoomWaterPark.planters.rightPlanter.gameObject, rightId);
return;
}
NitroxId planterId = waterParkId.Increment();
NitroxEntity.SetNewId(waterPark.planter.gameObject, planterId);
}
}