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