[Tutorial/Beginner] Making configs

Discussion in 'Resources' started by theguynextdoor, Dec 30, 2011.

  1. Offline

    theguynextdoor

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    The problem you are having is you have a Nullpointer Exception, because your plugin variable is null because you do not have constructor.
    Your executor should look like this at the start:
    Code:
    package me.cedi.setsunny;
     
    import org.bukkit.ChatColor;
    import org.bukkit.World;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.command.ConsoleCommandSender;
    import org.bukkit.entity.Player;
     
    public class SunCommandExecutor implements CommandExecutor{
    SetSunnyCore plugin;
     
    SunCommandExecutor(SetSunnyCore instance){
        plugin = instance;
    }
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    //onCommand(start)-------------------------------------------------
    if (sender instanceof ConsoleCommandSender == true){
    //If ConsoleCommandSender(start)-----------------------------------
     
    //If there are less than 1 arguments after "/sun"
    if(args.length < 1){
     
    sender.sendMessage("Not enough arguments.");
    sender.sendMessage("Correct usage is: /sun [world] [duration]");
     
    }
    Not part of the question, but
    Code:
    if (sender instanceof ConsoleCommandSender == true){
    Should be
    Code:
    if (sender instanceof ConsoleCommandSender){
    Then when registering the command in the main class
    Code:
    this.sunExecutor = new SunCommandExecutor(this);
    this.getCommand("sun").setExecutor(sunExecutor);
    colony88 likes this.
  2. Offline

    theguynextdoor

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    Look at the source of my snowball plugin, i use config values alot in their. The main thing i see people doing wrong, or missing out is the constructor. But as requested, here is my main class for my snowball plugin:
    Code:
    package me.theguynextdoor.snowballnextdoor;
     
    import java.util.logging.Logger;
     
    import me.theguynextdoor.snowballnextdoor.commands.CritCommand;
    import me.theguynextdoor.snowballnextdoor.commands.HeadShotCommand;
    import me.theguynextdoor.snowballnextdoor.commands.IceCommand;
    import me.theguynextdoor.snowballnextdoor.commands.MissCommand;
    import me.theguynextdoor.snowballnextdoor.commands.MobDamageValue;
    import me.theguynextdoor.snowballnextdoor.commands.PlayerDamageValue;
    import me.theguynextdoor.snowballnextdoor.commands.SnowTilePlaceToggle;
    import me.theguynextdoor.snowballnextdoor.commands.SnowballDropToggle;
    import me.theguynextdoor.snowballnextdoor.commands.SnowmanDamage;
    import me.theguynextdoor.snowballnextdoor.listeners.SnowballBlockListener;
    import me.theguynextdoor.snowballnextdoor.listeners.SnowballEntityListener;
    import me.theguynextdoor.snowballnextdoor.listeners.SnowballPlayerListener;
     
    import org.bukkit.Bukkit;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
     
    public class SnowBallNextDoor extends JavaPlugin {
     
        private final Logger log = Logger.getLogger("Minecraft");
        private final SnowballEntityListener entityListener = new SnowballEntityListener(this);
        private final SnowballPlayerListener playerListener = new SnowballPlayerListener(this);
        private final SnowballBlockListener blockListener = new SnowballBlockListener(this);
     
        @Override
        public void onDisable() {
            log.info(this.getDescription().getName() + " has been disabled");
        }
     
        @Override
        public void onEnable() {
     
            final FileConfiguration config = this.getConfig();
     
            config.options().header("The Server.PvP node: Set to true if PvP is enabled, and false if PvP is diabled.");
     
            config.addDefault("Server.PvP", true);
     
            config.addDefault("Toggle.Damage.PlayerDamage", true);
            config.addDefault("Toggle.Damage.MobDamage", true);
            config.addDefault("Toggle.Damage.SnowmanDamage", true);
     
            config.addDefault("Toggle.Snowball.PlaceOnRightClick", true);
            config.addDefault("Toggle.Snowball.SnowTileStacking", true);
            config.addDefault("Toggle.Snowball.PutEntityFiresOut", true);
            config.addDefault("Toggle.Snowball.WaterToIce", true);
     
            config.addDefault("Toggle.Drops.SnowballFromTiles", true);
     
            config.addDefault("Value.PlayerDamage", 2);
            config.addDefault("Value.MobDamage", 2);
            config.addDefault("Value.SnowmanDamage", 2);
     
            config.addDefault("Crit.Chance", true);
            config.addDefault("Crit.DamageExtra", true);
            config.addDefault("Crit.Toggle.Message", true);
     
            config.addDefault("Miss.Chance", true);
            config.addDefault("Miss.Toggle.Message", true);
     
            config.addDefault("Headshot.Toggle.HeadshotDamage", true);
            config.addDefault("Headshot.Toggle.HeadshotMessage", false);
            config.addDefault("Headshot.Value.HeadshotExtraDamageDealt", 1);
     
            config.options().copyDefaults(true);
            saveConfig();
     
            PluginManager pm = Bukkit.getServer().getPluginManager();
     
            pm.registerEvents(playerListener, this);
            pm.registerEvents(blockListener, this);
            pm.registerEvents(entityListener, this);
     
            getCommand("splayer").setExecutor(new PlayerDamageValue(this));
            getCommand("mob").setExecutor(new MobDamageValue(this));
            getCommand("snowman").setExecutor(new SnowmanDamage(this));
            getCommand("snowtile").setExecutor(new SnowTilePlaceToggle(this));
            getCommand("miss").setExecutor(new MissCommand(this));
            getCommand("crit").setExecutor(new CritCommand(this));
            getCommand("headshot").setExecutor(new HeadShotCommand(this));
            getCommand("snowice").setExecutor(new IceCommand(this));
            getCommand("snowball").setExecutor(new SnowballDropToggle(this));
     
            log.info(this.getDescription().getName() + " v" + getDescription().getVersion() + " has been enabled");
        }
    }
    And this is my listener:
    Code:
    package me.theguynextdoor.snowballnextdoor.listeners;
     
    import me.theguynextdoor.snowballnextdoor.SnowBallNextDoor;
    import me.theguynextdoor.snowballnextdoor.Util.Util;
     
    import org.bukkit.Bukkit;
    import org.bukkit.GameMode;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.LivingEntity;
    import org.bukkit.entity.Player;
    import org.bukkit.entity.Projectile;
    import org.bukkit.entity.Snowball;
    import org.bukkit.entity.Snowman;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.permissions.Permissible;
     
    public class SnowballEntityListener implements Listener {
        SnowBallNextDoor plugin;
     
        public SnowballEntityListener(SnowBallNextDoor instance) {
            plugin = instance;
        }
     
        private int damage;
     
        @EventHandler
        public void onEntityDamage(EntityDamageEvent e) {
            if (e instanceof EntityDamageByEntityEvent) {
                for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                    if (player.hasPermission("snowball.use") || player.isOp()) {
                        Entity attacker = ((EntityDamageByEntityEvent) e).getDamager();
     
                        double crit = Math.random() * 20;
                        double dif = attacker.getLocation().getY() - e.getEntity().getLocation().getY() - 1.5;
     
                        if (attacker instanceof Snowball) {
                            Entity damaged = e.getEntity();
     
                            if (e.isCancelled()) {
                                e.setCancelled(false);
                            }
                            // Null check
                            if (damaged == null || ((Projectile) attacker).getShooter() == null) {
                                return;
                            }
                            // Snowman damage
                            if (((Snowball) attacker).getShooter() instanceof Snowman && plugin.getConfig().getBoolean("Toggle.Damage.SnowmanDamage")) {
                                damage = plugin.getConfig().getInt("Value.SnowmanDamage");
                            }
                            // Player damage
                            else if (damaged instanceof Player && plugin.getConfig().getBoolean("Toggle.Damage.PlayerDamage")) {
                                damage = plugin.getConfig().getInt("Value.PlayerDamage");
                            }
                            // Mob damage
                            else if (damaged instanceof LivingEntity && !(damaged instanceof Player) && plugin.getConfig().getBoolean("Toggle.Damage.MobDamage")) {
                                damage = plugin.getConfig().getInt("Value.MobDamage");
                            }
                            // Headshots
                            if (dif > 0.1 && dif < 0.5 && e.getEntity() instanceof Player && ((Player) damaged).getGameMode() != GameMode.CREATIVE) {
                                if (plugin.getConfig().getBoolean("Headshot.Toggle.HeadshotDamage")) {
                                    damage = damage + plugin.getConfig().getInt("Headshot.Value.HeadshotExtraDamageDealt");
                                    if (((Projectile) attacker).getShooter() == null) {
                                        return;
                                    }
                                    // Daze
                                    if (((Projectile) attacker).getShooter() instanceof Player) {
                                        if (((Permissible) ((Projectile) attacker).getShooter()).hasPermission("snowball.daze")) {
                                            if (Math.random() * 1000 >= 500) {
                                                Util.dazePlayer((Player) damaged);
                                            }
                                        }
                                    }
     
                                    if (plugin.getConfig().getBoolean("Headshot.Toggle.HeadshotMessage")) {
                                        if (damaged instanceof Player) {
     
                                            ((Player) damaged).sendMessage("Headshot from " + ((Player) ((Projectile) attacker).getShooter()).getDisplayName());
                                        }
                                        if (((Projectile) attacker).getShooter() instanceof Player) {
                                            ((Player) ((Projectile) attacker).getShooter()).sendMessage("Headshot dealt to " + ((Player) damaged).getDisplayName());
                                        }
                                    }
                                }
                            }
     
                            // Crit
                            if (((Snowball) attacker).getShooter() instanceof Player) {
                                if (crit >= 19) {
                                    if (plugin.getConfig().getBoolean("Crit.Chance")) {
                                        damage = damage + plugin.getConfig().getInt("Crit.DamageExtra");
                                        if (plugin.getConfig().getBoolean("Crit.Toggle.Message")) {
                                            ((Player) ((Projectile) attacker).getShooter()).sendMessage("Crit");
                                        }
                                    }
                                }
                                // Miss
                                else if (crit <= 1) {
                                    if (plugin.getConfig().getBoolean("Miss.Chance")) {
                                        damage = 0;
                                        if (plugin.getConfig().getBoolean("Miss.Toggle.Message")) {
                                            ((Player) ((Projectile) attacker).getShooter()).sendMessage("Miss");
                                        }
                                    }
                                }
                            }
     
                            // Put fires out on entities
                            if (damaged.getFireTicks() > 0) {
                                damaged.setFireTicks(0);
                            }
     
                            // Setting final damage
                            if (damaged instanceof Player) {
                                if (((Player) damaged).getHealth() > 20 || ((Player) damaged).getHealth() <= 0) {
                                    return;
                                }
                                if (plugin.getConfig().getBoolean("Server.PvP")) {
                                    e.setDamage(damage);
                                }
                                else {
                                    ((Player) damaged).setHealth(((Player) damaged).getHealth() - damage);
                                }
                            }
                            else {
                                e.setDamage(damage);
                            }
                        }
                    }
                }
            }
        }
    }
  3. Offline

    wannezz

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    Great tutorial! :)
  4. Online

    lenis0012

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    how can i use a boolean in a Listener?
    it makes the getConfig red -_-
  5. Offline

    theguynextdoor

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
  6. Offline

    TopGear93

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
  7. Offline

    plarsootje

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
  8. Offline

    Theway2cool1

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    I've done everything, as far as I can tell, according to instruction, and this thing still doesn't want to cooperate. Every time I try to get a boolean from the config, my console gets flooded with these messages:
    Code:
    08:05:57 [SEVERE] Could not pass event CreatureSpawnEvent to ServerProtect
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:304)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at org.bukkit.craftbukkit.event.CraftEventFactory.callCreatureSpawnEvent
    (CraftEventFactory.java:226)
            at net.minecraft.server.World.addEntity(World.java:887)
            at net.minecraft.server.SpawnerCreature.spawnEntities(SpawnerCreature.ja
    va:180)
            at net.minecraft.server.World.doTick(World.java:1735)
            at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:546)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:451)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:492)
    Caused by: java.lang.NullPointerException
            at com.gmail.thecotlsdragon98.ServerProtect.MobSpawnListener.MobSpawn(Mo
    bSpawnListener.java:21)
            at sun.reflect.GeneratedMethodAccessor14.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:302)
            ... 10 more
    Here is the onEnable() method from my main class:

    Code:
        public ServerProtect plugin;
        @Override
        public void onEnable()
        {
            getLogger().info("ServerProtect v1.1 enabled");
            PluginManager manager = this.getServer().getPluginManager();
            manager.registerEvents(new TNTListener(), this);
            manager.registerEvents(new FireBlockListener(), this);
            manager.registerEvents(new FireChargeListener(), this);
            manager.registerEvents(new FlintAndSteelListener(), this);
            manager.registerEvents(new BedrockBreakListener(), this);
            manager.registerEvents(new BedrockPlaceListener(), this);
            manager.registerEvents(new RedstoneListener(), this);
            manager.registerEvents(new LavaListener(), this);
            manager.registerEvents(new WaterListener(), this);
            manager.registerEvents(new UglyBlockListener(), this);
            manager.registerEvents(new BowAndArrowListener(), this);
            manager.registerEvents(new EggListener(), this);
            manager.registerEvents(new ExpBottleListener(), this);
            manager.registerEvents(new MobSpawnerListener(), this);
            manager.registerEvents(new ItemDropListener(), this);
            manager.registerEvents(new EnderPearlListener(), this);
            manager.registerEvents(new SnowballListener(), this);
            manager.registerEvents(new EnderEyeListener(), this);
            manager.registerEvents(new DispenserListener(), this);
            manager.registerEvents(new MobSpawnListener(plugin), this);
            FileConfiguration config = this.getConfig();
            config.addDefault("mob-spawning.disabled", false);
            config.options().copyDefaults(true);
            saveConfig();
        }
    And here is the class that is causing the issue:


    Code:
    package com.gmail.thecotlsdragon98.ServerProtect;
     
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.CreatureSpawnEvent;
    import com.gmail.thecotlsdragon98.ServerProtect.ServerProtect;
     
    class MobSpawnListener extends ServerProtect implements Listener
    {
        ServerProtect plugin;
     
        public MobSpawnListener(ServerProtect instance) {
        plugin = instance;
        }
     
     
        @EventHandler()
        public void MobSpawn(CreatureSpawnEvent event)
        {
            if(plugin.getConfig().getBoolean("mob-spawning.disabled"))
            {
                event.setCancelled(true);
            }
        }
    }
  9. Offline

    theguynextdoor

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    The problem is, in your main class you made a variable called plugin, never initialised it and then put in when you defined your listener. What you need to do is when you register the events for the class MobSpawnListener you want to do it like this.

    manager.registerEvents(new MobSpawnListener(this), this);

    or at the very least, at the top of your onEnable put:

    plugin = this;
  10. Offline

    Theway2cool1

    dev.bukkit.org profile:
    CFUSERNAME
    My Plugins (CFCOUNT)
    Hum. Eclipse told me to do manager.registerEvents(new MobSpawnListener(plugin), this);
    Maybe I should stop listening to Eclipse. Anyways, that fixed the issue, you're the first to actually help me figure out how to get a config working. You sir, are an awesome individual.

Share This Page