コード例 #1
0
        public void CastGroundTarget(Vector3 worldPos)
        {
            var origin      = Self.transform.position;
            var boxBaseSize = new Vector2(_pathWidth, 2);
            var length      = AbilityHelper.GetLineLength(origin, worldPos);

            length = Mathf.Min(length, CurrentCastRange);
            var boxHalfExtents = new Vector3(boxBaseSize.x, boxBaseSize.y, length) / 2;
            var rotation       = AbilityHelper.GetRotation(origin, worldPos);
            var center         = AbilityHelper.GetBoxCenter(origin, boxHalfExtents, rotation);
            var colliders      = Physics.OverlapBox(center, boxHalfExtents, rotation, (int)LayerMaskFlag.Entity);
            var dmg            = new Damage(_damage, DamageType.Magical, DamageFlags.Ability);

            foreach (var col in colliders)
            {
                if (!AbilityHelper.TryGetActor(col, out var actor))
                {
                    continue; //Not an actor, ignore
                }
                if (!CheckBuilder.AllowTarget(actor))
                {
                    continue; //Ignore if allies
                }
                if (!actor.TryGetModule <IDamageable>(out var damageTarget))
                {
                    continue; //Ignore if cant damage
                }
                damageTarget.TakeDamage(Self, dmg);
            }
        }
コード例 #2
0
        public void CastNoTarget()
        {
            //TODO channel

            var targets = Physics.OverlapSphere(Self.transform.position, _aoeSearchRange, (int)LayerMaskFlag.Entity);

            var damage = new Damage(_aoeDamage, DamageType.Magical, DamageFlags.Ability);

            foreach (var target in targets)
            {
                if (!AbilityHelper.TryGetActor(target, out var actor))
                {
                    continue;
                }
                if (!CheckBuilder.AllowTarget(actor))
                {
                    continue;
                }

                if (!actor.TryGetModule <IDamageable>(out var damageTarget))
                {
                    continue;
                }

                damageTarget.TakeDamage(Self, damage);
            }
        }
コード例 #3
0
        private bool TrySearchTarget(Vector3 area, ICollection <Actor> ignore, out Actor target)
        {
            var potentialTargets = Physics.OverlapSphere(area, _searchRange, (int)LayerMaskFlag.Entity);

            foreach (var potentialTarget in potentialTargets)
            {
                if (!AbilityHelper.TryGetActor(potentialTarget, out var actor))
                {
                    continue;
                }
                if (!Checker.AllowTarget(actor))
                {
                    continue;
                }
                if (ignore.Contains(actor))
                {
                    continue;
                }

                //TODO when targetable works, add this
                // if (!actor.TryGetComponent<ITargetable>(out _))
                // continue;
                if (!actor.TryGetModule <IDamageable>(out _))
                {
                    continue;
                }

                target = actor;
                return(true);
            }

            target = default;
            return(false);
        }
コード例 #4
0
ファイル: HuntersStrike.cs プロジェクト: ModernMAK/BoEG
        public void CastGroundTarget(Vector3 worldPos)
        {
            var origin         = Self.transform.position;
            var length         = AbilityHelper.GetLineLength(origin, worldPos);
            var boxHalfExtents = new Vector3(_pathWidth, 2f, length);
            var rotation       = AbilityHelper.GetRotation(origin, worldPos);
            var center         = AbilityHelper.GetBoxCenter(origin, boxHalfExtents, rotation);

            var colliders = Physics.OverlapBox(center, boxHalfExtents, rotation, (int)LayerMaskFlag.Entity);

            var atkDamage = Modules.Attackerable.Damage;

            var dmg = new Damage(_bonusDamage + atkDamage, DamageType.Physical,
                                 DamageFlags.Ability | DamageFlags.Attack);

            foreach (var col in colliders)
            {
                if (!AbilityHelper.TryGetActor(col, out var actor))
                {
                    continue;
                }
                if (!Checker.AllowTarget(actor))
                {
                    continue;
                }
                Modules.Attackerable.RawAttack(actor, dmg);
            }

            Modules.Movable.WarpTo(worldPos);
            Modules.Commandable.ClearCommands();
        }
コード例 #5
0
ファイル: MagicalBacklash.cs プロジェクト: ModernMAK/BoEG
        private void OnActorExit(object sender, TriggerEventArgs args)
        {
            var collider = args.Collider;

            if (!AbilityHelper.TryGetActor(collider, out var actor))
            {
                return;
            }
            if (!actor.TryGetModule <IAbilitiable>(out var abilitiable))
            {
                return;
            }
            abilitiable.AbilityCasted -= OnAbilityCast;
            _targetBuffer.Remove(abilitiable);
        }
コード例 #6
0
ファイル: NurtureNeglect.cs プロジェクト: ModernMAK/BoEG
        private void Nurture_Exit(object sender, TriggerEventArgs e)
        {
            var col = e.Collider;

            if (!AbilityHelper.TryGetActor(col, out var actor))
            {
                return;
            }
            if (!actor.TryGetModule <IHealable>(out var healable))
            {
                return;
            }
            healable.HealingModifiers -= NurtrueModifier;
            _nurtureTargets.Remove(healable);
        }
コード例 #7
0
        private void InstantlyRebuildTargets()
        {
            while (_targets.Count > 0)
            {
                InternalRemoveActor(_targets[0]);
            }

            var colliders = Trigger.Trigger.OverlapCollider((int)LayerMaskFlag.Entity);

            foreach (var col in colliders)
            {
                if (AbilityHelper.TryGetActor(col, out var actor))
                {
                    InternalAddActor(actor);
                }
            }
        }
コード例 #8
0
ファイル: HuntersStrike.cs プロジェクト: ModernMAK/BoEG
        public override void ConfirmCast()
        {
            if (!Checker.AllowCast())
            {
                return;
            }

            var ray = AbilityHelper.GetScreenRay();

            if (!AbilityHelper.TryGetWorldOrEntity(ray, out var hit))
            {
                return;
            }
            var unitCast = AbilityHelper.TryGetActor(hit.collider, out var actor);

            if (actor == Self)
            {
                return;
            }
            var position = unitCast
                ? actor.transform.position
                : hit.point;

            if (!CastRange.InRange(position))
            {
                return;
            }

            if (unitCast)
            {
                if (!Checker.AllowTarget(actor))
                {
                    return;
                }

                Checker.DoCast();
                CastObjectTarget(actor);
            }
            else
            {
                Checker.DoCast();
                CastGroundTarget(position);
            }

            Modules.Abilitiable.NotifyAbilityCast(new AbilityEventArgs(Self, Checker.MagicCost.Cost));
        }
コード例 #9
0
        private void FixedUpdate()
        {
            var  variant    = GetVariant();
            var  ray        = AbilityHelper.GetScreenRay();
            bool isHovering = false;

            if (Physics.Raycast(ray, out var hit, MaxDistance, Mask))
            {
                isHovering = AbilityHelper.TryGetActor(hit.collider, out _);
            }
            var desired = GetCursorIcon(variant, isHovering);

            //We cant set the cursor every frame, because it doesnt move when you do
            if (desired != _prev)
            {
                SetCursor(desired, CursorMode.Auto);
                _prev = desired;
            }
        }
コード例 #10
0
ファイル: NurtureNeglect.cs プロジェクト: ModernMAK/BoEG
        private void Nurture_Enter(object sender, TriggerEventArgs e)
        {
            var col = e.Collider;

            if (!AbilityHelper.TryGetActor(col, out var actor))
            {
                return;
            }
            if (!actor.TryGetModule <IHealable>(out var healable))
            {
                return;
            }
            if (!CheckBuilder.AllowTarget(actor))
            {
                return;
            }
            healable.HealingModifiers += NurtrueModifier;
            _nurtureTargets.Add(healable);
        }
コード例 #11
0
        public override void ConfirmCast()
        {
            if (!Checker.AllowCast())
            {
                return;
            }
            var ray = AbilityHelper.GetScreenRay();

            if (!AbilityHelper.TryGetWorldOrEntity(ray, out var hit))
            {
                return;
            }

            var unitTarget = AbilityHelper.TryGetActor(hit.collider, out var actor);

            if (actor == Self)
            {
                return;
            }

            if (!unitTarget && !CastRange.InRange(hit.point))
            {
                return;
            }
            if (unitTarget && !CastRange.InRange(actor))
            {
                return;
            }


            Checker.DoCast();
            if (!unitTarget)
            {
                CastGroundTarget(hit.point);
            }
            else
            {
                CastObjectTarget(actor);
            }

            Modules.Abilitiable.NotifyAbilityCast(new AbilityEventArgs(Self, View.StatCost.Cost));
        }
コード例 #12
0
ファイル: NurtureNeglect.cs プロジェクト: ModernMAK/BoEG
        private void RecalculateNurtureTargets()
        {
            var colliders = _nurtureAura.Collider.OverlapSphere();

            foreach (var col in colliders)
            {
                if (!AbilityHelper.TryGetActor(col, out var actor))
                {
                    return;
                }
                if (!actor.TryGetModule <IHealable>(out var healable))
                {
                    return;
                }
                if (!CheckBuilder.AllowTarget(actor))
                {
                    return;
                }
                healable.HealingModifiers += NurtrueModifier;
                _nurtureTargets.Add(healable);
            }
        }
コード例 #13
0
ファイル: Reap.cs プロジェクト: ModernMAK/BoEG
        public void CastVectorTarget(Vector3 worldPos, Vector3 direction)
        {
            var searchRange = _searchRange;
            var minDot      = NormalizedSideAngle;
            var hasTeamable = Modules.TryGetCached <ITeamable>(out var teamable);

            var colliders = Physics.OverlapSphere(worldPos, searchRange, (int)LayerMaskFlag.Entity);

            foreach (var col in colliders)
            {
                //Actor check
                if (!AbilityHelper.TryGetActor(col, out var actor))
                {
                    continue;
                }
                //Outside of angle range check
                var fwd = actor.transform.position - worldPos;
                if (Vector3.Dot(worldPos, fwd) < minDot)
                {
                    continue;
                }

                //Ally check
                if (hasTeamable)
                {
                    if (actor.TryGetModule <ITeamable>(out var otherTeamable))
                    {
                        if (teamable.IsAlly(otherTeamable))
                        {
                            continue;
                        }
                    }
                }

                //Valid target, hit the actor
                TryHitActor(actor);
            }
        }
コード例 #14
0
        public void CastObjectTarget(Actor target)
        {
            //Deal damage
            var damage = new Damage(_damage, DamageType.Magical, DamageFlags.Ability);
//            var targetable = target.GetComponent<ITargetable>();
            var damagable = target.GetModule <IDamageable>();

            damagable.TakeDamage(Self, damage);
            //Gather DOT targets
            var dotTargets = new List <Actor> {
                target
            };

            if (IsInOverheat)
            {
                var colliders = Physics.OverlapSphere(target.transform.position, _overheatSearchRange,
                                                      (int)LayerMaskFlag.Entity);
                foreach (var collider in colliders)
                {
                    if (!AbilityHelper.TryGetActor(collider, out var actor))
                    {
                        continue;
                    }
                    if (!CheckBuilder.AllowTarget(actor))
                    {
                        continue;
                    }
                    if (actor == target) //Already added
                    {
                        continue;
                    }
                    dotTargets.Add(actor);
                }
            }

            foreach (var actor in dotTargets)
            {
                if (!actor.TryGetModule <IDamageable>(out var damageTarget))
                {
                    continue;
                }
                var source    = Self;
                var dotDamage = new Damage(_tickDamage, DamageType.Magical, DamageFlags.Ability);

                void internalFunc()
                {
                    damageTarget.TakeDamage(source, dotDamage);
                }

                var tickWrapper = new TickAction
                {
                    Callback     = internalFunc,
                    TickCount    = _tickCount,
                    TickInterval = _tickInterval
                };

                if (actor.TryGetModule <IKillable>(out var killable))
                {
                    killable.Died += RemoveTick;
                }

                void RemoveTick(object sender, DeathEventArgs args)
                {
                    killable.Died -= RemoveTick;
                    _ticks.Remove(tickWrapper);
                }

                _ticks.Add(tickWrapper);
                ApplyFX(actor.transform, _tickCount * _tickInterval);
            }
        }