Solved Mods for a plugin ?

Discussion in 'Plugin Development' started by Betagear, Dec 10, 2015.

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

    timtower Administrator Administrator Moderator

    You can set values with that, you can't override methods with that.
     
  2. Offline

    Betagear

    @mcdorli Nah thanks, Custom events works well.

    I am having an issue : this code is making all my events run twice, in all the plugins. Cause ?
    It's in another jar.
    Code:
    package dev.bukkit.moddingear;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.GameMode;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.metadata.FixedMetadataValue;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class Death extends JavaPlugin implements Listener{
        private Death plugin;
    
        List<BukkitRunnable> Runnables = new ArrayList<>();
      
        String mSpectator = "Spectator";
        String mNoBottle = "Nobottle";
        String mNoBarrier = "Nobarrier";
      
        @Override
        public void onEnable() {
            plugin = this;
        }
      
        public void onDisable() {
            plugin = null;
        }
      
        @EventHandler
        public void RespawnDetection(StompArenaRespawnEvent Event) {
            final Player player = Event.getPlayer();
            if (player.getMaxHealth() > 2) {
                player.setMaxHealth(player.getMaxHealth() - 2);
            } else {
                player.setMetadata(mSpectator, new FixedMetadataValue(this, true));
                player.setGameMode(GameMode.CREATIVE);
            }
            BukkitRunnable Runnable = new BukkitRunnable() {
              
                @Override
                public void run() {
                    player.removeMetadata(mSpectator, plugin);
                    player.removeMetadata(mNoBottle, plugin);
                    player.removeMetadata(mNoBarrier, plugin);
                  
                }
            };
            Runnable.runTaskLater(plugin, 1);
            Runnables.add(Runnable);
        }
    }
    
    (StompArenaRespawnEvent is a custom event from my plugin that is called rarely)

    And here is the way I listen to him in my main plugin :
    Code:
    package dev.bukkit.moddingear;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class ModsInterface implements Listener {
    
        Plugin plugin;
        Main main;
       
        public ModsInterface(Main plugin) {
            this.plugin = plugin;
            main = plugin;
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
       
        @EventHandler
        public void FinishWatch(StompArenaFinishGameEvent Event) {
            Player winner = Event.getWinner();
            for (Player looser : Bukkit.getOnlinePlayers()) {
                if (looser.getWorld() == winner.getWorld() && looser != winner) {
                    looser.sendMessage(ChatColor.DARK_RED + winner.getName() + main.tSomewon);
                }
            }
            winner.sendMessage(main.tGameWon);
            final Player Aplayer2 = winner;
            new BukkitRunnable() {
               
                @Override
                public void run() {
                    for (Player tpédé : Bukkit.getOnlinePlayers()) {
                        if (tpédé.getWorld() == Aplayer2.getWorld()) {
                            main.PlayerUtils.Connect(tpédé, plugin.getConfig().getString("Lobby World"));
                        }
                    }
                   
                }
            }.runTaskLater(plugin, 140);
        }
    }
    
    The second part of code is one of my event listeners, called specially for this mod.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Dec 13, 2015
  3. Offline

    timtower Administrator Administrator Moderator

    @Betagear Impressive as it shouldn't even be running to be honest.
    You never register it.
     
  4. Offline

    Betagear

    @timtower Well, so is it the fact I registered the events two time that makes them run twice ?
     
  5. Offline

    timtower Administrator Administrator Moderator

    @Betagear Please post the main class of the main plugin as well
     
  6. Offline

    Betagear

    @timtower Uh. I can't. It would be way too big. The event duplication bug happends only when I activate
    this class :
    Code:
    package dev.bukkit.moddingear;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class ModsInterface implements Listener {
    
        Plugin plugin;
        Main main;
       
        public ModsInterface(Main plugin) {
            this.plugin = plugin;
            main = plugin;
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
       
        @EventHandler
        public void FinishWatch(StompArenaFinishGameEvent Event) {
            Player winner = Event.getWinner();
            for (Player looser : Bukkit.getOnlinePlayers()) {
                if (looser.getWorld() == winner.getWorld() && looser != winner) {
                    looser.sendMessage(ChatColor.DARK_RED + winner.getName() + main.tSomewon);
                }
            }
            winner.sendMessage(main.tGameWon);
            final Player Aplayer2 = winner;
            new BukkitRunnable() {
               
                @Override
                public void run() {
                    for (Player tpédé : Bukkit.getOnlinePlayers()) {
                        if (tpédé.getWorld() == Aplayer2.getWorld()) {
                            main.PlayerUtils.Connect(tpédé, plugin.getConfig().getString("Lobby World"));
                        }
                    }
                   
                }
            }.runTaskLater(plugin, 140);
        }
    }
    
    I already have other events registered in another class with Listener implementation, but it was already making this bug even when the custom event was in the same class as the other events. I am having this bug only when I add the mod.
     
  7. Offline

    timtower Administrator Administrator Moderator

    @Betagear Pastebin can handle that amount of code.
    You might be registering it twice, that could cause loads of issues.
     
  8. Offline

    Betagear

    @timtower That's what I am doing, here's how my plugin works :
    - Register all events once in a class that uses some
    - Then register again all events in Mods Interface

    Then, in another plugin related to this one :
    - I register all events
     
  9. Offline

    timtower Administrator Administrator Moderator

    @Betagear Every event class should only be registered once.
    So that ModsInterface should only be used once in a registerEvents call
     
  10. Offline

    Betagear

    @timtower Ok. So I have to register all events one by one and then say that this event is in this class ?
     
  11. Offline

    timtower Administrator Administrator Moderator

    @Betagear No, I don't know how many times you are registering the ModsInterface, if more then once: problem found
     
  12. Offline

    Betagear

    @timtower I'm not registering it twice, and i'm not talking specifically about the custom events, all my events are running twice.
     
  13. Offline

    timtower Administrator Administrator Moderator

    @Betagear All of them? Also when you restart the server?
     
  14. Offline

    Betagear

    @timtower Oh.
    I fount the error : I use a function to make my plugin reload without reloading all the other plugin, and I forgot to make it not re-register the events. Issue solved !
     
  15. Offline

    timtower Administrator Administrator Moderator

    @Betagear That explains the issue indeed.
     
Thread Status:
Not open for further replies.

Share This Page