Pakkit(Plugin plugin) {
        this.plugin = plugin;
        final String serverPackage = this.plugin.getServer().getClass().getPackage().getName();
        final String version = serverPackage.substring(serverPackage.lastIndexOf('.') + 1);
        try {
            this.craftPlayer = Class.forName(serverPackage + ".entity.CraftPlayer");
            this.getHandle = this.craftPlayer.getMethod("getHandle");
            this.entityPlayerClass = this.getHandle.getReturnType();
            this.playerConnectionField = this.entityPlayerClass.getField("playerConnection");
            this.playerConnectionField.setAccessible(true);
            this.playerConnectionClass = this.playerConnectionField.getType();
            this.networkManagerField = this.playerConnectionClass.getField("networkManager");
            this.networkManagerField.setAccessible(true);
            this.networkManagerClass = this.networkManagerField.getType();
            for (final Field field : this.networkManagerClass.getDeclaredFields()) {
                if (field.getType().equals(Channel.class)) {
                    this.channelFields.add(field);
                    field.setAccessible(true);
                }
            }
            if (this.channelFields.isEmpty()) {
                throw new Exception("NO CHANNELS IN NETWORK MANAGER OMG");
            }
        } catch (final Exception e) {
            plugin.getLogger().log(Level.SEVERE, "Could not start, unknown stuffs", e);
            return;
        }
        for (final Map.Entry<String, Object> entry : plugin.getConfig().getValues(false).entrySet()) {
            if (entry.getValue() instanceof ConfigurationSection) {
                Class<?> clazz;
                try {
                    clazz = Class.forName("net.minecraft.server." + version + "." + entry.getKey());
                } catch (final ClassNotFoundException e) {
                    plugin.getLogger().info("Ignoring entry " + entry.getKey());
                    continue;
                }
                final ConfigurationSection pac = (ConfigurationSection) entry.getValue();
                this.packets.put(clazz, new PakkitPacket(clazz, pac.getBoolean("enabled", false), pac.getBoolean("full", true)));
            }
        }
        plugin.getCommand("pakkit").setExecutor(new Command(this));
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
        for (final Player player : plugin.getServer().getOnlinePlayers()) {
            this.inject(player);
        }
    }