Example #1
0
    void OnTriggerStay(Collider other)
    {
        if (weapon == null)
        {
            return;
        }

        var player = weapon.player;

        if (other.gameObject.tag == "Player" && other.gameObject.GetComponent <Player>().ID != player.ID)
        {
            var target = other.gameObject.GetComponent <Player>();
            WeaponTargettingState = TargettingState.TargetsInRange;

            if (target.ID != player.ID)
            {
                //cast rays
                CastRays();
                //TODO do something with this guy
                var abc = ProcessRays();
                if (abc.hasValidTarget != false)
                {
                    var id = abc.validHit.collider.GetComponentInParent <PlayerHitbox>().player;
                    playertarget = id;
                }
            }
        }
    }
Example #2
0
 // this will be called after the object is instatiated by SetWeapon on the weapon (if aim assist is on)
 public void Initialize(AbstractWeapon setWeapon)
 {
     weapon                  = setWeapon;
     transform.position      = weapon.transform.position;
     transform.localPosition = Vector3.zero;
     weaponRange             = weapon.weaponRange;
     weaponArc               = weapon.weaponArc;
     WeaponTargettingState   = TargettingState.Setup;
 }
Example #3
0
    void Update()
    {
        if (!weapon)
        {
            return;
        }

        // if(weapon.player.ID == 0)
        //     Debug.Log(weapon.player.ID + " " + WeaponTargettingState);

        switch (WeaponTargettingState)
        {
        case (TargettingState.Setup):
            if (mesh)
            {
                mesh.Clear();
                mesh = meshfilter.mesh;
            }
            WeaponTargettingState = TargettingState.NoneInRange;
            break;

        case (TargettingState.NoneInRange):
            if (playertarget != null)
            {
                playertarget.DangerIndicatorToggle(false);
            }
            playertarget = null;
            DrawTargettingArea();
            break;

        case (TargettingState.TargetsInRange):
            if (playertarget != null)
            {
                playertarget.DangerIndicatorToggle(false);
            }
            playertarget = null;
            DrawTargettingArea();
            break;

        case (TargettingState.TargetsInLOS):
            playertarget.DangerIndicatorToggle(true);
            DrawTargettingArea();
            break;

        default:
            break;
        }
    }
Example #4
0
    // processRays should process all the RaycastHits of every RaycastBeams
    // the goal is to produce either null for no valid target
    // or return the RaycastHit of the closest valid target
    RaycastBeams ProcessRays()
    {
        RaycastBeams        closestValidRaycastBeam           = new RaycastBeams();
        float               closestValidTargetDistance        = 1000f;
        List <RaycastBeams> beamsWithValidTargetsAsTheClosest = new List <RaycastBeams>();

        //RaycastBeams closestPlayerRaycastHit;

        for (int i = 0; i < beams.Length; i++)
        {
            //skip the beam if already processed
            if (beams[i] == null || beams[i].shouldBeProcessed == false)
            {
                continue;
            }
            //Debug.Log("processing beam at " + i);
            //these are for iterating thru the raycasthit array of each beam
            float        closestTargetDistance = 1000f;
            RaycastHit   closestHit            = new RaycastHit();
            RaycastBeams validBeam             = null;

            //cycle thru all the RaycastNonAlloc hits to find the closest
            for (int j = 0; j < beams[i].hits.Length; j++)
            {
                var theHit = beams[i].hits[j];
                if (theHit.distance == 0)
                {
                    continue;
                }
                //Debug.Log("theHit " + theHit.distance) ;
                if (theHit.distance <= closestTargetDistance)
                {
                    closestTargetDistance = theHit.distance;
                    closestHit            = theHit;
                    beams[i].validHit     = theHit;
                    validBeam             = beams[i];
                }
            }

            //Debug.Log("the closest hit is " + closestHit.collider.tag);
            if (closestHit.collider == null)
            {
                continue;
            }


            //if the target is valid
            var isPlayer = closestHit.collider.CompareTag("PlayerHitbox");
            var isNPC    = closestHit.collider.CompareTag("NPCHitbox");

            if (isPlayer || isNPC)
            {
                beamsWithValidTargetsAsTheClosest.Add(validBeam);
                //else dont do anything
            }
            beams[i].shouldBeProcessed = false;
        }
        // Went thru all the beams and have a list of beams with valid targets
        // now go thru this list and find the closest one

        for (int k = 0; k < beamsWithValidTargetsAsTheClosest.Count; k++)
        {
            var theBeam = beamsWithValidTargetsAsTheClosest[k];
            if (theBeam.validHit.distance < closestValidTargetDistance)
            {
                closestValidTargetDistance             = theBeam.validHit.distance;
                closestValidRaycastBeam                = theBeam;
                closestValidRaycastBeam.hasValidTarget = true;
                //Debug.Log("hitting player " + theBeam.validHit.collider.GetComponentInParent<Player>().ID);
            }
        }

        if (beamsWithValidTargetsAsTheClosest.Count > 0)
        {
            WeaponTargettingState = TargettingState.TargetsInLOS;
        }

        return(closestValidRaycastBeam);
    }
Example #5
0
 void OnTriggerExit(Collider other)
 {
     WeaponTargettingState = TargettingState.NoneInRange;
 }