You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
using UnityEngine.Events;
 | 
						|
 | 
						|
namespace Autohand{
 | 
						|
    [HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/extras/stabbing")]
 | 
						|
    public class Stabbable : MonoBehaviour{
 | 
						|
        public Rigidbody body;
 | 
						|
        public Grabbable grabbable;
 | 
						|
 | 
						|
        [Tooltip("The index that must match the stabbers index to allow stabbing")]
 | 
						|
        public int stabIndex = 0;
 | 
						|
        public int maxStabbers = 1;
 | 
						|
        public float positionDamper = 1000;
 | 
						|
        public float rotationDamper = 1000;
 | 
						|
        public bool parentOnStab = true;
 | 
						|
 | 
						|
        [Header("Events")]
 | 
						|
        public UnityEvent StartStab;
 | 
						|
        public UnityEvent EndStab;
 | 
						|
        
 | 
						|
        //Progammer Events <3
 | 
						|
        public StabEvent StartStabEvent;
 | 
						|
        public StabEvent EndStabEvent;
 | 
						|
 | 
						|
        public List<Stabber> currentStabbers { get; private set; }
 | 
						|
        public int currentStabs { get; private set; }
 | 
						|
 | 
						|
        Transform prereleaseParent;
 | 
						|
 | 
						|
        private void OnEnable() {
 | 
						|
            currentStabbers = new List<Stabber>();
 | 
						|
            if(!body && GetComponent<Rigidbody>())
 | 
						|
                body = GetComponent<Rigidbody>();
 | 
						|
 | 
						|
            if(grabbable == null) {
 | 
						|
                body.gameObject.HasGrabbable(out grabbable);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public virtual void OnStab(Stabber stabber) {
 | 
						|
            currentStabs++;
 | 
						|
            currentStabbers.Add(stabber);
 | 
						|
 | 
						|
            if(parentOnStab && grabbable != null && stabber.grabbable != null) {
 | 
						|
                grabbable.AddJointedBody(stabber.grabbable.body);
 | 
						|
                for(int i = 0; i < stabber.stabbed.Count; i++) {
 | 
						|
                    if(stabber.stabbed[i] != this) {
 | 
						|
                        var stabbable = stabber.stabbed[i];
 | 
						|
                        if(stabbable != this && stabbable.grabbable != null && stabbable.parentOnStab && stabbable.grabbable.parentOnGrab) {
 | 
						|
                            if(grabbable.parentOnGrab)
 | 
						|
                                grabbable.AddJointedBody(stabbable.grabbable.body);
 | 
						|
                            stabbable.grabbable.AddJointedBody(grabbable.body);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            StartStab?.Invoke();
 | 
						|
            StartStabEvent?.Invoke(stabber, this);
 | 
						|
        }
 | 
						|
 | 
						|
        public virtual void OnEndStab(Stabber stabber) {
 | 
						|
            currentStabs--;
 | 
						|
            currentStabbers.Remove(stabber);
 | 
						|
            if(parentOnStab && grabbable && stabber.grabbable) {
 | 
						|
                grabbable.RemoveJointedBody(stabber.grabbable.body);
 | 
						|
 | 
						|
                for(int i = 0; i < stabber.stabbed.Count; i++) {
 | 
						|
                    if(stabber.stabbed[i] != this) {
 | 
						|
                        var stabbable = stabber.stabbed[i];
 | 
						|
                        if(stabbable != this && stabbable.grabbable != null && stabbable.parentOnStab && stabbable.grabbable.parentOnGrab) {
 | 
						|
                            grabbable.RemoveJointedBody(stabbable.grabbable.body);
 | 
						|
                            stabbable.grabbable.RemoveJointedBody(grabbable.body);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            EndStab?.Invoke();
 | 
						|
            EndStabEvent?.Invoke(stabber, this);
 | 
						|
        }
 | 
						|
 | 
						|
        public virtual bool CanStab(Stabber stabber) {
 | 
						|
            return currentStabs < maxStabbers && stabber.stabIndex == stabIndex;
 | 
						|
        }
 | 
						|
 | 
						|
        public int StabbedCount() {
 | 
						|
            return currentStabbers.Count;
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |