public static void CastPortal()
        {
            portalAimLine.Disable();
            Transform t     = Camera.main.transform;
            var       hits1 = Physics.RaycastAll(t.position, t.forward, portalCastMaxRange + 1f);
            Vector3   pos;

            foreach (var hit in hits1)
            {
                if (!hit.transform.CompareTag("enemyCollide") && hit.transform.root != LocalPlayer.Transform.root)
                {
                    pos = hit.point - t.forward * 2.5f + Vector3.up * 2.1f;
                    goto portal_postPickingPos;
                }
            }

            pos = LocalPlayer.Transform.position + t.forward * (portalCastMaxRange - 2) + Vector3.up * 2f;
portal_postPickingPos:

            int id = Portal.GetPortalID();

            try
            {
                Portal.CreatePortal(pos, ModdedPlayer.Stats.spell_portalDuration, id, LocalPlayer.IsInCaves, LocalPlayer.IsInEndgame);
            }
            catch (Exception e)
            {
                ModAPI.Log.Write(e.ToString());
            }

            if (BoltNetwork.isRunning)
            {
                if (Portal.BothPortalsActive)
                {
                    Portal.SyncBothPortals();
                }
                else
                {
                    Portal.SyncTransform(pos, ModdedPlayer.Stats.spell_portalDuration, id, LocalPlayer.IsInCaves, LocalPlayer.IsInEndgame);
                }
            }
        }
        public static void DoBlink()
        {
            blinkAim?.Disable();

            Transform t          = Camera.main.transform;
            Vector3   blinkPoint = Vector3.zero;
            var       hits1      = Physics.RaycastAll(t.position, t.forward, ModdedPlayer.Stats.spell_blinkRange + 1f);

            foreach (var hit in hits1)
            {
                if (!hit.transform.CompareTag("enemyCollide") && hit.transform.root != LocalPlayer.Transform.root)
                {
                    blinkPoint = hit.point - t.forward + Vector3.up * 0.25f;
                    break;
                }
            }
            if (blinkPoint == Vector3.zero)
            {
                blinkPoint = LocalPlayer.Transform.position + t.forward * ModdedPlayer.Stats.spell_blinkRange;
            }
            if (ModdedPlayer.Stats.spell_blinkDamage > 0)
            {
                RaycastHit[] hits = Physics.BoxCastAll(t.position, Vector3.one * 1.2f, blinkPoint - t.position, t.rotation, Vector3.Distance(blinkPoint, t.position) + 1);
                foreach (RaycastHit hit in hits)
                {
                    if (hit.transform.CompareTag("enemyCollide"))
                    {
                        ModAPI.Console.Write("Hit enemy on layer " + hit.transform.gameObject.layer);
                        float dmg = ModdedPlayer.Stats.spell_blinkDamage + ModdedPlayer.Stats.spellFlatDmg * ModdedPlayer.Stats.spell_blinkDamageScaling;
                        dmg *= ModdedPlayer.Stats.TotalMagicDamageMultiplier;
                        if (GameSetup.IsMpClient)
                        {
                            BoltEntity enemyEntity = hit.transform.GetComponentInParent <BoltEntity>();
                            if (enemyEntity == null)
                            {
                                enemyEntity = hit.transform.gameObject.GetComponent <BoltEntity>();
                            }

                            if (enemyEntity != null)
                            {
                                PlayerHitEnemy playerHitEnemy = PlayerHitEnemy.Create(enemyEntity);
                                playerHitEnemy.hitFallDown     = true;
                                playerHitEnemy.getAttackerType = DamageMath.CONVERTEDFLOATattackerType;
                                playerHitEnemy.Hit             = DamageMath.GetSendableDamage(dmg);
                                playerHitEnemy.Send();
                            }
                        }
                        else
                        {
                            if (EnemyManager.enemyByTransform.ContainsKey(hit.transform.root))
                            {
                                EnemyManager.enemyByTransform[hit.transform.root].HitMagic(dmg);
                            }
                            else
                            {
                                hit.transform.SendMessageUpwards("HitMagic", dmg, SendMessageOptions.DontRequireReceiver);
                            }
                        }
                    }
                }
            }
            if (ModdedPlayer.Stats.spell_blinkDoExplosion)
            {
                Effects.Sound_Effects.GlobalSFX.Play(Effects.Sound_Effects.GlobalSFX.SFX.Boom);
                var   raycastHitExplosion = Physics.OverlapSphere(blinkPoint, (blinkPoint - t.position).magnitude / 4f);
                float dmg = ModdedPlayer.Stats.spell_blinkDamage + LocalPlayer.Rigidbody.velocity.magnitude * ModdedPlayer.Stats.spellFlatDmg * ModdedPlayer.Stats.spell_blinkDamageScaling / 7f;
                dmg *= ModdedPlayer.Stats.TotalMagicDamageMultiplier * ModdedPlayer.Stats.RandomCritDamage;
                foreach (var hitCollider in raycastHitExplosion)
                {
                    if (hitCollider.transform.CompareTag("enemyCollide"))
                    {
                        if (GameSetup.IsMpClient)
                        {
                            BoltEntity enemyEntity = hitCollider.transform.GetComponentInParent <BoltEntity>();
                            if (enemyEntity == null)
                            {
                                enemyEntity = hitCollider.transform.gameObject.GetComponent <BoltEntity>();
                            }

                            if (enemyEntity != null)
                            {
                                PlayerHitEnemy playerHitEnemy = PlayerHitEnemy.Create(enemyEntity);
                                playerHitEnemy.hitFallDown     = true;
                                playerHitEnemy.getAttackerType = DamageMath.CONVERTEDFLOATattackerType;
                                playerHitEnemy.Hit             = DamageMath.GetSendableDamage(dmg);
                                playerHitEnemy.Send();
                            }
                        }
                        else
                        {
                            if (EnemyManager.enemyByTransform.ContainsKey(hitCollider.transform.root))
                            {
                                EnemyManager.enemyByTransform[hitCollider.transform.root].HitMagic(dmg);
                            }
                            else
                            {
                                hitCollider.transform.SendMessageUpwards("HitMagic", dmg, SendMessageOptions.DontRequireReceiver);
                            }
                        }
                    }
                }
            }
            BlinkTowards(blinkPoint);
        }
Beispiel #3
0
        public static void DoBlink()
        {
            blinkAim?.Disable();

            Transform t          = Camera.main.transform;
            Vector3   blinkPoint = Vector3.zero;
            var       hits1      = Physics.RaycastAll(t.position, t.forward, BlinkRange + 1f);

            foreach (var hit in hits1)
            {
                if (!hit.transform.CompareTag("enemyCollide") && hit.transform.root != LocalPlayer.Transform.root)
                {
                    blinkPoint = hit.point - t.forward + Vector3.up * 0.25f;
                    break;
                }
            }
            if (blinkPoint == Vector3.zero)
            {
                blinkPoint = LocalPlayer.Transform.position + t.forward * BlinkRange;
            }
            if (BlinkDamage > 0)
            {
                RaycastHit[] hits = Physics.BoxCastAll(t.position, Vector3.one * 1.2f, blinkPoint - t.position, t.rotation, Vector3.Distance(blinkPoint, t.position) + 1);
                foreach (RaycastHit hit in hits)
                {
                    if (hit.transform.CompareTag("enemyCollide"))
                    {
                        ModAPI.Console.Write("Hit enemy on layer " + hit.transform.gameObject.layer);
                        float dmg = BlinkDamage + ModdedPlayer.instance.SpellDamageBonus;
                        dmg *= ModdedPlayer.instance.SpellAMP * 3;
                        DamageMath.DamageClamp(dmg, out int dmgInt, out int repetitions);
                        if (GameSetup.IsMpClient)
                        {
                            BoltEntity enemyEntity = hit.transform.GetComponentInParent <BoltEntity>();
                            if (enemyEntity == null)
                            {
                                enemyEntity = hit.transform.gameObject.GetComponent <BoltEntity>();
                            }

                            if (enemyEntity != null)
                            {
                                PlayerHitEnemy playerHitEnemy = PlayerHitEnemy.Create(enemyEntity);
                                playerHitEnemy.hitFallDown = true;
                                playerHitEnemy.explosion   = true;
                                playerHitEnemy.Hit         = dmgInt;
                                for (int i = 0; i < repetitions; i++)
                                {
                                    playerHitEnemy.Send();
                                }
                            }
                        }
                        else
                        {
                            var v = hit.transform.GetComponentInParent <EnemyProgression>();
                            if (v == null)
                            {
                                v = hit.transform.GetComponent <EnemyProgression>();
                            }
                            if (v != null)
                            {
                                for (int i = 0; i < repetitions; i++)
                                {
                                    v.HitMagic(dmgInt);
                                }
                            }
                            else
                            {
                                hit.transform.SendMessageUpwards("Hit", dmgInt, SendMessageOptions.DontRequireReceiver);
                            }
                        }
                    }
                }
            }

            BlinkTowards(blinkPoint);
        }