private void DoingDamageLogic() { if (_targetEnemy == null) { return; } _attackTimer -= GameTime.DeltaTime; if (_attackTimer > 0) { return; //keep waiting... } //ready to attack... _attackTimer = AttackSpeed; //deal ranged or melee damage if close enough & clear to attack... if (DistanceSquaredFromNearestEnemyUnit < Reach * Reach /*&& GetLineOfSightClear(TargetEnemy)*/) { //SetUpWeapon(true, UnitWeapon.WeaponClasses.Ranged); _targetEnemy.TakeDamage(Damage); WeaponMgr.Lightning.FireBeamAmmo(transform, Vector3.up * HeightFromPivotToTop, _targetEnemy.transform, _targetEnemy.GetCenterOfMassOffset()); //CurrentWeapon.GetComponent<WeaponMeleeMotion>()?.StartStabMotion(); //DEBUG if (LINE_DEBUG_ENABLED) { Debug.DrawLine(transform.position + Vector3.up * HeightFromPivotToTop, _targetEnemy.transform.position + _targetEnemy.GetCenterOfMassOffset(), Color.red, 0.02f); } } }
private bool GetLineOfSightClear(ITakeDamage target) { if (target == null || target.transform == null) { return(false); } //TODO: raycast to closest point on the collider? center of object? Vector3 shootPosition = transform.position + (Vector3.up * HeightFromPivotToTop); //Vector3 closestPoint = target.GetTransform().GetComponent<Collider>().ClosestPoint(weaponPosition); Vector3 targetCenter = target.transform.position + target.GetCenterOfMassOffset();//target.transform.GetComponent<Renderer>().bounds.center; if (Physics.Raycast(shootPosition, targetCenter - shootPosition, out RaycastHit hitInfo)) { ITakeDamage hitObject = (hitInfo.transform.GetComponent <ITakeDamage>()); return(hitObject == target); } return(false); }
private void DoingDamageLogic() { _attackTimer -= GameTime.DeltaTime; if (_attackTimer > 0) { return; //keep waiting... } //ready to attack... _attackTimer = AttackSpeed; //deal ranged or melee damage if (_opponentDistanceSquared < ReachMelee * ReachMelee) //if close do melee... { SetUpWeapon(true, UnitWeapon.WeaponClasses.Melee); _opponent.TakeDamage(MeleeDamageDone); if (_opponent.GetType() == typeof(Unit)) { AddExperience(1); //give experience if attacking a Unit only } CurrentWeapon.GetComponent <WeaponMeleeMotion>()?.StartStabMotion(); //DEBUG Debug.DrawLine(transform.position, _opponent.transform.position, Color.blue, 0.5f); if (TEXT_DEBUG_ENABLED) { TestDebugOutput += " Melee"; } } else //...try ranged { if (_opponentDistanceSquared > ReachRangedMin * ReachRangedMin && _opponentDistanceSquared < ReachRanged * ReachRanged && GetLineOfSightClear(this.transform, _opponent)) { SetUpWeapon(true, UnitWeapon.WeaponClasses.Ranged); if (_opponent != null) { _opponent.TakeDamage(RangedDamageDone); if (_opponent.GetType() == typeof(Unit)) { AddExperience(1); //give experience if attacking a Unit only } //visuals if (_closeToPlayer) { AmmoDepot depot; if (Profession == Professions.Sorcerer) { depot = WeaponMgr.Lightning; depot.FireBeamAmmo(CurrentWeapon.transform, Vector3.zero, _opponent.transform, _opponent.GetCenterOfMassOffset()); } else { depot = WeaponMgr.Arrows; depot.FireAmmo(CurrentWeapon.transform.position, _opponent.transform.position + _opponent.GetCenterOfMassOffset(), _opponent.transform); } Debug.DrawLine(transform.position, _opponent.transform.position, Color.cyan, 0.5f); } } if (TEXT_DEBUG_ENABLED) { TestDebugOutput += " Range"; } } } }