Esempio n. 1
0
        public override void CheckActive()
        {
            Player         player    = Main.player[projectile.owner];
            ExpandedPlayer modPlayer = player.GetModPlayer <ExpandedPlayer>();

            if (player.dead)
            {
                modPlayer.coritePet = false;
            }
            if (modPlayer.coritePet)               // Make sure you are resetting this bool in ModPlayer.ResetEffects. See ExpandedPlayer.ResetEffects
            {
                projectile.timeLeft = 2;
            }
        }
Esempio n. 2
0
        public override void AI()
        {
            Player         player    = Main.player[projectile.owner];
            ExpandedPlayer modPlayer = player.GetModPlayer <ExpandedPlayer>();

            if (player.dead)
            {
                modPlayer.cloudPet = false;
            }
            if (modPlayer.cloudPet)
            {
                projectile.timeLeft = 2;
            }

            for (int i = 0; i < 200; i++)
            {
                NPC   target   = Main.npc[i];
                float shootToX = target.position.X + (float)target.width * 0.5f - projectile.Center.X;
                float shootToY = target.position.Y - projectile.Center.Y;
                float distance = (float)System.Math.Sqrt((double)(shootToX * shootToX + shootToY * shootToY));
                if (distance < 320f && !target.friendly && target.active && target.CanBeChasedBy())
                {
                    if (projectile.ai[0] > 15f)
                    {
                        distance  = 3f / distance;
                        shootToX *= distance * 5;
                        shootToY *= distance * 5;
                        int proj = Projectile.NewProjectile(projectile.Center.X, projectile.Center.Y, shootToX, shootToY, mod.ProjectileType("PetBolt"), 50, projectile.knockBack, Main.myPlayer, 0f, 0f);
                        Main.projectile[proj].timeLeft  = 300;
                        Main.projectile[proj].netUpdate = true;
                        projectile.netUpdate            = true;
                        Main.PlaySound(SoundID.Item75);
                        projectile.ai[0] = -25f;
                    }
                }
            }
            projectile.ai[0] += 1f;
        }
Esempio n. 3
0
        public override void AI()
        {
            Player player = Main.player[projectile.owner];

            if (Main.player[projectile.owner].GetModPlayer <ExpandedPlayer>().magicPet == false)
            {
                projectile.Kill();
            }
            ExpandedPlayer modPlayer = player.GetModPlayer <ExpandedPlayer>();

            if (player.dead)
            {
                modPlayer.magicPet = false;
            }
            if (modPlayer.magicPet)
            {
                projectile.timeLeft = 2;
            }
            float   distanceFromTarget = 700f;
            Vector2 targetCenter       = projectile.position;
            bool    foundTarget        = false;

            if (player.HasMinionAttackTargetNPC)
            {
                NPC   npc     = Main.npc[player.MinionAttackTargetNPC];
                float between = Vector2.Distance(npc.Center, projectile.Center);
                if (between < 2000f)
                {
                    distanceFromTarget = between;
                    targetCenter       = npc.Center;
                    foundTarget        = true;
                }
            }
            if (!foundTarget)
            {
                // This code is required either way, used for finding a target
                for (int i = 0; i < Main.maxNPCs; i++)
                {
                    NPC npc = Main.npc[i];
                    if (npc.CanBeChasedBy())
                    {
                        float between     = Vector2.Distance(npc.Center, projectile.Center);
                        bool  closest     = Vector2.Distance(projectile.Center, targetCenter) > between;
                        bool  inRange     = between < distanceFromTarget;
                        bool  lineOfSight = Collision.CanHitLine(projectile.position, projectile.width, projectile.height, npc.position, npc.width, npc.height);
                        // Additional check for this specific minion behavior, otherwise it will stop attacking once it dashed through an enemy while flying though tiles afterwards
                        // The number depends on various parameters seen in the movement code below. Test different ones out until it works alright
                        bool closeThroughWall = between < 100f;
                        if (((closest && inRange) || !foundTarget) && (lineOfSight || closeThroughWall))
                        {
                            distanceFromTarget = between;
                            targetCenter       = npc.Center;
                            foundTarget        = true;
                        }
                    }
                }
            }
            if (foundTarget)
            {
                nebulaCooldown += 1;
                if (nebulaCooldown == 30)
                {
                    Item.NewItem((int)projectile.position.X, (int)projectile.position.Y, projectile.width, projectile.height, 3455);
                }
                if (nebulaCooldown == 60)
                {
                    Item.NewItem((int)projectile.position.X, (int)projectile.position.Y, projectile.width, projectile.height, 3453);
                }
                if (nebulaCooldown == 90)
                {
                    Item.NewItem((int)projectile.position.X, (int)projectile.position.Y, projectile.width, projectile.height, 3454);
                    nebulaCooldown = 0;
                }
            }
        }