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