using SHADE; using SHADE_Scripting; using System; using static PlayerController; using static Item; public class PickAndThrow : Script { public Vector3 throwForce = new Vector3(100.0f, 200.0f, 100.0f); public GameObject item { get; set; } public float delayTimer = 1.0f; public float aimingLength = 1.5f; private float timer; private PlayerController pc; private Camera cam; private Transform itemTransform; private RigidBody itemRidibody; private Transform raccoonHoldLocation; private Transform playerTran; private Item itemScript; private ThirdPersonCamera tpc; private float lastXDir; private float lastZDir; private bool inRange = false; private Collider collider; private BoxCollider cs; [Tooltip("Lenght of ray")] public float rayDistance = 3; protected override void awake() { pc = GetScript(); if(!pc) Debug.LogError("PLAYER CONTROLLER EMPTY"); raccoonHoldLocation = GetComponentInChildren(); if (!raccoonHoldLocation) Debug.LogError("CHILD EMPTY"); tpc = GetScriptInChildren(); if(!tpc) Debug.LogError("TPC EMPTY"); collider = GetComponent(); if (!collider) Debug.LogError("COLLIDER EMPTY"); else { cs = collider.GetCollisionShape(0); } timer = delayTimer; } protected override void update() { if(timer <= delayTimer) timer += Time.DeltaTimeF; CalculateDir(); if (pc && itemRidibody && itemTransform) { if (pc.holdItem) { itemTransform.LocalPosition = raccoonHoldLocation.GlobalPosition; itemTransform.LocalRotation = playerTran.LocalRotation; if (Input.GetMouseButtonDown(Input.MouseCode.LeftButton)) { pc.isAiming = true; pc.camArm.ArmLength = aimingLength; } if (Input.GetMouseButtonUp(Input.MouseCode.LeftButton) && pc.isAiming) { Audio.PlaySFXOnce2D("event:/Raccoon/raccoon_throw"); pc.isAiming = false; if(tpc) pc.camArm.ArmLength = tpc.armLength; pc.holdItem = false; inRange = false; itemRidibody.IsGravityEnabled = true; if (itemScript) { Vector3 vec = new Vector3(throwForce.x * lastXDir, throwForce.y, throwForce.z * lastZDir); if (itemScript.currCategory == ItemCategory.LIGHT) itemRidibody.AddForce(vec * 0.3f); if (itemScript.currCategory == ItemCategory.MEDIUM) itemRidibody.AddForce(vec * 0.75f); if (itemScript.currCategory == ItemCategory.HEAVY) itemRidibody.AddForce(vec); } itemRidibody.LinearVelocity += pc.rb.LinearVelocity; ResetItemObject(); timer = 0.0f; } if (Input.GetMouseButtonDown(Input.MouseCode.RightButton) && !pc.isAiming) { pc.holdItem = false; inRange = false; itemRidibody.IsGravityEnabled = true; ResetItemObject(); } if (Input.GetMouseButtonDown(Input.MouseCode.RightButton) && pc.isAiming) { pc.isAiming = false; if (tpc) pc.camArm.ArmLength = tpc.armLength; } } else if (!pc.holdItem) itemRidibody.IsGravityEnabled = true; } if (timer > delayTimer && pc && !pc.holdItem && inRange && Input.GetMouseButtonDown(Input.MouseCode.LeftButton)) { if (pc.currentState == RaccoonStates.WALKING || pc.currentState == RaccoonStates.IDLE) { pc.holdItem = true; RetrieveItemComponets(); } } } protected override void fixedUpdate() { CastRay(); } private void ResetItemObject() { itemRidibody = null; itemTransform = null; itemScript = null; item = new GameObject(); } private void RetrieveItemComponets() { //get the transform of the given item if (item.GetScript() && itemTransform == null && itemRidibody == null) { itemRidibody = item.GetComponent(); if (itemRidibody == null) Debug.Log("Item rb EMPTY"); else { itemRidibody.IsGravityEnabled = false; itemRidibody.LinearVelocity = Vector3.Zero; itemRidibody.AngularVelocity = Vector3.Zero; } itemTransform = item.GetComponent(); if (itemTransform == null) Debug.Log("Item transform EMPTY"); else { itemTransform.LocalEulerAngles = Vector3.Zero; } itemScript = item.GetScript(); if(!itemScript) Debug.Log("Item script EMPTY"); } } private void CalculateDir() { if (cam == null) cam = GetComponentInChildren(); else if (cam) { Vector3 camerAixs = cam.GetForward(); camerAixs.y = 0; camerAixs.Normalise(); lastXDir = camerAixs.x; lastZDir = camerAixs.z; } } private void CastRay() { if (pc != null && cs != null) { Vector3 dirNor = pc.tranform.Forward; //change when cs.HalfExtents.z works //cs.HalfExtents.z Vector3 playerRayPos = pc.tranform.GlobalPosition + (dirNor * (0.3f + 0.1f)); playerRayPos.y += 0.1f; dirNor.Normalise(); RaycastHit ray1 = Physics.Raycast(new Ray(playerRayPos, Vector3.RotateY(dirNor, SHADE.Math.DegreesToRadians(22.5f))), rayDistance); RaycastHit ray2 = Physics.Raycast(new Ray(playerRayPos, Vector3.RotateY(dirNor, SHADE.Math.DegreesToRadians(-22.5f))), rayDistance); RaycastHit ray3 = Physics.Raycast(new Ray(playerRayPos, dirNor), rayDistance * 0.5f); } } protected override void onCollisionEnter(CollisionInfo info) { } protected override void onTriggerEnter(CollisionInfo info) { if (info.GameObject.GetScript() && !pc.holdItem) { item = info.GameObject; inRange = true; } } protected override void onTriggerStay(CollisionInfo info) { //Debug.Log("STAY"); } protected override void onTriggerExit(CollisionInfo info) { //Debug.Log("EXIT"); if (info.GameObject.GetScript() != null && !pc.holdItem) { inRange = false; } } }