using Obvious.Soap; using UFS3; using UnityEngine; using UnityEngine.Rendering.HighDefinition; public class TentController : MonoBehaviourExtended { [SerializeField] private GameObjectVariable player; [SerializeField] private ScriptableEventNoParam OnTeleport; [SerializeField] private ScriptableEventItemData OnItemPlaced; [SerializeField] private GameObjectVariable eyeObject; [SerializeField] private GameObjectVariable placementCamGameObject; [SerializeField] private float eulerY; [OwnComponent(0)] private Collider collider; [OwnComponent(0)] private MeshRenderer meshRenderer; public Transform spawnerPoint; private BaseItemData itemData; private bool isPlacing = true; private bool canPutOnGround; public BaseItemData ItemData { set { itemData = value; } } private void Start() { EulerYUpdate(eulerY); } private void OnEnable() { OnTeleport.OnRaised += OnTeleport_OnRaised; } private void OnTeleport_OnRaised() { player.Value.transform.SetPositionAndRotation(spawnerPoint.position, Quaternion.identity); } private void OnDisable() { OnTeleport.OnRaised -= OnTeleport_OnRaised; } private void EulerYUpdate(float val) { Vector3 localEulerAngles = base.transform.localEulerAngles; localEulerAngles.y = val; base.transform.localEulerAngles = localEulerAngles; } private void Update() { if (isPlacing) { float num = 90f * Time.deltaTime; if (Input.GetKey(KeyCode.Q)) { eulerY += num; EulerYUpdate(eulerY); } if (Input.GetKey(KeyCode.E)) { eulerY -= num; EulerYUpdate(eulerY); } if (Input.GetKeyDown(KeyCode.F) && canPutOnGround) { isPlacing = false; base.transform.parent = null; meshRenderer.material.SetFloat("_SurfaceType", 0f); meshRenderer.material.SetColor("_BaseColor", new Color(1f, 1f, 1f, 1f)); HDMaterial.ValidateMaterial(meshRenderer.material); OnItemPlaced.Raise(itemData); } } } private void FixedUpdate() { if (!isPlacing) { return; } Vector3 position = eyeObject.Value.transform.position; Vector3 forward = placementCamGameObject.Value.transform.forward; canPutOnGround = false; if (Physics.Raycast(position, forward, out var hitInfo, 5f, LayerMask.GetMask("Terrain"))) { base.transform.position = hitInfo.point; base.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal); EulerYUpdate(eulerY); if (Physics.OverlapBox(position, collider.bounds.extents / 2f, base.transform.rotation, LayerMask.GetMask("Terrain")).Length != 0) { meshRenderer.material.SetColor("_BaseColor", new Color(1f, 0f, 0f, 0.5f)); return; } meshRenderer.material.SetColor("_BaseColor", new Color(0f, 1f, 0f, 0.5f)); canPutOnGround = true; } else { base.transform.position = position; meshRenderer.material.SetColor("_BaseColor", new Color(0f, 0f, 0f, 0.5f)); } } }