Blade & Sorcery
0 of 0

File information

Last updated

Original upload

Created by

Ebediam

Uploaded by

Ebediam

Virus scan

Safe to use

Tags for this mod

About this mod

Look at the video inside to see the arrows in action Are you tired of missing your shots with the arrow or crossbow? Say no more! You little cheater. DON'T DOWNLOAD V2 IF YOU DON'T HAVE THE CROSSBOW

Requirements
Permissions and credits
Changelogs
The code:

public class ItemElvenArrow : MonoBehaviour
    {
        protected Item item;
        public Creature target;
        public Transform headTransform;
       public ItemModuleElvenArrow module;


        protected void Awake()
        {

            item = this.GetComponent<Item>();
            module = item.data.GetModule<ItemModuleElvenArrow>();
            item.OnGrabEvent += ElvenGrab;
            item.OnTeleGrabEvent += ElvenTeleGrab;
            item.OnUngrabEvent += ElvenUngrab;

            item.OnCollisionEvent += ElvenCollision;
            headTransform = item.definition.GetCustomReference("HeadTransform");
        }


        void ElvenCollision(ref CollisionStruct collisionInstance)
        {

                if (collisionInstance.targetType != CollisionStruct.TargetType.NPC)
                {
                    item.rb.AddForce(item.transform.forward.normalized * 10f, ForceMode.Impulse);
                }

            if (collisionInstance.otherInteractiveObject)
            {
                if(collisionInstance.otherInteractiveObject.handlers.Count > 0)
                {
                    collisionInstance.otherInteractiveObject.disableCollisionDetection = true;
                    item.rb.AddForce(item.transform.forward.normalized * 10f, ForceMode.Impulse);
                }
            }


        }
            

            
        

        void ElvenUngrab(Handle handle, Interactor interactor, bool throwing)
        {
            item.rb.mass = 0.1f;
        }

        
        void ElvenGrab(Handle handle, Interactor interactor)
        {
            target = null;
            item.rb.mass = 0.01f;
        }

        void ElvenTeleGrab(Handle handle, Telekinesis teleGrabber)
        {
            target = null;
        }

        void Update()
        {
            if(!target && item.isFlying && item.rb.velocity.magnitude >= 3f)
            {
                SetTarget();
            }


            if (target)
            {
                if (item.rb.velocity.magnitude < 3f)
                {
                    target = null;
                }
                else
                {
                    float initVelocity = item.rb.velocity.magnitude;
                    item.transform.LookAt(target.body.headBone);
                    item.rb.velocity = Vector3.zero;
                    item.rb.AddForce(item.transform.forward.normalized * initVelocity, ForceMode.VelocityChange);
                }



            }
        }

        void SetTarget()
        {
            float minAngle = module.maxAngle;
            target = null;
            if(Creature.list.Count > 0)
            {
                foreach (Creature npc in Creature.list)
                {
                    if (npc != Creature.player && npc.state != Creature.State.Dead)
                    {
                        if (npc.body)
                        {
                            if (npc.body.headBone)
                            {
                                if (Vector3.Angle(headTransform.position - item.transform.position, npc.body.headBone.position - item.transform.position) < minAngle)
                                {
                                    target = npc;
                                    minAngle = Vector3.Angle(headTransform.position - item.transform.position, target.body.headBone.position - item.transform.position);
                                }
                            }
                        }

                    }
                }
            }
            
        }