Solved Disable crafting items with sertain lore?

Discussion in 'Plugin Development' started by Nojus, May 19, 2014.

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

    Nojus

    So i have made a code but it's not working, coud anyone say why that would be?

    Here is the code.
    Code:java
    1. @EventHandler
    2. public void onPlayerCraft(PrepareItemCraftEvent event) {
    3. HumanEntity human = event.getView().getPlayer();
    4. ItemStack item = event.getRecipe().getResult();
    5.  
    6. if(human instanceof Player) {
    7. Player player = (Player)human;
    8.  
    9. if(item.getItemMeta().getLore() != null) {
    10. if(item.getItemMeta().getLore().get(0).equalsIgnoreCase("§7Daiktas paimtas iš /item!")) {
    11. player.sendMessage("§cNegalite craftinti su daiktais iš /item.");
    12. event.getInventory().setResult(null);
    13. }
    14. }
    15. }
    16. }
     
  2. Offline

    Maurdekye

    Nojus Maybe you could be more specific than just, 'not working'. Is it giving a stack trace? What is / isn't it specifically doing that you don't want?
     
    Nojus likes this.
  3. Offline

    Nojus

    Maurdekye
    I wan't it to do if i place an item in workbench that has lore: "§7Daiktas paimtas iš /item!" then the player can't craft anything with that item.
     
  4. Offline

    Maurdekye

    You need to listen for a CraftItemEvent, and check every item involved in the recipe. If one of them has that lore, then cancel the event.
     
    Nojus likes this.
  5. Offline

    fireblast709

    Nojus you have to check the items in the 9 slots, not the one in the result slot. It might even be better to listen for the InventoryClickEvent, where you would check if the target inventory is a workbench and the item being moved has the lore.
     
    Nojus likes this.
  6. Offline

    Maurdekye

    fireblast709 Your idea would probably be more intuitive for players to figure out, but would be harder to code and may not be as stable.
     
    Nojus likes this.
  7. Offline

    Nojus

    I made this
    Code:java
    1. @EventHandler
    2. public void onPlayerCraft(CraftItemEvent event) {
    3. for (HumanEntity entity : event.getViewers()) {
    4. if (entity instanceof Player) {
    5. Player player = (Player) entity;
    6. ItemStack[] item = event.getInventory().getMatrix();
    7.  
    8. if(item[0].getItemMeta().getLore().get(0).equalsIgnoreCase("§7Daiktas paimtas iš /item!")) {
    9. event.setCancelled(true);
    10. player.sendMessage("§cNegalite craftint daiktų paimtų iš /item.");
    11. }
    12. }
    13. }
    14. }


    but it only works if item is in slot 0 of crafting table and i dont wan't to do something like

    Code:
    item[0].getItemMeta().getLore().get(0).equalsIgnoreCase("§7Daiktas paimtas iš /item!") || item[1].getItemMeta().getLore().get(0).equalsIgnoreCase("§7Daiktas paimtas iš /item!")
    could someone help :D?
     
  8. Nojus likes this.
  9. Offline

    Nojus

    I get the error if i craft the item in other slot.

    Code:text
    1. [16:03:52] [Server thread/ERROR]: Could not pass event CraftItemEvent to MegaVIPitems v1.5
    2. org.bukkit.event.EventException
    3. at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:294) ~[spigot.jar:git-Spigot-1468]
    4. at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-1468]
    5. at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:30) ~[spigot.jar:git-Spigot-1468]
    6. at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-1468]
    7. at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-1468]
    8. at net.minecraft.server.v1_7_R3.PlayerConnection.a(PlayerConnection.java:1403) [spigot.jar:git-Spigot-1468]
    9. at net.minecraft.server.v1_7_R3.PacketPlayInWindowClick.a(SourceFile:32) [spigot.jar:git-Spigot-1468]
    10. at net.minecraft.server.v1_7_R3.PacketPlayInWindowClick.handle(SourceFile:10) [spigot.jar:git-Spigot-1468]
    11. at net.minecraft.server.v1_7_R3.NetworkManager.a(NetworkManager.java:180) [spigot.jar:git-Spigot-1468]
    12. at net.minecraft.server.v1_7_R3.ServerConnection.c(ServerConnection.java:81) [spigot.jar:git-Spigot-1468]
    13. at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:713) [spigot.jar:git-Spigot-1468]
    14. at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:283) [spigot.jar:git-Spigot-1468]
    15. at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:576) [spigot.jar:git-Spigot-1468]
    16. at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:482) [spigot.jar:git-Spigot-1468]
    17. at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1468]
    18. Caused by: java.lang.NullPointerException
    19. at main.main.onPlayerCraft(main.java:74) ~[?:?]
    20. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_51]
    21. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_51]
    22. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_51]
    23. at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_51]
    24. at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:292) ~[spigot.jar:git-Spigot-1468]
    25. ... 14 more
     
  10. Nojus Line 74 - something is null
     
    Nojus likes this.
  11. Offline

    Nojus

    AdamQpzm
    Code:java
    1. if(item[i].getItemMeta().getLore().get(0).equalsIgnoreCase("§7Daiktas paimtas iš /item!")) {[/i]
    this is that line.
     
  12. Nojus Yes, I assumed as much. Out of interest, can I see the updated code? Also, you'll encounter a problem if there isn't an item in that slot, or if there is an item in that slot without lore. As these result in null, you'll have to check if they're null first.
     
    Nojus likes this.
  13. Offline

    Nojus

    AdamQpzm
    Code:java
    1. @EventHandler
    2. public void onPlayerCraft(CraftItemEvent event) {
    3. for (HumanEntity entity : event.getViewers()) {
    4. if (entity instanceof Player) {
    5. Player player = (Player) entity;
    6. ItemStack[] item = event.getInventory().getMatrix();
    7.  
    8. for(int i =0; i < 8; i++)
    9. {
    10. if(item[i].getItemMeta().getLore().contains("§7Daiktas paimtas iš /item!")) {
    11. event.setCancelled(true);
    12. player.sendMessage("§cNegalite craftint daiktų paimtų iš /item.");
    13. }
    14. }
    15. }
    16. }
    17. }[/i]


    here is the updated code.
     
  14. Nojus Not too bad, although a couple of suggestions I have is to check for nulls, and you should add a return statement after the sending of the message - you already know it's cancelled so no point continuing searching for the item, right?
     
    Nojus likes this.
  15. Offline

    Nojus

    AdamQpzm i fixed it. needed to add
    Code:
    if(item[i].getItemMeta() != null) {
     
    AdamQpzm likes this.
Thread Status:
Not open for further replies.

Share This Page