Files
Noah4ever 572344254d Little fix on player, added trigger collider on usp
@juliuse98 needs to fix when looking up the weapon gets to far away an the hands look strange. Tried to fix it a bit. Its no a little better but NOT completely fixed.

USP has now a collider that is a trigger. When the weapon is clipping through the wall (befor that the collider should trigger and the player puts the weapon upright) ITS NOT WORKING but the structure is there... (All collider gets disabled when you pick up a weapon)
2021-12-15 13:19:10 +01:00

175 lines
6.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using TMPro;
public class Shoot : NetworkBehaviour
{
[SerializeField] WeaponManager weaponManager; // For throwing grenade
[SerializeField] GameObject muzzle;
[SerializeField] ProcedualAnimationController shootAnim;
[SerializeField] GameObject weaponHolder;
[SerializeField] Camera mCamera;
[SerializeField] bool limitAmmunition = true;
[Header("Debug")]
[SerializeField] bool showBullethole = true;
[SerializeField] float bulletholeRadius = 0.2f;
private Weapon weapon;
private RaycastHit crosshairHitPoint;
private Vector3 _pointDirection;
private Quaternion _lookRotation;
private Vector3 hitpos;
private RaycastHit hit;
private Ray ray;
private bool updateCanvas = true;
private int curAmmo = 1, totalAmmo = 1;
public int CurAmmo { get => curAmmo; set => curAmmo = value; } // For DebugCanvas
public int TotalAmmo { get => totalAmmo; set => totalAmmo = value; } // For DebugCanvas
private void Start() {
if (isServer) {
weapon = weaponHolder.GetComponent<Weapon>();
}
if (isLocalPlayer) {
weapon = weaponHolder.GetComponent<Weapon>();
curAmmo = weapon.CurrentAmmunition;
totalAmmo = weapon.TotalAmmunition;
}
}
private void Update() {
if (isLocalPlayer) {
if (updateCanvas) {
curAmmo = weapon.CurrentAmmunition;
totalAmmo = weapon.TotalAmmunition;
updateCanvas = false;
}
if (Input.GetButtonDown("Fire")) {
updateCanvas = true;
// If current weapon kind is a rifle or pistole
string weaponKindString = weapon.WeaponKind.ToString();
if(weaponKindString == "Rifle" || weaponKindString == "Pistole") {
if (weapon.AllowAction && weapon.CurrentAmmunition > 0) {
shootAnim.Recoil(0.1f);
}
// Shoot Weapon
CmdFireBullet();
} // If current weapon kind is grenade
else if(weaponKindString == "Grenade"){
// Throw Grenade
throwGrenade();
} // If current weapon kind is kinfe
else {
// Throw hands (punch)
}
}
if (Input.GetButtonDown("Reload")) {
updateCanvas = true;
CmdReloadWeapon();
}
}
}
private void throwGrenade() {
Debug.Log("ThrowGrenade!");
// Throws grenade with dropForce
weapon.HasBeenThrown = true;
// 3 -> Grenade index
weaponManager.dropWeapon(weapon.DropForce, 3);
weaponManager.switchWeapon(1);
}
[Command]
private void CmdReloadWeapon() {
if (weapon.AllowAction && limitAmmunition) {
reloadWeapon(weapon);
}
}
// [Command]
// This code will be executed on the Server.
private void CmdFireBullet() {
ray = new Ray(mCamera.transform.position, mCamera.transform.forward); // Raycast from Camera
if (Physics.Raycast(ray, out crosshairHitPoint, 5000f)) { // Check if Raycast is beyond 5000
hitpos = crosshairHitPoint.point; // If hitpoint is under 5000
} else {
hitpos = mCamera.transform.position + mCamera.transform.forward * 5000;
}
_pointDirection = hitpos - muzzle.transform.position;
_lookRotation = Quaternion.LookRotation(_pointDirection);
shootAnim.rotationMod[1] = Quaternion.RotateTowards(weaponHolder.transform.rotation, _lookRotation, 1f); // Point weapon to raycast hitpoint from camera
if (weapon.AllowAction) { // If not reloading etc.
if (Physics.Raycast(muzzle.transform.position, muzzle.transform.forward, out hit) && weapon.CurrentAmmunition > 0) { // Raycast from Bullet Exit Point to camera raycast
if (showBullethole) { bulletHole(GameObject.CreatePrimitive(PrimitiveType.Sphere), hit); } // Creates bullethole where raycast hits
if (hit.transform.gameObject.GetComponent<Rigidbody>())
{
hit.transform.gameObject.GetComponent<Rigidbody>().AddForce(mCamera.transform.forward * weapon.HitForce);
}
if (hit.transform.gameObject.GetComponent<Player>() != null) { // If hit object is a player
Debug.Log("-->HIT PLAYER: " + hit.transform.name);
hit.transform.gameObject.GetComponent<Player>().RemoveHealth(weapon.Damage);
}
}
if (limitAmmunition) {
subtractAmmunition(weapon); // Subtract Ammunition
}
StartCoroutine(fireRate());
}
}
void bulletHole(GameObject holeObject, RaycastHit hit) // Nur zum testen da
{
holeObject.transform.localScale = new Vector3(bulletholeRadius, bulletholeRadius, bulletholeRadius);
holeObject.transform.position = hit.point;
}
IEnumerator fireRate() {
weapon.AllowAction = false;
yield return new WaitForSeconds(60f/weapon.Firerate); // Waits for firerate seconds
weapon.AllowAction = true;
}
private bool subtractAmmunition(Weapon weapon) { // Subtracts Ammunition from weapon
if (weapon.CurrentAmmunition > 0) {
weapon.CurrentAmmunition -= 1;
Debug.Log(weapon.CurrentAmmunition + " / " + weapon.TotalAmmunition);
return true;
}
return false;
}
public bool setWeapon(GameObject newWeapon) {
//Debug.Log("Switch weapon to: " + newWeapon.transform.name);
weapon = newWeapon.GetComponent<Weapon>();
curAmmo = weapon.CurrentAmmunition;
totalAmmo = weapon.TotalAmmunition;
muzzle = weapon.BulletExit;
return true;
}
private bool reloadWeapon(Weapon weapon) { // Reloads Ammunition from weapon
if (weapon.AllowAction && weapon.TotalAmmunition > 0) {
weapon.AllowAction = false;
int dif = weapon.MagazinSize - weapon.CurrentAmmunition;
if (weapon.TotalAmmunition >= dif) {
weapon.CurrentAmmunition += dif;
weapon.TotalAmmunition -= dif;
}
else {
weapon.CurrentAmmunition += weapon.TotalAmmunition;
weapon.TotalAmmunition = 0;
}
weapon.AllowAction = true;
Debug.Log("Reloaded");
return true;
}
return false;
}
}