Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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";
                    }
                }
            }
        }