public void Interact() { if (Input.GetKeyDown(KeyCode.I) == true) { if (UIManager.hasInventoryOpen() == false) { UIManager.ShowInventory(GameMaster.Instance.player.getInventory()); } else { UIManager.CloseInventory(); } } if (Input.GetKeyDown(KeyCode.F) == true) { currentPaletteIndex = Util.WrapInt(currentPaletteIndex += 1, 2, Enum.GetValues(typeof(Voxel)).Length - 1); currentVoxel = (Voxel)currentPaletteIndex; UIManager.ForceUpdate(); } // Everything below here can't be done when mousing over non-clickthrough UI if (UIManager.isMouseOverUIWithIgnore() == true) { return; } Unity.Physics.RaycastHit hit; Unity.Entities.Entity hitEntity; hitData = null; if (GameMaster.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), 8, out hit, out hitEntity)) { hitData = new VoxelHitData(hit, hitEntity); Vector3 offsetPos = hitData.hitTransform.InverseTransformPoint(hit.Position); offsetPos.x = (float)Math.Round(offsetPos.x); offsetPos.y = (float)Math.Round(offsetPos.y); offsetPos.z = (float)Math.Round(offsetPos.z); // offsetPos.x = offsetPos.x - offsetPos.x % 1; // offsetPos.y = offsetPos.y - offsetPos.y % 1; // offsetPos.z = offsetPos.z - offsetPos.z % 1; offsetPos = hitData.hitTransform.rotation * offsetPos; Vector3 hitPos = hitData.hitTransform.position + offsetPos; Debug.DrawLine(Camera.main.ScreenPointToRay(Input.mousePosition).origin, hitPos, Color.red); Debug.DrawRay(hit.Position, hit.SurfaceNormal, Color.yellow); Debug.DrawRay(hit.Position, hit.SurfaceNormal * -0.5f, Color.cyan); } else { Debug.DrawRay(Camera.main.ScreenPointToRay(Input.mousePosition).origin, Camera.main.ScreenPointToRay(Input.mousePosition).direction * 8, Color.green); } // if (hit.collider != null) // { // Interactable interactable = hit.collider.GetComponent<Interactable>(); // if (interactable != null) // { // if (Input.GetMouseButtonDown(1) == true) // { // interactable.TryInteract(GameMaster.Instance.player.gameObject); // return; // } // else // { // interactable.TryHover(GameMaster.Instance.player.gameObject); // } // } // } Item mainHand = GameMaster.Instance.player.getEquipment().getSlot(EquipmentSlot.MAINHAND); if (mainHand.isValid() == false) { return; } if (Input.GetKeyDown(KeyCode.G) == true) { int amountToDrop = 1; if (Input.GetKey(KeyCode.LeftControl) == true || Input.GetKey(KeyCode.RightControl) == true) { amountToDrop = mainHand.getAmount(); } GameMaster.Instance.DropItemNaturally(Position.fromVector3(transform.position + (transform.forward * 3)), mainHand, amountToDrop); GameMaster.Instance.player.getInventory().Remove(mainHand, amountToDrop); } if (hitData == null || hitData.isValid() == false) { return; } if (mainHand is BLOCKITEM) { rotationOrientation = hitData.getFace().getOpposite(); currentVoxel = ((BLOCKITEM)mainHand).getVoxel(); if (Input.GetAxis("Mouse ScrollWheel") > 0) { rotationIndex = Util.WrapInt(rotationIndex += 1, 0, 3); rotationDirection = (Direction)rotationIndex; } else if (Input.GetAxis("Mouse ScrollWheel") < 0) { rotationIndex = Util.WrapInt(rotationIndex -= 1, 0, 3); rotationDirection = (Direction)rotationIndex; } if (Input.GetMouseButtonDown(1) == true) { if (hitData.getAtFace().getType() == Voxel.VOID) { Block thisBlock = hitData.voxelObject.setBlockAt(hitData.atFace, currentVoxel); if (thisBlock.getChunk() != null) { GameMaster.Instance.player.getInventory().Remove(mainHand, 1); GameMaster.Instance.PlaySound(placeSound, hit.Position); GetComponent <MotionAnimator>().PlayMotion("mainHandAttack"); if (thisBlock.getBlockData() is Rotatable) { Rotatable data = (Rotatable)thisBlock.getBlockData(); data.setDirection(rotationDirection); thisBlock.setBlockData(data); } if (thisBlock.getBlockData() is Orientated) { Orientated data = (Orientated)thisBlock.getBlockData(); data.setOrientation(rotationOrientation); thisBlock.setBlockData(data); } if (hitData.getFace() == Direction.BELOW) { if (thisBlock.getBlockData() is Flippable) { Flippable data = (Flippable)thisBlock.getBlockData(); data.setFlipped(true); thisBlock.setBlockData(data); } } } } } UpdateDisplayModel(); DrawDisplayModel(hitData.localFacePosition); } else if (mainHand is CUTTER) { Block clickedBlock = hitData.getAt(); if (Input.GetMouseButtonDown(0) == true) { if (clickedBlock.getType() != Voxel.VOID && clickedBlock.getType() != Voxel.SHIP_CORE) { Position droppedPosition = Position.fromVector3(hit.Position); GameMaster.Instance.DropItemNaturally(droppedPosition, clickedBlock.getType(), 1); Block thisBlock = hitData.voxelObject.setBlockAt(hitData.atHit, Voxel.VOID); if (thisBlock.getChunk() != null) { GameMaster.Instance.PlaySound(placeSound, hit.Position); GetComponent <MotionAnimator>().PlayMotion("mainHandAttack"); } } } else if (Input.GetMouseButtonDown(1) == true) { if (clickedBlock.getType() != Voxel.VOID && clickedBlock.getType() != Voxel.SHIP_CORE) { Block thisBlock = hitData.voxelObject.setBlockAt(hitData.atHit, Voxel.FRAME); if (thisBlock.getChunk() != null) { GameMaster.Instance.PlaySound(placeSound, hit.Position); GetComponent <MotionAnimator>().PlayMotion("mainHandAttack"); } } } currentVoxel = clickedBlock.getType(); if (clickedBlock.getBlockData() is Rotatable) { Rotatable data = (Rotatable)clickedBlock.getBlockData(); rotationDirection = data.getDirection(); } if (clickedBlock.getBlockData() is Orientated) { Orientated data = (Orientated)clickedBlock.getBlockData(); rotationOrientation = data.getOrientation(); } UpdateDisplayModel(); DrawDisplayModel(hitData.localPosition); } else if (mainHand is DRILL) { if (hitData.isValid()) { rotationOrientation = hitData.getFace().getOpposite(); if (Input.GetAxis("Mouse ScrollWheel") > 0) { rotationIndex = Util.WrapInt(rotationIndex += 1, 0, 3); rotationDirection = (Direction)rotationIndex; } else if (Input.GetAxis("Mouse ScrollWheel") < 0) { rotationIndex = Util.WrapInt(rotationIndex -= 1, 0, 3); rotationDirection = (Direction)rotationIndex; } if (Input.GetMouseButtonDown(2) == true) { Block clickedBlock = hitData.getAt(); if (clickedBlock.getType() != Voxel.VOID && clickedBlock.getType() != Voxel.SHIP_CORE) { currentVoxel = clickedBlock.getType(); currentPaletteIndex = (int)currentVoxel; } } if (Input.GetMouseButtonDown(1) == true) { if (hitData.getAt().getType() == Voxel.FRAME) { Block thisBlock = hitData.voxelObject.setBlockAt(hitData.atHit, currentVoxel); if (thisBlock.getChunk() != null) { GameMaster.Instance.PlaySound(placeSound, hit.Position); GetComponent <MotionAnimator>().PlayMotion("mainHandAttack"); if (thisBlock.getBlockData() is Rotatable) { Rotatable data = (Rotatable)thisBlock.getBlockData(); data.setDirection(rotationDirection); thisBlock.setBlockData(data); } if (thisBlock.getBlockData() is Orientated) { Orientated data = (Orientated)thisBlock.getBlockData(); data.setOrientation(rotationOrientation); thisBlock.setBlockData(data); } if (hitData.getFace() == Direction.BELOW) { if (thisBlock.getBlockData() is Flippable) { Flippable data = (Flippable)thisBlock.getBlockData(); data.setFlipped(true); thisBlock.setBlockData(data); } } } } } UpdateDisplayModel(); DrawDisplayModel(hitData.localPosition); } } }