First plugin: Deeply lost!

Discussion in 'Plugin Development' started by Wurstfabrik, May 17, 2011.

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

    Wurstfabrik

    Hey dudes,
    after some days of reading, reading and reading i tried to create my first selfmade plugin today. Well, i stumbled upon some problems.
    First of all, here's my code:

    Code:
    package me.Wurstfabrik.KillCounter;
    
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.event.Event;
    
    
    
    public class KillCounter extends JavaPlugin {
        private KCPlayerListener playerListener = new KCPlayerListener(this);
        
        public void onEnable(){ 
            PluginManager pm = this.getServer().getPluginManager(); 
            
            pm.registerEvent(Event.Type.ENTITY_DAMAGE, playerListener, Event.Priority.Normal, this);
            
        } 
        public void onDisable(){ 
         
        }
    }
    
    Code:
    package me.Wurstfabrik.KillCounter;
    
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.HumanEntity;
    import org.bukkit.entity.Player;
    import org.bukkit.event.player.PlayerListener;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    
    public class KCPlayerListener extends PlayerListener {
            
            public static KillCounter plugin;
            
            public KCPlayerListener(KillCounter instance) {
                plugin = instance;
            }
    
            public void onEntityDamage(EntityDamageByEntityEvent event){
                Bukkit.getServer().broadcastMessage("something");
                if(event instanceof EntityDamageByEntityEvent){
                        EntityDamageByEntityEvent act = (EntityDamageByEntityEvent)event;
                        Entity attacker = act.getDamager();
                        if(attacker instanceof HumanEntity){
                            if(act.getEntity() instanceof HumanEntity){ 
                                Bukkit.getServer().broadcastMessage("angegriffen");
                                HumanEntity play = (HumanEntity)act.getEntity();
                                if(play instanceof Player){
                                    Player player = (Player)play;
                                    if(player.getHealth()-act.getDamage()<0){
                                        Bukkit.getServer().broadcastMessage("dead");
                                    }
                                }
                            }
                        }
                    }
                }
            }
    

    The problems:
    First of all, i want to use the event ENTITY_DAMAGEBY_ENTITY. But it seems that in my Bukkit-snapshot this event doesn't exist. I looked up the wiki, where it clearly stands under event types. (ENTITY_DAMAGEBY_BLOCK is missing, too)


    Well, of course my plugin is not working. Here is the error message:
    Code:
    >
    15:14:12 [SEVERE] Could not pass event ENTITY_DAMAGE to KillCounter
    java.lang.ClassCastException: me.Wurstfabrik.KillCounter.KCPlayerListener cannot be cast to org.bukkit.event.entity.EntityListener
            at org.bukkit.plugin.java.JavaPluginLoader$44.execute(JavaPluginLoader.java:474)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:59)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:257)
            at net.minecraft.server.EntityLiving.N(EntityLiving.java:130)
            at net.minecraft.server.Entity.p_(Entity.java:192)
            at net.minecraft.server.EntityLiving.p_(EntityLiving.java:230)
            at net.minecraft.server.World.entityJoinedWorld(World.java:1007)
            at net.minecraft.server.WorldServer.entityJoinedWorld(WorldServer.java:52)
            at net.minecraft.server.World.playerJoinedWorld(World.java:989)
            at net.minecraft.server.World.cleanUp(World.java:966)
            at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:367)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:285)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:394)
    I think it belongs all to the error. I tried and checked various things i found via forum search, but nothing helped :S It would be totally cool if you could take a look at my code and tell me whats going on
     
  2. Offline

    AOD_Batman

    ENTITY_DAMAGE is for EntityListeners not PlayerListeners
     
  3. Offline

    DreadKyller

    also, why do you have a EntityDamagedByEntityEvent, and then check to see if it's an EntityDamagedByEntityEvent, cause it is already it will always go through.

    but yeah, if you look in your external jars and go to bukkit.event.whatever, if you are in event.player you'll see PlayerListener, if you're in event.entity you'll see EntityListener, and etc, they can't mix.
     
  4. Offline

    Wurstfabrik

    Just to make sure i got it right: If i register ENTITY_DAMAGE, this will work properly:

    onEntityDamage(EntityDamageByEntityEvent event)

    and the ENTITY_DAMAGEBY_ENTITY on the wiki is just nonsense (or stuff i don't understand^^)


    OK, here's the updated code. I'm pretty sure i missed something basic, but i can't find it:
    Code:
    package me.Wurstfabrik.KillCounter;
    
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.event.Event;
    
    
    public class KillCounter extends JavaPlugin {
        private KCEntityListener entityListener = new KCEntityListener(this);
    
        public void onEnable(){
            PluginManager pm = this.getServer().getPluginManager();
    
            pm.registerEvent(Event.Type.ENTITY_DAMAGE, entityListener, Event.Priority.Normal, this);
    
        }
        public void onDisable(){
    
        }
    
    }
    Code:
    package me.Wurstfabrik.KillCounter;
    
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.HumanEntity;
    import org.bukkit.entity.Player;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.EntityListener;
    
    public class KCEntityListener extends EntityListener {
        
        public static KillCounter plugin;
        
        public KCEntityListener(KillCounter instance) {
            plugin = instance;
        }
    
        public void onEntityDamage(EntityDamageByEntityEvent event){
                    EntityDamageByEntityEvent act = (EntityDamageByEntityEvent)event;
                    Entity attacker = act.getDamager();
                    if(attacker instanceof HumanEntity){
                        if(act.getEntity() instanceof HumanEntity){
                            Bukkit.getServer().broadcastMessage("angegriffen");
                            HumanEntity play = (HumanEntity)act.getEntity();
                            if(play instanceof Player){
                                Player player = (Player)play;
                                if(player.getHealth()-act.getDamage()<0){
                                    Bukkit.getServer().broadcastMessage("tot");
                                }
                            }
                        }
                    }
                }
    }
    
    
    New error is much shorter:
    17:03:00 [SEVERE] Could not pass event ENTITY_DAMAGE to KillCounter
    java.lang.ClassCastException
     
  5. Offline

    DreadKyller

    there is no difference between the two codes you posted...

    also, have you done anything yet about the extends PlayerListener becoming into EntityListener, because that's your main error
     
  6. Offline

    Wurstfabrik

    Misposted, already edited ;) And of cause i switched to EntityListener.
     
  7. Offline

    Windwaker

    Use the javadoc not the wiki. The wiki is not even close to reliable.
     
  8. Offline

    DreadKyller

    ok, one more request, can you post the full error, like the line right below the one you posted so I can see what line the error occurs on and in which class.
     
  9. Code:
        public void onEntityDamage(EntityDamageEvent event){
            if(event instanceof EntityDamageByEntityEvent) {
                if(event.getDamager() instanceof HumanEntity && event.getEntity() instanceof HumanEntity){
                    Bukkit.getServer().broadcastMessage("angegriffen");
                    if(event.getEntity() instanceof Player){
                        Player player = (Player)event.getEntity();
                        if(player.getHealth() - event.getDamage() <= 0){
                            Bukkit.getServer().broadcastMessage("tot");
                        }
                    }
                }
            }
        }
    
    This seems somewhat a bit more logic to me, you could compare it to your code.

    edit: not sure if this fixes the error, but maybe it does
     
  10. Offline

    Wurstfabrik

    Okay, at least there are no more error messages. Seems like the one above was outdated, sorry for posting this. But i don't get the broadcasts.

    onEntityDamage(EntityDamageEvent event) gave me mass errors, so i think it must be a typo by you and changed it to onEntityDamage(EntityDamageByEntityEvent event). As i said, no more errors, but no broadcasts, too :S
     
  11. Offline

    DreadKyller

    Bukkit.getServer() ? why not use:

    PHP:
    event.getEntity().getServer()
    and sorry to say, post the code you used the EntityDamageEvent on, because his code has no errors in it.

    EDIT!

    is it possible your errors could have been the fact it might not have been imported?
     
  12. Offline

    Wurstfabrik

    Not sure what you mean with the "not imported"-Part? I put it into my servers plugin-folder and reload the server. It is in the /plugins-list. To be 100% sure i added an error output into onEnable, which works. Or do you mean something else?

    And again, the full code:
    Code:
    package me.Wurstfabrik.KillCounter;
    
    import org.bukkit.Bukkit;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.event.Event;
    
    
    public class KillCounter extends JavaPlugin {
        private KCEntityListener entityListener = new KCEntityListener(this);
    
        public void onEnable(){
            PluginManager pm = this.getServer().getPluginManager();
    
            pm.registerEvent(Event.Type.ENTITY_DAMAGE, entityListener, Event.Priority.Normal, this);
            Bukkit.getServer().broadcastMessage("olololo");
        }
        public void onDisable(){
    
        }
    }
    
    
    Code:
    package me.Wurstfabrik.KillCounter;
    
    
    import org.bukkit.entity.HumanEntity;
    import org.bukkit.entity.Player;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.EntityListener;
    
    public class KCEntityListener extends EntityListener {
    
        public static KillCounter plugin;
    
        public KCEntityListener(KillCounter instance) {
            plugin = instance;
        }
    
        public void onEntityDamage(EntityDamageByEntityEvent event){
            if(event instanceof EntityDamageByEntityEvent) {
                if(event.getDamager() instanceof HumanEntity && event.getEntity() instanceof HumanEntity){
                    event.getEntity().getServer().broadcastMessage("angegriffen");
                    if(event.getEntity() instanceof Player){
                        Player player = (Player)event.getEntity();
                        if(player.getHealth() - event.getDamage() <= 0){
                            event.getEntity().getServer().broadcastMessage("tot");
                        }
                    }
                }
            }
        }
    }
    

    EDIT:

    Dit it. Thanks for your help, here's the result:
    Code:
     public void onEntityDamage(EntityDamageEvent event){
            if(event instanceof EntityDamageByEntityEvent) {
                event.getEntity().getServer().broadcastMessage("eins");
                if(((EntityDamageByEntityEvent) event).getDamager() instanceof HumanEntity && event.getEntity() instanceof HumanEntity){
                    event.getEntity().getServer().broadcastMessage("angegriffen");
                    if(event.getEntity() instanceof Player){
                       Player player = (Player)event.getEntity();
                       if(player.getHealth() - event.getDamage() <= 0){
                            event.getEntity().getServer().broadcastMessage("tot");
                        }
                    }
                }
            }
        }
     
  13. Offline

    DreadKyller

    Oo, I see where the error was, ok, you tried a method that didn't exist for the event, because it had not been cast to EntityDamagedByEntityEvent. good job figuring it out.
     
  14. Offline

    Wurstfabrik

    Thanks, but it was more luck and clicking on Eclipses Auto Correction than anything else :D

    Okay, there seems to be a problem. If people are hacking on my corpse after i am dead the event fires again :S Any idea how to solve this? My skills seem to be to limited to get anything working :S

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jul 16, 2016
Thread Status:
Not open for further replies.

Share This Page