public override bool PreAI(Projectile projectile) { ProjectileWrapper projWrapper = new ProjectileWrapper(projectile); if (projWrapper.GetTeam() == Team.PlayerFriendly || projWrapper.GetTeam() == Team.Unknown) { ClosestTarget closest = ClosestTarget.Null; for (int i = 0; i < Main.maxNPCs; i++) { NPC npc = Main.npc[i]; if (npc != null && npc.active) { NPCWrapper npcWrapper = new NPCWrapper(npc); if (npc.GetGlobalNPC <NPCTyping>().GetAbility().AttractProjectile( new AbilityLookup.AttractProjectileParameters(projWrapper, npcWrapper))) { ClosestTarget newClosest = new ClosestTarget(npc, projectile); if (newClosest.distance < closest.distance) { closest = newClosest; } } } } if (closest.id >= 0) { ProjectileHome(projectile, closest, Main.npc[closest.id].Center); } } else if (projWrapper.GetTeam() == Team.EnemyNPC) { ClosestTarget closest = ClosestTarget.Null; for (int i = 0; i < Main.maxPlayers; i++) { Player player = Main.player[i]; if (player != null && player.active) { PlayerWrapper playerWrapper = new PlayerWrapper(player); if (playerWrapper.GetModPlayer <PlayerTyping>().GetAbility().AttractProjectile( new AbilityLookup.AttractProjectileParameters(projWrapper, playerWrapper))) { ClosestTarget newClosest = new ClosestTarget(player, projectile); if (newClosest.distance < closest.distance) { closest = newClosest; } } } } if (closest.id >= 0) { ProjectileHome(projectile, closest, Main.player[closest.id].Center); } } return(base.PreAI(projectile)); }