Advanced HelpMe System

Discussion in 'Plugin Development' started by kmccmk9, Apr 26, 2011.

Thread Status:
Not open for further replies.
  1. Offline

    kmccmk9

    Hello, I'm new to bukkit programming but I have a lot of background knowledge in programming. I am trying to create my own version of the HelpMe Plugin. Here is my main java file. Can someone tell me what is wrong with my getCommand line?

    Code:
    package com.bukkit.kmccmk9.HelpMe;
    
    import java.io.File;
    import java.util.*;
    import org.bukkit.*;
    import org.bukkit.block.Block;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event.Priority;
    import org.bukkit.event.Event;
    import org.bukkit.plugin.PluginDescriptionFile;
    import org.bukkit.plugin.PluginLoader;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class HelpMe extends JavaPlugin{
    
        private final HelpMePlayerListener playerListener = new HelpMePlayerListener(this);
        private final HelpMeBlockListener blockListener = new HelpMeBlockListener(this);
        public final HashMap<Player, ArrayList<Block>> basicUsers = new  HashMap();
        public HelpMe(PluginLoader pluginLoader, Server instance, PluginDescriptionFile desc, File folder, File plugin, ClassLoader cLoader)
        {
            super();
        }
        @Override
        public void onDisable() {
            // TODO Auto-generated method stub
            System.out.println("Goodbye world!");
        }
    
        @Override
        public void onEnable() {
            // TODO Auto-generated method stub
            // Register our events
            PluginManager pm = getServer().getPluginManager();
            pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
            pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Normal, this);
            pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Normal, this);
            pm.registerEvent(Event.Type.BLOCK_PHYSICS, blockListener, Priority.Normal, this);
            pm.registerEvent(Event.Type.BLOCK_CANBUILD, blockListener, Priority.Normal, this);
    
            // Register our commands
            getCommand("helpme").setExecutor(new HelpMeCommand(this));
    
            // EXAMPLE: Custom code, here we just output some info so we can check all is well
            PluginDescriptionFile pdfFile = this.getDescription();
            System.out.println( pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" );
        }
    
    }
     
  2. instead of get command use onCommand and just register your events there

    Code:
    onCommand(CommandSender sender, Command cmd, String label, String[] args){
        if(label.equalsIgnoreCase("helpme"){
            //Do whatever
        }
    }
     
  3. Offline

    kmccmk9

    Thanks for your reply. Ok so I tried your code but got tons of errors. Couldn't I just use the onPlayerCommand function in the HelpMePlayerListener.java file?
     
  4. That code is supposed to go in the main class, and shouldn't be nested within other functions. But if your method works for you then go for it, this is just the way I do things :)
     
  5. Offline

    kmccmk9

    No my method doesn't work at all. I'm finding it very difficult to find documentation on coding. Ok so I use your code in the main and get rid of my function?
     
  6. Offline

    RonnSama

    When you do this is your "HelpMeCommand" class implementing CommandExecutor ? and if so have you updated that info as well in your plugin.yml?
    If so if you post the HelpMeCommand class up here and your plugin.yml I might be able to help you (even tho I'm rather new I just got done trying to figure this out myself and come to find out the basics of getting the command to recognize is extremely strict at least in my opinion.)
     
  7. Offline

    kmccmk9

    I don't have a HelpMeCommand class
     
  8. The package you are using is deprecated for bukkit.

    Try using
    Code:
    me.kmccmk9.HelpMe;
    and see how it turns out. As for coding documentation i know there's very little. I'm in the process of making a fully fledged plugin tutorial though :p
     
    RonnSama likes this.
  9. Offline

    RonnSama

    I never even bothered looking at that. I came after the package name change, so I"m used to using my own pathway lol.
     
  10. Offline

    kmccmk9

    That would be awesome. Ok so I will change my package name to that instead of org.bukkit.
     
  11. :p Also remember to change your plugin.yml main: reference.

    I'll be on the forums actively for another 30minutes or so until I should go to bed :p
     
  12. Offline

    kmccmk9

    Ok dumb question. How do I do that?
     
  13. go to your plugin.yml file

    there should be something in there that looks like this :
    Code:
    main: com.bukkit.kmccmk9.HelpMe.HelpMe
    Change that to:
    Code:
    me.kmccmk9.HelpMe.HelpMe
     
  14. Offline

    kmccmk9

    I don't believe I have a plugin.yml file
     
  15. What? All plugins have to have one otherwise you get a compile error.
     
  16. Offline

    kmccmk9

    Oh ok. Hmm I'm looking at the existing HelpMe plugin source now for help
     
  17. Paste his code into notepad, save it as plugin.yml and then add it to your jar files main directory.

    Code:
    name: HelpMe
    main:me.kmccmk9.HelpMe.HelpMe
    version: 0.1
    commands:
      helpme:
        description: A help plugin
        usage: |
     
  18. Offline

    kmccmk9

    Ok so after adding that file and making all my recorrections this is the console error I recieve

    Code:
    02:02:31 [SEVERE] Could not load 'plugins/HelpMeAdvanced.jar' in folder 'plugins':
    while scanning a simple key
     in "<reader>", line 2, column 1:
        main:me.kmccmk9.HelpMeAdvanced.H ...
        ^
    could not found expected ':'
     in "<reader>", line 3, column 1:
        version: 0.1
        ^
    
            at org.yaml.snakeyaml.scanner.ScannerImpl.stalePossibleSimpleKeys(ScannerImpl.java:400)
            at org.yaml.snakeyaml.scanner.ScannerImpl.needMoreTokens(ScannerImpl.java:231)
            at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:182)
            at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:564)
            at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:163)
            at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:148)
            at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:228)
            at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
            at org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:122)
            at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105)
            at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:124)
            at org.yaml.snakeyaml.Yaml.load(Yaml.java:264)
            at org.yaml.snakeyaml.Yaml.load(Yaml.java:250)
            at org.bukkit.plugin.PluginDescriptionFile.<init>(PluginDescriptionFile.java:30)
            at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:63)
            at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:160)
            at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:108)
            at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:85)
            at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:217)
            at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:204)
            at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:144)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:259)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:394)
    
    I only have one class now, HelpMeAdvanced.java. This file includes this code

    Code:
    package com.bukkit.kmccmk9.HelpMeAdvanced;
    
    // All the imports
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.PluginDescriptionFile;
    import org.bukkit.plugin.java.JavaPlugin;
    import com.nijiko.permissions.PermissionHandler;
    import com.nijikokun.bukkit.Permissions.Permissions;
    import org.bukkit.plugin.Plugin;
    
    /**
     * HelpMeAdvanced for Bukkit
     *
     * @author kmccmk9
     */
    
    //Starts the class
    public class HelpMeAdvanced extends JavaPlugin{
    
        // onDisable
        public void onDisable() {
            PluginDescriptionFile pdfFile = this.getDescription();
            System.out.println( pdfFile.getName() + " is disabled!" );
        }
        // onEnable
        public void onEnable() {
            PluginDescriptionFile pdfFile = this.getDescription();
            System.out.println( pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" );
            setupPermissions();
            }
    
        private void setupPermissions() {
            Plugin permissionsPlugin = this.getServer().getPluginManager().getPlugin("Permissions");
    
              if (HelpMeAdvanced.permissionHandler == null) {
                  if (permissionsPlugin != null) {
                      HelpMeAdvanced.permissionHandler = ((Permissions) permissionsPlugin).getHandler();
                  } else {
                      System.out.println("Permission system not detected, defaulting to OP");
                  }
              }
    
        }
        // Command system
        public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                if(commandLabel.equalsIgnoreCase("helpme")) {
                    player.sendMessage(ChatColor.DARK_GREEN + "A mod or a admin will come and help you soon as possible.");
                    player.sendMessage(ChatColor.DARK_GREEN + "If no one come and helps you within 20 minutes, perform the command again.");
                    getServer().broadcastMessage(ChatColor.DARK_RED + player.getDisplayName() + ChatColor.DARK_GREEN + " need some help!" + " (" + player.getLocation() + ")");
                    if (!HelpMeAdvanced.permissionHandler.has(player, "helpmeadvanced.admin")) {
                          getServer().broadcastMessage("Message sent to Admins");
                      }
                }
            }
            return true;
        }
        public static PermissionHandler permissionHandler;
    
    }
    Also, my new plugin.yml file looks like this

    Code:
    name: HelpMeAdvanced
    main:me.kmccmk9.HelpMeAdvanced.HelpMeAdvanced
    version: 0.1
    commands:
      helpme:
        description: A help plugin
        usage: |
     
  19. YML is a very specific format, if one thing is wrong the whole file breaks.

    Looking at yours you need to add a space after main: and before me.kmc....

    So copy this into your plugin.yml
    Code:
    name: HelpMeAdvanced
    main: me.kmccmk9.HelpMeAdvanced.HelpMeAdvanced
    version: 0.1
    commands:
      helpme:
        description: A help plugin
        usage: |
     
  20. Offline

    kmccmk9

    Ok after making all of those changes, this is the new error I receive.

    Code:
    11:40:55 [SEVERE] Could not load 'plugins/HelpMeAdvanced.jar' in folder 'plugins':
    java.lang.ClassNotFoundException: me.kmccmk9.HelpMeAdvanced.HelpMeAdvanced
            at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
            at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:36)
            at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:24)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:264)
            at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:134)
            at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:160)
            at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:108)
            at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:85)
            at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:217)
            at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:204)
            at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:144)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:259)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:394)
    
     
  21. You need to change the main class attribute.

    me.kmccmk9.HelpMeAdvanced.HelpMeAdvanced

    Where ,should equal

    main: me.kmccmk9.packagename.mainclassname
     
  22. Offline

    kmccmk9

    But my package name is HelpMeAdvanced and the main class is HelpMeAdvanced.java
     
  23. Make sure your plugin is in the main directory of the JAR file. If you cant get it to work then compile the jar file with source code included and I will try to fix it for you.
     
  24. Offline

    kmccmk9

    Sounds good. Ok I have no idea what's wrong so here is my .jar file with source included

    Download
     
  25. Offline

    kmccmk9

  26. Thanks, not finished yet though :p

    Please post in the thread so it stays at the top for others to see :D I'm in the process of writing up the section on saving and loading files so check in in half an hour - 1 hour it should be done :D

    Finally finished writing up the part on saving & loading files, hope it helps you ;)

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 14, 2016
  27. Offline

    kmccmk9

    Thanks so much I will get started right away! :)
     
  28. :D Now I'd like to teach myself about config files aswell ;)
     
    kmccmk9 likes this.
  29. Offline

    Acrobot

    @kmccmk9
    Your files are placed like
    com.bukkit.kmccmk9.HelpMeAdvanced

    1st - you can't use bukkit namespace anymore. Just move it, so it looks like
    com.kmccmk9.HelpMeAdvanced

    2nd - your plugin.yml is looking for
    me.kmccmk9.HelpMeAdvanced.HelpMeAdvanced

    and you (after first fix) have got

    com.kmccmk9.HelpMeAdvanced.HelpMeAdvanced
     
Thread Status:
Not open for further replies.

Share This Page