Noob developer, having problems

Discussion in 'Plugin Development' started by Fej, Oct 17, 2011.

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

    Fej

    Hey all.

    So this is my first plugin. What I'm trying to do is, for Movecraft, to stop people from making cars (placing a sign and then typing a certain string) unless they have permission. I'll implement the "permissions" part later. I'm having trouble getting it to work at all.

    Here's my code:

    Code:
    package fej.signblock;
    
    import java.util.logging.Logger;
    import org.bukkit.event.Event;
    import org.bukkit.event.block.BlockListener;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class SignBlock extends JavaPlugin {
    
        Logger log = Logger.getLogger("Minecraft");
        private static BlockListener blockListener;
        public static SignBlock plugin;
    
        public void onEnable(){
            log.info("Fej SignBlock v1.0 is now running.");
    
            blockListener = new signblockBlockListener(this);
            PluginManager pm = getServer().getPluginManager();
    
            pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Event.Priority.Normal, this);
        }
    
        public void onDisable(){
            log.info("Fej SignBlock v1.0 is disabled!");
        }
    
    }
    And the second file:


    Code:
    package fej.signblock;
    
    import org.bukkit.block.Block;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.block.BlockListener;
    import org.bukkit.event.block.BlockPlaceEvent;
    import org.bukkit.block.Sign;
    
    public class signblockBlockListener extends BlockListener {
    
        public static SignBlock plugin;
        public signblockBlockListener(SignBlock instance) {
            plugin = instance;
        }
    
    
    public void onBlockPlace(BlockPlaceEvent event){
        Player player = event.getPlayer();
        Block block = event.getBlockPlaced();
    
        if (block.getType() == Material.SIGN);
        {
                Sign sign = (Sign)block.getState();
                String line = sign.getLine(0);
                if (line.equals("car")) {
                    event.setCancelled(true);
                    player.sendMessage(ChatColor.RED + "You can't make cars.");
                }
            }
        }
    
    }
    When I ran it, it threw this:

    Code:
    2011-10-17 18:20:56 [SEVERE] Could not pass event BLOCK_PLACE to SignBlock
    java.lang.ClassCastException: org.bukkit.craftbukkit.block.CraftBlockState cannot be cast to org.bukkit.block.Sign
    at fej.signblock.signblockBlockListener.onBlockPlace(signblockBlockListener.java:26)
    at org.bukkit.plugin.java.JavaPluginLoader$31.execute(JavaPluginLoader.java:455)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:338)
    at org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(CraftEventFactory.java:90)
    at org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(CraftEventFactory.java:74)
    at net.minecraft.server.ItemBlock.a(ItemBlock.java:94)
    at net.minecraft.server.ItemStack.placeItem(ItemStack.java:62)
    at net.minecraft.server.ItemInWorldManager.interact(ItemInWorldManager.java:275)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:592)
    at net.minecraft.server.Packet15Place.a(SourceFile:57)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:92)
    at net.minecraft.server.NetworkListenThread.a(SourceFile:108)
    at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:464)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:374)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:417) 
    Does anyone know what the problem is?

    Thanks!
     
  2. Offline

    coldandtired

    Code:Java
    1. Sign sign = (Sign)block.getState();

    should be
    Code:Java
    1. Sign sign = (Sign)block;
     
  3. Not really.

    @Fej Nvm, wait.

    @Fej Found your error. You got a ; behind if (block.getType() == Material.SIGN), that's wrong. Also, the line 1 will never be anything in onBlockPlace, because the sign is empty at that point. You need to listen to the SignChangeEvent.

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

    coldandtired

    That's what I get for just looking at the trace and being too lazy to fire up Eclipse :)
     
  5. Offline

    Jon

    You had some problems with how you set up your block listener too. You also should be using SignChangeEvent instead of the BlockPlaceEvent. I've redone what you gave us, fixing any errors. I've also tested this myself and it works.

    https://gist.github.com/1294203
     
  6. Offline

    Fej

    Wow, thanks!

    I threw in permissions support:

    Code:
    package fej.signblock;
    
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.block.BlockListener;
    import org.bukkit.event.block.SignChangeEvent;
    
    public class signblockBlockListener extends BlockListener {
    
        public static SignBlock plugin;
    
        public signblockBlockListener(SignBlock instance) {
            plugin = instance;
        }
    
        @Override
        public void onSignChange(SignChangeEvent event) {
            Player player = event.getPlayer();
            if (event.getLine(0).equalsIgnoreCase("car")) {
                if(player.hasPermission("fej.signblock.bypass") == true) {}
                else {
                event.setLine(0, "");
                player.sendMessage(ChatColor.RED + "You can't make cars.");
                }
            }
        }
    }
    Just one question: what does the @Override do?
     
  7. Offline

    Jon

    You use @Override for two reasons. One is to take advantage of the compiler checking to make sure you actually are overriding a method when you think you are (to avoid spelling mistakes in a method name [ie. tostring rather than toString]). Secondly it makes everything easier to understand because it's obvious what methods are being overwritten. And besides both points, most IDEs will flag an overridden method that is missing the @Override annotation.

    In smaller Java projects, such as Bukkit plugins, it is used just to help you and make it obvious which methods are overwritten, nothing more. In larger projects it will help you and act as a safeguard from changed method signatures, typos, etc.
     
Thread Status:
Not open for further replies.

Share This Page