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