Block changer not working

Discussion in 'Plugin Development' started by Septango, Feb 11, 2012.

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

    Septango

    Hi I have been learning to make plugins and right now I'm trying to make one that if tnt or bedrock is placed by a non op player it disappears. I have my code for it but cannot figure out why it isn't working. Can someone please help please?



    Code:
    package me.Septango.firstplugin;
     
    import java.util.logging.Logger;
     
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.PluginDescriptionFile;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
     
    public class Firstplugin extends JavaPlugin {
     
        public final Logger logger = Logger.getLogger("Minecraft");
        public static Firstplugin plugin;
        public final MyBlockListener bl = new MyBlockListener();
        public final MyPlayerListener pl = new MyPlayerListener();
     
        @Override
        public void onDisable() {
            PluginDescriptionFile pdfFile = this.getDescription();
            this.logger.info(pdfFile.getName() + " Has been disabled!");
        }
     
        @Override
        public void onEnable() {
            PluginDescriptionFile pdfFile = this.getDescription();
            this.logger.info(pdfFile.getName() + " Version " + pdfFile.getVersion() + " Has been enabled!");
            PluginManager pm = getServer().getPluginManager();
            pm.registerEvents(this.bl, this);
            pm.registerEvents(this.pl, this);
        }
     
        public boolean onCommand(CommandSender sender, Command cmd,
                String commandLabel, String[] args) {
            Player player = (Player) sender;
            if (commandLabel.equalsIgnoreCase("heal")
                    || commandLabel.equalsIgnoreCase("h")) {
                if (args.length == 0) {
                    // heal = 0 args (/heal)
                    player.setHealth(20);
                    player.setFireTicks(0);
                    player.setFoodLevel(20);
                    player.sendMessage(ChatColor.GREEN + "Healed!");
                } else if (args.length == 1) {
                    if (player.getServer().getPlayer(args[0]) != null) {
                        Player targetPlayer = player.getServer().getPlayer(args[0]);
                        targetPlayer.setHealth(20);
                        targetPlayer.setFireTicks(0);
                        targetPlayer.setFoodLevel(20);
                        player.sendMessage(ChatColor.GREEN + "Healed!");
                    } else {
                        player.sendMessage(ChatColor.RED + "That player is not currently online.");
                    }
                }
            } else if (commandLabel.equalsIgnoreCase("starve")) {
                if (args.length == 0) {
                    player.sendMessage(ChatColor.YELLOW + "Please use the format /starve [player]");
                } else if (args.length == 1) {
                    if (player.getServer().getPlayer(args[0]) != null) {
                        Player targetPlayer = player.getServer().getPlayer(args[0]);
                        targetPlayer.setFoodLevel(0);
                    } else {
                        player.sendMessage(ChatColor.RED + "That player is not currently online.");
                    }
                }
            } else if (commandLabel.equalsIgnoreCase("sp")) {
                if (args.length == 0) {
                    player.sendMessage(ChatColor.DARK_RED + "Not enough arguements please provide a person.");
                } else if (args.length == 1) {
                    Player targetPlayer = player.getServer().getPlayer(args[0]);
                    Location targetPlayerLocation = targetPlayer.getLocation();
                    player.teleport(targetPlayerLocation);
                } else if (args.length == 1) {
                    Player targetPlayer = player.getServer().getPlayer(args[0]);
                    Player targetPlayer1 = player.getServer().getPlayer(args[1]);
                    Location targetPlayer1Location = targetPlayer1.getLocation();
                    targetPlayer.teleport(targetPlayer1Location);
                    targetPlayer.sendMessage("You have been teleported to " + player.getDisplayName());
                }
            }
            return false;
        }
    }
    


    and here is the block editor class

    Code:
    package me.Septango.firstplugin;
     
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.BlockPlaceEvent;
     
     
    public class MyBlockListener implements Listener {
     
        public static Firstplugin plugin;
        public static Material[] blacklist = { Material.TNT, Material.BEDROCK };
     
        @EventHandler
        public void onBlockPlace(BlockPlaceEvent event) {
            Material block = event.getBlock().getType();
            Player player = event.getPlayer();
     
            for (Material blocked : blacklist) {
                if (blocked == block) {
                    if (player.isOp()) {
     
                    } else {
                        event.getBlock().setType(Material.AIR);
                        player.chat("I just placed " + ChatColor.DARK_RED + blocked);
                    }
                }
            }
        }
    }
    
     
  2. Offline

    Njol

    Use 'event.setCancelled(true)' instead of 'event.getBlock().setType(Material.AIR)'.
     
  3. Offline

    Septango

    Thanks that worked. Is there a way to make it so they don't get the block back?
     
  4. Offline

    Atomic Fusion

    Subtract one of the block type from their inventory.

    Why does setType not work?

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

    Darkman2412

    Probably because you change the type the same tick as the event being thrown.

    Replace event.getBlock().setType() with:

    Code:
    plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
        public void run() {
            event.getBlock().setType(Material.AIR);
        }
    }, 1);
    This will change the type on the next tick (1 tick is about 1/20 of a second).
     
  6. Offline

    nisovin

    FYI, this has been fixed in recent builds. RB4 will let you set the block type within the event.
     
Thread Status:
Not open for further replies.

Share This Page