Example #1
0
        protected Projectile(Skill skill, Collision collision, SsarCollider collider, int maxEnemyHitCount,
                             float delayHandleObstacleCollision = 0, float delayHandleObjectCollision = 0)
        {
            this.skill                        = skill;
            this.collision                    = collision;
            this.collider                     = collider;
            this.maxEnemyHitCount             = maxEnemyHitCount;
            this.delayHandleObstacleCollision = delayHandleObstacleCollision;
            this.delayHandleObjectCollision   = delayHandleObjectCollision;
//			DLog.LogError("add new projectile: "+this.GetHashCode());
        }
Example #2
0
 public MeleeProjectile(Character character, Skill skill, Collision collision, SsarCollider collider,
                        int maxEnemyHitCount, float timeToLive, int noh, float ibh,
                        float delayHandleObstacleCollision, float delayHandleObjectCollision,
                        GameObject impactVfxPrefab, bool ignoreHeroPosOnYAxis,
                        Vector3 characterPositionAtTheTimeOfFirstProjectileCreation,
                        Direction characterFacingDirectionAtTheTimeOfFirstProjectileCreation) : base(skill, collision, collider, maxEnemyHitCount, delayHandleObstacleCollision, delayHandleObjectCollision)
 {
     this.character            = character;
     this.skill                = skill;
     this.collider             = collider;
     this.maxEnemyHitCount     = maxEnemyHitCount;
     this.timeToLive           = timeToLive;
     numberOfHit               = noh;
     intervalBetweenHit        = ibh;
     this.impactVfxPrefab      = impactVfxPrefab;
     this.ignoreHeroPosOnYAxis = ignoreHeroPosOnYAxis;
     this.characterPositionAtTheTimeOfFirstProjectileCreation        = characterPositionAtTheTimeOfFirstProjectileCreation;
     this.characterFacingDirectionAtTheTimeOfFirstProjectileCreation = characterFacingDirectionAtTheTimeOfFirstProjectileCreation;
     maxEnemyHitCountFilter = new MaxEnemyHitCountFilter(
         maxEnemyHitCount, numberOfHit, intervalBetweenHit
         );
     hitIntervalAndHitCountFilter = new HitIntervalAndHitCountFilter(numberOfHit, intervalBetweenHit);
     meleeDamageFilter            = new MeleeDamageFilter();
 }
Example #3
0
        public virtual void Update(float dt)
        {
            if (isDestroyed)
            {
                return;
            }
            if (IsFinish())
            {
                return;
            }

            elapsed += dt;

            UpdateTrajectory(dt);
            //DLog.LogError("update "+dt+" "+elapsed+" "+this.GetHashCode());
            if (collider == null)
            {
                collider = GetCollider();
            }
            List <Character> collidedCharacters = new List <Character>();

            //DLog.LogError("elapes: "+elapsed + " " + delayHandleObjectCollision+" "+collision.FindCharactersCollideWith(collider).Count+" "+this.GetHashCode());
            if (elapsed >= delayHandleObjectCollision)
            {
                collidedCharacters.AddRange(collision.FindCharactersCollideWith(collider));
            }
            //DLog.LogError("collided character: "+collidedCharacters.Count);

            List <Character> collidedEnemies           = FilterCollidedEnemies(collidedCharacters);
            List <Character> additionalCollidedEnemies = new List <Character>();

            if (collidedEnemies.Count > 0)
            {
                List <Character> additionalCollidedCharacters       = FindAdditionalCollidedCharacters();
                List <Character> uniqueAdditionalCollidedCharacters = new List <Character>();
                for (int i = 0; i < additionalCollidedCharacters.Count; i++)
                {
                    Character additional = additionalCollidedCharacters[i];
                    if (!collidedCharacters.Contains(additional))
                    {
                        uniqueAdditionalCollidedCharacters.Add(additional);
                    }
                }
                additionalCollidedEnemies = FilterCollidedEnemies(uniqueAdditionalCollidedCharacters);
            }
            collidedEnemies.AddRange(additionalCollidedEnemies);
            List <Character> ascSortedCollidedEnemies           = SortByDistanceAsc(collidedEnemies);
            List <Character> hitEnemiesSoFarBeforeThisCollision = new List <Character>();

            hitEnemiesSoFarBeforeThisCollision.AddRange(hitEnemiesSoFar);
            FilterHitEnemiesSoFar(ascSortedCollidedEnemies);

            List <Character> filteredEnemies = new List <Character>();

            //DLog.LogError("collided character: "+ascSortedCollidedEnemies.Count+" "+collidedEnemies.Count+" "+additionalCollidedEnemies.Count);
            foreach (Character collidedCharacter in ascSortedCollidedEnemies)
            {
                if (ascSortedCollidedEnemies.Contains(collidedCharacter) &&
                    hitEnemiesSoFar.Contains(collidedCharacter)
                    //this check should be written outside of this class (from design perspective)
                    && !IsCharacterVanish(collidedCharacter))
                {
                    filteredEnemies.Add(collidedCharacter);
                }
            }
            //DLog.LogError("projectile update "+BattleUtils.frame+" "+BattleUtils.time+" "+filteredEnemies.Count);
            if (filteredEnemies.Any())
            {
                List <Character> enemiesGotHitForTheFirstTime = new List <Character>();
                foreach (Character c in hitEnemiesSoFar)
                {
                    if (hitEnemiesSoFarBeforeThisCollision.Contains(c))
                    {
                        continue;
                    }

                    enemiesGotHitForTheFirstTime.Add(c);
//					skill.OnProjectileHitTargetsForFirstTime(this, new List<Character>(new []{c}));
                }
                filteredEnemies = PickInterestedOnesFrom(filteredEnemies);
//				skill.OnProjectileHitTargets(this, filteredEnemies);
            }

            if (elapsed >= delayHandleObstacleCollision)
            {
                List <Obstacle> collidedObstacles = collision.FindObstaclesCollideWith(collider);
                if (collidedObstacles.Any())
                {
//					skill.OnProjectileHitObstacles(this, collidedObstacles);
                }
            }
        }
 public RangerProjectile(Character character, Skill skill, Collision collision, SsarCollider collider) : base(skill, collision, collider, 1)
 {
 }