using UnityEngine; using System; public class BuildController : MonoBehaviour { private PlayerController playerController; private BlockDictionary blockDictionary; LineRenderer dirLine; public Material lineMat; public GameObject builtObjects; public void Start() { playerController = GetComponent(); blockDictionary = GetComponent(); builtObjects = GameObject.Find("Built_Objects"); } public void Update() { //PLACING BLOCKS if (playerController.building == true) { playerController.buildTimer += 1 * Time.deltaTime; if (playerController.buildTimer >= 30) { if (GameObject.Find("GameManager").GetComponent().working == false) { playerController.stoppingBuildCoRoutine = true; GameObject.Find("GameManager").GetComponent().CombineBlocks(); playerController.separatedBlocks = false; playerController.destroyTimer = 0; playerController.buildTimer = 0; playerController.building = false; playerController.destroying = false; } else { playerController.requestedBuildingStop = true; } } if (playerController.separatedBlocks == false) { if (GameObject.Find("GameManager").GetComponent().working == false) { GameObject.Find("GameManager").GetComponent().SeparateBlocks(transform.position, "all", true); playerController.separatedBlocks = true; } else { playerController.requestedChunkLoad = true; } playerController.buildStartPosition = transform.position; } else { float distance = Vector3.Distance(transform.position, playerController.buildStartPosition); if (distance > 15) { //Debug.Log("new chunk loaded"); if (GameObject.Find("GameManager").GetComponent().working == false) { GameObject.Find("GameManager").GetComponent().SeparateBlocks(transform.position, "all", true); playerController.separatedBlocks = true; } else { playerController.requestedChunkLoad = true; } playerController.buildStartPosition = transform.position; } } if (playerController.buildObject == null) { CreateBuildObject(); } else { if (Physics.Raycast(Camera.main.gameObject.transform.position, Camera.main.gameObject.transform.forward, out RaycastHit hit, 100)) { //LIMIT THE BUILD RANGE TO 40 float distance = Vector3.Distance(transform.position, playerController.buildObject.transform.position); if (distance > 40) { playerController.buildObject.GetComponent().material.color = Color.red; } else { playerController.buildObject.GetComponent().material.color = Color.white; } if (hit.transform.gameObject.tag == "Built") { //BLOCK ROTATION if (cInput.GetKeyDown("Rotate Block")) { playerController.buildObject.transform.Rotate(transform.up * 90); playerController.destroyTimer = 0; playerController.buildTimer = 0; } //BUILD AXIS if (cInput.GetKeyDown("Build Axis")) { ChangeBuildAxis(); } SetupBuildAxis(hit); } else { SetupFreePlacement(hit); } } if (Physics.Raycast(Camera.main.gameObject.transform.position, Camera.main.gameObject.transform.forward, out RaycastHit buildHit, 40)) { if (buildHit.collider.gameObject.tag != "CombinedMesh") { playerController.buildObject.GetComponent().material.color = Color.white; if (cInput.GetKeyDown("Place Object")) { if (blockDictionary.machineDictionary.ContainsKey(playerController.buildType)) { BuildMachine(playerController.buildType, hit); } else { BuildBlock(playerController.buildType); } } } else { playerController.buildObject.GetComponent().material.color = Color.red; if (GameObject.Find("GameManager").GetComponent().working == false) { GameObject.Find("GameManager").GetComponent().SeparateBlocks(buildHit.point, "all", true); } } } } } else if (playerController.buildObject != null) { Destroy(playerController.buildObject); } } private void CreateBuildObject() { playerController.buildObject = GameObject.CreatePrimitive(PrimitiveType.Cube); playerController.buildObject.transform.localScale = new Vector3(5, 5, 5); playerController.buildObject.transform.position = Camera.main.gameObject.transform.position + Camera.main.gameObject.transform.forward * 5; playerController.buildObject.GetComponent().material = playerController.constructionMat; playerController.buildObject.GetComponent().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; Destroy(playerController.buildObject.GetComponent()); dirLine = playerController.buildObject.AddComponent(); dirLine.material = lineMat; dirLine.startWidth = 0.2f; dirLine.endWidth = 0.2f; dirLine.loop = true; dirLine.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; dirLine.SetPosition(0, playerController.buildObject.transform.position); Vector3 dirVector = playerController.buildObject.transform.position + playerController.buildObject.transform.forward * 4; dirLine.SetPosition(1, dirVector); dirLine.enabled = true; } private void ChangeBuildAxis() { switch (playerController.cubeloc) { case "up": playerController.cubeloc = "down"; break; case "down": playerController.cubeloc = "left"; break; case "left": playerController.cubeloc = "right"; break; case "right": playerController.cubeloc = "front"; break; case "front": playerController.cubeloc = "back"; break; case "back": playerController.cubeloc = "up"; break; } playerController.destroyTimer = 0; playerController.buildTimer = 0; } private void SetupBuildAxis(RaycastHit hit) { Vector3 placementPoint = hit.transform.position; Quaternion placementRotation; Vector3 dirVector; switch (playerController.cubeloc) { case "up": placementPoint = new Vector3(hit.transform.position.x, hit.transform.position.y + 5, hit.transform.position.z); break; case "down": placementPoint = new Vector3(hit.transform.position.x, hit.transform.position.y - 5, hit.transform.position.z); break; case "left": placementPoint = new Vector3(hit.transform.position.x + 5, hit.transform.position.y, hit.transform.position.z); break; case "right": placementPoint = new Vector3(hit.transform.position.x - 5, hit.transform.position.y, hit.transform.position.z); break; case "front": placementPoint = new Vector3(hit.transform.position.x, hit.transform.position.y, hit.transform.position.z + 5); break; case "back": placementPoint = new Vector3(hit.transform.position.x, hit.transform.position.y, hit.transform.position.z - 5); break; } placementRotation = playerController.buildObject.transform.rotation; playerController.buildObject.transform.position = placementPoint; playerController.buildObject.transform.rotation = placementRotation; dirLine.SetPosition(0, playerController.buildObject.transform.position); dirVector = playerController.buildObject.transform.position + playerController.buildObject.transform.forward * 4; dirLine.SetPosition(1, dirVector); } private void SetupFreePlacement(RaycastHit hit) { Vector3 placementPoint = new Vector3(hit.point.x, (hit.point.y + 2.4f), hit.point.z); //BLOCK ROTATION if (cInput.GetKeyDown("Rotate Block")) { playerController.buildObject.transform.Rotate(transform.up * 90); playerController.destroyTimer = 0; playerController.buildTimer = 0; } Quaternion placementRotation = playerController.buildObject.transform.rotation; playerController.buildObject.transform.position = placementPoint; playerController.buildObject.transform.rotation = placementRotation; dirLine.SetPosition(0, playerController.buildObject.transform.position); Vector3 dirVector = playerController.buildObject.transform.position + playerController.buildObject.transform.forward * 4; dirLine.SetPosition(1, dirVector); } private void BuildMachine(string type, RaycastHit hit) { bool foundItems = false; foreach (InventorySlot slot in playerController.playerInventory.inventory) { if (foundItems == false) { if (slot.amountInSlot > 0) { if (slot.typeInSlot.Equals(type)) { foundItems = true; bool flag = true; if (type.Equals("Rail Cart")) { if (hit.collider.gameObject.GetComponent() != null) { flag = true; } else { playerController.invalidRailCartPlacement = true; flag = false; } } else if (type.Equals("Auger")) { if (hit.collider.gameObject.tag.Equals("Landscape")) { flag = true; } else { playerController.invalidAugerPlacement = true; flag = false; } } if (flag == true) { GameObject t = blockDictionary.machineDictionary[type]; Vector3 pos = playerController.buildObject.transform.position; Quaternion rot = playerController.buildObject.transform.rotation; GameObject obj = Instantiate(t, pos, rot); if (obj.GetComponent() != null) { obj.GetComponent().target = hit.collider.gameObject; } slot.amountInSlot -= 1; playerController.builderSound.Play(); playerController.destroyTimer = 0; playerController.buildTimer = 0; } } if (slot.amountInSlot == 0) { slot.typeInSlot = "nothing"; } } } } if (foundItems == false) { if (GameObject.Find("GameManager").GetComponent().working == false) { playerController.stoppingBuildCoRoutine = true; GameObject.Find("GameManager").GetComponent().CombineBlocks(); playerController.separatedBlocks = false; playerController.destroyTimer = 0; playerController.buildTimer = 0; playerController.building = false; playerController.destroying = false; } else { playerController.requestedBuildingStop = true; } } } private void BuildBlock(string type) { bool foundItems = false; foreach (InventorySlot slot in playerController.playerInventory.inventory) { if (foundItems == false) { if (slot.amountInSlot >= playerController.buildMultiplier) { if (slot.typeInSlot.Equals(type) && GameObject.Find("GameManager").GetComponent().blockLimitReached == false) { foundItems = true; int h = 0; Vector3 multiBuildPlacement = playerController.buildObject.transform.position; for (int i = 0; i < playerController.buildMultiplier; i++) { if (playerController.cubeloc == "up") { multiBuildPlacement = new Vector3(playerController.buildObject.transform.position.x, playerController.buildObject.transform.position.y + h, playerController.buildObject.transform.position.z); } if (playerController.cubeloc == "down") { multiBuildPlacement = new Vector3(playerController.buildObject.transform.position.x, playerController.buildObject.transform.position.y - h, playerController.buildObject.transform.position.z); } if (playerController.cubeloc == "left") { multiBuildPlacement = new Vector3(playerController.buildObject.transform.position.x + h, playerController.buildObject.transform.position.y, playerController.buildObject.transform.position.z); } if (playerController.cubeloc == "right") { multiBuildPlacement = new Vector3(playerController.buildObject.transform.position.x - h, playerController.buildObject.transform.position.y, playerController.buildObject.transform.position.z); } if (playerController.cubeloc == "front") { multiBuildPlacement = new Vector3(playerController.buildObject.transform.position.x, playerController.buildObject.transform.position.y, playerController.buildObject.transform.position.z + h); } if (playerController.cubeloc == "back") { multiBuildPlacement = new Vector3(playerController.buildObject.transform.position.x, playerController.buildObject.transform.position.y, playerController.buildObject.transform.position.z - h); } h += 5; Instantiate(blockDictionary.blockDictionary[type], multiBuildPlacement, playerController.buildObject.transform.rotation); slot.amountInSlot -= 1; playerController.builderSound.Play(); playerController.destroyTimer = 0; playerController.buildTimer = 0; } } else if (GameObject.Find("GameManager").GetComponent().blockLimitReached == true) { playerController.blockLimitMessage = true; } if (slot.amountInSlot == 0) { slot.typeInSlot = "nothing"; } } } } if (foundItems == false) { if (GameObject.Find("GameManager").GetComponent().working == false) { playerController.stoppingBuildCoRoutine = true; GameObject.Find("GameManager").GetComponent().CombineBlocks(); playerController.separatedBlocks = false; playerController.destroyTimer = 0; playerController.buildTimer = 0; playerController.building = false; playerController.destroying = false; } else { playerController.requestedBuildingStop = true; } } } }