Beispiel #1
0
    public override bool InitMagicalObject(GameObject Weapon, GameObject Direction)
    {
        CharacterStatus Charstats = Weapon.GetComponentInParent <CharacterStatus>();
        GameObject      target    = Charstats.GetComponent <MouseControl>().SelectedObject;

        if (Charstats.CurrentMana >= Cost && target != null)
        {
            GameObject Sphere = Instantiate(SpellPrefab);
            Sphere.transform.position = Weapon.transform.position - Weapon.transform.right * 2;
            Sphere.transform.LookAt(Direction.transform);
            HomingObj homingSphere = Sphere.GetComponent <HomingObj>();
            homingSphere.onExplosion = OnExplosion;
            homingSphere.Duration    = EffectDuration;
            homingSphere.Target      = target.GetComponent <CharacterStatus>();
            homingSphere.Caster      = Charstats.gameObject.name;
            homingSphere.Go          = true;
            Charstats.CurMana        = -Cost;
            return(true);
        }
        return(false);
    }
Beispiel #2
0
    // Update is called once per frame
    void Update()
    {
        if (Controllable)
        {
            movements.attacks = Attacks.NoSpell;

            RaycastHit ObjectInfront;
            float      DistanceFromEnemy = (transform.position - Target.transform.position).magnitude;

            Collider[] DangerSurrounding = Physics.OverlapSphere(transform.position, 30, 0b10000000000000000);
            Collider[] IncomingObj       = Physics.OverlapSphere(transform.position, 30, 0b1001100000000000);
            Collider[] DetectPowerUps    = Physics.OverlapSphere(transform.position, 50, 0b1000000000000000000);

            MagicShield MS = GetComponentInChildren <MagicShield>();

            if (movements.control == Control.Forward && Physics.SphereCast(new Ray(transform.position, transform.forward), 6, out ObjectInfront, 2, ~512))
            {
                movements.rotate = GoAround(ObjectInfront.transform.gameObject);
            }
            else if (DetectPowerUps.Length > 0)
            {
                Transform PowerUpTrans = DetectPowerUps[0].transform;
                Vector2   PowerUpDir   = (new Vector2(PowerUpTrans.position.x - transform.position.x, PowerUpTrans.position.z - transform.position.z)).normalized;
                movements.rotate = Alignment(PowerUpDir, this.gameObject);
                if (movements.rotate == Rotation.NoRotate)
                {
                    movements.control = Control.Forward;
                }
                else
                {
                    movements.control = Control.Still;
                }
            }
            else if (DangerSurrounding.Length > 0 || Charstats.CurrentMana < EquippedSpell.Cost || Charstats.CurrentHealth < 150)
            {
                Debug.Log(Charstats.CurrentMana + " : " + EquippedSpell.Cost);
                if (DistanceFromEnemy < 15)
                {
                    movements.rotate = RunAwayFromEnemy(Target.transform);
                }
                else if (DistanceFromEnemy >= 15)
                {
                    movements.rotate = CircleAroundEnemy(Target.transform);
                }

                foreach (Collider Danger in DangerSurrounding)
                {
                    movements.rotate = RunAwayFromEnemy(Danger.gameObject.transform);
                }

                movements.control = Control.Forward;
            }
            else if (IncomingObj.Length > 0)
            {
                foreach (Collider IncObj in IncomingObj)
                {
                    MovingObject spellObj    = IncObj.GetComponent <MovingObject>();
                    HomingObj    homingSpell = IncObj.GetComponent <HomingObj>();
                    if (spellObj != null && spellObj.CasterName == this.gameObject.name)
                    {
                        continue;
                    }
                    if (homingSpell != null && homingSpell.Caster == this.gameObject.name)
                    {
                        continue;
                    }
                    switch (IncObj.gameObject.layer)
                    {
                    case 11:
                        if (DefensiveSpells[1].currentCoolDown < DefensiveSpells[1].Cooldown && movements.IsDoneAnimatingAttack())
                        {
                            defensives.defense = AvoidMissiles(IncObj.gameObject);
                        }
                        else if (MS == null || (MS != null && MS.gameObject.layer != 14))
                        {
                            EquippedSpell = DefensiveSpells[1];
                            CastSpell();
                        }
                        break;

                    case 12:
                        if (DefensiveSpells[0].currentCoolDown < DefensiveSpells[0].Cooldown && movements.IsDoneAnimatingAttack())
                        {
                            defensives.defense = AvoidMissiles(IncObj.gameObject);
                        }
                        else if (MS == null || (MS != null && MS.gameObject.layer != 13))
                        {
                            EquippedSpell = DefensiveSpells[0];
                            CastSpell();
                        }
                        break;

                    case 15:
                        if (movements.IsDoneAnimatingAttack())
                        {
                            defensives.defense = AvoidMissiles(IncObj.gameObject);
                        }
                        break;
                    }
                }
            }
            else if (animator.GetCurrentAnimatorClipInfo(3).Length == 0)
            {
                Vector2 EnemyDir = (new Vector2(Target.transform.position.x - transform.position.x, Target.transform.position.z - transform.position.z)).normalized;
                movements.rotate = Alignment(EnemyDir, Aim);
                GameObject Obstacle = null;

                if (DistanceFromEnemy < 15 && Spells[2].currentCoolDown >= Spells[2].Cooldown)
                {
                    EquippedSpell = Spells[2];
                    CastSpell();
                }
                else if (movements.rotate == Rotation.NoRotate)
                {
                    Vector2    EnemyFacingVec   = (new Vector2(Target.transform.forward.x, Target.transform.forward.z)).normalized;
                    float      EnemyFacingAngle = Mathf.Acos(Vector2.Dot(EnemyDir, EnemyFacingVec));
                    Vector3    RayDir           = (new Vector3(Target.transform.position.x - Aim.transform.position.x, 0, Target.transform.position.z - Aim.transform.position.z)).normalized;
                    RaycastHit Rayhit;

                    Debug.DrawRay(Aim.transform.position, RayDir * 40f);

                    if (Physics.Raycast(new Ray(Aim.transform.position + Aim.transform.right / 2, RayDir), out Rayhit, 40f, 0b100000000000000000))
                    {
                        Obstacle = Rayhit.transform.gameObject;
                    }
                    else if (EnemyFacingAngle < Mathf.PI * .4f)
                    {
                        if (Spells[4].currentCoolDown >= Spells[4].Cooldown)
                        {
                            EquippedSpell = Spells[4];
                            EquippedSpell.CastAtPosition = Target.transform.position;
                            CastSpell();
                        }
                        else
                        {
                            EquippedSpell = Spells[3];
                            CastSpell();
                        }
                    }
                    else
                    {
                        EquippedSpell = Spells[1];
                        CastSpell();
                    }
                }

                if (Obstacle != null)
                {
                    movements.control = AvoidObstacle(Obstacle);
                }
                else if (DistanceFromEnemy < 30)
                {
                    movements.control = Control.Backward;
                }
                else if (DistanceFromEnemy > 40)
                {
                    movements.control = Control.Forward;
                }
                else
                {
                    movements.control = Control.Still;
                }
            }
        }
        else
        {
            movements.control  = Control.Still;
            movements.rotate   = Rotation.NoRotate;
            movements.attacks  = Attacks.NoSpell;
            defensives.defense = Defensive.NotDefensive;
        }

        foreach (AbstractSpell AS in Spells)
        {
            AS.UpdateCoolDown();
        }
        foreach (AbstractSpell AS in DefensiveSpells)
        {
            if (AS.GlobalCoolDown)
            {
                foreach (AbstractSpell DS in DefensiveSpells)
                {
                    DS.currentCoolDown = 0;
                }
                AS.GlobalCoolDown = false;
                break;
            }
            AS.UpdateCoolDown();
        }
    }