Solved How to use an arraylist from a different class

Discussion in 'Plugin Development' started by ProSl3nderMan, Jul 29, 2015.

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

    ProSl3nderMan

    Hey guys, I've ran into a problem while I was organizing my plugin, I can't use an array list from another class. I searched up how to do it and tried mostly everything and could not figure it out. If someone could give me some help on this, that would be great. Code:

    Main class with arraylist:
    Code:
    package me.ProSl3nderMan.AccessControl;
    
    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockState;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.enchantments.Enchantment;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.material.MaterialData;
    import org.bukkit.material.Openable;
    
    
    public class CrExecutor implements Listener, CommandExecutor, Runnable {
       
        public CrExecutor(AccessControl accessControl) {
            accessControl.getServer().getPluginManager().registerEvents(this, accessControl);
        }
       
        ArrayList<String> cr1 = new ArrayList<String>();
        ArrayList<String> cr2 = new ArrayList<String>();
        ArrayList<String> cr3 = new ArrayList<String>();
        ArrayList<String> cops1 = new ArrayList<String>();
        ArrayList<String> cops2 = new ArrayList<String>();
        ArrayList<String> cops3 = new ArrayList<String>();
    Second Class needing arraylist from main class:
    Code:
    package me.ProSl3nderMan.AccessControl;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockState;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.material.MaterialData;
    import org.bukkit.material.Openable;
    
    public class RightClickListener implements Listener {
    
       
       
        public RightClickListener(AccessControl accessControl) {
            accessControl.getServer().getPluginManager().registerEvents(this, accessControl);
        }
       
        @EventHandler
        public void onInteract(PlayerInteractEvent event) {
            if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
                Block block = event.getClickedBlock();
                Player p = event.getPlayer();
                if (block.getType() == Material.SPONGE) {
    
                    if (cops1.contains(p.getName()) || cops2.contains(p.getName()) || cops3.contains(p.getName())){
                        p.sendMessage("You are a cop! You cannot escape!");
                        event.setCancelled(false);
                    }
                    else if (cr1.contains(p.getName())) {
                   
                        for (String robber : cr1) {
                            if (Bukkit.getPlayer(robber) != null) {
                                Bukkit.getPlayer(robber).teleport(new Location(Bukkit.getWorld("candrspawn"), 3010.998, 64, 2920.130));
                                Bukkit.getPlayer(robber).setPlayerListName(ChatColor.WHITE + p.getName());
                            }
                        }
                        cr1.clear();
                        cops1.clear();
                        Bukkit.broadcastMessage(p.getName() + " has won in game 1!");
                       
                        Timer t = new Timer();
                        t.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                Bukkit.broadcastMessage("Hi!");
                            }
                        }, 20);
                        // 60,000 is 1 minute. 1800000 is 30 minutes.
                        Block irondoor = Bukkit.getWorld("cr1").getBlockAt(1635, 68, 1431);
                        BlockState state = irondoor.getState();
                        Openable openable = (Openable) state.getData();
                        openable.setOpen(false);
                        state.setData((MaterialData) state.getData());
                        state.update();
                    }
                    else if (cr2.contains(p.getName())) {
                       
                        for (String robber : cr2) {
                            if (Bukkit.getPlayer(robber) != null) {
                                Bukkit.getPlayer(robber).teleport(new Location(Bukkit.getWorld("candrspawn"), 3010.998, 64, 2920.130));
                                Bukkit.getPlayer(robber).setPlayerListName(ChatColor.WHITE + p.getName());
                            }
                        }
                        cr2.clear();
                        cops2.clear();
                        Bukkit.broadcastMessage(p.getName() + " has won in game 2!");
                       
                        Timer t = new Timer();
                        t.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                Bukkit.broadcastMessage("Hi!");
                            }
                        }, 20);
                        // 60,000 is 1 minute. 1800000 is 30 minutes.
                    }
                    else if (cr3.contains(p.getName())) {
                       
                        for (String robber : cr3) {
                            if (Bukkit.getPlayer(robber) != null) {
                                Bukkit.getPlayer(robber).teleport(new Location(Bukkit.getWorld("candrspawn"), 3010.998, 64, 2920.130));
                                Bukkit.getPlayer(robber).setPlayerListName(ChatColor.WHITE + p.getName());
                            }
                        }
                        cr3.clear();
                        cops3.clear();
                        Bukkit.broadcastMessage(p.getName() + " has won in game 3!");
                       
                        Timer t = new Timer();
                        t.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                Bukkit.broadcastMessage("Hi!");
                            }
                        }, 20);
                        // 60,000 is 1 minute. 1800000 is 30 minutes.
                    }
            }
            }
        }
    }
    
     
  2. Offline

    CraftCreeper6

    @ProSl3nderMan
    If main class, use a constructor. Otherwise, create an instance of that class. Then you can call class.arrayList...
     
  3. Offline

    Ruptur

    @ProSl3nderMan
    You can either:
    1. Make the list static so you can access it from outside the class
    2. Like CraftCreeper suggested add the Class that has the list to the other class's contructor
    3. Make a static getInstace() method in the main class then get the list through the instace
     
  4. Offline

    ProSl3nderMan

    @CraftCreeper6
    I'm sorta new to Java, can you show me how to make an instance?
     
  5. Offline

    CraftCreeper6

  6. Offline

    ProSl3nderMan

    I'm learning Java when school starts back up, I don't want to ruin the class by already knowing the language. I'm just putting in code for fun, and now I just need to know how to do the instance thing.
     
  7. Offline

    teej107

    static isn't an access modifier and I wouldn't recommend making an easily mutable object static either.

    @ProSl3nderMan Bukkit requires a knowledge of Java which you should already feel comfortable with when writing plugins. This question doesn't have much to do with Bukkit but is more of a basic Java question which doesn't belong on these forums. Your answer can be found here: https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
     
  8. Offline

    ProSl3nderMan

    @teej107
    I messed around with the link you gave me, couldn't get it to work. So I started taking guesses in my code like I have been for 3 days now (lol), and figured it out.

    Now if someone could help me out with registering the events? I had to remove a register event thing and I have no clue how to add it back in, due to me being new to bukkit. Code:
    Main class with array lists:
    Code:
    package me.ProSl3nderMan.AccessControl;
    
    import java.util.ArrayList;
    import me.ProSl3nderMan.AccessControl.RightClickListener;
    import org.bukkit.Bukkit;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class AccessControl extends JavaPlugin {
      
        public static AccessControl plugin;
      
        protected AccessControlLogger log;
      
        public void onEnable(){
          
            plugin = this;
          
            new OnJoin(this);
          
            this.log = new AccessControlLogger(this);
          
            this.getCommand("cr").setExecutor(new CrExecutor(this));
          
            new CrExecutor(this);
          
            getConfig().options().copyDefaults(true);
            saveDefaultConfig();
        }
      
        public void onDisable(){
          
        }
      
        ArrayList<String> cr1 = new ArrayList<String>();
        ArrayList<String> cr2 = new ArrayList<String>();
        ArrayList<String> cr3 = new ArrayList<String>();
        ArrayList<String> cops1 = new ArrayList<String>();
        ArrayList<String> cops2 = new ArrayList<String>();
        ArrayList<String> cops3 = new ArrayList<String>();
        public void registerEvents()
          {
            PluginManager pm = Bukkit.getPluginManager();
          
            pm.registerEvents(new RightClickListener(null), this);
          }
    }
    Class using array lists from Main class:
    Code:
    package me.ProSl3nderMan.AccessControl;
    
    import java.util.Timer;
    import java.util.TimerTask;
    import me.ProSl3nderMan.AccessControl.AccessControl;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockState;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.material.MaterialData;
    import org.bukkit.material.Openable;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class RightClickListener extends JavaPlugin implements Listener {
      
        private final AccessControl plugin;
      
        public RightClickListener(AccessControl plugin) {
            this.plugin = plugin;
        }
    Thanks in advance.
     
  9. Offline

    teej107

    What do you mean exactly? Do you not understand it?
     
  10. Offline

    CraftCreeper6

    @ProSl3nderMan
    To register events you need to take into consideration which classes constructor you are using. In this case, it seems to be your AccessControl.java class. It's the same thing getServer().getPluginManager... But you need to add one vital thing in the part where you add new RightClickListener(). I'll see if you can get it. Considering you are registering it in your main class, AND you have used your main classes constructor...
     
  11. Offline

    ProSl3nderMan

    Alright, I believe I found what I was missing in the main class:
    Code:
        ArrayList<String> cr1 = new ArrayList<String>();
        ArrayList<String> cr2 = new ArrayList<String>();
        ArrayList<String> cr3 = new ArrayList<String>();
        ArrayList<String> cops1 = new ArrayList<String>();
        ArrayList<String> cops2 = new ArrayList<String>();
        ArrayList<String> cops3 = new ArrayList<String>();
        public static RightClickListener getPluginManager;
         {
           PluginManager pm = Bukkit.getPluginManager();
      
           pm.registerEvents(new RightClickListener(this), this);
         }
    }
    I'm having troubles doing the getServer() thing:

    Code:
    package me.ProSl3nderMan.AccessControl;
    
    import java.util.Timer;
    import java.util.TimerTask;
    import me.ProSl3nderMan.AccessControl.AccessControl;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockState;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.material.MaterialData;
    import org.bukkit.material.Openable;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class RightClickListener implements Listener {
       
        private final AccessControl plugin;
       
        public RightClickListener(AccessControl plugin) {
            this.plugin = plugin;
            accessControl.getServer().getPluginManager().registerEvents(this, accessControl);
        }
    Did I do it correctly?
     
  12. Offline

    teej107

    @ProSl3nderMan Close but no cigar! You need to reference the Object variable by the name that you given it. "accessControl" is not a field that you defined.
    I also don't know what the heck that is.
     
  13. Offline

    ProSl3nderMan

    That's my event register in my main class.

    Fantastic, I got it to work. Thanks guys for not spoon feeding me ;P

    Code for those who have the same problem:

    Main class:
    Code:
    package me.ProSl3nderMan.AccessControl;
    
    import java.util.ArrayList;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class AccessControl extends JavaPlugin {
      
        public static AccessControl plugin;
      
        protected AccessControlLogger log;
      
        public void onEnable(){
          
            plugin = this;
          
            new OnJoin(this);
          
            this.log = new AccessControlLogger(this);
          
            this.getCommand("cr").setExecutor(new CrExecutor(this));
          
            new CrExecutor(this);
          
            new RightClickListener(this);
          
          
          
            getConfig().options().copyDefaults(true);
            saveDefaultConfig();
        }
      
        public void onDisable(){
          
        }
      
        ArrayList<String> cr1 = new ArrayList<String>();
        ArrayList<String> cr2 = new ArrayList<String>();
        ArrayList<String> cr3 = new ArrayList<String>();
        ArrayList<String> cops1 = new ArrayList<String>();
        ArrayList<String> cops2 = new ArrayList<String>();
        ArrayList<String> cops3 = new ArrayList<String>();
    }
    Second class (listener):
    Code:
    public class RightClickListener implements Listener {
      
        private final AccessControl plugin;
      
        public RightClickListener(AccessControl plugin) {
            this.plugin = plugin;
            plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
    Praise Jesus :)

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 11, 2016
  14. Offline

    teej107

    this is completely unnecessary
     
  15. Offline

    ProSl3nderMan

    It is completely necessary for my code.
     
  16. Offline

    teej107

    From the code you posted it isn't necessary. Even if there is more code to it, there are better ways.
     
  17. Offline

    ProSl3nderMan

    The more code to it needs it, I tried taking it out and I get a bunch of errors. I think I'm keeping it in :p
     
Thread Status:
Not open for further replies.

Share This Page