Stop items being destroyed when struck by lightning

Discussion in 'Plugin Development' started by SiezureSalad, Aug 23, 2016.

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

    SiezureSalad

    I was thinking about doing something usng ItemDespawnEvent and doing if (event.getCause() == lightning) event.getCancelled(true); but there is no getCause() for this event. Would anyone know a different method or way of doing this?
     
  2. Offline

    CraftCreeper6

    @SiezureSalad
    Use an event relevant to the entity being damaged. This way, you can check the cause and also have access to keep the items.
     
  3. Offline

    Zombie_Striker

    @SiezureSalad
    From the spigot docs:
    You need to use EntityDamageEvent instead to check if an item was hit by lightning.
     
  4. Offline

    SiezureSalad

    Thanks but now I am getting this error when starting the server:


    Code:
    [21:18:33 ERROR]: Error occurred while enabling RoyaleDeath v1.0 (Is it up to date?)
    java.lang.NoSuchMethodError: me.billy.eav.DeathListener.<init>(Lme/billy/eav/RoyaleDeath;)V
            at me.billy.eav.RoyaleDeath.onEnable(RoyaleDeath.java:11) ~[?:?]
            at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:316) ~[craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:324) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at org.bukkit.craftbukkit.v1_7_R4.CraftServer.loadPlugin(CraftServer.java:455) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at org.bukkit.craftbukkit.v1_7_R4.CraftServer.enablePlugins(CraftServer.java:389) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at net.minecraft.server.v1_7_R4.MinecraftServer.n(MinecraftServer.java:352) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at net.minecraft.server.v1_7_R4.MinecraftServer.g(MinecraftServer.java:326) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at net.minecraft.server.v1_7_R4.MinecraftServer.a(MinecraftServer.java:282) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at net.minecraft.server.v1_7_R4.DedicatedServer.init(DedicatedServer.java:189) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:436) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
            at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [craftbukkit1.7.jar:git-Bukkit-1.7.9-R0.2-20-g0b2ed13-b3108jnks]
    Here is my main:


    PHP:
    package me.billy.eav;

    import org.bukkit.Bukkit;
    import org.bukkit.plugin.java.JavaPlugin;

    public class 
    RoyaleDeath extends JavaPlugin{
       
        @
    Override
        
    public void onEnable(){
           
            
    Bukkit.getServer().getPluginManager().registerEvents(new DeathListener (this), this);
        }
    }


    Listener:


    PHP:
    package me.billy.eav;

    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
    import org.bukkit.event.entity.PlayerDeathEvent;

    public class 
    DeathListener implements Listener{
       
        public 
    RoyaleDeath plugin;
       
        public 
    DeathListener(RoyaleDeath plugin) {
            
    this.plugin plugin;
        }
       
        @
    EventHandler
        
    public void onDeath(PlayerDeathEvent event) {
           
            
    Player player event.getEntity();
            
    Location target player.getLocation();
            
    World world player.getWorld();
            
    world.strikeLightning(target);
           
        }
       
    //Stop items being destroyed by lightning
        
    @EventHandler
        
    public void onItemDestroy(EntityDamageEvent event) {
           
            if (
    event.getCause() == DamageCause.LIGHTNING) {
               
                
    event.setCancelled(true);
            }
        }
    }
    plugin.yml:

    Code:
    name: RoyaleDeath
    main: me.billy.eav.RoyaleDeath
    version: 1.0
    commands:
     
  5. Offline

    Zombie_Striker

    @SiezureSalad
    Your jar is most likely corrupted. Try recreating/re-exporting the plugin.
     
  6. And it also cancels damage for every entity if the cause is lightning. Check if event.getDamaged() (or .getEntity(), don't know the exact name atm) is an Item
     
  7. Offline

    SiezureSalad

    I recreated the whole thing in a new project and re-exported it and I get the same result.

    Okay I fixed it by changing the name of the classes. It must have had a problem with them or something.

    @Zombie_Striker @FisheyLP the lightning works fine however the items get destroyed from the lightning still. (the code is unchanged from my last post)
     
    Last edited: Aug 23, 2016
  8. Offline

    Zombie_Striker

    @SiezureSalad
    Have you debugged? Does the event get triggered for Items? Are you also checking if the items are being burned (since lightning causes fire)
     
  9. Offline

    SiezureSalad

    I have another plugin that disables fire from lightning.
    I think this is the wrong event to be using. My other plugin also causes lightning so I used it to test where debugging got to when I threw an item in creative mode and it didn't log anything. When I attacked a squid it registered "Entity was damage.". When the squid was struck by lightning it registered to "Cause was lightning." so I think this is the wrong event.

    PHP:
    package me.billy.eav;

    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.entity.Item;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
    import org.bukkit.event.entity.PlayerDeathEvent;

    public class 
    DeathsListener implements Listener{
      
        public 
    DeathsListener(RoyaleDeaths plugin) {
            
    plugin.getServer().getPluginManager().registerEvents(thisplugin);
        }
      
        @
    EventHandler
        
    public void onDeath(PlayerDeathEvent event) {
          
            
    Player player event.getEntity();
            
    Location target player.getLocation();
            
    World world player.getWorld();
            
    world.strikeLightning(target);
        }
      
        @
    EventHandler
        
    public void onItemDestroy(EntityDamageEvent event) {
          
            
    Bukkit.broadcastMessage("Entity was damaged.");
          
            if (
    event.getCause() == DamageCause.LIGHTNING) {
              
                    
    Bukkit.broadcastMessage("Cause was lightning.");
                    
    event.setCancelled(true);
            }
        }
    }
    @Zombie_Striker Any other events you would recommend?
     
    Last edited: Aug 23, 2016
  10. Offline

    HeartandSoul

    Directly from the JavaDocs, Theres an event Called EntityCombustByEntityEvent & EntityCombustEvent. These are called when a live entity is set on fire. Iv'e never tried it on an item. Why don't you try these?
     
  11. Offline

    SiezureSalad

    There is no getCause() only getCombuster() which is an entity. I don't think lightning is an entity so I can't make this work.

    In the end I just set the lightning strike to be 5 blocks higher than the player that died so the items don't get destroyed. Thanks for your help anyway.
     
    Last edited: Aug 24, 2016
Thread Status:
Not open for further replies.

Share This Page