Elevators

Discussion in 'Plugin Development' started by thewalkingplay, Oct 6, 2016.

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

    thewalkingplay

    Hi, I'm making a plugin and I'm creating elevators, what can I do? I thinked to create an elevator constructor, but, what can I do to, like check if a person have permissions to go to a floor, and load the floors in a sign? the sign part I can du, I just don't have any ideas, like, what can I do? save the elevators in the config with all its atribbutes and permissions and load it on a list on a elevatormanager class and make everything there?

    elevator constructor:
    Code:
    package me.thewalkingplay.reallife.utils;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.Location;
    
    @SuppressWarnings("unused")
    public class Elevador {
    
        private String nome;
        private List<Location> andares = new ArrayList<Location>();
        private int nAndares;
       
        public Elevador(String nome, int nAndares, List<Location> andares) {
            this.nome = nome;
            this.andares = andares;
            this.nAndares = nAndares;
        }
    
    }
    
     
  2. Offline

    kameronn

    When a player created an elevator sign create a custom meta data value for that sign and save it in a config with that player. Then check when a player clicks a sign if that sign has a meta data value and if it does, is it in the config
     
  3. Offline

    thewalkingplay

    @kameronn I'l talking bout the other part, the signs I can do :), what I'm doing is this:

    Elevator clss:
    Code:
    package me.thewalkingplay.reallife.utils;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.Location;
    
    public class Elevador {
    
        private String nome;
        private List<Location> andares = new ArrayList<Location>();
        private int nAndares;
       
        public Elevador(String nome, int nAndares, List<Location> andares) {
            this.nome = nome;
            this.andares = andares;
            this.nAndares = nAndares;
        }
       
        public String getNome() {
            return nome;
        }
       
        public int getNumeroDeAndares() {
            return nAndares;
        }
       
        public Location getAndar(int andar) {
            return andares.get(andar);
        }
       
        public void setnAndares(int i) {
            this.nAndares = i;
        }
       
        public void setAndares(List<Location> andares) {
            this.andares = andares;
        }
       
        public void addAndar(Location andar) {
            this.andares.add(andar);
        }
    
    }
    Elevator Manager class:
    Code:
    package me.thewalkingplay.reallife.comandos.elevador;
    
    import java.util.HashMap;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    
    import me.thewalkingplay.reallife.Main;
    import me.thewalkingplay.reallife.utils.Broadcast;
    import me.thewalkingplay.reallife.utils.ConfigManager;
    import me.thewalkingplay.reallife.utils.Elevador;
    
    public class ElevadorManager extends ConfigManager {
       
        public ElevadorManager(Main inst) {
            super(inst);
        }
    
        private static HashMap<Player, Elevador> elevadores = new HashMap<Player, Elevador>();
       
        public static void ComecarACiarElevador(String nome, Player p) {
            @SuppressWarnings("null")
            Elevador e = new Elevador(nome, (Integer) null, null);
            elevadores.put(p, e);
            Broadcast.BroadcastToPlayer(p, "Voce entrou no modo de criação de elevador", ChatColor.YELLOW);
        }
       
        public static void addAndar(Player p, Location andar) {
            if (elevadores.containsKey(p)) {
                Elevador e = elevadores.get(p);
                e.addAndar(andar);
                int nAndares = e.getNumeroDeAndares() + 1;
                e.setnAndares(nAndares);
                Broadcast.BroadcastToPlayer(p, "Andar " + nAndares + " criado!", ChatColor.GREEN);
            }
        }
       
        public static void saveElevator(Player p) {
            if (elevadores.containsKey(p)) {
                Elevador e = elevadores.get(p);
                plugin.getConfig().set("elevadores." + e.getNome(), e);
                plugin.saveConfig();
                elevadores.remove(p);
                Broadcast.BroadcastToPlayer(p, "Elevador " + e.getNome() + " salvo com sucesso!", ChatColor.GREEN);
            }
        }
       
        public static boolean isInEditor(Player p) {
            if (elevadores.containsKey(p)) return true; else return false;
        }
    
    }
    
    commands class:
    Code:
    package me.thewalkingplay.reallife.comandos.elevador;
    
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    
    import me.thewalkingplay.reallife.utils.Broadcast;
    import me.thewalkingplay.reallife.utils.CeoManager;
    
    public class CriarElevador implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String arg2, String[] arg) {
            if (sender instanceof Player) {
                Player p = (Player) sender;
                if (cmd.getName().equalsIgnoreCase("elevador")){
                    if (arg.length > 0) {
                        if (arg[0].equalsIgnoreCase("criar")) {
                            if (arg.length > 1) {
                                if (CeoManager.isCeo(p)) {
                                    String nome = arg[1];
                                    ElevadorManager.ComecarACiarElevador(nome, p);
                                    return true;
                                } else {
                                    Broadcast.BroadcastToPlayer(p, "Só CEOs pode fazer isso!", ChatColor.RED);
                                }
                            }
                        }
                        if (arg[0].equalsIgnoreCase("addandar")) {
                            if (ElevadorManager.isInEditor(p)) {
                                // continue here
                            }
                        }
                    }
                }
            }
            return false;
        }
    
    }
    
    Just tell me if everything is right, cause if something is whrong is better to fix soon
     
  4. Offline

    I Al Istannen

    @thewalkingplay
    Some errors:
    1. Code:
      Elevador e = new Elevador(nome, (Integer) null, null);
      Code:
       public Elevador(String nome, int nAndares, List<Location> andares) 
      You cast null to an integer. But null can't be converted to an int primitive. This means it will blow up, which is why your IDE gives you a warning. It will just blow up with a NullPointerException

      Moral of the story:
      Do not suppress warnings if you don't know why they appear!
    2. Code:
      Elevador e = new Elevador(nome, (Integer) null, null);
      You pass null for the List.
      1. It is preferred to pass Empty collections instead (Collections.emptyList()
    3. Code:
       this.andares = andares;
      You directly assign the "andares" to "this.andares". This will cause the null from above the write through, which makes every call to add or get throw a NPE
    4. Code:
       this.andares = andares;
      You directly assign the "andares" to "this.andares". This will let any changes to the passed list write through. Not nice. Make a defensive copy like "this.andares = new ArrayList(andares)"
    5. You do not follow naming conventions. Have a look here.
    6. What is the purpose of "nAndares"? It should probably be "andraes.size()", shouldn't it?
    7. Code:
      Elevador e = elevadores.get(p);
      plugin.getConfig().set("elevadores." + e.getNome(), e);
      This will throw errors on the next loading, as "Elevador" doesn't implement configuration serializable. Have a look here.
    8. Code:
      if (elevadores.containsKey(p)) return true; else return false;
      Why not just use "return elevadores.containsKey(p)"? This looks like you don't know java well enough.
    9. Why is everything in the Manager static?
    10. Only return false in the onCommand, when you want to have your usage send.
    11. And consider returning if the if statement is false instead of nesting ifs. Looks nicer and is easier to understand.
    There is probably more, but these are some things.

    Honestly, I would advice you to learn some more Java. You seem to know some (or even most) of the basics, but you need to know them all and a bit more to make nice plugins :)
     
  5. Offline

    thewalkingplay

    @I Al Istannen Hi, i'm fizing this and trying to learn more :) , bout the static statement, I've probably learned wrong it's using, (it may be cause I have lerned by videos and trying to study the code instead of just copying, but I used to get stuck in the static) what I think is like that:

    Static statement is everything that isn't in a class that will be used by another, like, everything that isn't in a constructor.

    Its probably wrong

    @I Al Istannen well, now I'm getting an error:
    Code:
    [18:40:47] [Server thread/INFO]: thewalkingplay issued server command: /elevador addandar
    [18:40:47] [Server thread/ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'elevador' in plugin RealLive v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[craftbukkit.jar:git-Bukkit-0ebb9c7]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:140) ~[craftbukkit.jar:git-Bukkit-0ebb9c7]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.dispatchCommand(CraftServer.java:625) ~[craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PlayerConnection.handleCommand(PlayerConnection.java:1299) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:1159) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(SourceFile:37) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PacketPlayInChat.a(SourceFile:9) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_101]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_101]
        at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:690) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:360) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:646) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:550) [craftbukkit.jar:git-Bukkit-0ebb9c7]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
    Caused by: java.lang.NullPointerException
        at me.thewalkingplay.reallife.utils.Elevador.addAndar(Elevador.java:35) ~[?:?]
        at me.thewalkingplay.reallife.comandos.elevador.ElevadorManager.addAndar(ElevadorManager.java:31) ~[?:?]
        at me.thewalkingplay.reallife.comandos.elevador.CriarElevador.onCommand(CriarElevador.java:39) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit.jar:git-Bukkit-0ebb9c7]
        ... 15 more
    [18:41:07] [Netty Server IO #3/INFO]: <Anakin86708> nossa, da para fazer um predio bem maior com esses blocos[m
    [18:41:26] [Netty Server IO #3/INFO]: <Anakin86708> da pra ir colando cada andar[m
    line 35 is:
    Code:
    andares.add(andar);
    updated classes:

    elevator.class:
    Code:
    package me.thewalkingplay.reallife.utils;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.Location;
    
    public class Elevador {
    
        private String nome;
        private List<Location> andares = new ArrayList<Location>();
       
        public Elevador(String n, List<Location> a) {
            this.nome = n;
            this.andares = a;
        }
       
        public String getNome() {
            return nome;
        }
       
        public int getNumeroDeAndares() {
            return andares.size();
        }
       
        public Location getAndar(int andar) {
            return andares.get(andar);
        }
    
        public void setAndares(List<Location> andares) {
            this.andares = andares;
        }
       
        public void addAndar(Location andar) {
            andares.add(andar);
        }
    
    }
    elevator manager:
    Code:
    package me.thewalkingplay.reallife.comandos.elevador;
    
    import java.util.HashMap;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    
    import me.thewalkingplay.reallife.Main;
    import me.thewalkingplay.reallife.utils.Broadcast;
    import me.thewalkingplay.reallife.utils.ConfigManager;
    import me.thewalkingplay.reallife.utils.Elevador;
    
    public class ElevadorManager extends ConfigManager {
       
        public ElevadorManager(Main inst) {
            super(inst);
        }
    
        private static HashMap<Player, Elevador> elevadores = new HashMap<Player, Elevador>();
       
        public static void ComecarACiarElevador(String nome, Player p) {
            Elevador e = new Elevador(nome, null);
            elevadores.put(p, e);
            Broadcast.BroadcastToPlayer(p, "Voce entrou no modo de criação de elevador", ChatColor.YELLOW);
        }
       
        public static void addAndar(Player p, Location andar) {
            if (elevadores.containsKey(p)) {
                Elevador e = elevadores.get(p);
                e.addAndar(andar);
                Broadcast.BroadcastToPlayer(p, "Andar " + e.getNumeroDeAndares() + " criado!", ChatColor.GREEN);
            }
        }
       
        public static void saveElevator(Player p) {
            if (elevadores.containsKey(p)) {
                Elevador e = elevadores.get(p);
                plugin.getConfig().set("elevadores." + e.getNome(), e);
                plugin.saveConfig();
                elevadores.remove(p);
                Broadcast.BroadcastToPlayer(p, "Elevador " + e.getNome() + " salvo com sucesso!", ChatColor.GREEN);
            }
        }
       
        public static boolean isInEditor(Player p) {
            return elevadores.containsKey(p);
        }
    
    }
    
    command
    Code:
    package me.thewalkingplay.reallife.comandos.elevador;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    
    import me.thewalkingplay.reallife.utils.Broadcast;
    import me.thewalkingplay.reallife.utils.CeoManager;
    
    public class CriarElevador implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String arg2, String[] arg) {
            if (sender instanceof Player) {
                Player p = (Player) sender;
                if (cmd.getName().equalsIgnoreCase("elevador")){
                    if (arg.length > 0) {
                        if (arg[0].equalsIgnoreCase("criar")) {
                            if (arg.length == 2) {
                                if (CeoManager.isCeo(p)) {
                                    String nome = arg[1];
                                    ElevadorManager.ComecarACiarElevador(nome, p);
                                    return true;
                                } else {
                                    Broadcast.BroadcastToPlayer(p, "Só CEOs pode fazer isso!", ChatColor.RED);
                                    return true;
                                }
                            } else {
                                Broadcast.BroadcastToPlayer(p, "/elevador criar NOME", ChatColor.RED);
                                return true;
                            }
                        }
                        if (arg[0].equalsIgnoreCase("addandar")) {
                            if (ElevadorManager.isInEditor(p)) {
                                Location loc = p.getLocation();
                                ElevadorManager.addAndar(p, loc);
                                Broadcast.BroadcastToPlayer(p, "Andar criado!", ChatColor.GREEN);
                                return true;
                            } else {
                                Broadcast.BroadcastToPlayer(p, "Voce nao esta no modo editor!", ChatColor.RED);
                                return true;
                            }
                        }
                        if (arg[0].equalsIgnoreCase("salvar")) {
                            if (ElevadorManager.isInEditor(p)) {
                                ElevadorManager.saveElevator(p);
                                Broadcast.BroadcastToPlayer(p, "Elevador salvo com sucesso!", ChatColor.GREEN);
                                return true;
                            } else {
                                Broadcast.BroadcastToPlayer(p, "Voce nao esta no modo editor!", ChatColor.RED);
                                return true;
                            }
                        }
                    }
                }
            }
            return false;
        }
    
    }
    
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Oct 7, 2016
  6. Offline

    I Al Istannen

    @thewalkingplay
    Static: The java tutorial.

    Static roughly means the code belongs to the class and not the object. This is bad for an Object orientated language in most cases.

    To your new issue:
    You do the same again. You assign "andares" to "a" which is just the long way of writing "andares = null".

    You really need to have a look at basic java language features. Here is a page to start with the basics. Or look in the offtopic section of this forum.
     
  7. Offline

    thewalkingplay

    @I Al Istannen ops, now I fixed it :) but when i type /elevador salvar the plugins saves it at the config:
    Code:
    elevadores:
      Plaza: !!me.thewalkingplay.reallife.utils.Elevador {}
    
    @I Al Istannen I changed, now the plugin saves the location as a list in the config:
    Code:
    elevadores:
      Plaza:
      - ==: org.bukkit.Location
        world: world
        x: 352.277188487532
        y: 63.0
        z: 194.37781636623689
        pitch: -0.1499479
        yaw: 90.71867
      - ==: org.bukkit.Location
        world: world
        x: 352.3376193391149
        y: 72.0
        z: 194.40661475610597
        pitch: -1.4999464
        yaw: 89.8187
      - ==: org.bukkit.Location
        world: world
        x: 352.3074216527027
        y: 78.0
        z: 194.4880191678557
        pitch: 0.75003445
        yaw: 89.81869
      - ==: org.bukkit.Location
        world: world
        x: 352.2808862726317
        y: 84.0
        z: 194.48408161154558
        pitch: 4.0500126
        yaw: 89.968704
    
    But now I get an error in line 26:

    Code:
    for (String s : plugin.getConfig().getStringList("elevadores")) {
    Code:
    package me.thewalkingplay.reallife.comandos.elevador;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    
    import me.thewalkingplay.reallife.Main;
    import me.thewalkingplay.reallife.utils.Broadcast;
    import me.thewalkingplay.reallife.utils.ConfigManager;
    import me.thewalkingplay.reallife.utils.Elevador;
    
    public class ElevadorManager extends ConfigManager {
      
        public ElevadorManager(Main inst) {
            super(inst);
        }
    
        private static HashMap<Player, Elevador> elevadores = new HashMap<Player, Elevador>();
        private static List<Elevador> elevadoresFuncionais = new ArrayList<Elevador>();
      
        public static void registerElevators() {
            for (String s : plugin.getConfig().getStringList("elevadores")) {
                @SuppressWarnings("unchecked")
                List<Location> locs = (List<Location>) plugin.getConfig().getList("elevadores." + s);
                Elevador e = new Elevador(s, locs);
                elevadoresFuncionais.add(e);
            }
        }
      
        public static void ComecarACiarElevador(String nome, Player p) {
            Elevador e = new Elevador(nome, null);
            elevadores.put(p, e);
            Broadcast.BroadcastToPlayer(p, "Voce entrou no modo de criação de elevador", ChatColor.YELLOW);
        }
      
        public static void addAndar(Player p, Location andar) {
            if (elevadores.containsKey(p)) {
                Elevador e = elevadores.get(p);
                e.addAndar(andar);
                Broadcast.BroadcastToPlayer(p, "Andar " + e.getNumeroDeAndares() + " criado!", ChatColor.GREEN);
            }
        }
      
        public static void saveElevator(Player p) {
            if (elevadores.containsKey(p)) {
                Elevador e = elevadores.get(p);
                plugin.getConfig().set("elevadores." + e.getNome(), e.getAllAndares());
                plugin.saveConfig();
                elevadores.remove(p);
                Broadcast.BroadcastToPlayer(p, "Elevador " + e.getNome() + " salvo com sucesso!", ChatColor.GREEN);
            }
        }
      
        public static boolean isInEditor(Player p) {
            return elevadores.containsKey(p);
        }
      
        public static boolean isAnElevator(String nome) {
            for (Elevador e : elevadoresFuncionais) {
                if (e.getNome().equalsIgnoreCase(nome)) return true;
            }
            return false;
        }
    
    }
    
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Oct 7, 2016
  8. @thewalkingplay
    That's because "elevadores" isn't the String List, "elevadores.Plaza" is.
     
  9. Offline

    I Al Istannen

    @AlvinB
    And on top of that, it is a List<Location> not List<String>.

    @thewalkingplay
    Make Elevador implement ConfigurationSerializable (look at the link I posted earlier), then you can save and read it directly.
     
Thread Status:
Not open for further replies.

Share This Page