Tool deleting after a certain time.

Discussion in 'Plugin Development' started by MinecraftMart, May 4, 2014.

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

    MinecraftMart

    So what i have now is that you can get a tool out of a inventory.

    Now i want it so it deletes the tool after a certain time.
    Can somebody help me with this?
    Tell me if you need my code

    Thx
     
  2. Offline

    Gater12

    MinecraftMart
    Schedule a delayed task for x amount (in ticks) of time to execute deleting the tool.
     
  3. Offline

    mibac138

    Something like this ?
    Code:java
    1. public void example ( final Player p, int secs ) {
    2. @SuppressWarnings ( "deprecation" )
    3. final ItemStack item = new ItemStack( 1, 1 ); // ItemStack( item, amount)
    4. p.getInventory( ).addItem( item );
    5.  
    6. getServer( ).getScheduler( ).scheduleSyncDelayedTask( this,
    7. new Runnable( ) {
    8. public void run ( ) {
    9. p.getInventory( ).removeItem( item );
    10. }
    11. }, secs * 20 );
    12. }
     
  4. Offline

    MinecraftMart

    mibac138
    Wauw thx, but why doesnt getServer() work?
     
  5. Offline

    mibac138

    What do you mean ?
     
  6. Offline

    MinecraftMart

    mibac138

    i needed to change it to Bukkit.getServer()
     
  7. Offline

    mibac138

    Doesn't matter, important is that it works, yes ? :)
     
  8. Offline

    Gater12

    MinecraftMart
    getServer() is an inherited method from JavaPlugin for you main class. Either pass the instance of your main class to use getServer() or use Bukkit a static cast to getServer()
     
  9. Offline

    MinecraftMart

    mibac138 Gater12

    K so Bukkit.getServer() aint good?

    And it asks me if i want to change it to .scheduleASyncDelayedTask instead of .scheduleSyncDelayedTask
     
  10. Offline

    mibac138

    You don't use Bukkit in main class, but that doesn't mean that Bukkit isn't good. If you want you can change it.
     
  11. Offline

    MinecraftMart

    K but whats with the scheduleAsync and the ScheduleSync
    Im doing this in another class btw
     
  12. Offline

    mibac138

    (From bukkit wiki) Asynchronous tasks should never access any API in Bukkit
     
  13. Offline

    Gater12

    MinecraftMart
    You can use BukkitRunnable instead
    Code:java
    1. new BukkitRunnable(){
    2. public void run(){
    3. /* Code to execute */
    4. }
    5. }.runTaskLater(mainClassInstance, sec * 20);


    Or have your class a BukkitRunnable and execute it.
    Code:java
    1. public class DelayTimer implements BukkitRunnable{
    2. public void run(){
    3. /* Execute code */
    4. }
    5. }
    6.  
    7. /* When you want to run it in some other class... */
    8. new DelayTimer().runTaskLater(mainClassInstance, sec * 20);
     
  14. Offline

    MinecraftMart

    Gater12
    If i use this code i get an error
    Code:java
    1. @EventHandler
    2. public void onInventoryClick(InventoryClickEvent e) {
    3. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    4. if (e.getCurrentItem().getItemMeta() == null) return;
    5. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    6. if (e.getCurrentItem().getItemMeta() == null) return;
    7. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Example")) {
    8. final Player p = (Player) e.getWhoClicked();
    9. int Lvl = p.getLevel();
    10. if(Lvl >= 20){
    11. e.setCancelled(true);
    12. e.getWhoClicked().setItemInHand(s);
    13. p.giveExpLevels(-20);
    14. e.getWhoClicked().closeInventory();
    15. p.sendMessage("You used Magic Forging to create you perfect tool! But be aware, it will only last for a certain amount of time!");
    16.  
    17. new BukkitRunnable(){
    18. public void run(){
    19. p.getInventory( ).removeItem(s);
    20. }
    21. }.runTaskLater((Plugin) this, secs * 20);
    22. }
    23. else{
    24. e.setCancelled(true);
    25. p.sendMessage("Your level is too low!");
    26. }
    27.  
    28.  
    29.  
    30.  
    31. }
    32.  
    33.  
    34. }
     
  15. Offline

    mibac138

    secs is null
     
  16. Offline

    MinecraftMart

    mibac138

    I made it public in the class still errors

    Code:java
    1. package com.outlook.mcpkmart.testinventory;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.Material;
    5. import org.bukkit.enchantments.Enchantment;
    6. import org.bukkit.entity.Player;
    7. import org.bukkit.event.EventHandler;
    8. import org.bukkit.event.Listener;
    9. import org.bukkit.event.inventory.InventoryClickEvent;
    10. import org.bukkit.inventory.Inventory;
    11. import org.bukkit.inventory.ItemStack;
    12. import org.bukkit.inventory.meta.ItemMeta;
    13. import org.bukkit.plugin.Plugin;
    14. import org.bukkit.scheduler.BukkitRunnable;
    15.  
    16. public class MagicForgeInventory implements Listener {
    17.  
    18. private Inventory inv;
    19. private ItemStack s;
    20. public int secs;
    21.  
    22.  
    23. public MagicForgeInventory(Plugin p) {
    24.  
    25. secs = 10;
    26. inv = Bukkit.getServer().createInventory(null, 18, "Magic Forge");
    27.  
    28. s = new ItemStack(Material.DIAMOND_PICKAXE);
    29. ItemMeta im = s.getItemMeta();
    30. im.setDisplayName("Example");
    31. s.setItemMeta(im);
    32. s.addEnchantment(Enchantment.DIG_SPEED, 5);
    33.  
    34.  
    35. inv.setItem(0, s);
    36.  
    37.  
    38. Bukkit.getServer().getPluginManager().registerEvents(this, p);
    39. }
    40.  
    41.  
    42. public void show(Player p) {
    43. p.openInventory(inv);
    44. }
    45.  
    46.  
    47. @EventHandler
    48. public void onInventoryClick(InventoryClickEvent e) {
    49. secs = 10;
    50. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    51. if (e.getCurrentItem().getItemMeta() == null) return;
    52. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    53. if (e.getCurrentItem().getItemMeta() == null) return;
    54. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Example")) {
    55. final Player p = (Player) e.getWhoClicked();
    56. int Lvl = p.getLevel();
    57. if(Lvl >= 20){
    58. e.setCancelled(true);
    59. e.getWhoClicked().setItemInHand(s);
    60. p.giveExpLevels(-20);
    61. e.getWhoClicked().closeInventory();
    62. p.sendMessage("You used Magic Forging to create you perfect tool! But be aware, it will only last for a certain amount of time!");
    63.  
    64. new BukkitRunnable(){
    65. public void run(){
    66. p.getInventory( ).removeItem(s);
    67. }
    68. }.runTaskLater((Plugin) this, secs * 20);
    69. }
    70. else{
    71. e.setCancelled(true);
    72. p.sendMessage("Your level is too low!");
    73. }
    74.  
    75.  
    76.  
    77.  
    78. }
    79.  
    80.  
    81. }
    82.  
    83. }
    84.  


    Pls? I want this done tonight xD i sort of have a deadline

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  17. Offline

    mibac138

    Where and what error ?
     
  18. Offline

    MinecraftMart

    mibac138
    Code:
    [20:34:09 INFO]: MinecraftMart issued server command: /magicforge
    [20:34:10 ERROR]: Could not pass event InventoryClickEvent to TestInventory v0.1
     
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:294) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:501) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:486) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.PlayerConnection.a(PlayerConnection.java
    :1363) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.PacketPlayInWindowClick.a(SourceFile:32)
    [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.PacketPlayInWindowClick.handle(SourceFil
    e:10) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.NetworkManager.a(NetworkManager.java:157
    ) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.ServerConnection.c(SourceFile:134) [craf
    tbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:6
    67) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:2
    60) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:5
    58) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java
    :469) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:6
    28) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
    Caused by: java.lang.ClassCastException: com.outlook.mcpkmart.testinventory.Magi
    cForgeInventory cannot be cast to org.bukkit.plugin.Plugin
            at com.outlook.mcpkmart.testinventory.MagicForgeInventory.onInventoryCli
    ck(MagicForgeInventory.java:68) ~[?:?]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0
    _05]
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0
    _05]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1
    .8.0_05]
            at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_05]
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:292) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-59-g6efeddf-b3074jnks]
            ... 13 more
    >
    
     
  19. Offline

    mibac138

    Add private variable
    Code:java
    1. private <Your main class name goes here> plugin;

    and in your constructor add somewhere
    Code:java
    1. this.plugin = p;

    and change in your line 68
    Code:java
    1. runTaskLater((Plugin) this, secs * 20)
    2. // To
    3. runTaskLater(plugin, secs * 20)
     
  20. Offline

    MinecraftMart

    mibac138

    its working!
    I had to do this
    Code:java
    1. this.plugin = (TestInventory) p;


    But thx!
     
Thread Status:
Not open for further replies.

Share This Page