// Path: src/main/java/com/kit/core/control/PluginManager.java
// public final class PluginManager {
//     private final CopyOnWriteArrayList<Plugin.SchedulableRunnable> scheduledRunnables = new CopyOnWriteArrayList<>();
//     private final CopyOnWriteArrayList<Plugin> enabledPlugins = new CopyOnWriteArrayList<>();
//     private final ScheduledExecutorService lifecycleManager = Executors.newSingleThreadScheduledExecutor();
//     private final Logger logger = Logger.getLogger(PluginManager.class);
// 
//     private final List<Plugin> plugins = new ArrayList<>();
//     private final Events eventBus;
//     private final Session session;
//     private boolean pluginsStarted;
// 
//     public PluginManager(Session session) {
//         this.eventBus = session.getEventBus();
//         this.session = session;
//         eventBus.register(this);
//     }
// 
//     public void startPlugin(Plugin plugin) {
//         eventBus.register(plugin);
//         plugin.start();
//         scheduledRunnables.addAll(plugin.getRunnables());
//         enabledPlugins.add(plugin);
//     }
// 
//     public void stopPlugin(Plugin plugin) {
//         eventBus.deregister(plugin);
//         scheduledRunnables.removeAll(plugin.getRunnables());
//         plugin.stop();
//         enabledPlugins.remove(plugin);
//     }
// 
//     public void start() {
//         try {
// //            plugins.add(new SocialStreamPlugin(this));
// //            plugins.add(new QuickHopPlugin(this));
//             plugins.add(new HiscorePlugin(this));
//             plugins.add(new GrandExchangePlugin(this));
//             plugins.add(new XPTrackerPlugin(this));
//             plugins.add(new NotesPlugin(this));
// 
// 
//             plugins.add(new DebugPlugin(this));
// 
//             plugins.add(new InventoryMarkerPlugin(this));
// 
//             plugins.add(new ClanPlugin(this));
// 
//             plugins.add(new LootOverlayPlugin(this));
//             plugins.add(new CombatPlugin(this));
//             plugins.add(new FishingPlugin(this));
//             plugins.add(new RememberMeOverlayPlugin(this));
//             plugins.add(new WoodcuttingOverlayPlugin(this));
//             plugins.add(new MiningOverlayPlugin(this));
//             plugins.add(new BoostsOverlayPlugin(this));
//             plugins.add(new RunecraftingOverlayPlugin(this));
//             plugins.add(new BankValuatorPlugin(this));
//             plugins.add(new FirstActionOverlayPlugin(this));
//             plugins.add(new FoodOverlayPlugin(this));
//             plugins.add(new NpcMarkerOverlayPlugin(this));
//             plugins.add(new AgilityOverlayPlugin(this));
//             //plugins.add(new CannonOverlayPlugin(this));
//             plugins.add(new NpcKillCounterOverlayPlugin(this));
//             plugins.add(new KillCounterOverlayPlugin(this));
//             plugins.add(new LootProfitAndDropRecorder(this));
//             plugins.add(new TradeOverlayPlugin(this));
//             plugins.add(new WintertodtPlugin(this));
// 
//             plugins.add(new LevelUpCapturerPlugin(this));
//             plugins.add(new QuickChatPlugin(this));
//             plugins.add(new ItemExaminePricePlugin(this));
//             plugins.add(new FriendClanChatMinimapMarkerPlugin(this));
// //            plugins.add(new ClueScrollPlugin(this));
// 
//             plugins.add(new IdleNotifierPlugin(this));
//             plugins.add(new LogoutNotifierPlugin(this));
//             plugins.add(new AFKMentionNotifierPlugin(this));
//             plugins.add(new TradeNotifierPlugin(this));
// 
// //            plugins.add(new WorldMapPlugin(this));
// //            plugins.add(new DeathMarkerPlugin(this));
// 
//             plugins.add(new PlayerStatsPlugin(this));
// 
//             plugins.add(new TwitchChatPlugin(this));
// 
//             plugins.add(new AFKWatcherPlugin(this));
// 
//             lifecycleManager.scheduleAtFixedRate(this::updateLifecycle, 0, 500, TimeUnit.MILLISECONDS);
//         } catch (Exception e) {
//             logger.error("Error creating plugins", e);
//         }
//     }
// 
//     public void stop() {
//         plugins.forEach(this::stopPlugin);
//     }
// 
//     @EventHandler
//     public void onClientLoop(ClientLoopEvent event) {
//         for (Plugin.SchedulableRunnable runnable : scheduledRunnables) {
//             long timePast = System.currentTimeMillis() - runnable.getLastRan();
//             if (timePast > runnable.getMillis()) {
//                 try {
//                     runnable.run();
//                 } catch (Exception e) {
//                     logger.error("Error executing runnable", e);
//                 }
//             }
//         }
//     }
// 
//     private void updateLifecycle() {
//         plugins.forEach(plugin -> {
//             if (plugin.isEnabled() && !enabledPlugins.contains(plugin)) {
//                 try {
//                     startPlugin(plugin);
//                 } catch (Exception e) {
//                     logger.error("Error starting plugin", e);
//                 }
//             } else if (!plugin.isEnabled() && enabledPlugins.contains(plugin)) {
//                 try {
//                     stopPlugin(plugin);
//                 } catch (Exception e) {
//                     logger.error("Error stopping plugin", e);
//                 }
//             }
//         });
//         pluginsStarted = true;
//     }
// 
//     public boolean isPluginsStarted() {
//         return pluginsStarted;
//     }
// 
//     public boolean isReady() {
//         return session.getState() == Session.State.ACTIVE;
//     }
// 
//     public List<Plugin> getPlugins() {
//         return plugins;
//     }
// }


import com.kit.Application;
import com.kit.api.overlay.BoxOverlay;
import com.kit.api.plugin.Option;
import com.kit.api.plugin.Plugin;
import com.kit.api.plugin.Schedule;
import com.kit.api.util.ColorUtils;
import com.kit.api.util.PaintUtils;
import com.kit.core.control.PluginManager;
import com.kit.plugins.skills.mining.MiningOverlayPlugin;
import java.awt.*;
package com.kit.plugins.combat;



/**
 * Created by Matt on 13/09/2016.
 */
public class CannonOverlayPlugin extends Plugin {
    private final CannonBoxOverlay boxOverlay = new CannonBoxOverlay(this);

    @Option(label = "Floating overlay", value = "false", type = Option.Type.TOGGLE)
    private boolean floating;


    int cannonBalls = 0;

// Path: src/main/java/com/kit/core/control/PluginManager.java
// public final class PluginManager {
//     private final CopyOnWriteArrayList<Plugin.SchedulableRunnable> scheduledRunnables = new CopyOnWriteArrayList<>();
//     private final CopyOnWriteArrayList<Plugin> enabledPlugins = new CopyOnWriteArrayList<>();
//     private final ScheduledExecutorService lifecycleManager = Executors.newSingleThreadScheduledExecutor();
//     private final Logger logger = Logger.getLogger(PluginManager.class);
// 
//     private final List<Plugin> plugins = new ArrayList<>();
//     private final Events eventBus;
//     private final Session session;
//     private boolean pluginsStarted;
// 
//     public PluginManager(Session session) {
//         this.eventBus = session.getEventBus();
//         this.session = session;
//         eventBus.register(this);
//     }
// 
//     public void startPlugin(Plugin plugin) {
//         eventBus.register(plugin);
//         plugin.start();
//         scheduledRunnables.addAll(plugin.getRunnables());
//         enabledPlugins.add(plugin);
//     }
// 
//     public void stopPlugin(Plugin plugin) {
//         eventBus.deregister(plugin);
//         scheduledRunnables.removeAll(plugin.getRunnables());
//         plugin.stop();
//         enabledPlugins.remove(plugin);
//     }
// 
//     public void start() {
//         try {
// //            plugins.add(new SocialStreamPlugin(this));
// //            plugins.add(new QuickHopPlugin(this));
//             plugins.add(new HiscorePlugin(this));
//             plugins.add(new GrandExchangePlugin(this));
//             plugins.add(new XPTrackerPlugin(this));
//             plugins.add(new NotesPlugin(this));
// 
// 
//             plugins.add(new DebugPlugin(this));
// 
//             plugins.add(new InventoryMarkerPlugin(this));
// 
//             plugins.add(new ClanPlugin(this));
// 
//             plugins.add(new LootOverlayPlugin(this));
//             plugins.add(new CombatPlugin(this));
//             plugins.add(new FishingPlugin(this));
//             plugins.add(new RememberMeOverlayPlugin(this));
//             plugins.add(new WoodcuttingOverlayPlugin(this));
//             plugins.add(new MiningOverlayPlugin(this));
//             plugins.add(new BoostsOverlayPlugin(this));
//             plugins.add(new RunecraftingOverlayPlugin(this));
//             plugins.add(new BankValuatorPlugin(this));
//             plugins.add(new FirstActionOverlayPlugin(this));
//             plugins.add(new FoodOverlayPlugin(this));
//             plugins.add(new NpcMarkerOverlayPlugin(this));
//             plugins.add(new AgilityOverlayPlugin(this));
//             //plugins.add(new CannonOverlayPlugin(this));
//             plugins.add(new NpcKillCounterOverlayPlugin(this));
//             plugins.add(new KillCounterOverlayPlugin(this));
//             plugins.add(new LootProfitAndDropRecorder(this));
//             plugins.add(new TradeOverlayPlugin(this));
//             plugins.add(new WintertodtPlugin(this));
// 
//             plugins.add(new LevelUpCapturerPlugin(this));
//             plugins.add(new QuickChatPlugin(this));
//             plugins.add(new ItemExaminePricePlugin(this));
//             plugins.add(new FriendClanChatMinimapMarkerPlugin(this));
// //            plugins.add(new ClueScrollPlugin(this));
// 
//             plugins.add(new IdleNotifierPlugin(this));
//             plugins.add(new LogoutNotifierPlugin(this));
//             plugins.add(new AFKMentionNotifierPlugin(this));
//             plugins.add(new TradeNotifierPlugin(this));
// 
// //            plugins.add(new WorldMapPlugin(this));
// //            plugins.add(new DeathMarkerPlugin(this));
// 
//             plugins.add(new PlayerStatsPlugin(this));
// 
//             plugins.add(new TwitchChatPlugin(this));
// 
//             plugins.add(new AFKWatcherPlugin(this));
// 
//             lifecycleManager.scheduleAtFixedRate(this::updateLifecycle, 0, 500, TimeUnit.MILLISECONDS);
//         } catch (Exception e) {
//             logger.error("Error creating plugins", e);
//         }
//     }
// 
//     public void stop() {
//         plugins.forEach(this::stopPlugin);
//     }
// 
//     @EventHandler
//     public void onClientLoop(ClientLoopEvent event) {
//         for (Plugin.SchedulableRunnable runnable : scheduledRunnables) {
//             long timePast = System.currentTimeMillis() - runnable.getLastRan();
//             if (timePast > runnable.getMillis()) {
//                 try {
//                     runnable.run();
//                 } catch (Exception e) {
//                     logger.error("Error executing runnable", e);
//                 }
//             }
//         }
//     }
// 
//     private void updateLifecycle() {
//         plugins.forEach(plugin -> {
//             if (plugin.isEnabled() && !enabledPlugins.contains(plugin)) {
//                 try {
//                     startPlugin(plugin);
//                 } catch (Exception e) {
//                     logger.error("Error starting plugin", e);
//                 }
//             } else if (!plugin.isEnabled() && enabledPlugins.contains(plugin)) {
//                 try {
//                     stopPlugin(plugin);
//                 } catch (Exception e) {
//                     logger.error("Error stopping plugin", e);
//                 }
//             }
//         });
//         pluginsStarted = true;
//     }
// 
//     public boolean isPluginsStarted() {
//         return pluginsStarted;
//     }
// 
//     public boolean isReady() {
//         return session.getState() == Session.State.ACTIVE;
//     }
// 
//     public List<Plugin> getPlugins() {
//         return plugins;
//     }
// }


// Path: src/main/java/com/kit/plugins/combat/CannonOverlayPlugin.java
import com.kit.Application;
import com.kit.api.overlay.BoxOverlay;
import com.kit.api.plugin.Option;
import com.kit.api.plugin.Plugin;
import com.kit.api.plugin.Schedule;
import com.kit.api.util.ColorUtils;
import com.kit.api.util.PaintUtils;
import com.kit.core.control.PluginManager;
import com.kit.plugins.skills.mining.MiningOverlayPlugin;
import java.awt.*;

package com.kit.plugins.combat;



/**
 * Created by Matt on 13/09/2016.
 */
public class CannonOverlayPlugin extends Plugin {
    private final CannonBoxOverlay boxOverlay = new CannonBoxOverlay(this);

    @Option(label = "Floating overlay", value = "false", type = Option.Type.TOGGLE)
    private boolean floating;


    int cannonBalls = 0;

    public CannonOverlayPlugin(PluginManager manager) {