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; } }
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; }
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; } } }