Solved How to sense whether a player mined a block using silk touch

Discussion in 'Plugin Development' started by Xp10d3, Apr 14, 2020.

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

    Xp10d3

    Hello!
    I am creating a simple plugin that gives a player money when mining ores. But there is an issue in which a plyaer using silk touch can just place a block and mine it again to get infinite money. So how do I sense whether a player is using a silk touch pickaxe when mining?
    PlayerListeners.java:
    Code:
    package xp10d3.corelia.main;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.configuration.ConfigurationSection;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.BlockBreakEvent;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    public class PlayerListeners implements Listener {
       
        private Core core;
       
        public PlayerListeners(Core core) {
            this.core = core;
        }
       
        Date now = new Date();
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
       
        // For assigning NBT tags: https://bukkit.org/threads/nbt-tags.110447/
        @EventHandler
        public void onItemClick(InventoryClickEvent event) {
            Player player = (Player) event.getWhoClicked();
            String itemName = event.getCurrentItem().getType().name();
           
           
            ItemStack item = event.getCurrentItem();
            ItemMeta itemMeta = item.getItemMeta();
           
            if (item == null || !itemMeta.isUnbreakable() || item.getType() == Material.AIR || !item.hasItemMeta()) {
                core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [ITEM CLICKED]: " + item +"[" + format.format(now) + "]");
                return;
            }
           
            if (itemMeta.isUnbreakable()) {
           
                ConfigurationSection cfg = core.getConfig().getConfigurationSection("shop.items");
                if (cfg == null) return;
                if (!cfg.getKeys(false).contains(itemName)) return;
               
                int cost = cfg.getInt(itemName + ".cost");
                String command = cfg.getString(itemName + ".command");
               
                try {
                    PreparedStatement statement = core.getConnection()
                            .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                    statement.setString(1, player.getUniqueId().toString());
                    ResultSet results = statement.executeQuery();
                    results.next();
                   
                    int coins = results.getInt("GOLD");
                    if (coins >= cost) {
                        player.closeInventory();
                        coins -= cost;
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, -cost);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.getServer().dispatchCommand(core.getServer().getConsoleSender(), command.replace("%player%", player.getName()));
                        core.logFile("Player has bought something. STATS: [PLAYER]: " + player + " | [ITEM CLICKED]:" + itemName + " | [COST]: " + cost + " | [COMMAND RUNNED]: " + command + " | [CURRENT GOLD]: " + coins  + " | [TIME]: " + "[" + format.format(now) + "]");
                    } else {
                        player.closeInventory();
                        player.sendMessage("You don't have enough coins!");
                        core.otherLog("Player didn't have enough coins to buy an item! STATS: [PLAYER]: " + player + " | [ITEM CLICKED]: " + itemName + " | [COST]: " + cost + " | [CURRENT GOLD]: " + coins + " | [TIME]: " + "[" + format.format(now) + "]");
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } else {
                return;
            }
        }
        @EventHandler
        public void onMine(BlockBreakEvent event) {
            Player player = event.getPlayer();
            Block block = event.getBlock();
            int iron = core.getConfig().getInt("mine.block.iron");
            int gold = core.getConfig().getInt("mine.block.gold");
            int coal = core.getConfig().getInt("mine.block.coal");
            int lapis = core.getConfig().getInt("mine.block.lapis");
            int redstone = core.getConfig().getInt("mine.block.redstone");
            int diamond = core.getConfig().getInt("mine.block.diamond");
            int emerald = core.getConfig().getInt("mine.block.emerald");
            int quartz = core.getConfig().getInt("mine.block.quartz");
            boolean check = core.getConfig().getBoolean("mine.enable");
            if (check == true) {
                if (block.getType() == Material.IRON_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +iron);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: IRON_ORE" + " | [MONEY GOTTEN]: " + iron + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + iron + " gold for mining iron ore.");
                } else if (block.getType() == Material.GOLD_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +gold);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: GOLD_ORE" + " | [MONEY GOTTEN]: " + gold + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + gold + " gold for mining gold ore.");
                } else if (block.getType() == Material.COAL_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +coal);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: COAL_ORE" + " | [MONEY GOTTEN]: " + coal + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + coal + " gold for mining coal ore.");
                } else if (block.getType() == Material.LAPIS_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +lapis);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: LAPIS_ORE" + " | [MONEY GOTTEN]: " + lapis + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + lapis + " gold for mining lapis ore.");
                } else if (block.getType() == Material.REDSTONE_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +redstone);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: REDSTONE_ORE" + " | [MONEY GOTTEN]: " + redstone + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + redstone + " gold for mining redstone ore.");
                } else if (block.getType() == Material.DIAMOND_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +diamond);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: DIAMOND_ORE" + " | [MONEY GOTTEN]: " + diamond + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + diamond + " gold for mining diamond ore.");
                } else if (block.getType() == Material.EMERALD_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +emerald);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: EMERALD_ORE" + " | [MONEY GOTTEN]: " + emerald + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + emerald + " gold for mining emerald ore.");
                } else if (block.getType() == Material.NETHER_QUARTZ_ORE) {
                    try {
                        PreparedStatement statement = core.getConnection()
                                .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, player.getUniqueId().toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                        statement1.setInt(1, +quartz);
                        statement1.setString(2, player.getUniqueId().toString());
                        statement1.executeUpdate();
                        core.logFile("Player has got money. STATS: [PLAYER]: " + player + " | [BLOCK BROKEN]: NETHER_QUARTZ_ORE" + " | [MONEY GOTTEN]: " + quartz + "[" + format.format(now) + "]");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    player.sendMessage(ChatColor.GREEN + "You have gotten " + quartz + " gold for mining nether quartz ore.");
                }
            } else {
                return;
            }
        }
       
        @EventHandler
        public void onGUIClick(InventoryClickEvent event) {
            Player player = (Player) event.getWhoClicked();
            ItemStack clicked = event.getCurrentItem();
            ItemMeta clickedMeta = clicked.getItemMeta();
            if (clicked.getType() == Material.GOLD_BLOCK && clickedMeta.isUnbreakable() == true) {
                event.setCancelled(true);
                player.sendMessage(ChatColor.RED + "Don't take the gold block :P");
            }
        }
    }
    
    Thanks!
     
  2. Offline

    timtower Administrator Administrator Moderator

    @Xp10d3 Tried checking the enchantment?
     
  3. Offline

    Xp10d3

    @timtower Hmm. Well I'd have to get the player's item in hand first, right? How would I do that? I haven't seen any method of doing that.
     
  4. Offline

    caderapee

    @Xp10d3 I would suggest to not hook into database everytime a block is broke. It would be better to store data into a class in memory and up every x minuts.

    Edit: there'sd a method getItemInMainHand, from player object or playerInventory
     
  5. Offline

    timtower Administrator Administrator Moderator

    @Xp10d3 Player#getItemInHand() ? Unless you need to do that through the inventory.
     
  6. Offline

    Xp10d3

    @caderapee Hmm I haven't thought of that. Thanks :)

    @timtower Lol forgot about that. I'll try that out. Does the Player#getItemInHand allow ItemStack? Cause than I can use #getItemMeta() and than get the enchantment.
     
  7. Offline

    timtower Administrator Administrator Moderator

  8. Offline

    Xp10d3

    Not yet. I can't at the moment.
     
  9. Offline

    wand555

    Yes, but don't blatantly check the enchantment, this can throw errors. Use ItemStack#hasItemMeta and the ItemMeta#hasEnchantment. Alternatively you can use ItemStack#containsEnchantment(enchantment).
     
  10. Offline

    Xp10d3

    @wand555 Alright. Thanks for the help :)

    @timtower @caderapee Seems like player.getItemInHand() is deprecated...?
    EDIT: Fixed. player.getInventory().getItemInMainHand(); Going to test it soon.
     
  11. Offline

    wand555

    If you want to keep consistency you have to check both hands.
     
  12. Offline

    Sensevx

    @Xp10d3

    Not an answer but do you happen to figure out how will you handle iron and gold ores? Because they always drop ores even when not silktouched.
     
  13. Offline

    Xp10d3

    Hmm. Could I just check whether the item meta in the player's hand equals silk touch?

    And I think it worked. Thanks
    @timtower and @caderapee.
     
  14. Offline

    Sensevx

    I mean if they use a pickaxe without a silktouch on it, they will still get the ore and be able to place it and mine it again and again.
     
  15. Offline

    Xp10d3

    @Sensevx Oh I see. Hmmm... Well I guess I could just store whether they placed the ore and than in the next event broke it.
    Code:
    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
      Player player = event.getPlayer();
      checkIfTheyPlacedIt();
      if (true) {
        checkIfTheyBreakBlockAgain();
      } else {
        return;
      }
    }
    
     
Thread Status:
Not open for further replies.

Share This Page