Пример #1
0
    protected float CustomAngle()
    {
        float angle;

        if (EnemyWeapon)
        {
            Vector3 pos = ETM.Return_Current_Target().position;
            if (WeaponExpertise == HumanoidWeaponExpertise.Commando) //Predict Movement
            {
                Vector3 vel      = ETM.Return_Current_Target().GetComponentInParent <Rigidbody>().velocity;
                float   time_est = (pos - transform.position).magnitude / projectileVelocity;
                pos += vel * time_est;
            }
            pos -= transform.position;

            angle = Mathf.Atan2(pos.x, pos.z);
        }
        else
        {
            Vector3    mousePos3d = new Vector3();
            Ray        ray        = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitray;
            int        layerMask = (LayerMask.GetMask("Terrain"));
            if (Physics.Raycast(ray, out hitray, Mathf.Infinity, layerMask))
            {
                mousePos3d = hitray.point;
            }

            float special_offset = -Mathf.Tan(Mathf.PI / 2 - (Camera.main.transform.rotation.eulerAngles.x * Mathf.Deg2Rad)) * Mathf.Sqrt(2); //Made to hit 2 meter tall enemies. Divided by Sqrt(2) because of line below
            angle = Mathf.Atan2((mousePos3d.x + special_offset) - transform.position.x, (mousePos3d.z + special_offset) - transform.position.z);
        }

        return(angle);
    }
    protected virtual void EnemyCustomAttack()
    {
        Attack_helper();
        enemyAnimationUpdater.RangedAttack(rangedAnimation);
        AmmoMaster AM_temp = fireProjectile(CustomAngle()).GetComponent <AmmoMaster>();

        AM_temp.Setup(ReturnFinalDamage(damage), dt_in: DT);
        AM_temp.AdditionalNPCSetup(ETM.Return_FactionEnum(), FL, ETM.Return_customReputation());
    }
Пример #3
0
    protected override void EnemyCustomAttack()
    {
        float spread = Random.Range(-SpreadAngle_half, SpreadAngle_half);

        Attack_helper();
        enemyAnimationUpdater.RangedAttack(rangedAnimation);
        AmmoMaster AM_temp = fireProjectile(CustomAngle() + spread).GetComponent <AmmoMaster>();

        AM_temp.Setup(ReturnFinalDamage(damage), dt_in: DT);
        AM_temp.AdditionalNPCSetup(ETM.Return_FactionEnum(), FL, ETM.Return_customReputation());
    }
 public override void AnimationTriggerAttack() //Can be overwritten
 {
     if (EnemyWeapon)
     {
         AmmoMaster AM_temp = fireProjectile(CustomAngle()).GetComponent<AmmoMaster>();
         AM_temp.Setup(ReturnFinalDamage(damage), dt_in: DT);
         AM_temp.AdditionalNPCSetup(ETM.Return_FactionEnum(), FL, ETM.Return_customReputation());
     }
     else
     {
         fireProjectile(CustomAngle()).GetComponent<AmmoMaster>().Setup(ReturnFinalDamage(damage), dt_in: DT);
     }
 }
Пример #5
0
    private IEnumerator attackMechanics()
    {
        for (int i = 0; i < burst_amount; i++)
        {
            Vector3 cast_pos = new Vector3(ETM.Return_Current_Target().position.x + Random.Range(-scatter_range, scatter_range), ETM.Return_Current_Target().position.y + y_adjust, ETM.Return_Current_Target().position.z + Random.Range(-scatter_range, scatter_range));

            GameObject clone            = Instantiate(lightningBolt, cast_pos, transform.rotation, EnemyProjectiles).gameObject;
            LightningBoltProjectile LBP = clone.GetComponent <LightningBoltProjectile>();
            LBP.EnemySetup(FL, ETM);
            LBP.GenericSetup(damage, radius, AttackDelay);
            yield return(new WaitForSeconds(.1f));
        }
    }
Пример #6
0
 private void OnTriggerExit(Collider other)
 {
     if (other.tag == "Player")
     {
         if (FL.ReturnIsEnemyCustomPlayer(ETM.Return_FactionEnum(), ETM.Return_customReputation()))
         {
             TargetsInMeleeRange.Remove(other.transform);
         }
     }
     else if (other.tag == "BasicEnemy" && other.transform != thisHitbox)
     {
         if (FL.ReturnIsEnemy(ETM.Return_FactionEnum(), other.gameObject.GetComponentInParent <EnemyTemplateMaster>().Return_FactionEnum()))
         {
             TargetsInMeleeRange.Add(other.transform);
         }
     }
 }
 void OnTriggerStay(Collider other) //Uses physics time
 {
     if (other.tag == "Player")
     {
         if (FL.ReturnIsEnemyCustomPlayer(ETM.Return_FactionEnum(), ETM.Return_customReputation()))
         {
             shove(other);
         }
     }
     else if (other.tag == "BasicEnemy" && other.transform != thisHitbox)
     {
         if (FL.ReturnIsEnemy(ETM.Return_FactionEnum(), other.gameObject.GetComponentInParent <EnemyTemplateMaster>().Return_FactionEnum()))
         {
             shove(other);
         }
     }
 }
    [SerializeField] private float CastAmount       = 1;   //should not move the transform because that affect LoS

    public override bool CastMechanics()
    {
        if (!clean_LoS())
        {
            return(false);
        }

        Vector3 target_dir = ETM.Return_Current_Target().transform.position - transform.position;
        float   angle      = Mathf.Atan2(target_dir.x, target_dir.z);
        Vector3 anglesDeg  = new Vector3(0f, angle * Mathf.Rad2Deg, 0f);

        for (int i = 1; i < CastAmount + 1; i++)
        {
            Vector3          mod_transform = new Vector3(transform.position.x + (cast_distance * i * Mathf.Sin(angle)), transform.position.y + placement_y_bias, transform.position.z + (cast_distance * i * Mathf.Cos(angle)));
            GameObject       clone         = Instantiate(ProjectileShield, mod_transform, Quaternion.Euler(anglesDeg), EnemyProjectiles).gameObject;
            ProjectileShield PS_Script     = clone.GetComponent <ProjectileShield>();

            PS_Script.Setup(max_duration, health, false, false);
        }
        return(true);
    }
    private IEnumerator ChargeMechanics()
    {
        float z_axis = 0;

        for (float i = 0; i < delay; i += Time.fixedDeltaTime)
        {
            z_axis += duration * velocity * Time.fixedDeltaTime / (delay);
            mod_rect(z_axis);
            dir   = ETM.Return_Current_Target().position - transform.position;
            dir.y = 0;
            dir   = dir.normalized;
            parent_transform.rotation = Quaternion.RotateTowards(parent_transform.rotation, Quaternion.Euler(new Vector3(0f, Mathf.Atan2(dir.x, dir.z) * Mathf.Rad2Deg, 0f)), 720 * Time.deltaTime);
            yield return(new WaitForFixedUpdate());
        }

        RigidbodyConstraints original_constraints = parent_rb.constraints;

        parent_rb.constraints = original_constraints | RigidbodyConstraints.FreezeRotationY;

        GameObject tempInd = detachIndicator();

        line.SetActive(false);

        sc.enabled = true;
        for (float i = 0; i < duration; i += Time.fixedDeltaTime)
        {
            z_axis -= velocity * Time.fixedDeltaTime;
            //mod_rect(z_axis);
            parent_rb.velocity = dir * velocity;
            if (!clean_LoS())
            {
                break;
            }
            yield return(new WaitForFixedUpdate());
        }
        parent_rb.constraints = original_constraints;
        sc.enabled            = false;
        Destroy(tempInd);
        isCharging = false;
    }
Пример #10
0
    public override void AnimationTriggerAttack()
    {
        float angle = CustomAngle();

        float fanMod = -fanAngle / 2;

        for (int i = 0; i < ProjectileCount; ++i)
        {
            float projectileAngle = angle + fanMod;

            if (EnemyWeapon)
            {
                if (i == 0)
                {
                    AmmoMaster AM_temp = fireProjectile(projectileAngle, true).GetComponent <AmmoMaster>();
                    AM_temp.Setup(ReturnFinalDamage(damage), dt_in: DT);
                    AM_temp.AdditionalNPCSetup(ETM.Return_FactionEnum(), FL, ETM.Return_customReputation());
                }
                else
                {
                    AmmoMaster AM_temp = fireProjectile(projectileAngle, true).GetComponent <AmmoMaster>();
                    AM_temp.Setup(ReturnFinalDamage(damage), dt_in: DT);
                    AM_temp.AdditionalNPCSetup(ETM.Return_FactionEnum(), FL, ETM.Return_customReputation());
                }
            }
            else
            {
                if (i == 0)
                {
                    fireProjectile(projectileAngle, true).GetComponent <AmmoMaster>().Setup(ReturnFinalDamage(damage), dt_in: DT);
                }
                else
                {
                    fireProjectile(projectileAngle, false).GetComponent <AmmoMaster>().Setup(ReturnFinalDamage(damage), dt_in: DT);
                }
            }

            fanMod += fanAngle / ProjectileCount;
        }
    }
Пример #11
0
 private void CustomAttack()
 {
     if (CheckAmmo())
     {
         if (energy.Drain_ES(false, energyCost)) //Like this because this uses energy
         {
             Attack_helper();
             playMove.SetFollowCursorSustained(1f);
             animationUpdater.RangedAttack(rangedAnimation);
             if (EnemyWeapon)
             {
                 AmmoMaster AM_temp = fireProjectile(CustomAngle()).GetComponent <AmmoMaster>();
                 AM_temp.Setup(ReturnFinalDamage(damage), dt_in: DT);
                 AM_temp.AdditionalNPCSetup(ETM.Return_FactionEnum(), FL, ETM.Return_customReputation());
             }
             else
             {
                 fireProjectile(CustomAngle()).GetComponent <AmmoMaster>().Setup(ReturnFinalDamage(damage), dt_in: DT);
             }
         }
     }
 }