Bukkit Custom Recipies

Discussion in 'Plugin Development' started by AngryCupcake274, Nov 26, 2014.

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

    AngryCupcake274

    Hello there, I'm back with another Bukkit question! I am making a custom crafting recipe, but I want the user to have to have a certain permission to be able to craft it. How would I go about doing that?
     
  2. Offline

    Skionz

    AngryCupcake274 You would use the CraftItemEvent and cancel it if they don't have permission for the recipe.
     
  3. Offline

    AngryCupcake274

    Skionz How would I test what type of item they are crafting if it is a custom item? I want them to have to have a permission to craft a spawner, but they need a different permission to create a different spawner.
     
  4. Offline

    Skionz

  5. Offline

    AngryCupcake274

    Skionz After getting the recipe, how do I test it with the correct recipe? Would there be a
    Code:java
    1. if ([event].getRecipe = creeperegg.shape("***", "*$*", "***") {
    2. // Do stuff
    3. }

    Or a
    Code:java
    1. if ([event].getRecipe = (Material.[item], Material.[item]...) {
    2. // do stuff
    3. }
     
  6. Offline

    Skionz

    AngryCupcake274 Recipe#getResult() returns an ItemStack that you can check.
     
  7. Offline

    AngryCupcake274

    Skionz So I could do....
    Code:java
    1. ItemStack temp = [event].getRecipe().getResult();

    So if there were two different items used, how would I get both of them. Also, how would I get where they are in the crafting table?
     
  8. Offline

    Skionz

  9. Offline

    AngryCupcake274

    Skionz Can an ItemStack hold all 9 values? If so, how would I test all 9 of them?
     
  10. Offline

    Skionz

    AngryCupcake274 As I have said before. The returned ItemStack is the result of the crafting recipe not the ingredients.
     
  11. Offline

    guitargun

  12. Offline

    AngryCupcake274

    Skionz So how can I compare the ItemStack with multiple items to the crafting recipe?
     
  13. Offline

    Skionz

  14. Offline

    AngryCupcake274

    Skionz to make sure they are crafting my item; if they were, I could test to make sure they have permission.
     
  15. Offline

    Skionz

    AngryCupcake274 Or you could just check if the result ItemStack is the same as the result of your recipe.
     
  16. Offline

    AngryCupcake274

    Skionz I feel so stupid. I didn't have time to see your post when you wrote it, but a few minutes ago, it all just clicked in my mind. I'll test it tomorrow and report back.
     
    Skionz likes this.
  17. Offline

    AngryCupcake274

    @Skionz I'm back! So, can I use
    Code:
    ItemStack temp = event.getRecipe().getResult();
    
    if (temp.equals(rh.creeper)) {
        // check for permissions
    }
    in my CraftItemEvent event?
     
  18. Offline

    Skionz

    @AngryCupcake274 No. Setup a new recipe when your plugin is enabled. There is no reason to do that.
     
  19. Offline

    AngryCupcake274

    @Skionz I forgot to mention (sorry!), that in another class, there is a list of all the ItemStacks and ShapedRecipes to craft. The "rh.creeper" is the ItemStack for a creeper egg. Is my code above the correct way to test the two ItemStacks?
     
  20. Offline

    Skionz

    @AngryCupcake274 The ItemStacks must be completely similar though. What is even the point of this? I don't get why you need to compare them at all.
     
  21. Offline

    AngryCupcake274

    @Skionz I'm testing to see if the result of what the player is crafting is the same as the creeper egg ItemStack. If it's true, then I test to see if they have permissions to do it.
     
  22. Offline

    Skionz

  23. Offline

    AngryCupcake274

    @Skionz the reason I do this is because that Material would be....
    Code:
    Material.MONSTER_EGG, 1, (short) 50
    Also, I'm now getting a new error:
    Code:
    [20:23:14] [Server thread/INFO]: [SpawnerManager] Enabling SpawnerManager v1.1.2
    [20:23:14] [Server thread/INFO]: [0;36;22m==== Loading SpawnerManager ====[m
    [20:23:14] [Server thread/INFO]: [m
    [20:23:14] [Server thread/INFO]: [0;31;1mSpawnerManager - main class enabled![m
    [20:23:14] [Server thread/INFO]: [0;33;1mRecipeHandler - class enabled![m
    [20:23:14] [Server thread/INFO]: [m
    [20:23:14] [Server thread/INFO]: [0;36;22m==== Loaded SpawnerManager ====[m
    [20:23:14] [Server thread/ERROR]: Error occurred while enabling SpawnerManager v1.1.2 (Is it up to date?)
    java.lang.IllegalArgumentException: Symbol does not appear in the shape:35
        at org.apache.commons.lang.Validate.isTrue(Validate.java:103) ~[craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.inventory.ShapedRecipe.setIngredient(ShapedRecipe.java:103) ~[craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.inventory.ShapedRecipe.setIngredient(ShapedRecipe.java:89) ~[craftbukkit.jar:git-Bukkit-6b061e2]
        at me.AngryCupcake274.SpawnerManager.Main.addRecipes(Main.java:77) ~[?:?]
        at me.AngryCupcake274.SpawnerManager.Main.onEnable(Main.java:27) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:327) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.loadPlugin(CraftServer.java:340) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.enablePlugins(CraftServer.java:312) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.reload(CraftServer.java:723) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.Bukkit.reload(Bukkit.java:543) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:140) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.dispatchCommand(CraftServer.java:624) [craftbukkit.jar:git-Bukkit-6b061e2]
        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.dispatchServerCommand(CraftServer.java:610) [craftbukkit.jar:git-Bukkit-6b061e2]
        at net.minecraft.server.v1_8_R1.DedicatedServer.aM(DedicatedServer.java:320) [craftbukkit.jar:git-Bukkit-6b061e2]
        at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:285) [craftbukkit.jar:git-Bukkit-6b061e2]
        at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:598) [craftbukkit.jar:git-Bukkit-6b061e2]
        at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:506) [craftbukkit.jar:git-Bukkit-6b061e2]
        at java.lang.Thread.run(Unknown Source) [?:1.7.0_60]
    I've set up my shapes like the tutorial says, so I have no clue what the issue is. Here is the code from the main class:
    Code:
    package me.AngryCupcake274.SpawnerManager;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.Server;
    import org.bukkit.command.ConsoleCommandSender;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main extends JavaPlugin {
       
        // variables for technical uses
        Server server;
        ConsoleCommandSender console;
       
        // variables for getting plugins
        private final RecipeHandler rh = new RecipeHandler();
       
        @Override
        public void onEnable() {
            server = Bukkit.getServer();
            console = server.getConsoleSender();
           
            // test to make sure all classes are active
            reachClasses();
           
            addRecipes();
        }
       
        @Override
        public void onDisable() {
            console.sendMessage(ChatColor.RED + "==== Disabled SpawnerManager ====");
        }
       
        public void reachClasses() {
            console.sendMessage(ChatColor.DARK_AQUA + "==== Loading SpawnerManager ====");
            console.sendMessage("");
           
            console.sendMessage(ChatColor.RED + "SpawnerManager - main class enabled!");
           
            if (rh.test == 1) {
                console.sendMessage(ChatColor.YELLOW + "RecipeHandler - class enabled!");
            }
           
            console.sendMessage("");
            console.sendMessage(ChatColor.DARK_AQUA + "==== Loaded SpawnerManager ====");
        }
       
        public void addRecipes() {
           
            rh.creeperegg.shape("***", "*$*", "***");
            rh.creeperegg.setIngredient('*', Material.SULPHUR);
            rh.creeperegg.setIngredient('$', Material.EGG);
           
            rh.skeletonegg.shape("#*#", "*$*", "#*#");
            rh.skeletonegg.setIngredient('#', Material.BONE);
            rh.skeletonegg.setIngredient('*', Material.ARROW);
            rh.skeletonegg.setIngredient('$', Material.EGG);
           
            rh.spideregg.shape("***", "*$*", "***");
            rh.spideregg.setIngredient('*', Material.STRING);
            rh.spideregg.setIngredient('$', Material.EGG);
           
            rh.zombieegg.shape("***", "*$*", "***");
            rh.zombieegg.setIngredient('*', Material.ROTTEN_FLESH);
            rh.zombieegg.setIngredient('$', Material.EGG);
           
            rh.slimeegg.shape("***", "*$*", "***");
            rh.slimeegg.setIngredient('*', Material.SLIME_BALL);
            rh.slimeegg.setIngredient('$', Material.EGG);
           
            rh.ghastegg.shape("#*#", "*$*", "#*#");
            rh.ghastegg.setIngredient('*', Material.GHAST_TEAR);
            rh.ghastegg.setIngredient('$', Material.EGG);
           
            rh.pigzombieegg.shape("***", "*$*", "***");
            rh.pigzombieegg.setIngredient('#', Material.GOLD_NUGGET);
            rh.pigzombieegg.setIngredient('*', Material.ROTTEN_FLESH);
            rh.pigzombieegg.setIngredient('$', Material.EGG);
           
            rh.endermanegg.shape("***", "*$*", "***");
            rh.endermanegg.setIngredient('*', Material.ENDER_PEARL);
            rh.endermanegg.setIngredient('$', Material.EGG);
           
            rh.cavespideregg.shape("#*#", "*$*", "#*#");
            rh.cavespideregg.setIngredient('#', Material.SPIDER_EYE);
            rh.cavespideregg.setIngredient('*', Material.STRING);
            rh.cavespideregg.setIngredient('$', Material.EGG);
           
            rh.silverfishegg.shape("***", "*$*", "***");
            rh.silverfishegg.setIngredient('*', Material.IRON_INGOT);
            rh.silverfishegg.setIngredient('$', Material.EGG);
           
            rh.blazeegg.shape("***", "*$*", "***");
            rh.blazeegg.setIngredient('*', Material.BLAZE_ROD);
            rh.blazeegg.setIngredient('$', Material.EGG);
           
            rh.magmacubeegg.shape("***", "*$*", "***");
            rh.magmacubeegg.setIngredient('*', Material.MAGMA_CREAM);
            rh.magmacubeegg.setIngredient('$', Material.EGG);
           
            rh.bategg.shape("***", "*$*", "***");
            rh.bategg.setIngredient('*', Material.COAL_BLOCK);
            rh.bategg.setIngredient('$', Material.EGG);
           
            rh.witchegg.shape("#*#", "*$*", "#*#");
            rh.witchegg.setIngredient('#', Material.SPIDER_EYE);
            rh.witchegg.setIngredient('*', Material.SUGAR);
            rh.witchegg.setIngredient('$', Material.EGG);
           
            rh.endermiteegg.shape("#*#", "***", "#*#");
            rh.endermiteegg.setIngredient('#', Material.OBSIDIAN);
            rh.endermiteegg.setIngredient('*', Material.ENDER_PEARL);
            rh.endermiteegg.setIngredient('$', Material.EGG);
           
            // rh.guardianegg.shape("***", "*$*", "***");
            // rh.guardianegg.setIngredient('*', Material.[1.8 Item]);
            // rh.guardianegg.setIngredient('$', Material.EGG);
           
            rh.pigegg.shape("***", "*$*", "***");
            rh.pigegg.setIngredient('*', Material.CARROT);
            rh.pigegg.setIngredient('$', Material.EGG);
           
            rh.sheepegg.shape("***", "*$*", "***");
            rh.sheepegg.setIngredient('*', Material.WOOL);
            rh.sheepegg.setIngredient('$', Material.EGG);
           
            rh.cowegg.shape("***", "*$*", "***");
            rh.cowegg.setIngredient('*', Material.RAW_BEEF);
            rh.cowegg.setIngredient('$', Material.EGG);
           
            rh.chickenegg.shape("***", "*$*", "***");
            rh.chickenegg.setIngredient('*', Material.RAW_CHICKEN);
            rh.chickenegg.setIngredient('$', Material.EGG);
           
            rh.squidegg.shape("***", "*$*", "***");
            rh.squidegg.setIngredient('*', Material.INK_SACK);
            rh.squidegg.setIngredient('$', Material.EGG);
           
            rh.wolfegg.shape("***", "*$*", "***");
            rh.wolfegg.setIngredient('*', Material.BONE);
            rh.wolfegg.setIngredient('$', Material.EGG);
           
            rh.mushroomcowegg.shape("#*#", "*$*", "#*#");
            rh.mushroomcowegg.setIngredient('#', Material.RED_MUSHROOM);
            rh.mushroomcowegg.setIngredient('*', Material.RAW_BEEF);
            rh.mushroomcowegg.setIngredient('$', Material.EGG);
           
            rh.ocelotegg.shape("***", "*$*", "***");
            rh.ocelotegg.setIngredient('*', Material.RAW_FISH);
            rh.ocelotegg.setIngredient('$', Material.EGG);
           
            rh.horseegg.shape("#*#", "*$*", "#*#");
            rh.horseegg.setIngredient('#', Material.SADDLE);
            rh.horseegg.setIngredient('*', Material.LEASH);
            rh.horseegg.setIngredient('$', Material.EGG);
           
            // rh.rabbitegg.shape("***", "*$*", "***");
            // rh.rabbitegg.setIngredient('*', Material.[Item]);
            // rh.rabbitegg.setIngredient('$', Material.EGG);
           
            rh.villageregg.shape("***", "*$*", "***");
            rh.villageregg.setIngredient('*', Material.EMERALD);
            rh.villageregg.setIngredient('$', Material.EGG);
        }
    }
    
     
  24. Offline

    Skionz

  25. Offline

    AngryCupcake274

    @Skionz Wow. I feel so stupid....again.

    Now my program isn't letting me craft my items. There is no output, when I put the items in it doesn't give me the output. Is there a special listener I need? The code for my ListenerManager class is below:
    Code:
    package me.AngryCupcake274.SpawnerManager;
    
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.CraftItemEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class ListenerHandler implements Listener {
    
        private final RecipeHandler rh;
    
        int test = 1;
    
        public ListenerHandler(RecipeHandler rh) {
            this.rh = rh;
        }
    
        @EventHandler
        public void onInteract(CraftItemEvent event) {
            Player p = ((Player) event).getPlayer();
    
            ItemStack temp = event.getRecipe().getResult();
    
            if (temp.equals(rh.creeper)) {
                // player tried to craft creeper egg
    
                if (p.hasPermission("spawnermanager.egg.creeper")
                        || p.hasPermission("spawnermanager.egg.*")
                        || p.hasPermission("spawnermanager.*")
                        || p.hasPermission("*.*")) {
                    // player has permission
                   
                    event.setCancelled(false);
                } else {
                    // player does not have permission
                   
                    event.setCancelled(true);
                    p.sendMessage(ChatColor.RED + "You don't have permission!");
                }
            }
        }
    }
     
  26. Offline

    Skionz

    @AngryCupcake274 Your casting a CraftItemEvent instance to a Player then using getPlayer()? An exception is most likely being thrown. I suggest you fix that.
     
  27. Offline

    AngryCupcake274

    @Skionz the problem is that my item isn't being crafted, when I put the items in the crafting table, there is no output item. Also, I changed my getPlayer() to getWhoClicked(). I hope that fixes the player issue.
     
Thread Status:
Not open for further replies.

Share This Page