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
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);
}
}
}
}
}
}
}